]> git.mxchange.org Git - friendica-addons.git/commitdiff
[advancedcontentfilter] Add Composer dependencies
authorHypolite Petovan <mrpetovan@gmail.com>
Tue, 17 Apr 2018 02:11:51 +0000 (22:11 -0400)
committerHypolite Petovan <mrpetovan@gmail.com>
Tue, 17 Apr 2018 02:11:51 +0000 (22:11 -0400)
- slim/slim: ^3.1
- symfony/expression-language: ^3.4
- fxp/composer-asset-plugin: ~1.3
- bower-asset/vue: ^2.5
- bower-asset/vue-resource: ^1.5

1380 files changed:
advancedcontentfilter/composer.json [new file with mode: 0644]
advancedcontentfilter/composer.lock [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue-resource/LICENSE [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue-resource/README.md [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue-resource/bower.json [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue-resource/dist/README.md [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue-resource/dist/vue-resource.common.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue-resource/dist/vue-resource.esm.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue-resource/dist/vue-resource.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue-resource/dist/vue-resource.min.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue-resource/src/http/client/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue-resource/src/http/client/jsonp.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue-resource/src/http/client/node.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue-resource/src/http/client/xdr.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue-resource/src/http/client/xhr.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue-resource/src/http/headers.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue-resource/src/http/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue-resource/src/http/interceptor/before.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue-resource/src/http/interceptor/cors.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue-resource/src/http/interceptor/form.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue-resource/src/http/interceptor/header.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue-resource/src/http/interceptor/json.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue-resource/src/http/interceptor/jsonp.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue-resource/src/http/interceptor/method.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue-resource/src/http/request.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue-resource/src/http/response.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue-resource/src/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue-resource/src/lib/promise.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue-resource/src/lib/url-template.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue-resource/src/promise.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue-resource/src/resource.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue-resource/src/url/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue-resource/src/url/query.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue-resource/src/url/root.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue-resource/src/url/template.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue-resource/src/util.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue-resource/test/data/invalid.json [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue-resource/test/data/text.txt [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue-resource/test/data/valid.json [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue-resource/test/http.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue-resource/test/http.test.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue-resource/test/index.html [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue-resource/test/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue-resource/test/karma.conf.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue-resource/test/promise.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue-resource/test/resource.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue-resource/test/url.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue-resource/test/webpack.config.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue-resource/types/index.d.ts [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue-resource/types/vue.d.ts [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue-resource/yarn.lock [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/.babelrc [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/.circleci/config.yml [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/.editorconfig [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/.eslintignore [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/.eslintrc [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/.flowconfig [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/.github/CODE_OF_CONDUCT.md [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/.github/COMMIT_CONVENTION.md [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/.github/CONTRIBUTING.md [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/.github/ISSUE_TEMPLATE.md [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/.github/PULL_REQUEST_TEMPLATE.md [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/.gitignore [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/BACKERS.md [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/LICENSE [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/README.md [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/benchmarks/big-table/demo.css [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/benchmarks/big-table/index.html [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/benchmarks/big-table/style.css [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/benchmarks/dbmon/ENV.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/benchmarks/dbmon/app.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/benchmarks/dbmon/index.html [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/benchmarks/dbmon/lib/memory-stats.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/benchmarks/dbmon/lib/monitor.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/benchmarks/dbmon/lib/styles.css [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/benchmarks/reorder-list/index.html [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/benchmarks/ssr/README.md [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/benchmarks/ssr/common.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/benchmarks/ssr/renderToStream.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/benchmarks/ssr/renderToString.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/benchmarks/svg/index.html [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/benchmarks/uptime/index.html [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/dist/README.md [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/examples/commits/app.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/examples/commits/index.html [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/examples/elastic-header/index.html [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/examples/elastic-header/style.css [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/examples/firebase/app.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/examples/firebase/index.html [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/examples/firebase/style.css [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/examples/grid/grid.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/examples/grid/index.html [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/examples/grid/style.css [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/examples/markdown/index.html [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/examples/markdown/style.css [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/examples/modal/index.html [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/examples/modal/style.css [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/examples/move-animations/index.html [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/examples/select2/index.html [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/examples/svg/index.html [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/examples/svg/style.css [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/examples/svg/svg.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/examples/todomvc/app.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/examples/todomvc/index.html [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/examples/todomvc/readme.md [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/examples/tree/index.html [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/examples/tree/tree.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/flow/compiler.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/flow/component.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/flow/global-api.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/flow/modules.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/flow/options.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/flow/ssr.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/flow/vnode.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/flow/weex.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/package.json [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/packages/vue-server-renderer/README.md [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/packages/vue-server-renderer/client-plugin.d.ts [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/packages/vue-server-renderer/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/packages/vue-server-renderer/package.json [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/packages/vue-server-renderer/server-plugin.d.ts [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/packages/vue-server-renderer/types/index.d.ts [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/packages/vue-server-renderer/types/plugin.d.ts [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/packages/vue-server-renderer/types/tsconfig.json [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/packages/vue-template-compiler/README.md [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/packages/vue-template-compiler/browser.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/packages/vue-template-compiler/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/packages/vue-template-compiler/package.json [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/packages/weex-template-compiler/README.md [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/packages/weex-template-compiler/build.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/packages/weex-template-compiler/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/packages/weex-template-compiler/package.json [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/packages/weex-vue-framework/README.md [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/packages/weex-vue-framework/factory.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/packages/weex-vue-framework/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/packages/weex-vue-framework/package.json [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/scripts/alias.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/scripts/build.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/scripts/config.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/scripts/gen-release-note.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/scripts/get-weex-version.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/scripts/git-hooks/commit-msg [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/scripts/git-hooks/pre-commit [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/scripts/release-weex.sh [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/scripts/release.sh [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/scripts/verify-commit-msg.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/compiler/codegen/events.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/compiler/codegen/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/compiler/create-compiler.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/compiler/directives/bind.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/compiler/directives/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/compiler/directives/model.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/compiler/directives/on.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/compiler/error-detector.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/compiler/helpers.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/compiler/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/compiler/optimizer.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/compiler/parser/entity-decoder.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/compiler/parser/filter-parser.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/compiler/parser/html-parser.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/compiler/parser/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/compiler/parser/text-parser.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/compiler/to-function.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/core/components/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/core/components/keep-alive.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/core/config.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/core/global-api/assets.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/core/global-api/extend.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/core/global-api/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/core/global-api/mixin.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/core/global-api/use.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/core/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/core/instance/events.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/core/instance/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/core/instance/init.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/core/instance/inject.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/core/instance/lifecycle.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/core/instance/proxy.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/core/instance/render-helpers/bind-object-listeners.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/core/instance/render-helpers/bind-object-props.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/core/instance/render-helpers/check-keycodes.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/core/instance/render-helpers/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/core/instance/render-helpers/render-list.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/core/instance/render-helpers/render-slot.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/core/instance/render-helpers/render-static.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/core/instance/render-helpers/resolve-filter.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/core/instance/render-helpers/resolve-slots.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/core/instance/render.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/core/instance/state.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/core/observer/array.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/core/observer/dep.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/core/observer/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/core/observer/scheduler.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/core/observer/traverse.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/core/observer/watcher.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/core/util/debug.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/core/util/env.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/core/util/error.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/core/util/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/core/util/lang.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/core/util/next-tick.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/core/util/options.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/core/util/perf.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/core/util/props.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/core/vdom/create-component.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/core/vdom/create-element.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/core/vdom/create-functional-component.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/core/vdom/helpers/extract-props.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/core/vdom/helpers/get-first-component-child.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/core/vdom/helpers/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/core/vdom/helpers/is-async-placeholder.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/core/vdom/helpers/merge-hook.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/core/vdom/helpers/normalize-children.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/core/vdom/helpers/resolve-async-component.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/core/vdom/helpers/update-listeners.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/core/vdom/modules/directives.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/core/vdom/modules/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/core/vdom/modules/ref.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/core/vdom/patch.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/core/vdom/vnode.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/web/compiler/directives/html.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/web/compiler/directives/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/web/compiler/directives/model.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/web/compiler/directives/text.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/web/compiler/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/web/compiler/modules/class.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/web/compiler/modules/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/web/compiler/modules/model.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/web/compiler/modules/style.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/web/compiler/options.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/web/compiler/util.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/web/entry-compiler.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/web/entry-runtime-with-compiler.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/web/entry-runtime.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/web/entry-server-basic-renderer.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/web/entry-server-renderer.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/web/runtime/class-util.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/web/runtime/components/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/web/runtime/components/transition-group.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/web/runtime/components/transition.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/web/runtime/directives/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/web/runtime/directives/model.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/web/runtime/directives/show.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/web/runtime/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/web/runtime/modules/attrs.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/web/runtime/modules/class.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/web/runtime/modules/dom-props.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/web/runtime/modules/events.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/web/runtime/modules/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/web/runtime/modules/style.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/web/runtime/modules/transition.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/web/runtime/node-ops.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/web/runtime/patch.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/web/runtime/transition-util.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/web/server/compiler.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/web/server/directives/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/web/server/directives/model.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/web/server/directives/show.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/web/server/modules/attrs.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/web/server/modules/class.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/web/server/modules/dom-props.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/web/server/modules/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/web/server/modules/style.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/web/server/util.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/web/util/attrs.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/web/util/class.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/web/util/compat.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/web/util/element.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/web/util/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/web/util/style.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/weex/compiler/directives/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/weex/compiler/directives/model.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/weex/compiler/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/weex/compiler/modules/append.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/weex/compiler/modules/class.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/weex/compiler/modules/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/weex/compiler/modules/props.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/weex/compiler/modules/recycle-list/component-root.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/weex/compiler/modules/recycle-list/component.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/weex/compiler/modules/recycle-list/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/weex/compiler/modules/recycle-list/recycle-list.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/weex/compiler/modules/recycle-list/text.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/weex/compiler/modules/recycle-list/v-bind.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/weex/compiler/modules/recycle-list/v-for.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/weex/compiler/modules/recycle-list/v-if.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/weex/compiler/modules/recycle-list/v-on.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/weex/compiler/modules/recycle-list/v-once.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/weex/compiler/modules/style.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/weex/entry-compiler.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/weex/entry-framework.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/weex/entry-runtime-factory.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/weex/runtime/components/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/weex/runtime/components/richtext.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/weex/runtime/components/transition-group.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/weex/runtime/components/transition.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/weex/runtime/directives/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/weex/runtime/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/weex/runtime/modules/attrs.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/weex/runtime/modules/class.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/weex/runtime/modules/events.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/weex/runtime/modules/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/weex/runtime/modules/style.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/weex/runtime/modules/transition.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/weex/runtime/node-ops.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/weex/runtime/patch.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/weex/runtime/recycle-list/render-component-template.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/weex/runtime/recycle-list/virtual-component.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/weex/runtime/text-node.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/weex/util/element.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/weex/util/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/platforms/weex/util/parser.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/server/bundle-renderer/create-bundle-renderer.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/server/bundle-renderer/create-bundle-runner.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/server/bundle-renderer/source-map-support.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/server/create-basic-renderer.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/server/create-renderer.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/server/optimizing-compiler/codegen.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/server/optimizing-compiler/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/server/optimizing-compiler/modules.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/server/optimizing-compiler/optimizer.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/server/optimizing-compiler/runtime-helpers.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/server/render-context.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/server/render-stream.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/server/render.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/server/template-renderer/create-async-file-mapper.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/server/template-renderer/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/server/template-renderer/parse-template.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/server/template-renderer/template-stream.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/server/util.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/server/webpack-plugin/client.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/server/webpack-plugin/server.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/server/webpack-plugin/util.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/server/write.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/sfc/parser.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/shared/constants.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/src/shared/util.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/e2e/.eslintrc [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/e2e/nightwatch.config.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/e2e/runner.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/e2e/specs/async-edge-cases.html [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/e2e/specs/async-edge-cases.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/e2e/specs/basic-ssr.html [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/e2e/specs/basic-ssr.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/e2e/specs/commits.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/e2e/specs/grid.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/e2e/specs/markdown.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/e2e/specs/modal.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/e2e/specs/select2.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/e2e/specs/svg.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/e2e/specs/todomvc.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/e2e/specs/tree.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/helpers/.eslintrc [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/helpers/classlist.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/helpers/test-object-option.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/helpers/to-equal.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/helpers/to-have-been-warned.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/helpers/trigger-event.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/helpers/vdom.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/helpers/wait-for-update.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/ssr/.eslintrc [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/ssr/async-loader.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/ssr/compile-with-webpack.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/ssr/fixtures/app.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/ssr/fixtures/async-bar.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/ssr/fixtures/async-foo.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/ssr/fixtures/cache.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/ssr/fixtures/error.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/ssr/fixtures/nested-cache.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/ssr/fixtures/promise-rejection.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/ssr/fixtures/split.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/ssr/fixtures/test.css [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/ssr/fixtures/test.png [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/ssr/fixtures/test.woff2 [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/ssr/jasmine.json [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/ssr/ssr-basic-renderer.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/ssr/ssr-bundle-render.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/ssr/ssr-stream.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/ssr/ssr-string.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/ssr/ssr-template.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/.eslintrc [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/features/component/component-async.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/features/component/component-keep-alive.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/features/component/component-scoped-slot.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/features/component/component-slot.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/features/component/component.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/features/debug.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/features/directives/bind.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/features/directives/class.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/features/directives/cloak.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/features/directives/for.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/features/directives/html.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/features/directives/if.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/features/directives/model-checkbox.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/features/directives/model-component.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/features/directives/model-dynamic.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/features/directives/model-file.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/features/directives/model-parse.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/features/directives/model-radio.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/features/directives/model-select.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/features/directives/model-text.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/features/directives/on.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/features/directives/once.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/features/directives/pre.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/features/directives/show.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/features/directives/static-style-parser.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/features/directives/style.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/features/directives/text.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/features/error-handling.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/features/filter/filter.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/features/global-api/assets.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/features/global-api/compile.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/features/global-api/config.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/features/global-api/extend.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/features/global-api/mixin.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/features/global-api/set-delete.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/features/global-api/use.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/features/instance/init.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/features/instance/methods-data.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/features/instance/methods-events.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/features/instance/methods-lifecycle.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/features/instance/properties.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/features/instance/render-proxy.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/features/options/_scopeId.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/features/options/comments.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/features/options/components.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/features/options/computed.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/features/options/data.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/features/options/delimiters.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/features/options/directives.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/features/options/el.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/features/options/errorCaptured.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/features/options/extends.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/features/options/functional.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/features/options/inheritAttrs.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/features/options/inject.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/features/options/lifecycle.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/features/options/methods.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/features/options/mixins.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/features/options/name.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/features/options/parent.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/features/options/props.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/features/options/propsData.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/features/options/render.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/features/options/renderError.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/features/options/template.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/features/options/watch.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/features/ref.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/features/transition/inject-styles.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/features/transition/transition-group.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/features/transition/transition-mode.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/features/transition/transition.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/karma.base.config.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/karma.cover.config.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/karma.dev.config.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/karma.sauce.config.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/karma.unit.config.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/modules/compiler/codegen.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/modules/compiler/compiler-options.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/modules/compiler/optimizer.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/modules/compiler/parser.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/modules/observer/dep.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/modules/observer/observer.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/modules/observer/scheduler.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/modules/observer/watcher.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/modules/server-compiler/optimizer.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/modules/sfc/sfc-parser.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/modules/util/next-tick.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/modules/vdom/create-component.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/modules/vdom/create-element.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/modules/vdom/modules/attrs.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/modules/vdom/modules/class.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/modules/vdom/modules/directive.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/modules/vdom/modules/dom-props.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/modules/vdom/modules/events.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/modules/vdom/modules/style.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/modules/vdom/patch/children.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/modules/vdom/patch/edge-cases.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/modules/vdom/patch/element.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/modules/vdom/patch/hooks.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/unit/modules/vdom/patch/hydration.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/weex/.eslintrc [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/weex/cases/cases.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/weex/cases/event/click.after.vdom.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/weex/cases/event/click.before.vdom.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/weex/cases/event/click.vue [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/attrs.vdom.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/attrs.vue [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/classname.vdom.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/classname.vue [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/components/banner.vue [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/components/counter.vue [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/components/editor.vue [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/components/footer.vue [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/components/lifecycle.vue [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/components/poster.vue [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/components/stateful-lifecycle.vdom.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/components/stateful-lifecycle.vue [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/components/stateful-v-model.vdom.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/components/stateful-v-model.vue [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/components/stateful.vdom.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/components/stateful.vue [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/components/stateless-multi-components.vdom.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/components/stateless-multi-components.vue [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/components/stateless-with-props.vdom.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/components/stateless-with-props.vue [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/components/stateless.vdom.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/components/stateless.vue [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/inline-style.vdom.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/inline-style.vue [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/text-node.vdom.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/text-node.vue [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/v-else-if.vdom.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/v-else-if.vue [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/v-else.vdom.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/v-else.vue [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/v-for-iterator.vdom.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/v-for-iterator.vue [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/v-for.vdom.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/v-for.vue [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/v-if.vdom.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/v-if.vue [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/v-on-inline.vdom.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/v-on-inline.vue [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/v-on.vdom.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/v-on.vue [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/v-once.vdom.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/v-once.vue [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/weex/cases/render/sample.vdom.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/weex/cases/render/sample.vue [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/weex/compiler/append.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/weex/compiler/class.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/weex/compiler/compile.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/weex/compiler/parser.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/weex/compiler/props.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/weex/compiler/style.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/weex/compiler/v-model.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/weex/helpers/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/weex/jasmine.json [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/weex/runtime/attrs.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/weex/runtime/class.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/weex/runtime/components/richtext.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/weex/runtime/events.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/weex/runtime/framework.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/weex/runtime/node.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/test/weex/runtime/style.spec.js [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/types/index.d.ts [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/types/options.d.ts [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/types/plugin.d.ts [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/types/test/augmentation-test.ts [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/types/test/es-module.ts [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/types/test/options-test.ts [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/types/test/plugin-test.ts [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/types/test/ssr-test.ts [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/types/test/tsconfig.json [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/types/test/vue-test.ts [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/types/tsconfig.json [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/types/typings.json [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/types/vnode.d.ts [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/types/vue.d.ts [new file with mode: 0644]
advancedcontentfilter/vendor/asset/vue/yarn.lock [new file with mode: 0644]
advancedcontentfilter/vendor/autoload.php [new file with mode: 0644]
advancedcontentfilter/vendor/composer/ClassLoader.php [new file with mode: 0644]
advancedcontentfilter/vendor/composer/LICENSE [new file with mode: 0644]
advancedcontentfilter/vendor/composer/autoload_classmap.php [new file with mode: 0644]
advancedcontentfilter/vendor/composer/autoload_files.php [new file with mode: 0644]
advancedcontentfilter/vendor/composer/autoload_namespaces.php [new file with mode: 0644]
advancedcontentfilter/vendor/composer/autoload_psr4.php [new file with mode: 0644]
advancedcontentfilter/vendor/composer/autoload_real.php [new file with mode: 0644]
advancedcontentfilter/vendor/composer/autoload_static.php [new file with mode: 0644]
advancedcontentfilter/vendor/composer/installed.json [new file with mode: 0644]
advancedcontentfilter/vendor/container-interop/container-interop/.gitignore [new file with mode: 0644]
advancedcontentfilter/vendor/container-interop/container-interop/LICENSE [new file with mode: 0644]
advancedcontentfilter/vendor/container-interop/container-interop/README.md [new file with mode: 0644]
advancedcontentfilter/vendor/container-interop/container-interop/composer.json [new file with mode: 0644]
advancedcontentfilter/vendor/container-interop/container-interop/docs/ContainerInterface-meta.md [new file with mode: 0644]
advancedcontentfilter/vendor/container-interop/container-interop/docs/ContainerInterface.md [new file with mode: 0644]
advancedcontentfilter/vendor/container-interop/container-interop/docs/Delegate-lookup-meta.md [new file with mode: 0644]
advancedcontentfilter/vendor/container-interop/container-interop/docs/Delegate-lookup.md [new file with mode: 0644]
advancedcontentfilter/vendor/container-interop/container-interop/docs/images/interoperating_containers.png [new file with mode: 0644]
advancedcontentfilter/vendor/container-interop/container-interop/docs/images/priority.png [new file with mode: 0644]
advancedcontentfilter/vendor/container-interop/container-interop/docs/images/side_by_side_containers.png [new file with mode: 0644]
advancedcontentfilter/vendor/container-interop/container-interop/src/Interop/Container/ContainerInterface.php [new file with mode: 0644]
advancedcontentfilter/vendor/container-interop/container-interop/src/Interop/Container/Exception/ContainerException.php [new file with mode: 0644]
advancedcontentfilter/vendor/container-interop/container-interop/src/Interop/Container/Exception/NotFoundException.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/.gitignore [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/.php_cs.dist [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/.scrutinizer.yml [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/.travis.yml [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Assets.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Composer/ScriptHandler.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Config/Config.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Config/ConfigBuilder.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Converter/AbstractPackageConverter.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Converter/BowerPackageConverter.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Converter/NpmPackageConverter.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Converter/NpmPackageUtil.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Converter/PackageConverterInterface.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Converter/PackageUtil.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Converter/SemverConverter.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Converter/SemverRangeUtil.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Converter/SemverUtil.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Converter/VersionConverterInterface.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Exception/ExceptionInterface.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Exception/InvalidArgumentException.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Exception/InvalidCreateRepositoryException.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/FxpAssetPlugin.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Installer/AssetInstaller.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Installer/BowerInstaller.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Installer/IgnoreFactory.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Installer/IgnoreManager.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/LICENSE [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Package/AbstractLazyCompletePackage.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Package/LazyCompletePackage.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Package/LazyPackageInterface.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Package/Loader/LazyAssetPackageLoader.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Package/Loader/LazyLoaderInterface.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Package/Version/VersionParser.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/README.md [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Repository/AbstractAssetVcsRepository.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Repository/AbstractAssetsRepository.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Repository/AssetRepositoryManager.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Repository/AssetVcsRepository.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Repository/BowerPrivateRegistryFactory.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Repository/BowerPrivateRepository.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Repository/BowerRepository.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Repository/DefaultRegistryFactory.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Repository/FilterUtil.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Repository/NpmRepository.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Repository/RegistryFactoryInterface.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Repository/ResolutionManager.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Repository/Util.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Repository/Vcs/AbstractGitHubDriver.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Repository/Vcs/BitbucketUtil.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Repository/Vcs/GitBitbucketDriver.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Repository/Vcs/GitDriver.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Repository/Vcs/GitHubDriver.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Repository/Vcs/HgBitbucketDriver.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Repository/Vcs/HgDriver.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Repository/Vcs/PerforceDriver.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Repository/Vcs/ProcessUtil.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Repository/Vcs/SvnDriver.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Repository/Vcs/Util.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Repository/VcsPackageFilter.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Resources/doc/faqs.md [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Resources/doc/index.md [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Resources/doc/schema.md [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/AssetsTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Composer/ScriptHandlerTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Config/ConfigTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Converter/AbstractPackageConverterTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Converter/BowerPackageConverterTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Converter/NpmPackageConverterTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Converter/NpmPackageUtilTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Converter/SemverConverterTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Fixtures/Converter/InvalidPackageConverter.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Fixtures/IO/MockIO.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Fixtures/Repository/MockAssetRepository.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Fixtures/Repository/Vcs/MockVcsDriver.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Fixtures/Repository/Vcs/MockVcsDriverSkipParsing.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Fixtures/Repository/Vcs/MockVcsDriverWithPackages.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Fixtures/Repository/Vcs/MockVcsDriverWithUrlPackages.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Fixtures/package/bower.json [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Fixtures/package/global/composer.json [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Fixtures/package/global/config.json [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Fixtures/package/npm-scope.json [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Fixtures/package/npm.json [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/FxpAssetPluginTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Installer/AssetInstallerTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Installer/BowerInstallerTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Installer/IgnoreFactoryTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Installer/IgnoreManagerTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Package/LazyCompletePackageTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Package/Loader/LazyAssetPackageLoaderTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Repository/AbstractAssetsRepositoryTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Repository/AssetRepositoryManagerTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Repository/AssetVcsRepositoryTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Repository/BowerPrivateRepositoryTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Repository/BowerRepositoryTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Repository/NpmRepositoryTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Repository/ResolutionManagerTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Repository/UtilTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Repository/Vcs/GitBitbucketDriverTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Repository/Vcs/GitDriverTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Repository/Vcs/GitHubDriverTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Repository/Vcs/HgBitbucketDriverTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Repository/Vcs/HgDriverTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Repository/Vcs/PerforceDriverTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Repository/Vcs/SvnDriverTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Repository/Vcs/UtilTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Repository/VcsPackageFilterTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Type/AbstractAssetTypeTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Type/BowerAssetTypeTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Type/NpmAssetTypeTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Util/PerforceTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Util/ValidatorTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/bootstrap.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Type/AbstractAssetType.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Type/AssetTypeInterface.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Type/BowerAssetType.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Type/NpmAssetType.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Util/AssetPlugin.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Util/Perforce.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/Util/Validator.php [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/composer.json [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/composer.lock [new file with mode: 0644]
advancedcontentfilter/vendor/fxp/composer-asset-plugin/phpunit.xml.dist [new file with mode: 0644]
advancedcontentfilter/vendor/nikic/fast-route/.gitignore [new file with mode: 0644]
advancedcontentfilter/vendor/nikic/fast-route/.hhconfig [new file with mode: 0644]
advancedcontentfilter/vendor/nikic/fast-route/.travis.yml [new file with mode: 0644]
advancedcontentfilter/vendor/nikic/fast-route/FastRoute.hhi [new file with mode: 0644]
advancedcontentfilter/vendor/nikic/fast-route/LICENSE [new file with mode: 0644]
advancedcontentfilter/vendor/nikic/fast-route/README.md [new file with mode: 0644]
advancedcontentfilter/vendor/nikic/fast-route/composer.json [new file with mode: 0644]
advancedcontentfilter/vendor/nikic/fast-route/phpunit.xml [new file with mode: 0644]
advancedcontentfilter/vendor/nikic/fast-route/psalm.xml [new file with mode: 0644]
advancedcontentfilter/vendor/nikic/fast-route/src/BadRouteException.php [new file with mode: 0644]
advancedcontentfilter/vendor/nikic/fast-route/src/DataGenerator.php [new file with mode: 0644]
advancedcontentfilter/vendor/nikic/fast-route/src/DataGenerator/CharCountBased.php [new file with mode: 0644]
advancedcontentfilter/vendor/nikic/fast-route/src/DataGenerator/GroupCountBased.php [new file with mode: 0644]
advancedcontentfilter/vendor/nikic/fast-route/src/DataGenerator/GroupPosBased.php [new file with mode: 0644]
advancedcontentfilter/vendor/nikic/fast-route/src/DataGenerator/MarkBased.php [new file with mode: 0644]
advancedcontentfilter/vendor/nikic/fast-route/src/DataGenerator/RegexBasedAbstract.php [new file with mode: 0644]
advancedcontentfilter/vendor/nikic/fast-route/src/Dispatcher.php [new file with mode: 0644]
advancedcontentfilter/vendor/nikic/fast-route/src/Dispatcher/CharCountBased.php [new file with mode: 0644]
advancedcontentfilter/vendor/nikic/fast-route/src/Dispatcher/GroupCountBased.php [new file with mode: 0644]
advancedcontentfilter/vendor/nikic/fast-route/src/Dispatcher/GroupPosBased.php [new file with mode: 0644]
advancedcontentfilter/vendor/nikic/fast-route/src/Dispatcher/MarkBased.php [new file with mode: 0644]
advancedcontentfilter/vendor/nikic/fast-route/src/Dispatcher/RegexBasedAbstract.php [new file with mode: 0644]
advancedcontentfilter/vendor/nikic/fast-route/src/Route.php [new file with mode: 0644]
advancedcontentfilter/vendor/nikic/fast-route/src/RouteCollector.php [new file with mode: 0644]
advancedcontentfilter/vendor/nikic/fast-route/src/RouteParser.php [new file with mode: 0644]
advancedcontentfilter/vendor/nikic/fast-route/src/RouteParser/Std.php [new file with mode: 0644]
advancedcontentfilter/vendor/nikic/fast-route/src/bootstrap.php [new file with mode: 0644]
advancedcontentfilter/vendor/nikic/fast-route/src/functions.php [new file with mode: 0644]
advancedcontentfilter/vendor/nikic/fast-route/test/Dispatcher/CharCountBasedTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/nikic/fast-route/test/Dispatcher/DispatcherTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/nikic/fast-route/test/Dispatcher/GroupCountBasedTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/nikic/fast-route/test/Dispatcher/GroupPosBasedTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/nikic/fast-route/test/Dispatcher/MarkBasedTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/nikic/fast-route/test/HackTypechecker/HackTypecheckerTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/nikic/fast-route/test/HackTypechecker/fixtures/all_options.php [new file with mode: 0644]
advancedcontentfilter/vendor/nikic/fast-route/test/HackTypechecker/fixtures/empty_options.php [new file with mode: 0644]
advancedcontentfilter/vendor/nikic/fast-route/test/HackTypechecker/fixtures/no_options.php [new file with mode: 0644]
advancedcontentfilter/vendor/nikic/fast-route/test/RouteCollectorTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/nikic/fast-route/test/RouteParser/StdTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/nikic/fast-route/test/bootstrap.php [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/cacheable-request/LICENSE [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/cacheable-request/README.md [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/cacheable-request/package.json [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/cacheable-request/src/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/clone-response/LICENSE [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/clone-response/README.md [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/clone-response/package.json [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/clone-response/src/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/core-util-is/LICENSE [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/core-util-is/README.md [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/core-util-is/float.patch [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/core-util-is/lib/util.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/core-util-is/package.json [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/core-util-is/test.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/decode-uri-component/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/decode-uri-component/license [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/decode-uri-component/package.json [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/decode-uri-component/readme.md [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/decompress-response/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/decompress-response/license [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/decompress-response/package.json [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/decompress-response/readme.md [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/duplexer3/LICENSE.md [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/duplexer3/README.md [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/duplexer3/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/duplexer3/package.json [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/from2/.travis.yml [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/from2/LICENSE.md [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/from2/README.md [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/from2/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/from2/package.json [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/from2/test.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/get-stream/buffer-stream.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/get-stream/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/get-stream/license [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/get-stream/package.json [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/get-stream/readme.md [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/got/errors.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/got/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/got/license [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/got/package.json [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/got/readme.md [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/has-symbol-support-x/.editorconfig [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/has-symbol-support-x/.eslintignore [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/has-symbol-support-x/.eslintrc.json [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/has-symbol-support-x/.nvmrc [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/has-symbol-support-x/.travis.yml [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/has-symbol-support-x/.uglifyjsrc.json [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/has-symbol-support-x/LICENSE [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/has-symbol-support-x/README.md [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/has-symbol-support-x/badges.html [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/has-symbol-support-x/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/has-symbol-support-x/lib/has-symbol-support-x.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/has-symbol-support-x/lib/has-symbol-support-x.min.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/has-symbol-support-x/lib/has-symbol-support-x.min.js.map [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/has-symbol-support-x/package.json [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/has-symbol-support-x/tests/index.html [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/has-symbol-support-x/tests/run.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/has-symbol-support-x/tests/spec/test.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/has-to-string-tag-x/.editorconfig [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/has-to-string-tag-x/.eslintignore [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/has-to-string-tag-x/.eslintrc.json [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/has-to-string-tag-x/.nvmrc [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/has-to-string-tag-x/.travis.yml [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/has-to-string-tag-x/.uglifyjsrc.json [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/has-to-string-tag-x/LICENSE [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/has-to-string-tag-x/README.md [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/has-to-string-tag-x/badges.html [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/has-to-string-tag-x/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/has-to-string-tag-x/lib/has-to-string-tag-x.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/has-to-string-tag-x/lib/has-to-string-tag-x.min.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/has-to-string-tag-x/lib/has-to-string-tag-x.min.js.map [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/has-to-string-tag-x/package.json [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/http-cache-semantics/README.md [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/http-cache-semantics/node4/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/http-cache-semantics/package.json [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/inherits/LICENSE [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/inherits/README.md [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/inherits/inherits.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/inherits/inherits_browser.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/inherits/package.json [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/into-stream/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/into-stream/license [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/into-stream/package.json [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/into-stream/readme.md [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/is-object/.jscs.json [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/is-object/.npmignore [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/is-object/.testem.json [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/is-object/.travis.yml [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/is-object/LICENSE [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/is-object/README.md [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/is-object/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/is-object/package.json [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/is-object/test/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/is-plain-obj/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/is-plain-obj/license [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/is-plain-obj/package.json [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/is-plain-obj/readme.md [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/is-retry-allowed/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/is-retry-allowed/license [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/is-retry-allowed/package.json [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/is-retry-allowed/readme.md [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/isarray/.npmignore [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/isarray/.travis.yml [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/isarray/Makefile [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/isarray/README.md [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/isarray/component.json [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/isarray/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/isarray/package.json [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/isarray/test.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/isurl/LICENSE [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/isurl/README.md [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/isurl/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/isurl/package.json [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/json-buffer/.npmignore [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/json-buffer/.travis.yml [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/json-buffer/LICENSE [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/json-buffer/README.md [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/json-buffer/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/json-buffer/package.json [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/json-buffer/test/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/keyv/LICENSE [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/keyv/README.md [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/keyv/package.json [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/keyv/src/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/lowercase-keys/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/lowercase-keys/package.json [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/lowercase-keys/readme.md [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/mimic-response/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/mimic-response/license [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/mimic-response/package.json [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/mimic-response/readme.md [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/normalize-url/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/normalize-url/license [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/normalize-url/package.json [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/normalize-url/readme.md [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/object-assign/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/object-assign/license [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/object-assign/package.json [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/object-assign/readme.md [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/p-cancelable/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/p-cancelable/license [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/p-cancelable/package.json [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/p-cancelable/readme.md [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/p-finally/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/p-finally/license [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/p-finally/package.json [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/p-finally/readme.md [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/p-is-promise/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/p-is-promise/license [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/p-is-promise/package.json [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/p-is-promise/readme.md [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/p-timeout/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/p-timeout/license [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/p-timeout/package.json [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/p-timeout/readme.md [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/pify/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/pify/license [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/pify/package.json [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/pify/readme.md [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/prepend-http/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/prepend-http/license [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/prepend-http/package.json [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/prepend-http/readme.md [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/process-nextick-args/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/process-nextick-args/license.md [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/process-nextick-args/package.json [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/process-nextick-args/readme.md [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/query-string/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/query-string/license [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/query-string/package.json [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/query-string/readme.md [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/readable-stream/.travis.yml [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/readable-stream/CONTRIBUTING.md [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/readable-stream/GOVERNANCE.md [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/readable-stream/LICENSE [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/readable-stream/README.md [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/readable-stream/doc/wg-meetings/2015-01-30.md [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/readable-stream/duplex-browser.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/readable-stream/duplex.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/readable-stream/lib/_stream_duplex.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/readable-stream/lib/_stream_passthrough.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/readable-stream/lib/_stream_readable.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/readable-stream/lib/_stream_transform.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/readable-stream/lib/_stream_writable.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/readable-stream/lib/internal/streams/BufferList.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/readable-stream/lib/internal/streams/destroy.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/readable-stream/lib/internal/streams/stream-browser.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/readable-stream/lib/internal/streams/stream.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/readable-stream/package.json [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/readable-stream/passthrough.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/readable-stream/readable-browser.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/readable-stream/readable.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/readable-stream/transform.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/readable-stream/writable-browser.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/readable-stream/writable.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/responselike/LICENSE [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/responselike/README.md [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/responselike/package.json [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/responselike/src/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/safe-buffer/.travis.yml [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/safe-buffer/LICENSE [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/safe-buffer/README.md [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/safe-buffer/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/safe-buffer/package.json [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/safe-buffer/test.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/sindresorhus--is/dist/example.d.ts [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/sindresorhus--is/dist/example.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/sindresorhus--is/dist/example.js.map [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/sindresorhus--is/dist/index.d.ts [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/sindresorhus--is/dist/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/sindresorhus--is/dist/index.js.map [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/sindresorhus--is/dist/source/index.d.ts [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/sindresorhus--is/dist/source/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/sindresorhus--is/dist/source/index.js.map [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/sindresorhus--is/dist/source/tests/test.d.ts [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/sindresorhus--is/dist/source/tests/test.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/sindresorhus--is/dist/source/tests/test.js.map [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/sindresorhus--is/license [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/sindresorhus--is/package.json [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/sindresorhus--is/readme.md [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/sort-keys/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/sort-keys/license [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/sort-keys/package.json [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/sort-keys/readme.md [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/strict-uri-encode/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/strict-uri-encode/license [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/strict-uri-encode/package.json [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/strict-uri-encode/readme.md [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/string_decoder/.travis.yml [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/string_decoder/LICENSE [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/string_decoder/README.md [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/string_decoder/lib/string_decoder.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/string_decoder/package.json [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/timed-out/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/timed-out/license [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/timed-out/package.json [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/timed-out/readme.md [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/url-parse-lax/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/url-parse-lax/license [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/url-parse-lax/package.json [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/url-parse-lax/readme.md [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/url-to-options/LICENSE [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/url-to-options/README.md [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/url-to-options/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/url-to-options/package.json [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/util-deprecate/History.md [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/util-deprecate/LICENSE [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/util-deprecate/README.md [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/util-deprecate/browser.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/util-deprecate/node.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/util-deprecate/package.json [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/vue-resource/.circleci/config.yml [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/vue-resource/.eslintignore [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/vue-resource/.eslintrc.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/vue-resource/.github/ISSUE_TEMPLATE.md [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/vue-resource/LICENSE [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/vue-resource/README.md [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/vue-resource/dist/README.md [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/vue-resource/dist/vue-resource.common.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/vue-resource/dist/vue-resource.esm.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/vue-resource/dist/vue-resource.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/vue-resource/dist/vue-resource.min.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/vue-resource/package.json [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/vue-resource/src/http/client/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/vue-resource/src/http/client/jsonp.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/vue-resource/src/http/client/node.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/vue-resource/src/http/client/xdr.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/vue-resource/src/http/client/xhr.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/vue-resource/src/http/headers.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/vue-resource/src/http/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/vue-resource/src/http/interceptor/before.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/vue-resource/src/http/interceptor/cors.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/vue-resource/src/http/interceptor/form.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/vue-resource/src/http/interceptor/header.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/vue-resource/src/http/interceptor/json.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/vue-resource/src/http/interceptor/jsonp.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/vue-resource/src/http/interceptor/method.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/vue-resource/src/http/request.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/vue-resource/src/http/response.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/vue-resource/src/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/vue-resource/src/lib/promise.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/vue-resource/src/lib/url-template.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/vue-resource/src/promise.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/vue-resource/src/resource.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/vue-resource/src/url/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/vue-resource/src/url/query.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/vue-resource/src/url/root.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/vue-resource/src/url/template.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/vue-resource/src/util.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/vue-resource/test/data/invalid.json [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/vue-resource/test/data/text.txt [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/vue-resource/test/data/valid.json [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/vue-resource/test/http.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/vue-resource/test/http.test.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/vue-resource/test/index.html [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/vue-resource/test/index.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/vue-resource/test/karma.conf.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/vue-resource/test/promise.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/vue-resource/test/resource.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/vue-resource/test/specs.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/vue-resource/test/url.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/vue-resource/test/webpack.config.js [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/vue-resource/types/index.d.ts [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/vue-resource/types/vue.d.ts [new file with mode: 0644]
advancedcontentfilter/vendor/npm-asset/vue-resource/yarn.lock [new file with mode: 0644]
advancedcontentfilter/vendor/pimple/pimple/.gitignore [new file with mode: 0644]
advancedcontentfilter/vendor/pimple/pimple/.travis.yml [new file with mode: 0644]
advancedcontentfilter/vendor/pimple/pimple/CHANGELOG [new file with mode: 0644]
advancedcontentfilter/vendor/pimple/pimple/LICENSE [new file with mode: 0644]
advancedcontentfilter/vendor/pimple/pimple/README.rst [new file with mode: 0644]
advancedcontentfilter/vendor/pimple/pimple/composer.json [new file with mode: 0644]
advancedcontentfilter/vendor/pimple/pimple/ext/pimple/.gitignore [new file with mode: 0644]
advancedcontentfilter/vendor/pimple/pimple/ext/pimple/README.md [new file with mode: 0644]
advancedcontentfilter/vendor/pimple/pimple/ext/pimple/config.m4 [new file with mode: 0644]
advancedcontentfilter/vendor/pimple/pimple/ext/pimple/config.w32 [new file with mode: 0644]
advancedcontentfilter/vendor/pimple/pimple/ext/pimple/php_pimple.h [new file with mode: 0644]
advancedcontentfilter/vendor/pimple/pimple/ext/pimple/pimple.c [new file with mode: 0644]
advancedcontentfilter/vendor/pimple/pimple/ext/pimple/pimple_compat.h [new file with mode: 0644]
advancedcontentfilter/vendor/pimple/pimple/ext/pimple/tests/001.phpt [new file with mode: 0644]
advancedcontentfilter/vendor/pimple/pimple/ext/pimple/tests/002.phpt [new file with mode: 0644]
advancedcontentfilter/vendor/pimple/pimple/ext/pimple/tests/003.phpt [new file with mode: 0644]
advancedcontentfilter/vendor/pimple/pimple/ext/pimple/tests/004.phpt [new file with mode: 0644]
advancedcontentfilter/vendor/pimple/pimple/ext/pimple/tests/005.phpt [new file with mode: 0644]
advancedcontentfilter/vendor/pimple/pimple/ext/pimple/tests/006.phpt [new file with mode: 0644]
advancedcontentfilter/vendor/pimple/pimple/ext/pimple/tests/007.phpt [new file with mode: 0644]
advancedcontentfilter/vendor/pimple/pimple/ext/pimple/tests/008.phpt [new file with mode: 0644]
advancedcontentfilter/vendor/pimple/pimple/ext/pimple/tests/009.phpt [new file with mode: 0644]
advancedcontentfilter/vendor/pimple/pimple/ext/pimple/tests/010.phpt [new file with mode: 0644]
advancedcontentfilter/vendor/pimple/pimple/ext/pimple/tests/011.phpt [new file with mode: 0644]
advancedcontentfilter/vendor/pimple/pimple/ext/pimple/tests/012.phpt [new file with mode: 0644]
advancedcontentfilter/vendor/pimple/pimple/ext/pimple/tests/013.phpt [new file with mode: 0644]
advancedcontentfilter/vendor/pimple/pimple/ext/pimple/tests/014.phpt [new file with mode: 0644]
advancedcontentfilter/vendor/pimple/pimple/ext/pimple/tests/015.phpt [new file with mode: 0644]
advancedcontentfilter/vendor/pimple/pimple/ext/pimple/tests/016.phpt [new file with mode: 0644]
advancedcontentfilter/vendor/pimple/pimple/ext/pimple/tests/017.phpt [new file with mode: 0644]
advancedcontentfilter/vendor/pimple/pimple/ext/pimple/tests/017_1.phpt [new file with mode: 0644]
advancedcontentfilter/vendor/pimple/pimple/ext/pimple/tests/018.phpt [new file with mode: 0644]
advancedcontentfilter/vendor/pimple/pimple/ext/pimple/tests/019.phpt [new file with mode: 0644]
advancedcontentfilter/vendor/pimple/pimple/ext/pimple/tests/bench.phpb [new file with mode: 0644]
advancedcontentfilter/vendor/pimple/pimple/ext/pimple/tests/bench_shared.phpb [new file with mode: 0644]
advancedcontentfilter/vendor/pimple/pimple/phpunit.xml.dist [new file with mode: 0644]
advancedcontentfilter/vendor/pimple/pimple/src/Pimple/Container.php [new file with mode: 0644]
advancedcontentfilter/vendor/pimple/pimple/src/Pimple/Exception/ExpectedInvokableException.php [new file with mode: 0644]
advancedcontentfilter/vendor/pimple/pimple/src/Pimple/Exception/FrozenServiceException.php [new file with mode: 0644]
advancedcontentfilter/vendor/pimple/pimple/src/Pimple/Exception/InvalidServiceIdentifierException.php [new file with mode: 0644]
advancedcontentfilter/vendor/pimple/pimple/src/Pimple/Exception/UnknownIdentifierException.php [new file with mode: 0644]
advancedcontentfilter/vendor/pimple/pimple/src/Pimple/Psr11/Container.php [new file with mode: 0644]
advancedcontentfilter/vendor/pimple/pimple/src/Pimple/Psr11/ServiceLocator.php [new file with mode: 0644]
advancedcontentfilter/vendor/pimple/pimple/src/Pimple/ServiceIterator.php [new file with mode: 0644]
advancedcontentfilter/vendor/pimple/pimple/src/Pimple/ServiceProviderInterface.php [new file with mode: 0644]
advancedcontentfilter/vendor/pimple/pimple/src/Pimple/Tests/Fixtures/Invokable.php [new file with mode: 0644]
advancedcontentfilter/vendor/pimple/pimple/src/Pimple/Tests/Fixtures/NonInvokable.php [new file with mode: 0644]
advancedcontentfilter/vendor/pimple/pimple/src/Pimple/Tests/Fixtures/PimpleServiceProvider.php [new file with mode: 0644]
advancedcontentfilter/vendor/pimple/pimple/src/Pimple/Tests/Fixtures/Service.php [new file with mode: 0644]
advancedcontentfilter/vendor/pimple/pimple/src/Pimple/Tests/PimpleServiceProviderInterfaceTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/pimple/pimple/src/Pimple/Tests/PimpleTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/pimple/pimple/src/Pimple/Tests/Psr11/ContainerTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/pimple/pimple/src/Pimple/Tests/Psr11/ServiceLocatorTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/pimple/pimple/src/Pimple/Tests/ServiceIteratorTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/psr/cache/CHANGELOG.md [new file with mode: 0644]
advancedcontentfilter/vendor/psr/cache/LICENSE.txt [new file with mode: 0644]
advancedcontentfilter/vendor/psr/cache/README.md [new file with mode: 0644]
advancedcontentfilter/vendor/psr/cache/composer.json [new file with mode: 0644]
advancedcontentfilter/vendor/psr/cache/src/CacheException.php [new file with mode: 0644]
advancedcontentfilter/vendor/psr/cache/src/CacheItemInterface.php [new file with mode: 0644]
advancedcontentfilter/vendor/psr/cache/src/CacheItemPoolInterface.php [new file with mode: 0644]
advancedcontentfilter/vendor/psr/cache/src/InvalidArgumentException.php [new file with mode: 0644]
advancedcontentfilter/vendor/psr/container/.gitignore [new file with mode: 0644]
advancedcontentfilter/vendor/psr/container/LICENSE [new file with mode: 0644]
advancedcontentfilter/vendor/psr/container/README.md [new file with mode: 0644]
advancedcontentfilter/vendor/psr/container/composer.json [new file with mode: 0644]
advancedcontentfilter/vendor/psr/container/src/ContainerExceptionInterface.php [new file with mode: 0644]
advancedcontentfilter/vendor/psr/container/src/ContainerInterface.php [new file with mode: 0644]
advancedcontentfilter/vendor/psr/container/src/NotFoundExceptionInterface.php [new file with mode: 0644]
advancedcontentfilter/vendor/psr/http-message/CHANGELOG.md [new file with mode: 0644]
advancedcontentfilter/vendor/psr/http-message/LICENSE [new file with mode: 0644]
advancedcontentfilter/vendor/psr/http-message/README.md [new file with mode: 0644]
advancedcontentfilter/vendor/psr/http-message/composer.json [new file with mode: 0644]
advancedcontentfilter/vendor/psr/http-message/src/MessageInterface.php [new file with mode: 0644]
advancedcontentfilter/vendor/psr/http-message/src/RequestInterface.php [new file with mode: 0644]
advancedcontentfilter/vendor/psr/http-message/src/ResponseInterface.php [new file with mode: 0644]
advancedcontentfilter/vendor/psr/http-message/src/ServerRequestInterface.php [new file with mode: 0644]
advancedcontentfilter/vendor/psr/http-message/src/StreamInterface.php [new file with mode: 0644]
advancedcontentfilter/vendor/psr/http-message/src/UploadedFileInterface.php [new file with mode: 0644]
advancedcontentfilter/vendor/psr/http-message/src/UriInterface.php [new file with mode: 0644]
advancedcontentfilter/vendor/psr/log/.gitignore [new file with mode: 0644]
advancedcontentfilter/vendor/psr/log/LICENSE [new file with mode: 0644]
advancedcontentfilter/vendor/psr/log/Psr/Log/AbstractLogger.php [new file with mode: 0644]
advancedcontentfilter/vendor/psr/log/Psr/Log/InvalidArgumentException.php [new file with mode: 0644]
advancedcontentfilter/vendor/psr/log/Psr/Log/LogLevel.php [new file with mode: 0644]
advancedcontentfilter/vendor/psr/log/Psr/Log/LoggerAwareInterface.php [new file with mode: 0644]
advancedcontentfilter/vendor/psr/log/Psr/Log/LoggerAwareTrait.php [new file with mode: 0644]
advancedcontentfilter/vendor/psr/log/Psr/Log/LoggerInterface.php [new file with mode: 0644]
advancedcontentfilter/vendor/psr/log/Psr/Log/LoggerTrait.php [new file with mode: 0644]
advancedcontentfilter/vendor/psr/log/Psr/Log/NullLogger.php [new file with mode: 0644]
advancedcontentfilter/vendor/psr/log/Psr/Log/Test/LoggerInterfaceTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/psr/log/README.md [new file with mode: 0644]
advancedcontentfilter/vendor/psr/log/composer.json [new file with mode: 0644]
advancedcontentfilter/vendor/psr/simple-cache/.editorconfig [new file with mode: 0644]
advancedcontentfilter/vendor/psr/simple-cache/LICENSE.md [new file with mode: 0644]
advancedcontentfilter/vendor/psr/simple-cache/README.md [new file with mode: 0644]
advancedcontentfilter/vendor/psr/simple-cache/composer.json [new file with mode: 0644]
advancedcontentfilter/vendor/psr/simple-cache/src/CacheException.php [new file with mode: 0644]
advancedcontentfilter/vendor/psr/simple-cache/src/CacheInterface.php [new file with mode: 0644]
advancedcontentfilter/vendor/psr/simple-cache/src/InvalidArgumentException.php [new file with mode: 0644]
advancedcontentfilter/vendor/slim/slim-skeleton/.gitignore [new file with mode: 0644]
advancedcontentfilter/vendor/slim/slim-skeleton/CONTRIBUTING.md [new file with mode: 0644]
advancedcontentfilter/vendor/slim/slim-skeleton/README.md [new file with mode: 0644]
advancedcontentfilter/vendor/slim/slim-skeleton/composer.json [new file with mode: 0644]
advancedcontentfilter/vendor/slim/slim-skeleton/docker-compose.yml [new file with mode: 0644]
advancedcontentfilter/vendor/slim/slim-skeleton/logs/README.md [new file with mode: 0644]
advancedcontentfilter/vendor/slim/slim-skeleton/phpunit.xml [new file with mode: 0644]
advancedcontentfilter/vendor/slim/slim-skeleton/public/.htaccess [new file with mode: 0644]
advancedcontentfilter/vendor/slim/slim-skeleton/public/index.php [new file with mode: 0644]
advancedcontentfilter/vendor/slim/slim-skeleton/src/dependencies.php [new file with mode: 0644]
advancedcontentfilter/vendor/slim/slim-skeleton/src/middleware.php [new file with mode: 0644]
advancedcontentfilter/vendor/slim/slim-skeleton/src/routes.php [new file with mode: 0644]
advancedcontentfilter/vendor/slim/slim-skeleton/src/settings.php [new file with mode: 0644]
advancedcontentfilter/vendor/slim/slim-skeleton/templates/index.phtml [new file with mode: 0644]
advancedcontentfilter/vendor/slim/slim-skeleton/tests/Functional/BaseTestCase.php [new file with mode: 0644]
advancedcontentfilter/vendor/slim/slim-skeleton/tests/Functional/HomepageTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/slim/slim/LICENSE.md [new file with mode: 0644]
advancedcontentfilter/vendor/slim/slim/Slim/App.php [new file with mode: 0644]
advancedcontentfilter/vendor/slim/slim/Slim/CallableResolver.php [new file with mode: 0644]
advancedcontentfilter/vendor/slim/slim/Slim/CallableResolverAwareTrait.php [new file with mode: 0644]
advancedcontentfilter/vendor/slim/slim/Slim/Collection.php [new file with mode: 0644]
advancedcontentfilter/vendor/slim/slim/Slim/Container.php [new file with mode: 0644]
advancedcontentfilter/vendor/slim/slim/Slim/DefaultServicesProvider.php [new file with mode: 0644]
advancedcontentfilter/vendor/slim/slim/Slim/DeferredCallable.php [new file with mode: 0644]
advancedcontentfilter/vendor/slim/slim/Slim/Exception/ContainerException.php [new file with mode: 0644]
advancedcontentfilter/vendor/slim/slim/Slim/Exception/ContainerValueNotFoundException.php [new file with mode: 0644]
advancedcontentfilter/vendor/slim/slim/Slim/Exception/InvalidMethodException.php [new file with mode: 0644]
advancedcontentfilter/vendor/slim/slim/Slim/Exception/MethodNotAllowedException.php [new file with mode: 0644]
advancedcontentfilter/vendor/slim/slim/Slim/Exception/NotFoundException.php [new file with mode: 0644]
advancedcontentfilter/vendor/slim/slim/Slim/Exception/SlimException.php [new file with mode: 0644]
advancedcontentfilter/vendor/slim/slim/Slim/Handlers/AbstractError.php [new file with mode: 0644]
advancedcontentfilter/vendor/slim/slim/Slim/Handlers/AbstractHandler.php [new file with mode: 0644]
advancedcontentfilter/vendor/slim/slim/Slim/Handlers/Error.php [new file with mode: 0644]
advancedcontentfilter/vendor/slim/slim/Slim/Handlers/NotAllowed.php [new file with mode: 0644]
advancedcontentfilter/vendor/slim/slim/Slim/Handlers/NotFound.php [new file with mode: 0644]
advancedcontentfilter/vendor/slim/slim/Slim/Handlers/PhpError.php [new file with mode: 0644]
advancedcontentfilter/vendor/slim/slim/Slim/Handlers/Strategies/RequestResponse.php [new file with mode: 0644]
advancedcontentfilter/vendor/slim/slim/Slim/Handlers/Strategies/RequestResponseArgs.php [new file with mode: 0644]
advancedcontentfilter/vendor/slim/slim/Slim/Http/Body.php [new file with mode: 0644]
advancedcontentfilter/vendor/slim/slim/Slim/Http/Cookies.php [new file with mode: 0644]
advancedcontentfilter/vendor/slim/slim/Slim/Http/Environment.php [new file with mode: 0644]
advancedcontentfilter/vendor/slim/slim/Slim/Http/Headers.php [new file with mode: 0644]
advancedcontentfilter/vendor/slim/slim/Slim/Http/Message.php [new file with mode: 0644]
advancedcontentfilter/vendor/slim/slim/Slim/Http/Request.php [new file with mode: 0644]
advancedcontentfilter/vendor/slim/slim/Slim/Http/RequestBody.php [new file with mode: 0644]
advancedcontentfilter/vendor/slim/slim/Slim/Http/Response.php [new file with mode: 0644]
advancedcontentfilter/vendor/slim/slim/Slim/Http/Stream.php [new file with mode: 0644]
advancedcontentfilter/vendor/slim/slim/Slim/Http/UploadedFile.php [new file with mode: 0644]
advancedcontentfilter/vendor/slim/slim/Slim/Http/Uri.php [new file with mode: 0644]
advancedcontentfilter/vendor/slim/slim/Slim/Interfaces/CallableResolverInterface.php [new file with mode: 0644]
advancedcontentfilter/vendor/slim/slim/Slim/Interfaces/CollectionInterface.php [new file with mode: 0644]
advancedcontentfilter/vendor/slim/slim/Slim/Interfaces/Http/CookiesInterface.php [new file with mode: 0644]
advancedcontentfilter/vendor/slim/slim/Slim/Interfaces/Http/EnvironmentInterface.php [new file with mode: 0644]
advancedcontentfilter/vendor/slim/slim/Slim/Interfaces/Http/HeadersInterface.php [new file with mode: 0644]
advancedcontentfilter/vendor/slim/slim/Slim/Interfaces/InvocationStrategyInterface.php [new file with mode: 0644]
advancedcontentfilter/vendor/slim/slim/Slim/Interfaces/RouteGroupInterface.php [new file with mode: 0644]
advancedcontentfilter/vendor/slim/slim/Slim/Interfaces/RouteInterface.php [new file with mode: 0644]
advancedcontentfilter/vendor/slim/slim/Slim/Interfaces/RouterInterface.php [new file with mode: 0644]
advancedcontentfilter/vendor/slim/slim/Slim/MiddlewareAwareTrait.php [new file with mode: 0644]
advancedcontentfilter/vendor/slim/slim/Slim/Routable.php [new file with mode: 0644]
advancedcontentfilter/vendor/slim/slim/Slim/Route.php [new file with mode: 0644]
advancedcontentfilter/vendor/slim/slim/Slim/RouteGroup.php [new file with mode: 0644]
advancedcontentfilter/vendor/slim/slim/Slim/Router.php [new file with mode: 0644]
advancedcontentfilter/vendor/slim/slim/composer.json [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/.gitignore [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Adapter/AbstractAdapter.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Adapter/AdapterInterface.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Adapter/ApcuAdapter.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Adapter/ArrayAdapter.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Adapter/ChainAdapter.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Adapter/DoctrineAdapter.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Adapter/FilesystemAdapter.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Adapter/MemcachedAdapter.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Adapter/NullAdapter.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Adapter/PdoAdapter.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Adapter/PhpArrayAdapter.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Adapter/PhpFilesAdapter.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Adapter/ProxyAdapter.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Adapter/RedisAdapter.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Adapter/SimpleCacheAdapter.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Adapter/TagAwareAdapter.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Adapter/TagAwareAdapterInterface.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Adapter/TraceableAdapter.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Adapter/TraceableTagAwareAdapter.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/CHANGELOG.md [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/CacheItem.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/DataCollector/CacheDataCollector.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/DoctrineProvider.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Exception/CacheException.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Exception/InvalidArgumentException.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/LICENSE [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/PruneableInterface.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/README.md [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/ResettableInterface.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Simple/AbstractCache.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Simple/ApcuCache.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Simple/ArrayCache.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Simple/ChainCache.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Simple/DoctrineCache.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Simple/FilesystemCache.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Simple/MemcachedCache.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Simple/NullCache.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Simple/PdoCache.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Simple/PhpArrayCache.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Simple/PhpFilesCache.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Simple/Psr6Cache.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Simple/RedisCache.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Simple/TraceableCache.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Tests/Adapter/AbstractRedisAdapterTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Tests/Adapter/AdapterTestCase.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Tests/Adapter/ApcuAdapterTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Tests/Adapter/ArrayAdapterTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Tests/Adapter/ChainAdapterTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Tests/Adapter/DoctrineAdapterTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Tests/Adapter/FilesystemAdapterTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Tests/Adapter/MaxIdLengthAdapterTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Tests/Adapter/MemcachedAdapterTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Tests/Adapter/NamespacedProxyAdapterTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Tests/Adapter/NullAdapterTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Tests/Adapter/PdoAdapterTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Tests/Adapter/PdoDbalAdapterTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Tests/Adapter/PhpArrayAdapterTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Tests/Adapter/PhpArrayAdapterWithFallbackTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Tests/Adapter/PhpFilesAdapterTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Tests/Adapter/PredisAdapterTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Tests/Adapter/PredisClusterAdapterTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Tests/Adapter/ProxyAdapterTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Tests/Adapter/RedisAdapterTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Tests/Adapter/RedisArrayAdapterTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Tests/Adapter/SimpleCacheAdapterTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Tests/Adapter/TagAwareAdapterTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Tests/Adapter/TraceableAdapterTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Tests/Adapter/TraceableTagAwareAdapterTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Tests/CacheItemTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Tests/DoctrineProviderTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Tests/Fixtures/ArrayCache.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Tests/Fixtures/ExternalAdapter.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Tests/Simple/AbstractRedisCacheTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Tests/Simple/ApcuCacheTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Tests/Simple/ArrayCacheTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Tests/Simple/CacheTestCase.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Tests/Simple/ChainCacheTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Tests/Simple/DoctrineCacheTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Tests/Simple/FilesystemCacheTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Tests/Simple/MemcachedCacheTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Tests/Simple/NullCacheTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Tests/Simple/PdoCacheTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Tests/Simple/PdoDbalCacheTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Tests/Simple/PhpArrayCacheTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Tests/Simple/PhpArrayCacheWithFallbackTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Tests/Simple/PhpFilesCacheTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Tests/Simple/Psr6CacheTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Tests/Simple/RedisArrayCacheTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Tests/Simple/RedisCacheTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Tests/Simple/TraceableCacheTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Tests/Traits/PdoPruneableTrait.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Traits/AbstractTrait.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Traits/ApcuTrait.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Traits/ArrayTrait.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Traits/DoctrineTrait.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Traits/FilesystemCommonTrait.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Traits/FilesystemTrait.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Traits/MemcachedTrait.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Traits/PdoTrait.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Traits/PhpArrayTrait.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Traits/PhpFilesTrait.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Traits/ProxyTrait.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Traits/RedisProxy.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/Traits/RedisTrait.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/composer.json [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/cache/phpunit.xml.dist [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/expression-language/.gitignore [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/expression-language/CHANGELOG.md [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/expression-language/Compiler.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/expression-language/Expression.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/expression-language/ExpressionFunction.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/expression-language/ExpressionFunctionProviderInterface.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/expression-language/ExpressionLanguage.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/expression-language/LICENSE [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/expression-language/Lexer.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/expression-language/Node/ArgumentsNode.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/expression-language/Node/ArrayNode.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/expression-language/Node/BinaryNode.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/expression-language/Node/ConditionalNode.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/expression-language/Node/ConstantNode.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/expression-language/Node/FunctionNode.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/expression-language/Node/GetAttrNode.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/expression-language/Node/NameNode.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/expression-language/Node/Node.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/expression-language/Node/UnaryNode.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/expression-language/ParsedExpression.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/expression-language/Parser.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/expression-language/ParserCache/ArrayParserCache.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/expression-language/ParserCache/ParserCacheAdapter.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/expression-language/ParserCache/ParserCacheInterface.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/expression-language/README.md [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/expression-language/Resources/bin/generate_operator_regex.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/expression-language/SerializedParsedExpression.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/expression-language/SyntaxError.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/expression-language/Tests/ExpressionFunctionTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/expression-language/Tests/ExpressionLanguageTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/expression-language/Tests/ExpressionTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/expression-language/Tests/Fixtures/TestProvider.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/expression-language/Tests/LexerTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/expression-language/Tests/Node/AbstractNodeTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/expression-language/Tests/Node/ArgumentsNodeTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/expression-language/Tests/Node/ArrayNodeTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/expression-language/Tests/Node/BinaryNodeTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/expression-language/Tests/Node/ConditionalNodeTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/expression-language/Tests/Node/ConstantNodeTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/expression-language/Tests/Node/FunctionNodeTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/expression-language/Tests/Node/GetAttrNodeTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/expression-language/Tests/Node/NameNodeTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/expression-language/Tests/Node/NodeTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/expression-language/Tests/Node/UnaryNodeTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/expression-language/Tests/ParsedExpressionTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/expression-language/Tests/ParserCache/ParserCacheAdapterTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/expression-language/Tests/ParserTest.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/expression-language/Token.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/expression-language/TokenStream.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/expression-language/composer.json [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/expression-language/phpunit.xml.dist [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/polyfill-apcu/Apcu.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/polyfill-apcu/LICENSE [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/polyfill-apcu/README.md [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/polyfill-apcu/bootstrap.php [new file with mode: 0644]
advancedcontentfilter/vendor/symfony/polyfill-apcu/composer.json [new file with mode: 0644]

diff --git a/advancedcontentfilter/composer.json b/advancedcontentfilter/composer.json
new file mode 100644 (file)
index 0000000..3f23a28
--- /dev/null
@@ -0,0 +1,34 @@
+{
+       "name": "friendica-addons/advancedcontentfilter",
+       "description": "Advanced Content Filter addon for Friendica",
+       "type": "friendica-addon",
+       "authors": [
+               {
+                       "name": "Hypolite Petovan",
+                       "email": "mrpetovan@gmail.com",
+                       "homepage": "https://friendica.mrpetovan.com/profile/hypolite",
+                       "role": "Developer"
+               }
+       ],
+       "require": {
+               "php": ">=5.5.0",
+               "slim/slim": "^3.1",
+               "symfony/expression-language": "^3.4",
+               "fxp/composer-asset-plugin": "~1.3",
+               "bower-asset/vue": "^2.5",
+               "bower-asset/vue-resource": "^1.5"
+       },
+       "license": "3-clause BSD license",
+       "minimum-stability": "stable",
+       "config": {
+               "optimize-autoloader": true,
+               "autoloader-suffix": "AdvancedContentFilterAddon",
+               "preferred-install": "dist",
+               "fxp-asset": {
+                       "installer-paths": {
+                               "npm-asset-library": "vendor/asset",
+                               "bower-asset-library": "vendor/asset"
+                       }
+               }
+       }
+}
diff --git a/advancedcontentfilter/composer.lock b/advancedcontentfilter/composer.lock
new file mode 100644 (file)
index 0000000..a854c4b
--- /dev/null
@@ -0,0 +1,745 @@
+{
+    "_readme": [
+        "This file locks the dependencies of your project to a known state",
+        "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
+        "This file is @generated automatically"
+    ],
+    "content-hash": "ac524148018bc5ba29d74e49492be515",
+    "packages": [
+        {
+            "name": "bower-asset/vue",
+            "version": "v2.5.16",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/vuejs/vue.git",
+                "reference": "25342194016dc3bcc81cb3e8e229b0fb7ba1d1d6"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/vuejs/vue/zipball/25342194016dc3bcc81cb3e8e229b0fb7ba1d1d6",
+                "reference": "25342194016dc3bcc81cb3e8e229b0fb7ba1d1d6",
+                "shasum": ""
+            },
+            "type": "bower-asset-library"
+        },
+        {
+            "name": "bower-asset/vue-resource",
+            "version": "1.5.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/pagekit/vue-resource.git",
+                "reference": "9a34f881f56f64b923572541d1753cb6cdd63d40"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/pagekit/vue-resource/zipball/9a34f881f56f64b923572541d1753cb6cdd63d40",
+                "reference": "9a34f881f56f64b923572541d1753cb6cdd63d40",
+                "shasum": ""
+            },
+            "type": "bower-asset-library",
+            "extra": {
+                "bower-asset-main": "dist/vue-resource.js",
+                "bower-asset-ignore": [
+                    ".*",
+                    "build",
+                    "docs",
+                    "package.json"
+                ]
+            },
+            "license": [
+                "MIT"
+            ],
+            "description": "The HTTP client for Vue.js",
+            "keywords": [
+                "ajax",
+                "http",
+                "vue",
+                "xhr"
+            ],
+            "time": "2018-03-03T07:42:38+00:00"
+        },
+        {
+            "name": "container-interop/container-interop",
+            "version": "1.2.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/container-interop/container-interop.git",
+                "reference": "79cbf1341c22ec75643d841642dd5d6acd83bdb8"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/container-interop/container-interop/zipball/79cbf1341c22ec75643d841642dd5d6acd83bdb8",
+                "reference": "79cbf1341c22ec75643d841642dd5d6acd83bdb8",
+                "shasum": ""
+            },
+            "require": {
+                "psr/container": "^1.0"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Interop\\Container\\": "src/Interop/Container/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "description": "Promoting the interoperability of container objects (DIC, SL, etc.)",
+            "homepage": "https://github.com/container-interop/container-interop",
+            "time": "2017-02-14T19:40:03+00:00"
+        },
+        {
+            "name": "fxp/composer-asset-plugin",
+            "version": "v1.4.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/fxpio/composer-asset-plugin.git",
+                "reference": "61352d99940d2b2392a5d2db83b8c0ef5faf222a"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/fxpio/composer-asset-plugin/zipball/61352d99940d2b2392a5d2db83b8c0ef5faf222a",
+                "reference": "61352d99940d2b2392a5d2db83b8c0ef5faf222a",
+                "shasum": ""
+            },
+            "require": {
+                "composer-plugin-api": "^1.0",
+                "php": ">=5.3.3"
+            },
+            "require-dev": {
+                "composer/composer": "^1.4.0"
+            },
+            "type": "composer-plugin",
+            "extra": {
+                "class": "Fxp\\Composer\\AssetPlugin\\FxpAssetPlugin",
+                "branch-alias": {
+                    "dev-master": "1.4-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Fxp\\Composer\\AssetPlugin\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "François Pluchino",
+                    "email": "francois.pluchino@gmail.com"
+                }
+            ],
+            "description": "NPM/Bower Dependency Manager for Composer",
+            "homepage": "https://github.com/fxpio/composer-asset-plugin",
+            "keywords": [
+                "asset",
+                "bower",
+                "composer",
+                "dependency manager",
+                "nodejs",
+                "npm",
+                "package"
+            ],
+            "time": "2017-10-20T06:53:56+00:00"
+        },
+        {
+            "name": "nikic/fast-route",
+            "version": "v1.3.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/nikic/FastRoute.git",
+                "reference": "181d480e08d9476e61381e04a71b34dc0432e812"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/nikic/FastRoute/zipball/181d480e08d9476e61381e04a71b34dc0432e812",
+                "reference": "181d480e08d9476e61381e04a71b34dc0432e812",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.4.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^4.8.35|~5.7"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "FastRoute\\": "src/"
+                },
+                "files": [
+                    "src/functions.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Nikita Popov",
+                    "email": "nikic@php.net"
+                }
+            ],
+            "description": "Fast request router for PHP",
+            "keywords": [
+                "router",
+                "routing"
+            ],
+            "time": "2018-02-13T20:26:39+00:00"
+        },
+        {
+            "name": "pimple/pimple",
+            "version": "v3.2.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/silexphp/Pimple.git",
+                "reference": "9e403941ef9d65d20cba7d54e29fe906db42cf32"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/silexphp/Pimple/zipball/9e403941ef9d65d20cba7d54e29fe906db42cf32",
+                "reference": "9e403941ef9d65d20cba7d54e29fe906db42cf32",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.0",
+                "psr/container": "^1.0"
+            },
+            "require-dev": {
+                "symfony/phpunit-bridge": "^3.2"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.2.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "Pimple": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                }
+            ],
+            "description": "Pimple, a simple Dependency Injection Container",
+            "homepage": "http://pimple.sensiolabs.org",
+            "keywords": [
+                "container",
+                "dependency injection"
+            ],
+            "time": "2018-01-21T07:42:36+00:00"
+        },
+        {
+            "name": "psr/cache",
+            "version": "1.0.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-fig/cache.git",
+                "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8",
+                "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Psr\\Cache\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP-FIG",
+                    "homepage": "http://www.php-fig.org/"
+                }
+            ],
+            "description": "Common interface for caching libraries",
+            "keywords": [
+                "cache",
+                "psr",
+                "psr-6"
+            ],
+            "time": "2016-08-06T20:24:11+00:00"
+        },
+        {
+            "name": "psr/container",
+            "version": "1.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-fig/container.git",
+                "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
+                "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Psr\\Container\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP-FIG",
+                    "homepage": "http://www.php-fig.org/"
+                }
+            ],
+            "description": "Common Container Interface (PHP FIG PSR-11)",
+            "homepage": "https://github.com/php-fig/container",
+            "keywords": [
+                "PSR-11",
+                "container",
+                "container-interface",
+                "container-interop",
+                "psr"
+            ],
+            "time": "2017-02-14T16:28:37+00:00"
+        },
+        {
+            "name": "psr/http-message",
+            "version": "1.0.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-fig/http-message.git",
+                "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363",
+                "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Psr\\Http\\Message\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP-FIG",
+                    "homepage": "http://www.php-fig.org/"
+                }
+            ],
+            "description": "Common interface for HTTP messages",
+            "homepage": "https://github.com/php-fig/http-message",
+            "keywords": [
+                "http",
+                "http-message",
+                "psr",
+                "psr-7",
+                "request",
+                "response"
+            ],
+            "time": "2016-08-06T14:39:51+00:00"
+        },
+        {
+            "name": "psr/log",
+            "version": "1.0.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-fig/log.git",
+                "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-fig/log/zipball/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d",
+                "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Psr\\Log\\": "Psr/Log/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP-FIG",
+                    "homepage": "http://www.php-fig.org/"
+                }
+            ],
+            "description": "Common interface for logging libraries",
+            "homepage": "https://github.com/php-fig/log",
+            "keywords": [
+                "log",
+                "psr",
+                "psr-3"
+            ],
+            "time": "2016-10-10T12:19:37+00:00"
+        },
+        {
+            "name": "psr/simple-cache",
+            "version": "1.0.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-fig/simple-cache.git",
+                "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b",
+                "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Psr\\SimpleCache\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP-FIG",
+                    "homepage": "http://www.php-fig.org/"
+                }
+            ],
+            "description": "Common interfaces for simple caching",
+            "keywords": [
+                "cache",
+                "caching",
+                "psr",
+                "psr-16",
+                "simple-cache"
+            ],
+            "time": "2017-10-23T01:57:42+00:00"
+        },
+        {
+            "name": "slim/slim",
+            "version": "3.9.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/slimphp/Slim.git",
+                "reference": "4086d0106cf5a7135c69fce4161fe355a8feb118"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/slimphp/Slim/zipball/4086d0106cf5a7135c69fce4161fe355a8feb118",
+                "reference": "4086d0106cf5a7135c69fce4161fe355a8feb118",
+                "shasum": ""
+            },
+            "require": {
+                "container-interop/container-interop": "^1.2",
+                "nikic/fast-route": "^1.0",
+                "php": ">=5.5.0",
+                "pimple/pimple": "^3.0",
+                "psr/container": "^1.0",
+                "psr/http-message": "^1.0"
+            },
+            "provide": {
+                "psr/http-message-implementation": "1.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^4.0",
+                "squizlabs/php_codesniffer": "^2.5"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Slim\\": "Slim"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Rob Allen",
+                    "email": "rob@akrabat.com",
+                    "homepage": "http://akrabat.com"
+                },
+                {
+                    "name": "Josh Lockhart",
+                    "email": "hello@joshlockhart.com",
+                    "homepage": "https://joshlockhart.com"
+                },
+                {
+                    "name": "Gabriel Manricks",
+                    "email": "gmanricks@me.com",
+                    "homepage": "http://gabrielmanricks.com"
+                },
+                {
+                    "name": "Andrew Smith",
+                    "email": "a.smith@silentworks.co.uk",
+                    "homepage": "http://silentworks.co.uk"
+                }
+            ],
+            "description": "Slim is a PHP micro framework that helps you quickly write simple yet powerful web applications and APIs",
+            "homepage": "https://slimframework.com",
+            "keywords": [
+                "api",
+                "framework",
+                "micro",
+                "router"
+            ],
+            "time": "2017-11-26T19:13:09+00:00"
+        },
+        {
+            "name": "symfony/cache",
+            "version": "v3.4.8",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/cache.git",
+                "reference": "13255ddd056e49f3154747943f8ee175d555d394"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/cache/zipball/13255ddd056e49f3154747943f8ee175d555d394",
+                "reference": "13255ddd056e49f3154747943f8ee175d555d394",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^5.5.9|>=7.0.8",
+                "psr/cache": "~1.0",
+                "psr/log": "~1.0",
+                "psr/simple-cache": "^1.0",
+                "symfony/polyfill-apcu": "~1.1"
+            },
+            "conflict": {
+                "symfony/var-dumper": "<3.3"
+            },
+            "provide": {
+                "psr/cache-implementation": "1.0",
+                "psr/simple-cache-implementation": "1.0"
+            },
+            "require-dev": {
+                "cache/integration-tests": "dev-master",
+                "doctrine/cache": "~1.6",
+                "doctrine/dbal": "~2.4",
+                "predis/predis": "~1.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.4-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Cache\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony Cache component with PSR-6, PSR-16, and tags",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "caching",
+                "psr6"
+            ],
+            "time": "2018-04-02T14:35:16+00:00"
+        },
+        {
+            "name": "symfony/expression-language",
+            "version": "v3.4.8",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/expression-language.git",
+                "reference": "867e4d1f5d4e52435a8ffff6b24fd6a801582241"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/expression-language/zipball/867e4d1f5d4e52435a8ffff6b24fd6a801582241",
+                "reference": "867e4d1f5d4e52435a8ffff6b24fd6a801582241",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^5.5.9|>=7.0.8",
+                "symfony/cache": "~3.1|~4.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.4-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\ExpressionLanguage\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony ExpressionLanguage Component",
+            "homepage": "https://symfony.com",
+            "time": "2018-01-03T07:37:34+00:00"
+        },
+        {
+            "name": "symfony/polyfill-apcu",
+            "version": "v1.7.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-apcu.git",
+                "reference": "e8ae2136ddb53dea314df56fcd88e318ab936c00"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-apcu/zipball/e8ae2136ddb53dea314df56fcd88e318ab936c00",
+                "reference": "e8ae2136ddb53dea314df56fcd88e318ab936c00",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.7-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Polyfill\\Apcu\\": ""
+                },
+                "files": [
+                    "bootstrap.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony polyfill backporting apcu_* functions to lower PHP versions",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "apcu",
+                "compatibility",
+                "polyfill",
+                "portable",
+                "shim"
+            ],
+            "time": "2018-01-30T19:27:44+00:00"
+        }
+    ],
+    "packages-dev": [],
+    "aliases": [],
+    "minimum-stability": "stable",
+    "stability-flags": [],
+    "prefer-stable": false,
+    "prefer-lowest": false,
+    "platform": {
+        "php": ">=5.5.0"
+    },
+    "platform-dev": []
+}
diff --git a/advancedcontentfilter/vendor/asset/vue-resource/LICENSE b/advancedcontentfilter/vendor/asset/vue-resource/LICENSE
new file mode 100644 (file)
index 0000000..3bd6217
--- /dev/null
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2015-2017 steffans
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/advancedcontentfilter/vendor/asset/vue-resource/README.md b/advancedcontentfilter/vendor/asset/vue-resource/README.md
new file mode 100644 (file)
index 0000000..59a012b
--- /dev/null
@@ -0,0 +1,59 @@
+# vue-resource [![Build](https://img.shields.io/circleci/project/pagekit/vue-resource/develop.svg)](https://circleci.com/gh/pagekit/vue-resource) [![Downloads](https://img.shields.io/npm/dm/vue-resource.svg)](https://www.npmjs.com/package/vue-resource) [![jsdelivr](https://data.jsdelivr.com/v1/package/npm/vue-resource/badge?style=rounded)](https://www.jsdelivr.com/package/npm/vue-resource) [![Version](https://img.shields.io/npm/v/vue-resource.svg)](https://www.npmjs.com/package/vue-resource) [![License](https://img.shields.io/npm/l/vue-resource.svg)](https://www.npmjs.com/package/vue-resource)
+
+The plugin for [Vue.js](http://vuejs.org) provides services for making web requests and handle responses using a [XMLHttpRequest](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest) or JSONP.
+
+## Features
+
+- Supports the [Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) API and [URI Templates](https://medialize.github.io/URI.js/uri-template.html)
+- Supports [interceptors](docs/http.md#interceptors) for request and response
+- Supports latest Firefox, Chrome, Safari, Opera and IE9+
+- Supports Vue 1.0 & Vue 2.0
+- Compact size 14KB (5.3KB gzipped)
+
+## Installation
+You can install it via [yarn](https://yarnpkg.com/) or [NPM](http://npmjs.org/).
+```
+$ yarn add vue-resource
+$ npm install vue-resource
+```
+
+### CDN
+Available on [jsdelivr](https://cdn.jsdelivr.net/npm/vue-resource@1.5.0), [unpkg](https://unpkg.com/vue-resource@1.5.0) or [cdnjs](https://cdnjs.com/libraries/vue-resource).
+```html
+<script src="https://cdn.jsdelivr.net/npm/vue-resource@1.5.0"></script>
+```
+
+## Example
+```js
+{
+  // GET /someUrl
+  this.$http.get('/someUrl').then(response => {
+
+    // get body data
+    this.someData = response.body;
+
+  }, response => {
+    // error callback
+  });
+}
+```
+
+## Documentation
+
+- [Configuration](docs/config.md)
+- [HTTP Requests/Response](docs/http.md)
+- [Creating Resources](docs/resource.md)
+- [Code Recipes](docs/recipes.md)
+- [API Reference](docs/api.md)
+
+## Changelog
+
+Details changes for each release are documented in the [release notes](https://github.com/pagekit/vue-resource/releases).
+
+## Contribution
+
+If you find a bug or want to contribute to the code or documentation, you can help by submitting an [issue](https://github.com/pagekit/vue-resource/issues) or a [pull request](https://github.com/pagekit/vue-resource/pulls).
+
+## License
+
+[MIT](http://opensource.org/licenses/MIT)
diff --git a/advancedcontentfilter/vendor/asset/vue-resource/bower.json b/advancedcontentfilter/vendor/asset/vue-resource/bower.json
new file mode 100644 (file)
index 0000000..3c59d30
--- /dev/null
@@ -0,0 +1,20 @@
+{
+  "name": "vue-resource",
+  "main": "dist/vue-resource.js",
+  "version": "1.5.0",
+  "description": "The HTTP client for Vue.js",
+  "homepage": "https://github.com/pagekit/vue-resource",
+  "license": "MIT",
+  "keywords": [
+    "vue",
+    "xhr",
+    "http",
+    "ajax"
+  ],
+  "ignore": [
+    ".*",
+    "build",
+    "docs",
+    "package.json"
+  ]
+}
\ No newline at end of file
diff --git a/advancedcontentfilter/vendor/asset/vue-resource/dist/README.md b/advancedcontentfilter/vendor/asset/vue-resource/dist/README.md
new file mode 100644 (file)
index 0000000..b664d20
--- /dev/null
@@ -0,0 +1,3 @@
+# NOTE!
+
+The `dist` folder contains the standalone build for vue-resource, however files here are only checked-in when a release happens. If you are on the `dev` branch, files here are **NOT** up to date. Only the `master` branch contains the built files for the latest stable version.
diff --git a/advancedcontentfilter/vendor/asset/vue-resource/dist/vue-resource.common.js b/advancedcontentfilter/vendor/asset/vue-resource/dist/vue-resource.common.js
new file mode 100644 (file)
index 0000000..9bc863d
--- /dev/null
@@ -0,0 +1,1557 @@
+/*!
+ * vue-resource v1.5.0
+ * https://github.com/pagekit/vue-resource
+ * Released under the MIT License.
+ */
+
+'use strict';
+
+/**
+ * Promises/A+ polyfill v1.1.4 (https://github.com/bramstein/promis)
+ */
+
+var RESOLVED = 0;
+var REJECTED = 1;
+var PENDING = 2;
+
+function Promise$1(executor) {
+
+    this.state = PENDING;
+    this.value = undefined;
+    this.deferred = [];
+
+    var promise = this;
+
+    try {
+        executor(function (x) {
+            promise.resolve(x);
+        }, function (r) {
+            promise.reject(r);
+        });
+    } catch (e) {
+        promise.reject(e);
+    }
+}
+
+Promise$1.reject = function (r) {
+    return new Promise$1(function (resolve, reject) {
+        reject(r);
+    });
+};
+
+Promise$1.resolve = function (x) {
+    return new Promise$1(function (resolve, reject) {
+        resolve(x);
+    });
+};
+
+Promise$1.all = function all(iterable) {
+    return new Promise$1(function (resolve, reject) {
+        var count = 0, result = [];
+
+        if (iterable.length === 0) {
+            resolve(result);
+        }
+
+        function resolver(i) {
+            return function (x) {
+                result[i] = x;
+                count += 1;
+
+                if (count === iterable.length) {
+                    resolve(result);
+                }
+            };
+        }
+
+        for (var i = 0; i < iterable.length; i += 1) {
+            Promise$1.resolve(iterable[i]).then(resolver(i), reject);
+        }
+    });
+};
+
+Promise$1.race = function race(iterable) {
+    return new Promise$1(function (resolve, reject) {
+        for (var i = 0; i < iterable.length; i += 1) {
+            Promise$1.resolve(iterable[i]).then(resolve, reject);
+        }
+    });
+};
+
+var p = Promise$1.prototype;
+
+p.resolve = function resolve(x) {
+    var promise = this;
+
+    if (promise.state === PENDING) {
+        if (x === promise) {
+            throw new TypeError('Promise settled with itself.');
+        }
+
+        var called = false;
+
+        try {
+            var then = x && x['then'];
+
+            if (x !== null && typeof x === 'object' && typeof then === 'function') {
+                then.call(x, function (x) {
+                    if (!called) {
+                        promise.resolve(x);
+                    }
+                    called = true;
+
+                }, function (r) {
+                    if (!called) {
+                        promise.reject(r);
+                    }
+                    called = true;
+                });
+                return;
+            }
+        } catch (e) {
+            if (!called) {
+                promise.reject(e);
+            }
+            return;
+        }
+
+        promise.state = RESOLVED;
+        promise.value = x;
+        promise.notify();
+    }
+};
+
+p.reject = function reject(reason) {
+    var promise = this;
+
+    if (promise.state === PENDING) {
+        if (reason === promise) {
+            throw new TypeError('Promise settled with itself.');
+        }
+
+        promise.state = REJECTED;
+        promise.value = reason;
+        promise.notify();
+    }
+};
+
+p.notify = function notify() {
+    var promise = this;
+
+    nextTick(function () {
+        if (promise.state !== PENDING) {
+            while (promise.deferred.length) {
+                var deferred = promise.deferred.shift(),
+                    onResolved = deferred[0],
+                    onRejected = deferred[1],
+                    resolve = deferred[2],
+                    reject = deferred[3];
+
+                try {
+                    if (promise.state === RESOLVED) {
+                        if (typeof onResolved === 'function') {
+                            resolve(onResolved.call(undefined, promise.value));
+                        } else {
+                            resolve(promise.value);
+                        }
+                    } else if (promise.state === REJECTED) {
+                        if (typeof onRejected === 'function') {
+                            resolve(onRejected.call(undefined, promise.value));
+                        } else {
+                            reject(promise.value);
+                        }
+                    }
+                } catch (e) {
+                    reject(e);
+                }
+            }
+        }
+    });
+};
+
+p.then = function then(onResolved, onRejected) {
+    var promise = this;
+
+    return new Promise$1(function (resolve, reject) {
+        promise.deferred.push([onResolved, onRejected, resolve, reject]);
+        promise.notify();
+    });
+};
+
+p.catch = function (onRejected) {
+    return this.then(undefined, onRejected);
+};
+
+/**
+ * Promise adapter.
+ */
+
+if (typeof Promise === 'undefined') {
+    window.Promise = Promise$1;
+}
+
+function PromiseObj(executor, context) {
+
+    if (executor instanceof Promise) {
+        this.promise = executor;
+    } else {
+        this.promise = new Promise(executor.bind(context));
+    }
+
+    this.context = context;
+}
+
+PromiseObj.all = function (iterable, context) {
+    return new PromiseObj(Promise.all(iterable), context);
+};
+
+PromiseObj.resolve = function (value, context) {
+    return new PromiseObj(Promise.resolve(value), context);
+};
+
+PromiseObj.reject = function (reason, context) {
+    return new PromiseObj(Promise.reject(reason), context);
+};
+
+PromiseObj.race = function (iterable, context) {
+    return new PromiseObj(Promise.race(iterable), context);
+};
+
+var p$1 = PromiseObj.prototype;
+
+p$1.bind = function (context) {
+    this.context = context;
+    return this;
+};
+
+p$1.then = function (fulfilled, rejected) {
+
+    if (fulfilled && fulfilled.bind && this.context) {
+        fulfilled = fulfilled.bind(this.context);
+    }
+
+    if (rejected && rejected.bind && this.context) {
+        rejected = rejected.bind(this.context);
+    }
+
+    return new PromiseObj(this.promise.then(fulfilled, rejected), this.context);
+};
+
+p$1.catch = function (rejected) {
+
+    if (rejected && rejected.bind && this.context) {
+        rejected = rejected.bind(this.context);
+    }
+
+    return new PromiseObj(this.promise.catch(rejected), this.context);
+};
+
+p$1.finally = function (callback) {
+
+    return this.then(function (value) {
+        callback.call(this);
+        return value;
+    }, function (reason) {
+        callback.call(this);
+        return Promise.reject(reason);
+    }
+    );
+};
+
+/**
+ * Utility functions.
+ */
+
+var ref = {};
+var hasOwnProperty = ref.hasOwnProperty;
+var ref$1 = [];
+var slice = ref$1.slice;
+var debug = false, ntick;
+
+var inBrowser = typeof window !== 'undefined';
+
+function Util (ref) {
+    var config = ref.config;
+    var nextTick = ref.nextTick;
+
+    ntick = nextTick;
+    debug = config.debug || !config.silent;
+}
+
+function warn(msg) {
+    if (typeof console !== 'undefined' && debug) {
+        console.warn('[VueResource warn]: ' + msg);
+    }
+}
+
+function error(msg) {
+    if (typeof console !== 'undefined') {
+        console.error(msg);
+    }
+}
+
+function nextTick(cb, ctx) {
+    return ntick(cb, ctx);
+}
+
+function trim(str) {
+    return str ? str.replace(/^\s*|\s*$/g, '') : '';
+}
+
+function trimEnd(str, chars) {
+
+    if (str && chars === undefined) {
+        return str.replace(/\s+$/, '');
+    }
+
+    if (!str || !chars) {
+        return str;
+    }
+
+    return str.replace(new RegExp(("[" + chars + "]+$")), '');
+}
+
+function toLower(str) {
+    return str ? str.toLowerCase() : '';
+}
+
+function toUpper(str) {
+    return str ? str.toUpperCase() : '';
+}
+
+var isArray = Array.isArray;
+
+function isString(val) {
+    return typeof val === 'string';
+}
+
+function isFunction(val) {
+    return typeof val === 'function';
+}
+
+function isObject(obj) {
+    return obj !== null && typeof obj === 'object';
+}
+
+function isPlainObject(obj) {
+    return isObject(obj) && Object.getPrototypeOf(obj) == Object.prototype;
+}
+
+function isBlob(obj) {
+    return typeof Blob !== 'undefined' && obj instanceof Blob;
+}
+
+function isFormData(obj) {
+    return typeof FormData !== 'undefined' && obj instanceof FormData;
+}
+
+function when(value, fulfilled, rejected) {
+
+    var promise = PromiseObj.resolve(value);
+
+    if (arguments.length < 2) {
+        return promise;
+    }
+
+    return promise.then(fulfilled, rejected);
+}
+
+function options(fn, obj, opts) {
+
+    opts = opts || {};
+
+    if (isFunction(opts)) {
+        opts = opts.call(obj);
+    }
+
+    return merge(fn.bind({$vm: obj, $options: opts}), fn, {$options: opts});
+}
+
+function each(obj, iterator) {
+
+    var i, key;
+
+    if (isArray(obj)) {
+        for (i = 0; i < obj.length; i++) {
+            iterator.call(obj[i], obj[i], i);
+        }
+    } else if (isObject(obj)) {
+        for (key in obj) {
+            if (hasOwnProperty.call(obj, key)) {
+                iterator.call(obj[key], obj[key], key);
+            }
+        }
+    }
+
+    return obj;
+}
+
+var assign = Object.assign || _assign;
+
+function merge(target) {
+
+    var args = slice.call(arguments, 1);
+
+    args.forEach(function (source) {
+        _merge(target, source, true);
+    });
+
+    return target;
+}
+
+function defaults(target) {
+
+    var args = slice.call(arguments, 1);
+
+    args.forEach(function (source) {
+
+        for (var key in source) {
+            if (target[key] === undefined) {
+                target[key] = source[key];
+            }
+        }
+
+    });
+
+    return target;
+}
+
+function _assign(target) {
+
+    var args = slice.call(arguments, 1);
+
+    args.forEach(function (source) {
+        _merge(target, source);
+    });
+
+    return target;
+}
+
+function _merge(target, source, deep) {
+    for (var key in source) {
+        if (deep && (isPlainObject(source[key]) || isArray(source[key]))) {
+            if (isPlainObject(source[key]) && !isPlainObject(target[key])) {
+                target[key] = {};
+            }
+            if (isArray(source[key]) && !isArray(target[key])) {
+                target[key] = [];
+            }
+            _merge(target[key], source[key], deep);
+        } else if (source[key] !== undefined) {
+            target[key] = source[key];
+        }
+    }
+}
+
+/**
+ * Root Prefix Transform.
+ */
+
+function root (options$$1, next) {
+
+    var url = next(options$$1);
+
+    if (isString(options$$1.root) && !/^(https?:)?\//.test(url)) {
+        url = trimEnd(options$$1.root, '/') + '/' + url;
+    }
+
+    return url;
+}
+
+/**
+ * Query Parameter Transform.
+ */
+
+function query (options$$1, next) {
+
+    var urlParams = Object.keys(Url.options.params), query = {}, url = next(options$$1);
+
+    each(options$$1.params, function (value, key) {
+        if (urlParams.indexOf(key) === -1) {
+            query[key] = value;
+        }
+    });
+
+    query = Url.params(query);
+
+    if (query) {
+        url += (url.indexOf('?') == -1 ? '?' : '&') + query;
+    }
+
+    return url;
+}
+
+/**
+ * URL Template v2.0.6 (https://github.com/bramstein/url-template)
+ */
+
+function expand(url, params, variables) {
+
+    var tmpl = parse(url), expanded = tmpl.expand(params);
+
+    if (variables) {
+        variables.push.apply(variables, tmpl.vars);
+    }
+
+    return expanded;
+}
+
+function parse(template) {
+
+    var operators = ['+', '#', '.', '/', ';', '?', '&'], variables = [];
+
+    return {
+        vars: variables,
+        expand: function expand(context) {
+            return template.replace(/\{([^{}]+)\}|([^{}]+)/g, function (_, expression, literal) {
+                if (expression) {
+
+                    var operator = null, values = [];
+
+                    if (operators.indexOf(expression.charAt(0)) !== -1) {
+                        operator = expression.charAt(0);
+                        expression = expression.substr(1);
+                    }
+
+                    expression.split(/,/g).forEach(function (variable) {
+                        var tmp = /([^:*]*)(?::(\d+)|(\*))?/.exec(variable);
+                        values.push.apply(values, getValues(context, operator, tmp[1], tmp[2] || tmp[3]));
+                        variables.push(tmp[1]);
+                    });
+
+                    if (operator && operator !== '+') {
+
+                        var separator = ',';
+
+                        if (operator === '?') {
+                            separator = '&';
+                        } else if (operator !== '#') {
+                            separator = operator;
+                        }
+
+                        return (values.length !== 0 ? operator : '') + values.join(separator);
+                    } else {
+                        return values.join(',');
+                    }
+
+                } else {
+                    return encodeReserved(literal);
+                }
+            });
+        }
+    };
+}
+
+function getValues(context, operator, key, modifier) {
+
+    var value = context[key], result = [];
+
+    if (isDefined(value) && value !== '') {
+        if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {
+            value = value.toString();
+
+            if (modifier && modifier !== '*') {
+                value = value.substring(0, parseInt(modifier, 10));
+            }
+
+            result.push(encodeValue(operator, value, isKeyOperator(operator) ? key : null));
+        } else {
+            if (modifier === '*') {
+                if (Array.isArray(value)) {
+                    value.filter(isDefined).forEach(function (value) {
+                        result.push(encodeValue(operator, value, isKeyOperator(operator) ? key : null));
+                    });
+                } else {
+                    Object.keys(value).forEach(function (k) {
+                        if (isDefined(value[k])) {
+                            result.push(encodeValue(operator, value[k], k));
+                        }
+                    });
+                }
+            } else {
+                var tmp = [];
+
+                if (Array.isArray(value)) {
+                    value.filter(isDefined).forEach(function (value) {
+                        tmp.push(encodeValue(operator, value));
+                    });
+                } else {
+                    Object.keys(value).forEach(function (k) {
+                        if (isDefined(value[k])) {
+                            tmp.push(encodeURIComponent(k));
+                            tmp.push(encodeValue(operator, value[k].toString()));
+                        }
+                    });
+                }
+
+                if (isKeyOperator(operator)) {
+                    result.push(encodeURIComponent(key) + '=' + tmp.join(','));
+                } else if (tmp.length !== 0) {
+                    result.push(tmp.join(','));
+                }
+            }
+        }
+    } else {
+        if (operator === ';') {
+            result.push(encodeURIComponent(key));
+        } else if (value === '' && (operator === '&' || operator === '?')) {
+            result.push(encodeURIComponent(key) + '=');
+        } else if (value === '') {
+            result.push('');
+        }
+    }
+
+    return result;
+}
+
+function isDefined(value) {
+    return value !== undefined && value !== null;
+}
+
+function isKeyOperator(operator) {
+    return operator === ';' || operator === '&' || operator === '?';
+}
+
+function encodeValue(operator, value, key) {
+
+    value = (operator === '+' || operator === '#') ? encodeReserved(value) : encodeURIComponent(value);
+
+    if (key) {
+        return encodeURIComponent(key) + '=' + value;
+    } else {
+        return value;
+    }
+}
+
+function encodeReserved(str) {
+    return str.split(/(%[0-9A-Fa-f]{2})/g).map(function (part) {
+        if (!/%[0-9A-Fa-f]/.test(part)) {
+            part = encodeURI(part);
+        }
+        return part;
+    }).join('');
+}
+
+/**
+ * URL Template (RFC 6570) Transform.
+ */
+
+function template (options) {
+
+    var variables = [], url = expand(options.url, options.params, variables);
+
+    variables.forEach(function (key) {
+        delete options.params[key];
+    });
+
+    return url;
+}
+
+/**
+ * Service for URL templating.
+ */
+
+function Url(url, params) {
+
+    var self = this || {}, options$$1 = url, transform;
+
+    if (isString(url)) {
+        options$$1 = {url: url, params: params};
+    }
+
+    options$$1 = merge({}, Url.options, self.$options, options$$1);
+
+    Url.transforms.forEach(function (handler) {
+
+        if (isString(handler)) {
+            handler = Url.transform[handler];
+        }
+
+        if (isFunction(handler)) {
+            transform = factory(handler, transform, self.$vm);
+        }
+
+    });
+
+    return transform(options$$1);
+}
+
+/**
+ * Url options.
+ */
+
+Url.options = {
+    url: '',
+    root: null,
+    params: {}
+};
+
+/**
+ * Url transforms.
+ */
+
+Url.transform = {template: template, query: query, root: root};
+Url.transforms = ['template', 'query', 'root'];
+
+/**
+ * Encodes a Url parameter string.
+ *
+ * @param {Object} obj
+ */
+
+Url.params = function (obj) {
+
+    var params = [], escape = encodeURIComponent;
+
+    params.add = function (key, value) {
+
+        if (isFunction(value)) {
+            value = value();
+        }
+
+        if (value === null) {
+            value = '';
+        }
+
+        this.push(escape(key) + '=' + escape(value));
+    };
+
+    serialize(params, obj);
+
+    return params.join('&').replace(/%20/g, '+');
+};
+
+/**
+ * Parse a URL and return its components.
+ *
+ * @param {String} url
+ */
+
+Url.parse = function (url) {
+
+    var el = document.createElement('a');
+
+    if (document.documentMode) {
+        el.href = url;
+        url = el.href;
+    }
+
+    el.href = url;
+
+    return {
+        href: el.href,
+        protocol: el.protocol ? el.protocol.replace(/:$/, '') : '',
+        port: el.port,
+        host: el.host,
+        hostname: el.hostname,
+        pathname: el.pathname.charAt(0) === '/' ? el.pathname : '/' + el.pathname,
+        search: el.search ? el.search.replace(/^\?/, '') : '',
+        hash: el.hash ? el.hash.replace(/^#/, '') : ''
+    };
+};
+
+function factory(handler, next, vm) {
+    return function (options$$1) {
+        return handler.call(vm, options$$1, next);
+    };
+}
+
+function serialize(params, obj, scope) {
+
+    var array = isArray(obj), plain = isPlainObject(obj), hash;
+
+    each(obj, function (value, key) {
+
+        hash = isObject(value) || isArray(value);
+
+        if (scope) {
+            key = scope + '[' + (plain || hash ? key : '') + ']';
+        }
+
+        if (!scope && array) {
+            params.add(value.name, value.value);
+        } else if (hash) {
+            serialize(params, value, key);
+        } else {
+            params.add(key, value);
+        }
+    });
+}
+
+/**
+ * XDomain client (Internet Explorer).
+ */
+
+function xdrClient (request) {
+    return new PromiseObj(function (resolve) {
+
+        var xdr = new XDomainRequest(), handler = function (ref) {
+                var type = ref.type;
+
+
+                var status = 0;
+
+                if (type === 'load') {
+                    status = 200;
+                } else if (type === 'error') {
+                    status = 500;
+                }
+
+                resolve(request.respondWith(xdr.responseText, {status: status}));
+            };
+
+        request.abort = function () { return xdr.abort(); };
+
+        xdr.open(request.method, request.getUrl());
+
+        if (request.timeout) {
+            xdr.timeout = request.timeout;
+        }
+
+        xdr.onload = handler;
+        xdr.onabort = handler;
+        xdr.onerror = handler;
+        xdr.ontimeout = handler;
+        xdr.onprogress = function () {};
+        xdr.send(request.getBody());
+    });
+}
+
+/**
+ * CORS Interceptor.
+ */
+
+var SUPPORTS_CORS = inBrowser && 'withCredentials' in new XMLHttpRequest();
+
+function cors (request) {
+
+    if (inBrowser) {
+
+        var orgUrl = Url.parse(location.href);
+        var reqUrl = Url.parse(request.getUrl());
+
+        if (reqUrl.protocol !== orgUrl.protocol || reqUrl.host !== orgUrl.host) {
+
+            request.crossOrigin = true;
+            request.emulateHTTP = false;
+
+            if (!SUPPORTS_CORS) {
+                request.client = xdrClient;
+            }
+        }
+    }
+
+}
+
+/**
+ * Form data Interceptor.
+ */
+
+function form (request) {
+
+    if (isFormData(request.body)) {
+        request.headers.delete('Content-Type');
+    } else if (isObject(request.body) && request.emulateJSON) {
+        request.body = Url.params(request.body);
+        request.headers.set('Content-Type', 'application/x-www-form-urlencoded');
+    }
+
+}
+
+/**
+ * JSON Interceptor.
+ */
+
+function json (request) {
+
+    var type = request.headers.get('Content-Type') || '';
+
+    if (isObject(request.body) && type.indexOf('application/json') === 0) {
+        request.body = JSON.stringify(request.body);
+    }
+
+    return function (response) {
+
+        return response.bodyText ? when(response.text(), function (text) {
+
+            var type = response.headers.get('Content-Type') || '';
+
+            if (type.indexOf('application/json') === 0 || isJson(text)) {
+
+                try {
+                    response.body = JSON.parse(text);
+                } catch (e) {
+                    response.body = null;
+                }
+
+            } else {
+                response.body = text;
+            }
+
+            return response;
+
+        }) : response;
+
+    };
+}
+
+function isJson(str) {
+
+    var start = str.match(/^\s*(\[|\{)/);
+    var end = {'[': /]\s*$/, '{': /}\s*$/};
+
+    return start && end[start[1]].test(str);
+}
+
+/**
+ * JSONP client (Browser).
+ */
+
+function jsonpClient (request) {
+    return new PromiseObj(function (resolve) {
+
+        var name = request.jsonp || 'callback', callback = request.jsonpCallback || '_jsonp' + Math.random().toString(36).substr(2), body = null, handler, script;
+
+        handler = function (ref) {
+            var type = ref.type;
+
+
+            var status = 0;
+
+            if (type === 'load' && body !== null) {
+                status = 200;
+            } else if (type === 'error') {
+                status = 500;
+            }
+
+            if (status && window[callback]) {
+                delete window[callback];
+                document.body.removeChild(script);
+            }
+
+            resolve(request.respondWith(body, {status: status}));
+        };
+
+        window[callback] = function (result) {
+            body = JSON.stringify(result);
+        };
+
+        request.abort = function () {
+            handler({type: 'abort'});
+        };
+
+        request.params[name] = callback;
+
+        if (request.timeout) {
+            setTimeout(request.abort, request.timeout);
+        }
+
+        script = document.createElement('script');
+        script.src = request.getUrl();
+        script.type = 'text/javascript';
+        script.async = true;
+        script.onload = handler;
+        script.onerror = handler;
+
+        document.body.appendChild(script);
+    });
+}
+
+/**
+ * JSONP Interceptor.
+ */
+
+function jsonp (request) {
+
+    if (request.method == 'JSONP') {
+        request.client = jsonpClient;
+    }
+
+}
+
+/**
+ * Before Interceptor.
+ */
+
+function before (request) {
+
+    if (isFunction(request.before)) {
+        request.before.call(this, request);
+    }
+
+}
+
+/**
+ * HTTP method override Interceptor.
+ */
+
+function method (request) {
+
+    if (request.emulateHTTP && /^(PUT|PATCH|DELETE)$/i.test(request.method)) {
+        request.headers.set('X-HTTP-Method-Override', request.method);
+        request.method = 'POST';
+    }
+
+}
+
+/**
+ * Header Interceptor.
+ */
+
+function header (request) {
+
+    var headers = assign({}, Http.headers.common,
+        !request.crossOrigin ? Http.headers.custom : {},
+        Http.headers[toLower(request.method)]
+    );
+
+    each(headers, function (value, name) {
+        if (!request.headers.has(name)) {
+            request.headers.set(name, value);
+        }
+    });
+
+}
+
+/**
+ * XMLHttp client (Browser).
+ */
+
+function xhrClient (request) {
+    return new PromiseObj(function (resolve) {
+
+        var xhr = new XMLHttpRequest(), handler = function (event) {
+
+                var response = request.respondWith(
+                'response' in xhr ? xhr.response : xhr.responseText, {
+                    status: xhr.status === 1223 ? 204 : xhr.status, // IE9 status bug
+                    statusText: xhr.status === 1223 ? 'No Content' : trim(xhr.statusText)
+                });
+
+                each(trim(xhr.getAllResponseHeaders()).split('\n'), function (row) {
+                    response.headers.append(row.slice(0, row.indexOf(':')), row.slice(row.indexOf(':') + 1));
+                });
+
+                resolve(response);
+            };
+
+        request.abort = function () { return xhr.abort(); };
+
+        xhr.open(request.method, request.getUrl(), true);
+
+        if (request.timeout) {
+            xhr.timeout = request.timeout;
+        }
+
+        if (request.responseType && 'responseType' in xhr) {
+            xhr.responseType = request.responseType;
+        }
+
+        if (request.withCredentials || request.credentials) {
+            xhr.withCredentials = true;
+        }
+
+        if (!request.crossOrigin) {
+            request.headers.set('X-Requested-With', 'XMLHttpRequest');
+        }
+
+        // deprecated use downloadProgress
+        if (isFunction(request.progress) && request.method === 'GET') {
+            xhr.addEventListener('progress', request.progress);
+        }
+
+        if (isFunction(request.downloadProgress)) {
+            xhr.addEventListener('progress', request.downloadProgress);
+        }
+
+        // deprecated use uploadProgress
+        if (isFunction(request.progress) && /^(POST|PUT)$/i.test(request.method)) {
+            xhr.upload.addEventListener('progress', request.progress);
+        }
+
+        if (isFunction(request.uploadProgress) && xhr.upload) {
+            xhr.upload.addEventListener('progress', request.uploadProgress);
+        }
+
+        request.headers.forEach(function (value, name) {
+            xhr.setRequestHeader(name, value);
+        });
+
+        xhr.onload = handler;
+        xhr.onabort = handler;
+        xhr.onerror = handler;
+        xhr.ontimeout = handler;
+        xhr.send(request.getBody());
+    });
+}
+
+/**
+ * Http client (Node).
+ */
+
+function nodeClient (request) {
+
+    var client = require('got');
+
+    return new PromiseObj(function (resolve) {
+
+        var url = request.getUrl();
+        var body = request.getBody();
+        var method = request.method;
+        var headers = {}, handler;
+
+        request.headers.forEach(function (value, name) {
+            headers[name] = value;
+        });
+
+        client(url, {body: body, method: method, headers: headers}).then(handler = function (resp) {
+
+            var response = request.respondWith(resp.body, {
+                status: resp.statusCode,
+                statusText: trim(resp.statusMessage)
+            });
+
+            each(resp.headers, function (value, name) {
+                response.headers.set(name, value);
+            });
+
+            resolve(response);
+
+        }, function (error$$1) { return handler(error$$1.response); });
+    });
+}
+
+/**
+ * Base client.
+ */
+
+function Client (context) {
+
+    var reqHandlers = [sendRequest], resHandlers = [];
+
+    if (!isObject(context)) {
+        context = null;
+    }
+
+    function Client(request) {
+        while (reqHandlers.length) {
+
+            var handler = reqHandlers.pop();
+
+            if (isFunction(handler)) {
+
+                var response = (void 0), next = (void 0);
+
+                response = handler.call(context, request, function (val) { return next = val; }) || next;
+
+                if (isObject(response)) {
+                    return new PromiseObj(function (resolve, reject) {
+
+                        resHandlers.forEach(function (handler) {
+                            response = when(response, function (response) {
+                                return handler.call(context, response) || response;
+                            }, reject);
+                        });
+
+                        when(response, resolve, reject);
+
+                    }, context);
+                }
+
+                if (isFunction(response)) {
+                    resHandlers.unshift(response);
+                }
+
+            } else {
+                warn(("Invalid interceptor of type " + (typeof handler) + ", must be a function"));
+            }
+        }
+    }
+
+    Client.use = function (handler) {
+        reqHandlers.push(handler);
+    };
+
+    return Client;
+}
+
+function sendRequest(request) {
+
+    var client = request.client || (inBrowser ? xhrClient : nodeClient);
+
+    return client(request);
+}
+
+/**
+ * HTTP Headers.
+ */
+
+var Headers = function Headers(headers) {
+    var this$1 = this;
+
+
+    this.map = {};
+
+    each(headers, function (value, name) { return this$1.append(name, value); });
+};
+
+Headers.prototype.has = function has (name) {
+    return getName(this.map, name) !== null;
+};
+
+Headers.prototype.get = function get (name) {
+
+    var list = this.map[getName(this.map, name)];
+
+    return list ? list.join() : null;
+};
+
+Headers.prototype.getAll = function getAll (name) {
+    return this.map[getName(this.map, name)] || [];
+};
+
+Headers.prototype.set = function set (name, value) {
+    this.map[normalizeName(getName(this.map, name) || name)] = [trim(value)];
+};
+
+Headers.prototype.append = function append (name, value) {
+
+    var list = this.map[getName(this.map, name)];
+
+    if (list) {
+        list.push(trim(value));
+    } else {
+        this.set(name, value);
+    }
+};
+
+Headers.prototype.delete = function delete$1 (name) {
+    delete this.map[getName(this.map, name)];
+};
+
+Headers.prototype.deleteAll = function deleteAll () {
+    this.map = {};
+};
+
+Headers.prototype.forEach = function forEach (callback, thisArg) {
+        var this$1 = this;
+
+    each(this.map, function (list, name) {
+        each(list, function (value) { return callback.call(thisArg, value, name, this$1); });
+    });
+};
+
+function getName(map, name) {
+    return Object.keys(map).reduce(function (prev, curr) {
+        return toLower(name) === toLower(curr) ? curr : prev;
+    }, null);
+}
+
+function normalizeName(name) {
+
+    if (/[^a-z0-9\-#$%&'*+.^_`|~]/i.test(name)) {
+        throw new TypeError('Invalid character in header field name');
+    }
+
+    return trim(name);
+}
+
+/**
+ * HTTP Response.
+ */
+
+var Response = function Response(body, ref) {
+    var url = ref.url;
+    var headers = ref.headers;
+    var status = ref.status;
+    var statusText = ref.statusText;
+
+
+    this.url = url;
+    this.ok = status >= 200 && status < 300;
+    this.status = status || 0;
+    this.statusText = statusText || '';
+    this.headers = new Headers(headers);
+    this.body = body;
+
+    if (isString(body)) {
+
+        this.bodyText = body;
+
+    } else if (isBlob(body)) {
+
+        this.bodyBlob = body;
+
+        if (isBlobText(body)) {
+            this.bodyText = blobText(body);
+        }
+    }
+};
+
+Response.prototype.blob = function blob () {
+    return when(this.bodyBlob);
+};
+
+Response.prototype.text = function text () {
+    return when(this.bodyText);
+};
+
+Response.prototype.json = function json () {
+    return when(this.text(), function (text) { return JSON.parse(text); });
+};
+
+Object.defineProperty(Response.prototype, 'data', {
+
+    get: function get() {
+        return this.body;
+    },
+
+    set: function set(body) {
+        this.body = body;
+    }
+
+});
+
+function blobText(body) {
+    return new PromiseObj(function (resolve) {
+
+        var reader = new FileReader();
+
+        reader.readAsText(body);
+        reader.onload = function () {
+            resolve(reader.result);
+        };
+
+    });
+}
+
+function isBlobText(body) {
+    return body.type.indexOf('text') === 0 || body.type.indexOf('json') !== -1;
+}
+
+/**
+ * HTTP Request.
+ */
+
+var Request = function Request(options$$1) {
+
+    this.body = null;
+    this.params = {};
+
+    assign(this, options$$1, {
+        method: toUpper(options$$1.method || 'GET')
+    });
+
+    if (!(this.headers instanceof Headers)) {
+        this.headers = new Headers(this.headers);
+    }
+};
+
+Request.prototype.getUrl = function getUrl () {
+    return Url(this);
+};
+
+Request.prototype.getBody = function getBody () {
+    return this.body;
+};
+
+Request.prototype.respondWith = function respondWith (body, options$$1) {
+    return new Response(body, assign(options$$1 || {}, {url: this.getUrl()}));
+};
+
+/**
+ * Service for sending network requests.
+ */
+
+var COMMON_HEADERS = {'Accept': 'application/json, text/plain, */*'};
+var JSON_CONTENT_TYPE = {'Content-Type': 'application/json;charset=utf-8'};
+
+function Http(options$$1) {
+
+    var self = this || {}, client = Client(self.$vm);
+
+    defaults(options$$1 || {}, self.$options, Http.options);
+
+    Http.interceptors.forEach(function (handler) {
+
+        if (isString(handler)) {
+            handler = Http.interceptor[handler];
+        }
+
+        if (isFunction(handler)) {
+            client.use(handler);
+        }
+
+    });
+
+    return client(new Request(options$$1)).then(function (response) {
+
+        return response.ok ? response : PromiseObj.reject(response);
+
+    }, function (response) {
+
+        if (response instanceof Error) {
+            error(response);
+        }
+
+        return PromiseObj.reject(response);
+    });
+}
+
+Http.options = {};
+
+Http.headers = {
+    put: JSON_CONTENT_TYPE,
+    post: JSON_CONTENT_TYPE,
+    patch: JSON_CONTENT_TYPE,
+    delete: JSON_CONTENT_TYPE,
+    common: COMMON_HEADERS,
+    custom: {}
+};
+
+Http.interceptor = {before: before, method: method, jsonp: jsonp, json: json, form: form, header: header, cors: cors};
+Http.interceptors = ['before', 'method', 'jsonp', 'json', 'form', 'header', 'cors'];
+
+['get', 'delete', 'head', 'jsonp'].forEach(function (method$$1) {
+
+    Http[method$$1] = function (url, options$$1) {
+        return this(assign(options$$1 || {}, {url: url, method: method$$1}));
+    };
+
+});
+
+['post', 'put', 'patch'].forEach(function (method$$1) {
+
+    Http[method$$1] = function (url, body, options$$1) {
+        return this(assign(options$$1 || {}, {url: url, method: method$$1, body: body}));
+    };
+
+});
+
+/**
+ * Service for interacting with RESTful services.
+ */
+
+function Resource(url, params, actions, options$$1) {
+
+    var self = this || {}, resource = {};
+
+    actions = assign({},
+        Resource.actions,
+        actions
+    );
+
+    each(actions, function (action, name) {
+
+        action = merge({url: url, params: assign({}, params)}, options$$1, action);
+
+        resource[name] = function () {
+            return (self.$http || Http)(opts(action, arguments));
+        };
+    });
+
+    return resource;
+}
+
+function opts(action, args) {
+
+    var options$$1 = assign({}, action), params = {}, body;
+
+    switch (args.length) {
+
+        case 2:
+
+            params = args[0];
+            body = args[1];
+
+            break;
+
+        case 1:
+
+            if (/^(POST|PUT|PATCH)$/i.test(options$$1.method)) {
+                body = args[0];
+            } else {
+                params = args[0];
+            }
+
+            break;
+
+        case 0:
+
+            break;
+
+        default:
+
+            throw 'Expected up to 2 arguments [params, body], got ' + args.length + ' arguments';
+    }
+
+    options$$1.body = body;
+    options$$1.params = assign({}, options$$1.params, params);
+
+    return options$$1;
+}
+
+Resource.actions = {
+
+    get: {method: 'GET'},
+    save: {method: 'POST'},
+    query: {method: 'GET'},
+    update: {method: 'PUT'},
+    remove: {method: 'DELETE'},
+    delete: {method: 'DELETE'}
+
+};
+
+/**
+ * Install plugin.
+ */
+
+function plugin(Vue) {
+
+    if (plugin.installed) {
+        return;
+    }
+
+    Util(Vue);
+
+    Vue.url = Url;
+    Vue.http = Http;
+    Vue.resource = Resource;
+    Vue.Promise = PromiseObj;
+
+    Object.defineProperties(Vue.prototype, {
+
+        $url: {
+            get: function get() {
+                return options(Vue.url, this, this.$options.url);
+            }
+        },
+
+        $http: {
+            get: function get() {
+                return options(Vue.http, this, this.$options.http);
+            }
+        },
+
+        $resource: {
+            get: function get() {
+                return Vue.resource.bind(this);
+            }
+        },
+
+        $promise: {
+            get: function get() {
+                var this$1 = this;
+
+                return function (executor) { return new Vue.Promise(executor, this$1); };
+            }
+        }
+
+    });
+}
+
+if (typeof window !== 'undefined' && window.Vue) {
+    window.Vue.use(plugin);
+}
+
+module.exports = plugin;
diff --git a/advancedcontentfilter/vendor/asset/vue-resource/dist/vue-resource.esm.js b/advancedcontentfilter/vendor/asset/vue-resource/dist/vue-resource.esm.js
new file mode 100644 (file)
index 0000000..08303bc
--- /dev/null
@@ -0,0 +1,1556 @@
+/*!
+ * vue-resource v1.5.0
+ * https://github.com/pagekit/vue-resource
+ * Released under the MIT License.
+ */
+
+/**
+ * Promises/A+ polyfill v1.1.4 (https://github.com/bramstein/promis)
+ */
+
+var RESOLVED = 0;
+var REJECTED = 1;
+var PENDING = 2;
+
+function Promise$1(executor) {
+
+    this.state = PENDING;
+    this.value = undefined;
+    this.deferred = [];
+
+    var promise = this;
+
+    try {
+        executor(function (x) {
+            promise.resolve(x);
+        }, function (r) {
+            promise.reject(r);
+        });
+    } catch (e) {
+        promise.reject(e);
+    }
+}
+
+Promise$1.reject = function (r) {
+    return new Promise$1(function (resolve, reject) {
+        reject(r);
+    });
+};
+
+Promise$1.resolve = function (x) {
+    return new Promise$1(function (resolve, reject) {
+        resolve(x);
+    });
+};
+
+Promise$1.all = function all(iterable) {
+    return new Promise$1(function (resolve, reject) {
+        var count = 0, result = [];
+
+        if (iterable.length === 0) {
+            resolve(result);
+        }
+
+        function resolver(i) {
+            return function (x) {
+                result[i] = x;
+                count += 1;
+
+                if (count === iterable.length) {
+                    resolve(result);
+                }
+            };
+        }
+
+        for (var i = 0; i < iterable.length; i += 1) {
+            Promise$1.resolve(iterable[i]).then(resolver(i), reject);
+        }
+    });
+};
+
+Promise$1.race = function race(iterable) {
+    return new Promise$1(function (resolve, reject) {
+        for (var i = 0; i < iterable.length; i += 1) {
+            Promise$1.resolve(iterable[i]).then(resolve, reject);
+        }
+    });
+};
+
+var p = Promise$1.prototype;
+
+p.resolve = function resolve(x) {
+    var promise = this;
+
+    if (promise.state === PENDING) {
+        if (x === promise) {
+            throw new TypeError('Promise settled with itself.');
+        }
+
+        var called = false;
+
+        try {
+            var then = x && x['then'];
+
+            if (x !== null && typeof x === 'object' && typeof then === 'function') {
+                then.call(x, function (x) {
+                    if (!called) {
+                        promise.resolve(x);
+                    }
+                    called = true;
+
+                }, function (r) {
+                    if (!called) {
+                        promise.reject(r);
+                    }
+                    called = true;
+                });
+                return;
+            }
+        } catch (e) {
+            if (!called) {
+                promise.reject(e);
+            }
+            return;
+        }
+
+        promise.state = RESOLVED;
+        promise.value = x;
+        promise.notify();
+    }
+};
+
+p.reject = function reject(reason) {
+    var promise = this;
+
+    if (promise.state === PENDING) {
+        if (reason === promise) {
+            throw new TypeError('Promise settled with itself.');
+        }
+
+        promise.state = REJECTED;
+        promise.value = reason;
+        promise.notify();
+    }
+};
+
+p.notify = function notify() {
+    var promise = this;
+
+    nextTick(function () {
+        if (promise.state !== PENDING) {
+            while (promise.deferred.length) {
+                var deferred = promise.deferred.shift(),
+                    onResolved = deferred[0],
+                    onRejected = deferred[1],
+                    resolve = deferred[2],
+                    reject = deferred[3];
+
+                try {
+                    if (promise.state === RESOLVED) {
+                        if (typeof onResolved === 'function') {
+                            resolve(onResolved.call(undefined, promise.value));
+                        } else {
+                            resolve(promise.value);
+                        }
+                    } else if (promise.state === REJECTED) {
+                        if (typeof onRejected === 'function') {
+                            resolve(onRejected.call(undefined, promise.value));
+                        } else {
+                            reject(promise.value);
+                        }
+                    }
+                } catch (e) {
+                    reject(e);
+                }
+            }
+        }
+    });
+};
+
+p.then = function then(onResolved, onRejected) {
+    var promise = this;
+
+    return new Promise$1(function (resolve, reject) {
+        promise.deferred.push([onResolved, onRejected, resolve, reject]);
+        promise.notify();
+    });
+};
+
+p.catch = function (onRejected) {
+    return this.then(undefined, onRejected);
+};
+
+/**
+ * Promise adapter.
+ */
+
+if (typeof Promise === 'undefined') {
+    window.Promise = Promise$1;
+}
+
+function PromiseObj(executor, context) {
+
+    if (executor instanceof Promise) {
+        this.promise = executor;
+    } else {
+        this.promise = new Promise(executor.bind(context));
+    }
+
+    this.context = context;
+}
+
+PromiseObj.all = function (iterable, context) {
+    return new PromiseObj(Promise.all(iterable), context);
+};
+
+PromiseObj.resolve = function (value, context) {
+    return new PromiseObj(Promise.resolve(value), context);
+};
+
+PromiseObj.reject = function (reason, context) {
+    return new PromiseObj(Promise.reject(reason), context);
+};
+
+PromiseObj.race = function (iterable, context) {
+    return new PromiseObj(Promise.race(iterable), context);
+};
+
+var p$1 = PromiseObj.prototype;
+
+p$1.bind = function (context) {
+    this.context = context;
+    return this;
+};
+
+p$1.then = function (fulfilled, rejected) {
+
+    if (fulfilled && fulfilled.bind && this.context) {
+        fulfilled = fulfilled.bind(this.context);
+    }
+
+    if (rejected && rejected.bind && this.context) {
+        rejected = rejected.bind(this.context);
+    }
+
+    return new PromiseObj(this.promise.then(fulfilled, rejected), this.context);
+};
+
+p$1.catch = function (rejected) {
+
+    if (rejected && rejected.bind && this.context) {
+        rejected = rejected.bind(this.context);
+    }
+
+    return new PromiseObj(this.promise.catch(rejected), this.context);
+};
+
+p$1.finally = function (callback) {
+
+    return this.then(function (value) {
+        callback.call(this);
+        return value;
+    }, function (reason) {
+        callback.call(this);
+        return Promise.reject(reason);
+    }
+    );
+};
+
+/**
+ * Utility functions.
+ */
+
+var ref = {};
+var hasOwnProperty = ref.hasOwnProperty;
+var ref$1 = [];
+var slice = ref$1.slice;
+var debug = false, ntick;
+
+var inBrowser = typeof window !== 'undefined';
+
+function Util (ref) {
+    var config = ref.config;
+    var nextTick = ref.nextTick;
+
+    ntick = nextTick;
+    debug = config.debug || !config.silent;
+}
+
+function warn(msg) {
+    if (typeof console !== 'undefined' && debug) {
+        console.warn('[VueResource warn]: ' + msg);
+    }
+}
+
+function error(msg) {
+    if (typeof console !== 'undefined') {
+        console.error(msg);
+    }
+}
+
+function nextTick(cb, ctx) {
+    return ntick(cb, ctx);
+}
+
+function trim(str) {
+    return str ? str.replace(/^\s*|\s*$/g, '') : '';
+}
+
+function trimEnd(str, chars) {
+
+    if (str && chars === undefined) {
+        return str.replace(/\s+$/, '');
+    }
+
+    if (!str || !chars) {
+        return str;
+    }
+
+    return str.replace(new RegExp(("[" + chars + "]+$")), '');
+}
+
+function toLower(str) {
+    return str ? str.toLowerCase() : '';
+}
+
+function toUpper(str) {
+    return str ? str.toUpperCase() : '';
+}
+
+var isArray = Array.isArray;
+
+function isString(val) {
+    return typeof val === 'string';
+}
+
+function isFunction(val) {
+    return typeof val === 'function';
+}
+
+function isObject(obj) {
+    return obj !== null && typeof obj === 'object';
+}
+
+function isPlainObject(obj) {
+    return isObject(obj) && Object.getPrototypeOf(obj) == Object.prototype;
+}
+
+function isBlob(obj) {
+    return typeof Blob !== 'undefined' && obj instanceof Blob;
+}
+
+function isFormData(obj) {
+    return typeof FormData !== 'undefined' && obj instanceof FormData;
+}
+
+function when(value, fulfilled, rejected) {
+
+    var promise = PromiseObj.resolve(value);
+
+    if (arguments.length < 2) {
+        return promise;
+    }
+
+    return promise.then(fulfilled, rejected);
+}
+
+function options(fn, obj, opts) {
+
+    opts = opts || {};
+
+    if (isFunction(opts)) {
+        opts = opts.call(obj);
+    }
+
+    return merge(fn.bind({$vm: obj, $options: opts}), fn, {$options: opts});
+}
+
+function each(obj, iterator) {
+
+    var i, key;
+
+    if (isArray(obj)) {
+        for (i = 0; i < obj.length; i++) {
+            iterator.call(obj[i], obj[i], i);
+        }
+    } else if (isObject(obj)) {
+        for (key in obj) {
+            if (hasOwnProperty.call(obj, key)) {
+                iterator.call(obj[key], obj[key], key);
+            }
+        }
+    }
+
+    return obj;
+}
+
+var assign = Object.assign || _assign;
+
+function merge(target) {
+
+    var args = slice.call(arguments, 1);
+
+    args.forEach(function (source) {
+        _merge(target, source, true);
+    });
+
+    return target;
+}
+
+function defaults(target) {
+
+    var args = slice.call(arguments, 1);
+
+    args.forEach(function (source) {
+
+        for (var key in source) {
+            if (target[key] === undefined) {
+                target[key] = source[key];
+            }
+        }
+
+    });
+
+    return target;
+}
+
+function _assign(target) {
+
+    var args = slice.call(arguments, 1);
+
+    args.forEach(function (source) {
+        _merge(target, source);
+    });
+
+    return target;
+}
+
+function _merge(target, source, deep) {
+    for (var key in source) {
+        if (deep && (isPlainObject(source[key]) || isArray(source[key]))) {
+            if (isPlainObject(source[key]) && !isPlainObject(target[key])) {
+                target[key] = {};
+            }
+            if (isArray(source[key]) && !isArray(target[key])) {
+                target[key] = [];
+            }
+            _merge(target[key], source[key], deep);
+        } else if (source[key] !== undefined) {
+            target[key] = source[key];
+        }
+    }
+}
+
+/**
+ * Root Prefix Transform.
+ */
+
+function root (options$$1, next) {
+
+    var url = next(options$$1);
+
+    if (isString(options$$1.root) && !/^(https?:)?\//.test(url)) {
+        url = trimEnd(options$$1.root, '/') + '/' + url;
+    }
+
+    return url;
+}
+
+/**
+ * Query Parameter Transform.
+ */
+
+function query (options$$1, next) {
+
+    var urlParams = Object.keys(Url.options.params), query = {}, url = next(options$$1);
+
+    each(options$$1.params, function (value, key) {
+        if (urlParams.indexOf(key) === -1) {
+            query[key] = value;
+        }
+    });
+
+    query = Url.params(query);
+
+    if (query) {
+        url += (url.indexOf('?') == -1 ? '?' : '&') + query;
+    }
+
+    return url;
+}
+
+/**
+ * URL Template v2.0.6 (https://github.com/bramstein/url-template)
+ */
+
+function expand(url, params, variables) {
+
+    var tmpl = parse(url), expanded = tmpl.expand(params);
+
+    if (variables) {
+        variables.push.apply(variables, tmpl.vars);
+    }
+
+    return expanded;
+}
+
+function parse(template) {
+
+    var operators = ['+', '#', '.', '/', ';', '?', '&'], variables = [];
+
+    return {
+        vars: variables,
+        expand: function expand(context) {
+            return template.replace(/\{([^{}]+)\}|([^{}]+)/g, function (_, expression, literal) {
+                if (expression) {
+
+                    var operator = null, values = [];
+
+                    if (operators.indexOf(expression.charAt(0)) !== -1) {
+                        operator = expression.charAt(0);
+                        expression = expression.substr(1);
+                    }
+
+                    expression.split(/,/g).forEach(function (variable) {
+                        var tmp = /([^:*]*)(?::(\d+)|(\*))?/.exec(variable);
+                        values.push.apply(values, getValues(context, operator, tmp[1], tmp[2] || tmp[3]));
+                        variables.push(tmp[1]);
+                    });
+
+                    if (operator && operator !== '+') {
+
+                        var separator = ',';
+
+                        if (operator === '?') {
+                            separator = '&';
+                        } else if (operator !== '#') {
+                            separator = operator;
+                        }
+
+                        return (values.length !== 0 ? operator : '') + values.join(separator);
+                    } else {
+                        return values.join(',');
+                    }
+
+                } else {
+                    return encodeReserved(literal);
+                }
+            });
+        }
+    };
+}
+
+function getValues(context, operator, key, modifier) {
+
+    var value = context[key], result = [];
+
+    if (isDefined(value) && value !== '') {
+        if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {
+            value = value.toString();
+
+            if (modifier && modifier !== '*') {
+                value = value.substring(0, parseInt(modifier, 10));
+            }
+
+            result.push(encodeValue(operator, value, isKeyOperator(operator) ? key : null));
+        } else {
+            if (modifier === '*') {
+                if (Array.isArray(value)) {
+                    value.filter(isDefined).forEach(function (value) {
+                        result.push(encodeValue(operator, value, isKeyOperator(operator) ? key : null));
+                    });
+                } else {
+                    Object.keys(value).forEach(function (k) {
+                        if (isDefined(value[k])) {
+                            result.push(encodeValue(operator, value[k], k));
+                        }
+                    });
+                }
+            } else {
+                var tmp = [];
+
+                if (Array.isArray(value)) {
+                    value.filter(isDefined).forEach(function (value) {
+                        tmp.push(encodeValue(operator, value));
+                    });
+                } else {
+                    Object.keys(value).forEach(function (k) {
+                        if (isDefined(value[k])) {
+                            tmp.push(encodeURIComponent(k));
+                            tmp.push(encodeValue(operator, value[k].toString()));
+                        }
+                    });
+                }
+
+                if (isKeyOperator(operator)) {
+                    result.push(encodeURIComponent(key) + '=' + tmp.join(','));
+                } else if (tmp.length !== 0) {
+                    result.push(tmp.join(','));
+                }
+            }
+        }
+    } else {
+        if (operator === ';') {
+            result.push(encodeURIComponent(key));
+        } else if (value === '' && (operator === '&' || operator === '?')) {
+            result.push(encodeURIComponent(key) + '=');
+        } else if (value === '') {
+            result.push('');
+        }
+    }
+
+    return result;
+}
+
+function isDefined(value) {
+    return value !== undefined && value !== null;
+}
+
+function isKeyOperator(operator) {
+    return operator === ';' || operator === '&' || operator === '?';
+}
+
+function encodeValue(operator, value, key) {
+
+    value = (operator === '+' || operator === '#') ? encodeReserved(value) : encodeURIComponent(value);
+
+    if (key) {
+        return encodeURIComponent(key) + '=' + value;
+    } else {
+        return value;
+    }
+}
+
+function encodeReserved(str) {
+    return str.split(/(%[0-9A-Fa-f]{2})/g).map(function (part) {
+        if (!/%[0-9A-Fa-f]/.test(part)) {
+            part = encodeURI(part);
+        }
+        return part;
+    }).join('');
+}
+
+/**
+ * URL Template (RFC 6570) Transform.
+ */
+
+function template (options) {
+
+    var variables = [], url = expand(options.url, options.params, variables);
+
+    variables.forEach(function (key) {
+        delete options.params[key];
+    });
+
+    return url;
+}
+
+/**
+ * Service for URL templating.
+ */
+
+function Url(url, params) {
+
+    var self = this || {}, options$$1 = url, transform;
+
+    if (isString(url)) {
+        options$$1 = {url: url, params: params};
+    }
+
+    options$$1 = merge({}, Url.options, self.$options, options$$1);
+
+    Url.transforms.forEach(function (handler) {
+
+        if (isString(handler)) {
+            handler = Url.transform[handler];
+        }
+
+        if (isFunction(handler)) {
+            transform = factory(handler, transform, self.$vm);
+        }
+
+    });
+
+    return transform(options$$1);
+}
+
+/**
+ * Url options.
+ */
+
+Url.options = {
+    url: '',
+    root: null,
+    params: {}
+};
+
+/**
+ * Url transforms.
+ */
+
+Url.transform = {template: template, query: query, root: root};
+Url.transforms = ['template', 'query', 'root'];
+
+/**
+ * Encodes a Url parameter string.
+ *
+ * @param {Object} obj
+ */
+
+Url.params = function (obj) {
+
+    var params = [], escape = encodeURIComponent;
+
+    params.add = function (key, value) {
+
+        if (isFunction(value)) {
+            value = value();
+        }
+
+        if (value === null) {
+            value = '';
+        }
+
+        this.push(escape(key) + '=' + escape(value));
+    };
+
+    serialize(params, obj);
+
+    return params.join('&').replace(/%20/g, '+');
+};
+
+/**
+ * Parse a URL and return its components.
+ *
+ * @param {String} url
+ */
+
+Url.parse = function (url) {
+
+    var el = document.createElement('a');
+
+    if (document.documentMode) {
+        el.href = url;
+        url = el.href;
+    }
+
+    el.href = url;
+
+    return {
+        href: el.href,
+        protocol: el.protocol ? el.protocol.replace(/:$/, '') : '',
+        port: el.port,
+        host: el.host,
+        hostname: el.hostname,
+        pathname: el.pathname.charAt(0) === '/' ? el.pathname : '/' + el.pathname,
+        search: el.search ? el.search.replace(/^\?/, '') : '',
+        hash: el.hash ? el.hash.replace(/^#/, '') : ''
+    };
+};
+
+function factory(handler, next, vm) {
+    return function (options$$1) {
+        return handler.call(vm, options$$1, next);
+    };
+}
+
+function serialize(params, obj, scope) {
+
+    var array = isArray(obj), plain = isPlainObject(obj), hash;
+
+    each(obj, function (value, key) {
+
+        hash = isObject(value) || isArray(value);
+
+        if (scope) {
+            key = scope + '[' + (plain || hash ? key : '') + ']';
+        }
+
+        if (!scope && array) {
+            params.add(value.name, value.value);
+        } else if (hash) {
+            serialize(params, value, key);
+        } else {
+            params.add(key, value);
+        }
+    });
+}
+
+/**
+ * XDomain client (Internet Explorer).
+ */
+
+function xdrClient (request) {
+    return new PromiseObj(function (resolve) {
+
+        var xdr = new XDomainRequest(), handler = function (ref) {
+                var type = ref.type;
+
+
+                var status = 0;
+
+                if (type === 'load') {
+                    status = 200;
+                } else if (type === 'error') {
+                    status = 500;
+                }
+
+                resolve(request.respondWith(xdr.responseText, {status: status}));
+            };
+
+        request.abort = function () { return xdr.abort(); };
+
+        xdr.open(request.method, request.getUrl());
+
+        if (request.timeout) {
+            xdr.timeout = request.timeout;
+        }
+
+        xdr.onload = handler;
+        xdr.onabort = handler;
+        xdr.onerror = handler;
+        xdr.ontimeout = handler;
+        xdr.onprogress = function () {};
+        xdr.send(request.getBody());
+    });
+}
+
+/**
+ * CORS Interceptor.
+ */
+
+var SUPPORTS_CORS = inBrowser && 'withCredentials' in new XMLHttpRequest();
+
+function cors (request) {
+
+    if (inBrowser) {
+
+        var orgUrl = Url.parse(location.href);
+        var reqUrl = Url.parse(request.getUrl());
+
+        if (reqUrl.protocol !== orgUrl.protocol || reqUrl.host !== orgUrl.host) {
+
+            request.crossOrigin = true;
+            request.emulateHTTP = false;
+
+            if (!SUPPORTS_CORS) {
+                request.client = xdrClient;
+            }
+        }
+    }
+
+}
+
+/**
+ * Form data Interceptor.
+ */
+
+function form (request) {
+
+    if (isFormData(request.body)) {
+        request.headers.delete('Content-Type');
+    } else if (isObject(request.body) && request.emulateJSON) {
+        request.body = Url.params(request.body);
+        request.headers.set('Content-Type', 'application/x-www-form-urlencoded');
+    }
+
+}
+
+/**
+ * JSON Interceptor.
+ */
+
+function json (request) {
+
+    var type = request.headers.get('Content-Type') || '';
+
+    if (isObject(request.body) && type.indexOf('application/json') === 0) {
+        request.body = JSON.stringify(request.body);
+    }
+
+    return function (response) {
+
+        return response.bodyText ? when(response.text(), function (text) {
+
+            var type = response.headers.get('Content-Type') || '';
+
+            if (type.indexOf('application/json') === 0 || isJson(text)) {
+
+                try {
+                    response.body = JSON.parse(text);
+                } catch (e) {
+                    response.body = null;
+                }
+
+            } else {
+                response.body = text;
+            }
+
+            return response;
+
+        }) : response;
+
+    };
+}
+
+function isJson(str) {
+
+    var start = str.match(/^\s*(\[|\{)/);
+    var end = {'[': /]\s*$/, '{': /}\s*$/};
+
+    return start && end[start[1]].test(str);
+}
+
+/**
+ * JSONP client (Browser).
+ */
+
+function jsonpClient (request) {
+    return new PromiseObj(function (resolve) {
+
+        var name = request.jsonp || 'callback', callback = request.jsonpCallback || '_jsonp' + Math.random().toString(36).substr(2), body = null, handler, script;
+
+        handler = function (ref) {
+            var type = ref.type;
+
+
+            var status = 0;
+
+            if (type === 'load' && body !== null) {
+                status = 200;
+            } else if (type === 'error') {
+                status = 500;
+            }
+
+            if (status && window[callback]) {
+                delete window[callback];
+                document.body.removeChild(script);
+            }
+
+            resolve(request.respondWith(body, {status: status}));
+        };
+
+        window[callback] = function (result) {
+            body = JSON.stringify(result);
+        };
+
+        request.abort = function () {
+            handler({type: 'abort'});
+        };
+
+        request.params[name] = callback;
+
+        if (request.timeout) {
+            setTimeout(request.abort, request.timeout);
+        }
+
+        script = document.createElement('script');
+        script.src = request.getUrl();
+        script.type = 'text/javascript';
+        script.async = true;
+        script.onload = handler;
+        script.onerror = handler;
+
+        document.body.appendChild(script);
+    });
+}
+
+/**
+ * JSONP Interceptor.
+ */
+
+function jsonp (request) {
+
+    if (request.method == 'JSONP') {
+        request.client = jsonpClient;
+    }
+
+}
+
+/**
+ * Before Interceptor.
+ */
+
+function before (request) {
+
+    if (isFunction(request.before)) {
+        request.before.call(this, request);
+    }
+
+}
+
+/**
+ * HTTP method override Interceptor.
+ */
+
+function method (request) {
+
+    if (request.emulateHTTP && /^(PUT|PATCH|DELETE)$/i.test(request.method)) {
+        request.headers.set('X-HTTP-Method-Override', request.method);
+        request.method = 'POST';
+    }
+
+}
+
+/**
+ * Header Interceptor.
+ */
+
+function header (request) {
+
+    var headers = assign({}, Http.headers.common,
+        !request.crossOrigin ? Http.headers.custom : {},
+        Http.headers[toLower(request.method)]
+    );
+
+    each(headers, function (value, name) {
+        if (!request.headers.has(name)) {
+            request.headers.set(name, value);
+        }
+    });
+
+}
+
+/**
+ * XMLHttp client (Browser).
+ */
+
+function xhrClient (request) {
+    return new PromiseObj(function (resolve) {
+
+        var xhr = new XMLHttpRequest(), handler = function (event) {
+
+                var response = request.respondWith(
+                'response' in xhr ? xhr.response : xhr.responseText, {
+                    status: xhr.status === 1223 ? 204 : xhr.status, // IE9 status bug
+                    statusText: xhr.status === 1223 ? 'No Content' : trim(xhr.statusText)
+                });
+
+                each(trim(xhr.getAllResponseHeaders()).split('\n'), function (row) {
+                    response.headers.append(row.slice(0, row.indexOf(':')), row.slice(row.indexOf(':') + 1));
+                });
+
+                resolve(response);
+            };
+
+        request.abort = function () { return xhr.abort(); };
+
+        xhr.open(request.method, request.getUrl(), true);
+
+        if (request.timeout) {
+            xhr.timeout = request.timeout;
+        }
+
+        if (request.responseType && 'responseType' in xhr) {
+            xhr.responseType = request.responseType;
+        }
+
+        if (request.withCredentials || request.credentials) {
+            xhr.withCredentials = true;
+        }
+
+        if (!request.crossOrigin) {
+            request.headers.set('X-Requested-With', 'XMLHttpRequest');
+        }
+
+        // deprecated use downloadProgress
+        if (isFunction(request.progress) && request.method === 'GET') {
+            xhr.addEventListener('progress', request.progress);
+        }
+
+        if (isFunction(request.downloadProgress)) {
+            xhr.addEventListener('progress', request.downloadProgress);
+        }
+
+        // deprecated use uploadProgress
+        if (isFunction(request.progress) && /^(POST|PUT)$/i.test(request.method)) {
+            xhr.upload.addEventListener('progress', request.progress);
+        }
+
+        if (isFunction(request.uploadProgress) && xhr.upload) {
+            xhr.upload.addEventListener('progress', request.uploadProgress);
+        }
+
+        request.headers.forEach(function (value, name) {
+            xhr.setRequestHeader(name, value);
+        });
+
+        xhr.onload = handler;
+        xhr.onabort = handler;
+        xhr.onerror = handler;
+        xhr.ontimeout = handler;
+        xhr.send(request.getBody());
+    });
+}
+
+/**
+ * Http client (Node).
+ */
+
+function nodeClient (request) {
+
+    var client = require('got');
+
+    return new PromiseObj(function (resolve) {
+
+        var url = request.getUrl();
+        var body = request.getBody();
+        var method = request.method;
+        var headers = {}, handler;
+
+        request.headers.forEach(function (value, name) {
+            headers[name] = value;
+        });
+
+        client(url, {body: body, method: method, headers: headers}).then(handler = function (resp) {
+
+            var response = request.respondWith(resp.body, {
+                status: resp.statusCode,
+                statusText: trim(resp.statusMessage)
+            });
+
+            each(resp.headers, function (value, name) {
+                response.headers.set(name, value);
+            });
+
+            resolve(response);
+
+        }, function (error$$1) { return handler(error$$1.response); });
+    });
+}
+
+/**
+ * Base client.
+ */
+
+function Client (context) {
+
+    var reqHandlers = [sendRequest], resHandlers = [];
+
+    if (!isObject(context)) {
+        context = null;
+    }
+
+    function Client(request) {
+        while (reqHandlers.length) {
+
+            var handler = reqHandlers.pop();
+
+            if (isFunction(handler)) {
+
+                var response = (void 0), next = (void 0);
+
+                response = handler.call(context, request, function (val) { return next = val; }) || next;
+
+                if (isObject(response)) {
+                    return new PromiseObj(function (resolve, reject) {
+
+                        resHandlers.forEach(function (handler) {
+                            response = when(response, function (response) {
+                                return handler.call(context, response) || response;
+                            }, reject);
+                        });
+
+                        when(response, resolve, reject);
+
+                    }, context);
+                }
+
+                if (isFunction(response)) {
+                    resHandlers.unshift(response);
+                }
+
+            } else {
+                warn(("Invalid interceptor of type " + (typeof handler) + ", must be a function"));
+            }
+        }
+    }
+
+    Client.use = function (handler) {
+        reqHandlers.push(handler);
+    };
+
+    return Client;
+}
+
+function sendRequest(request) {
+
+    var client = request.client || (inBrowser ? xhrClient : nodeClient);
+
+    return client(request);
+}
+
+/**
+ * HTTP Headers.
+ */
+
+var Headers = function Headers(headers) {
+    var this$1 = this;
+
+
+    this.map = {};
+
+    each(headers, function (value, name) { return this$1.append(name, value); });
+};
+
+Headers.prototype.has = function has (name) {
+    return getName(this.map, name) !== null;
+};
+
+Headers.prototype.get = function get (name) {
+
+    var list = this.map[getName(this.map, name)];
+
+    return list ? list.join() : null;
+};
+
+Headers.prototype.getAll = function getAll (name) {
+    return this.map[getName(this.map, name)] || [];
+};
+
+Headers.prototype.set = function set (name, value) {
+    this.map[normalizeName(getName(this.map, name) || name)] = [trim(value)];
+};
+
+Headers.prototype.append = function append (name, value) {
+
+    var list = this.map[getName(this.map, name)];
+
+    if (list) {
+        list.push(trim(value));
+    } else {
+        this.set(name, value);
+    }
+};
+
+Headers.prototype.delete = function delete$1 (name) {
+    delete this.map[getName(this.map, name)];
+};
+
+Headers.prototype.deleteAll = function deleteAll () {
+    this.map = {};
+};
+
+Headers.prototype.forEach = function forEach (callback, thisArg) {
+        var this$1 = this;
+
+    each(this.map, function (list, name) {
+        each(list, function (value) { return callback.call(thisArg, value, name, this$1); });
+    });
+};
+
+function getName(map, name) {
+    return Object.keys(map).reduce(function (prev, curr) {
+        return toLower(name) === toLower(curr) ? curr : prev;
+    }, null);
+}
+
+function normalizeName(name) {
+
+    if (/[^a-z0-9\-#$%&'*+.^_`|~]/i.test(name)) {
+        throw new TypeError('Invalid character in header field name');
+    }
+
+    return trim(name);
+}
+
+/**
+ * HTTP Response.
+ */
+
+var Response = function Response(body, ref) {
+    var url = ref.url;
+    var headers = ref.headers;
+    var status = ref.status;
+    var statusText = ref.statusText;
+
+
+    this.url = url;
+    this.ok = status >= 200 && status < 300;
+    this.status = status || 0;
+    this.statusText = statusText || '';
+    this.headers = new Headers(headers);
+    this.body = body;
+
+    if (isString(body)) {
+
+        this.bodyText = body;
+
+    } else if (isBlob(body)) {
+
+        this.bodyBlob = body;
+
+        if (isBlobText(body)) {
+            this.bodyText = blobText(body);
+        }
+    }
+};
+
+Response.prototype.blob = function blob () {
+    return when(this.bodyBlob);
+};
+
+Response.prototype.text = function text () {
+    return when(this.bodyText);
+};
+
+Response.prototype.json = function json () {
+    return when(this.text(), function (text) { return JSON.parse(text); });
+};
+
+Object.defineProperty(Response.prototype, 'data', {
+
+    get: function get() {
+        return this.body;
+    },
+
+    set: function set(body) {
+        this.body = body;
+    }
+
+});
+
+function blobText(body) {
+    return new PromiseObj(function (resolve) {
+
+        var reader = new FileReader();
+
+        reader.readAsText(body);
+        reader.onload = function () {
+            resolve(reader.result);
+        };
+
+    });
+}
+
+function isBlobText(body) {
+    return body.type.indexOf('text') === 0 || body.type.indexOf('json') !== -1;
+}
+
+/**
+ * HTTP Request.
+ */
+
+var Request = function Request(options$$1) {
+
+    this.body = null;
+    this.params = {};
+
+    assign(this, options$$1, {
+        method: toUpper(options$$1.method || 'GET')
+    });
+
+    if (!(this.headers instanceof Headers)) {
+        this.headers = new Headers(this.headers);
+    }
+};
+
+Request.prototype.getUrl = function getUrl () {
+    return Url(this);
+};
+
+Request.prototype.getBody = function getBody () {
+    return this.body;
+};
+
+Request.prototype.respondWith = function respondWith (body, options$$1) {
+    return new Response(body, assign(options$$1 || {}, {url: this.getUrl()}));
+};
+
+/**
+ * Service for sending network requests.
+ */
+
+var COMMON_HEADERS = {'Accept': 'application/json, text/plain, */*'};
+var JSON_CONTENT_TYPE = {'Content-Type': 'application/json;charset=utf-8'};
+
+function Http(options$$1) {
+
+    var self = this || {}, client = Client(self.$vm);
+
+    defaults(options$$1 || {}, self.$options, Http.options);
+
+    Http.interceptors.forEach(function (handler) {
+
+        if (isString(handler)) {
+            handler = Http.interceptor[handler];
+        }
+
+        if (isFunction(handler)) {
+            client.use(handler);
+        }
+
+    });
+
+    return client(new Request(options$$1)).then(function (response) {
+
+        return response.ok ? response : PromiseObj.reject(response);
+
+    }, function (response) {
+
+        if (response instanceof Error) {
+            error(response);
+        }
+
+        return PromiseObj.reject(response);
+    });
+}
+
+Http.options = {};
+
+Http.headers = {
+    put: JSON_CONTENT_TYPE,
+    post: JSON_CONTENT_TYPE,
+    patch: JSON_CONTENT_TYPE,
+    delete: JSON_CONTENT_TYPE,
+    common: COMMON_HEADERS,
+    custom: {}
+};
+
+Http.interceptor = {before: before, method: method, jsonp: jsonp, json: json, form: form, header: header, cors: cors};
+Http.interceptors = ['before', 'method', 'jsonp', 'json', 'form', 'header', 'cors'];
+
+['get', 'delete', 'head', 'jsonp'].forEach(function (method$$1) {
+
+    Http[method$$1] = function (url, options$$1) {
+        return this(assign(options$$1 || {}, {url: url, method: method$$1}));
+    };
+
+});
+
+['post', 'put', 'patch'].forEach(function (method$$1) {
+
+    Http[method$$1] = function (url, body, options$$1) {
+        return this(assign(options$$1 || {}, {url: url, method: method$$1, body: body}));
+    };
+
+});
+
+/**
+ * Service for interacting with RESTful services.
+ */
+
+function Resource(url, params, actions, options$$1) {
+
+    var self = this || {}, resource = {};
+
+    actions = assign({},
+        Resource.actions,
+        actions
+    );
+
+    each(actions, function (action, name) {
+
+        action = merge({url: url, params: assign({}, params)}, options$$1, action);
+
+        resource[name] = function () {
+            return (self.$http || Http)(opts(action, arguments));
+        };
+    });
+
+    return resource;
+}
+
+function opts(action, args) {
+
+    var options$$1 = assign({}, action), params = {}, body;
+
+    switch (args.length) {
+
+        case 2:
+
+            params = args[0];
+            body = args[1];
+
+            break;
+
+        case 1:
+
+            if (/^(POST|PUT|PATCH)$/i.test(options$$1.method)) {
+                body = args[0];
+            } else {
+                params = args[0];
+            }
+
+            break;
+
+        case 0:
+
+            break;
+
+        default:
+
+            throw 'Expected up to 2 arguments [params, body], got ' + args.length + ' arguments';
+    }
+
+    options$$1.body = body;
+    options$$1.params = assign({}, options$$1.params, params);
+
+    return options$$1;
+}
+
+Resource.actions = {
+
+    get: {method: 'GET'},
+    save: {method: 'POST'},
+    query: {method: 'GET'},
+    update: {method: 'PUT'},
+    remove: {method: 'DELETE'},
+    delete: {method: 'DELETE'}
+
+};
+
+/**
+ * Install plugin.
+ */
+
+function plugin(Vue) {
+
+    if (plugin.installed) {
+        return;
+    }
+
+    Util(Vue);
+
+    Vue.url = Url;
+    Vue.http = Http;
+    Vue.resource = Resource;
+    Vue.Promise = PromiseObj;
+
+    Object.defineProperties(Vue.prototype, {
+
+        $url: {
+            get: function get() {
+                return options(Vue.url, this, this.$options.url);
+            }
+        },
+
+        $http: {
+            get: function get() {
+                return options(Vue.http, this, this.$options.http);
+            }
+        },
+
+        $resource: {
+            get: function get() {
+                return Vue.resource.bind(this);
+            }
+        },
+
+        $promise: {
+            get: function get() {
+                var this$1 = this;
+
+                return function (executor) { return new Vue.Promise(executor, this$1); };
+            }
+        }
+
+    });
+}
+
+if (typeof window !== 'undefined' && window.Vue) {
+    window.Vue.use(plugin);
+}
+
+export default plugin;
+export { Url, Http, Resource };
diff --git a/advancedcontentfilter/vendor/asset/vue-resource/dist/vue-resource.js b/advancedcontentfilter/vendor/asset/vue-resource/dist/vue-resource.js
new file mode 100644 (file)
index 0000000..e9dd639
--- /dev/null
@@ -0,0 +1,1563 @@
+/*!
+ * vue-resource v1.5.0
+ * https://github.com/pagekit/vue-resource
+ * Released under the MIT License.
+ */
+
+(function (global, factory) {
+       typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+       typeof define === 'function' && define.amd ? define(factory) :
+       (global.VueResource = factory());
+}(this, (function () { 'use strict';
+
+/**
+ * Promises/A+ polyfill v1.1.4 (https://github.com/bramstein/promis)
+ */
+
+var RESOLVED = 0;
+var REJECTED = 1;
+var PENDING = 2;
+
+function Promise$1(executor) {
+
+    this.state = PENDING;
+    this.value = undefined;
+    this.deferred = [];
+
+    var promise = this;
+
+    try {
+        executor(function (x) {
+            promise.resolve(x);
+        }, function (r) {
+            promise.reject(r);
+        });
+    } catch (e) {
+        promise.reject(e);
+    }
+}
+
+Promise$1.reject = function (r) {
+    return new Promise$1(function (resolve, reject) {
+        reject(r);
+    });
+};
+
+Promise$1.resolve = function (x) {
+    return new Promise$1(function (resolve, reject) {
+        resolve(x);
+    });
+};
+
+Promise$1.all = function all(iterable) {
+    return new Promise$1(function (resolve, reject) {
+        var count = 0, result = [];
+
+        if (iterable.length === 0) {
+            resolve(result);
+        }
+
+        function resolver(i) {
+            return function (x) {
+                result[i] = x;
+                count += 1;
+
+                if (count === iterable.length) {
+                    resolve(result);
+                }
+            };
+        }
+
+        for (var i = 0; i < iterable.length; i += 1) {
+            Promise$1.resolve(iterable[i]).then(resolver(i), reject);
+        }
+    });
+};
+
+Promise$1.race = function race(iterable) {
+    return new Promise$1(function (resolve, reject) {
+        for (var i = 0; i < iterable.length; i += 1) {
+            Promise$1.resolve(iterable[i]).then(resolve, reject);
+        }
+    });
+};
+
+var p = Promise$1.prototype;
+
+p.resolve = function resolve(x) {
+    var promise = this;
+
+    if (promise.state === PENDING) {
+        if (x === promise) {
+            throw new TypeError('Promise settled with itself.');
+        }
+
+        var called = false;
+
+        try {
+            var then = x && x['then'];
+
+            if (x !== null && typeof x === 'object' && typeof then === 'function') {
+                then.call(x, function (x) {
+                    if (!called) {
+                        promise.resolve(x);
+                    }
+                    called = true;
+
+                }, function (r) {
+                    if (!called) {
+                        promise.reject(r);
+                    }
+                    called = true;
+                });
+                return;
+            }
+        } catch (e) {
+            if (!called) {
+                promise.reject(e);
+            }
+            return;
+        }
+
+        promise.state = RESOLVED;
+        promise.value = x;
+        promise.notify();
+    }
+};
+
+p.reject = function reject(reason) {
+    var promise = this;
+
+    if (promise.state === PENDING) {
+        if (reason === promise) {
+            throw new TypeError('Promise settled with itself.');
+        }
+
+        promise.state = REJECTED;
+        promise.value = reason;
+        promise.notify();
+    }
+};
+
+p.notify = function notify() {
+    var promise = this;
+
+    nextTick(function () {
+        if (promise.state !== PENDING) {
+            while (promise.deferred.length) {
+                var deferred = promise.deferred.shift(),
+                    onResolved = deferred[0],
+                    onRejected = deferred[1],
+                    resolve = deferred[2],
+                    reject = deferred[3];
+
+                try {
+                    if (promise.state === RESOLVED) {
+                        if (typeof onResolved === 'function') {
+                            resolve(onResolved.call(undefined, promise.value));
+                        } else {
+                            resolve(promise.value);
+                        }
+                    } else if (promise.state === REJECTED) {
+                        if (typeof onRejected === 'function') {
+                            resolve(onRejected.call(undefined, promise.value));
+                        } else {
+                            reject(promise.value);
+                        }
+                    }
+                } catch (e) {
+                    reject(e);
+                }
+            }
+        }
+    });
+};
+
+p.then = function then(onResolved, onRejected) {
+    var promise = this;
+
+    return new Promise$1(function (resolve, reject) {
+        promise.deferred.push([onResolved, onRejected, resolve, reject]);
+        promise.notify();
+    });
+};
+
+p.catch = function (onRejected) {
+    return this.then(undefined, onRejected);
+};
+
+/**
+ * Promise adapter.
+ */
+
+if (typeof Promise === 'undefined') {
+    window.Promise = Promise$1;
+}
+
+function PromiseObj(executor, context) {
+
+    if (executor instanceof Promise) {
+        this.promise = executor;
+    } else {
+        this.promise = new Promise(executor.bind(context));
+    }
+
+    this.context = context;
+}
+
+PromiseObj.all = function (iterable, context) {
+    return new PromiseObj(Promise.all(iterable), context);
+};
+
+PromiseObj.resolve = function (value, context) {
+    return new PromiseObj(Promise.resolve(value), context);
+};
+
+PromiseObj.reject = function (reason, context) {
+    return new PromiseObj(Promise.reject(reason), context);
+};
+
+PromiseObj.race = function (iterable, context) {
+    return new PromiseObj(Promise.race(iterable), context);
+};
+
+var p$1 = PromiseObj.prototype;
+
+p$1.bind = function (context) {
+    this.context = context;
+    return this;
+};
+
+p$1.then = function (fulfilled, rejected) {
+
+    if (fulfilled && fulfilled.bind && this.context) {
+        fulfilled = fulfilled.bind(this.context);
+    }
+
+    if (rejected && rejected.bind && this.context) {
+        rejected = rejected.bind(this.context);
+    }
+
+    return new PromiseObj(this.promise.then(fulfilled, rejected), this.context);
+};
+
+p$1.catch = function (rejected) {
+
+    if (rejected && rejected.bind && this.context) {
+        rejected = rejected.bind(this.context);
+    }
+
+    return new PromiseObj(this.promise.catch(rejected), this.context);
+};
+
+p$1.finally = function (callback) {
+
+    return this.then(function (value) {
+        callback.call(this);
+        return value;
+    }, function (reason) {
+        callback.call(this);
+        return Promise.reject(reason);
+    }
+    );
+};
+
+/**
+ * Utility functions.
+ */
+
+var ref = {};
+var hasOwnProperty = ref.hasOwnProperty;
+var ref$1 = [];
+var slice = ref$1.slice;
+var debug = false, ntick;
+
+var inBrowser = typeof window !== 'undefined';
+
+function Util (ref) {
+    var config = ref.config;
+    var nextTick = ref.nextTick;
+
+    ntick = nextTick;
+    debug = config.debug || !config.silent;
+}
+
+function warn(msg) {
+    if (typeof console !== 'undefined' && debug) {
+        console.warn('[VueResource warn]: ' + msg);
+    }
+}
+
+function error(msg) {
+    if (typeof console !== 'undefined') {
+        console.error(msg);
+    }
+}
+
+function nextTick(cb, ctx) {
+    return ntick(cb, ctx);
+}
+
+function trim(str) {
+    return str ? str.replace(/^\s*|\s*$/g, '') : '';
+}
+
+function trimEnd(str, chars) {
+
+    if (str && chars === undefined) {
+        return str.replace(/\s+$/, '');
+    }
+
+    if (!str || !chars) {
+        return str;
+    }
+
+    return str.replace(new RegExp(("[" + chars + "]+$")), '');
+}
+
+function toLower(str) {
+    return str ? str.toLowerCase() : '';
+}
+
+function toUpper(str) {
+    return str ? str.toUpperCase() : '';
+}
+
+var isArray = Array.isArray;
+
+function isString(val) {
+    return typeof val === 'string';
+}
+
+function isFunction(val) {
+    return typeof val === 'function';
+}
+
+function isObject(obj) {
+    return obj !== null && typeof obj === 'object';
+}
+
+function isPlainObject(obj) {
+    return isObject(obj) && Object.getPrototypeOf(obj) == Object.prototype;
+}
+
+function isBlob(obj) {
+    return typeof Blob !== 'undefined' && obj instanceof Blob;
+}
+
+function isFormData(obj) {
+    return typeof FormData !== 'undefined' && obj instanceof FormData;
+}
+
+function when(value, fulfilled, rejected) {
+
+    var promise = PromiseObj.resolve(value);
+
+    if (arguments.length < 2) {
+        return promise;
+    }
+
+    return promise.then(fulfilled, rejected);
+}
+
+function options(fn, obj, opts) {
+
+    opts = opts || {};
+
+    if (isFunction(opts)) {
+        opts = opts.call(obj);
+    }
+
+    return merge(fn.bind({$vm: obj, $options: opts}), fn, {$options: opts});
+}
+
+function each(obj, iterator) {
+
+    var i, key;
+
+    if (isArray(obj)) {
+        for (i = 0; i < obj.length; i++) {
+            iterator.call(obj[i], obj[i], i);
+        }
+    } else if (isObject(obj)) {
+        for (key in obj) {
+            if (hasOwnProperty.call(obj, key)) {
+                iterator.call(obj[key], obj[key], key);
+            }
+        }
+    }
+
+    return obj;
+}
+
+var assign = Object.assign || _assign;
+
+function merge(target) {
+
+    var args = slice.call(arguments, 1);
+
+    args.forEach(function (source) {
+        _merge(target, source, true);
+    });
+
+    return target;
+}
+
+function defaults(target) {
+
+    var args = slice.call(arguments, 1);
+
+    args.forEach(function (source) {
+
+        for (var key in source) {
+            if (target[key] === undefined) {
+                target[key] = source[key];
+            }
+        }
+
+    });
+
+    return target;
+}
+
+function _assign(target) {
+
+    var args = slice.call(arguments, 1);
+
+    args.forEach(function (source) {
+        _merge(target, source);
+    });
+
+    return target;
+}
+
+function _merge(target, source, deep) {
+    for (var key in source) {
+        if (deep && (isPlainObject(source[key]) || isArray(source[key]))) {
+            if (isPlainObject(source[key]) && !isPlainObject(target[key])) {
+                target[key] = {};
+            }
+            if (isArray(source[key]) && !isArray(target[key])) {
+                target[key] = [];
+            }
+            _merge(target[key], source[key], deep);
+        } else if (source[key] !== undefined) {
+            target[key] = source[key];
+        }
+    }
+}
+
+/**
+ * Root Prefix Transform.
+ */
+
+function root (options$$1, next) {
+
+    var url = next(options$$1);
+
+    if (isString(options$$1.root) && !/^(https?:)?\//.test(url)) {
+        url = trimEnd(options$$1.root, '/') + '/' + url;
+    }
+
+    return url;
+}
+
+/**
+ * Query Parameter Transform.
+ */
+
+function query (options$$1, next) {
+
+    var urlParams = Object.keys(Url.options.params), query = {}, url = next(options$$1);
+
+    each(options$$1.params, function (value, key) {
+        if (urlParams.indexOf(key) === -1) {
+            query[key] = value;
+        }
+    });
+
+    query = Url.params(query);
+
+    if (query) {
+        url += (url.indexOf('?') == -1 ? '?' : '&') + query;
+    }
+
+    return url;
+}
+
+/**
+ * URL Template v2.0.6 (https://github.com/bramstein/url-template)
+ */
+
+function expand(url, params, variables) {
+
+    var tmpl = parse(url), expanded = tmpl.expand(params);
+
+    if (variables) {
+        variables.push.apply(variables, tmpl.vars);
+    }
+
+    return expanded;
+}
+
+function parse(template) {
+
+    var operators = ['+', '#', '.', '/', ';', '?', '&'], variables = [];
+
+    return {
+        vars: variables,
+        expand: function expand(context) {
+            return template.replace(/\{([^{}]+)\}|([^{}]+)/g, function (_, expression, literal) {
+                if (expression) {
+
+                    var operator = null, values = [];
+
+                    if (operators.indexOf(expression.charAt(0)) !== -1) {
+                        operator = expression.charAt(0);
+                        expression = expression.substr(1);
+                    }
+
+                    expression.split(/,/g).forEach(function (variable) {
+                        var tmp = /([^:*]*)(?::(\d+)|(\*))?/.exec(variable);
+                        values.push.apply(values, getValues(context, operator, tmp[1], tmp[2] || tmp[3]));
+                        variables.push(tmp[1]);
+                    });
+
+                    if (operator && operator !== '+') {
+
+                        var separator = ',';
+
+                        if (operator === '?') {
+                            separator = '&';
+                        } else if (operator !== '#') {
+                            separator = operator;
+                        }
+
+                        return (values.length !== 0 ? operator : '') + values.join(separator);
+                    } else {
+                        return values.join(',');
+                    }
+
+                } else {
+                    return encodeReserved(literal);
+                }
+            });
+        }
+    };
+}
+
+function getValues(context, operator, key, modifier) {
+
+    var value = context[key], result = [];
+
+    if (isDefined(value) && value !== '') {
+        if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {
+            value = value.toString();
+
+            if (modifier && modifier !== '*') {
+                value = value.substring(0, parseInt(modifier, 10));
+            }
+
+            result.push(encodeValue(operator, value, isKeyOperator(operator) ? key : null));
+        } else {
+            if (modifier === '*') {
+                if (Array.isArray(value)) {
+                    value.filter(isDefined).forEach(function (value) {
+                        result.push(encodeValue(operator, value, isKeyOperator(operator) ? key : null));
+                    });
+                } else {
+                    Object.keys(value).forEach(function (k) {
+                        if (isDefined(value[k])) {
+                            result.push(encodeValue(operator, value[k], k));
+                        }
+                    });
+                }
+            } else {
+                var tmp = [];
+
+                if (Array.isArray(value)) {
+                    value.filter(isDefined).forEach(function (value) {
+                        tmp.push(encodeValue(operator, value));
+                    });
+                } else {
+                    Object.keys(value).forEach(function (k) {
+                        if (isDefined(value[k])) {
+                            tmp.push(encodeURIComponent(k));
+                            tmp.push(encodeValue(operator, value[k].toString()));
+                        }
+                    });
+                }
+
+                if (isKeyOperator(operator)) {
+                    result.push(encodeURIComponent(key) + '=' + tmp.join(','));
+                } else if (tmp.length !== 0) {
+                    result.push(tmp.join(','));
+                }
+            }
+        }
+    } else {
+        if (operator === ';') {
+            result.push(encodeURIComponent(key));
+        } else if (value === '' && (operator === '&' || operator === '?')) {
+            result.push(encodeURIComponent(key) + '=');
+        } else if (value === '') {
+            result.push('');
+        }
+    }
+
+    return result;
+}
+
+function isDefined(value) {
+    return value !== undefined && value !== null;
+}
+
+function isKeyOperator(operator) {
+    return operator === ';' || operator === '&' || operator === '?';
+}
+
+function encodeValue(operator, value, key) {
+
+    value = (operator === '+' || operator === '#') ? encodeReserved(value) : encodeURIComponent(value);
+
+    if (key) {
+        return encodeURIComponent(key) + '=' + value;
+    } else {
+        return value;
+    }
+}
+
+function encodeReserved(str) {
+    return str.split(/(%[0-9A-Fa-f]{2})/g).map(function (part) {
+        if (!/%[0-9A-Fa-f]/.test(part)) {
+            part = encodeURI(part);
+        }
+        return part;
+    }).join('');
+}
+
+/**
+ * URL Template (RFC 6570) Transform.
+ */
+
+function template (options) {
+
+    var variables = [], url = expand(options.url, options.params, variables);
+
+    variables.forEach(function (key) {
+        delete options.params[key];
+    });
+
+    return url;
+}
+
+/**
+ * Service for URL templating.
+ */
+
+function Url(url, params) {
+
+    var self = this || {}, options$$1 = url, transform;
+
+    if (isString(url)) {
+        options$$1 = {url: url, params: params};
+    }
+
+    options$$1 = merge({}, Url.options, self.$options, options$$1);
+
+    Url.transforms.forEach(function (handler) {
+
+        if (isString(handler)) {
+            handler = Url.transform[handler];
+        }
+
+        if (isFunction(handler)) {
+            transform = factory(handler, transform, self.$vm);
+        }
+
+    });
+
+    return transform(options$$1);
+}
+
+/**
+ * Url options.
+ */
+
+Url.options = {
+    url: '',
+    root: null,
+    params: {}
+};
+
+/**
+ * Url transforms.
+ */
+
+Url.transform = {template: template, query: query, root: root};
+Url.transforms = ['template', 'query', 'root'];
+
+/**
+ * Encodes a Url parameter string.
+ *
+ * @param {Object} obj
+ */
+
+Url.params = function (obj) {
+
+    var params = [], escape = encodeURIComponent;
+
+    params.add = function (key, value) {
+
+        if (isFunction(value)) {
+            value = value();
+        }
+
+        if (value === null) {
+            value = '';
+        }
+
+        this.push(escape(key) + '=' + escape(value));
+    };
+
+    serialize(params, obj);
+
+    return params.join('&').replace(/%20/g, '+');
+};
+
+/**
+ * Parse a URL and return its components.
+ *
+ * @param {String} url
+ */
+
+Url.parse = function (url) {
+
+    var el = document.createElement('a');
+
+    if (document.documentMode) {
+        el.href = url;
+        url = el.href;
+    }
+
+    el.href = url;
+
+    return {
+        href: el.href,
+        protocol: el.protocol ? el.protocol.replace(/:$/, '') : '',
+        port: el.port,
+        host: el.host,
+        hostname: el.hostname,
+        pathname: el.pathname.charAt(0) === '/' ? el.pathname : '/' + el.pathname,
+        search: el.search ? el.search.replace(/^\?/, '') : '',
+        hash: el.hash ? el.hash.replace(/^#/, '') : ''
+    };
+};
+
+function factory(handler, next, vm) {
+    return function (options$$1) {
+        return handler.call(vm, options$$1, next);
+    };
+}
+
+function serialize(params, obj, scope) {
+
+    var array = isArray(obj), plain = isPlainObject(obj), hash;
+
+    each(obj, function (value, key) {
+
+        hash = isObject(value) || isArray(value);
+
+        if (scope) {
+            key = scope + '[' + (plain || hash ? key : '') + ']';
+        }
+
+        if (!scope && array) {
+            params.add(value.name, value.value);
+        } else if (hash) {
+            serialize(params, value, key);
+        } else {
+            params.add(key, value);
+        }
+    });
+}
+
+/**
+ * XDomain client (Internet Explorer).
+ */
+
+function xdrClient (request) {
+    return new PromiseObj(function (resolve) {
+
+        var xdr = new XDomainRequest(), handler = function (ref) {
+                var type = ref.type;
+
+
+                var status = 0;
+
+                if (type === 'load') {
+                    status = 200;
+                } else if (type === 'error') {
+                    status = 500;
+                }
+
+                resolve(request.respondWith(xdr.responseText, {status: status}));
+            };
+
+        request.abort = function () { return xdr.abort(); };
+
+        xdr.open(request.method, request.getUrl());
+
+        if (request.timeout) {
+            xdr.timeout = request.timeout;
+        }
+
+        xdr.onload = handler;
+        xdr.onabort = handler;
+        xdr.onerror = handler;
+        xdr.ontimeout = handler;
+        xdr.onprogress = function () {};
+        xdr.send(request.getBody());
+    });
+}
+
+/**
+ * CORS Interceptor.
+ */
+
+var SUPPORTS_CORS = inBrowser && 'withCredentials' in new XMLHttpRequest();
+
+function cors (request) {
+
+    if (inBrowser) {
+
+        var orgUrl = Url.parse(location.href);
+        var reqUrl = Url.parse(request.getUrl());
+
+        if (reqUrl.protocol !== orgUrl.protocol || reqUrl.host !== orgUrl.host) {
+
+            request.crossOrigin = true;
+            request.emulateHTTP = false;
+
+            if (!SUPPORTS_CORS) {
+                request.client = xdrClient;
+            }
+        }
+    }
+
+}
+
+/**
+ * Form data Interceptor.
+ */
+
+function form (request) {
+
+    if (isFormData(request.body)) {
+        request.headers.delete('Content-Type');
+    } else if (isObject(request.body) && request.emulateJSON) {
+        request.body = Url.params(request.body);
+        request.headers.set('Content-Type', 'application/x-www-form-urlencoded');
+    }
+
+}
+
+/**
+ * JSON Interceptor.
+ */
+
+function json (request) {
+
+    var type = request.headers.get('Content-Type') || '';
+
+    if (isObject(request.body) && type.indexOf('application/json') === 0) {
+        request.body = JSON.stringify(request.body);
+    }
+
+    return function (response) {
+
+        return response.bodyText ? when(response.text(), function (text) {
+
+            var type = response.headers.get('Content-Type') || '';
+
+            if (type.indexOf('application/json') === 0 || isJson(text)) {
+
+                try {
+                    response.body = JSON.parse(text);
+                } catch (e) {
+                    response.body = null;
+                }
+
+            } else {
+                response.body = text;
+            }
+
+            return response;
+
+        }) : response;
+
+    };
+}
+
+function isJson(str) {
+
+    var start = str.match(/^\s*(\[|\{)/);
+    var end = {'[': /]\s*$/, '{': /}\s*$/};
+
+    return start && end[start[1]].test(str);
+}
+
+/**
+ * JSONP client (Browser).
+ */
+
+function jsonpClient (request) {
+    return new PromiseObj(function (resolve) {
+
+        var name = request.jsonp || 'callback', callback = request.jsonpCallback || '_jsonp' + Math.random().toString(36).substr(2), body = null, handler, script;
+
+        handler = function (ref) {
+            var type = ref.type;
+
+
+            var status = 0;
+
+            if (type === 'load' && body !== null) {
+                status = 200;
+            } else if (type === 'error') {
+                status = 500;
+            }
+
+            if (status && window[callback]) {
+                delete window[callback];
+                document.body.removeChild(script);
+            }
+
+            resolve(request.respondWith(body, {status: status}));
+        };
+
+        window[callback] = function (result) {
+            body = JSON.stringify(result);
+        };
+
+        request.abort = function () {
+            handler({type: 'abort'});
+        };
+
+        request.params[name] = callback;
+
+        if (request.timeout) {
+            setTimeout(request.abort, request.timeout);
+        }
+
+        script = document.createElement('script');
+        script.src = request.getUrl();
+        script.type = 'text/javascript';
+        script.async = true;
+        script.onload = handler;
+        script.onerror = handler;
+
+        document.body.appendChild(script);
+    });
+}
+
+/**
+ * JSONP Interceptor.
+ */
+
+function jsonp (request) {
+
+    if (request.method == 'JSONP') {
+        request.client = jsonpClient;
+    }
+
+}
+
+/**
+ * Before Interceptor.
+ */
+
+function before (request) {
+
+    if (isFunction(request.before)) {
+        request.before.call(this, request);
+    }
+
+}
+
+/**
+ * HTTP method override Interceptor.
+ */
+
+function method (request) {
+
+    if (request.emulateHTTP && /^(PUT|PATCH|DELETE)$/i.test(request.method)) {
+        request.headers.set('X-HTTP-Method-Override', request.method);
+        request.method = 'POST';
+    }
+
+}
+
+/**
+ * Header Interceptor.
+ */
+
+function header (request) {
+
+    var headers = assign({}, Http.headers.common,
+        !request.crossOrigin ? Http.headers.custom : {},
+        Http.headers[toLower(request.method)]
+    );
+
+    each(headers, function (value, name) {
+        if (!request.headers.has(name)) {
+            request.headers.set(name, value);
+        }
+    });
+
+}
+
+/**
+ * XMLHttp client (Browser).
+ */
+
+function xhrClient (request) {
+    return new PromiseObj(function (resolve) {
+
+        var xhr = new XMLHttpRequest(), handler = function (event) {
+
+                var response = request.respondWith(
+                'response' in xhr ? xhr.response : xhr.responseText, {
+                    status: xhr.status === 1223 ? 204 : xhr.status, // IE9 status bug
+                    statusText: xhr.status === 1223 ? 'No Content' : trim(xhr.statusText)
+                });
+
+                each(trim(xhr.getAllResponseHeaders()).split('\n'), function (row) {
+                    response.headers.append(row.slice(0, row.indexOf(':')), row.slice(row.indexOf(':') + 1));
+                });
+
+                resolve(response);
+            };
+
+        request.abort = function () { return xhr.abort(); };
+
+        xhr.open(request.method, request.getUrl(), true);
+
+        if (request.timeout) {
+            xhr.timeout = request.timeout;
+        }
+
+        if (request.responseType && 'responseType' in xhr) {
+            xhr.responseType = request.responseType;
+        }
+
+        if (request.withCredentials || request.credentials) {
+            xhr.withCredentials = true;
+        }
+
+        if (!request.crossOrigin) {
+            request.headers.set('X-Requested-With', 'XMLHttpRequest');
+        }
+
+        // deprecated use downloadProgress
+        if (isFunction(request.progress) && request.method === 'GET') {
+            xhr.addEventListener('progress', request.progress);
+        }
+
+        if (isFunction(request.downloadProgress)) {
+            xhr.addEventListener('progress', request.downloadProgress);
+        }
+
+        // deprecated use uploadProgress
+        if (isFunction(request.progress) && /^(POST|PUT)$/i.test(request.method)) {
+            xhr.upload.addEventListener('progress', request.progress);
+        }
+
+        if (isFunction(request.uploadProgress) && xhr.upload) {
+            xhr.upload.addEventListener('progress', request.uploadProgress);
+        }
+
+        request.headers.forEach(function (value, name) {
+            xhr.setRequestHeader(name, value);
+        });
+
+        xhr.onload = handler;
+        xhr.onabort = handler;
+        xhr.onerror = handler;
+        xhr.ontimeout = handler;
+        xhr.send(request.getBody());
+    });
+}
+
+/**
+ * Http client (Node).
+ */
+
+function nodeClient (request) {
+
+    var client = require('got');
+
+    return new PromiseObj(function (resolve) {
+
+        var url = request.getUrl();
+        var body = request.getBody();
+        var method = request.method;
+        var headers = {}, handler;
+
+        request.headers.forEach(function (value, name) {
+            headers[name] = value;
+        });
+
+        client(url, {body: body, method: method, headers: headers}).then(handler = function (resp) {
+
+            var response = request.respondWith(resp.body, {
+                status: resp.statusCode,
+                statusText: trim(resp.statusMessage)
+            });
+
+            each(resp.headers, function (value, name) {
+                response.headers.set(name, value);
+            });
+
+            resolve(response);
+
+        }, function (error$$1) { return handler(error$$1.response); });
+    });
+}
+
+/**
+ * Base client.
+ */
+
+function Client (context) {
+
+    var reqHandlers = [sendRequest], resHandlers = [];
+
+    if (!isObject(context)) {
+        context = null;
+    }
+
+    function Client(request) {
+        while (reqHandlers.length) {
+
+            var handler = reqHandlers.pop();
+
+            if (isFunction(handler)) {
+
+                var response = (void 0), next = (void 0);
+
+                response = handler.call(context, request, function (val) { return next = val; }) || next;
+
+                if (isObject(response)) {
+                    return new PromiseObj(function (resolve, reject) {
+
+                        resHandlers.forEach(function (handler) {
+                            response = when(response, function (response) {
+                                return handler.call(context, response) || response;
+                            }, reject);
+                        });
+
+                        when(response, resolve, reject);
+
+                    }, context);
+                }
+
+                if (isFunction(response)) {
+                    resHandlers.unshift(response);
+                }
+
+            } else {
+                warn(("Invalid interceptor of type " + (typeof handler) + ", must be a function"));
+            }
+        }
+    }
+
+    Client.use = function (handler) {
+        reqHandlers.push(handler);
+    };
+
+    return Client;
+}
+
+function sendRequest(request) {
+
+    var client = request.client || (inBrowser ? xhrClient : nodeClient);
+
+    return client(request);
+}
+
+/**
+ * HTTP Headers.
+ */
+
+var Headers = function Headers(headers) {
+    var this$1 = this;
+
+
+    this.map = {};
+
+    each(headers, function (value, name) { return this$1.append(name, value); });
+};
+
+Headers.prototype.has = function has (name) {
+    return getName(this.map, name) !== null;
+};
+
+Headers.prototype.get = function get (name) {
+
+    var list = this.map[getName(this.map, name)];
+
+    return list ? list.join() : null;
+};
+
+Headers.prototype.getAll = function getAll (name) {
+    return this.map[getName(this.map, name)] || [];
+};
+
+Headers.prototype.set = function set (name, value) {
+    this.map[normalizeName(getName(this.map, name) || name)] = [trim(value)];
+};
+
+Headers.prototype.append = function append (name, value) {
+
+    var list = this.map[getName(this.map, name)];
+
+    if (list) {
+        list.push(trim(value));
+    } else {
+        this.set(name, value);
+    }
+};
+
+Headers.prototype.delete = function delete$1 (name) {
+    delete this.map[getName(this.map, name)];
+};
+
+Headers.prototype.deleteAll = function deleteAll () {
+    this.map = {};
+};
+
+Headers.prototype.forEach = function forEach (callback, thisArg) {
+        var this$1 = this;
+
+    each(this.map, function (list, name) {
+        each(list, function (value) { return callback.call(thisArg, value, name, this$1); });
+    });
+};
+
+function getName(map, name) {
+    return Object.keys(map).reduce(function (prev, curr) {
+        return toLower(name) === toLower(curr) ? curr : prev;
+    }, null);
+}
+
+function normalizeName(name) {
+
+    if (/[^a-z0-9\-#$%&'*+.^_`|~]/i.test(name)) {
+        throw new TypeError('Invalid character in header field name');
+    }
+
+    return trim(name);
+}
+
+/**
+ * HTTP Response.
+ */
+
+var Response = function Response(body, ref) {
+    var url = ref.url;
+    var headers = ref.headers;
+    var status = ref.status;
+    var statusText = ref.statusText;
+
+
+    this.url = url;
+    this.ok = status >= 200 && status < 300;
+    this.status = status || 0;
+    this.statusText = statusText || '';
+    this.headers = new Headers(headers);
+    this.body = body;
+
+    if (isString(body)) {
+
+        this.bodyText = body;
+
+    } else if (isBlob(body)) {
+
+        this.bodyBlob = body;
+
+        if (isBlobText(body)) {
+            this.bodyText = blobText(body);
+        }
+    }
+};
+
+Response.prototype.blob = function blob () {
+    return when(this.bodyBlob);
+};
+
+Response.prototype.text = function text () {
+    return when(this.bodyText);
+};
+
+Response.prototype.json = function json () {
+    return when(this.text(), function (text) { return JSON.parse(text); });
+};
+
+Object.defineProperty(Response.prototype, 'data', {
+
+    get: function get() {
+        return this.body;
+    },
+
+    set: function set(body) {
+        this.body = body;
+    }
+
+});
+
+function blobText(body) {
+    return new PromiseObj(function (resolve) {
+
+        var reader = new FileReader();
+
+        reader.readAsText(body);
+        reader.onload = function () {
+            resolve(reader.result);
+        };
+
+    });
+}
+
+function isBlobText(body) {
+    return body.type.indexOf('text') === 0 || body.type.indexOf('json') !== -1;
+}
+
+/**
+ * HTTP Request.
+ */
+
+var Request = function Request(options$$1) {
+
+    this.body = null;
+    this.params = {};
+
+    assign(this, options$$1, {
+        method: toUpper(options$$1.method || 'GET')
+    });
+
+    if (!(this.headers instanceof Headers)) {
+        this.headers = new Headers(this.headers);
+    }
+};
+
+Request.prototype.getUrl = function getUrl () {
+    return Url(this);
+};
+
+Request.prototype.getBody = function getBody () {
+    return this.body;
+};
+
+Request.prototype.respondWith = function respondWith (body, options$$1) {
+    return new Response(body, assign(options$$1 || {}, {url: this.getUrl()}));
+};
+
+/**
+ * Service for sending network requests.
+ */
+
+var COMMON_HEADERS = {'Accept': 'application/json, text/plain, */*'};
+var JSON_CONTENT_TYPE = {'Content-Type': 'application/json;charset=utf-8'};
+
+function Http(options$$1) {
+
+    var self = this || {}, client = Client(self.$vm);
+
+    defaults(options$$1 || {}, self.$options, Http.options);
+
+    Http.interceptors.forEach(function (handler) {
+
+        if (isString(handler)) {
+            handler = Http.interceptor[handler];
+        }
+
+        if (isFunction(handler)) {
+            client.use(handler);
+        }
+
+    });
+
+    return client(new Request(options$$1)).then(function (response) {
+
+        return response.ok ? response : PromiseObj.reject(response);
+
+    }, function (response) {
+
+        if (response instanceof Error) {
+            error(response);
+        }
+
+        return PromiseObj.reject(response);
+    });
+}
+
+Http.options = {};
+
+Http.headers = {
+    put: JSON_CONTENT_TYPE,
+    post: JSON_CONTENT_TYPE,
+    patch: JSON_CONTENT_TYPE,
+    delete: JSON_CONTENT_TYPE,
+    common: COMMON_HEADERS,
+    custom: {}
+};
+
+Http.interceptor = {before: before, method: method, jsonp: jsonp, json: json, form: form, header: header, cors: cors};
+Http.interceptors = ['before', 'method', 'jsonp', 'json', 'form', 'header', 'cors'];
+
+['get', 'delete', 'head', 'jsonp'].forEach(function (method$$1) {
+
+    Http[method$$1] = function (url, options$$1) {
+        return this(assign(options$$1 || {}, {url: url, method: method$$1}));
+    };
+
+});
+
+['post', 'put', 'patch'].forEach(function (method$$1) {
+
+    Http[method$$1] = function (url, body, options$$1) {
+        return this(assign(options$$1 || {}, {url: url, method: method$$1, body: body}));
+    };
+
+});
+
+/**
+ * Service for interacting with RESTful services.
+ */
+
+function Resource(url, params, actions, options$$1) {
+
+    var self = this || {}, resource = {};
+
+    actions = assign({},
+        Resource.actions,
+        actions
+    );
+
+    each(actions, function (action, name) {
+
+        action = merge({url: url, params: assign({}, params)}, options$$1, action);
+
+        resource[name] = function () {
+            return (self.$http || Http)(opts(action, arguments));
+        };
+    });
+
+    return resource;
+}
+
+function opts(action, args) {
+
+    var options$$1 = assign({}, action), params = {}, body;
+
+    switch (args.length) {
+
+        case 2:
+
+            params = args[0];
+            body = args[1];
+
+            break;
+
+        case 1:
+
+            if (/^(POST|PUT|PATCH)$/i.test(options$$1.method)) {
+                body = args[0];
+            } else {
+                params = args[0];
+            }
+
+            break;
+
+        case 0:
+
+            break;
+
+        default:
+
+            throw 'Expected up to 2 arguments [params, body], got ' + args.length + ' arguments';
+    }
+
+    options$$1.body = body;
+    options$$1.params = assign({}, options$$1.params, params);
+
+    return options$$1;
+}
+
+Resource.actions = {
+
+    get: {method: 'GET'},
+    save: {method: 'POST'},
+    query: {method: 'GET'},
+    update: {method: 'PUT'},
+    remove: {method: 'DELETE'},
+    delete: {method: 'DELETE'}
+
+};
+
+/**
+ * Install plugin.
+ */
+
+function plugin(Vue) {
+
+    if (plugin.installed) {
+        return;
+    }
+
+    Util(Vue);
+
+    Vue.url = Url;
+    Vue.http = Http;
+    Vue.resource = Resource;
+    Vue.Promise = PromiseObj;
+
+    Object.defineProperties(Vue.prototype, {
+
+        $url: {
+            get: function get() {
+                return options(Vue.url, this, this.$options.url);
+            }
+        },
+
+        $http: {
+            get: function get() {
+                return options(Vue.http, this, this.$options.http);
+            }
+        },
+
+        $resource: {
+            get: function get() {
+                return Vue.resource.bind(this);
+            }
+        },
+
+        $promise: {
+            get: function get() {
+                var this$1 = this;
+
+                return function (executor) { return new Vue.Promise(executor, this$1); };
+            }
+        }
+
+    });
+}
+
+if (typeof window !== 'undefined' && window.Vue) {
+    window.Vue.use(plugin);
+}
+
+return plugin;
+
+})));
diff --git a/advancedcontentfilter/vendor/asset/vue-resource/dist/vue-resource.min.js b/advancedcontentfilter/vendor/asset/vue-resource/dist/vue-resource.min.js
new file mode 100644 (file)
index 0000000..cc10be7
--- /dev/null
@@ -0,0 +1,7 @@
+/*!
+ * vue-resource v1.5.0
+ * https://github.com/pagekit/vue-resource
+ * Released under the MIT License.
+ */
+
+!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):t.VueResource=e()}(this,function(){"use strict";var t=2;function e(e){this.state=t,this.value=void 0,this.deferred=[];var n=this;try{e(function(t){n.resolve(t)},function(t){n.reject(t)})}catch(t){n.reject(t)}}e.reject=function(t){return new e(function(e,n){n(t)})},e.resolve=function(t){return new e(function(e,n){e(t)})},e.all=function(t){return new e(function(n,o){var r=0,i=[];function s(e){return function(o){i[e]=o,(r+=1)===t.length&&n(i)}}0===t.length&&n(i);for(var u=0;u<t.length;u+=1)e.resolve(t[u]).then(s(u),o)})},e.race=function(t){return new e(function(n,o){for(var r=0;r<t.length;r+=1)e.resolve(t[r]).then(n,o)})};var n=e.prototype;function o(t,e){t instanceof Promise?this.promise=t:this.promise=new Promise(t.bind(e)),this.context=e}n.resolve=function(e){var n=this;if(n.state===t){if(e===n)throw new TypeError("Promise settled with itself.");var o=!1;try{var r=e&&e.then;if(null!==e&&"object"==typeof e&&"function"==typeof r)return void r.call(e,function(t){o||n.resolve(t),o=!0},function(t){o||n.reject(t),o=!0})}catch(t){return void(o||n.reject(t))}n.state=0,n.value=e,n.notify()}},n.reject=function(e){var n=this;if(n.state===t){if(e===n)throw new TypeError("Promise settled with itself.");n.state=1,n.value=e,n.notify()}},n.notify=function(){var e,n=this;i(function(){if(n.state!==t)for(;n.deferred.length;){var e=n.deferred.shift(),o=e[0],r=e[1],i=e[2],s=e[3];try{0===n.state?i("function"==typeof o?o.call(void 0,n.value):n.value):1===n.state&&("function"==typeof r?i(r.call(void 0,n.value)):s(n.value))}catch(t){s(t)}}},e)},n.then=function(t,n){var o=this;return new e(function(e,r){o.deferred.push([t,n,e,r]),o.notify()})},n.catch=function(t){return this.then(void 0,t)},"undefined"==typeof Promise&&(window.Promise=e),o.all=function(t,e){return new o(Promise.all(t),e)},o.resolve=function(t,e){return new o(Promise.resolve(t),e)},o.reject=function(t,e){return new o(Promise.reject(t),e)},o.race=function(t,e){return new o(Promise.race(t),e)};var r=o.prototype;r.bind=function(t){return this.context=t,this},r.then=function(t,e){return t&&t.bind&&this.context&&(t=t.bind(this.context)),e&&e.bind&&this.context&&(e=e.bind(this.context)),new o(this.promise.then(t,e),this.context)},r.catch=function(t){return t&&t.bind&&this.context&&(t=t.bind(this.context)),new o(this.promise.catch(t),this.context)},r.finally=function(t){return this.then(function(e){return t.call(this),e},function(e){return t.call(this),Promise.reject(e)})};var i,s={}.hasOwnProperty,u=[].slice,a=!1,c="undefined"!=typeof window;function f(t){return t?t.replace(/^\s*|\s*$/g,""):""}function p(t){return t?t.toLowerCase():""}var h=Array.isArray;function d(t){return"string"==typeof t}function l(t){return"function"==typeof t}function m(t){return null!==t&&"object"==typeof t}function y(t){return m(t)&&Object.getPrototypeOf(t)==Object.prototype}function v(t,e,n){var r=o.resolve(t);return arguments.length<2?r:r.then(e,n)}function b(t,e,n){return l(n=n||{})&&(n=n.call(e)),T(t.bind({$vm:e,$options:n}),t,{$options:n})}function g(t,e){var n,o;if(h(t))for(n=0;n<t.length;n++)e.call(t[n],t[n],n);else if(m(t))for(o in t)s.call(t,o)&&e.call(t[o],t[o],o);return t}var w=Object.assign||function(t){return u.call(arguments,1).forEach(function(e){x(t,e)}),t};function T(t){return u.call(arguments,1).forEach(function(e){x(t,e,!0)}),t}function x(t,e,n){for(var o in e)n&&(y(e[o])||h(e[o]))?(y(e[o])&&!y(t[o])&&(t[o]={}),h(e[o])&&!h(t[o])&&(t[o]=[]),x(t[o],e[o],n)):void 0!==e[o]&&(t[o]=e[o])}function j(t,e,n){var o,r,i,s=(o=t,r=["+","#",".","/",";","?","&"],{vars:i=[],expand:function(t){return o.replace(/\{([^{}]+)\}|([^{}]+)/g,function(e,n,o){if(n){var s=null,u=[];if(-1!==r.indexOf(n.charAt(0))&&(s=n.charAt(0),n=n.substr(1)),n.split(/,/g).forEach(function(e){var n=/([^:*]*)(?::(\d+)|(\*))?/.exec(e);u.push.apply(u,function(t,e,n,o){var r=t[n],i=[];if(E(r)&&""!==r)if("string"==typeof r||"number"==typeof r||"boolean"==typeof r)r=r.toString(),o&&"*"!==o&&(r=r.substring(0,parseInt(o,10))),i.push(O(e,r,P(e)?n:null));else if("*"===o)Array.isArray(r)?r.filter(E).forEach(function(t){i.push(O(e,t,P(e)?n:null))}):Object.keys(r).forEach(function(t){E(r[t])&&i.push(O(e,r[t],t))});else{var s=[];Array.isArray(r)?r.filter(E).forEach(function(t){s.push(O(e,t))}):Object.keys(r).forEach(function(t){E(r[t])&&(s.push(encodeURIComponent(t)),s.push(O(e,r[t].toString())))}),P(e)?i.push(encodeURIComponent(n)+"="+s.join(",")):0!==s.length&&i.push(s.join(","))}else";"===e?i.push(encodeURIComponent(n)):""!==r||"&"!==e&&"?"!==e?""===r&&i.push(""):i.push(encodeURIComponent(n)+"=");return i}(t,s,n[1],n[2]||n[3])),i.push(n[1])}),s&&"+"!==s){var a=",";return"?"===s?a="&":"#"!==s&&(a=s),(0!==u.length?s:"")+u.join(a)}return u.join(",")}return C(o)})}}),u=s.expand(e);return n&&n.push.apply(n,s.vars),u}function E(t){return null!=t}function P(t){return";"===t||"&"===t||"?"===t}function O(t,e,n){return e="+"===t||"#"===t?C(e):encodeURIComponent(e),n?encodeURIComponent(n)+"="+e:e}function C(t){return t.split(/(%[0-9A-Fa-f]{2})/g).map(function(t){return/%[0-9A-Fa-f]/.test(t)||(t=encodeURI(t)),t}).join("")}function $(t,e){var n,o=this||{},r=t;return d(t)&&(r={url:t,params:e}),r=T({},$.options,o.$options,r),$.transforms.forEach(function(t){var e,r,i;d(t)&&(t=$.transform[t]),l(t)&&(e=t,r=n,i=o.$vm,n=function(t){return e.call(i,t,r)})}),n(r)}function U(t){return new o(function(e){var n=new XDomainRequest,o=function(o){var r=o.type,i=0;"load"===r?i=200:"error"===r&&(i=500),e(t.respondWith(n.responseText,{status:i}))};t.abort=function(){return n.abort()},n.open(t.method,t.getUrl()),t.timeout&&(n.timeout=t.timeout),n.onload=o,n.onabort=o,n.onerror=o,n.ontimeout=o,n.onprogress=function(){},n.send(t.getBody())})}$.options={url:"",root:null,params:{}},$.transform={template:function(t){var e=[],n=j(t.url,t.params,e);return e.forEach(function(e){delete t.params[e]}),n},query:function(t,e){var n=Object.keys($.options.params),o={},r=e(t);return g(t.params,function(t,e){-1===n.indexOf(e)&&(o[e]=t)}),(o=$.params(o))&&(r+=(-1==r.indexOf("?")?"?":"&")+o),r},root:function(t,e){var n,o,r=e(t);return d(t.root)&&!/^(https?:)?\//.test(r)&&(n=t.root,o="/",r=(n&&void 0===o?n.replace(/\s+$/,""):n&&o?n.replace(new RegExp("["+o+"]+$"),""):n)+"/"+r),r}},$.transforms=["template","query","root"],$.params=function(t){var e=[],n=encodeURIComponent;return e.add=function(t,e){l(e)&&(e=e()),null===e&&(e=""),this.push(n(t)+"="+n(e))},function t(e,n,o){var r,i=h(n),s=y(n);g(n,function(n,u){r=m(n)||h(n),o&&(u=o+"["+(s||r?u:"")+"]"),!o&&i?e.add(n.name,n.value):r?t(e,n,u):e.add(u,n)})}(e,t),e.join("&").replace(/%20/g,"+")},$.parse=function(t){var e=document.createElement("a");return document.documentMode&&(e.href=t,t=e.href),e.href=t,{href:e.href,protocol:e.protocol?e.protocol.replace(/:$/,""):"",port:e.port,host:e.host,hostname:e.hostname,pathname:"/"===e.pathname.charAt(0)?e.pathname:"/"+e.pathname,search:e.search?e.search.replace(/^\?/,""):"",hash:e.hash?e.hash.replace(/^#/,""):""}};var R=c&&"withCredentials"in new XMLHttpRequest;function A(t){return new o(function(e){var n,o,r=t.jsonp||"callback",i=t.jsonpCallback||"_jsonp"+Math.random().toString(36).substr(2),s=null;n=function(n){var r=n.type,u=0;"load"===r&&null!==s?u=200:"error"===r&&(u=500),u&&window[i]&&(delete window[i],document.body.removeChild(o)),e(t.respondWith(s,{status:u}))},window[i]=function(t){s=JSON.stringify(t)},t.abort=function(){n({type:"abort"})},t.params[r]=i,t.timeout&&setTimeout(t.abort,t.timeout),(o=document.createElement("script")).src=t.getUrl(),o.type="text/javascript",o.async=!0,o.onload=n,o.onerror=n,document.body.appendChild(o)})}function S(t){return new o(function(e){var n=new XMLHttpRequest,o=function(o){var r=t.respondWith("response"in n?n.response:n.responseText,{status:1223===n.status?204:n.status,statusText:1223===n.status?"No Content":f(n.statusText)});g(f(n.getAllResponseHeaders()).split("\n"),function(t){r.headers.append(t.slice(0,t.indexOf(":")),t.slice(t.indexOf(":")+1))}),e(r)};t.abort=function(){return n.abort()},n.open(t.method,t.getUrl(),!0),t.timeout&&(n.timeout=t.timeout),t.responseType&&"responseType"in n&&(n.responseType=t.responseType),(t.withCredentials||t.credentials)&&(n.withCredentials=!0),t.crossOrigin||t.headers.set("X-Requested-With","XMLHttpRequest"),l(t.progress)&&"GET"===t.method&&n.addEventListener("progress",t.progress),l(t.downloadProgress)&&n.addEventListener("progress",t.downloadProgress),l(t.progress)&&/^(POST|PUT)$/i.test(t.method)&&n.upload.addEventListener("progress",t.progress),l(t.uploadProgress)&&n.upload&&n.upload.addEventListener("progress",t.uploadProgress),t.headers.forEach(function(t,e){n.setRequestHeader(e,t)}),n.onload=o,n.onabort=o,n.onerror=o,n.ontimeout=o,n.send(t.getBody())})}function k(t){var e=require("got");return new o(function(n){var o,r=t.getUrl(),i=t.getBody(),s=t.method,u={};t.headers.forEach(function(t,e){u[e]=t}),e(r,{body:i,method:s,headers:u}).then(o=function(e){var o=t.respondWith(e.body,{status:e.statusCode,statusText:f(e.statusMessage)});g(e.headers,function(t,e){o.headers.set(e,t)}),n(o)},function(t){return o(t.response)})})}function I(t){return(t.client||(c?S:k))(t)}var L=function(t){var e=this;this.map={},g(t,function(t,n){return e.append(n,t)})};function q(t,e){return Object.keys(t).reduce(function(t,n){return p(e)===p(n)?n:t},null)}L.prototype.has=function(t){return null!==q(this.map,t)},L.prototype.get=function(t){var e=this.map[q(this.map,t)];return e?e.join():null},L.prototype.getAll=function(t){return this.map[q(this.map,t)]||[]},L.prototype.set=function(t,e){this.map[function(t){if(/[^a-z0-9\-#$%&'*+.^_`|~]/i.test(t))throw new TypeError("Invalid character in header field name");return f(t)}(q(this.map,t)||t)]=[f(e)]},L.prototype.append=function(t,e){var n=this.map[q(this.map,t)];n?n.push(f(e)):this.set(t,e)},L.prototype.delete=function(t){delete this.map[q(this.map,t)]},L.prototype.deleteAll=function(){this.map={}},L.prototype.forEach=function(t,e){var n=this;g(this.map,function(o,r){g(o,function(o){return t.call(e,o,r,n)})})};var H=function(t,e){var n,r,i,s=e.url,u=e.headers,a=e.status,c=e.statusText;this.url=s,this.ok=a>=200&&a<300,this.status=a||0,this.statusText=c||"",this.headers=new L(u),this.body=t,d(t)?this.bodyText=t:(i=t,"undefined"!=typeof Blob&&i instanceof Blob&&(this.bodyBlob=t,(0===(r=t).type.indexOf("text")||-1!==r.type.indexOf("json"))&&(this.bodyText=(n=t,new o(function(t){var e=new FileReader;e.readAsText(n),e.onload=function(){t(e.result)}})))))};H.prototype.blob=function(){return v(this.bodyBlob)},H.prototype.text=function(){return v(this.bodyText)},H.prototype.json=function(){return v(this.text(),function(t){return JSON.parse(t)})},Object.defineProperty(H.prototype,"data",{get:function(){return this.body},set:function(t){this.body=t}});var B=function(t){var e;this.body=null,this.params={},w(this,t,{method:(e=t.method||"GET",e?e.toUpperCase():"")}),this.headers instanceof L||(this.headers=new L(this.headers))};B.prototype.getUrl=function(){return $(this)},B.prototype.getBody=function(){return this.body},B.prototype.respondWith=function(t,e){return new H(t,w(e||{},{url:this.getUrl()}))};var M={"Content-Type":"application/json;charset=utf-8"};function N(t){var e=this||{},n=function(t){var e=[I],n=[];function r(r){for(;e.length;){var i=e.pop();if(l(i)){var s=void 0,u=void 0;if(m(s=i.call(t,r,function(t){return u=t})||u))return new o(function(e,o){n.forEach(function(e){s=v(s,function(n){return e.call(t,n)||n},o)}),v(s,e,o)},t);l(s)&&n.unshift(s)}else c="Invalid interceptor of type "+typeof i+", must be a function","undefined"!=typeof console&&a&&console.warn("[VueResource warn]: "+c)}var c}return m(t)||(t=null),r.use=function(t){e.push(t)},r}(e.$vm);return function(t){u.call(arguments,1).forEach(function(e){for(var n in e)void 0===t[n]&&(t[n]=e[n])})}(t||{},e.$options,N.options),N.interceptors.forEach(function(t){d(t)&&(t=N.interceptor[t]),l(t)&&n.use(t)}),n(new B(t)).then(function(t){return t.ok?t:o.reject(t)},function(t){var e;return t instanceof Error&&(e=t,"undefined"!=typeof console&&console.error(e)),o.reject(t)})}function D(t,e,n,o){var r=this||{},i={};return g(n=w({},D.actions,n),function(n,s){n=T({url:t,params:w({},e)},o,n),i[s]=function(){return(r.$http||N)(function(t,e){var n,o=w({},t),r={};switch(e.length){case 2:r=e[0],n=e[1];break;case 1:/^(POST|PUT|PATCH)$/i.test(o.method)?n=e[0]:r=e[0];break;case 0:break;default:throw"Expected up to 2 arguments [params, body], got "+e.length+" arguments"}return o.body=n,o.params=w({},o.params,r),o}(n,arguments))}}),i}function J(t){var e,n,r;J.installed||(n=(e=t).config,r=e.nextTick,i=r,a=n.debug||!n.silent,t.url=$,t.http=N,t.resource=D,t.Promise=o,Object.defineProperties(t.prototype,{$url:{get:function(){return b(t.url,this,this.$options.url)}},$http:{get:function(){return b(t.http,this,this.$options.http)}},$resource:{get:function(){return t.resource.bind(this)}},$promise:{get:function(){var e=this;return function(n){return new t.Promise(n,e)}}}}))}return N.options={},N.headers={put:M,post:M,patch:M,delete:M,common:{Accept:"application/json, text/plain, */*"},custom:{}},N.interceptor={before:function(t){l(t.before)&&t.before.call(this,t)},method:function(t){t.emulateHTTP&&/^(PUT|PATCH|DELETE)$/i.test(t.method)&&(t.headers.set("X-HTTP-Method-Override",t.method),t.method="POST")},jsonp:function(t){"JSONP"==t.method&&(t.client=A)},json:function(t){var e=t.headers.get("Content-Type")||"";return m(t.body)&&0===e.indexOf("application/json")&&(t.body=JSON.stringify(t.body)),function(t){return t.bodyText?v(t.text(),function(e){var n,o;if(0===(t.headers.get("Content-Type")||"").indexOf("application/json")||(o=(n=e).match(/^\s*(\[|\{)/))&&{"[":/]\s*$/,"{":/}\s*$/}[o[1]].test(n))try{t.body=JSON.parse(e)}catch(e){t.body=null}else t.body=e;return t}):t}},form:function(t){var e;e=t.body,"undefined"!=typeof FormData&&e instanceof FormData?t.headers.delete("Content-Type"):m(t.body)&&t.emulateJSON&&(t.body=$.params(t.body),t.headers.set("Content-Type","application/x-www-form-urlencoded"))},header:function(t){g(w({},N.headers.common,t.crossOrigin?{}:N.headers.custom,N.headers[p(t.method)]),function(e,n){t.headers.has(n)||t.headers.set(n,e)})},cors:function(t){if(c){var e=$.parse(location.href),n=$.parse(t.getUrl());n.protocol===e.protocol&&n.host===e.host||(t.crossOrigin=!0,t.emulateHTTP=!1,R||(t.client=U))}}},N.interceptors=["before","method","jsonp","json","form","header","cors"],["get","delete","head","jsonp"].forEach(function(t){N[t]=function(e,n){return this(w(n||{},{url:e,method:t}))}}),["post","put","patch"].forEach(function(t){N[t]=function(e,n,o){return this(w(o||{},{url:e,method:t,body:n}))}}),D.actions={get:{method:"GET"},save:{method:"POST"},query:{method:"GET"},update:{method:"PUT"},remove:{method:"DELETE"},delete:{method:"DELETE"}},"undefined"!=typeof window&&window.Vue&&window.Vue.use(J),J});
\ No newline at end of file
diff --git a/advancedcontentfilter/vendor/asset/vue-resource/src/http/client/index.js b/advancedcontentfilter/vendor/asset/vue-resource/src/http/client/index.js
new file mode 100644 (file)
index 0000000..56cd599
--- /dev/null
@@ -0,0 +1,65 @@
+/**
+ * Base client.
+ */
+
+import Promise from '../../promise';
+import xhrClient from './xhr';
+import nodeClient from './node';
+import {warn, when, isObject, isFunction, inBrowser} from '../../util';
+
+export default function (context) {
+
+    const reqHandlers = [sendRequest], resHandlers = [];
+
+    if (!isObject(context)) {
+        context = null;
+    }
+
+    function Client(request) {
+        while (reqHandlers.length) {
+
+            const handler = reqHandlers.pop();
+
+            if (isFunction(handler)) {
+
+                let response, next;
+
+                response = handler.call(context, request, val => next = val) || next;
+
+                if (isObject(response)) {
+                    return new Promise((resolve, reject) => {
+
+                        resHandlers.forEach(handler => {
+                            response = when(response, response => {
+                                return handler.call(context, response) || response;
+                            }, reject);
+                        });
+
+                        when(response, resolve, reject);
+
+                    }, context);
+                }
+
+                if (isFunction(response)) {
+                    resHandlers.unshift(response);
+                }
+
+            } else {
+                warn(`Invalid interceptor of type ${typeof handler}, must be a function`);
+            }
+        }
+    }
+
+    Client.use = handler => {
+        reqHandlers.push(handler);
+    };
+
+    return Client;
+}
+
+function sendRequest(request) {
+
+    const client = request.client || (inBrowser ? xhrClient : nodeClient);
+
+    return client(request);
+}
diff --git a/advancedcontentfilter/vendor/asset/vue-resource/src/http/client/jsonp.js b/advancedcontentfilter/vendor/asset/vue-resource/src/http/client/jsonp.js
new file mode 100644 (file)
index 0000000..241e7b4
--- /dev/null
@@ -0,0 +1,53 @@
+/**
+ * JSONP client (Browser).
+ */
+
+import Promise from '../../promise';
+
+export default function (request) {
+    return new Promise(resolve => {
+
+        var name = request.jsonp || 'callback', callback = request.jsonpCallback || '_jsonp' + Math.random().toString(36).substr(2), body = null, handler, script;
+
+        handler = ({type}) => {
+
+            var status = 0;
+
+            if (type === 'load' && body !== null) {
+                status = 200;
+            } else if (type === 'error') {
+                status = 500;
+            }
+
+            if (status && window[callback]) {
+                delete window[callback];
+                document.body.removeChild(script);
+            }
+
+            resolve(request.respondWith(body, {status}));
+        };
+
+        window[callback] = result => {
+            body = JSON.stringify(result);
+        };
+
+        request.abort = () => {
+            handler({type: 'abort'});
+        };
+
+        request.params[name] = callback;
+
+        if (request.timeout) {
+            setTimeout(request.abort, request.timeout);
+        }
+
+        script = document.createElement('script');
+        script.src = request.getUrl();
+        script.type = 'text/javascript';
+        script.async = true;
+        script.onload = handler;
+        script.onerror = handler;
+
+        document.body.appendChild(script);
+    });
+}
diff --git a/advancedcontentfilter/vendor/asset/vue-resource/src/http/client/node.js b/advancedcontentfilter/vendor/asset/vue-resource/src/http/client/node.js
new file mode 100644 (file)
index 0000000..d12b33e
--- /dev/null
@@ -0,0 +1,38 @@
+/**
+ * Http client (Node).
+ */
+
+import Promise from '../../promise';
+import {each, trim} from '../../util';
+
+export default function (request) {
+
+    const client = require('got');
+
+    return new Promise(resolve => {
+
+        var url = request.getUrl();
+        var body = request.getBody();
+        var method = request.method;
+        var headers = {}, handler;
+
+        request.headers.forEach((value, name) => {
+            headers[name] = value;
+        });
+
+        client(url, {body, method, headers}).then(handler = (resp) => {
+
+            var response = request.respondWith(resp.body, {
+                status: resp.statusCode,
+                statusText: trim(resp.statusMessage)
+            });
+
+            each(resp.headers, (value, name) => {
+                response.headers.set(name, value);
+            });
+
+            resolve(response);
+
+        }, error => handler(error.response));
+    });
+}
diff --git a/advancedcontentfilter/vendor/asset/vue-resource/src/http/client/xdr.js b/advancedcontentfilter/vendor/asset/vue-resource/src/http/client/xdr.js
new file mode 100644 (file)
index 0000000..20656c7
--- /dev/null
@@ -0,0 +1,38 @@
+/**
+ * XDomain client (Internet Explorer).
+ */
+
+import Promise from '../../promise';
+
+export default function (request) {
+    return new Promise(resolve => {
+
+        var xdr = new XDomainRequest(), handler = ({type}) => {
+
+                var status = 0;
+
+                if (type === 'load') {
+                    status = 200;
+                } else if (type === 'error') {
+                    status = 500;
+                }
+
+                resolve(request.respondWith(xdr.responseText, {status}));
+            };
+
+        request.abort = () => xdr.abort();
+
+        xdr.open(request.method, request.getUrl());
+
+        if (request.timeout) {
+            xdr.timeout = request.timeout;
+        }
+
+        xdr.onload = handler;
+        xdr.onabort = handler;
+        xdr.onerror = handler;
+        xdr.ontimeout = handler;
+        xdr.onprogress = () => {};
+        xdr.send(request.getBody());
+    });
+}
diff --git a/advancedcontentfilter/vendor/asset/vue-resource/src/http/client/xhr.js b/advancedcontentfilter/vendor/asset/vue-resource/src/http/client/xhr.js
new file mode 100644 (file)
index 0000000..cc77187
--- /dev/null
@@ -0,0 +1,74 @@
+/**
+ * XMLHttp client (Browser).
+ */
+
+import Promise from '../../promise';
+import {each, trim, isFunction} from '../../util';
+
+export default function (request) {
+    return new Promise(resolve => {
+
+        var xhr = new XMLHttpRequest(), handler = (event) => {
+
+                var response = request.respondWith(
+                'response' in xhr ? xhr.response : xhr.responseText, {
+                    status: xhr.status === 1223 ? 204 : xhr.status, // IE9 status bug
+                    statusText: xhr.status === 1223 ? 'No Content' : trim(xhr.statusText)
+                });
+
+                each(trim(xhr.getAllResponseHeaders()).split('\n'), row => {
+                    response.headers.append(row.slice(0, row.indexOf(':')), row.slice(row.indexOf(':') + 1));
+                });
+
+                resolve(response);
+            };
+
+        request.abort = () => xhr.abort();
+
+        xhr.open(request.method, request.getUrl(), true);
+
+        if (request.timeout) {
+            xhr.timeout = request.timeout;
+        }
+
+        if (request.responseType && 'responseType' in xhr) {
+            xhr.responseType = request.responseType;
+        }
+
+        if (request.withCredentials || request.credentials) {
+            xhr.withCredentials = true;
+        }
+
+        if (!request.crossOrigin) {
+            request.headers.set('X-Requested-With', 'XMLHttpRequest');
+        }
+
+        // deprecated use downloadProgress
+        if (isFunction(request.progress) && request.method === 'GET') {
+            xhr.addEventListener('progress', request.progress);
+        }
+
+        if (isFunction(request.downloadProgress)) {
+            xhr.addEventListener('progress', request.downloadProgress);
+        }
+
+        // deprecated use uploadProgress
+        if (isFunction(request.progress) && /^(POST|PUT)$/i.test(request.method)) {
+            xhr.upload.addEventListener('progress', request.progress);
+        }
+
+        if (isFunction(request.uploadProgress) && xhr.upload) {
+            xhr.upload.addEventListener('progress', request.uploadProgress);
+        }
+
+        request.headers.forEach((value, name) => {
+            xhr.setRequestHeader(name, value);
+        });
+
+        xhr.onload = handler;
+        xhr.onabort = handler;
+        xhr.onerror = handler;
+        xhr.ontimeout = handler;
+        xhr.send(request.getBody());
+    });
+}
diff --git a/advancedcontentfilter/vendor/asset/vue-resource/src/http/headers.js b/advancedcontentfilter/vendor/asset/vue-resource/src/http/headers.js
new file mode 100644 (file)
index 0000000..5c3e404
--- /dev/null
@@ -0,0 +1,75 @@
+/**
+ * HTTP Headers.
+ */
+
+import {each, trim, toLower} from '../util';
+
+export default class Headers {
+
+    constructor(headers) {
+
+        this.map = {};
+
+        each(headers, (value, name) => this.append(name, value));
+    }
+
+    has(name) {
+        return getName(this.map, name) !== null;
+    }
+
+    get(name) {
+
+        var list = this.map[getName(this.map, name)];
+
+        return list ? list.join() : null;
+    }
+
+    getAll(name) {
+        return this.map[getName(this.map, name)] || [];
+    }
+
+    set(name, value) {
+        this.map[normalizeName(getName(this.map, name) || name)] = [trim(value)];
+    }
+
+    append(name, value) {
+
+        var list = this.map[getName(this.map, name)];
+
+        if (list) {
+            list.push(trim(value));
+        } else {
+            this.set(name, value);
+        }
+    }
+
+    delete(name) {
+        delete this.map[getName(this.map, name)];
+    }
+
+    deleteAll() {
+        this.map = {};
+    }
+
+    forEach(callback, thisArg) {
+        each(this.map, (list, name) => {
+            each(list, value => callback.call(thisArg, value, name, this));
+        });
+    }
+
+}
+
+function getName(map, name) {
+    return Object.keys(map).reduce((prev, curr) => {
+        return toLower(name) === toLower(curr) ? curr : prev;
+    }, null);
+}
+
+function normalizeName(name) {
+
+    if (/[^a-z0-9\-#$%&'*+.^_`|~]/i.test(name)) {
+        throw new TypeError('Invalid character in header field name');
+    }
+
+    return trim(name);
+}
diff --git a/advancedcontentfilter/vendor/asset/vue-resource/src/http/index.js b/advancedcontentfilter/vendor/asset/vue-resource/src/http/index.js
new file mode 100644 (file)
index 0000000..df4743d
--- /dev/null
@@ -0,0 +1,80 @@
+/**
+ * Service for sending network requests.
+ */
+
+const COMMON_HEADERS = {'Accept': 'application/json, text/plain, */*'};
+const JSON_CONTENT_TYPE = {'Content-Type': 'application/json;charset=utf-8'};
+
+import cors from './interceptor/cors';
+import form from './interceptor/form';
+import json from './interceptor/json';
+import jsonp from './interceptor/jsonp';
+import before from './interceptor/before';
+import method from './interceptor/method';
+import header from './interceptor/header';
+import Client from './client/index';
+import Request from './request';
+import Promise from '../promise';
+import {assign, defaults, error, isString, isFunction} from '../util';
+
+export default function Http(options) {
+
+    var self = this || {}, client = Client(self.$vm);
+
+    defaults(options || {}, self.$options, Http.options);
+
+    Http.interceptors.forEach(handler => {
+
+        if (isString(handler)) {
+            handler = Http.interceptor[handler];
+        }
+
+        if (isFunction(handler)) {
+            client.use(handler);
+        }
+
+    });
+
+    return client(new Request(options)).then(response => {
+
+        return response.ok ? response : Promise.reject(response);
+
+    }, response => {
+
+        if (response instanceof Error) {
+            error(response);
+        }
+
+        return Promise.reject(response);
+    });
+}
+
+Http.options = {};
+
+Http.headers = {
+    put: JSON_CONTENT_TYPE,
+    post: JSON_CONTENT_TYPE,
+    patch: JSON_CONTENT_TYPE,
+    delete: JSON_CONTENT_TYPE,
+    common: COMMON_HEADERS,
+    custom: {}
+};
+
+Http.interceptor = {before, method, jsonp, json, form, header, cors};
+Http.interceptors = ['before', 'method', 'jsonp', 'json', 'form', 'header', 'cors'];
+
+['get', 'delete', 'head', 'jsonp'].forEach(method => {
+
+    Http[method] = function (url, options) {
+        return this(assign(options || {}, {url, method}));
+    };
+
+});
+
+['post', 'put', 'patch'].forEach(method => {
+
+    Http[method] = function (url, body, options) {
+        return this(assign(options || {}, {url, method, body}));
+    };
+
+});
diff --git a/advancedcontentfilter/vendor/asset/vue-resource/src/http/interceptor/before.js b/advancedcontentfilter/vendor/asset/vue-resource/src/http/interceptor/before.js
new file mode 100644 (file)
index 0000000..d45c27c
--- /dev/null
@@ -0,0 +1,13 @@
+/**
+ * Before Interceptor.
+ */
+
+import {isFunction} from '../../util';
+
+export default function (request) {
+
+    if (isFunction(request.before)) {
+        request.before.call(this, request);
+    }
+
+}
diff --git a/advancedcontentfilter/vendor/asset/vue-resource/src/http/interceptor/cors.js b/advancedcontentfilter/vendor/asset/vue-resource/src/http/interceptor/cors.js
new file mode 100644 (file)
index 0000000..5146f70
--- /dev/null
@@ -0,0 +1,29 @@
+/**
+ * CORS Interceptor.
+ */
+
+import Url from '../../url/index';
+import xdrClient from '../client/xdr';
+import {inBrowser} from '../../util';
+
+const SUPPORTS_CORS = inBrowser && 'withCredentials' in new XMLHttpRequest();
+
+export default function (request) {
+
+    if (inBrowser) {
+
+        const orgUrl = Url.parse(location.href);
+        const reqUrl = Url.parse(request.getUrl());
+
+        if (reqUrl.protocol !== orgUrl.protocol || reqUrl.host !== orgUrl.host) {
+
+            request.crossOrigin = true;
+            request.emulateHTTP = false;
+
+            if (!SUPPORTS_CORS) {
+                request.client = xdrClient;
+            }
+        }
+    }
+
+}
diff --git a/advancedcontentfilter/vendor/asset/vue-resource/src/http/interceptor/form.js b/advancedcontentfilter/vendor/asset/vue-resource/src/http/interceptor/form.js
new file mode 100644 (file)
index 0000000..8ff3090
--- /dev/null
@@ -0,0 +1,17 @@
+/**
+ * Form data Interceptor.
+ */
+
+import Url from '../../url/index';
+import {isObject, isFormData} from '../../util';
+
+export default function (request) {
+
+    if (isFormData(request.body)) {
+        request.headers.delete('Content-Type');
+    } else if (isObject(request.body) && request.emulateJSON) {
+        request.body = Url.params(request.body);
+        request.headers.set('Content-Type', 'application/x-www-form-urlencoded');
+    }
+
+}
diff --git a/advancedcontentfilter/vendor/asset/vue-resource/src/http/interceptor/header.js b/advancedcontentfilter/vendor/asset/vue-resource/src/http/interceptor/header.js
new file mode 100644 (file)
index 0000000..e71c674
--- /dev/null
@@ -0,0 +1,21 @@
+/**
+ * Header Interceptor.
+ */
+
+import Http from '../index';
+import {assign, each, toLower} from '../../util';
+
+export default function (request) {
+
+    const headers = assign({}, Http.headers.common,
+        !request.crossOrigin ? Http.headers.custom : {},
+        Http.headers[toLower(request.method)]
+    );
+
+    each(headers, (value, name) => {
+        if (!request.headers.has(name)) {
+            request.headers.set(name, value);
+        }
+    });
+
+}
diff --git a/advancedcontentfilter/vendor/asset/vue-resource/src/http/interceptor/json.js b/advancedcontentfilter/vendor/asset/vue-resource/src/http/interceptor/json.js
new file mode 100644 (file)
index 0000000..74ca4cf
--- /dev/null
@@ -0,0 +1,46 @@
+/**
+ * JSON Interceptor.
+ */
+
+import {when, isObject} from '../../util';
+
+export default function (request) {
+
+    const type = request.headers.get('Content-Type') || '';
+
+    if (isObject(request.body) && type.indexOf('application/json') === 0) {
+        request.body = JSON.stringify(request.body);
+    }
+
+    return response => {
+
+        return response.bodyText ? when(response.text(), text => {
+
+            const type = response.headers.get('Content-Type') || '';
+
+            if (type.indexOf('application/json') === 0 || isJson(text)) {
+
+                try {
+                    response.body = JSON.parse(text);
+                } catch (e) {
+                    response.body = null;
+                }
+
+            } else {
+                response.body = text;
+            }
+
+            return response;
+
+        }) : response;
+
+    };
+}
+
+function isJson(str) {
+
+    const start = str.match(/^\s*(\[|\{)/);
+    const end = {'[': /]\s*$/, '{': /}\s*$/};
+
+    return start && end[start[1]].test(str);
+}
diff --git a/advancedcontentfilter/vendor/asset/vue-resource/src/http/interceptor/jsonp.js b/advancedcontentfilter/vendor/asset/vue-resource/src/http/interceptor/jsonp.js
new file mode 100644 (file)
index 0000000..9320229
--- /dev/null
@@ -0,0 +1,13 @@
+/**
+ * JSONP Interceptor.
+ */
+
+import jsonpClient from '../client/jsonp';
+
+export default function (request) {
+
+    if (request.method == 'JSONP') {
+        request.client = jsonpClient;
+    }
+
+}
diff --git a/advancedcontentfilter/vendor/asset/vue-resource/src/http/interceptor/method.js b/advancedcontentfilter/vendor/asset/vue-resource/src/http/interceptor/method.js
new file mode 100644 (file)
index 0000000..ac088b8
--- /dev/null
@@ -0,0 +1,12 @@
+/**
+ * HTTP method override Interceptor.
+ */
+
+export default function (request) {
+
+    if (request.emulateHTTP && /^(PUT|PATCH|DELETE)$/i.test(request.method)) {
+        request.headers.set('X-HTTP-Method-Override', request.method);
+        request.method = 'POST';
+    }
+
+}
diff --git a/advancedcontentfilter/vendor/asset/vue-resource/src/http/request.js b/advancedcontentfilter/vendor/asset/vue-resource/src/http/request.js
new file mode 100644 (file)
index 0000000..d0298e4
--- /dev/null
@@ -0,0 +1,38 @@
+/**
+ * HTTP Request.
+ */
+
+import Url from '../url/index';
+import Headers from './headers';
+import Response from './response';
+import {assign, toUpper} from '../util';
+
+export default class Request {
+
+    constructor(options) {
+
+        this.body = null;
+        this.params = {};
+
+        assign(this, options, {
+            method: toUpper(options.method || 'GET')
+        });
+
+        if (!(this.headers instanceof Headers)) {
+            this.headers = new Headers(this.headers);
+        }
+    }
+
+    getUrl() {
+        return Url(this);
+    }
+
+    getBody() {
+        return this.body;
+    }
+
+    respondWith(body, options) {
+        return new Response(body, assign(options || {}, {url: this.getUrl()}));
+    }
+
+}
diff --git a/advancedcontentfilter/vendor/asset/vue-resource/src/http/response.js b/advancedcontentfilter/vendor/asset/vue-resource/src/http/response.js
new file mode 100644 (file)
index 0000000..d397a5a
--- /dev/null
@@ -0,0 +1,75 @@
+/**
+ * HTTP Response.
+ */
+
+import Headers from './headers';
+import Promise from '../promise';
+import {when, isBlob, isString} from '../util';
+
+export default class Response {
+
+    constructor(body, {url, headers, status, statusText}) {
+
+        this.url = url;
+        this.ok = status >= 200 && status < 300;
+        this.status = status || 0;
+        this.statusText = statusText || '';
+        this.headers = new Headers(headers);
+        this.body = body;
+
+        if (isString(body)) {
+
+            this.bodyText = body;
+
+        } else if (isBlob(body)) {
+
+            this.bodyBlob = body;
+
+            if (isBlobText(body)) {
+                this.bodyText = blobText(body);
+            }
+        }
+    }
+
+    blob() {
+        return when(this.bodyBlob);
+    }
+
+    text() {
+        return when(this.bodyText);
+    }
+
+    json() {
+        return when(this.text(), text => JSON.parse(text));
+    }
+
+}
+
+Object.defineProperty(Response.prototype, 'data', {
+
+    get() {
+        return this.body;
+    },
+
+    set(body) {
+        this.body = body;
+    }
+
+});
+
+function blobText(body) {
+    return new Promise((resolve) => {
+
+        var reader = new FileReader();
+
+        reader.readAsText(body);
+        reader.onload = () => {
+            resolve(reader.result);
+        };
+
+    });
+}
+
+function isBlobText(body) {
+    return body.type.indexOf('text') === 0 || body.type.indexOf('json') !== -1;
+}
diff --git a/advancedcontentfilter/vendor/asset/vue-resource/src/index.js b/advancedcontentfilter/vendor/asset/vue-resource/src/index.js
new file mode 100644 (file)
index 0000000..7308dee
--- /dev/null
@@ -0,0 +1,57 @@
+/**
+ * Install plugin.
+ */
+
+import Url from './url/index';
+import Http from './http/index';
+import Promise from './promise';
+import Resource from './resource';
+import Util, {options} from './util';
+
+function plugin(Vue) {
+
+    if (plugin.installed) {
+        return;
+    }
+
+    Util(Vue);
+
+    Vue.url = Url;
+    Vue.http = Http;
+    Vue.resource = Resource;
+    Vue.Promise = Promise;
+
+    Object.defineProperties(Vue.prototype, {
+
+        $url: {
+            get() {
+                return options(Vue.url, this, this.$options.url);
+            }
+        },
+
+        $http: {
+            get() {
+                return options(Vue.http, this, this.$options.http);
+            }
+        },
+
+        $resource: {
+            get() {
+                return Vue.resource.bind(this);
+            }
+        },
+
+        $promise: {
+            get() {
+                return (executor) => new Vue.Promise(executor, this);
+            }
+        }
+
+    });
+}
+
+if (typeof window !== 'undefined' && window.Vue) {
+    window.Vue.use(plugin);
+}
+
+export default plugin;
diff --git a/advancedcontentfilter/vendor/asset/vue-resource/src/lib/promise.js b/advancedcontentfilter/vendor/asset/vue-resource/src/lib/promise.js
new file mode 100644 (file)
index 0000000..b3cce74
--- /dev/null
@@ -0,0 +1,177 @@
+/**
+ * Promises/A+ polyfill v1.1.4 (https://github.com/bramstein/promis)
+ */
+
+const RESOLVED = 0;
+const REJECTED = 1;
+const PENDING = 2;
+
+import {nextTick} from '../util';
+
+export default function Promise(executor) {
+
+    this.state = PENDING;
+    this.value = undefined;
+    this.deferred = [];
+
+    var promise = this;
+
+    try {
+        executor(function (x) {
+            promise.resolve(x);
+        }, function (r) {
+            promise.reject(r);
+        });
+    } catch (e) {
+        promise.reject(e);
+    }
+}
+
+Promise.reject = function (r) {
+    return new Promise(function (resolve, reject) {
+        reject(r);
+    });
+};
+
+Promise.resolve = function (x) {
+    return new Promise(function (resolve, reject) {
+        resolve(x);
+    });
+};
+
+Promise.all = function all(iterable) {
+    return new Promise(function (resolve, reject) {
+        var count = 0, result = [];
+
+        if (iterable.length === 0) {
+            resolve(result);
+        }
+
+        function resolver(i) {
+            return function (x) {
+                result[i] = x;
+                count += 1;
+
+                if (count === iterable.length) {
+                    resolve(result);
+                }
+            };
+        }
+
+        for (var i = 0; i < iterable.length; i += 1) {
+            Promise.resolve(iterable[i]).then(resolver(i), reject);
+        }
+    });
+};
+
+Promise.race = function race(iterable) {
+    return new Promise(function (resolve, reject) {
+        for (var i = 0; i < iterable.length; i += 1) {
+            Promise.resolve(iterable[i]).then(resolve, reject);
+        }
+    });
+};
+
+var p = Promise.prototype;
+
+p.resolve = function resolve(x) {
+    var promise = this;
+
+    if (promise.state === PENDING) {
+        if (x === promise) {
+            throw new TypeError('Promise settled with itself.');
+        }
+
+        var called = false;
+
+        try {
+            var then = x && x['then'];
+
+            if (x !== null && typeof x === 'object' && typeof then === 'function') {
+                then.call(x, function (x) {
+                    if (!called) {
+                        promise.resolve(x);
+                    }
+                    called = true;
+
+                }, function (r) {
+                    if (!called) {
+                        promise.reject(r);
+                    }
+                    called = true;
+                });
+                return;
+            }
+        } catch (e) {
+            if (!called) {
+                promise.reject(e);
+            }
+            return;
+        }
+
+        promise.state = RESOLVED;
+        promise.value = x;
+        promise.notify();
+    }
+};
+
+p.reject = function reject(reason) {
+    var promise = this;
+
+    if (promise.state === PENDING) {
+        if (reason === promise) {
+            throw new TypeError('Promise settled with itself.');
+        }
+
+        promise.state = REJECTED;
+        promise.value = reason;
+        promise.notify();
+    }
+};
+
+p.notify = function notify() {
+    var promise = this;
+
+    nextTick(function () {
+        if (promise.state !== PENDING) {
+            while (promise.deferred.length) {
+                var deferred = promise.deferred.shift(),
+                    onResolved = deferred[0],
+                    onRejected = deferred[1],
+                    resolve = deferred[2],
+                    reject = deferred[3];
+
+                try {
+                    if (promise.state === RESOLVED) {
+                        if (typeof onResolved === 'function') {
+                            resolve(onResolved.call(undefined, promise.value));
+                        } else {
+                            resolve(promise.value);
+                        }
+                    } else if (promise.state === REJECTED) {
+                        if (typeof onRejected === 'function') {
+                            resolve(onRejected.call(undefined, promise.value));
+                        } else {
+                            reject(promise.value);
+                        }
+                    }
+                } catch (e) {
+                    reject(e);
+                }
+            }
+        }
+    });
+};
+
+p.then = function then(onResolved, onRejected) {
+    var promise = this;
+
+    return new Promise(function (resolve, reject) {
+        promise.deferred.push([onResolved, onRejected, resolve, reject]);
+        promise.notify();
+    });
+};
+
+p.catch = function (onRejected) {
+    return this.then(undefined, onRejected);
+};
diff --git a/advancedcontentfilter/vendor/asset/vue-resource/src/lib/url-template.js b/advancedcontentfilter/vendor/asset/vue-resource/src/lib/url-template.js
new file mode 100644 (file)
index 0000000..189d48d
--- /dev/null
@@ -0,0 +1,150 @@
+/**
+ * URL Template v2.0.6 (https://github.com/bramstein/url-template)
+ */
+
+export function expand(url, params, variables) {
+
+    var tmpl = parse(url), expanded = tmpl.expand(params);
+
+    if (variables) {
+        variables.push.apply(variables, tmpl.vars);
+    }
+
+    return expanded;
+}
+
+export function parse(template) {
+
+    var operators = ['+', '#', '.', '/', ';', '?', '&'], variables = [];
+
+    return {
+        vars: variables,
+        expand(context) {
+            return template.replace(/\{([^{}]+)\}|([^{}]+)/g, (_, expression, literal) => {
+                if (expression) {
+
+                    var operator = null, values = [];
+
+                    if (operators.indexOf(expression.charAt(0)) !== -1) {
+                        operator = expression.charAt(0);
+                        expression = expression.substr(1);
+                    }
+
+                    expression.split(/,/g).forEach((variable) => {
+                        var tmp = /([^:*]*)(?::(\d+)|(\*))?/.exec(variable);
+                        values.push.apply(values, getValues(context, operator, tmp[1], tmp[2] || tmp[3]));
+                        variables.push(tmp[1]);
+                    });
+
+                    if (operator && operator !== '+') {
+
+                        var separator = ',';
+
+                        if (operator === '?') {
+                            separator = '&';
+                        } else if (operator !== '#') {
+                            separator = operator;
+                        }
+
+                        return (values.length !== 0 ? operator : '') + values.join(separator);
+                    } else {
+                        return values.join(',');
+                    }
+
+                } else {
+                    return encodeReserved(literal);
+                }
+            });
+        }
+    };
+}
+
+function getValues(context, operator, key, modifier) {
+
+    var value = context[key], result = [];
+
+    if (isDefined(value) && value !== '') {
+        if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {
+            value = value.toString();
+
+            if (modifier && modifier !== '*') {
+                value = value.substring(0, parseInt(modifier, 10));
+            }
+
+            result.push(encodeValue(operator, value, isKeyOperator(operator) ? key : null));
+        } else {
+            if (modifier === '*') {
+                if (Array.isArray(value)) {
+                    value.filter(isDefined).forEach((value) => {
+                        result.push(encodeValue(operator, value, isKeyOperator(operator) ? key : null));
+                    });
+                } else {
+                    Object.keys(value).forEach((k) => {
+                        if (isDefined(value[k])) {
+                            result.push(encodeValue(operator, value[k], k));
+                        }
+                    });
+                }
+            } else {
+                var tmp = [];
+
+                if (Array.isArray(value)) {
+                    value.filter(isDefined).forEach((value) => {
+                        tmp.push(encodeValue(operator, value));
+                    });
+                } else {
+                    Object.keys(value).forEach((k) => {
+                        if (isDefined(value[k])) {
+                            tmp.push(encodeURIComponent(k));
+                            tmp.push(encodeValue(operator, value[k].toString()));
+                        }
+                    });
+                }
+
+                if (isKeyOperator(operator)) {
+                    result.push(encodeURIComponent(key) + '=' + tmp.join(','));
+                } else if (tmp.length !== 0) {
+                    result.push(tmp.join(','));
+                }
+            }
+        }
+    } else {
+        if (operator === ';') {
+            result.push(encodeURIComponent(key));
+        } else if (value === '' && (operator === '&' || operator === '?')) {
+            result.push(encodeURIComponent(key) + '=');
+        } else if (value === '') {
+            result.push('');
+        }
+    }
+
+    return result;
+}
+
+function isDefined(value) {
+    return value !== undefined && value !== null;
+}
+
+function isKeyOperator(operator) {
+    return operator === ';' || operator === '&' || operator === '?';
+}
+
+function encodeValue(operator, value, key) {
+
+    value = (operator === '+' || operator === '#') ? encodeReserved(value) : encodeURIComponent(value);
+
+    if (key) {
+        return encodeURIComponent(key) + '=' + value;
+    } else {
+        return value;
+    }
+}
+
+function encodeReserved(str) {
+    return str.split(/(%[0-9A-Fa-f]{2})/g).map((part) => {
+        if (!/%[0-9A-Fa-f]/.test(part)) {
+            part = encodeURI(part);
+        }
+        return part;
+    }).join('');
+}
diff --git a/advancedcontentfilter/vendor/asset/vue-resource/src/promise.js b/advancedcontentfilter/vendor/asset/vue-resource/src/promise.js
new file mode 100644 (file)
index 0000000..7311f08
--- /dev/null
@@ -0,0 +1,77 @@
+/**
+ * Promise adapter.
+ */
+
+import PromiseLib from './lib/promise';
+
+if (typeof Promise === 'undefined') {
+    window.Promise = PromiseLib;
+}
+
+export default function PromiseObj(executor, context) {
+
+    if (executor instanceof Promise) {
+        this.promise = executor;
+    } else {
+        this.promise = new Promise(executor.bind(context));
+    }
+
+    this.context = context;
+}
+
+PromiseObj.all = function (iterable, context) {
+    return new PromiseObj(Promise.all(iterable), context);
+};
+
+PromiseObj.resolve = function (value, context) {
+    return new PromiseObj(Promise.resolve(value), context);
+};
+
+PromiseObj.reject = function (reason, context) {
+    return new PromiseObj(Promise.reject(reason), context);
+};
+
+PromiseObj.race = function (iterable, context) {
+    return new PromiseObj(Promise.race(iterable), context);
+};
+
+var p = PromiseObj.prototype;
+
+p.bind = function (context) {
+    this.context = context;
+    return this;
+};
+
+p.then = function (fulfilled, rejected) {
+
+    if (fulfilled && fulfilled.bind && this.context) {
+        fulfilled = fulfilled.bind(this.context);
+    }
+
+    if (rejected && rejected.bind && this.context) {
+        rejected = rejected.bind(this.context);
+    }
+
+    return new PromiseObj(this.promise.then(fulfilled, rejected), this.context);
+};
+
+p.catch = function (rejected) {
+
+    if (rejected && rejected.bind && this.context) {
+        rejected = rejected.bind(this.context);
+    }
+
+    return new PromiseObj(this.promise.catch(rejected), this.context);
+};
+
+p.finally = function (callback) {
+
+    return this.then(function (value) {
+        callback.call(this);
+        return value;
+    }, function (reason) {
+        callback.call(this);
+        return Promise.reject(reason);
+    }
+    );
+};
diff --git a/advancedcontentfilter/vendor/asset/vue-resource/src/resource.js b/advancedcontentfilter/vendor/asset/vue-resource/src/resource.js
new file mode 100644 (file)
index 0000000..f99e42b
--- /dev/null
@@ -0,0 +1,76 @@
+/**
+ * Service for interacting with RESTful services.
+ */
+
+import Http from './http/index';
+import {assign, each, merge} from './util';
+
+export default function Resource(url, params, actions, options) {
+
+    var self = this || {}, resource = {};
+
+    actions = assign({},
+        Resource.actions,
+        actions
+    );
+
+    each(actions, (action, name) => {
+
+        action = merge({url, params: assign({}, params)}, options, action);
+
+        resource[name] = function () {
+            return (self.$http || Http)(opts(action, arguments));
+        };
+    });
+
+    return resource;
+}
+
+function opts(action, args) {
+
+    var options = assign({}, action), params = {}, body;
+
+    switch (args.length) {
+
+        case 2:
+
+            params = args[0];
+            body = args[1];
+
+            break;
+
+        case 1:
+
+            if (/^(POST|PUT|PATCH)$/i.test(options.method)) {
+                body = args[0];
+            } else {
+                params = args[0];
+            }
+
+            break;
+
+        case 0:
+
+            break;
+
+        default:
+
+            throw 'Expected up to 2 arguments [params, body], got ' + args.length + ' arguments';
+    }
+
+    options.body = body;
+    options.params = assign({}, options.params, params);
+
+    return options;
+}
+
+Resource.actions = {
+
+    get: {method: 'GET'},
+    save: {method: 'POST'},
+    query: {method: 'GET'},
+    update: {method: 'PUT'},
+    remove: {method: 'DELETE'},
+    delete: {method: 'DELETE'}
+
+};
diff --git a/advancedcontentfilter/vendor/asset/vue-resource/src/url/index.js b/advancedcontentfilter/vendor/asset/vue-resource/src/url/index.js
new file mode 100644 (file)
index 0000000..c4963b9
--- /dev/null
@@ -0,0 +1,135 @@
+/**
+ * Service for URL templating.
+ */
+
+import root from './root';
+import query from './query';
+import template from './template';
+import {each, merge, isArray, isFunction, isObject, isPlainObject, isString} from '../util';
+
+export default function Url(url, params) {
+
+    var self = this || {}, options = url, transform;
+
+    if (isString(url)) {
+        options = {url, params};
+    }
+
+    options = merge({}, Url.options, self.$options, options);
+
+    Url.transforms.forEach(handler => {
+
+        if (isString(handler)) {
+            handler = Url.transform[handler];
+        }
+
+        if (isFunction(handler)) {
+            transform = factory(handler, transform, self.$vm);
+        }
+
+    });
+
+    return transform(options);
+}
+
+/**
+ * Url options.
+ */
+
+Url.options = {
+    url: '',
+    root: null,
+    params: {}
+};
+
+/**
+ * Url transforms.
+ */
+
+Url.transform = {template, query, root};
+Url.transforms = ['template', 'query', 'root'];
+
+/**
+ * Encodes a Url parameter string.
+ *
+ * @param {Object} obj
+ */
+
+Url.params = function (obj) {
+
+    var params = [], escape = encodeURIComponent;
+
+    params.add = function (key, value) {
+
+        if (isFunction(value)) {
+            value = value();
+        }
+
+        if (value === null) {
+            value = '';
+        }
+
+        this.push(escape(key) + '=' + escape(value));
+    };
+
+    serialize(params, obj);
+
+    return params.join('&').replace(/%20/g, '+');
+};
+
+/**
+ * Parse a URL and return its components.
+ *
+ * @param {String} url
+ */
+
+Url.parse = function (url) {
+
+    var el = document.createElement('a');
+
+    if (document.documentMode) {
+        el.href = url;
+        url = el.href;
+    }
+
+    el.href = url;
+
+    return {
+        href: el.href,
+        protocol: el.protocol ? el.protocol.replace(/:$/, '') : '',
+        port: el.port,
+        host: el.host,
+        hostname: el.hostname,
+        pathname: el.pathname.charAt(0) === '/' ? el.pathname : '/' + el.pathname,
+        search: el.search ? el.search.replace(/^\?/, '') : '',
+        hash: el.hash ? el.hash.replace(/^#/, '') : ''
+    };
+};
+
+function factory(handler, next, vm) {
+    return options => {
+        return handler.call(vm, options, next);
+    };
+}
+
+function serialize(params, obj, scope) {
+
+    var array = isArray(obj), plain = isPlainObject(obj), hash;
+
+    each(obj, (value, key) => {
+
+        hash = isObject(value) || isArray(value);
+
+        if (scope) {
+            key = scope + '[' + (plain || hash ? key : '') + ']';
+        }
+
+        if (!scope && array) {
+            params.add(value.name, value.value);
+        } else if (hash) {
+            serialize(params, value, key);
+        } else {
+            params.add(key, value);
+        }
+    });
+}
diff --git a/advancedcontentfilter/vendor/asset/vue-resource/src/url/query.js b/advancedcontentfilter/vendor/asset/vue-resource/src/url/query.js
new file mode 100644 (file)
index 0000000..627bbc8
--- /dev/null
@@ -0,0 +1,25 @@
+/**
+ * Query Parameter Transform.
+ */
+
+import Url from './index';
+import {each} from '../util';
+
+export default function (options, next) {
+
+    var urlParams = Object.keys(Url.options.params), query = {}, url = next(options);
+
+    each(options.params, (value, key) => {
+        if (urlParams.indexOf(key) === -1) {
+            query[key] = value;
+        }
+    });
+
+    query = Url.params(query);
+
+    if (query) {
+        url += (url.indexOf('?') == -1 ? '?' : '&') + query;
+    }
+
+    return url;
+}
diff --git a/advancedcontentfilter/vendor/asset/vue-resource/src/url/root.js b/advancedcontentfilter/vendor/asset/vue-resource/src/url/root.js
new file mode 100644 (file)
index 0000000..9af294c
--- /dev/null
@@ -0,0 +1,16 @@
+/**
+ * Root Prefix Transform.
+ */
+
+import {isString, trimEnd} from '../util';
+
+export default function (options, next) {
+
+    var url = next(options);
+
+    if (isString(options.root) && !/^(https?:)?\//.test(url)) {
+        url = trimEnd(options.root, '/') + '/' + url;
+    }
+
+    return url;
+}
diff --git a/advancedcontentfilter/vendor/asset/vue-resource/src/url/template.js b/advancedcontentfilter/vendor/asset/vue-resource/src/url/template.js
new file mode 100644 (file)
index 0000000..603c01a
--- /dev/null
@@ -0,0 +1,16 @@
+/**
+ * URL Template (RFC 6570) Transform.
+ */
+
+import {expand} from '../lib/url-template';
+
+export default function (options) {
+
+    var variables = [], url = expand(options.url, options.params, variables);
+
+    variables.forEach((key) => {
+        delete options.params[key];
+    });
+
+    return url;
+}
diff --git a/advancedcontentfilter/vendor/asset/vue-resource/src/util.js b/advancedcontentfilter/vendor/asset/vue-resource/src/util.js
new file mode 100644 (file)
index 0000000..2a62f78
--- /dev/null
@@ -0,0 +1,183 @@
+/**
+ * Utility functions.
+ */
+
+import Promise from './promise';
+
+var {hasOwnProperty} = {}, {slice} = [], debug = false, ntick;
+
+export const inBrowser = typeof window !== 'undefined';
+
+export default function ({config, nextTick}) {
+    ntick = nextTick;
+    debug = config.debug || !config.silent;
+}
+
+export function warn(msg) {
+    if (typeof console !== 'undefined' && debug) {
+        console.warn('[VueResource warn]: ' + msg);
+    }
+}
+
+export function error(msg) {
+    if (typeof console !== 'undefined') {
+        console.error(msg);
+    }
+}
+
+export function nextTick(cb, ctx) {
+    return ntick(cb, ctx);
+}
+
+export function trim(str) {
+    return str ? str.replace(/^\s*|\s*$/g, '') : '';
+}
+
+export function trimEnd(str, chars) {
+
+    if (str && chars === undefined) {
+        return str.replace(/\s+$/, '');
+    }
+
+    if (!str || !chars) {
+        return str;
+    }
+
+    return str.replace(new RegExp(`[${chars}]+$`), '');
+}
+
+export function toLower(str) {
+    return str ? str.toLowerCase() : '';
+}
+
+export function toUpper(str) {
+    return str ? str.toUpperCase() : '';
+}
+
+export const isArray = Array.isArray;
+
+export function isString(val) {
+    return typeof val === 'string';
+}
+
+export function isBoolean(val) {
+    return val === true || val === false;
+}
+
+export function isFunction(val) {
+    return typeof val === 'function';
+}
+
+export function isObject(obj) {
+    return obj !== null && typeof obj === 'object';
+}
+
+export function isPlainObject(obj) {
+    return isObject(obj) && Object.getPrototypeOf(obj) == Object.prototype;
+}
+
+export function isBlob(obj) {
+    return typeof Blob !== 'undefined' && obj instanceof Blob;
+}
+
+export function isFormData(obj) {
+    return typeof FormData !== 'undefined' && obj instanceof FormData;
+}
+
+export function when(value, fulfilled, rejected) {
+
+    var promise = Promise.resolve(value);
+
+    if (arguments.length < 2) {
+        return promise;
+    }
+
+    return promise.then(fulfilled, rejected);
+}
+
+export function options(fn, obj, opts) {
+
+    opts = opts || {};
+
+    if (isFunction(opts)) {
+        opts = opts.call(obj);
+    }
+
+    return merge(fn.bind({$vm: obj, $options: opts}), fn, {$options: opts});
+}
+
+export function each(obj, iterator) {
+
+    var i, key;
+
+    if (isArray(obj)) {
+        for (i = 0; i < obj.length; i++) {
+            iterator.call(obj[i], obj[i], i);
+        }
+    } else if (isObject(obj)) {
+        for (key in obj) {
+            if (hasOwnProperty.call(obj, key)) {
+                iterator.call(obj[key], obj[key], key);
+            }
+        }
+    }
+
+    return obj;
+}
+
+export const assign = Object.assign || _assign;
+
+export function merge(target) {
+
+    var args = slice.call(arguments, 1);
+
+    args.forEach(source => {
+        _merge(target, source, true);
+    });
+
+    return target;
+}
+
+export function defaults(target) {
+
+    var args = slice.call(arguments, 1);
+
+    args.forEach(source => {
+
+        for (var key in source) {
+            if (target[key] === undefined) {
+                target[key] = source[key];
+            }
+        }
+
+    });
+
+    return target;
+}
+
+function _assign(target) {
+
+    var args = slice.call(arguments, 1);
+
+    args.forEach(source => {
+        _merge(target, source);
+    });
+
+    return target;
+}
+
+function _merge(target, source, deep) {
+    for (var key in source) {
+        if (deep && (isPlainObject(source[key]) || isArray(source[key]))) {
+            if (isPlainObject(source[key]) && !isPlainObject(target[key])) {
+                target[key] = {};
+            }
+            if (isArray(source[key]) && !isArray(target[key])) {
+                target[key] = [];
+            }
+            _merge(target[key], source[key], deep);
+        } else if (source[key] !== undefined) {
+            target[key] = source[key];
+        }
+    }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue-resource/test/data/invalid.json b/advancedcontentfilter/vendor/asset/vue-resource/test/data/invalid.json
new file mode 100644 (file)
index 0000000..e466dcb
--- /dev/null
@@ -0,0 +1 @@
+invalid
\ No newline at end of file
diff --git a/advancedcontentfilter/vendor/asset/vue-resource/test/data/text.txt b/advancedcontentfilter/vendor/asset/vue-resource/test/data/text.txt
new file mode 100644 (file)
index 0000000..f3a3485
--- /dev/null
@@ -0,0 +1 @@
+text
\ No newline at end of file
diff --git a/advancedcontentfilter/vendor/asset/vue-resource/test/data/valid.json b/advancedcontentfilter/vendor/asset/vue-resource/test/data/valid.json
new file mode 100644 (file)
index 0000000..18d7acf
--- /dev/null
@@ -0,0 +1 @@
+{"foo": "bar"}
\ No newline at end of file
diff --git a/advancedcontentfilter/vendor/asset/vue-resource/test/http.js b/advancedcontentfilter/vendor/asset/vue-resource/test/http.js
new file mode 100644 (file)
index 0000000..d3e2493
--- /dev/null
@@ -0,0 +1,200 @@
+import Vue from 'vue';
+
+describe('Vue.http', function () {
+
+    it('get("data/text.txt")', done => {
+
+        Vue.http.get('data/text.txt').then(res => {
+
+            expect(res.ok).toBe(true);
+            expect(res.status).toBe(200);
+            expect(res.body).toBe('text');
+            expect(res.data).toBe(res.body);
+            expect(res.headers.get('Content-Type')).toBe('text/plain');
+
+            done();
+        });
+
+    });
+
+    it('get("data/valid.json")', done => {
+
+        Vue.http.get('data/valid.json').then(res => {
+
+            expect(res.ok).toBe(true);
+            expect(res.status).toBe(200);
+            expect(typeof res.body).toBe('object');
+            expect(res.body.foo).toBe('bar');
+
+            done();
+        });
+
+    });
+
+    it('get("data/invalid.json")', done => {
+
+        Vue.http.get('data/invalid.json').then(res => {
+
+            expect(res.ok).toBe(true);
+            expect(res.status).toBe(200);
+            expect(res.body).toBeNull();
+
+            done();
+        });
+
+    });
+
+    it('get("github.com/avatar")', done => {
+
+        Vue.http.get('https://avatars1.githubusercontent.com/u/6128107', {responseType: 'blob'}).then(res => {
+
+            expect(res.ok).toBe(true);
+            expect(res.status).toBe(200);
+            expect(res.body instanceof Blob).toBe(true);
+            expect(res.body.type).toBe('image/png');
+
+            done();
+        });
+
+    });
+
+    it('get("cors-api.appspot.com")', done => {
+
+        Vue.http.get('http://server.cors-api.appspot.com/server?id=1&enable=true').then(res => {
+
+            expect(res.ok).toBe(true);
+            expect(res.status).toBe(200);
+            expect(typeof res.body).toBe('object');
+            expect(res.body.shift().requestType).toBe('cors');
+
+            if (res.headers.get('Content-Type')) {
+                expect(res.headers.get('Content-Type')).toBe('application/json');
+            }
+
+            done();
+        });
+
+    });
+
+    it('jsonp("jsfiddle.net/jsonp")', done => {
+
+        Vue.http.jsonp('http://jsfiddle.net/echo/jsonp/', {params: {foo: 'bar'}}).then(res => {
+
+            expect(res.ok).toBe(true);
+            expect(res.status).toBe(200);
+            expect(typeof res.body).toBe('object');
+            expect(res.body.foo).toBe('bar');
+
+            done();
+        });
+
+    });
+
+});
+
+describe('this.$http', function () {
+
+    it('get("data/valid.json")', done => {
+
+        var vm = new Vue({
+
+            created() {
+
+                this.$http.get('data/valid.json').then(res => {
+
+                    expect(this).toBe(vm);
+                    expect(res.ok).toBe(true);
+                    expect(res.status).toBe(200);
+                    expect(typeof res.body).toBe('object');
+                    expect(res.body.foo).toBe('bar');
+
+                    done();
+
+                });
+
+            }
+
+        });
+
+    });
+
+    it('get("data/valid.json") with timeout', done => {
+
+        var vm = new Vue({
+
+            created() {
+
+                var random = Math.random().toString(36).substr(2);
+
+                this.$http.get(`data/valid.json?${random}`, {timeout: 1}).then(res => {
+
+                    fail('Callback has been called');
+
+                }, res => {
+
+                    expect(res.ok).toBe(false);
+                    expect(res.status).toBe(0);
+
+                    done();
+
+                });
+
+            }
+
+        });
+
+    });
+
+    it('get("data/valid.json") with abort()', done => {
+
+        var vm = new Vue({
+
+            created() {
+
+                var random = Math.random().toString(36).substr(2);
+
+                this.$http.get(`data/valid.json?${random}`, {
+
+                    before(req) {
+                        setTimeout(() => {
+
+                            expect(typeof req.abort).toBe('function');
+
+                            req.abort();
+
+                        }, 0);
+                    }
+
+                }).then(res => {
+                    fail('Callback has been called');
+                }, res => {
+                    done();
+                });
+            }
+
+        });
+
+    });
+
+    it('get("data/notfound.json") using catch()', done => {
+
+        var vm = new Vue({
+
+            created() {
+
+                this.$http.get('data/notfound.json').catch(res => {
+
+                    expect(this).toBe(vm);
+                    expect(res.ok).toBe(false);
+                    expect(res.status).toBe(404);
+
+                    done();
+                });
+
+            }
+
+        });
+
+    });
+
+});
\ No newline at end of file
diff --git a/advancedcontentfilter/vendor/asset/vue-resource/test/http.test.js b/advancedcontentfilter/vendor/asset/vue-resource/test/http.test.js
new file mode 100644 (file)
index 0000000..c01b4c6
--- /dev/null
@@ -0,0 +1,34 @@
+var Vue = require('vue');
+var VueResource = require('../dist/vue-resource.common.js');
+
+Vue.use(VueResource);
+
+describe('Vue.http', function () {
+
+    it('post("jsfiddle.net/html")', () => {
+
+        return Vue.http.post('http://jsfiddle.net/echo/html/', {html: 'text'}, {emulateJSON: true}).then(res => {
+
+            expect(res.ok).toBe(true);
+            expect(res.status).toBe(200);
+            expect(typeof res.body).toBe('string');
+            expect(res.body).toBe('text');
+
+        });
+
+    });
+
+    it('post("jsfiddle.net/json")', () => {
+
+        return Vue.http.post('http://jsfiddle.net/echo/json/', {json: JSON.stringify({foo: 'bar'})}, {emulateJSON: true}).then(res => {
+
+            expect(res.ok).toBe(true);
+            expect(res.status).toBe(200);
+            expect(typeof res.body).toBe('object');
+            expect(res.body.foo).toBe('bar');
+
+        });
+
+    });
+
+});
diff --git a/advancedcontentfilter/vendor/asset/vue-resource/test/index.html b/advancedcontentfilter/vendor/asset/vue-resource/test/index.html
new file mode 100644 (file)
index 0000000..a60aca5
--- /dev/null
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>Vue Resource - Jasmine</title>
+
+  <link rel="shortcut icon" type="image/png" href="../node_modules/jasmine-core/images/jasmine_favicon.png">
+  <link rel="stylesheet" href="../node_modules/jasmine-core/lib/jasmine-core/jasmine.css">
+
+  <script src="../node_modules/jasmine-core/lib/jasmine-core/jasmine.js"></script>
+  <script src="../node_modules/jasmine-core/lib/jasmine-core/jasmine-html.js"></script>
+  <script src="../node_modules/jasmine-core/lib/jasmine-core/boot.js"></script>
+  <script src="specs.js"></script>
+
+</head>
+<body>
+</body>
+</html>
diff --git a/advancedcontentfilter/vendor/asset/vue-resource/test/index.js b/advancedcontentfilter/vendor/asset/vue-resource/test/index.js
new file mode 100644 (file)
index 0000000..97ea681
--- /dev/null
@@ -0,0 +1,9 @@
+import Vue from 'vue';
+import VueResource from '../src/index';
+
+Vue.use(VueResource);
+
+require('./url');
+require('./http');
+require('./resource');
+require('./promise');
diff --git a/advancedcontentfilter/vendor/asset/vue-resource/test/karma.conf.js b/advancedcontentfilter/vendor/asset/vue-resource/test/karma.conf.js
new file mode 100644 (file)
index 0000000..cfef42a
--- /dev/null
@@ -0,0 +1,26 @@
+module.exports = config => {
+
+  config.set({
+
+    basePath: __dirname,
+
+    frameworks: ['jasmine'],
+
+    browsers: ['Chrome', 'Safari', 'Firefox'],
+
+    files: [
+      'index.js',
+      {pattern: 'data/*', included: false},
+    ],
+
+    preprocessors: {
+      'index.js': ['webpack']
+    },
+
+    proxies: {
+      '/data/': '/base/data/'
+    },
+
+  });
+
+};
diff --git a/advancedcontentfilter/vendor/asset/vue-resource/test/promise.js b/advancedcontentfilter/vendor/asset/vue-resource/test/promise.js
new file mode 100644 (file)
index 0000000..e3a685b
--- /dev/null
@@ -0,0 +1,125 @@
+import Promise from '../src/promise';
+
+describe('Vue.promise ' + (window.Promise !== undefined ? '(native)' : '(polyfill)'), function () {
+
+    it('then fulfill', function (done) {
+
+        Promise.resolve(1).then(function (value) {
+            expect(value).toBe(1);
+            done();
+        });
+
+    });
+
+    it('then reject', function (done) {
+
+        Promise.reject(1).then(undefined, function (value) {
+            expect(value).toBe(1);
+            done();
+        });
+
+    });
+
+    it('catch', function (done) {
+
+        Promise.reject(1).catch(function (value) {
+            expect(value).toBe(1);
+            done();
+        });
+
+    });
+
+    it('finally fulfill', function (done) {
+
+        Promise.resolve(1).finally(function (arg) {
+            expect(arg).toBe(undefined);
+        }).then(function (arg) {
+            expect(arg).toBe(1);
+            done();
+        });
+
+    });
+
+    it('finally reject', function (done) {
+
+        Promise.reject(1).finally(function (arg) {
+            expect(arg).toBe(undefined);
+        }).catch(function (arg) {
+            expect(arg).toBe(1);
+            done();
+        });
+
+    });
+
+    it('all', function (done) {
+
+        Promise.all([
+
+            Promise.resolve(1),
+            Promise.resolve(2)
+
+        ]).then(function (values) {
+            expect(values[0]).toBe(1);
+            expect(values[1]).toBe(2);
+            done();
+        });
+
+    });
+
+    it('duplicate', function (done) {
+
+        Promise.all([
+
+            Promise.resolve(1).then(function (value) {
+                expect(value).toBe(1);
+            }),
+
+            Promise.resolve(2).then(function (value) {
+                expect(value).toBe(2);
+            })
+
+        ]).then(done);
+
+    });
+
+    it('context', function (done) {
+
+        var context = {foo: 'bar'};
+
+        Promise.resolve().bind(context).then(function () {
+            expect(this).toBe(context);
+            done();
+        });
+
+    });
+
+    it('context chain fulfill', function (done) {
+
+        var context = {foo: 'bar'};
+
+        Promise.resolve().bind(context).catch(undefined).finally(function () {
+            expect(this).toBe(context);
+        }).then(function () {
+            expect(this).toBe(context);
+            done();
+        });
+
+    });
+
+    it('context chain reject', function (done) {
+
+        var context = {foo: 'bar'};
+
+        Promise.reject().bind(context).catch(function () {
+            expect(this).toBe(context);
+            return Promise.reject();
+        }).finally(function () {
+            expect(this).toBe(context);
+        }).catch(function () {
+            expect(this).toBe(context);
+            done();
+        });
+
+    });
+
+});
diff --git a/advancedcontentfilter/vendor/asset/vue-resource/test/resource.js b/advancedcontentfilter/vendor/asset/vue-resource/test/resource.js
new file mode 100644 (file)
index 0000000..e874656
--- /dev/null
@@ -0,0 +1,51 @@
+import Vue from 'vue';
+
+describe('this.$resource', function () {
+
+    it('get({file: "valid.json"})', (done) => {
+
+        var vm = new Vue({
+
+            created() {
+
+                var resource = this.$resource('data{/file}');
+
+                resource.get({file: 'valid.json'}).then((res) => {
+
+                    expect(res.ok).toBe(true);
+                    expect(res.status).toBe(200);
+                    expect(res.data.foo).toBe('bar');
+
+                    done();
+                });
+
+            }
+
+        });
+
+    });
+
+    it('save({file: "valid.json"}, {foo: "bar"})', (done) => {
+
+        var vm = new Vue({
+
+            created() {
+
+                var resource = this.$resource('data{/file}');
+
+                resource.save({file: 'valid.json'}, {foo: 'bar'}).then((res) => {
+
+                    expect(res.ok).toBe(true);
+                    expect(res.status).toBe(200);
+                    expect(res.data.foo).toBe('bar');
+
+                    done();
+                });
+
+            }
+
+        });
+
+    });
+
+});
diff --git a/advancedcontentfilter/vendor/asset/vue-resource/test/url.js b/advancedcontentfilter/vendor/asset/vue-resource/test/url.js
new file mode 100644 (file)
index 0000000..12dc918
--- /dev/null
@@ -0,0 +1,33 @@
+import Vue from 'vue';
+
+describe('Vue.url', function () {
+
+    it('data{/id}', function () {
+
+        expect(Vue.url('data{/id}')).toBe('data');
+        expect(Vue.url('data{/id}', {id: 1})).toBe('data/1');
+
+    });
+
+    it('data{/array}', function () {
+
+        expect(Vue.url('data{?array}')).toBe('data');
+        expect(Vue.url('data{?array}', {array: [1,2,3]})).toBe('data?array=1,2,3');
+
+    });
+
+    it('{+path}data', function () {
+
+        expect(Vue.url('{+path}data')).toBe('data');
+        expect(Vue.url('{+path}data', {path: 'path1/path2/'})).toBe('path1/path2/data');
+
+    });
+
+    it('{+base}data', function () {
+
+        Vue.url.options.params.base = 'base/path/';
+        expect(Vue.url('{+base}data')).toBe('base/path/data');
+
+    });
+
+});
diff --git a/advancedcontentfilter/vendor/asset/vue-resource/test/webpack.config.js b/advancedcontentfilter/vendor/asset/vue-resource/test/webpack.config.js
new file mode 100644 (file)
index 0000000..1659299
--- /dev/null
@@ -0,0 +1,17 @@
+var webpack = require('webpack');
+
+module.exports = {
+    entry: __dirname + '/index.js',
+    output: {
+        path: __dirname + '/',
+        filename: 'specs.js'
+    },
+    module: {
+        loaders: [
+            {test: /\.js$/, loader: 'buble-loader', exclude: /node_modules/}
+        ]
+    },
+    plugins: [
+        new webpack.optimize.ModuleConcatenationPlugin()
+    ]
+};
diff --git a/advancedcontentfilter/vendor/asset/vue-resource/types/index.d.ts b/advancedcontentfilter/vendor/asset/vue-resource/types/index.d.ts
new file mode 100644 (file)
index 0000000..0537de8
--- /dev/null
@@ -0,0 +1,94 @@
+import _Vue = require('vue');
+
+// augment typings of Vue.js
+import './vue';
+
+export interface HttpHeaders {
+    put?: { [key: string]: string };
+    post?: { [key: string]: string };
+    patch?: { [key: string]: string };
+    delete?: { [key: string]: string };
+    common?: { [key: string]: string };
+    custom?: { [key: string]: string };
+    [key: string]: any;
+}
+
+export interface HttpResponse {
+    data: any;
+    ok: boolean;
+    status: number;
+    statusText: string;
+    headers: Function;
+    text():string;
+    json():any;
+    blob():Blob;
+}
+
+export interface HttpOptions {
+    url?: string;
+    method?: string;
+    body?: any;
+    params?: any;
+    headers?: any;
+    before?(request: any): any;
+    progress?(event: any): any;
+    credentials?:boolean;
+    emulateHTTP?: boolean;
+    emulateJSON?: boolean;
+}
+
+export interface $http {
+    (url: string, data?: any, options?: HttpOptions): PromiseLike<HttpResponse>;
+    (url: string, options?: HttpOptions): PromiseLike<HttpResponse>;
+}
+
+export interface HttpInterceptor {
+    request?(request: HttpOptions): HttpOptions;
+    response?(response: HttpResponse): HttpResponse;
+}
+
+export interface Http {
+    options: HttpOptions & { root: string };
+    headers: HttpHeaders;
+    interceptors: (HttpInterceptor | (() => HttpInterceptor))[];
+    get: $http;
+    post: $http;
+    put: $http;
+    patch: $http;
+    delete: $http;
+    jsonp: $http;
+}
+
+export interface ResourceActions {
+    get: { method: string };
+    save: { method: string };
+    query: { method: string };
+    update: { method: string };
+    remove: { method: string };
+    delete: { method: string };
+}
+
+export interface ResourceMethod {
+    (params: any, data?: any, success?: Function, error?: Function): PromiseLike<HttpResponse>;
+    (params: any, success?: Function, error?: Function): PromiseLike<HttpResponse>;
+    (success?: Function, error?: Function): PromiseLike<HttpResponse>;
+}
+
+export interface ResourceMethods {
+    get: ResourceMethod;
+    save: ResourceMethod;
+    query: ResourceMethod;
+    update: ResourceMethod;
+    remove: ResourceMethod;
+    delete: ResourceMethod;
+}
+
+export interface $resource {
+    (url: string, params?: any, actions?: any, options?: HttpOptions): ResourceMethods;
+}
+
+export interface Resource extends $resource {
+    actions: ResourceActions;
+}
+
+export declare function install(vue: typeof _Vue): void;
diff --git a/advancedcontentfilter/vendor/asset/vue-resource/types/vue.d.ts b/advancedcontentfilter/vendor/asset/vue-resource/types/vue.d.ts
new file mode 100644 (file)
index 0000000..6ae00ef
--- /dev/null
@@ -0,0 +1,27 @@
+/**
+ * Extends interfaces in Vue.js
+ */
+
+import Vue from "vue";
+import { HttpHeaders, HttpOptions, HttpResponse, $http, $resource } from "./index";
+
+declare module "vue/types/options" {
+  interface ComponentOptions<V extends Vue> {
+    http?: (HttpOptions & { headers?: HttpHeaders } & { [key: string]: any })
+  }
+}
+
+declare module "vue/types/vue" {
+    interface Vue {
+        $http: {
+            (options: HttpOptions): PromiseLike<HttpResponse>;
+            get: $http;
+            post: $http;
+            put: $http;
+            patch: $http;
+            delete: $http;
+            jsonp: $http;
+        };
+        $resource: $resource;
+    }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue-resource/yarn.lock b/advancedcontentfilter/vendor/asset/vue-resource/yarn.lock
new file mode 100644 (file)
index 0000000..d522439
--- /dev/null
@@ -0,0 +1,6503 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@babel/code-frame@^7.0.0-beta.35":
+  version "7.0.0-beta.40"
+  resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-beta.40.tgz#37e2b0cf7c56026b4b21d3927cadf81adec32ac6"
+  dependencies:
+    "@babel/highlight" "7.0.0-beta.40"
+
+"@babel/highlight@7.0.0-beta.40":
+  version "7.0.0-beta.40"
+  resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0-beta.40.tgz#b43d67d76bf46e1d10d227f68cddcd263786b255"
+  dependencies:
+    chalk "^2.0.0"
+    esutils "^2.0.2"
+    js-tokens "^3.0.0"
+
+"@sindresorhus/is@^0.7.0":
+  version "0.7.0"
+  resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.7.0.tgz#9a06f4f137ee84d7df0460c1fdb1135ffa6c50fd"
+
+JSONStream@^1.0.3:
+  version "1.3.2"
+  resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.2.tgz#c102371b6ec3a7cf3b847ca00c20bb0fce4c6dea"
+  dependencies:
+    jsonparse "^1.2.0"
+    through ">=2.2.7 <3"
+
+abab@^1.0.4:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e"
+
+abbrev@1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
+
+accepts@~1.3.4:
+  version "1.3.5"
+  resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2"
+  dependencies:
+    mime-types "~2.1.18"
+    negotiator "0.6.1"
+
+acorn-dynamic-import@^2.0.0:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz#c752bd210bef679501b6c6cb7fc84f8f47158cc4"
+  dependencies:
+    acorn "^4.0.3"
+
+acorn-dynamic-import@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz#901ceee4c7faaef7e07ad2a47e890675da50a278"
+  dependencies:
+    acorn "^5.0.0"
+
+acorn-globals@^4.1.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.1.0.tgz#ab716025dbe17c54d3ef81d32ece2b2d99fe2538"
+  dependencies:
+    acorn "^5.0.0"
+
+acorn-jsx@^3.0.0, acorn-jsx@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b"
+  dependencies:
+    acorn "^3.0.4"
+
+acorn-jsx@^4.1.1:
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-4.1.1.tgz#e8e41e48ea2fe0c896740610ab6a4ffd8add225e"
+  dependencies:
+    acorn "^5.0.3"
+
+acorn-node@^1.2.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/acorn-node/-/acorn-node-1.3.0.tgz#5f86d73346743810ef1269b901dbcbded020861b"
+  dependencies:
+    acorn "^5.4.1"
+    xtend "^4.0.1"
+
+acorn-object-spread@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/acorn-object-spread/-/acorn-object-spread-1.0.0.tgz#48ead0f4a8eb16995a17a0db9ffc6acaada4ba68"
+  dependencies:
+    acorn "^3.1.0"
+
+acorn@^3.0.4, acorn@^3.1.0, acorn@^3.3.0:
+  version "3.3.0"
+  resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a"
+
+acorn@^4.0.3:
+  version "4.0.13"
+  resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787"
+
+acorn@^5.0.0, acorn@^5.0.3, acorn@^5.2.1, acorn@^5.3.0, acorn@^5.4.0, acorn@^5.4.1:
+  version "5.5.0"
+  resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.5.0.tgz#1abb587fbf051f94e3de20e6b26ef910b1828298"
+
+addressparser@1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/addressparser/-/addressparser-1.0.1.tgz#47afbe1a2a9262191db6838e4fd1d39b40821746"
+
+after@0.8.2:
+  version "0.8.2"
+  resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f"
+
+agent-base@2:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-2.1.1.tgz#d6de10d5af6132d5bd692427d46fc538539094c7"
+  dependencies:
+    extend "~3.0.0"
+    semver "~5.0.1"
+
+ajv-keywords@^2.1.0:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762"
+
+ajv-keywords@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.1.0.tgz#ac2b27939c543e95d2c06e7f7f5c27be4aa543be"
+
+ajv@^4.9.1:
+  version "4.11.8"
+  resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536"
+  dependencies:
+    co "^4.6.0"
+    json-stable-stringify "^1.0.1"
+
+ajv@^5.1.0, ajv@^5.2.3, ajv@^5.3.0:
+  version "5.5.2"
+  resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965"
+  dependencies:
+    co "^4.6.0"
+    fast-deep-equal "^1.0.0"
+    fast-json-stable-stringify "^2.0.0"
+    json-schema-traverse "^0.3.0"
+
+ajv@^6.1.0:
+  version "6.2.0"
+  resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.2.0.tgz#afac295bbaa0152449e522742e4547c1ae9328d2"
+  dependencies:
+    fast-deep-equal "^1.0.0"
+    fast-json-stable-stringify "^2.0.0"
+    json-schema-traverse "^0.3.0"
+
+align-text@^0.1.1, align-text@^0.1.3:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117"
+  dependencies:
+    kind-of "^3.0.2"
+    longest "^1.0.1"
+    repeat-string "^1.5.2"
+
+amdefine@>=0.0.4:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5"
+
+amqplib@^0.5.2:
+  version "0.5.2"
+  resolved "https://registry.yarnpkg.com/amqplib/-/amqplib-0.5.2.tgz#d2d7313c7ffaa4d10bcf1e6252de4591b6cc7b63"
+  dependencies:
+    bitsyntax "~0.0.4"
+    bluebird "^3.4.6"
+    buffer-more-ints "0.0.2"
+    readable-stream "1.x >=1.1.9"
+    safe-buffer "^5.0.1"
+
+ansi-escapes@^1.1.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e"
+
+ansi-escapes@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.0.0.tgz#ec3e8b4e9f8064fc02c3ac9b65f1c275bda8ef92"
+
+ansi-regex@^2.0.0:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
+
+ansi-regex@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998"
+
+ansi-styles@^2.2.1:
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
+
+ansi-styles@^3.2.0, ansi-styles@^3.2.1:
+  version "3.2.1"
+  resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
+  dependencies:
+    color-convert "^1.9.0"
+
+anymatch@^1.3.0:
+  version "1.3.2"
+  resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a"
+  dependencies:
+    micromatch "^2.1.5"
+    normalize-path "^2.0.0"
+
+anymatch@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb"
+  dependencies:
+    micromatch "^3.1.4"
+    normalize-path "^2.1.1"
+
+append-transform@^0.4.0:
+  version "0.4.0"
+  resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-0.4.0.tgz#d76ebf8ca94d276e247a36bad44a4b74ab611991"
+  dependencies:
+    default-require-extensions "^1.0.0"
+
+aproba@^1.0.3, aproba@^1.1.1:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
+
+are-we-there-yet@~1.1.2:
+  version "1.1.4"
+  resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d"
+  dependencies:
+    delegates "^1.0.0"
+    readable-stream "^2.0.6"
+
+argparse@^1.0.7:
+  version "1.0.10"
+  resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
+  dependencies:
+    sprintf-js "~1.0.2"
+
+arr-diff@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf"
+  dependencies:
+    arr-flatten "^1.0.1"
+
+arr-diff@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520"
+
+arr-flatten@^1.0.1, arr-flatten@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1"
+
+arr-union@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4"
+
+array-equal@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93"
+
+array-filter@~0.0.0:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec"
+
+array-map@~0.0.0:
+  version "0.0.0"
+  resolved "https://registry.yarnpkg.com/array-map/-/array-map-0.0.0.tgz#88a2bab73d1cf7bcd5c1b118a003f66f665fa662"
+
+array-reduce@~0.0.0:
+  version "0.0.0"
+  resolved "https://registry.yarnpkg.com/array-reduce/-/array-reduce-0.0.0.tgz#173899d3ffd1c7d9383e4479525dbe278cab5f2b"
+
+array-slice@^0.2.3:
+  version "0.2.3"
+  resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5"
+
+array-union@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39"
+  dependencies:
+    array-uniq "^1.0.1"
+
+array-uniq@^1.0.1:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6"
+
+array-unique@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53"
+
+array-unique@^0.3.2:
+  version "0.3.2"
+  resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"
+
+arraybuffer.slice@~0.0.7:
+  version "0.0.7"
+  resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz#3bbc4275dd584cc1b10809b89d4e8b63a69e7675"
+
+arrify@^1.0.0, arrify@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
+
+asn1.js@^4.0.0:
+  version "4.10.1"
+  resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0"
+  dependencies:
+    bn.js "^4.0.0"
+    inherits "^2.0.1"
+    minimalistic-assert "^1.0.0"
+
+asn1@~0.2.3:
+  version "0.2.3"
+  resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86"
+
+assert-plus@1.0.0, assert-plus@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
+
+assert-plus@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234"
+
+assert@^1.1.1, assert@^1.4.0:
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91"
+  dependencies:
+    util "0.10.3"
+
+assign-symbols@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
+
+ast-types@0.x.x:
+  version "0.11.2"
+  resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.11.2.tgz#cc4e1d15a36b39979a1986fe1e91321cbfae7783"
+
+astral-regex@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9"
+
+astw@^2.0.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/astw/-/astw-2.2.0.tgz#7bd41784d32493987aeb239b6b4e1c57a873b917"
+  dependencies:
+    acorn "^4.0.3"
+
+async-each@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d"
+
+async-limiter@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8"
+
+async@^1.4.0:
+  version "1.5.2"
+  resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
+
+async@^2.0.0, async@^2.1.2, async@^2.1.4:
+  version "2.6.0"
+  resolved "https://registry.yarnpkg.com/async/-/async-2.6.0.tgz#61a29abb6fcc026fea77e56d1c6ec53a795951f4"
+  dependencies:
+    lodash "^4.14.0"
+
+async@~2.1.2:
+  version "2.1.5"
+  resolved "https://registry.yarnpkg.com/async/-/async-2.1.5.tgz#e587c68580994ac67fc56ff86d3ac56bdbe810bc"
+  dependencies:
+    lodash "^4.14.0"
+
+asynckit@^0.4.0:
+  version "0.4.0"
+  resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
+
+atob@^2.0.0:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/atob/-/atob-2.0.3.tgz#19c7a760473774468f20b2d2d03372ad7d4cbf5d"
+
+aws-sign2@~0.6.0:
+  version "0.6.0"
+  resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f"
+
+aws-sign2@~0.7.0:
+  version "0.7.0"
+  resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8"
+
+aws4@^1.2.1, aws4@^1.6.0:
+  version "1.6.0"
+  resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e"
+
+axios@^0.15.3:
+  version "0.15.3"
+  resolved "https://registry.yarnpkg.com/axios/-/axios-0.15.3.tgz#2c9d638b2e191a08ea1d6cc988eadd6ba5bdc053"
+  dependencies:
+    follow-redirects "1.0.0"
+
+babel-code-frame@^6.22.0, babel-code-frame@^6.26.0:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b"
+  dependencies:
+    chalk "^1.1.3"
+    esutils "^2.0.2"
+    js-tokens "^3.0.2"
+
+babel-core@^6.0.0, babel-core@^6.26.0:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.0.tgz#af32f78b31a6fcef119c87b0fd8d9753f03a0bb8"
+  dependencies:
+    babel-code-frame "^6.26.0"
+    babel-generator "^6.26.0"
+    babel-helpers "^6.24.1"
+    babel-messages "^6.23.0"
+    babel-register "^6.26.0"
+    babel-runtime "^6.26.0"
+    babel-template "^6.26.0"
+    babel-traverse "^6.26.0"
+    babel-types "^6.26.0"
+    babylon "^6.18.0"
+    convert-source-map "^1.5.0"
+    debug "^2.6.8"
+    json5 "^0.5.1"
+    lodash "^4.17.4"
+    minimatch "^3.0.4"
+    path-is-absolute "^1.0.1"
+    private "^0.1.7"
+    slash "^1.0.0"
+    source-map "^0.5.6"
+
+babel-generator@^6.18.0, babel-generator@^6.26.0:
+  version "6.26.1"
+  resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90"
+  dependencies:
+    babel-messages "^6.23.0"
+    babel-runtime "^6.26.0"
+    babel-types "^6.26.0"
+    detect-indent "^4.0.0"
+    jsesc "^1.3.0"
+    lodash "^4.17.4"
+    source-map "^0.5.7"
+    trim-right "^1.0.1"
+
+babel-helpers@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2"
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+
+babel-jest@^22.4.1:
+  version "22.4.1"
+  resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-22.4.1.tgz#ff53ebca45957347f27ff4666a31499fbb4c4ddd"
+  dependencies:
+    babel-plugin-istanbul "^4.1.5"
+    babel-preset-jest "^22.4.1"
+
+babel-messages@^6.23.0:
+  version "6.23.0"
+  resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e"
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-istanbul@^4.1.5:
+  version "4.1.5"
+  resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.5.tgz#6760cdd977f411d3e175bb064f2bc327d99b2b6e"
+  dependencies:
+    find-up "^2.1.0"
+    istanbul-lib-instrument "^1.7.5"
+    test-exclude "^4.1.1"
+
+babel-plugin-jest-hoist@^22.4.1:
+  version "22.4.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-22.4.1.tgz#d712fe5da8b6965f3191dacddbefdbdf4fb66d63"
+
+babel-plugin-syntax-object-rest-spread@^6.13.0:
+  version "6.13.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5"
+
+babel-preset-jest@^22.4.1:
+  version "22.4.1"
+  resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-22.4.1.tgz#efa2e5f5334242a9457a068452d7d09735db172a"
+  dependencies:
+    babel-plugin-jest-hoist "^22.4.1"
+    babel-plugin-syntax-object-rest-spread "^6.13.0"
+
+babel-register@^6.26.0:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071"
+  dependencies:
+    babel-core "^6.26.0"
+    babel-runtime "^6.26.0"
+    core-js "^2.5.0"
+    home-or-tmp "^2.0.0"
+    lodash "^4.17.4"
+    mkdirp "^0.5.1"
+    source-map-support "^0.4.15"
+
+babel-runtime@^6.0.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
+  dependencies:
+    core-js "^2.4.0"
+    regenerator-runtime "^0.11.0"
+
+babel-template@^6.16.0, babel-template@^6.24.1, babel-template@^6.26.0:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02"
+  dependencies:
+    babel-runtime "^6.26.0"
+    babel-traverse "^6.26.0"
+    babel-types "^6.26.0"
+    babylon "^6.18.0"
+    lodash "^4.17.4"
+
+babel-traverse@^6.18.0, babel-traverse@^6.26.0:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee"
+  dependencies:
+    babel-code-frame "^6.26.0"
+    babel-messages "^6.23.0"
+    babel-runtime "^6.26.0"
+    babel-types "^6.26.0"
+    babylon "^6.18.0"
+    debug "^2.6.8"
+    globals "^9.18.0"
+    invariant "^2.2.2"
+    lodash "^4.17.4"
+
+babel-types@^6.18.0, babel-types@^6.26.0:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497"
+  dependencies:
+    babel-runtime "^6.26.0"
+    esutils "^2.0.2"
+    lodash "^4.17.4"
+    to-fast-properties "^1.0.3"
+
+babylon@^6.18.0:
+  version "6.18.0"
+  resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3"
+
+backo2@1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947"
+
+balanced-match@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
+
+base64-arraybuffer@0.1.5:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8"
+
+base64-js@^1.0.2:
+  version "1.2.3"
+  resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.3.tgz#fb13668233d9614cf5fb4bce95a9ba4096cdf801"
+
+base64id@1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/base64id/-/base64id-1.0.0.tgz#47688cb99bb6804f0e06d3e763b1c32e57d8e6b6"
+
+base@^0.11.1:
+  version "0.11.2"
+  resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f"
+  dependencies:
+    cache-base "^1.0.1"
+    class-utils "^0.3.5"
+    component-emitter "^1.2.1"
+    define-property "^1.0.0"
+    isobject "^3.0.1"
+    mixin-deep "^1.2.0"
+    pascalcase "^0.1.1"
+
+bcrypt-pbkdf@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d"
+  dependencies:
+    tweetnacl "^0.14.3"
+
+better-assert@~1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/better-assert/-/better-assert-1.0.2.tgz#40866b9e1b9e0b55b481894311e68faffaebc522"
+  dependencies:
+    callsite "1.0.0"
+
+big.js@^3.1.3:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e"
+
+binary-extensions@^1.0.0:
+  version "1.11.0"
+  resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205"
+
+bitsyntax@~0.0.4:
+  version "0.0.4"
+  resolved "https://registry.yarnpkg.com/bitsyntax/-/bitsyntax-0.0.4.tgz#eb10cc6f82b8c490e3e85698f07e83d46e0cba82"
+  dependencies:
+    buffer-more-ints "0.0.2"
+
+bl@~1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/bl/-/bl-1.1.2.tgz#fdca871a99713aa00d19e3bbba41c44787a65398"
+  dependencies:
+    readable-stream "~2.0.5"
+
+blob@0.0.4:
+  version "0.0.4"
+  resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.4.tgz#bcf13052ca54463f30f9fc7e95b9a47630a94921"
+
+block-stream@*:
+  version "0.0.9"
+  resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a"
+  dependencies:
+    inherits "~2.0.0"
+
+bluebird@^3.3.0, bluebird@^3.4.6, bluebird@^3.5.0, bluebird@^3.5.1:
+  version "3.5.1"
+  resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9"
+
+bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0:
+  version "4.11.8"
+  resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f"
+
+body-parser@^1.16.1:
+  version "1.18.2"
+  resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.2.tgz#87678a19d84b47d859b83199bd59bce222b10454"
+  dependencies:
+    bytes "3.0.0"
+    content-type "~1.0.4"
+    debug "2.6.9"
+    depd "~1.1.1"
+    http-errors "~1.6.2"
+    iconv-lite "0.4.19"
+    on-finished "~2.3.0"
+    qs "6.5.1"
+    raw-body "2.3.2"
+    type-is "~1.6.15"
+
+boom@2.x.x:
+  version "2.10.1"
+  resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f"
+  dependencies:
+    hoek "2.x.x"
+
+boom@4.x.x:
+  version "4.3.1"
+  resolved "https://registry.yarnpkg.com/boom/-/boom-4.3.1.tgz#4f8a3005cb4a7e3889f749030fd25b96e01d2e31"
+  dependencies:
+    hoek "4.x.x"
+
+boom@5.x.x:
+  version "5.2.0"
+  resolved "https://registry.yarnpkg.com/boom/-/boom-5.2.0.tgz#5dd9da6ee3a5f302077436290cb717d3f4a54e02"
+  dependencies:
+    hoek "4.x.x"
+
+brace-expansion@^1.1.7:
+  version "1.1.11"
+  resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
+  dependencies:
+    balanced-match "^1.0.0"
+    concat-map "0.0.1"
+
+braces@^0.1.2:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/braces/-/braces-0.1.5.tgz#c085711085291d8b75fdd74eab0f8597280711e6"
+  dependencies:
+    expand-range "^0.1.0"
+
+braces@^1.8.2:
+  version "1.8.5"
+  resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7"
+  dependencies:
+    expand-range "^1.8.1"
+    preserve "^0.2.0"
+    repeat-element "^1.1.2"
+
+braces@^2.3.0, braces@^2.3.1:
+  version "2.3.1"
+  resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.1.tgz#7086c913b4e5a08dbe37ac0ee6a2500c4ba691bb"
+  dependencies:
+    arr-flatten "^1.1.0"
+    array-unique "^0.3.2"
+    define-property "^1.0.0"
+    extend-shallow "^2.0.1"
+    fill-range "^4.0.0"
+    isobject "^3.0.1"
+    kind-of "^6.0.2"
+    repeat-element "^1.1.2"
+    snapdragon "^0.8.1"
+    snapdragon-node "^2.0.1"
+    split-string "^3.0.2"
+    to-regex "^3.0.1"
+
+brorand@^1.0.1:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
+
+browser-pack@^6.0.1:
+  version "6.0.4"
+  resolved "https://registry.yarnpkg.com/browser-pack/-/browser-pack-6.0.4.tgz#9a73beb3b48f9e36868be007b64400102c04a99f"
+  dependencies:
+    JSONStream "^1.0.3"
+    combine-source-map "~0.8.0"
+    defined "^1.0.0"
+    safe-buffer "^5.1.1"
+    through2 "^2.0.0"
+    umd "^3.0.0"
+
+browser-process-hrtime@^0.1.2:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz#425d68a58d3447f02a04aa894187fce8af8b7b8e"
+
+browser-resolve@^1.11.0, browser-resolve@^1.11.2, browser-resolve@^1.7.0:
+  version "1.11.2"
+  resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b32e48f442938ce"
+  dependencies:
+    resolve "1.1.7"
+
+browserify-aes@^1.0.0, browserify-aes@^1.0.4:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.1.1.tgz#38b7ab55edb806ff2dcda1a7f1620773a477c49f"
+  dependencies:
+    buffer-xor "^1.0.3"
+    cipher-base "^1.0.0"
+    create-hash "^1.1.0"
+    evp_bytestokey "^1.0.3"
+    inherits "^2.0.1"
+    safe-buffer "^5.0.1"
+
+browserify-cipher@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.0.tgz#9988244874bf5ed4e28da95666dcd66ac8fc363a"
+  dependencies:
+    browserify-aes "^1.0.4"
+    browserify-des "^1.0.0"
+    evp_bytestokey "^1.0.0"
+
+browserify-des@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.0.tgz#daa277717470922ed2fe18594118a175439721dd"
+  dependencies:
+    cipher-base "^1.0.1"
+    des.js "^1.0.0"
+    inherits "^2.0.1"
+
+browserify-rsa@^4.0.0:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524"
+  dependencies:
+    bn.js "^4.1.0"
+    randombytes "^2.0.1"
+
+browserify-sign@^4.0.0:
+  version "4.0.4"
+  resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298"
+  dependencies:
+    bn.js "^4.1.1"
+    browserify-rsa "^4.0.0"
+    create-hash "^1.1.0"
+    create-hmac "^1.1.2"
+    elliptic "^6.0.0"
+    inherits "^2.0.1"
+    parse-asn1 "^5.0.0"
+
+browserify-zlib@^0.2.0, browserify-zlib@~0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f"
+  dependencies:
+    pako "~1.0.5"
+
+browserify@^14.5.0:
+  version "14.5.0"
+  resolved "https://registry.yarnpkg.com/browserify/-/browserify-14.5.0.tgz#0bbbce521acd6e4d1d54d8e9365008efb85a9cc5"
+  dependencies:
+    JSONStream "^1.0.3"
+    assert "^1.4.0"
+    browser-pack "^6.0.1"
+    browser-resolve "^1.11.0"
+    browserify-zlib "~0.2.0"
+    buffer "^5.0.2"
+    cached-path-relative "^1.0.0"
+    concat-stream "~1.5.1"
+    console-browserify "^1.1.0"
+    constants-browserify "~1.0.0"
+    crypto-browserify "^3.0.0"
+    defined "^1.0.0"
+    deps-sort "^2.0.0"
+    domain-browser "~1.1.0"
+    duplexer2 "~0.1.2"
+    events "~1.1.0"
+    glob "^7.1.0"
+    has "^1.0.0"
+    htmlescape "^1.1.0"
+    https-browserify "^1.0.0"
+    inherits "~2.0.1"
+    insert-module-globals "^7.0.0"
+    labeled-stream-splicer "^2.0.0"
+    module-deps "^4.0.8"
+    os-browserify "~0.3.0"
+    parents "^1.0.1"
+    path-browserify "~0.0.0"
+    process "~0.11.0"
+    punycode "^1.3.2"
+    querystring-es3 "~0.2.0"
+    read-only-stream "^2.0.0"
+    readable-stream "^2.0.2"
+    resolve "^1.1.4"
+    shasum "^1.0.0"
+    shell-quote "^1.6.1"
+    stream-browserify "^2.0.0"
+    stream-http "^2.0.0"
+    string_decoder "~1.0.0"
+    subarg "^1.0.0"
+    syntax-error "^1.1.1"
+    through2 "^2.0.0"
+    timers-browserify "^1.0.1"
+    tty-browserify "~0.0.0"
+    url "~0.11.0"
+    util "~0.10.1"
+    vm-browserify "~0.0.1"
+    xtend "^4.0.0"
+
+bser@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719"
+  dependencies:
+    node-int64 "^0.4.0"
+
+buble-loader@^0.4.1:
+  version "0.4.1"
+  resolved "https://registry.yarnpkg.com/buble-loader/-/buble-loader-0.4.1.tgz#45a4fe43ccc500835e99ae38ef17df4390ca66b9"
+  dependencies:
+    buble "^0.15.0"
+    loader-utils "^0.2.15"
+    webpack "*"
+
+buble@^0.15.0:
+  version "0.15.2"
+  resolved "https://registry.yarnpkg.com/buble/-/buble-0.15.2.tgz#547fc47483f8e5e8176d82aa5ebccb183b02d613"
+  dependencies:
+    acorn "^3.3.0"
+    acorn-jsx "^3.0.1"
+    acorn-object-spread "^1.0.0"
+    chalk "^1.1.3"
+    magic-string "^0.14.0"
+    minimist "^1.2.0"
+    os-homedir "^1.0.1"
+
+buble@^0.19.1, buble@^0.19.2:
+  version "0.19.3"
+  resolved "https://registry.yarnpkg.com/buble/-/buble-0.19.3.tgz#01e9412062cff1da6f20342b6ecd72e7bf699d02"
+  dependencies:
+    acorn "^5.4.1"
+    acorn-dynamic-import "^3.0.0"
+    acorn-jsx "^4.1.1"
+    chalk "^2.3.1"
+    magic-string "^0.22.4"
+    minimist "^1.2.0"
+    os-homedir "^1.0.1"
+    vlq "^1.0.0"
+
+buffer-more-ints@0.0.2:
+  version "0.0.2"
+  resolved "https://registry.yarnpkg.com/buffer-more-ints/-/buffer-more-ints-0.0.2.tgz#26b3885d10fa13db7fc01aae3aab870199e0124c"
+
+buffer-xor@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9"
+
+buffer@^4.3.0:
+  version "4.9.1"
+  resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298"
+  dependencies:
+    base64-js "^1.0.2"
+    ieee754 "^1.1.4"
+    isarray "^1.0.0"
+
+buffer@^5.0.2:
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.1.0.tgz#c913e43678c7cb7c8bd16afbcddb6c5505e8f9fe"
+  dependencies:
+    base64-js "^1.0.2"
+    ieee754 "^1.1.4"
+
+buildmail@4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/buildmail/-/buildmail-4.0.1.tgz#877f7738b78729871c9a105e3b837d2be11a7a72"
+  dependencies:
+    addressparser "1.0.1"
+    libbase64 "0.1.0"
+    libmime "3.0.0"
+    libqp "1.1.0"
+    nodemailer-fetch "1.6.0"
+    nodemailer-shared "1.1.0"
+    punycode "1.4.1"
+
+builtin-modules@^1.0.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f"
+
+builtin-status-codes@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
+
+bytes@3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048"
+
+cacache@^10.0.1:
+  version "10.0.4"
+  resolved "https://registry.yarnpkg.com/cacache/-/cacache-10.0.4.tgz#6452367999eff9d4188aefd9a14e9d7c6a263460"
+  dependencies:
+    bluebird "^3.5.1"
+    chownr "^1.0.1"
+    glob "^7.1.2"
+    graceful-fs "^4.1.11"
+    lru-cache "^4.1.1"
+    mississippi "^2.0.0"
+    mkdirp "^0.5.1"
+    move-concurrently "^1.0.1"
+    promise-inflight "^1.0.1"
+    rimraf "^2.6.2"
+    ssri "^5.2.4"
+    unique-filename "^1.1.0"
+    y18n "^4.0.0"
+
+cache-base@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2"
+  dependencies:
+    collection-visit "^1.0.0"
+    component-emitter "^1.2.1"
+    get-value "^2.0.6"
+    has-value "^1.0.0"
+    isobject "^3.0.1"
+    set-value "^2.0.0"
+    to-object-path "^0.3.0"
+    union-value "^1.0.0"
+    unset-value "^1.0.0"
+
+cacheable-request@^2.1.1:
+  version "2.1.4"
+  resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-2.1.4.tgz#0d808801b6342ad33c91df9d0b44dc09b91e5c3d"
+  dependencies:
+    clone-response "1.0.2"
+    get-stream "3.0.0"
+    http-cache-semantics "3.8.1"
+    keyv "3.0.0"
+    lowercase-keys "1.0.0"
+    normalize-url "2.0.1"
+    responselike "1.0.2"
+
+cached-path-relative@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/cached-path-relative/-/cached-path-relative-1.0.1.tgz#d09c4b52800aa4c078e2dd81a869aac90d2e54e7"
+
+caller-path@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f"
+  dependencies:
+    callsites "^0.2.0"
+
+callsite@1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20"
+
+callsites@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca"
+
+callsites@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50"
+
+camelcase@^1.0.2:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39"
+
+camelcase@^4.1.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd"
+
+caseless@~0.11.0:
+  version "0.11.0"
+  resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7"
+
+caseless@~0.12.0:
+  version "0.12.0"
+  resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
+
+center-align@^0.1.1:
+  version "0.1.3"
+  resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad"
+  dependencies:
+    align-text "^0.1.3"
+    lazy-cache "^1.0.3"
+
+chalk@^1.1.1, chalk@^1.1.3:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
+  dependencies:
+    ansi-styles "^2.2.1"
+    escape-string-regexp "^1.0.2"
+    has-ansi "^2.0.0"
+    strip-ansi "^3.0.0"
+    supports-color "^2.0.0"
+
+chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.3.1:
+  version "2.3.2"
+  resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.2.tgz#250dc96b07491bfd601e648d66ddf5f60c7a5c65"
+  dependencies:
+    ansi-styles "^3.2.1"
+    escape-string-regexp "^1.0.5"
+    supports-color "^5.3.0"
+
+chardet@^0.4.0:
+  version "0.4.2"
+  resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2"
+
+chokidar@^1.4.1:
+  version "1.7.0"
+  resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468"
+  dependencies:
+    anymatch "^1.3.0"
+    async-each "^1.0.0"
+    glob-parent "^2.0.0"
+    inherits "^2.0.1"
+    is-binary-path "^1.0.0"
+    is-glob "^2.0.0"
+    path-is-absolute "^1.0.0"
+    readdirp "^2.0.0"
+  optionalDependencies:
+    fsevents "^1.0.0"
+
+chokidar@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.2.tgz#4dc65139eeb2714977735b6a35d06e97b494dfd7"
+  dependencies:
+    anymatch "^2.0.0"
+    async-each "^1.0.0"
+    braces "^2.3.0"
+    glob-parent "^3.1.0"
+    inherits "^2.0.1"
+    is-binary-path "^1.0.0"
+    is-glob "^4.0.0"
+    normalize-path "^2.1.1"
+    path-is-absolute "^1.0.0"
+    readdirp "^2.0.0"
+    upath "^1.0.0"
+  optionalDependencies:
+    fsevents "^1.0.0"
+
+chownr@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181"
+
+chrome-trace-event@^0.1.1:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-0.1.2.tgz#90f36885d5345a50621332f0717b595883d5d982"
+
+ci-info@^1.0.0:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.1.2.tgz#03561259db48d0474c8bdc90f5b47b068b6bbfb4"
+
+cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de"
+  dependencies:
+    inherits "^2.0.1"
+    safe-buffer "^5.0.1"
+
+circular-json@^0.3.1:
+  version "0.3.3"
+  resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66"
+
+circular-json@^0.5.1:
+  version "0.5.1"
+  resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.5.1.tgz#b8942a09e535863dc21b04417a91971e1d9cd91f"
+
+class-utils@^0.3.5:
+  version "0.3.6"
+  resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463"
+  dependencies:
+    arr-union "^3.1.0"
+    define-property "^0.2.5"
+    isobject "^3.0.0"
+    static-extend "^0.1.1"
+
+cli-cursor@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5"
+  dependencies:
+    restore-cursor "^2.0.0"
+
+cli-width@^2.0.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639"
+
+cliui@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1"
+  dependencies:
+    center-align "^0.1.1"
+    right-align "^0.1.1"
+    wordwrap "0.0.2"
+
+cliui@^3.2.0:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d"
+  dependencies:
+    string-width "^1.0.1"
+    strip-ansi "^3.0.1"
+    wrap-ansi "^2.0.0"
+
+cliui@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.0.0.tgz#743d4650e05f36d1ed2575b59638d87322bfbbcc"
+  dependencies:
+    string-width "^2.1.1"
+    strip-ansi "^4.0.0"
+    wrap-ansi "^2.0.0"
+
+clone-response@1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b"
+  dependencies:
+    mimic-response "^1.0.0"
+
+co@^4.6.0:
+  version "4.6.0"
+  resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
+
+co@~3.0.6:
+  version "3.0.6"
+  resolved "https://registry.yarnpkg.com/co/-/co-3.0.6.tgz#1445f226c5eb956138e68c9ac30167ea7d2e6bda"
+
+code-point-at@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
+
+collection-visit@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0"
+  dependencies:
+    map-visit "^1.0.0"
+    object-visit "^1.0.0"
+
+color-convert@^1.9.0:
+  version "1.9.1"
+  resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.1.tgz#c1261107aeb2f294ebffec9ed9ecad529a6097ed"
+  dependencies:
+    color-name "^1.1.1"
+
+color-name@^1.1.1:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
+
+colors@^1.1.0:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63"
+
+combine-lists@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/combine-lists/-/combine-lists-1.0.1.tgz#458c07e09e0d900fc28b70a3fec2dacd1d2cb7f6"
+  dependencies:
+    lodash "^4.5.0"
+
+combine-source-map@~0.7.1:
+  version "0.7.2"
+  resolved "https://registry.yarnpkg.com/combine-source-map/-/combine-source-map-0.7.2.tgz#0870312856b307a87cc4ac486f3a9a62aeccc09e"
+  dependencies:
+    convert-source-map "~1.1.0"
+    inline-source-map "~0.6.0"
+    lodash.memoize "~3.0.3"
+    source-map "~0.5.3"
+
+combine-source-map@~0.8.0:
+  version "0.8.0"
+  resolved "https://registry.yarnpkg.com/combine-source-map/-/combine-source-map-0.8.0.tgz#a58d0df042c186fcf822a8e8015f5450d2d79a8b"
+  dependencies:
+    convert-source-map "~1.1.0"
+    inline-source-map "~0.6.0"
+    lodash.memoize "~3.0.3"
+    source-map "~0.5.3"
+
+combined-stream@1.0.6, combined-stream@^1.0.5, combined-stream@~1.0.5:
+  version "1.0.6"
+  resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818"
+  dependencies:
+    delayed-stream "~1.0.0"
+
+commander@^2.9.0, commander@~2.14.1:
+  version "2.14.1"
+  resolved "https://registry.yarnpkg.com/commander/-/commander-2.14.1.tgz#2235123e37af8ca3c65df45b026dbd357b01b9aa"
+
+commander@~2.13.0:
+  version "2.13.0"
+  resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c"
+
+commondir@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
+
+component-bind@1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1"
+
+component-emitter@1.2.1, component-emitter@^1.2.1:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6"
+
+component-inherit@0.0.3:
+  version "0.0.3"
+  resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143"
+
+concat-map@0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+
+concat-stream@^1.5.0, concat-stream@^1.6.0:
+  version "1.6.1"
+  resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.1.tgz#261b8f518301f1d834e36342b9fea095d2620a26"
+  dependencies:
+    inherits "^2.0.3"
+    readable-stream "^2.2.2"
+    typedarray "^0.0.6"
+
+concat-stream@~1.5.0, concat-stream@~1.5.1:
+  version "1.5.2"
+  resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.5.2.tgz#708978624d856af41a5a741defdd261da752c266"
+  dependencies:
+    inherits "~2.0.1"
+    readable-stream "~2.0.0"
+    typedarray "~0.0.5"
+
+connect@^3.6.0:
+  version "3.6.6"
+  resolved "https://registry.yarnpkg.com/connect/-/connect-3.6.6.tgz#09eff6c55af7236e137135a72574858b6786f524"
+  dependencies:
+    debug "2.6.9"
+    finalhandler "1.1.0"
+    parseurl "~1.3.2"
+    utils-merge "1.0.1"
+
+console-browserify@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10"
+  dependencies:
+    date-now "^0.1.4"
+
+console-control-strings@^1.0.0, console-control-strings@~1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
+
+constants-browserify@^1.0.0, constants-browserify@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75"
+
+content-type-parser@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/content-type-parser/-/content-type-parser-1.0.2.tgz#caabe80623e63638b2502fd4c7f12ff4ce2352e7"
+
+content-type@~1.0.4:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
+
+convert-source-map@^1.4.0, convert-source-map@^1.5.0:
+  version "1.5.1"
+  resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5"
+
+convert-source-map@~1.1.0:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.1.3.tgz#4829c877e9fe49b3161f3bf3673888e204699860"
+
+cookie@0.3.1:
+  version "0.3.1"
+  resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb"
+
+copy-concurrently@^1.0.0:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0"
+  dependencies:
+    aproba "^1.1.1"
+    fs-write-stream-atomic "^1.0.8"
+    iferr "^0.1.5"
+    mkdirp "^0.5.1"
+    rimraf "^2.5.4"
+    run-queue "^1.0.0"
+
+copy-descriptor@^0.1.0:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
+
+core-js@^2.2.0, core-js@^2.4.0, core-js@^2.5.0:
+  version "2.5.3"
+  resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.3.tgz#8acc38345824f16d8365b7c9b4259168e8ed603e"
+
+core-util-is@1.0.2, core-util-is@~1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
+
+create-ecdh@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.0.tgz#888c723596cdf7612f6498233eebd7a35301737d"
+  dependencies:
+    bn.js "^4.1.0"
+    elliptic "^6.0.0"
+
+create-hash@^1.1.0, create-hash@^1.1.2:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.1.3.tgz#606042ac8b9262750f483caddab0f5819172d8fd"
+  dependencies:
+    cipher-base "^1.0.1"
+    inherits "^2.0.1"
+    ripemd160 "^2.0.0"
+    sha.js "^2.4.0"
+
+create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4:
+  version "1.1.6"
+  resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.6.tgz#acb9e221a4e17bdb076e90657c42b93e3726cf06"
+  dependencies:
+    cipher-base "^1.0.3"
+    create-hash "^1.1.0"
+    inherits "^2.0.1"
+    ripemd160 "^2.0.0"
+    safe-buffer "^5.0.1"
+    sha.js "^2.4.8"
+
+cross-spawn@^5.0.1, cross-spawn@^5.1.0:
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449"
+  dependencies:
+    lru-cache "^4.0.1"
+    shebang-command "^1.2.0"
+    which "^1.2.9"
+
+cryptiles@2.x.x:
+  version "2.0.5"
+  resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8"
+  dependencies:
+    boom "2.x.x"
+
+cryptiles@3.x.x:
+  version "3.1.2"
+  resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-3.1.2.tgz#a89fbb220f5ce25ec56e8c4aa8a4fd7b5b0d29fe"
+  dependencies:
+    boom "5.x.x"
+
+crypto-browserify@^3.0.0, crypto-browserify@^3.11.0:
+  version "3.12.0"
+  resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec"
+  dependencies:
+    browserify-cipher "^1.0.0"
+    browserify-sign "^4.0.0"
+    create-ecdh "^4.0.0"
+    create-hash "^1.1.0"
+    create-hmac "^1.1.0"
+    diffie-hellman "^5.0.0"
+    inherits "^2.0.1"
+    pbkdf2 "^3.0.3"
+    public-encrypt "^4.0.0"
+    randombytes "^2.0.0"
+    randomfill "^1.0.3"
+
+cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0":
+  version "0.3.2"
+  resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.2.tgz#b8036170c79f07a90ff2f16e22284027a243848b"
+
+"cssstyle@>= 0.2.37 < 0.3.0":
+  version "0.2.37"
+  resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.2.37.tgz#541097234cb2513c83ceed3acddc27ff27987d54"
+  dependencies:
+    cssom "0.3.x"
+
+custom-event@~1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/custom-event/-/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5bfd0425"
+
+cyclist@~0.2.2:
+  version "0.2.2"
+  resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640"
+
+d@1:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f"
+  dependencies:
+    es5-ext "^0.10.9"
+
+dashdash@^1.12.0:
+  version "1.14.1"
+  resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
+  dependencies:
+    assert-plus "^1.0.0"
+
+data-uri-to-buffer@1:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-1.2.0.tgz#77163ea9c20d8641b4707e8f18abdf9a78f34835"
+
+date-format@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/date-format/-/date-format-1.2.0.tgz#615e828e233dd1ab9bb9ae0950e0ceccfa6ecad8"
+
+date-now@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b"
+
+debug@2, debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@~2.6.4, debug@~2.6.6:
+  version "2.6.9"
+  resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
+  dependencies:
+    ms "2.0.0"
+
+debug@^3.1.0, debug@~3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
+  dependencies:
+    ms "2.0.0"
+
+debug@~2.2.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da"
+  dependencies:
+    ms "0.7.1"
+
+decamelize@^1.0.0, decamelize@^1.1.1:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
+
+decode-uri-component@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
+
+decompress-response@^3.3.0:
+  version "3.3.0"
+  resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3"
+  dependencies:
+    mimic-response "^1.0.0"
+
+deep-extend@~0.4.0:
+  version "0.4.2"
+  resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f"
+
+deep-is@~0.1.3:
+  version "0.1.3"
+  resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
+
+default-require-extensions@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-1.0.0.tgz#f37ea15d3e13ffd9b437d33e1a75b5fb97874cb8"
+  dependencies:
+    strip-bom "^2.0.0"
+
+define-properties@^1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94"
+  dependencies:
+    foreach "^2.0.5"
+    object-keys "^1.0.8"
+
+define-property@^0.2.5:
+  version "0.2.5"
+  resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116"
+  dependencies:
+    is-descriptor "^0.1.0"
+
+define-property@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6"
+  dependencies:
+    is-descriptor "^1.0.0"
+
+define-property@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d"
+  dependencies:
+    is-descriptor "^1.0.2"
+    isobject "^3.0.1"
+
+defined@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693"
+
+degenerator@~1.0.2:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/degenerator/-/degenerator-1.0.4.tgz#fcf490a37ece266464d9cc431ab98c5819ced095"
+  dependencies:
+    ast-types "0.x.x"
+    escodegen "1.x.x"
+    esprima "3.x.x"
+
+del@^2.0.2:
+  version "2.2.2"
+  resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8"
+  dependencies:
+    globby "^5.0.0"
+    is-path-cwd "^1.0.0"
+    is-path-in-cwd "^1.0.0"
+    object-assign "^4.0.1"
+    pify "^2.0.0"
+    pinkie-promise "^2.0.0"
+    rimraf "^2.2.8"
+
+delayed-stream@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
+
+delegates@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
+
+depd@1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359"
+
+depd@~1.1.1:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
+
+deps-sort@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/deps-sort/-/deps-sort-2.0.0.tgz#091724902e84658260eb910748cccd1af6e21fb5"
+  dependencies:
+    JSONStream "^1.0.3"
+    shasum "^1.0.0"
+    subarg "^1.0.0"
+    through2 "^2.0.0"
+
+des.js@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc"
+  dependencies:
+    inherits "^2.0.1"
+    minimalistic-assert "^1.0.0"
+
+detect-indent@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208"
+  dependencies:
+    repeating "^2.0.0"
+
+detect-libc@^1.0.2:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
+
+detect-newline@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2"
+
+detective@^4.0.0:
+  version "4.7.1"
+  resolved "https://registry.yarnpkg.com/detective/-/detective-4.7.1.tgz#0eca7314338442febb6d65da54c10bb1c82b246e"
+  dependencies:
+    acorn "^5.2.1"
+    defined "^1.0.0"
+
+di@^0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c"
+
+diff@^3.2.0:
+  version "3.4.0"
+  resolved "https://registry.yarnpkg.com/diff/-/diff-3.4.0.tgz#b1d85507daf3964828de54b37d0d73ba67dda56c"
+
+diffie-hellman@^5.0.0:
+  version "5.0.2"
+  resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.2.tgz#b5835739270cfe26acf632099fded2a07f209e5e"
+  dependencies:
+    bn.js "^4.1.0"
+    miller-rabin "^4.0.0"
+    randombytes "^2.0.0"
+
+doctrine@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d"
+  dependencies:
+    esutils "^2.0.2"
+
+dom-serialize@^2.2.0:
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/dom-serialize/-/dom-serialize-2.2.1.tgz#562ae8999f44be5ea3076f5419dcd59eb43ac95b"
+  dependencies:
+    custom-event "~1.0.0"
+    ent "~2.2.0"
+    extend "^3.0.0"
+    void-elements "^2.0.0"
+
+domain-browser@^1.1.1:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda"
+
+domain-browser@~1.1.0:
+  version "1.1.7"
+  resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b21fdf8698bc"
+
+domexception@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90"
+  dependencies:
+    webidl-conversions "^4.0.2"
+
+double-ended-queue@^2.1.0-0:
+  version "2.1.0-0"
+  resolved "https://registry.yarnpkg.com/double-ended-queue/-/double-ended-queue-2.1.0-0.tgz#103d3527fd31528f40188130c841efdd78264e5c"
+
+duplexer2@^0.1.2, duplexer2@~0.1.0, duplexer2@~0.1.2:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1"
+  dependencies:
+    readable-stream "^2.0.2"
+
+duplexer3@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2"
+
+duplexify@^3.4.2, duplexify@^3.5.3:
+  version "3.5.4"
+  resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.5.4.tgz#4bb46c1796eabebeec4ca9a2e66b808cb7a3d8b4"
+  dependencies:
+    end-of-stream "^1.0.0"
+    inherits "^2.0.1"
+    readable-stream "^2.0.0"
+    stream-shift "^1.0.0"
+
+ecc-jsbn@~0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505"
+  dependencies:
+    jsbn "~0.1.0"
+
+ee-first@1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
+
+elliptic@^6.0.0:
+  version "6.4.0"
+  resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df"
+  dependencies:
+    bn.js "^4.4.0"
+    brorand "^1.0.1"
+    hash.js "^1.0.0"
+    hmac-drbg "^1.0.0"
+    inherits "^2.0.1"
+    minimalistic-assert "^1.0.0"
+    minimalistic-crypto-utils "^1.0.0"
+
+emojis-list@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389"
+
+encodeurl@~1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
+
+end-of-stream@^1.0.0, end-of-stream@^1.1.0:
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43"
+  dependencies:
+    once "^1.4.0"
+
+engine.io-client@~3.1.0:
+  version "3.1.5"
+  resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.1.5.tgz#85de17666560327ef1817978f6e3f8101ded2c47"
+  dependencies:
+    component-emitter "1.2.1"
+    component-inherit "0.0.3"
+    debug "~3.1.0"
+    engine.io-parser "~2.1.1"
+    has-cors "1.1.0"
+    indexof "0.0.1"
+    parseqs "0.0.5"
+    parseuri "0.0.5"
+    ws "~3.3.1"
+    xmlhttprequest-ssl "~1.5.4"
+    yeast "0.1.2"
+
+engine.io-parser@~2.1.0, engine.io-parser@~2.1.1:
+  version "2.1.2"
+  resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-2.1.2.tgz#4c0f4cff79aaeecbbdcfdea66a823c6085409196"
+  dependencies:
+    after "0.8.2"
+    arraybuffer.slice "~0.0.7"
+    base64-arraybuffer "0.1.5"
+    blob "0.0.4"
+    has-binary2 "~1.0.2"
+
+engine.io@~3.1.0:
+  version "3.1.5"
+  resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-3.1.5.tgz#0e7ef9d690eb0b35597f1d4ad02a26ca2dba3845"
+  dependencies:
+    accepts "~1.3.4"
+    base64id "1.0.0"
+    cookie "0.3.1"
+    debug "~3.1.0"
+    engine.io-parser "~2.1.0"
+    ws "~3.3.1"
+  optionalDependencies:
+    uws "~9.14.0"
+
+enhanced-resolve@^3.4.0:
+  version "3.4.1"
+  resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz#0421e339fd71419b3da13d129b3979040230476e"
+  dependencies:
+    graceful-fs "^4.1.2"
+    memory-fs "^0.4.0"
+    object-assign "^4.0.1"
+    tapable "^0.2.7"
+
+enhanced-resolve@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.0.0.tgz#e34a6eaa790f62fccd71d93959f56b2b432db10a"
+  dependencies:
+    graceful-fs "^4.1.2"
+    memory-fs "^0.4.0"
+    tapable "^1.0.0"
+
+ent@~2.2.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d"
+
+errno@^0.1.3, errno@~0.1.7:
+  version "0.1.7"
+  resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618"
+  dependencies:
+    prr "~1.0.1"
+
+error-ex@^1.2.0:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc"
+  dependencies:
+    is-arrayish "^0.2.1"
+
+es-abstract@^1.5.1:
+  version "1.10.0"
+  resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.10.0.tgz#1ecb36c197842a00d8ee4c2dfd8646bb97d60864"
+  dependencies:
+    es-to-primitive "^1.1.1"
+    function-bind "^1.1.1"
+    has "^1.0.1"
+    is-callable "^1.1.3"
+    is-regex "^1.0.4"
+
+es-to-primitive@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d"
+  dependencies:
+    is-callable "^1.1.1"
+    is-date-object "^1.0.1"
+    is-symbol "^1.0.1"
+
+es5-ext@^0.10.14, es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14:
+  version "0.10.39"
+  resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.39.tgz#fca21b67559277ca4ac1a1ed7048b107b6f76d87"
+  dependencies:
+    es6-iterator "~2.0.3"
+    es6-symbol "~3.1.1"
+
+es6-iterator@^2.0.1, es6-iterator@~2.0.1, es6-iterator@~2.0.3:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7"
+  dependencies:
+    d "1"
+    es5-ext "^0.10.35"
+    es6-symbol "^3.1.1"
+
+es6-map@^0.1.3:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0"
+  dependencies:
+    d "1"
+    es5-ext "~0.10.14"
+    es6-iterator "~2.0.1"
+    es6-set "~0.1.5"
+    es6-symbol "~3.1.1"
+    event-emitter "~0.3.5"
+
+es6-set@~0.1.5:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1"
+  dependencies:
+    d "1"
+    es5-ext "~0.10.14"
+    es6-iterator "~2.0.1"
+    es6-symbol "3.1.1"
+    event-emitter "~0.3.5"
+
+es6-symbol@3.1.1, es6-symbol@^3.1.1, es6-symbol@~3.1.1:
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77"
+  dependencies:
+    d "1"
+    es5-ext "~0.10.14"
+
+es6-weak-map@^2.0.1:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f"
+  dependencies:
+    d "1"
+    es5-ext "^0.10.14"
+    es6-iterator "^2.0.1"
+    es6-symbol "^3.1.1"
+
+escape-html@~1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
+
+escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+
+escodegen@1.x.x, escodegen@^1.9.0:
+  version "1.9.1"
+  resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.9.1.tgz#dbae17ef96c8e4bedb1356f4504fa4cc2f7cb7e2"
+  dependencies:
+    esprima "^3.1.3"
+    estraverse "^4.2.0"
+    esutils "^2.0.2"
+    optionator "^0.8.1"
+  optionalDependencies:
+    source-map "~0.6.1"
+
+escope@^3.6.0:
+  version "3.6.0"
+  resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3"
+  dependencies:
+    es6-map "^0.1.3"
+    es6-weak-map "^2.0.1"
+    esrecurse "^4.1.0"
+    estraverse "^4.1.1"
+
+eslint-scope@^3.7.1:
+  version "3.7.1"
+  resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8"
+  dependencies:
+    esrecurse "^4.1.0"
+    estraverse "^4.1.1"
+
+eslint-visitor-keys@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d"
+
+eslint@^4.17.0:
+  version "4.18.2"
+  resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.18.2.tgz#0f81267ad1012e7d2051e186a9004cc2267b8d45"
+  dependencies:
+    ajv "^5.3.0"
+    babel-code-frame "^6.22.0"
+    chalk "^2.1.0"
+    concat-stream "^1.6.0"
+    cross-spawn "^5.1.0"
+    debug "^3.1.0"
+    doctrine "^2.1.0"
+    eslint-scope "^3.7.1"
+    eslint-visitor-keys "^1.0.0"
+    espree "^3.5.2"
+    esquery "^1.0.0"
+    esutils "^2.0.2"
+    file-entry-cache "^2.0.0"
+    functional-red-black-tree "^1.0.1"
+    glob "^7.1.2"
+    globals "^11.0.1"
+    ignore "^3.3.3"
+    imurmurhash "^0.1.4"
+    inquirer "^3.0.6"
+    is-resolvable "^1.0.0"
+    js-yaml "^3.9.1"
+    json-stable-stringify-without-jsonify "^1.0.1"
+    levn "^0.3.0"
+    lodash "^4.17.4"
+    minimatch "^3.0.2"
+    mkdirp "^0.5.1"
+    natural-compare "^1.4.0"
+    optionator "^0.8.2"
+    path-is-inside "^1.0.2"
+    pluralize "^7.0.0"
+    progress "^2.0.0"
+    require-uncached "^1.0.3"
+    semver "^5.3.0"
+    strip-ansi "^4.0.0"
+    strip-json-comments "~2.0.1"
+    table "4.0.2"
+    text-table "~0.2.0"
+
+espree@^3.5.2:
+  version "3.5.3"
+  resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.3.tgz#931e0af64e7fbbed26b050a29daad1fc64799fa6"
+  dependencies:
+    acorn "^5.4.0"
+    acorn-jsx "^3.0.0"
+
+esprima@3.x.x, esprima@^3.1.3:
+  version "3.1.3"
+  resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633"
+
+esprima@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804"
+
+esquery@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.0.tgz#cfba8b57d7fba93f17298a8a006a04cda13d80fa"
+  dependencies:
+    estraverse "^4.0.0"
+
+esrecurse@^4.1.0:
+  version "4.2.1"
+  resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf"
+  dependencies:
+    estraverse "^4.1.0"
+
+estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0:
+  version "4.2.0"
+  resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13"
+
+estree-walker@^0.3.0:
+  version "0.3.1"
+  resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.3.1.tgz#e6b1a51cf7292524e7237c312e5fe6660c1ce1aa"
+
+esutils@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b"
+
+event-emitter@~0.3.5:
+  version "0.3.5"
+  resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39"
+  dependencies:
+    d "1"
+    es5-ext "~0.10.14"
+
+eventemitter3@1.x.x:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508"
+
+events@^1.0.0, events@~1.1.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924"
+
+evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02"
+  dependencies:
+    md5.js "^1.3.4"
+    safe-buffer "^5.1.1"
+
+exec-sh@^0.2.0:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.1.tgz#163b98a6e89e6b65b47c2a28d215bc1f63989c38"
+  dependencies:
+    merge "^1.1.3"
+
+execa@^0.7.0:
+  version "0.7.0"
+  resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777"
+  dependencies:
+    cross-spawn "^5.0.1"
+    get-stream "^3.0.0"
+    is-stream "^1.1.0"
+    npm-run-path "^2.0.0"
+    p-finally "^1.0.0"
+    signal-exit "^3.0.0"
+    strip-eof "^1.0.0"
+
+exists-sync@0.0.4:
+  version "0.0.4"
+  resolved "https://registry.yarnpkg.com/exists-sync/-/exists-sync-0.0.4.tgz#9744c2c428cc03b01060db454d4b12f0ef3c8879"
+
+exit@^0.1.2:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c"
+
+expand-braces@^0.1.1:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/expand-braces/-/expand-braces-0.1.2.tgz#488b1d1d2451cb3d3a6b192cfc030f44c5855fea"
+  dependencies:
+    array-slice "^0.2.3"
+    array-unique "^0.2.1"
+    braces "^0.1.2"
+
+expand-brackets@^0.1.4:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b"
+  dependencies:
+    is-posix-bracket "^0.1.0"
+
+expand-brackets@^2.1.4:
+  version "2.1.4"
+  resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622"
+  dependencies:
+    debug "^2.3.3"
+    define-property "^0.2.5"
+    extend-shallow "^2.0.1"
+    posix-character-classes "^0.1.0"
+    regex-not "^1.0.0"
+    snapdragon "^0.8.1"
+    to-regex "^3.0.1"
+
+expand-range@^0.1.0:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-0.1.1.tgz#4cb8eda0993ca56fa4f41fc42f3cbb4ccadff044"
+  dependencies:
+    is-number "^0.1.1"
+    repeat-string "^0.2.2"
+
+expand-range@^1.8.1:
+  version "1.8.2"
+  resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337"
+  dependencies:
+    fill-range "^2.1.0"
+
+expect@^22.4.0:
+  version "22.4.0"
+  resolved "https://registry.yarnpkg.com/expect/-/expect-22.4.0.tgz#371edf1ae15b83b5bf5ec34b42f1584660a36c16"
+  dependencies:
+    ansi-styles "^3.2.0"
+    jest-diff "^22.4.0"
+    jest-get-type "^22.1.0"
+    jest-matcher-utils "^22.4.0"
+    jest-message-util "^22.4.0"
+    jest-regex-util "^22.1.0"
+
+extend-shallow@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f"
+  dependencies:
+    is-extendable "^0.1.0"
+
+extend-shallow@^3.0.0, extend-shallow@^3.0.2:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8"
+  dependencies:
+    assign-symbols "^1.0.0"
+    is-extendable "^1.0.1"
+
+extend@3, extend@^3.0.0, extend@~3.0.0, extend@~3.0.1:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444"
+
+external-editor@^2.0.4:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.1.0.tgz#3d026a21b7f95b5726387d4200ac160d372c3b48"
+  dependencies:
+    chardet "^0.4.0"
+    iconv-lite "^0.4.17"
+    tmp "^0.0.33"
+
+extglob@^0.3.1:
+  version "0.3.2"
+  resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1"
+  dependencies:
+    is-extglob "^1.0.0"
+
+extglob@^2.0.4:
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543"
+  dependencies:
+    array-unique "^0.3.2"
+    define-property "^1.0.0"
+    expand-brackets "^2.1.4"
+    extend-shallow "^2.0.1"
+    fragment-cache "^0.2.1"
+    regex-not "^1.0.0"
+    snapdragon "^0.8.1"
+    to-regex "^3.0.1"
+
+extsprintf@1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05"
+
+extsprintf@^1.2.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f"
+
+fast-deep-equal@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614"
+
+fast-json-stable-stringify@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2"
+
+fast-levenshtein@~2.0.4:
+  version "2.0.6"
+  resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
+
+fb-watchman@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.0.tgz#54e9abf7dfa2f26cd9b1636c588c1afc05de5d58"
+  dependencies:
+    bser "^2.0.0"
+
+figures@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962"
+  dependencies:
+    escape-string-regexp "^1.0.5"
+
+file-entry-cache@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361"
+  dependencies:
+    flat-cache "^1.2.1"
+    object-assign "^4.0.1"
+
+file-uri-to-path@1:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd"
+
+filename-regex@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26"
+
+fileset@^2.0.2:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/fileset/-/fileset-2.0.3.tgz#8e7548a96d3cc2327ee5e674168723a333bba2a0"
+  dependencies:
+    glob "^7.0.3"
+    minimatch "^3.0.3"
+
+fill-range@^2.1.0:
+  version "2.2.3"
+  resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723"
+  dependencies:
+    is-number "^2.1.0"
+    isobject "^2.0.0"
+    randomatic "^1.1.3"
+    repeat-element "^1.1.2"
+    repeat-string "^1.5.2"
+
+fill-range@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7"
+  dependencies:
+    extend-shallow "^2.0.1"
+    is-number "^3.0.0"
+    repeat-string "^1.6.1"
+    to-regex-range "^2.1.0"
+
+finalhandler@1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.0.tgz#ce0b6855b45853e791b2fcc680046d88253dd7f5"
+  dependencies:
+    debug "2.6.9"
+    encodeurl "~1.0.1"
+    escape-html "~1.0.3"
+    on-finished "~2.3.0"
+    parseurl "~1.3.2"
+    statuses "~1.3.1"
+    unpipe "~1.0.0"
+
+find-cache-dir@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f"
+  dependencies:
+    commondir "^1.0.1"
+    make-dir "^1.0.0"
+    pkg-dir "^2.0.0"
+
+find-up@^1.0.0:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f"
+  dependencies:
+    path-exists "^2.0.0"
+    pinkie-promise "^2.0.0"
+
+find-up@^2.0.0, find-up@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
+  dependencies:
+    locate-path "^2.0.0"
+
+flat-cache@^1.2.1:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481"
+  dependencies:
+    circular-json "^0.3.1"
+    del "^2.0.2"
+    graceful-fs "^4.1.2"
+    write "^0.2.1"
+
+flush-write-stream@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.0.2.tgz#c81b90d8746766f1a609a46809946c45dd8ae417"
+  dependencies:
+    inherits "^2.0.1"
+    readable-stream "^2.0.4"
+
+follow-redirects@1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.0.0.tgz#8e34298cbd2e176f254effec75a1c78cc849fd37"
+  dependencies:
+    debug "^2.2.0"
+
+for-in@^1.0.1, for-in@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
+
+for-own@^0.1.4:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce"
+  dependencies:
+    for-in "^1.0.1"
+
+foreach@^2.0.5:
+  version "2.0.5"
+  resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99"
+
+forever-agent@~0.6.1:
+  version "0.6.1"
+  resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
+
+form-data@~2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.0.0.tgz#6f0aebadcc5da16c13e1ecc11137d85f9b883b25"
+  dependencies:
+    asynckit "^0.4.0"
+    combined-stream "^1.0.5"
+    mime-types "^2.1.11"
+
+form-data@~2.1.1:
+  version "2.1.4"
+  resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1"
+  dependencies:
+    asynckit "^0.4.0"
+    combined-stream "^1.0.5"
+    mime-types "^2.1.12"
+
+form-data@~2.3.1:
+  version "2.3.2"
+  resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.2.tgz#4970498be604c20c005d4f5c23aecd21d6b49099"
+  dependencies:
+    asynckit "^0.4.0"
+    combined-stream "1.0.6"
+    mime-types "^2.1.12"
+
+fragment-cache@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19"
+  dependencies:
+    map-cache "^0.2.2"
+
+from2@^2.1.0, from2@^2.1.1:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af"
+  dependencies:
+    inherits "^2.0.1"
+    readable-stream "^2.0.0"
+
+fs-access@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/fs-access/-/fs-access-1.0.1.tgz#d6a87f262271cefebec30c553407fb995da8777a"
+  dependencies:
+    null-check "^1.0.0"
+
+fs-write-stream-atomic@^1.0.8:
+  version "1.0.10"
+  resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9"
+  dependencies:
+    graceful-fs "^4.1.2"
+    iferr "^0.1.5"
+    imurmurhash "^0.1.4"
+    readable-stream "1 || 2"
+
+fs.realpath@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+
+fsevents@^1.0.0, fsevents@^1.1.1:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.3.tgz#11f82318f5fe7bb2cd22965a108e9306208216d8"
+  dependencies:
+    nan "^2.3.0"
+    node-pre-gyp "^0.6.39"
+
+fstream-ignore@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105"
+  dependencies:
+    fstream "^1.0.0"
+    inherits "2"
+    minimatch "^3.0.0"
+
+fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2:
+  version "1.0.11"
+  resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171"
+  dependencies:
+    graceful-fs "^4.1.2"
+    inherits "~2.0.0"
+    mkdirp ">=0.5 0"
+    rimraf "2"
+
+ftp@~0.3.10:
+  version "0.3.10"
+  resolved "https://registry.yarnpkg.com/ftp/-/ftp-0.3.10.tgz#9197d861ad8142f3e63d5a83bfe4c59f7330885d"
+  dependencies:
+    readable-stream "1.1.x"
+    xregexp "2.0.0"
+
+function-bind@^1.0.2, function-bind@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
+
+functional-red-black-tree@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
+
+gauge@~2.7.3:
+  version "2.7.4"
+  resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7"
+  dependencies:
+    aproba "^1.0.3"
+    console-control-strings "^1.0.0"
+    has-unicode "^2.0.0"
+    object-assign "^4.1.0"
+    signal-exit "^3.0.0"
+    string-width "^1.0.1"
+    strip-ansi "^3.0.1"
+    wide-align "^1.1.0"
+
+generate-function@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74"
+
+generate-object-property@^1.1.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0"
+  dependencies:
+    is-property "^1.0.0"
+
+generate-release@^0.14.0:
+  version "0.14.0"
+  resolved "https://registry.yarnpkg.com/generate-release/-/generate-release-0.14.0.tgz#22b2089b0ff4e0498d2c33fee94d2377199b996d"
+  dependencies:
+    bluebird "^3.5.0"
+    exists-sync "0.0.4"
+    glob "^7.1.2"
+    iniparser "^1.0.5"
+    inquirer "^3.3.0"
+    minimist "^1.2.0"
+    observatory "^1.0.0"
+    rmdir "^1.2.0"
+    temp "^0.8.3"
+    xtend "^4.0.1"
+
+get-caller-file@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5"
+
+get-stream@3.0.0, get-stream@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
+
+get-uri@2:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/get-uri/-/get-uri-2.0.1.tgz#dbdcacacd8c608a38316869368117697a1631c59"
+  dependencies:
+    data-uri-to-buffer "1"
+    debug "2"
+    extend "3"
+    file-uri-to-path "1"
+    ftp "~0.3.10"
+    readable-stream "2"
+
+get-value@^2.0.3, get-value@^2.0.6:
+  version "2.0.6"
+  resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
+
+getpass@^0.1.1:
+  version "0.1.7"
+  resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
+  dependencies:
+    assert-plus "^1.0.0"
+
+glob-base@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4"
+  dependencies:
+    glob-parent "^2.0.0"
+    is-glob "^2.0.0"
+
+glob-parent@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28"
+  dependencies:
+    is-glob "^2.0.0"
+
+glob-parent@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae"
+  dependencies:
+    is-glob "^3.1.0"
+    path-dirname "^1.0.0"
+
+glob@^7.0.3, glob@^7.0.5, glob@^7.0.6, glob@^7.1.0, glob@^7.1.1, glob@^7.1.2:
+  version "7.1.2"
+  resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15"
+  dependencies:
+    fs.realpath "^1.0.0"
+    inflight "^1.0.4"
+    inherits "2"
+    minimatch "^3.0.4"
+    once "^1.3.0"
+    path-is-absolute "^1.0.0"
+
+globals@^11.0.1:
+  version "11.3.0"
+  resolved "https://registry.yarnpkg.com/globals/-/globals-11.3.0.tgz#e04fdb7b9796d8adac9c8f64c14837b2313378b0"
+
+globals@^9.18.0:
+  version "9.18.0"
+  resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a"
+
+globby@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d"
+  dependencies:
+    array-union "^1.0.1"
+    arrify "^1.0.0"
+    glob "^7.0.3"
+    object-assign "^4.0.1"
+    pify "^2.0.0"
+    pinkie-promise "^2.0.0"
+
+got@^8.0.3:
+  version "8.2.0"
+  resolved "https://registry.yarnpkg.com/got/-/got-8.2.0.tgz#0d11a071d05046348a2f5c0a5fa047fb687fdfc6"
+  dependencies:
+    "@sindresorhus/is" "^0.7.0"
+    cacheable-request "^2.1.1"
+    decompress-response "^3.3.0"
+    duplexer3 "^0.1.4"
+    get-stream "^3.0.0"
+    into-stream "^3.1.0"
+    is-retry-allowed "^1.1.0"
+    isurl "^1.0.0-alpha5"
+    lowercase-keys "^1.0.0"
+    mimic-response "^1.0.0"
+    p-cancelable "^0.3.0"
+    p-timeout "^2.0.1"
+    pify "^3.0.0"
+    safe-buffer "^5.1.1"
+    timed-out "^4.0.1"
+    url-parse-lax "^3.0.0"
+    url-to-options "^1.0.1"
+
+graceful-fs@^4.1.11, graceful-fs@^4.1.2:
+  version "4.1.11"
+  resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658"
+
+growly@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081"
+
+handlebars@^4.0.3:
+  version "4.0.11"
+  resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.11.tgz#630a35dfe0294bc281edae6ffc5d329fc7982dcc"
+  dependencies:
+    async "^1.4.0"
+    optimist "^0.6.1"
+    source-map "^0.4.4"
+  optionalDependencies:
+    uglify-js "^2.6"
+
+har-schema@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e"
+
+har-schema@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92"
+
+har-validator@~2.0.6:
+  version "2.0.6"
+  resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d"
+  dependencies:
+    chalk "^1.1.1"
+    commander "^2.9.0"
+    is-my-json-valid "^2.12.4"
+    pinkie-promise "^2.0.0"
+
+har-validator@~4.2.1:
+  version "4.2.1"
+  resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a"
+  dependencies:
+    ajv "^4.9.1"
+    har-schema "^1.0.5"
+
+har-validator@~5.0.3:
+  version "5.0.3"
+  resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd"
+  dependencies:
+    ajv "^5.1.0"
+    har-schema "^2.0.0"
+
+has-ansi@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
+  dependencies:
+    ansi-regex "^2.0.0"
+
+has-binary2@~1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/has-binary2/-/has-binary2-1.0.2.tgz#e83dba49f0b9be4d026d27365350d9f03f54be98"
+  dependencies:
+    isarray "2.0.1"
+
+has-cors@1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39"
+
+has-flag@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa"
+
+has-flag@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51"
+
+has-flag@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
+
+has-symbol-support-x@^1.4.1:
+  version "1.4.2"
+  resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455"
+
+has-to-string-tag-x@^1.2.0:
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz#a045ab383d7b4b2012a00148ab0aa5f290044d4d"
+  dependencies:
+    has-symbol-support-x "^1.4.1"
+
+has-unicode@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
+
+has-value@^0.3.1:
+  version "0.3.1"
+  resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f"
+  dependencies:
+    get-value "^2.0.3"
+    has-values "^0.1.4"
+    isobject "^2.0.0"
+
+has-value@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177"
+  dependencies:
+    get-value "^2.0.6"
+    has-values "^1.0.0"
+    isobject "^3.0.0"
+
+has-values@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771"
+
+has-values@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f"
+  dependencies:
+    is-number "^3.0.0"
+    kind-of "^4.0.0"
+
+has@^1.0.0, has@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28"
+  dependencies:
+    function-bind "^1.0.2"
+
+hash-base@^2.0.0:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-2.0.2.tgz#66ea1d856db4e8a5470cadf6fce23ae5244ef2e1"
+  dependencies:
+    inherits "^2.0.1"
+
+hash-base@^3.0.0:
+  version "3.0.4"
+  resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918"
+  dependencies:
+    inherits "^2.0.1"
+    safe-buffer "^5.0.1"
+
+hash.js@^1.0.0, hash.js@^1.0.3:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.3.tgz#340dedbe6290187151c1ea1d777a3448935df846"
+  dependencies:
+    inherits "^2.0.3"
+    minimalistic-assert "^1.0.0"
+
+hawk@3.1.3, hawk@~3.1.3:
+  version "3.1.3"
+  resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4"
+  dependencies:
+    boom "2.x.x"
+    cryptiles "2.x.x"
+    hoek "2.x.x"
+    sntp "1.x.x"
+
+hawk@~6.0.2:
+  version "6.0.2"
+  resolved "https://registry.yarnpkg.com/hawk/-/hawk-6.0.2.tgz#af4d914eb065f9b5ce4d9d11c1cb2126eecc3038"
+  dependencies:
+    boom "4.x.x"
+    cryptiles "3.x.x"
+    hoek "4.x.x"
+    sntp "2.x.x"
+
+hipchat-notifier@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/hipchat-notifier/-/hipchat-notifier-1.1.0.tgz#b6d249755437c191082367799d3ba9a0f23b231e"
+  dependencies:
+    lodash "^4.0.0"
+    request "^2.0.0"
+
+hmac-drbg@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
+  dependencies:
+    hash.js "^1.0.3"
+    minimalistic-assert "^1.0.0"
+    minimalistic-crypto-utils "^1.0.1"
+
+hoek@2.x.x:
+  version "2.16.3"
+  resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed"
+
+hoek@4.x.x:
+  version "4.2.1"
+  resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.1.tgz#9634502aa12c445dd5a7c5734b572bb8738aacbb"
+
+home-or-tmp@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8"
+  dependencies:
+    os-homedir "^1.0.0"
+    os-tmpdir "^1.0.1"
+
+hosted-git-info@^2.1.4:
+  version "2.5.0"
+  resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c"
+
+html-encoding-sniffer@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8"
+  dependencies:
+    whatwg-encoding "^1.0.1"
+
+htmlescape@^1.1.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/htmlescape/-/htmlescape-1.1.1.tgz#3a03edc2214bca3b66424a3e7959349509cb0351"
+
+http-cache-semantics@3.8.1:
+  version "3.8.1"
+  resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2"
+
+http-errors@1.6.2, http-errors@~1.6.2:
+  version "1.6.2"
+  resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736"
+  dependencies:
+    depd "1.1.1"
+    inherits "2.0.3"
+    setprototypeof "1.0.3"
+    statuses ">= 1.3.1 < 2"
+
+http-proxy-agent@1:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-1.0.0.tgz#cc1ce38e453bf984a0f7702d2dd59c73d081284a"
+  dependencies:
+    agent-base "2"
+    debug "2"
+    extend "3"
+
+http-proxy@^1.13.0:
+  version "1.16.2"
+  resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.16.2.tgz#06dff292952bf64dbe8471fa9df73066d4f37742"
+  dependencies:
+    eventemitter3 "1.x.x"
+    requires-port "1.x.x"
+
+http-signature@~1.1.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf"
+  dependencies:
+    assert-plus "^0.2.0"
+    jsprim "^1.2.2"
+    sshpk "^1.7.0"
+
+http-signature@~1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1"
+  dependencies:
+    assert-plus "^1.0.0"
+    jsprim "^1.2.2"
+    sshpk "^1.7.0"
+
+httpntlm@1.6.1:
+  version "1.6.1"
+  resolved "https://registry.yarnpkg.com/httpntlm/-/httpntlm-1.6.1.tgz#ad01527143a2e8773cfae6a96f58656bb52a34b2"
+  dependencies:
+    httpreq ">=0.4.22"
+    underscore "~1.7.0"
+
+httpreq@>=0.4.22:
+  version "0.4.24"
+  resolved "https://registry.yarnpkg.com/httpreq/-/httpreq-0.4.24.tgz#4335ffd82cd969668a39465c929ac61d6393627f"
+
+https-browserify@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73"
+
+https-proxy-agent@1:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz#35f7da6c48ce4ddbfa264891ac593ee5ff8671e6"
+  dependencies:
+    agent-base "2"
+    debug "2"
+    extend "3"
+
+iconv-lite@0.4.15:
+  version "0.4.15"
+  resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.15.tgz#fe265a218ac6a57cfe854927e9d04c19825eddeb"
+
+iconv-lite@0.4.19, iconv-lite@^0.4.17:
+  version "0.4.19"
+  resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b"
+
+ieee754@^1.1.4:
+  version "1.1.8"
+  resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4"
+
+iferr@^0.1.5:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501"
+
+ignore@^3.3.3:
+  version "3.3.7"
+  resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.7.tgz#612289bfb3c220e186a58118618d5be8c1bab021"
+
+import-local@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/import-local/-/import-local-1.0.0.tgz#5e4ffdc03f4fe6c009c6729beb29631c2f8227bc"
+  dependencies:
+    pkg-dir "^2.0.0"
+    resolve-cwd "^2.0.0"
+
+imurmurhash@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
+
+indexof@0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d"
+
+inflection@~1.10.0:
+  version "1.10.0"
+  resolved "https://registry.yarnpkg.com/inflection/-/inflection-1.10.0.tgz#5bffcb1197ad3e81050f8e17e21668087ee9eb2f"
+
+inflection@~1.3.0:
+  version "1.3.8"
+  resolved "https://registry.yarnpkg.com/inflection/-/inflection-1.3.8.tgz#cbd160da9f75b14c3cc63578d4f396784bf3014e"
+
+inflight@^1.0.4:
+  version "1.0.6"
+  resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+  dependencies:
+    once "^1.3.0"
+    wrappy "1"
+
+inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
+
+inherits@2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1"
+
+ini@~1.3.0:
+  version "1.3.5"
+  resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
+
+iniparser@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/iniparser/-/iniparser-1.0.5.tgz#836d6befe6dfbfcee0bccf1cf9f2acc7027f783d"
+
+inline-source-map@~0.6.0:
+  version "0.6.2"
+  resolved "https://registry.yarnpkg.com/inline-source-map/-/inline-source-map-0.6.2.tgz#f9393471c18a79d1724f863fa38b586370ade2a5"
+  dependencies:
+    source-map "~0.5.3"
+
+inquirer@^3.0.6, inquirer@^3.3.0:
+  version "3.3.0"
+  resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9"
+  dependencies:
+    ansi-escapes "^3.0.0"
+    chalk "^2.0.0"
+    cli-cursor "^2.1.0"
+    cli-width "^2.0.0"
+    external-editor "^2.0.4"
+    figures "^2.0.0"
+    lodash "^4.3.0"
+    mute-stream "0.0.7"
+    run-async "^2.2.0"
+    rx-lite "^4.0.8"
+    rx-lite-aggregates "^4.0.8"
+    string-width "^2.1.0"
+    strip-ansi "^4.0.0"
+    through "^2.3.6"
+
+insert-module-globals@^7.0.0:
+  version "7.0.2"
+  resolved "https://registry.yarnpkg.com/insert-module-globals/-/insert-module-globals-7.0.2.tgz#012c56baa7d3307a8b417d4ec5270cf9741c18f4"
+  dependencies:
+    JSONStream "^1.0.3"
+    combine-source-map "~0.7.1"
+    concat-stream "~1.5.1"
+    is-buffer "^1.1.0"
+    lexical-scope "^1.2.0"
+    process "~0.11.0"
+    through2 "^2.0.0"
+    xtend "^4.0.0"
+
+interpret@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614"
+
+into-stream@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/into-stream/-/into-stream-3.1.0.tgz#96fb0a936c12babd6ff1752a17d05616abd094c6"
+  dependencies:
+    from2 "^2.1.1"
+    p-is-promise "^1.1.0"
+
+invariant@^2.2.2:
+  version "2.2.3"
+  resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.3.tgz#1a827dfde7dcbd7c323f0ca826be8fa7c5e9d688"
+  dependencies:
+    loose-envify "^1.0.0"
+
+invert-kv@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6"
+
+ip@1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/ip/-/ip-1.0.1.tgz#c7e356cdea225ae71b36d70f2e71a92ba4e42590"
+
+ip@^1.1.2, ip@^1.1.4:
+  version "1.1.5"
+  resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a"
+
+is-accessor-descriptor@^0.1.6:
+  version "0.1.6"
+  resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6"
+  dependencies:
+    kind-of "^3.0.2"
+
+is-accessor-descriptor@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656"
+  dependencies:
+    kind-of "^6.0.0"
+
+is-arrayish@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
+
+is-binary-path@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898"
+  dependencies:
+    binary-extensions "^1.0.0"
+
+is-buffer@^1.1.0, is-buffer@^1.1.5:
+  version "1.1.6"
+  resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
+
+is-builtin-module@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe"
+  dependencies:
+    builtin-modules "^1.0.0"
+
+is-callable@^1.1.1, is-callable@^1.1.3:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2"
+
+is-ci@^1.0.10:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.1.0.tgz#247e4162e7860cebbdaf30b774d6b0ac7dcfe7a5"
+  dependencies:
+    ci-info "^1.0.0"
+
+is-data-descriptor@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56"
+  dependencies:
+    kind-of "^3.0.2"
+
+is-data-descriptor@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7"
+  dependencies:
+    kind-of "^6.0.0"
+
+is-date-object@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16"
+
+is-descriptor@^0.1.0:
+  version "0.1.6"
+  resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca"
+  dependencies:
+    is-accessor-descriptor "^0.1.6"
+    is-data-descriptor "^0.1.4"
+    kind-of "^5.0.0"
+
+is-descriptor@^1.0.0, is-descriptor@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec"
+  dependencies:
+    is-accessor-descriptor "^1.0.0"
+    is-data-descriptor "^1.0.0"
+    kind-of "^6.0.2"
+
+is-dotfile@^1.0.0:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1"
+
+is-equal-shallow@^0.1.3:
+  version "0.1.3"
+  resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534"
+  dependencies:
+    is-primitive "^2.0.0"
+
+is-extendable@^0.1.0, is-extendable@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
+
+is-extendable@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4"
+  dependencies:
+    is-plain-object "^2.0.4"
+
+is-extglob@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0"
+
+is-extglob@^2.1.0, is-extglob@^2.1.1:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
+
+is-finite@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa"
+  dependencies:
+    number-is-nan "^1.0.0"
+
+is-fullwidth-code-point@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
+  dependencies:
+    number-is-nan "^1.0.0"
+
+is-fullwidth-code-point@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
+
+is-generator-fn@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-1.0.0.tgz#969d49e1bb3329f6bb7f09089be26578b2ddd46a"
+
+is-glob@^2.0.0, is-glob@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863"
+  dependencies:
+    is-extglob "^1.0.0"
+
+is-glob@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a"
+  dependencies:
+    is-extglob "^2.1.0"
+
+is-glob@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0"
+  dependencies:
+    is-extglob "^2.1.1"
+
+is-my-ip-valid@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz#7b351b8e8edd4d3995d4d066680e664d94696824"
+
+is-my-json-valid@^2.12.4:
+  version "2.17.2"
+  resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.17.2.tgz#6b2103a288e94ef3de5cf15d29dd85fc4b78d65c"
+  dependencies:
+    generate-function "^2.0.0"
+    generate-object-property "^1.1.0"
+    is-my-ip-valid "^1.0.0"
+    jsonpointer "^4.0.0"
+    xtend "^4.0.0"
+
+is-number@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/is-number/-/is-number-0.1.1.tgz#69a7af116963d47206ec9bd9b48a14216f1e3806"
+
+is-number@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f"
+  dependencies:
+    kind-of "^3.0.2"
+
+is-number@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195"
+  dependencies:
+    kind-of "^3.0.2"
+
+is-number@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff"
+
+is-object@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.1.tgz#8952688c5ec2ffd6b03ecc85e769e02903083470"
+
+is-odd@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/is-odd/-/is-odd-2.0.0.tgz#7646624671fd7ea558ccd9a2795182f2958f1b24"
+  dependencies:
+    is-number "^4.0.0"
+
+is-path-cwd@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d"
+
+is-path-in-cwd@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc"
+  dependencies:
+    is-path-inside "^1.0.0"
+
+is-path-inside@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036"
+  dependencies:
+    path-is-inside "^1.0.1"
+
+is-plain-obj@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e"
+
+is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4:
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
+  dependencies:
+    isobject "^3.0.1"
+
+is-posix-bracket@^0.1.0:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4"
+
+is-primitive@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575"
+
+is-promise@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa"
+
+is-property@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84"
+
+is-regex@^1.0.4:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491"
+  dependencies:
+    has "^1.0.1"
+
+is-resolvable@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88"
+
+is-retry-allowed@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34"
+
+is-stream@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
+
+is-symbol@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572"
+
+is-typedarray@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
+
+is-utf8@^0.2.0:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72"
+
+is-windows@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
+
+is@~0.2.6:
+  version "0.2.7"
+  resolved "https://registry.yarnpkg.com/is/-/is-0.2.7.tgz#3b34a2c48f359972f35042849193ae7264b63562"
+
+isarray@0.0.1, isarray@~0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
+
+isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
+
+isarray@2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.1.tgz#a37d94ed9cda2d59865c9f76fe596ee1f338741e"
+
+isbinaryfile@^3.0.0:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.2.tgz#4a3e974ec0cba9004d3fc6cde7209ea69368a621"
+
+isexe@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
+
+isobject@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
+  dependencies:
+    isarray "1.0.0"
+
+isobject@^3.0.0, isobject@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
+
+isstream@~0.1.2:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
+
+istanbul-api@^1.1.14:
+  version "1.2.2"
+  resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.2.2.tgz#e17cd519dd5ec4141197f246fdf380b75487f3b1"
+  dependencies:
+    async "^2.1.4"
+    fileset "^2.0.2"
+    istanbul-lib-coverage "^1.1.2"
+    istanbul-lib-hook "^1.1.0"
+    istanbul-lib-instrument "^1.9.2"
+    istanbul-lib-report "^1.1.3"
+    istanbul-lib-source-maps "^1.2.3"
+    istanbul-reports "^1.1.4"
+    js-yaml "^3.7.0"
+    mkdirp "^0.5.1"
+    once "^1.4.0"
+
+istanbul-lib-coverage@^1.1.1, istanbul-lib-coverage@^1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.2.tgz#4113c8ff6b7a40a1ef7350b01016331f63afde14"
+
+istanbul-lib-hook@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.1.0.tgz#8538d970372cb3716d53e55523dd54b557a8d89b"
+  dependencies:
+    append-transform "^0.4.0"
+
+istanbul-lib-instrument@^1.7.5, istanbul-lib-instrument@^1.8.0, istanbul-lib-instrument@^1.9.2:
+  version "1.9.2"
+  resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.9.2.tgz#84905bf47f7e0b401d6b840da7bad67086b4aab6"
+  dependencies:
+    babel-generator "^6.18.0"
+    babel-template "^6.16.0"
+    babel-traverse "^6.18.0"
+    babel-types "^6.18.0"
+    babylon "^6.18.0"
+    istanbul-lib-coverage "^1.1.2"
+    semver "^5.3.0"
+
+istanbul-lib-report@^1.1.3:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.1.3.tgz#2df12188c0fa77990c0d2176d2d0ba3394188259"
+  dependencies:
+    istanbul-lib-coverage "^1.1.2"
+    mkdirp "^0.5.1"
+    path-parse "^1.0.5"
+    supports-color "^3.1.2"
+
+istanbul-lib-source-maps@^1.2.1, istanbul-lib-source-maps@^1.2.3:
+  version "1.2.3"
+  resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.3.tgz#20fb54b14e14b3fb6edb6aca3571fd2143db44e6"
+  dependencies:
+    debug "^3.1.0"
+    istanbul-lib-coverage "^1.1.2"
+    mkdirp "^0.5.1"
+    rimraf "^2.6.1"
+    source-map "^0.5.3"
+
+istanbul-reports@^1.1.4:
+  version "1.1.4"
+  resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.1.4.tgz#5ccba5e22b7b5a5d91d5e0a830f89be334bf97bd"
+  dependencies:
+    handlebars "^4.0.3"
+
+isurl@^1.0.0-alpha5:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/isurl/-/isurl-1.0.0.tgz#b27f4f49f3cdaa3ea44a0a5b7f3462e6edc39d67"
+  dependencies:
+    has-to-string-tag-x "^1.2.0"
+    is-object "^1.0.1"
+
+jasmine-core@^3.1.0, jasmine-core@~3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-3.1.0.tgz#a4785e135d5df65024dfc9224953df585bd2766c"
+
+jasmine@^3.0.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/jasmine/-/jasmine-3.1.0.tgz#2bd59fd7ec6ec0e8acb64e09f45a68ed2ad1952a"
+  dependencies:
+    glob "^7.0.6"
+    jasmine-core "~3.1.0"
+
+jest-changed-files@^22.2.0:
+  version "22.2.0"
+  resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-22.2.0.tgz#517610c4a8ca0925bdc88b0ca53bd678aa8d019e"
+  dependencies:
+    throat "^4.0.0"
+
+jest-cli@^22.4.2:
+  version "22.4.2"
+  resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-22.4.2.tgz#e6546dc651e13d164481aa3e76e53ac4f4edab06"
+  dependencies:
+    ansi-escapes "^3.0.0"
+    chalk "^2.0.1"
+    exit "^0.1.2"
+    glob "^7.1.2"
+    graceful-fs "^4.1.11"
+    import-local "^1.0.0"
+    is-ci "^1.0.10"
+    istanbul-api "^1.1.14"
+    istanbul-lib-coverage "^1.1.1"
+    istanbul-lib-instrument "^1.8.0"
+    istanbul-lib-source-maps "^1.2.1"
+    jest-changed-files "^22.2.0"
+    jest-config "^22.4.2"
+    jest-environment-jsdom "^22.4.1"
+    jest-get-type "^22.1.0"
+    jest-haste-map "^22.4.2"
+    jest-message-util "^22.4.0"
+    jest-regex-util "^22.1.0"
+    jest-resolve-dependencies "^22.1.0"
+    jest-runner "^22.4.2"
+    jest-runtime "^22.4.2"
+    jest-snapshot "^22.4.0"
+    jest-util "^22.4.1"
+    jest-validate "^22.4.2"
+    jest-worker "^22.2.2"
+    micromatch "^2.3.11"
+    node-notifier "^5.2.1"
+    realpath-native "^1.0.0"
+    rimraf "^2.5.4"
+    slash "^1.0.0"
+    string-length "^2.0.0"
+    strip-ansi "^4.0.0"
+    which "^1.2.12"
+    yargs "^10.0.3"
+
+jest-config@^22.4.2:
+  version "22.4.2"
+  resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-22.4.2.tgz#580ba5819bf81a5e48f4fd470e8b81834f45c855"
+  dependencies:
+    chalk "^2.0.1"
+    glob "^7.1.1"
+    jest-environment-jsdom "^22.4.1"
+    jest-environment-node "^22.4.1"
+    jest-get-type "^22.1.0"
+    jest-jasmine2 "^22.4.2"
+    jest-regex-util "^22.1.0"
+    jest-resolve "^22.4.2"
+    jest-util "^22.4.1"
+    jest-validate "^22.4.2"
+    pretty-format "^22.4.0"
+
+jest-diff@^22.4.0:
+  version "22.4.0"
+  resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-22.4.0.tgz#384c2b78519ca44ca126382df53f134289232525"
+  dependencies:
+    chalk "^2.0.1"
+    diff "^3.2.0"
+    jest-get-type "^22.1.0"
+    pretty-format "^22.4.0"
+
+jest-docblock@^22.4.0:
+  version "22.4.0"
+  resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-22.4.0.tgz#dbf1877e2550070cfc4d9b07a55775a0483159b8"
+  dependencies:
+    detect-newline "^2.1.0"
+
+jest-environment-jsdom@^22.4.1:
+  version "22.4.1"
+  resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-22.4.1.tgz#754f408872441740100d3917e5ec40c74de6447f"
+  dependencies:
+    jest-mock "^22.2.0"
+    jest-util "^22.4.1"
+    jsdom "^11.5.1"
+
+jest-environment-node@^22.4.1:
+  version "22.4.1"
+  resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-22.4.1.tgz#418850eb654596b8d6e36c2021cbedbc23df8e16"
+  dependencies:
+    jest-mock "^22.2.0"
+    jest-util "^22.4.1"
+
+jest-get-type@^22.1.0:
+  version "22.1.0"
+  resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-22.1.0.tgz#4e90af298ed6181edc85d2da500dbd2753e0d5a9"
+
+jest-haste-map@^22.4.2:
+  version "22.4.2"
+  resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-22.4.2.tgz#a90178e66146d4378bb076345a949071f3b015b4"
+  dependencies:
+    fb-watchman "^2.0.0"
+    graceful-fs "^4.1.11"
+    jest-docblock "^22.4.0"
+    jest-serializer "^22.4.0"
+    jest-worker "^22.2.2"
+    micromatch "^2.3.11"
+    sane "^2.0.0"
+
+jest-jasmine2@^22.4.2:
+  version "22.4.2"
+  resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-22.4.2.tgz#dfd3d259579ed6f52510d8f1ab692808f0d40691"
+  dependencies:
+    chalk "^2.0.1"
+    co "^4.6.0"
+    expect "^22.4.0"
+    graceful-fs "^4.1.11"
+    is-generator-fn "^1.0.0"
+    jest-diff "^22.4.0"
+    jest-matcher-utils "^22.4.0"
+    jest-message-util "^22.4.0"
+    jest-snapshot "^22.4.0"
+    jest-util "^22.4.1"
+    source-map-support "^0.5.0"
+
+jest-leak-detector@^22.4.0:
+  version "22.4.0"
+  resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-22.4.0.tgz#64da77f05b001c96d2062226e079f89989c4aa2f"
+  dependencies:
+    pretty-format "^22.4.0"
+
+jest-matcher-utils@^22.4.0:
+  version "22.4.0"
+  resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-22.4.0.tgz#d55f5faf2270462736bdf7c7485ee931c9d4b6a1"
+  dependencies:
+    chalk "^2.0.1"
+    jest-get-type "^22.1.0"
+    pretty-format "^22.4.0"
+
+jest-message-util@^22.4.0:
+  version "22.4.0"
+  resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-22.4.0.tgz#e3d861df16d2fee60cb2bc8feac2188a42579642"
+  dependencies:
+    "@babel/code-frame" "^7.0.0-beta.35"
+    chalk "^2.0.1"
+    micromatch "^2.3.11"
+    slash "^1.0.0"
+    stack-utils "^1.0.1"
+
+jest-mock@^22.2.0:
+  version "22.2.0"
+  resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-22.2.0.tgz#444b3f9488a7473adae09bc8a77294afded397a7"
+
+jest-regex-util@^22.1.0:
+  version "22.1.0"
+  resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-22.1.0.tgz#5daf2fe270074b6da63e5d85f1c9acc866768f53"
+
+jest-resolve-dependencies@^22.1.0:
+  version "22.1.0"
+  resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-22.1.0.tgz#340e4139fb13315cd43abc054e6c06136be51e31"
+  dependencies:
+    jest-regex-util "^22.1.0"
+
+jest-resolve@^22.4.2:
+  version "22.4.2"
+  resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-22.4.2.tgz#25d88aa4147462c9c1c6a1ba16250d3794c24d00"
+  dependencies:
+    browser-resolve "^1.11.2"
+    chalk "^2.0.1"
+
+jest-runner@^22.4.2:
+  version "22.4.2"
+  resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-22.4.2.tgz#19390ea9d99f768973e16f95a1efa351c0017e87"
+  dependencies:
+    exit "^0.1.2"
+    jest-config "^22.4.2"
+    jest-docblock "^22.4.0"
+    jest-haste-map "^22.4.2"
+    jest-jasmine2 "^22.4.2"
+    jest-leak-detector "^22.4.0"
+    jest-message-util "^22.4.0"
+    jest-runtime "^22.4.2"
+    jest-util "^22.4.1"
+    jest-worker "^22.2.2"
+    throat "^4.0.0"
+
+jest-runtime@^22.4.2:
+  version "22.4.2"
+  resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-22.4.2.tgz#0de0444f65ce15ee4f2e0055133fc7c17b9168f3"
+  dependencies:
+    babel-core "^6.0.0"
+    babel-jest "^22.4.1"
+    babel-plugin-istanbul "^4.1.5"
+    chalk "^2.0.1"
+    convert-source-map "^1.4.0"
+    exit "^0.1.2"
+    graceful-fs "^4.1.11"
+    jest-config "^22.4.2"
+    jest-haste-map "^22.4.2"
+    jest-regex-util "^22.1.0"
+    jest-resolve "^22.4.2"
+    jest-util "^22.4.1"
+    jest-validate "^22.4.2"
+    json-stable-stringify "^1.0.1"
+    micromatch "^2.3.11"
+    realpath-native "^1.0.0"
+    slash "^1.0.0"
+    strip-bom "3.0.0"
+    write-file-atomic "^2.1.0"
+    yargs "^10.0.3"
+
+jest-serializer@^22.4.0:
+  version "22.4.0"
+  resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-22.4.0.tgz#b5d145b98c4b0d2c20ab686609adbb81fe23b566"
+
+jest-snapshot@^22.4.0:
+  version "22.4.0"
+  resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-22.4.0.tgz#03d3ce63f8fa7352388afc6a3c8b5ccc3a180ed7"
+  dependencies:
+    chalk "^2.0.1"
+    jest-diff "^22.4.0"
+    jest-matcher-utils "^22.4.0"
+    mkdirp "^0.5.1"
+    natural-compare "^1.4.0"
+    pretty-format "^22.4.0"
+
+jest-util@^22.4.1:
+  version "22.4.1"
+  resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-22.4.1.tgz#dd17c3bdb067f8e90591563ec0c42bf847dc249f"
+  dependencies:
+    callsites "^2.0.0"
+    chalk "^2.0.1"
+    graceful-fs "^4.1.11"
+    is-ci "^1.0.10"
+    jest-message-util "^22.4.0"
+    mkdirp "^0.5.1"
+    source-map "^0.6.0"
+
+jest-validate@^22.4.2:
+  version "22.4.2"
+  resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-22.4.2.tgz#e789a4e056173bf97fe797a2df2d52105c57d4f4"
+  dependencies:
+    chalk "^2.0.1"
+    jest-config "^22.4.2"
+    jest-get-type "^22.1.0"
+    leven "^2.1.0"
+    pretty-format "^22.4.0"
+
+jest-worker@^22.2.2:
+  version "22.2.2"
+  resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-22.2.2.tgz#c1f5dc39976884b81f68ec50cb8532b2cbab3390"
+  dependencies:
+    merge-stream "^1.0.1"
+
+jest@^22.2.2:
+  version "22.4.2"
+  resolved "https://registry.yarnpkg.com/jest/-/jest-22.4.2.tgz#34012834a49bf1bdd3bc783850ab44e4499afc20"
+  dependencies:
+    import-local "^1.0.0"
+    jest-cli "^22.4.2"
+
+js-tokens@^3.0.0, js-tokens@^3.0.2:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
+
+js-yaml@^3.7.0, js-yaml@^3.9.1:
+  version "3.10.0"
+  resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc"
+  dependencies:
+    argparse "^1.0.7"
+    esprima "^4.0.0"
+
+jsbn@~0.1.0:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
+
+jsdom@^11.5.1:
+  version "11.6.2"
+  resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.6.2.tgz#25d1ef332d48adf77fc5221fe2619967923f16bb"
+  dependencies:
+    abab "^1.0.4"
+    acorn "^5.3.0"
+    acorn-globals "^4.1.0"
+    array-equal "^1.0.0"
+    browser-process-hrtime "^0.1.2"
+    content-type-parser "^1.0.2"
+    cssom ">= 0.3.2 < 0.4.0"
+    cssstyle ">= 0.2.37 < 0.3.0"
+    domexception "^1.0.0"
+    escodegen "^1.9.0"
+    html-encoding-sniffer "^1.0.2"
+    left-pad "^1.2.0"
+    nwmatcher "^1.4.3"
+    parse5 "4.0.0"
+    pn "^1.1.0"
+    request "^2.83.0"
+    request-promise-native "^1.0.5"
+    sax "^1.2.4"
+    symbol-tree "^3.2.2"
+    tough-cookie "^2.3.3"
+    w3c-hr-time "^1.0.1"
+    webidl-conversions "^4.0.2"
+    whatwg-encoding "^1.0.3"
+    whatwg-url "^6.4.0"
+    ws "^4.0.0"
+    xml-name-validator "^3.0.0"
+
+jsesc@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b"
+
+json-buffer@3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898"
+
+json-loader@^0.5.4:
+  version "0.5.7"
+  resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.7.tgz#dca14a70235ff82f0ac9a3abeb60d337a365185d"
+
+json-schema-traverse@^0.3.0:
+  version "0.3.1"
+  resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340"
+
+json-schema@0.2.3:
+  version "0.2.3"
+  resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
+
+json-stable-stringify-without-jsonify@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
+
+json-stable-stringify@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af"
+  dependencies:
+    jsonify "~0.0.0"
+
+json-stable-stringify@~0.0.0:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz#611c23e814db375527df851193db59dd2af27f45"
+  dependencies:
+    jsonify "~0.0.0"
+
+json-stringify-safe@5.0.x, json-stringify-safe@~5.0.1:
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
+
+json5@^0.5.0, json5@^0.5.1:
+  version "0.5.1"
+  resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
+
+jsonify@~0.0.0:
+  version "0.0.0"
+  resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73"
+
+jsonparse@^1.2.0:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280"
+
+jsonpointer@^4.0.0:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9"
+
+jsprim@^1.2.2:
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2"
+  dependencies:
+    assert-plus "1.0.0"
+    extsprintf "1.3.0"
+    json-schema "0.2.3"
+    verror "1.10.0"
+
+karma-chrome-launcher@^2.2.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/karma-chrome-launcher/-/karma-chrome-launcher-2.2.0.tgz#cf1b9d07136cc18fe239327d24654c3dbc368acf"
+  dependencies:
+    fs-access "^1.0.0"
+    which "^1.2.1"
+
+karma-firefox-launcher@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/karma-firefox-launcher/-/karma-firefox-launcher-1.1.0.tgz#2c47030452f04531eb7d13d4fc7669630bb93339"
+
+karma-jasmine@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/karma-jasmine/-/karma-jasmine-1.1.1.tgz#6fe840e75a11600c9d91e84b33c458e1c46a3529"
+
+karma-safari-launcher@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/karma-safari-launcher/-/karma-safari-launcher-1.0.0.tgz#96982a2cc47d066aae71c553babb28319115a2ce"
+
+karma-webpack@^2.0.9:
+  version "2.0.13"
+  resolved "https://registry.yarnpkg.com/karma-webpack/-/karma-webpack-2.0.13.tgz#cf56e3056c15b7747a0bb2140fc9a6be41dd9f02"
+  dependencies:
+    async "^2.0.0"
+    babel-runtime "^6.0.0"
+    loader-utils "^1.0.0"
+    lodash "^4.0.0"
+    source-map "^0.5.6"
+    webpack-dev-middleware "^1.12.0"
+
+karma@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/karma/-/karma-2.0.0.tgz#a02698dd7f0f05ff5eb66ab8f65582490b512e58"
+  dependencies:
+    bluebird "^3.3.0"
+    body-parser "^1.16.1"
+    browserify "^14.5.0"
+    chokidar "^1.4.1"
+    colors "^1.1.0"
+    combine-lists "^1.0.0"
+    connect "^3.6.0"
+    core-js "^2.2.0"
+    di "^0.0.1"
+    dom-serialize "^2.2.0"
+    expand-braces "^0.1.1"
+    glob "^7.1.1"
+    graceful-fs "^4.1.2"
+    http-proxy "^1.13.0"
+    isbinaryfile "^3.0.0"
+    lodash "^4.17.4"
+    log4js "^2.3.9"
+    mime "^1.3.4"
+    minimatch "^3.0.2"
+    optimist "^0.6.1"
+    qjobs "^1.1.4"
+    range-parser "^1.2.0"
+    rimraf "^2.6.0"
+    safe-buffer "^5.0.1"
+    socket.io "2.0.4"
+    source-map "^0.6.1"
+    tmp "0.0.33"
+    useragent "^2.1.12"
+
+keyv@3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.0.0.tgz#44923ba39e68b12a7cec7df6c3268c031f2ef373"
+  dependencies:
+    json-buffer "3.0.0"
+
+kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0:
+  version "3.2.2"
+  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
+  dependencies:
+    is-buffer "^1.1.5"
+
+kind-of@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57"
+  dependencies:
+    is-buffer "^1.1.5"
+
+kind-of@^5.0.0:
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d"
+
+kind-of@^6.0.0, kind-of@^6.0.2:
+  version "6.0.2"
+  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051"
+
+labeled-stream-splicer@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/labeled-stream-splicer/-/labeled-stream-splicer-2.0.0.tgz#a52e1d138024c00b86b1c0c91f677918b8ae0a59"
+  dependencies:
+    inherits "^2.0.1"
+    isarray "~0.0.1"
+    stream-splicer "^2.0.0"
+
+lazy-cache@^1.0.3:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e"
+
+lazy-cache@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-2.0.2.tgz#b9190a4f913354694840859f8a8f7084d8822264"
+  dependencies:
+    set-getter "^0.1.0"
+
+lcid@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835"
+  dependencies:
+    invert-kv "^1.0.0"
+
+left-pad@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.2.0.tgz#d30a73c6b8201d8f7d8e7956ba9616087a68e0ee"
+
+leven@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580"
+
+levn@^0.3.0, levn@~0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
+  dependencies:
+    prelude-ls "~1.1.2"
+    type-check "~0.3.2"
+
+lexical-scope@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/lexical-scope/-/lexical-scope-1.2.0.tgz#fcea5edc704a4b3a8796cdca419c3a0afaf22df4"
+  dependencies:
+    astw "^2.0.0"
+
+libbase64@0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/libbase64/-/libbase64-0.1.0.tgz#62351a839563ac5ff5bd26f12f60e9830bb751e6"
+
+libmime@3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/libmime/-/libmime-3.0.0.tgz#51a1a9e7448ecbd32cda54421675bb21bc093da6"
+  dependencies:
+    iconv-lite "0.4.15"
+    libbase64 "0.1.0"
+    libqp "1.1.0"
+
+libqp@1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/libqp/-/libqp-1.1.0.tgz#f5e6e06ad74b794fb5b5b66988bf728ef1dedbe8"
+
+load-json-file@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0"
+  dependencies:
+    graceful-fs "^4.1.2"
+    parse-json "^2.2.0"
+    pify "^2.0.0"
+    pinkie-promise "^2.0.0"
+    strip-bom "^2.0.0"
+
+load-json-file@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8"
+  dependencies:
+    graceful-fs "^4.1.2"
+    parse-json "^2.2.0"
+    pify "^2.0.0"
+    strip-bom "^3.0.0"
+
+loader-runner@^2.3.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2"
+
+loader-utils@^0.2.15:
+  version "0.2.17"
+  resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348"
+  dependencies:
+    big.js "^3.1.3"
+    emojis-list "^2.0.0"
+    json5 "^0.5.0"
+    object-assign "^4.0.1"
+
+loader-utils@^1.0.0, loader-utils@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd"
+  dependencies:
+    big.js "^3.1.3"
+    emojis-list "^2.0.0"
+    json5 "^0.5.0"
+
+locate-path@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"
+  dependencies:
+    p-locate "^2.0.0"
+    path-exists "^3.0.0"
+
+lodash.memoize@~3.0.3:
+  version "3.0.4"
+  resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-3.0.4.tgz#2dcbd2c287cbc0a55cc42328bd0c736150d53e3f"
+
+lodash.sortby@^4.7.0:
+  version "4.7.0"
+  resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438"
+
+lodash@^3.10.1:
+  version "3.10.1"
+  resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6"
+
+lodash@^4.0.0, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.4, lodash@^4.3.0, lodash@^4.5.0:
+  version "4.17.5"
+  resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.5.tgz#99a92d65c0272debe8c96b6057bc8fbfa3bed511"
+
+log4js@^2.3.9:
+  version "2.5.3"
+  resolved "https://registry.yarnpkg.com/log4js/-/log4js-2.5.3.tgz#38bb7bde5e9c1c181bd75e8bc128c5cd0409caf1"
+  dependencies:
+    circular-json "^0.5.1"
+    date-format "^1.2.0"
+    debug "^3.1.0"
+    semver "^5.3.0"
+    streamroller "^0.7.0"
+  optionalDependencies:
+    amqplib "^0.5.2"
+    axios "^0.15.3"
+    hipchat-notifier "^1.1.0"
+    loggly "^1.1.0"
+    mailgun-js "^0.7.0"
+    nodemailer "^2.5.0"
+    redis "^2.7.1"
+    slack-node "~0.2.0"
+
+loggly@^1.1.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/loggly/-/loggly-1.1.1.tgz#0a0fc1d3fa3a5ec44fdc7b897beba2a4695cebee"
+  dependencies:
+    json-stringify-safe "5.0.x"
+    request "2.75.x"
+    timespan "2.3.x"
+
+longest@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097"
+
+loose-envify@^1.0.0:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848"
+  dependencies:
+    js-tokens "^3.0.0"
+
+lowercase-keys@1.0.0, lowercase-keys@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306"
+
+lru-cache@4.1.x, lru-cache@^4.0.1, lru-cache@^4.1.1:
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55"
+  dependencies:
+    pseudomap "^1.0.2"
+    yallist "^2.1.2"
+
+lru-cache@~2.6.5:
+  version "2.6.5"
+  resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.6.5.tgz#e56d6354148ede8d7707b58d143220fd08df0fd5"
+
+magic-string@^0.14.0:
+  version "0.14.0"
+  resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.14.0.tgz#57224aef1701caeed273b17a39a956e72b172462"
+  dependencies:
+    vlq "^0.2.1"
+
+magic-string@^0.22.4:
+  version "0.22.4"
+  resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.22.4.tgz#31039b4e40366395618c1d6cf8193c53917475ff"
+  dependencies:
+    vlq "^0.2.1"
+
+mailcomposer@4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/mailcomposer/-/mailcomposer-4.0.1.tgz#0e1c44b2a07cf740ee17dc149ba009f19cadfeb4"
+  dependencies:
+    buildmail "4.0.1"
+    libmime "3.0.0"
+
+mailgun-js@^0.7.0:
+  version "0.7.15"
+  resolved "https://registry.yarnpkg.com/mailgun-js/-/mailgun-js-0.7.15.tgz#ee366a20dac64c3c15c03d6c1b3e0ed795252abb"
+  dependencies:
+    async "~2.1.2"
+    debug "~2.2.0"
+    form-data "~2.1.1"
+    inflection "~1.10.0"
+    is-stream "^1.1.0"
+    path-proxy "~1.0.0"
+    proxy-agent "~2.0.0"
+    q "~1.4.0"
+    tsscmp "~1.0.0"
+
+make-dir@^1.0.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.2.0.tgz#6d6a49eead4aae296c53bbf3a1a008bd6c89469b"
+  dependencies:
+    pify "^3.0.0"
+
+makeerror@1.0.x:
+  version "1.0.11"
+  resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c"
+  dependencies:
+    tmpl "1.0.x"
+
+map-cache@^0.2.2:
+  version "0.2.2"
+  resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"
+
+map-visit@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f"
+  dependencies:
+    object-visit "^1.0.0"
+
+md5.js@^1.3.4:
+  version "1.3.4"
+  resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.4.tgz#e9bdbde94a20a5ac18b04340fc5764d5b09d901d"
+  dependencies:
+    hash-base "^3.0.0"
+    inherits "^2.0.1"
+
+media-typer@0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
+
+mem@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76"
+  dependencies:
+    mimic-fn "^1.0.0"
+
+memory-fs@^0.4.0, memory-fs@~0.4.1:
+  version "0.4.1"
+  resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552"
+  dependencies:
+    errno "^0.1.3"
+    readable-stream "^2.0.1"
+
+merge-stream@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1"
+  dependencies:
+    readable-stream "^2.0.1"
+
+merge@^1.1.3:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da"
+
+micromatch@^2.1.5, micromatch@^2.3.11:
+  version "2.3.11"
+  resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565"
+  dependencies:
+    arr-diff "^2.0.0"
+    array-unique "^0.2.1"
+    braces "^1.8.2"
+    expand-brackets "^0.1.4"
+    extglob "^0.3.1"
+    filename-regex "^2.0.0"
+    is-extglob "^1.0.0"
+    is-glob "^2.0.1"
+    kind-of "^3.0.2"
+    normalize-path "^2.0.1"
+    object.omit "^2.0.0"
+    parse-glob "^3.0.4"
+    regex-cache "^0.4.2"
+
+micromatch@^3.1.4, micromatch@^3.1.8:
+  version "3.1.9"
+  resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.9.tgz#15dc93175ae39e52e93087847096effc73efcf89"
+  dependencies:
+    arr-diff "^4.0.0"
+    array-unique "^0.3.2"
+    braces "^2.3.1"
+    define-property "^2.0.2"
+    extend-shallow "^3.0.2"
+    extglob "^2.0.4"
+    fragment-cache "^0.2.1"
+    kind-of "^6.0.2"
+    nanomatch "^1.2.9"
+    object.pick "^1.3.0"
+    regex-not "^1.0.0"
+    snapdragon "^0.8.1"
+    to-regex "^3.0.1"
+
+miller-rabin@^4.0.0:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d"
+  dependencies:
+    bn.js "^4.0.0"
+    brorand "^1.0.1"
+
+mime-db@~1.33.0:
+  version "1.33.0"
+  resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db"
+
+mime-types@^2.1.11, mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.18, mime-types@~2.1.7:
+  version "2.1.18"
+  resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8"
+  dependencies:
+    mime-db "~1.33.0"
+
+mime@^1.3.4, mime@^1.5.0:
+  version "1.6.0"
+  resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
+
+mimic-fn@^1.0.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022"
+
+mimic-response@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.0.tgz#df3d3652a73fded6b9b0b24146e6fd052353458e"
+
+minimalistic-assert@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz#702be2dda6b37f4836bcb3f5db56641b64a1d3d3"
+
+minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
+
+minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4:
+  version "3.0.4"
+  resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
+  dependencies:
+    brace-expansion "^1.1.7"
+
+minimist@0.0.8:
+  version "0.0.8"
+  resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
+
+minimist@^1.1.0, minimist@^1.1.1, minimist@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
+
+minimist@~0.0.1:
+  version "0.0.10"
+  resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf"
+
+mississippi@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-2.0.0.tgz#3442a508fafc28500486feea99409676e4ee5a6f"
+  dependencies:
+    concat-stream "^1.5.0"
+    duplexify "^3.4.2"
+    end-of-stream "^1.1.0"
+    flush-write-stream "^1.0.0"
+    from2 "^2.1.0"
+    parallel-transform "^1.1.0"
+    pump "^2.0.1"
+    pumpify "^1.3.3"
+    stream-each "^1.1.0"
+    through2 "^2.0.0"
+
+mixin-deep@^1.2.0:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe"
+  dependencies:
+    for-in "^1.0.2"
+    is-extendable "^1.0.1"
+
+"mkdirp@>=0.5 0", mkdirp@^0.5.1, mkdirp@~0.5.0:
+  version "0.5.1"
+  resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
+  dependencies:
+    minimist "0.0.8"
+
+module-deps@^4.0.8:
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/module-deps/-/module-deps-4.1.1.tgz#23215833f1da13fd606ccb8087b44852dcb821fd"
+  dependencies:
+    JSONStream "^1.0.3"
+    browser-resolve "^1.7.0"
+    cached-path-relative "^1.0.0"
+    concat-stream "~1.5.0"
+    defined "^1.0.0"
+    detective "^4.0.0"
+    duplexer2 "^0.1.2"
+    inherits "^2.0.1"
+    parents "^1.0.0"
+    readable-stream "^2.0.2"
+    resolve "^1.1.3"
+    stream-combiner2 "^1.1.1"
+    subarg "^1.0.0"
+    through2 "^2.0.0"
+    xtend "^4.0.0"
+
+move-concurrently@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92"
+  dependencies:
+    aproba "^1.1.1"
+    copy-concurrently "^1.0.0"
+    fs-write-stream-atomic "^1.0.8"
+    mkdirp "^0.5.1"
+    rimraf "^2.5.4"
+    run-queue "^1.0.3"
+
+ms@0.7.1:
+  version "0.7.1"
+  resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098"
+
+ms@2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
+
+mute-stream@0.0.7:
+  version "0.0.7"
+  resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab"
+
+nan@^2.3.0:
+  version "2.9.2"
+  resolved "https://registry.yarnpkg.com/nan/-/nan-2.9.2.tgz#f564d75f5f8f36a6d9456cca7a6c4fe488ab7866"
+
+nanomatch@^1.2.9:
+  version "1.2.9"
+  resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.9.tgz#879f7150cb2dab7a471259066c104eee6e0fa7c2"
+  dependencies:
+    arr-diff "^4.0.0"
+    array-unique "^0.3.2"
+    define-property "^2.0.2"
+    extend-shallow "^3.0.2"
+    fragment-cache "^0.2.1"
+    is-odd "^2.0.0"
+    is-windows "^1.0.2"
+    kind-of "^6.0.2"
+    object.pick "^1.3.0"
+    regex-not "^1.0.0"
+    snapdragon "^0.8.1"
+    to-regex "^3.0.1"
+
+natural-compare@^1.4.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
+
+negotiator@0.6.1:
+  version "0.6.1"
+  resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9"
+
+neo-async@^2.5.0:
+  version "2.5.0"
+  resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.0.tgz#76b1c823130cca26acfbaccc8fbaf0a2fa33b18f"
+
+netmask@~1.0.4:
+  version "1.0.6"
+  resolved "https://registry.yarnpkg.com/netmask/-/netmask-1.0.6.tgz#20297e89d86f6f6400f250d9f4f6b4c1945fcd35"
+
+node-int64@^0.4.0:
+  version "0.4.0"
+  resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b"
+
+node-libs-browser@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.1.0.tgz#5f94263d404f6e44767d726901fff05478d600df"
+  dependencies:
+    assert "^1.1.1"
+    browserify-zlib "^0.2.0"
+    buffer "^4.3.0"
+    console-browserify "^1.1.0"
+    constants-browserify "^1.0.0"
+    crypto-browserify "^3.11.0"
+    domain-browser "^1.1.1"
+    events "^1.0.0"
+    https-browserify "^1.0.0"
+    os-browserify "^0.3.0"
+    path-browserify "0.0.0"
+    process "^0.11.10"
+    punycode "^1.2.4"
+    querystring-es3 "^0.2.0"
+    readable-stream "^2.3.3"
+    stream-browserify "^2.0.1"
+    stream-http "^2.7.2"
+    string_decoder "^1.0.0"
+    timers-browserify "^2.0.4"
+    tty-browserify "0.0.0"
+    url "^0.11.0"
+    util "^0.10.3"
+    vm-browserify "0.0.4"
+
+node-notifier@^5.2.1:
+  version "5.2.1"
+  resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.2.1.tgz#fa313dd08f5517db0e2502e5758d664ac69f9dea"
+  dependencies:
+    growly "^1.3.0"
+    semver "^5.4.1"
+    shellwords "^0.1.1"
+    which "^1.3.0"
+
+node-pre-gyp@^0.6.39:
+  version "0.6.39"
+  resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.39.tgz#c00e96860b23c0e1420ac7befc5044e1d78d8649"
+  dependencies:
+    detect-libc "^1.0.2"
+    hawk "3.1.3"
+    mkdirp "^0.5.1"
+    nopt "^4.0.1"
+    npmlog "^4.0.2"
+    rc "^1.1.7"
+    request "2.81.0"
+    rimraf "^2.6.1"
+    semver "^5.3.0"
+    tar "^2.2.1"
+    tar-pack "^3.4.0"
+
+node-uuid@~1.4.7:
+  version "1.4.8"
+  resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.8.tgz#b040eb0923968afabf8d32fb1f17f1167fdab907"
+
+node.extend@1.0.8:
+  version "1.0.8"
+  resolved "https://registry.yarnpkg.com/node.extend/-/node.extend-1.0.8.tgz#bab04379f7383f4587990c9df07b6a7f65db772b"
+  dependencies:
+    is "~0.2.6"
+    object-keys "~0.4.0"
+
+node.flow@1.2.3:
+  version "1.2.3"
+  resolved "https://registry.yarnpkg.com/node.flow/-/node.flow-1.2.3.tgz#e1c44a82aeca8d78b458a77fb3dc642f2eba2649"
+  dependencies:
+    node.extend "1.0.8"
+
+nodemailer-direct-transport@3.3.2:
+  version "3.3.2"
+  resolved "https://registry.yarnpkg.com/nodemailer-direct-transport/-/nodemailer-direct-transport-3.3.2.tgz#e96fafb90358560947e569017d97e60738a50a86"
+  dependencies:
+    nodemailer-shared "1.1.0"
+    smtp-connection "2.12.0"
+
+nodemailer-fetch@1.6.0:
+  version "1.6.0"
+  resolved "https://registry.yarnpkg.com/nodemailer-fetch/-/nodemailer-fetch-1.6.0.tgz#79c4908a1c0f5f375b73fe888da9828f6dc963a4"
+
+nodemailer-shared@1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/nodemailer-shared/-/nodemailer-shared-1.1.0.tgz#cf5994e2fd268d00f5cf0fa767a08169edb07ec0"
+  dependencies:
+    nodemailer-fetch "1.6.0"
+
+nodemailer-smtp-pool@2.8.2:
+  version "2.8.2"
+  resolved "https://registry.yarnpkg.com/nodemailer-smtp-pool/-/nodemailer-smtp-pool-2.8.2.tgz#2eb94d6cf85780b1b4725ce853b9cbd5e8da8c72"
+  dependencies:
+    nodemailer-shared "1.1.0"
+    nodemailer-wellknown "0.1.10"
+    smtp-connection "2.12.0"
+
+nodemailer-smtp-transport@2.7.2:
+  version "2.7.2"
+  resolved "https://registry.yarnpkg.com/nodemailer-smtp-transport/-/nodemailer-smtp-transport-2.7.2.tgz#03d71c76314f14ac7dbc7bf033a6a6d16d67fb77"
+  dependencies:
+    nodemailer-shared "1.1.0"
+    nodemailer-wellknown "0.1.10"
+    smtp-connection "2.12.0"
+
+nodemailer-wellknown@0.1.10:
+  version "0.1.10"
+  resolved "https://registry.yarnpkg.com/nodemailer-wellknown/-/nodemailer-wellknown-0.1.10.tgz#586db8101db30cb4438eb546737a41aad0cf13d5"
+
+nodemailer@^2.5.0:
+  version "2.7.2"
+  resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-2.7.2.tgz#f242e649aeeae39b6c7ed740ef7b061c404d30f9"
+  dependencies:
+    libmime "3.0.0"
+    mailcomposer "4.0.1"
+    nodemailer-direct-transport "3.3.2"
+    nodemailer-shared "1.1.0"
+    nodemailer-smtp-pool "2.8.2"
+    nodemailer-smtp-transport "2.7.2"
+    socks "1.1.9"
+
+nopt@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d"
+  dependencies:
+    abbrev "1"
+    osenv "^0.1.4"
+
+normalize-package-data@^2.3.2:
+  version "2.4.0"
+  resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f"
+  dependencies:
+    hosted-git-info "^2.1.4"
+    is-builtin-module "^1.0.0"
+    semver "2 || 3 || 4 || 5"
+    validate-npm-package-license "^3.0.1"
+
+normalize-path@^2.0.0, normalize-path@^2.0.1, normalize-path@^2.1.1:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
+  dependencies:
+    remove-trailing-separator "^1.0.1"
+
+normalize-url@2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-2.0.1.tgz#835a9da1551fa26f70e92329069a23aa6574d7e6"
+  dependencies:
+    prepend-http "^2.0.0"
+    query-string "^5.0.1"
+    sort-keys "^2.0.0"
+
+npm-run-path@^2.0.0:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f"
+  dependencies:
+    path-key "^2.0.0"
+
+npmlog@^4.0.2:
+  version "4.1.2"
+  resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
+  dependencies:
+    are-we-there-yet "~1.1.2"
+    console-control-strings "~1.1.0"
+    gauge "~2.7.3"
+    set-blocking "~2.0.0"
+
+null-check@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/null-check/-/null-check-1.0.0.tgz#977dffd7176012b9ec30d2a39db5cf72a0439edd"
+
+number-is-nan@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
+
+nwmatcher@^1.4.3:
+  version "1.4.3"
+  resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.4.3.tgz#64348e3b3d80f035b40ac11563d278f8b72db89c"
+
+oauth-sign@~0.8.1, oauth-sign@~0.8.2:
+  version "0.8.2"
+  resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43"
+
+object-assign@^4.0.1, object-assign@^4.1.0:
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+
+object-component@0.0.3:
+  version "0.0.3"
+  resolved "https://registry.yarnpkg.com/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291"
+
+object-copy@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c"
+  dependencies:
+    copy-descriptor "^0.1.0"
+    define-property "^0.2.5"
+    kind-of "^3.0.3"
+
+object-keys@^1.0.8:
+  version "1.0.11"
+  resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d"
+
+object-keys@~0.4.0:
+  version "0.4.0"
+  resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336"
+
+object-visit@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb"
+  dependencies:
+    isobject "^3.0.0"
+
+object.getownpropertydescriptors@^2.0.3:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16"
+  dependencies:
+    define-properties "^1.1.2"
+    es-abstract "^1.5.1"
+
+object.omit@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa"
+  dependencies:
+    for-own "^0.1.4"
+    is-extendable "^0.1.1"
+
+object.pick@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747"
+  dependencies:
+    isobject "^3.0.1"
+
+observatory@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/observatory/-/observatory-1.0.0.tgz#2baa606e8299e6866914ec9c8a4db6a41136e59b"
+  dependencies:
+    ansi-escapes "^1.1.0"
+    chalk "^1.1.1"
+    lodash "^3.10.1"
+
+on-finished@~2.3.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
+  dependencies:
+    ee-first "1.1.1"
+
+once@^1.3.0, once@^1.3.1, once@^1.3.3, once@^1.4.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+  dependencies:
+    wrappy "1"
+
+onetime@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4"
+  dependencies:
+    mimic-fn "^1.0.0"
+
+optimist@^0.6.1:
+  version "0.6.1"
+  resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686"
+  dependencies:
+    minimist "~0.0.1"
+    wordwrap "~0.0.2"
+
+optionator@^0.8.1, optionator@^0.8.2:
+  version "0.8.2"
+  resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64"
+  dependencies:
+    deep-is "~0.1.3"
+    fast-levenshtein "~2.0.4"
+    levn "~0.3.0"
+    prelude-ls "~1.1.2"
+    type-check "~0.3.2"
+    wordwrap "~1.0.0"
+
+os-browserify@^0.3.0, os-browserify@~0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27"
+
+os-homedir@^1.0.0, os-homedir@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
+
+os-locale@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2"
+  dependencies:
+    execa "^0.7.0"
+    lcid "^1.0.0"
+    mem "^1.1.0"
+
+os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
+
+osenv@^0.1.4:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410"
+  dependencies:
+    os-homedir "^1.0.0"
+    os-tmpdir "^1.0.0"
+
+p-cancelable@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.3.0.tgz#b9e123800bcebb7ac13a479be195b507b98d30fa"
+
+p-finally@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
+
+p-is-promise@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-1.1.0.tgz#9c9456989e9f6588017b0434d56097675c3da05e"
+
+p-limit@^1.1.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.2.0.tgz#0e92b6bedcb59f022c13d0f1949dc82d15909f1c"
+  dependencies:
+    p-try "^1.0.0"
+
+p-locate@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
+  dependencies:
+    p-limit "^1.1.0"
+
+p-timeout@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-2.0.1.tgz#d8dd1979595d2dc0139e1fe46b8b646cb3cdf038"
+  dependencies:
+    p-finally "^1.0.0"
+
+p-try@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"
+
+pac-proxy-agent@1:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-1.1.0.tgz#34a385dfdf61d2f0ecace08858c745d3e791fd4d"
+  dependencies:
+    agent-base "2"
+    debug "2"
+    extend "3"
+    get-uri "2"
+    http-proxy-agent "1"
+    https-proxy-agent "1"
+    pac-resolver "~2.0.0"
+    raw-body "2"
+    socks-proxy-agent "2"
+
+pac-resolver@~2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/pac-resolver/-/pac-resolver-2.0.0.tgz#99b88d2f193fbdeefc1c9a529c1f3260ab5277cd"
+  dependencies:
+    co "~3.0.6"
+    degenerator "~1.0.2"
+    ip "1.0.1"
+    netmask "~1.0.4"
+    thunkify "~2.1.1"
+
+pako@~1.0.5:
+  version "1.0.6"
+  resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258"
+
+parallel-transform@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.1.0.tgz#d410f065b05da23081fcd10f28854c29bda33b06"
+  dependencies:
+    cyclist "~0.2.2"
+    inherits "^2.0.3"
+    readable-stream "^2.1.5"
+
+parents@^1.0.0, parents@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/parents/-/parents-1.0.1.tgz#fedd4d2bf193a77745fe71e371d73c3307d9c751"
+  dependencies:
+    path-platform "~0.11.15"
+
+parse-asn1@^5.0.0:
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.0.tgz#37c4f9b7ed3ab65c74817b5f2480937fbf97c712"
+  dependencies:
+    asn1.js "^4.0.0"
+    browserify-aes "^1.0.0"
+    create-hash "^1.1.0"
+    evp_bytestokey "^1.0.0"
+    pbkdf2 "^3.0.3"
+
+parse-glob@^3.0.4:
+  version "3.0.4"
+  resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c"
+  dependencies:
+    glob-base "^0.3.0"
+    is-dotfile "^1.0.0"
+    is-extglob "^1.0.0"
+    is-glob "^2.0.0"
+
+parse-json@^2.2.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
+  dependencies:
+    error-ex "^1.2.0"
+
+parse5@4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608"
+
+parseqs@0.0.5:
+  version "0.0.5"
+  resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.5.tgz#d5208a3738e46766e291ba2ea173684921a8b89d"
+  dependencies:
+    better-assert "~1.0.0"
+
+parseuri@0.0.5:
+  version "0.0.5"
+  resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.5.tgz#80204a50d4dbb779bfdc6ebe2778d90e4bce320a"
+  dependencies:
+    better-assert "~1.0.0"
+
+parseurl@~1.3.2:
+  version "1.3.2"
+  resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3"
+
+pascalcase@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14"
+
+path-browserify@0.0.0, path-browserify@~0.0.0:
+  version "0.0.0"
+  resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a"
+
+path-dirname@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0"
+
+path-exists@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b"
+  dependencies:
+    pinkie-promise "^2.0.0"
+
+path-exists@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
+
+path-is-absolute@^1.0.0, path-is-absolute@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+
+path-is-inside@^1.0.1, path-is-inside@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53"
+
+path-key@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
+
+path-parse@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1"
+
+path-platform@~0.11.15:
+  version "0.11.15"
+  resolved "https://registry.yarnpkg.com/path-platform/-/path-platform-0.11.15.tgz#e864217f74c36850f0852b78dc7bf7d4a5721bf2"
+
+path-proxy@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/path-proxy/-/path-proxy-1.0.0.tgz#18e8a36859fc9d2f1a53b48dee138543c020de5e"
+  dependencies:
+    inflection "~1.3.0"
+
+path-type@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441"
+  dependencies:
+    graceful-fs "^4.1.2"
+    pify "^2.0.0"
+    pinkie-promise "^2.0.0"
+
+path-type@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73"
+  dependencies:
+    pify "^2.0.0"
+
+pbkdf2@^3.0.3:
+  version "3.0.14"
+  resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.14.tgz#a35e13c64799b06ce15320f459c230e68e73bade"
+  dependencies:
+    create-hash "^1.1.2"
+    create-hmac "^1.1.4"
+    ripemd160 "^2.0.1"
+    safe-buffer "^5.0.1"
+    sha.js "^2.4.8"
+
+performance-now@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5"
+
+performance-now@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
+
+pify@^2.0.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
+
+pify@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"
+
+pinkie-promise@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa"
+  dependencies:
+    pinkie "^2.0.0"
+
+pinkie@^2.0.0:
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
+
+pkg-dir@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b"
+  dependencies:
+    find-up "^2.1.0"
+
+pluralize@^7.0.0:
+  version "7.0.0"
+  resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777"
+
+pn@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb"
+
+posix-character-classes@^0.1.0:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
+
+prelude-ls@~1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
+
+prepend-http@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897"
+
+preserve@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b"
+
+pretty-format@^22.4.0:
+  version "22.4.0"
+  resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-22.4.0.tgz#237b1f7e1c50ed03bc65c03ccc29d7c8bb7beb94"
+  dependencies:
+    ansi-regex "^3.0.0"
+    ansi-styles "^3.2.0"
+
+private@^0.1.7:
+  version "0.1.8"
+  resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff"
+
+process-nextick-args@~1.0.6:
+  version "1.0.7"
+  resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3"
+
+process-nextick-args@~2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa"
+
+process@^0.11.10, process@~0.11.0:
+  version "0.11.10"
+  resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
+
+progress@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f"
+
+promise-inflight@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3"
+
+proxy-agent@~2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-2.0.0.tgz#57eb5347aa805d74ec681cb25649dba39c933499"
+  dependencies:
+    agent-base "2"
+    debug "2"
+    extend "3"
+    http-proxy-agent "1"
+    https-proxy-agent "1"
+    lru-cache "~2.6.5"
+    pac-proxy-agent "1"
+    socks-proxy-agent "2"
+
+prr@~1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
+
+pseudomap@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
+
+public-encrypt@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.0.tgz#39f699f3a46560dd5ebacbca693caf7c65c18cc6"
+  dependencies:
+    bn.js "^4.1.0"
+    browserify-rsa "^4.0.0"
+    create-hash "^1.1.0"
+    parse-asn1 "^5.0.0"
+    randombytes "^2.0.1"
+
+pump@^2.0.0, pump@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909"
+  dependencies:
+    end-of-stream "^1.1.0"
+    once "^1.3.1"
+
+pumpify@^1.3.3:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.4.0.tgz#80b7c5df7e24153d03f0e7ac8a05a5d068bd07fb"
+  dependencies:
+    duplexify "^3.5.3"
+    inherits "^2.0.3"
+    pump "^2.0.0"
+
+punycode@1.3.2:
+  version "1.3.2"
+  resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d"
+
+punycode@1.4.1, punycode@^1.2.4, punycode@^1.3.2, punycode@^1.4.1:
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
+
+punycode@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.0.tgz#5f863edc89b96db09074bad7947bf09056ca4e7d"
+
+q@~1.4.0:
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/q/-/q-1.4.1.tgz#55705bcd93c5f3673530c2c2cbc0c2b3addc286e"
+
+qjobs@^1.1.4:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/qjobs/-/qjobs-1.2.0.tgz#c45e9c61800bd087ef88d7e256423bdd49e5d071"
+
+qs@6.5.1, qs@~6.5.1:
+  version "6.5.1"
+  resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8"
+
+qs@~6.2.0:
+  version "6.2.3"
+  resolved "https://registry.yarnpkg.com/qs/-/qs-6.2.3.tgz#1cfcb25c10a9b2b483053ff39f5dfc9233908cfe"
+
+qs@~6.4.0:
+  version "6.4.0"
+  resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233"
+
+query-string@^5.0.1:
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.0.tgz#9583b15fd1307f899e973ed418886426a9976469"
+  dependencies:
+    decode-uri-component "^0.2.0"
+    object-assign "^4.1.0"
+    strict-uri-encode "^1.0.0"
+
+querystring-es3@^0.2.0, querystring-es3@~0.2.0:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73"
+
+querystring@0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
+
+randomatic@^1.1.3:
+  version "1.1.7"
+  resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c"
+  dependencies:
+    is-number "^3.0.0"
+    kind-of "^4.0.0"
+
+randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5:
+  version "2.0.6"
+  resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.6.tgz#d302c522948588848a8d300c932b44c24231da80"
+  dependencies:
+    safe-buffer "^5.1.0"
+
+randomfill@^1.0.3:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458"
+  dependencies:
+    randombytes "^2.0.5"
+    safe-buffer "^5.1.0"
+
+range-parser@^1.0.3, range-parser@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e"
+
+raw-body@2, raw-body@2.3.2:
+  version "2.3.2"
+  resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.2.tgz#bcd60c77d3eb93cde0050295c3f379389bc88f89"
+  dependencies:
+    bytes "3.0.0"
+    http-errors "1.6.2"
+    iconv-lite "0.4.19"
+    unpipe "1.0.0"
+
+rc@^1.1.7:
+  version "1.2.5"
+  resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.5.tgz#275cd687f6e3b36cc756baa26dfee80a790301fd"
+  dependencies:
+    deep-extend "~0.4.0"
+    ini "~1.3.0"
+    minimist "^1.2.0"
+    strip-json-comments "~2.0.1"
+
+read-only-stream@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/read-only-stream/-/read-only-stream-2.0.0.tgz#2724fd6a8113d73764ac288d4386270c1dbf17f0"
+  dependencies:
+    readable-stream "^2.0.2"
+
+read-pkg-up@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02"
+  dependencies:
+    find-up "^1.0.0"
+    read-pkg "^1.0.0"
+
+read-pkg-up@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be"
+  dependencies:
+    find-up "^2.0.0"
+    read-pkg "^2.0.0"
+
+read-pkg@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28"
+  dependencies:
+    load-json-file "^1.0.0"
+    normalize-package-data "^2.3.2"
+    path-type "^1.0.0"
+
+read-pkg@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8"
+  dependencies:
+    load-json-file "^2.0.0"
+    normalize-package-data "^2.3.2"
+    path-type "^2.0.0"
+
+"readable-stream@1 || 2", readable-stream@2, readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.3:
+  version "2.3.4"
+  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.4.tgz#c946c3f47fa7d8eabc0b6150f4a12f69a4574071"
+  dependencies:
+    core-util-is "~1.0.0"
+    inherits "~2.0.3"
+    isarray "~1.0.0"
+    process-nextick-args "~2.0.0"
+    safe-buffer "~5.1.1"
+    string_decoder "~1.0.3"
+    util-deprecate "~1.0.1"
+
+readable-stream@1.1.x, "readable-stream@1.x >=1.1.9":
+  version "1.1.14"
+  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9"
+  dependencies:
+    core-util-is "~1.0.0"
+    inherits "~2.0.1"
+    isarray "0.0.1"
+    string_decoder "~0.10.x"
+
+readable-stream@~2.0.0, readable-stream@~2.0.5:
+  version "2.0.6"
+  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e"
+  dependencies:
+    core-util-is "~1.0.0"
+    inherits "~2.0.1"
+    isarray "~1.0.0"
+    process-nextick-args "~1.0.6"
+    string_decoder "~0.10.x"
+    util-deprecate "~1.0.1"
+
+readdirp@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78"
+  dependencies:
+    graceful-fs "^4.1.2"
+    minimatch "^3.0.2"
+    readable-stream "^2.0.2"
+    set-immediate-shim "^1.0.1"
+
+realpath-native@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.0.0.tgz#7885721a83b43bd5327609f0ddecb2482305fdf0"
+  dependencies:
+    util.promisify "^1.0.0"
+
+redis-commands@^1.2.0:
+  version "1.3.5"
+  resolved "https://registry.yarnpkg.com/redis-commands/-/redis-commands-1.3.5.tgz#4495889414f1e886261180b1442e7295602d83a2"
+
+redis-parser@^2.6.0:
+  version "2.6.0"
+  resolved "https://registry.yarnpkg.com/redis-parser/-/redis-parser-2.6.0.tgz#52ed09dacac108f1a631c07e9b69941e7a19504b"
+
+redis@^2.7.1:
+  version "2.8.0"
+  resolved "https://registry.yarnpkg.com/redis/-/redis-2.8.0.tgz#202288e3f58c49f6079d97af7a10e1303ae14b02"
+  dependencies:
+    double-ended-queue "^2.1.0-0"
+    redis-commands "^1.2.0"
+    redis-parser "^2.6.0"
+
+regenerator-runtime@^0.11.0:
+  version "0.11.1"
+  resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
+
+regex-cache@^0.4.2:
+  version "0.4.4"
+  resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd"
+  dependencies:
+    is-equal-shallow "^0.1.3"
+
+regex-not@^1.0.0, regex-not@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c"
+  dependencies:
+    extend-shallow "^3.0.2"
+    safe-regex "^1.1.0"
+
+remove-trailing-separator@^1.0.1:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
+
+repeat-element@^1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a"
+
+repeat-string@^0.2.2:
+  version "0.2.2"
+  resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-0.2.2.tgz#c7a8d3236068362059a7e4651fc6884e8b1fb4ae"
+
+repeat-string@^1.5.2, repeat-string@^1.6.1:
+  version "1.6.1"
+  resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
+
+repeating@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda"
+  dependencies:
+    is-finite "^1.0.0"
+
+replace-in-file@^3.1.1:
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/replace-in-file/-/replace-in-file-3.1.1.tgz#84052a6948771e8833a0738a0eb905feb0c9c7f4"
+  dependencies:
+    chalk "^2.3.0"
+    glob "^7.1.2"
+    yargs "^11.0.0"
+
+request-promise-core@1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.1.tgz#3eee00b2c5aa83239cfb04c5700da36f81cd08b6"
+  dependencies:
+    lodash "^4.13.1"
+
+request-promise-native@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.5.tgz#5281770f68e0c9719e5163fd3fab482215f4fda5"
+  dependencies:
+    request-promise-core "1.1.1"
+    stealthy-require "^1.1.0"
+    tough-cookie ">=2.3.3"
+
+request@2.75.x:
+  version "2.75.0"
+  resolved "https://registry.yarnpkg.com/request/-/request-2.75.0.tgz#d2b8268a286da13eaa5d01adf5d18cc90f657d93"
+  dependencies:
+    aws-sign2 "~0.6.0"
+    aws4 "^1.2.1"
+    bl "~1.1.2"
+    caseless "~0.11.0"
+    combined-stream "~1.0.5"
+    extend "~3.0.0"
+    forever-agent "~0.6.1"
+    form-data "~2.0.0"
+    har-validator "~2.0.6"
+    hawk "~3.1.3"
+    http-signature "~1.1.0"
+    is-typedarray "~1.0.0"
+    isstream "~0.1.2"
+    json-stringify-safe "~5.0.1"
+    mime-types "~2.1.7"
+    node-uuid "~1.4.7"
+    oauth-sign "~0.8.1"
+    qs "~6.2.0"
+    stringstream "~0.0.4"
+    tough-cookie "~2.3.0"
+    tunnel-agent "~0.4.1"
+
+request@2.81.0:
+  version "2.81.0"
+  resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0"
+  dependencies:
+    aws-sign2 "~0.6.0"
+    aws4 "^1.2.1"
+    caseless "~0.12.0"
+    combined-stream "~1.0.5"
+    extend "~3.0.0"
+    forever-agent "~0.6.1"
+    form-data "~2.1.1"
+    har-validator "~4.2.1"
+    hawk "~3.1.3"
+    http-signature "~1.1.0"
+    is-typedarray "~1.0.0"
+    isstream "~0.1.2"
+    json-stringify-safe "~5.0.1"
+    mime-types "~2.1.7"
+    oauth-sign "~0.8.1"
+    performance-now "^0.2.0"
+    qs "~6.4.0"
+    safe-buffer "^5.0.1"
+    stringstream "~0.0.4"
+    tough-cookie "~2.3.0"
+    tunnel-agent "^0.6.0"
+    uuid "^3.0.0"
+
+request@^2.0.0, request@^2.74.0, request@^2.83.0:
+  version "2.83.0"
+  resolved "https://registry.yarnpkg.com/request/-/request-2.83.0.tgz#ca0b65da02ed62935887808e6f510381034e3356"
+  dependencies:
+    aws-sign2 "~0.7.0"
+    aws4 "^1.6.0"
+    caseless "~0.12.0"
+    combined-stream "~1.0.5"
+    extend "~3.0.1"
+    forever-agent "~0.6.1"
+    form-data "~2.3.1"
+    har-validator "~5.0.3"
+    hawk "~6.0.2"
+    http-signature "~1.2.0"
+    is-typedarray "~1.0.0"
+    isstream "~0.1.2"
+    json-stringify-safe "~5.0.1"
+    mime-types "~2.1.17"
+    oauth-sign "~0.8.2"
+    performance-now "^2.1.0"
+    qs "~6.5.1"
+    safe-buffer "^5.1.1"
+    stringstream "~0.0.5"
+    tough-cookie "~2.3.3"
+    tunnel-agent "^0.6.0"
+    uuid "^3.1.0"
+
+requestretry@^1.2.2:
+  version "1.13.0"
+  resolved "https://registry.yarnpkg.com/requestretry/-/requestretry-1.13.0.tgz#213ec1006eeb750e8b8ce54176283d15a8d55d94"
+  dependencies:
+    extend "^3.0.0"
+    lodash "^4.15.0"
+    request "^2.74.0"
+    when "^3.7.7"
+
+require-directory@^2.1.1:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
+
+require-main-filename@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1"
+
+require-uncached@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3"
+  dependencies:
+    caller-path "^0.1.0"
+    resolve-from "^1.0.0"
+
+requires-port@1.x.x:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
+
+resolve-cwd@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a"
+  dependencies:
+    resolve-from "^3.0.0"
+
+resolve-from@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226"
+
+resolve-from@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748"
+
+resolve-url@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
+
+resolve@1.1.7:
+  version "1.1.7"
+  resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b"
+
+resolve@^1.1.3, resolve@^1.1.4:
+  version "1.5.0"
+  resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36"
+  dependencies:
+    path-parse "^1.0.5"
+
+responselike@1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7"
+  dependencies:
+    lowercase-keys "^1.0.0"
+
+restore-cursor@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf"
+  dependencies:
+    onetime "^2.0.0"
+    signal-exit "^3.0.2"
+
+ret@~0.1.10:
+  version "0.1.15"
+  resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
+
+right-align@^0.1.1:
+  version "0.1.3"
+  resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef"
+  dependencies:
+    align-text "^0.1.1"
+
+rimraf@2, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.5.4, rimraf@^2.6.0, rimraf@^2.6.1, rimraf@^2.6.2:
+  version "2.6.2"
+  resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36"
+  dependencies:
+    glob "^7.0.5"
+
+rimraf@~2.2.6:
+  version "2.2.8"
+  resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582"
+
+ripemd160@^2.0.0, ripemd160@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.1.tgz#0f4584295c53a3628af7e6d79aca21ce57d1c6e7"
+  dependencies:
+    hash-base "^2.0.0"
+    inherits "^2.0.1"
+
+rmdir@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/rmdir/-/rmdir-1.2.0.tgz#4fe0357cb06168c258e73e968093dc4e8a0f3253"
+  dependencies:
+    node.flow "1.2.3"
+
+rollup-plugin-buble@^0.19.1:
+  version "0.19.2"
+  resolved "https://registry.yarnpkg.com/rollup-plugin-buble/-/rollup-plugin-buble-0.19.2.tgz#c0590c7d3d475b5ed59f129764ec93710cc6e8dd"
+  dependencies:
+    buble "^0.19.2"
+    rollup-pluginutils "^2.0.1"
+
+rollup-pluginutils@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.0.1.tgz#7ec95b3573f6543a46a6461bd9a7c544525d0fc0"
+  dependencies:
+    estree-walker "^0.3.0"
+    micromatch "^2.3.11"
+
+rollup@^0.56.2:
+  version "0.56.3"
+  resolved "https://registry.yarnpkg.com/rollup/-/rollup-0.56.3.tgz#7900695531afa1badd3235f285cc4aa0d49ce254"
+
+run-async@^2.2.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0"
+  dependencies:
+    is-promise "^2.1.0"
+
+run-queue@^1.0.0, run-queue@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47"
+  dependencies:
+    aproba "^1.1.1"
+
+rx-lite-aggregates@^4.0.8:
+  version "4.0.8"
+  resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be"
+  dependencies:
+    rx-lite "*"
+
+rx-lite@*, rx-lite@^4.0.8:
+  version "4.0.8"
+  resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444"
+
+safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
+  version "5.1.1"
+  resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853"
+
+safe-regex@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e"
+  dependencies:
+    ret "~0.1.10"
+
+sane@^2.0.0:
+  version "2.4.1"
+  resolved "https://registry.yarnpkg.com/sane/-/sane-2.4.1.tgz#29f991208cf28636720efdc584293e7fd66663a5"
+  dependencies:
+    anymatch "^1.3.0"
+    exec-sh "^0.2.0"
+    fb-watchman "^2.0.0"
+    minimatch "^3.0.2"
+    minimist "^1.1.1"
+    walker "~1.0.5"
+    watch "~0.18.0"
+  optionalDependencies:
+    fsevents "^1.1.1"
+
+sax@^1.2.4:
+  version "1.2.4"
+  resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
+
+schema-utils@^0.4.2:
+  version "0.4.5"
+  resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.5.tgz#21836f0608aac17b78f9e3e24daff14a5ca13a3e"
+  dependencies:
+    ajv "^6.1.0"
+    ajv-keywords "^3.1.0"
+
+"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1:
+  version "5.5.0"
+  resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab"
+
+semver@~5.0.1:
+  version "5.0.3"
+  resolved "https://registry.yarnpkg.com/semver/-/semver-5.0.3.tgz#77466de589cd5d3c95f138aa78bc569a3cb5d27a"
+
+serialize-javascript@^1.4.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.4.0.tgz#7c958514db6ac2443a8abc062dc9f7886a7f6005"
+
+set-blocking@^2.0.0, set-blocking@~2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
+
+set-getter@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/set-getter/-/set-getter-0.1.0.tgz#d769c182c9d5a51f409145f2fba82e5e86e80376"
+  dependencies:
+    to-object-path "^0.3.0"
+
+set-immediate-shim@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61"
+
+set-value@^0.4.3:
+  version "0.4.3"
+  resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1"
+  dependencies:
+    extend-shallow "^2.0.1"
+    is-extendable "^0.1.1"
+    is-plain-object "^2.0.1"
+    to-object-path "^0.3.0"
+
+set-value@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274"
+  dependencies:
+    extend-shallow "^2.0.1"
+    is-extendable "^0.1.1"
+    is-plain-object "^2.0.3"
+    split-string "^3.0.1"
+
+setimmediate@^1.0.4:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
+
+setprototypeof@1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04"
+
+sha.js@^2.4.0, sha.js@^2.4.8, sha.js@~2.4.4:
+  version "2.4.10"
+  resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.10.tgz#b1fde5cd7d11a5626638a07c604ab909cfa31f9b"
+  dependencies:
+    inherits "^2.0.1"
+    safe-buffer "^5.0.1"
+
+shasum@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/shasum/-/shasum-1.0.2.tgz#e7012310d8f417f4deb5712150e5678b87ae565f"
+  dependencies:
+    json-stable-stringify "~0.0.0"
+    sha.js "~2.4.4"
+
+shebang-command@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
+  dependencies:
+    shebang-regex "^1.0.0"
+
+shebang-regex@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
+
+shell-quote@^1.6.1:
+  version "1.6.1"
+  resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.6.1.tgz#f4781949cce402697127430ea3b3c5476f481767"
+  dependencies:
+    array-filter "~0.0.0"
+    array-map "~0.0.0"
+    array-reduce "~0.0.0"
+    jsonify "~0.0.0"
+
+shellwords@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b"
+
+signal-exit@^3.0.0, signal-exit@^3.0.2:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
+
+slack-node@~0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/slack-node/-/slack-node-0.2.0.tgz#de4b8dddaa8b793f61dbd2938104fdabf37dfa30"
+  dependencies:
+    requestretry "^1.2.2"
+
+slash@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55"
+
+slice-ansi@1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d"
+  dependencies:
+    is-fullwidth-code-point "^2.0.0"
+
+smart-buffer@^1.0.13, smart-buffer@^1.0.4:
+  version "1.1.15"
+  resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-1.1.15.tgz#7f114b5b65fab3e2a35aa775bb12f0d1c649bf16"
+
+smtp-connection@2.12.0:
+  version "2.12.0"
+  resolved "https://registry.yarnpkg.com/smtp-connection/-/smtp-connection-2.12.0.tgz#d76ef9127cb23c2259edb1e8349c2e8d5e2d74c1"
+  dependencies:
+    httpntlm "1.6.1"
+    nodemailer-shared "1.1.0"
+
+snapdragon-node@^2.0.1:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b"
+  dependencies:
+    define-property "^1.0.0"
+    isobject "^3.0.0"
+    snapdragon-util "^3.0.1"
+
+snapdragon-util@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2"
+  dependencies:
+    kind-of "^3.2.0"
+
+snapdragon@^0.8.1:
+  version "0.8.1"
+  resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.1.tgz#e12b5487faded3e3dea0ac91e9400bf75b401370"
+  dependencies:
+    base "^0.11.1"
+    debug "^2.2.0"
+    define-property "^0.2.5"
+    extend-shallow "^2.0.1"
+    map-cache "^0.2.2"
+    source-map "^0.5.6"
+    source-map-resolve "^0.5.0"
+    use "^2.0.0"
+
+sntp@1.x.x:
+  version "1.0.9"
+  resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198"
+  dependencies:
+    hoek "2.x.x"
+
+sntp@2.x.x:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/sntp/-/sntp-2.1.0.tgz#2c6cec14fedc2222739caf9b5c3d85d1cc5a2cc8"
+  dependencies:
+    hoek "4.x.x"
+
+socket.io-adapter@~1.1.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz#2a805e8a14d6372124dd9159ad4502f8cb07f06b"
+
+socket.io-client@2.0.4:
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-2.0.4.tgz#0918a552406dc5e540b380dcd97afc4a64332f8e"
+  dependencies:
+    backo2 "1.0.2"
+    base64-arraybuffer "0.1.5"
+    component-bind "1.0.0"
+    component-emitter "1.2.1"
+    debug "~2.6.4"
+    engine.io-client "~3.1.0"
+    has-cors "1.1.0"
+    indexof "0.0.1"
+    object-component "0.0.3"
+    parseqs "0.0.5"
+    parseuri "0.0.5"
+    socket.io-parser "~3.1.1"
+    to-array "0.1.4"
+
+socket.io-parser@~3.1.1:
+  version "3.1.3"
+  resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.1.3.tgz#ed2da5ee79f10955036e3da413bfd7f1e4d86c8e"
+  dependencies:
+    component-emitter "1.2.1"
+    debug "~3.1.0"
+    has-binary2 "~1.0.2"
+    isarray "2.0.1"
+
+socket.io@2.0.4:
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-2.0.4.tgz#c1a4590ceff87ecf13c72652f046f716b29e6014"
+  dependencies:
+    debug "~2.6.6"
+    engine.io "~3.1.0"
+    socket.io-adapter "~1.1.0"
+    socket.io-client "2.0.4"
+    socket.io-parser "~3.1.1"
+
+socks-proxy-agent@2:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-2.1.1.tgz#86ebb07193258637870e13b7bd99f26c663df3d3"
+  dependencies:
+    agent-base "2"
+    extend "3"
+    socks "~1.1.5"
+
+socks@1.1.9:
+  version "1.1.9"
+  resolved "https://registry.yarnpkg.com/socks/-/socks-1.1.9.tgz#628d7e4d04912435445ac0b6e459376cb3e6d691"
+  dependencies:
+    ip "^1.1.2"
+    smart-buffer "^1.0.4"
+
+socks@~1.1.5:
+  version "1.1.10"
+  resolved "https://registry.yarnpkg.com/socks/-/socks-1.1.10.tgz#5b8b7fc7c8f341c53ed056e929b7bf4de8ba7b5a"
+  dependencies:
+    ip "^1.1.4"
+    smart-buffer "^1.0.13"
+
+sort-keys@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-2.0.0.tgz#658535584861ec97d730d6cf41822e1f56684128"
+  dependencies:
+    is-plain-obj "^1.0.0"
+
+source-list-map@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.0.tgz#aaa47403f7b245a92fbc97ea08f250d6087ed085"
+
+source-map-resolve@^0.5.0:
+  version "0.5.1"
+  resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.1.tgz#7ad0f593f2281598e854df80f19aae4b92d7a11a"
+  dependencies:
+    atob "^2.0.0"
+    decode-uri-component "^0.2.0"
+    resolve-url "^0.2.1"
+    source-map-url "^0.4.0"
+    urix "^0.1.0"
+
+source-map-support@^0.4.15:
+  version "0.4.18"
+  resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f"
+  dependencies:
+    source-map "^0.5.6"
+
+source-map-support@^0.5.0:
+  version "0.5.3"
+  resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.3.tgz#2b3d5fff298cfa4d1afd7d4352d569e9a0158e76"
+  dependencies:
+    source-map "^0.6.0"
+
+source-map-url@^0.4.0:
+  version "0.4.0"
+  resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3"
+
+source-map@^0.4.4:
+  version "0.4.4"
+  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b"
+  dependencies:
+    amdefine ">=0.0.4"
+
+source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.1, source-map@~0.5.3:
+  version "0.5.7"
+  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
+
+source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1:
+  version "0.6.1"
+  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
+
+spdx-correct@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.0.tgz#05a5b4d7153a195bc92c3c425b69f3b2a9524c82"
+  dependencies:
+    spdx-expression-parse "^3.0.0"
+    spdx-license-ids "^3.0.0"
+
+spdx-exceptions@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz#2c7ae61056c714a5b9b9b2b2af7d311ef5c78fe9"
+
+spdx-expression-parse@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0"
+  dependencies:
+    spdx-exceptions "^2.1.0"
+    spdx-license-ids "^3.0.0"
+
+spdx-license-ids@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz#7a7cd28470cc6d3a1cfe6d66886f6bc430d3ac87"
+
+split-string@^3.0.1, split-string@^3.0.2:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2"
+  dependencies:
+    extend-shallow "^3.0.0"
+
+sprintf-js@~1.0.2:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
+
+sshpk@^1.7.0:
+  version "1.13.1"
+  resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3"
+  dependencies:
+    asn1 "~0.2.3"
+    assert-plus "^1.0.0"
+    dashdash "^1.12.0"
+    getpass "^0.1.1"
+  optionalDependencies:
+    bcrypt-pbkdf "^1.0.0"
+    ecc-jsbn "~0.1.1"
+    jsbn "~0.1.0"
+    tweetnacl "~0.14.0"
+
+ssri@^5.2.4:
+  version "5.2.4"
+  resolved "https://registry.yarnpkg.com/ssri/-/ssri-5.2.4.tgz#9985e14041e65fc397af96542be35724ac11da52"
+  dependencies:
+    safe-buffer "^5.1.1"
+
+stack-utils@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.1.tgz#d4f33ab54e8e38778b0ca5cfd3b3afb12db68620"
+
+static-extend@^0.1.1:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6"
+  dependencies:
+    define-property "^0.2.5"
+    object-copy "^0.1.0"
+
+"statuses@>= 1.3.1 < 2":
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087"
+
+statuses@~1.3.1:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e"
+
+stealthy-require@^1.1.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b"
+
+stream-browserify@^2.0.0, stream-browserify@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db"
+  dependencies:
+    inherits "~2.0.1"
+    readable-stream "^2.0.2"
+
+stream-combiner2@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/stream-combiner2/-/stream-combiner2-1.1.1.tgz#fb4d8a1420ea362764e21ad4780397bebcb41cbe"
+  dependencies:
+    duplexer2 "~0.1.0"
+    readable-stream "^2.0.2"
+
+stream-each@^1.1.0:
+  version "1.2.2"
+  resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.2.tgz#8e8c463f91da8991778765873fe4d960d8f616bd"
+  dependencies:
+    end-of-stream "^1.1.0"
+    stream-shift "^1.0.0"
+
+stream-http@^2.0.0, stream-http@^2.7.2:
+  version "2.8.0"
+  resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.0.tgz#fd86546dac9b1c91aff8fc5d287b98fafb41bc10"
+  dependencies:
+    builtin-status-codes "^3.0.0"
+    inherits "^2.0.1"
+    readable-stream "^2.3.3"
+    to-arraybuffer "^1.0.0"
+    xtend "^4.0.0"
+
+stream-shift@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952"
+
+stream-splicer@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/stream-splicer/-/stream-splicer-2.0.0.tgz#1b63be438a133e4b671cc1935197600175910d83"
+  dependencies:
+    inherits "^2.0.1"
+    readable-stream "^2.0.2"
+
+streamroller@^0.7.0:
+  version "0.7.0"
+  resolved "https://registry.yarnpkg.com/streamroller/-/streamroller-0.7.0.tgz#a1d1b7cf83d39afb0d63049a5acbf93493bdf64b"
+  dependencies:
+    date-format "^1.2.0"
+    debug "^3.1.0"
+    mkdirp "^0.5.1"
+    readable-stream "^2.3.0"
+
+strict-uri-encode@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713"
+
+string-length@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/string-length/-/string-length-2.0.0.tgz#d40dbb686a3ace960c1cffca562bf2c45f8363ed"
+  dependencies:
+    astral-regex "^1.0.0"
+    strip-ansi "^4.0.0"
+
+string-width@^1.0.1, string-width@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
+  dependencies:
+    code-point-at "^1.0.0"
+    is-fullwidth-code-point "^1.0.0"
+    strip-ansi "^3.0.0"
+
+string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
+  dependencies:
+    is-fullwidth-code-point "^2.0.0"
+    strip-ansi "^4.0.0"
+
+string_decoder@^1.0.0, string_decoder@~1.0.0, string_decoder@~1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab"
+  dependencies:
+    safe-buffer "~5.1.0"
+
+string_decoder@~0.10.x:
+  version "0.10.31"
+  resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
+
+stringstream@~0.0.4, stringstream@~0.0.5:
+  version "0.0.5"
+  resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878"
+
+strip-ansi@^3.0.0, strip-ansi@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
+  dependencies:
+    ansi-regex "^2.0.0"
+
+strip-ansi@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f"
+  dependencies:
+    ansi-regex "^3.0.0"
+
+strip-bom@3.0.0, strip-bom@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
+
+strip-bom@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e"
+  dependencies:
+    is-utf8 "^0.2.0"
+
+strip-eof@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
+
+strip-json-comments@~2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
+
+subarg@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/subarg/-/subarg-1.0.0.tgz#f62cf17581e996b48fc965699f54c06ae268b8d2"
+  dependencies:
+    minimist "^1.1.0"
+
+supports-color@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
+
+supports-color@^3.1.2:
+  version "3.2.3"
+  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6"
+  dependencies:
+    has-flag "^1.0.0"
+
+supports-color@^4.2.1:
+  version "4.5.0"
+  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b"
+  dependencies:
+    has-flag "^2.0.0"
+
+supports-color@^5.3.0:
+  version "5.3.0"
+  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.3.0.tgz#5b24ac15db80fa927cf5227a4a33fd3c4c7676c0"
+  dependencies:
+    has-flag "^3.0.0"
+
+symbol-tree@^3.2.2:
+  version "3.2.2"
+  resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6"
+
+syntax-error@^1.1.1:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/syntax-error/-/syntax-error-1.4.0.tgz#2d9d4ff5c064acb711594a3e3b95054ad51d907c"
+  dependencies:
+    acorn-node "^1.2.0"
+
+table@4.0.2:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36"
+  dependencies:
+    ajv "^5.2.3"
+    ajv-keywords "^2.1.0"
+    chalk "^2.1.0"
+    lodash "^4.17.4"
+    slice-ansi "1.0.0"
+    string-width "^2.1.1"
+
+tapable@^0.2.7:
+  version "0.2.8"
+  resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.8.tgz#99372a5c999bf2df160afc0d74bed4f47948cd22"
+
+tapable@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.0.0.tgz#cbb639d9002eed9c6b5975eb20598d7936f1f9f2"
+
+tar-pack@^3.4.0:
+  version "3.4.1"
+  resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.1.tgz#e1dbc03a9b9d3ba07e896ad027317eb679a10a1f"
+  dependencies:
+    debug "^2.2.0"
+    fstream "^1.0.10"
+    fstream-ignore "^1.0.5"
+    once "^1.3.3"
+    readable-stream "^2.1.4"
+    rimraf "^2.5.1"
+    tar "^2.2.1"
+    uid-number "^0.0.6"
+
+tar@^2.2.1:
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1"
+  dependencies:
+    block-stream "*"
+    fstream "^1.0.2"
+    inherits "2"
+
+temp@^0.8.3:
+  version "0.8.3"
+  resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.3.tgz#e0c6bc4d26b903124410e4fed81103014dfc1f59"
+  dependencies:
+    os-tmpdir "^1.0.0"
+    rimraf "~2.2.6"
+
+test-exclude@^4.1.1:
+  version "4.2.0"
+  resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.2.0.tgz#07e3613609a362c74516a717515e13322ab45b3c"
+  dependencies:
+    arrify "^1.0.1"
+    micromatch "^2.3.11"
+    object-assign "^4.1.0"
+    read-pkg-up "^1.0.1"
+    require-main-filename "^1.0.1"
+
+text-table@~0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
+
+throat@^4.0.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a"
+
+through2@^2.0.0:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be"
+  dependencies:
+    readable-stream "^2.1.5"
+    xtend "~4.0.1"
+
+"through@>=2.2.7 <3", through@^2.3.6:
+  version "2.3.8"
+  resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
+
+thunkify@~2.1.1:
+  version "2.1.2"
+  resolved "https://registry.yarnpkg.com/thunkify/-/thunkify-2.1.2.tgz#faa0e9d230c51acc95ca13a361ac05ca7e04553d"
+
+time-stamp@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-2.0.0.tgz#95c6a44530e15ba8d6f4a3ecb8c3a3fac46da357"
+
+timed-out@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f"
+
+timers-browserify@^1.0.1:
+  version "1.4.2"
+  resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-1.4.2.tgz#c9c58b575be8407375cb5e2462dacee74359f41d"
+  dependencies:
+    process "~0.11.0"
+
+timers-browserify@^2.0.4:
+  version "2.0.6"
+  resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.6.tgz#241e76927d9ca05f4d959819022f5b3664b64bae"
+  dependencies:
+    setimmediate "^1.0.4"
+
+timespan@2.3.x:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/timespan/-/timespan-2.3.0.tgz#4902ce040bd13d845c8f59b27e9d59bad6f39929"
+
+tmp@0.0.33, tmp@0.0.x, tmp@^0.0.33:
+  version "0.0.33"
+  resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
+  dependencies:
+    os-tmpdir "~1.0.2"
+
+tmpl@1.0.x:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1"
+
+to-array@0.1.4:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890"
+
+to-arraybuffer@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43"
+
+to-fast-properties@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47"
+
+to-object-path@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af"
+  dependencies:
+    kind-of "^3.0.2"
+
+to-regex-range@^2.1.0:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38"
+  dependencies:
+    is-number "^3.0.0"
+    repeat-string "^1.6.1"
+
+to-regex@^3.0.1:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce"
+  dependencies:
+    define-property "^2.0.2"
+    extend-shallow "^3.0.2"
+    regex-not "^1.0.2"
+    safe-regex "^1.1.0"
+
+tough-cookie@>=2.3.3, tough-cookie@^2.3.3, tough-cookie@~2.3.0, tough-cookie@~2.3.3:
+  version "2.3.4"
+  resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655"
+  dependencies:
+    punycode "^1.4.1"
+
+tr46@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09"
+  dependencies:
+    punycode "^2.1.0"
+
+trim-right@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003"
+
+tsscmp@~1.0.0:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/tsscmp/-/tsscmp-1.0.5.tgz#7dc4a33af71581ab4337da91d85ca5427ebd9a97"
+
+tty-browserify@0.0.0:
+  version "0.0.0"
+  resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6"
+
+tty-browserify@~0.0.0:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.1.tgz#3f05251ee17904dfd0677546670db9651682b811"
+
+tunnel-agent@^0.6.0:
+  version "0.6.0"
+  resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
+  dependencies:
+    safe-buffer "^5.0.1"
+
+tunnel-agent@~0.4.1:
+  version "0.4.3"
+  resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb"
+
+tweetnacl@^0.14.3, tweetnacl@~0.14.0:
+  version "0.14.5"
+  resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
+
+type-check@~0.3.2:
+  version "0.3.2"
+  resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72"
+  dependencies:
+    prelude-ls "~1.1.2"
+
+type-is@~1.6.15:
+  version "1.6.16"
+  resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194"
+  dependencies:
+    media-typer "0.3.0"
+    mime-types "~2.1.18"
+
+typedarray@^0.0.6, typedarray@~0.0.5:
+  version "0.0.6"
+  resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
+
+uglify-es@^3.3.4:
+  version "3.3.9"
+  resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677"
+  dependencies:
+    commander "~2.13.0"
+    source-map "~0.6.1"
+
+uglify-js@^2.6, uglify-js@^2.8.29:
+  version "2.8.29"
+  resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd"
+  dependencies:
+    source-map "~0.5.1"
+    yargs "~3.10.0"
+  optionalDependencies:
+    uglify-to-browserify "~1.0.0"
+
+uglify-js@^3.3.10:
+  version "3.3.12"
+  resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.3.12.tgz#efd87c16a1f4c674a8a5ede571001ef634dcc883"
+  dependencies:
+    commander "~2.14.1"
+    source-map "~0.6.1"
+
+uglify-to-browserify@~1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7"
+
+uglifyjs-webpack-plugin@^0.4.6:
+  version "0.4.6"
+  resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz#b951f4abb6bd617e66f63eb891498e391763e309"
+  dependencies:
+    source-map "^0.5.6"
+    uglify-js "^2.8.29"
+    webpack-sources "^1.0.1"
+
+uglifyjs-webpack-plugin@^1.1.1:
+  version "1.2.2"
+  resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.2.2.tgz#e7516d4367afdb715c3847841eb46f94c45ca2b9"
+  dependencies:
+    cacache "^10.0.1"
+    find-cache-dir "^1.0.0"
+    schema-utils "^0.4.2"
+    serialize-javascript "^1.4.0"
+    source-map "^0.6.1"
+    uglify-es "^3.3.4"
+    webpack-sources "^1.1.0"
+    worker-farm "^1.5.2"
+
+uid-number@^0.0.6:
+  version "0.0.6"
+  resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81"
+
+ultron@~1.1.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c"
+
+umd@^3.0.0:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/umd/-/umd-3.0.1.tgz#8ae556e11011f63c2596708a8837259f01b3d60e"
+
+underscore@~1.7.0:
+  version "1.7.0"
+  resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.7.0.tgz#6bbaf0877500d36be34ecaa584e0db9fef035209"
+
+union-value@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4"
+  dependencies:
+    arr-union "^3.1.0"
+    get-value "^2.0.6"
+    is-extendable "^0.1.1"
+    set-value "^0.4.3"
+
+unique-filename@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.0.tgz#d05f2fe4032560871f30e93cbe735eea201514f3"
+  dependencies:
+    unique-slug "^2.0.0"
+
+unique-slug@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.0.tgz#db6676e7c7cc0629878ff196097c78855ae9f4ab"
+  dependencies:
+    imurmurhash "^0.1.4"
+
+unpipe@1.0.0, unpipe@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
+
+unset-value@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559"
+  dependencies:
+    has-value "^0.3.1"
+    isobject "^3.0.0"
+
+upath@^1.0.0:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/upath/-/upath-1.0.4.tgz#ee2321ba0a786c50973db043a50b7bcba822361d"
+
+urix@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
+
+url-parse-lax@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c"
+  dependencies:
+    prepend-http "^2.0.0"
+
+url-to-options@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9"
+
+url@^0.11.0, url@~0.11.0:
+  version "0.11.0"
+  resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1"
+  dependencies:
+    punycode "1.3.2"
+    querystring "0.2.0"
+
+use@^2.0.0:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/use/-/use-2.0.2.tgz#ae28a0d72f93bf22422a18a2e379993112dec8e8"
+  dependencies:
+    define-property "^0.2.5"
+    isobject "^3.0.0"
+    lazy-cache "^2.0.2"
+
+useragent@^2.1.12:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/useragent/-/useragent-2.3.0.tgz#217f943ad540cb2128658ab23fc960f6a88c9972"
+  dependencies:
+    lru-cache "4.1.x"
+    tmp "0.0.x"
+
+util-deprecate@~1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+
+util.promisify@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030"
+  dependencies:
+    define-properties "^1.1.2"
+    object.getownpropertydescriptors "^2.0.3"
+
+util@0.10.3, util@^0.10.3, util@~0.10.1:
+  version "0.10.3"
+  resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9"
+  dependencies:
+    inherits "2.0.1"
+
+utils-merge@1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
+
+uuid@^3.0.0, uuid@^3.1.0:
+  version "3.2.1"
+  resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14"
+
+uws@~9.14.0:
+  version "9.14.0"
+  resolved "https://registry.yarnpkg.com/uws/-/uws-9.14.0.tgz#fac8386befc33a7a3705cbd58dc47b430ca4dd95"
+
+validate-npm-package-license@^3.0.1:
+  version "3.0.3"
+  resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz#81643bcbef1bdfecd4623793dc4648948ba98338"
+  dependencies:
+    spdx-correct "^3.0.0"
+    spdx-expression-parse "^3.0.0"
+
+verror@1.10.0:
+  version "1.10.0"
+  resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400"
+  dependencies:
+    assert-plus "^1.0.0"
+    core-util-is "1.0.2"
+    extsprintf "^1.2.0"
+
+vlq@^0.2.1:
+  version "0.2.3"
+  resolved "https://registry.yarnpkg.com/vlq/-/vlq-0.2.3.tgz#8f3e4328cf63b1540c0d67e1b2778386f8975b26"
+
+vlq@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/vlq/-/vlq-1.0.0.tgz#8101be90843422954c2b13eb27f2f3122bdcc806"
+
+vm-browserify@0.0.4, vm-browserify@~0.0.1:
+  version "0.0.4"
+  resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73"
+  dependencies:
+    indexof "0.0.1"
+
+void-elements@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec"
+
+vue@^2.5.13:
+  version "2.5.13"
+  resolved "https://registry.yarnpkg.com/vue/-/vue-2.5.13.tgz#95bd31e20efcf7a7f39239c9aa6787ce8cf578e1"
+
+w3c-hr-time@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz#82ac2bff63d950ea9e3189a58a65625fedf19045"
+  dependencies:
+    browser-process-hrtime "^0.1.2"
+
+walker@~1.0.5:
+  version "1.0.7"
+  resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb"
+  dependencies:
+    makeerror "1.0.x"
+
+watch@~0.18.0:
+  version "0.18.0"
+  resolved "https://registry.yarnpkg.com/watch/-/watch-0.18.0.tgz#28095476c6df7c90c963138990c0a5423eb4b986"
+  dependencies:
+    exec-sh "^0.2.0"
+    minimist "^1.2.0"
+
+watchpack@^1.4.0:
+  version "1.5.0"
+  resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.5.0.tgz#231e783af830a22f8966f65c4c4bacc814072eed"
+  dependencies:
+    chokidar "^2.0.2"
+    graceful-fs "^4.1.2"
+    neo-async "^2.5.0"
+
+webidl-conversions@^4.0.1, webidl-conversions@^4.0.2:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad"
+
+webpack-dev-middleware@^1.12.0:
+  version "1.12.2"
+  resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz#f8fc1120ce3b4fc5680ceecb43d777966b21105e"
+  dependencies:
+    memory-fs "~0.4.1"
+    mime "^1.5.0"
+    path-is-absolute "^1.0.0"
+    range-parser "^1.0.3"
+    time-stamp "^2.0.0"
+
+webpack-sources@^1.0.1, webpack-sources@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.1.0.tgz#a101ebae59d6507354d71d8013950a3a8b7a5a54"
+  dependencies:
+    source-list-map "^2.0.0"
+    source-map "~0.6.1"
+
+webpack@*:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.0.1.tgz#768d708beeca4c5f77f6c2d38a240fb6ff50ba5d"
+  dependencies:
+    acorn "^5.0.0"
+    acorn-dynamic-import "^3.0.0"
+    ajv "^6.1.0"
+    ajv-keywords "^3.1.0"
+    chrome-trace-event "^0.1.1"
+    enhanced-resolve "^4.0.0"
+    eslint-scope "^3.7.1"
+    loader-runner "^2.3.0"
+    loader-utils "^1.1.0"
+    memory-fs "~0.4.1"
+    micromatch "^3.1.8"
+    mkdirp "~0.5.0"
+    neo-async "^2.5.0"
+    node-libs-browser "^2.0.0"
+    schema-utils "^0.4.2"
+    tapable "^1.0.0"
+    uglifyjs-webpack-plugin "^1.1.1"
+    watchpack "^1.4.0"
+    webpack-sources "^1.0.1"
+
+webpack@^3.11.0:
+  version "3.11.0"
+  resolved "https://registry.yarnpkg.com/webpack/-/webpack-3.11.0.tgz#77da451b1d7b4b117adaf41a1a93b5742f24d894"
+  dependencies:
+    acorn "^5.0.0"
+    acorn-dynamic-import "^2.0.0"
+    ajv "^6.1.0"
+    ajv-keywords "^3.1.0"
+    async "^2.1.2"
+    enhanced-resolve "^3.4.0"
+    escope "^3.6.0"
+    interpret "^1.0.0"
+    json-loader "^0.5.4"
+    json5 "^0.5.1"
+    loader-runner "^2.3.0"
+    loader-utils "^1.1.0"
+    memory-fs "~0.4.1"
+    mkdirp "~0.5.0"
+    node-libs-browser "^2.0.0"
+    source-map "^0.5.3"
+    supports-color "^4.2.1"
+    tapable "^0.2.7"
+    uglifyjs-webpack-plugin "^0.4.6"
+    watchpack "^1.4.0"
+    webpack-sources "^1.0.1"
+    yargs "^8.0.2"
+
+whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz#57c235bc8657e914d24e1a397d3c82daee0a6ba3"
+  dependencies:
+    iconv-lite "0.4.19"
+
+whatwg-url@^6.4.0:
+  version "6.4.0"
+  resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.4.0.tgz#08fdf2b9e872783a7a1f6216260a1d66cc722e08"
+  dependencies:
+    lodash.sortby "^4.7.0"
+    tr46 "^1.0.0"
+    webidl-conversions "^4.0.1"
+
+when@^3.7.7:
+  version "3.7.8"
+  resolved "https://registry.yarnpkg.com/when/-/when-3.7.8.tgz#c7130b6a7ea04693e842cdc9e7a1f2aa39a39f82"
+
+which-module@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
+
+which@^1.2.1, which@^1.2.12, which@^1.2.9, which@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a"
+  dependencies:
+    isexe "^2.0.0"
+
+wide-align@^1.1.0:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710"
+  dependencies:
+    string-width "^1.0.2"
+
+window-size@0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d"
+
+wordwrap@0.0.2:
+  version "0.0.2"
+  resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f"
+
+wordwrap@~0.0.2:
+  version "0.0.3"
+  resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107"
+
+wordwrap@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"
+
+worker-farm@^1.5.2:
+  version "1.5.4"
+  resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.5.4.tgz#4debbe46b40edefcc717ebde74a90b1ae1e909a1"
+  dependencies:
+    errno "~0.1.7"
+    xtend "~4.0.1"
+
+wrap-ansi@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85"
+  dependencies:
+    string-width "^1.0.1"
+    strip-ansi "^3.0.1"
+
+wrappy@1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+
+write-file-atomic@^2.1.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab"
+  dependencies:
+    graceful-fs "^4.1.11"
+    imurmurhash "^0.1.4"
+    signal-exit "^3.0.2"
+
+write@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757"
+  dependencies:
+    mkdirp "^0.5.1"
+
+ws@^4.0.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/ws/-/ws-4.1.0.tgz#a979b5d7d4da68bf54efe0408967c324869a7289"
+  dependencies:
+    async-limiter "~1.0.0"
+    safe-buffer "~5.1.0"
+
+ws@~3.3.1:
+  version "3.3.3"
+  resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2"
+  dependencies:
+    async-limiter "~1.0.0"
+    safe-buffer "~5.1.0"
+    ultron "~1.1.0"
+
+xml-name-validator@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a"
+
+xmlhttprequest-ssl@~1.5.4:
+  version "1.5.5"
+  resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz#c2876b06168aadc40e57d97e81191ac8f4398b3e"
+
+xregexp@2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-2.0.0.tgz#52a63e56ca0b84a7f3a5f3d61872f126ad7a5943"
+
+xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
+
+y18n@^3.2.1:
+  version "3.2.1"
+  resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41"
+
+y18n@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b"
+
+yallist@^2.1.2:
+  version "2.1.2"
+  resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
+
+yargs-parser@^7.0.0:
+  version "7.0.0"
+  resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9"
+  dependencies:
+    camelcase "^4.1.0"
+
+yargs-parser@^8.1.0:
+  version "8.1.0"
+  resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-8.1.0.tgz#f1376a33b6629a5d063782944da732631e966950"
+  dependencies:
+    camelcase "^4.1.0"
+
+yargs-parser@^9.0.2:
+  version "9.0.2"
+  resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077"
+  dependencies:
+    camelcase "^4.1.0"
+
+yargs@^10.0.3:
+  version "10.1.2"
+  resolved "https://registry.yarnpkg.com/yargs/-/yargs-10.1.2.tgz#454d074c2b16a51a43e2fb7807e4f9de69ccb5c5"
+  dependencies:
+    cliui "^4.0.0"
+    decamelize "^1.1.1"
+    find-up "^2.1.0"
+    get-caller-file "^1.0.1"
+    os-locale "^2.0.0"
+    require-directory "^2.1.1"
+    require-main-filename "^1.0.1"
+    set-blocking "^2.0.0"
+    string-width "^2.0.0"
+    which-module "^2.0.0"
+    y18n "^3.2.1"
+    yargs-parser "^8.1.0"
+
+yargs@^11.0.0:
+  version "11.0.0"
+  resolved "https://registry.yarnpkg.com/yargs/-/yargs-11.0.0.tgz#c052931006c5eee74610e5fc0354bedfd08a201b"
+  dependencies:
+    cliui "^4.0.0"
+    decamelize "^1.1.1"
+    find-up "^2.1.0"
+    get-caller-file "^1.0.1"
+    os-locale "^2.0.0"
+    require-directory "^2.1.1"
+    require-main-filename "^1.0.1"
+    set-blocking "^2.0.0"
+    string-width "^2.0.0"
+    which-module "^2.0.0"
+    y18n "^3.2.1"
+    yargs-parser "^9.0.2"
+
+yargs@^8.0.2:
+  version "8.0.2"
+  resolved "https://registry.yarnpkg.com/yargs/-/yargs-8.0.2.tgz#6299a9055b1cefc969ff7e79c1d918dceb22c360"
+  dependencies:
+    camelcase "^4.1.0"
+    cliui "^3.2.0"
+    decamelize "^1.1.1"
+    get-caller-file "^1.0.1"
+    os-locale "^2.0.0"
+    read-pkg-up "^2.0.0"
+    require-directory "^2.1.1"
+    require-main-filename "^1.0.1"
+    set-blocking "^2.0.0"
+    string-width "^2.0.0"
+    which-module "^2.0.0"
+    y18n "^3.2.1"
+    yargs-parser "^7.0.0"
+
+yargs@~3.10.0:
+  version "3.10.0"
+  resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1"
+  dependencies:
+    camelcase "^1.0.2"
+    cliui "^2.1.0"
+    decamelize "^1.0.0"
+    window-size "0.1.0"
+
+yeast@0.1.2:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419"
diff --git a/advancedcontentfilter/vendor/asset/vue/.babelrc b/advancedcontentfilter/vendor/asset/vue/.babelrc
new file mode 100644 (file)
index 0000000..605b140
--- /dev/null
@@ -0,0 +1,8 @@
+{
+  "presets": ["es2015", "flow-vue"],
+  "plugins": ["transform-vue-jsx", "syntax-dynamic-import"],
+  "ignore": [
+    "dist/*.js",
+    "packages/**/*.js"
+  ]
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/.circleci/config.yml b/advancedcontentfilter/vendor/asset/vue/.circleci/config.yml
new file mode 100644 (file)
index 0000000..8abef17
--- /dev/null
@@ -0,0 +1,81 @@
+version: 2
+
+defaults: &defaults
+  working_directory: ~/project/vue
+  docker:
+    - image: circleci/node:6-browsers
+
+jobs:
+  install:
+    <<: *defaults
+    steps:
+      - checkout
+      - restore_cache:
+          keys:
+            - v1-vue-{{ .Branch }}-{{ checksum "yarn.lock" }}
+            - v1-vue-{{ .Branch }}-
+            - v1-vue-
+      - run: npm install
+      - save_cache:
+          key: v1-vue-{{ .Branch }}-{{ checksum "yarn.lock" }}
+          paths:
+            - node_modules/
+      - persist_to_workspace:
+          root: ~/project
+          paths:
+            - vue
+
+  lint-flow-types:
+    <<: *defaults
+    steps:
+      - attach_workspace:
+          at: ~/project
+      - run: npm run lint
+      - run: npm run flow
+      - run: npm run test:types
+
+  test-cover:
+    <<: *defaults
+    steps:
+      - attach_workspace:
+          at: ~/project
+      - run: npm run test:cover
+      - run:
+         name: report coverage stats for non-PRs
+         command: |
+           if [[ -z $CI_PULL_REQUEST ]]; then
+             ./node_modules/.bin/codecov
+           fi
+
+  test-e2e:
+    <<: *defaults
+    steps:
+      - attach_workspace:
+          at: ~/project
+      - run: npm run test:e2e -- --env phantomjs
+
+  test-ssr-weex:
+    <<: *defaults
+    steps:
+      - attach_workspace:
+          at: ~/project
+      - run: npm run test:ssr
+      - run: npm run test:weex
+
+workflows:
+  version: 2
+  install-and-parallel-test:
+    jobs:
+      - install
+      - test-cover:
+          requires:
+            - install
+      - lint-flow-types:
+          requires:
+            - install
+      - test-e2e:
+          requires:
+            - install
+      - test-ssr-weex:
+          requires:
+            - install
diff --git a/advancedcontentfilter/vendor/asset/vue/.editorconfig b/advancedcontentfilter/vendor/asset/vue/.editorconfig
new file mode 100644 (file)
index 0000000..f1cc3ad
--- /dev/null
@@ -0,0 +1,15 @@
+# http://editorconfig.org
+
+root = true
+
+[*]
+charset = utf-8
+indent_style = space
+indent_size = 2
+end_of_line = lf
+insert_final_newline = true
+trim_trailing_whitespace = true
+
+[*.md]
+insert_final_newline = false
+trim_trailing_whitespace = false
diff --git a/advancedcontentfilter/vendor/asset/vue/.eslintignore b/advancedcontentfilter/vendor/asset/vue/.eslintignore
new file mode 100644 (file)
index 0000000..7bf90e2
--- /dev/null
@@ -0,0 +1,3 @@
+flow
+dist
+packages
diff --git a/advancedcontentfilter/vendor/asset/vue/.eslintrc b/advancedcontentfilter/vendor/asset/vue/.eslintrc
new file mode 100644 (file)
index 0000000..f584542
--- /dev/null
@@ -0,0 +1,14 @@
+{
+  "root": true,
+  "plugins": [
+    "flowtype"
+  ],
+  "extends": [
+    "plugin:vue-libs/recommended",
+    "plugin:flowtype/recommended"
+  ],
+  "globals": {
+    "__WEEX__": true,
+    "WXEnvironment": true
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/.flowconfig b/advancedcontentfilter/vendor/asset/vue/.flowconfig
new file mode 100644 (file)
index 0000000..2d6f9a7
--- /dev/null
@@ -0,0 +1,23 @@
+[ignore]
+.*/node_modules/.*
+.*/test/.*
+.*/scripts/.*
+.*/examples/.*
+.*/benchmarks/.*
+
+[include]
+
+[libs]
+flow
+
+[options]
+unsafe.enable_getters_and_setters=true
+module.name_mapper='^compiler/\(.*\)$' -> '<PROJECT_ROOT>/src/compiler/\1'
+module.name_mapper='^core/\(.*\)$' -> '<PROJECT_ROOT>/src/core/\1'
+module.name_mapper='^shared/\(.*\)$' -> '<PROJECT_ROOT>/src/shared/\1'
+module.name_mapper='^web/\(.*\)$' -> '<PROJECT_ROOT>/src/platforms/web/\1'
+module.name_mapper='^weex/\(.*\)$' -> '<PROJECT_ROOT>/src/platforms/weex/\1'
+module.name_mapper='^server/\(.*\)$' -> '<PROJECT_ROOT>/src/server/\1'
+module.name_mapper='^entries/\(.*\)$' -> '<PROJECT_ROOT>/src/entries/\1'
+module.name_mapper='^sfc/\(.*\)$' -> '<PROJECT_ROOT>/src/sfc/\1'
+suppress_comment= \\(.\\|\n\\)*\\$flow-disable-line
diff --git a/advancedcontentfilter/vendor/asset/vue/.github/CODE_OF_CONDUCT.md b/advancedcontentfilter/vendor/asset/vue/.github/CODE_OF_CONDUCT.md
new file mode 100644 (file)
index 0000000..4ead0e1
--- /dev/null
@@ -0,0 +1,13 @@
+# Contributor Code of Conduct
+
+As contributors and maintainers of this project, we pledge to respect all people who contribute through reporting issues, posting feature requests, updating documentation, submitting pull requests or patches, and other activities.
+
+We are committed to making participation in this project a harassment-free experience for everyone, regardless of level of experience, gender, gender identity and expression, sexual orientation, disability, personal appearance, body size, race, age, or religion.
+
+Examples of unacceptable behavior by participants include the use of sexual language or imagery, derogatory comments or personal attacks, trolling, public or private harassment, insults, or other unprofessional conduct.
+
+Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct. Project maintainers who do not follow the Code of Conduct may be removed from the project team.
+
+Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by opening an issue or contacting one or more of the project maintainers.
+
+This Code of Conduct is adapted from the [Contributor Covenant](http://contributor-covenant.org), version 1.0.0, available at [http://contributor-covenant.org/version/1/0/0/](http://contributor-covenant.org/version/1/0/0/)
diff --git a/advancedcontentfilter/vendor/asset/vue/.github/COMMIT_CONVENTION.md b/advancedcontentfilter/vendor/asset/vue/.github/COMMIT_CONVENTION.md
new file mode 100644 (file)
index 0000000..02e7ad2
--- /dev/null
@@ -0,0 +1,91 @@
+## Git Commit Message Convention
+
+> This is adapted from [Angular's commit convention](https://github.com/conventional-changelog/conventional-changelog/tree/master/packages/conventional-changelog-angular).
+
+#### TL;DR:
+
+Messages must be matched by the following regex:
+
+``` js
+/^(revert: )?(feat|fix|polish|docs|style|refactor|perf|test|workflow|ci|chore|types)(\(.+\))?: .{1,50}/
+```
+
+#### Examples
+
+Appears under "Features" header, `compiler` subheader:
+
+```
+feat(compiler): add 'comments' option
+```
+
+Appears under "Bug Fixes" header, `v-model` subheader, with a link to issue #28:
+
+```
+fix(v-model): handle events on blur
+
+close #28
+```
+
+Appears under "Performance Improvements" header, and under "Breaking Changes" with the breaking change explanation:
+
+```
+perf(core): improve vdom diffing by removing 'foo' option
+
+BREAKING CHANGE: The 'foo' option has been removed.
+```
+
+The following commit and commit `667ecc1` do not appear in the changelog if they are under the same release. If not, the revert commit appears under the "Reverts" header.
+
+```
+revert: feat(compiler): add 'comments' option
+
+This reverts commit 667ecc1654a317a13331b17617d973392f415f02.
+```
+
+### Full Message Format
+
+A commit message consists of a **header**, **body** and **footer**.  The header has a **type**, **scope** and **subject**:
+
+```
+<type>(<scope>): <subject>
+<BLANK LINE>
+<body>
+<BLANK LINE>
+<footer>
+```
+
+The **header** is mandatory and the **scope** of the header is optional.
+
+### Revert
+
+If the commit reverts a previous commit, it should begin with `revert: `, followed by the header of the reverted commit. In the body it should say: `This reverts commit <hash>.`, where the hash is the SHA of the commit being reverted.
+
+### Type
+
+If the prefix is `feat`, `fix` or `perf`, it will appear in the changelog. However if there is any [BREAKING CHANGE](#footer), the commit will always appear in the changelog.
+
+Other prefixes are up to your discretion. Suggested prefixes are `docs`, `chore`, `style`, `refactor`, and `test` for non-changelog related tasks.
+
+### Scope
+
+The scope could be anything specifying place of the commit change. For example `core`, `compiler`, `ssr`, `v-model`, `transition` etc...
+
+### Subject
+
+The subject contains succinct description of the change:
+
+* use the imperative, present tense: "change" not "changed" nor "changes"
+* don't capitalize first letter
+* no dot (.) at the end
+
+### Body
+
+Just as in the **subject**, use the imperative, present tense: "change" not "changed" nor "changes".
+The body should include the motivation for the change and contrast this with previous behavior.
+
+### Footer
+
+The footer should contain any information about **Breaking Changes** and is also the place to
+reference GitHub issues that this commit **Closes**.
+
+**Breaking Changes** should start with the word `BREAKING CHANGE:` with a space or two newlines. The rest of the commit message is then used for this.
diff --git a/advancedcontentfilter/vendor/asset/vue/.github/CONTRIBUTING.md b/advancedcontentfilter/vendor/asset/vue/.github/CONTRIBUTING.md
new file mode 100644 (file)
index 0000000..38d9618
--- /dev/null
@@ -0,0 +1,140 @@
+# Vue.js Contributing Guide
+
+Hi! I’m really excited that you are interested in contributing to Vue.js. Before submitting your contribution though, please make sure to take a moment and read through the following guidelines.
+
+- [Code of Conduct](https://github.com/vuejs/vue/blob/dev/.github/CODE_OF_CONDUCT.md)
+- [Issue Reporting Guidelines](#issue-reporting-guidelines)
+- [Pull Request Guidelines](#pull-request-guidelines)
+- [Development Setup](#development-setup)
+- [Project Structure](#project-structure)
+
+## Issue Reporting Guidelines
+
+- Always use [https://new-issue.vuejs.org/](https://new-issue.vuejs.org/) to create new issues.
+
+## Pull Request Guidelines
+
+- The `master` branch is basically just a snapshot of the latest stable release. All development should be done in dedicated branches. **Do not submit PRs against the `master` branch.**
+
+- Checkout a topic branch from the relevant branch, e.g. `dev`, and merge back against that branch.
+
+- Work in the `src` folder and **DO NOT** checkin `dist` in the commits.
+
+- It's OK to have multiple small commits as you work on the PR - we will let GitHub automatically squash it before merging.
+
+- Make sure `npm test` passes. (see [development setup](#development-setup))
+
+- If adding new feature:
+  - Add accompanying test case.
+  - Provide convincing reason to add this feature. Ideally you should open a suggestion issue first and have it greenlighted before working on it.
+
+- If fixing a bug:
+  - If you are resolving a special issue, add `(fix #xxxx[,#xxx])` (#xxxx is the issue id) in your PR title for a better release log, e.g. `update entities encoding/decoding (fix #3899)`.
+  - Provide detailed description of the bug in the PR. Live demo preferred.
+  - Add appropriate test coverage if applicable.
+
+## Development Setup
+
+You will need [Node.js](http://nodejs.org) **version 6+** and [Java Runtime Environment](http://www.oracle.com/technetwork/java/javase/downloads/index.html) (needed for running Selenium server during e2e tests).
+
+After cloning the repo, run:
+
+``` bash
+$ npm install # or yarn
+```
+
+### Committing Changes
+
+Commit messages should follow the [commit message convention](./COMMIT_CONVENTION.md) so that changelogs can be automatically generated. Commit messages will be automatically validated upon commit. If you are not familiar with the commit message convention, you can use `npm run commit` instead of `git commit`, which provides an interactive CLI for generating proper commit messages.
+
+### Commonly used NPM scripts
+
+``` bash
+# watch and auto re-build dist/vue.js
+$ npm run dev
+
+# watch and auto re-run unit tests in Chrome
+$ npm run dev:test
+
+# build all dist files, including npm packages
+$ npm run build
+
+# run the full test suite, include linting / type checking
+$ npm test
+```
+
+There are some other scripts available in the `scripts` section of the `package.json` file.
+
+The default test script will do the following: lint with ESLint -> type check with Flow -> unit tests with coverage -> e2e tests. **Please make sure to have this pass successfully before submitting a PR.** Although the same tests will be run against your PR on the CI server, it is better to have it working locally beforehand.
+
+## Project Structure
+
+- **`scripts`**: contains build-related scripts and configuration files. In most cases you don't need to touch them. However, it would be helpful to familiarize yourself with the following files:
+
+  - `scripts/alias.js`: module import aliases used across all source code and tests.
+
+  - `scripts/config.js`: contains the build configurations for all files found in `dist/`. Check this file if you want to find out the entry source file for a dist file.
+
+- **`dist`**: contains built files for distribution. Note this directory is only updated when a release happens; they do not reflect the latest changes in development branches.
+
+  See [dist/README.md](https://github.com/vuejs/vue/blob/dev/dist/README.md) for more details on dist files.
+
+- **`flow`**: contains type declarations for [Flow](https://flowtype.org/). These declarations are loaded **globally** and you will see them used in type annotations in normal source code.
+
+- **`packages`**: contains `vue-server-renderer` and `vue-template-compiler`, which are distributed as separate NPM packages. They are automatically generated from the source code and always have the same version with the main `vue` package.
+
+- **`test`**: contains all tests. The unit tests are written with [Jasmine](http://jasmine.github.io/2.3/introduction.html) and run with [Karma](http://karma-runner.github.io/0.13/index.html). The e2e tests are written for and run with [Nightwatch.js](http://nightwatchjs.org/).
+
+- **`src`**: contains the source code, obviously. The codebase is written in ES2015 with [Flow](https://flowtype.org/) type annotations.
+
+  - **`compiler`**: contains code for the template-to-render-function compiler.
+
+    The compiler consists of a parser (converts template strings to element ASTs), an optimizer (detects static trees for vdom render optimization), and a code generator (generate render function code from element ASTs). Note the codegen directly generates code strings from the element AST - it's done this way for smaller code size because the compiler is shipped to the browser in the standalone build.
+
+  - **`core`**: contains universal, platform-agnostic runtime code.
+
+    The Vue 2.0 core is platform-agnostic - which means code inside `core` should be able to run in any JavaScript environment, be it the browser, Node.js, or an embedded JavaScript runtime in native applications.
+
+    - **`observer`**: contains code related to the reactivity system.
+
+    - **`vdom`**: contains code related to vdom element creation and patching.
+
+    - **`instance`**: contains Vue instance constructor and prototype methods.
+
+    - **`global-api`**: as the name suggests.
+
+    - **`components`**: universal abstract components. Currently `keep-alive` is the only one.
+
+  - **`server`**: contains code related to server-side rendering.
+
+  - **`platforms`**: contains platform-specific code.
+
+    Entry files for dist builds are located in their respective platform directory.
+
+    Each platform module contains three parts: `compiler`, `runtime` and `server`, corresponding to the three directories above. Each part contains platform-specific modules/utilities which are then imported and injected to the core counterparts in platform-specific entry files. For example, the code implementing the logic behind `v-bind:class` is in `platforms/web/runtime/modules/class.js` - which is imported in `entries/web-runtime.js` and used to create the browser-specific vdom patching function.
+
+  - **`sfc`**: contains single-file component (`*.vue` files) parsing logic. This is used in the `vue-template-compiler` package.
+
+  - **`shared`**: contains utilities shared across the entire codebase.
+
+  - **`types`**: contains TypeScript type definitions
+
+    - **`test`**: type definitions tests
+
+
+## Financial Contribution
+
+As a pure community-driven project without major corporate backing, we also welcome financial contributions via Patreon or OpenCollective.
+
+- [Become a backer or sponsor on Patreon](https://www.patreon.com/evanyou)
+- [Become a backer or sponsor on OpenCollective](https://opencollective.com/vuejs)
+
+### What's the difference between Patreon and OpenCollective?
+
+Funds donated via Patreon go directly to support Evan You's full-time work on Vue.js. Funds donated via OpenCollective are managed with transparent expenses and will be used for compensating work and expenses for core team members or sponsoring community events. Your name/logo will receive proper recognition and exposure by donating on either platform.
+
+## Credits
+
+Thank you to all the people who have already contributed to Vue.js!
+
+<a href="https://github.com/vuejs/vue/graphs/contributors"><img src="https://opencollective.com/vuejs/contributors.svg?width=890" /></a>
diff --git a/advancedcontentfilter/vendor/asset/vue/.github/ISSUE_TEMPLATE.md b/advancedcontentfilter/vendor/asset/vue/.github/ISSUE_TEMPLATE.md
new file mode 100644 (file)
index 0000000..cb7f961
--- /dev/null
@@ -0,0 +1,16 @@
+<!--
+IMPORTANT: Please use the following link to create a new issue:
+
+  https://new-issue.vuejs.org/
+
+If your issue was not created using the app above, it will be closed immediately.
+
+中文用户请注意:
+请使用上面的链接来创建新的 issue。如果不是用上述工具创建的 issue 会被自动关闭。
+-->
+
+<!--
+Love vuejs? Please consider supporting us via Patreon or OpenCollective:
+👉  https://www.patreon.com/evanyou
+👉  https://opencollective.com/vuejs/donate
+-->
diff --git a/advancedcontentfilter/vendor/asset/vue/.github/PULL_REQUEST_TEMPLATE.md b/advancedcontentfilter/vendor/asset/vue/.github/PULL_REQUEST_TEMPLATE.md
new file mode 100644 (file)
index 0000000..7bda056
--- /dev/null
@@ -0,0 +1,35 @@
+<!--
+Please make sure to read the Pull Request Guidelines:
+https://github.com/vuejs/vue/blob/dev/.github/CONTRIBUTING.md#pull-request-guidelines
+-->
+
+<!-- PULL REQUEST TEMPLATE -->
+<!-- (Update "[ ]" to "[x]" to check a box) -->
+
+**What kind of change does this PR introduce?** (check at least one)
+
+- [ ] Bugfix
+- [ ] Feature
+- [ ] Code style update
+- [ ] Refactor
+- [ ] Build-related changes
+- [ ] Other, please describe:
+
+**Does this PR introduce a breaking change?** (check one)
+
+- [ ] Yes
+- [ ] No
+
+If yes, please describe the impact and migration path for existing applications:
+
+**The PR fulfills these requirements:**
+
+- [ ] It's submitted to the `dev` branch for v2.x (or to a previous version branch), _not_ the `master` branch
+- [ ] When resolving a specific issue, it's referenced in the PR's title (e.g. `fix #xxx[,#xxx]`, where "xxx" is the issue number)
+- [ ] All tests are passing: https://github.com/vuejs/vue/blob/dev/.github/CONTRIBUTING.md#development-setup
+- [ ] New/updated tests are included
+
+If adding a **new feature**, the PR's description includes:
+- [ ] A convincing reason for adding this feature (to avoid wasting your time, it's best to open a suggestion issue first and wait for approval before working on it)
+
+**Other information:**
diff --git a/advancedcontentfilter/vendor/asset/vue/.gitignore b/advancedcontentfilter/vendor/asset/vue/.gitignore
new file mode 100644 (file)
index 0000000..370a6ed
--- /dev/null
@@ -0,0 +1,19 @@
+.DS_Store
+node_modules
+*.log
+explorations
+TODOs.md
+dist/*.gz
+dist/*.map
+dist/vue.common.min.js
+test/e2e/reports
+test/e2e/screenshots
+coverage
+RELEASE_NOTE*.md
+dist/*.js
+packages/vue-server-renderer/basic.js
+packages/vue-server-renderer/build.js
+packages/vue-server-renderer/server-plugin.js
+packages/vue-server-renderer/client-plugin.js
+packages/vue-template-compiler/build.js
+.vscode
diff --git a/advancedcontentfilter/vendor/asset/vue/BACKERS.md b/advancedcontentfilter/vendor/asset/vue/BACKERS.md
new file mode 100644 (file)
index 0000000..a1a2717
--- /dev/null
@@ -0,0 +1,348 @@
+<h1 align="center">Sponsors &amp; Backers</h1>
+
+Vue.js is an MIT-licensed open source project. It's an independent project with its ongoing development made possible entirely thanks to the support by these awesome [backers](https://github.com/vuejs/vue/blob/dev/BACKERS.md). If you'd like to join them, please consider:
+
+- [Become a backer or sponsor on Patreon](https://www.patreon.com/evanyou).
+- [Become a backer or sponsor on OpenCollective](https://opencollective.com/vuejs).
+- [One-time donation via PayPal or crypto-currencies.](https://vuejs.org/support-vuejs/#One-time-Donations)
+
+#### What's the difference between Patreon and OpenCollective?
+
+Funds donated via Patreon go directly to support Evan You's full-time work on Vue.js. Funds donated via OpenCollective are managed with transparent expenses and will be used for compensating work and expenses for core team members or sponsoring community events. Your name/logo will receive proper recognition and exposure by donating on either platform.
+
+<br><br>
+
+<h2 align="center">Special Sponsors</h2>
+
+<!--special start-->
+<table>
+  <tbody>
+    <tr>
+      <td align="center" valign="middle">
+        <a href="https://stdlib.com" target="_blank">
+          <img width="222px" src="https://raw.githubusercontent.com/vuejs/vuejs.org/master/themes/vue/source/images/stdlib.png">
+        </a>
+      </td>
+      <td align="center" valign="middle">
+        <a href="https://www.bitsrc.io/?utm_source=vue&utm_medium=vue&utm_campaign=vue&utm_term=vue&utm_content=vue" target="_blank">
+          <img height="90px" src="https://raw.githubusercontent.com/vuejs/vuejs.org/master/themes/vue/source/images/bit-wide.png">
+        </a>
+      </td>
+      <td align="center" valign="middle">
+        <a href="https://xiaozhuanlan.com" target="_blank">
+          <img width="222px" src="https://raw.githubusercontent.com/vuejs/cn.vuejs.org/master/themes/vue/source/images/xiaozhuanlan.png">
+        </a>
+      </td>
+    </tr><tr></tr>
+  </tbody>
+</table>
+<!--special end-->
+
+<h2 align="center">Platinum via Patreon</h2>
+
+<!--platinum start-->
+<table>
+  <tbody>
+    <tr>
+      <td align="center" valign="middle">
+        <a href="http://tooltwist.com/" target="_blank">
+          <img width="222px" src="https://raw.githubusercontent.com/vuejs/vuejs.org/master/themes/vue/source/images/tooltwist.png">
+        </a>
+      </td>
+      <td align="center" valign="middle">
+        <a href="https://vueschool.io/?utm_source=Vuejs.org&utm_medium=Banner&utm_campaign=Sponsored%20Banner&utm_content=V1" target="_blank">
+          <img width="222px" src="https://raw.githubusercontent.com/vuejs/vuejs.org/master/themes/vue/source/images/vueschool.png">
+        </a>
+      </td>
+      <td align="center" valign="middle">
+        <a href="https://www.datacamp.com/careers?utm_source=vuejs&utm_medium=sidebar" target="_blank">
+          <img width="222px" src="https://raw.githubusercontent.com/vuejs/vuejs.org/master/themes/vue/source/images/datacamp.png">
+        </a>
+      </td>
+    </tr><tr></tr>
+  </tbody>
+</table>
+<!--platinum end-->
+
+<h2 align="center">Platinum via OpenCollective</h2>
+
+<a href="https://opencollective.com/vuejs/tiers/platinum-sponsors/0/website" target="_blank"><img src="https://opencollective.com/vuejs/tiers/platinum-sponsors/0/avatar.svg"></a>
+<a href="https://opencollective.com/vuejs/tiers/platinum-sponsors/1/website" target="_blank"><img src="https://opencollective.com/vuejs/tiers/platinum-sponsors/1/avatar.svg"></a>
+
+<h2 align="center">Gold via Patreon</h2>
+
+<!--gold start-->
+<table>
+  <tbody>
+    <tr>
+      <td align="center" valign="middle">
+        <a href="https://laravel.com" target="_blank">
+          <img width="148px" src="https://raw.githubusercontent.com/vuejs/vuejs.org/master/themes/vue/source/images/laravel.png">
+        </a>
+      </td>
+      <td align="center" valign="middle">
+        <a href="https://htmlburger.com" target="_blank">
+          <img width="148px" src="https://raw.githubusercontent.com/vuejs/vuejs.org/master/themes/vue/source/images/htmlburger.png">
+        </a>
+      </td>
+      <td align="center" valign="middle">
+        <a href="https://chaitin.cn/en/" target="_blank">
+          <img width="148px" src="https://raw.githubusercontent.com/vuejs/vuejs.org/master/themes/vue/source/images/chaitin.png">
+        </a>
+      </td>
+      <td align="center" valign="middle">
+        <a href="https://anymod.com" target="_blank">
+          <img width="148px" src="https://raw.githubusercontent.com/vuejs/vuejs.org/master/themes/vue/source/images/anymod.png">
+        </a>
+      </td>
+      <td align="center" valign="middle">
+        <a href="https://www.frontenddeveloperlove.com/" target="_blank">
+          <img width="148px" src="https://raw.githubusercontent.com/vuejs/vuejs.org/master/themes/vue/source/images/frontend-love.png">
+        </a>
+      </td>
+      <td align="center" valign="middle">
+        <a href="https://onsen.io/vue/" target="_blank">
+          <img width="148px" src="https://raw.githubusercontent.com/vuejs/vuejs.org/master/themes/vue/source/images/onsen-ui.png">
+        </a>
+      </td>
+    </tr><tr></tr>
+    <tr>
+      <td align="center" valign="middle">
+        <a href="https://vuetifyjs.com" target="_blank">
+          <img width="148px" src="https://raw.githubusercontent.com/vuejs/vuejs.org/master/themes/vue/source/images/vuetify.png">
+        </a>
+      </td>
+      <td align="center" valign="middle">
+        <a href="https://neds.com.au/" target="_blank">
+          <img width="148px" src="https://raw.githubusercontent.com/vuejs/vuejs.org/master/themes/vue/source/images/neds.png">
+        </a>
+      </td>
+      <td align="center" valign="middle">
+        <a href="https://hackr.io/tutorials/learn-vue-js" target="_blank">
+          <img width="148px" src="https://raw.githubusercontent.com/vuejs/vuejs.org/master/themes/vue/source/images/hackr-io.png">
+        </a>
+      </td>
+      <td align="center" valign="middle">
+        <a href="https://icons8.com/" target="_blank">
+          <img width="148px" src="https://raw.githubusercontent.com/vuejs/vuejs.org/master/themes/vue/source/images/icons8.png">
+        </a>
+      </td>
+      <td align="center" valign="middle">
+        <a href="https://vuejobs.com/?ref=vuejs" target="_blank">
+          <img width="148px" src="https://raw.githubusercontent.com/vuejs/vuejs.org/master/themes/vue/source/images/vuejobs.png">
+        </a>
+      </td>
+      <td align="center" valign="middle">
+        <a href="https://leanpub.com/vuejs2" target="_blank">
+          <img width="148px" src="https://raw.githubusercontent.com/vuejs/vuejs.org/master/themes/vue/source/images/tmvuejs2.png">
+        </a>
+      </td>
+    </tr><tr></tr>
+    <tr>
+      <td align="center" valign="middle">
+        <a href="https://www.bmqb.com/jobs" target="_blank">
+          <img width="148px" src="https://raw.githubusercontent.com/vuejs/vuejs.org/master/themes/vue/source/images/bmqb.png">
+        </a>
+      </td>
+      <td align="center" valign="middle">
+        <a href="https://codepilot.ai" target="_blank">
+          <img width="148px" src="https://raw.githubusercontent.com/vuejs/vuejs.org/master/themes/vue/source/images/codepilot.png">
+        </a>
+      </td>
+    </tr><tr></tr>
+  </tbody>
+</table>
+<!--gold end-->
+
+<h2 align="center">Gold via OpenCollective</h2>
+
+<a href="https://opencollective.com/vuejs/tiers/gold-sponsors/0/website" target="_blank"><img src="https://opencollective.com/vuejs/tiers/gold-sponsors/0/avatar.svg" height="60px"></a>
+<a href="https://opencollective.com/vuejs/tiers/gold-sponsors/1/website" target="_blank"><img src="https://opencollective.com/vuejs/tiers/gold-sponsors/1/avatar.svg" height="60px"></a>
+<a href="https://opencollective.com/vuejs/tiers/gold-sponsors/2/website" target="_blank"><img src="https://opencollective.com/vuejs/tiers/gold-sponsors/2/avatar.svg" height="60px"></a>
+<a href="https://opencollective.com/vuejs/tiers/gold-sponsors/3/website" target="_blank"><img src="https://opencollective.com/vuejs/tiers/gold-sponsors/3/avatar.svg" height="60px"></a>
+<a href="https://opencollective.com/vuejs/tiers/gold-sponsors/4/website" target="_blank"><img src="https://opencollective.com/vuejs/tiers/gold-sponsors/4/avatar.svg" height="60px"></a>
+<a href="https://opencollective.com/vuejs/tiers/gold-sponsors/5/website" target="_blank"><img src="https://opencollective.com/vuejs/tiers/gold-sponsors/5/avatar.svg" height="60px"></a>
+<a href="https://opencollective.com/vuejs/tiers/gold-sponsors/6/website" target="_blank"><img src="https://opencollective.com/vuejs/tiers/gold-sponsors/6/avatar.svg" height="60px"></a>
+<a href="https://opencollective.com/vuejs/tiers/gold-sponsors/7/website" target="_blank"><img src="https://opencollective.com/vuejs/tiers/gold-sponsors/7/avatar.svg" height="60px"></a>
+<a href="https://opencollective.com/vuejs/tiers/gold-sponsors/8/website" target="_blank"><img src="https://opencollective.com/vuejs/tiers/gold-sponsors/8/avatar.svg" height="60px"></a>
+<a href="https://opencollective.com/vuejs/tiers/gold-sponsors/9/website" target="_blank"><img src="https://opencollective.com/vuejs/tiers/gold-sponsors/9/avatar.svg" height="60px"></a>
+<a href="https://opencollective.com/vuejs/tiers/gold-sponsors/10/website" target="_blank"><img src="https://opencollective.com/vuejs/tiers/gold-sponsors/10/avatar.svg" height="60px"></a>
+
+<h2 align="center">Silver via Patreon</h2>
+
+- Matt Mullenweg
+
+<h2 align="center">Bronze via Patreon</h2>
+
+<!--bronze start-->
+<table>
+  <tbody>
+    <tr>
+      <td align="center" valign="middle">
+        <a href="http://tighten.co/" target="_blank">
+          <img width="148px" src="http://i.imgur.com/T7fQYLT.png">
+        </a>
+      </td>
+      <td align="center" valign="middle">
+        <a href="https://alligator.io" target="_blank">
+          <img width="148px" src="https://alligator.io/images/alligator-logo.svg">
+        </a>
+      </td>
+      <td align="center" valign="middle">
+        <a href="https://www.accelebrate.com/" target="_blank">
+          <img width="148px" src="https://www.accelebrate.com/assets/images/accelebrate_logo@2x.png">
+        </a>
+      </td>
+      <td align="center" valign="middle">
+        <a href="https://pullstring.com" target="_blank">
+          <img width="148px" src="https://i.imgur.com/hQHW6TB.png">
+        </a>
+      </td>
+    </tr><tr></tr>
+  </tbody>
+</table>
+<!--bronze end-->
+
+<h2 align="center">Bronze via OpenCollective</h2>
+
+<a href="https://opencollective.com/vuejs/tiers/bronze-sponsors/0/website" target="_blank"><img src="https://opencollective.com/vuejs/tiers/bronze-sponsors/0/avatar.svg"></a>
+<a href="https://opencollective.com/vuejs/tiers/bronze-sponsors/1/website" target="_blank"><img src="https://opencollective.com/vuejs/tiers/bronze-sponsors/1/avatar.svg"></a>
+<a href="https://opencollective.com/vuejs/tiers/bronze-sponsors/2/website" target="_blank"><img src="https://opencollective.com/vuejs/tiers/bronze-sponsors/2/avatar.svg"></a>
+<a href="https://opencollective.com/vuejs/tiers/bronze-sponsors/3/website" target="_blank"><img src="https://opencollective.com/vuejs/tiers/bronze-sponsors/3/avatar.svg"></a>
+<a href="https://opencollective.com/vuejs/tiers/bronze-sponsors/4/website" target="_blank"><img src="https://opencollective.com/vuejs/tiers/bronze-sponsors/4/avatar.svg"></a>
+<a href="https://opencollective.com/vuejs/tiers/bronze-sponsors/5/website" target="_blank"><img src="https://opencollective.com/vuejs/tiers/bronze-sponsors/5/avatar.svg"></a>
+<a href="https://opencollective.com/vuejs/tiers/bronze-sponsors/6/website" target="_blank"><img src="https://opencollective.com/vuejs/tiers/bronze-sponsors/6/avatar.svg"></a>
+<a href="https://opencollective.com/vuejs/tiers/bronze-sponsors/7/website" target="_blank"><img src="https://opencollective.com/vuejs/tiers/bronze-sponsors/7/avatar.svg"></a>
+<a href="https://opencollective.com/vuejs/tiers/bronze-sponsors/8/website" target="_blank"><img src="https://opencollective.com/vuejs/tiers/bronze-sponsors/8/avatar.svg"></a>
+<a href="https://opencollective.com/vuejs/tiers/bronze-sponsors/9/website" target="_blank"><img src="https://opencollective.com/vuejs/tiers/bronze-sponsors/9/avatar.svg"></a>
+<a href="https://opencollective.com/vuejs/tiers/bronze-sponsors/10/website" target="_blank"><img src="https://opencollective.com/vuejs/tiers/bronze-sponsors/10/avatar.svg"></a>
+<a href="https://opencollective.com/vuejs/tiers/bronze-sponsors/11/website" target="_blank"><img src="https://opencollective.com/vuejs/tiers/bronze-sponsors/11/avatar.svg"></a>
+<a href="https://opencollective.com/vuejs/tiers/bronze-sponsors/12/website" target="_blank"><img src="https://opencollective.com/vuejs/tiers/bronze-sponsors/12/avatar.svg"></a>
+<a href="https://opencollective.com/vuejs/tiers/bronze-sponsors/13/website" target="_blank"><img src="https://opencollective.com/vuejs/tiers/bronze-sponsors/13/avatar.svg"></a>
+<a href="https://opencollective.com/vuejs/tiers/bronze-sponsors/14/website" target="_blank"><img src="https://opencollective.com/vuejs/tiers/bronze-sponsors/14/avatar.svg"></a>
+<a href="https://opencollective.com/vuejs/tiers/bronze-sponsors/15/website" target="_blank"><img src="https://opencollective.com/vuejs/tiers/bronze-sponsors/15/avatar.svg"></a>
+<a href="https://opencollective.com/vuejs/tiers/bronze-sponsors/16/website" target="_blank"><img src="https://opencollective.com/vuejs/tiers/bronze-sponsors/16/avatar.svg"></a>
+<a href="https://opencollective.com/vuejs/tiers/bronze-sponsors/17/website" target="_blank"><img src="https://opencollective.com/vuejs/tiers/bronze-sponsors/17/avatar.svg"></a>
+<a href="https://opencollective.com/vuejs/tiers/bronze-sponsors/18/website" target="_blank"><img src="https://opencollective.com/vuejs/tiers/bronze-sponsors/18/avatar.svg"></a>
+<a href="https://opencollective.com/vuejs/tiers/bronze-sponsors/19/website" target="_blank"><img src="https://opencollective.com/vuejs/tiers/bronze-sponsors/19/avatar.svg"></a>
+<a href="https://opencollective.com/vuejs/tiers/bronze-sponsors/20/website" target="_blank"><img src="https://opencollective.com/vuejs/tiers/bronze-sponsors/20/avatar.svg"></a>
+<a href="https://opencollective.com/vuejs/tiers/bronze-sponsors/21/website" target="_blank"><img src="https://opencollective.com/vuejs/tiers/bronze-sponsors/21/avatar.svg"></a>
+<a href="https://opencollective.com/vuejs/tiers/bronze-sponsors/22/website" target="_blank"><img src="https://opencollective.com/vuejs/tiers/bronze-sponsors/22/avatar.svg"></a>
+<a href="https://opencollective.com/vuejs/tiers/bronze-sponsors/23/website" target="_blank"><img src="https://opencollective.com/vuejs/tiers/bronze-sponsors/23/avatar.svg"></a>
+<a href="https://opencollective.com/vuejs/tiers/bronze-sponsors/24/website" target="_blank"><img src="https://opencollective.com/vuejs/tiers/bronze-sponsors/24/avatar.svg"></a>
+<a href="https://opencollective.com/vuejs/tiers/bronze-sponsors/25/website" target="_blank"><img src="https://opencollective.com/vuejs/tiers/bronze-sponsors/25/avatar.svg"></a>
+<a href="https://opencollective.com/vuejs/tiers/bronze-sponsors/26/website" target="_blank"><img src="https://opencollective.com/vuejs/tiers/bronze-sponsors/26/avatar.svg"></a>
+<a href="https://opencollective.com/vuejs/tiers/bronze-sponsors/27/website" target="_blank"><img src="https://opencollective.com/vuejs/tiers/bronze-sponsors/27/avatar.svg"></a>
+<a href="https://opencollective.com/vuejs/tiers/bronze-sponsors/28/website" target="_blank"><img src="https://opencollective.com/vuejs/tiers/bronze-sponsors/28/avatar.svg"></a>
+<a href="https://opencollective.com/vuejs/tiers/bronze-sponsors/29/website" target="_blank"><img src="https://opencollective.com/vuejs/tiers/bronze-sponsors/29/avatar.svg"></a>
+
+<h2 align="center">Generous Backers via Patreon ($50+)</h2>
+
+<!--50 start-->
+- Wasim Khamlichi
+- errorrik 
+- Alex Balashov
+- Konstantin Levinski
+- Samuel Smith
+- HARRI J SALOMAA
+- tjkoury 
+- Evan Leonardi
+<!--50 end-->
+
+<h2 align="center">Backers via Patreon</h2>
+
+<!--10 start-->
+- Luca Borghini
+- kazuya kawaguchi
+- Keisuke KITA
+- Jack Barham
+- Santa Cruz
+- Tom Conlon
+- Simon East
+- Henry Zhu
+- Benjamin Listwon
+- Lars Andreas Ness
+- Victor Tolbert
+- Frank Dugan III
+- Stephen Hartley
+- Wen-Tien Chang
+- Kirk Lewis
+- Karol F
+- Miljan Aleksic
+- 叶解 
+- Paul Straw
+- Jake Ingman
+- Barbara Liau
+- Isaac Sant
+- Milos Stojanovic
+- 4 
+- The Graphic Design School
+- Christian Griffith
+- Jarek Tkaczyk
+- Andrew Davis
+- Sean MacIsaac
+- Xiaojie LI
+- David Hess
+- Niannian Modisette
+- Dariusz Jastrzębski
+- Matt Jones
+- Dave Chenell
+- Cheng-Wei Chien
+- Duncan J Kenzie
+- Mike Margerum
+- Guy Gavergun
+- Edithvale 
+- Intevation GmbH
+- Luiz Eduardo  Tanure Bacelar
+- Chengzhi Yin
+- Zoran Knezevic
+- James Simpson
+- Pierre Vanhulst
+- Vincent Gabriel
+- Chris Anderson
+- Jon Hobbs-Smith
+- Akiho Nagao
+- Asaf Yishai
+- Estebe Anthony
+- Haim Yulzari
+- David McGuigan
+- Jeremy Tan
+- Jim Raden
+- Fille Åström
+- Nicholas Reid
+- Tyler Scott
+- Thong Yong Jun
+- Bryan Gruneberg
+- Roman Kuba
+- Familiar Studio
+- Matias Verdier
+- Jamie McElwain
+- Vivekanandhan Natarajan
+- Rafael Belvederese
+- Mickaël Andrieu
+- Guilherme S L de Souza
+- Rob Yedlin
+- Daniel Waghorn
+- Chih-Hsuan, Fan
+- Jordan Oroshiba
+- Brian Jorden
+- Cliff Hess
+- Joe Ray Gregory
+- Johnny Eshan
+- Orney Enrique martinez Said
+- Tom Striker
+- Oskar Lindgren
+- RADD Creative
+- Maegan Wilson
+- Rua Cura D'ars
+- Richard Simpson
+- Charles McKeever
+- Alok Pant
+- Jessie Hernandez
+- Eric Fong
+- Aparajita Fishman
+<!--10 end-->
+
+<h2 align="center">Backers via OpenCollective</h2>
+
+<a href="https://opencollective.com/vuejs#backers" target="_blank"><img src="https://opencollective.com/vuejs/backers.svg?width=890"></a>
diff --git a/advancedcontentfilter/vendor/asset/vue/LICENSE b/advancedcontentfilter/vendor/asset/vue/LICENSE
new file mode 100644 (file)
index 0000000..b65dd9e
--- /dev/null
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2013-present, Yuxi (Evan) You
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/advancedcontentfilter/vendor/asset/vue/README.md b/advancedcontentfilter/vendor/asset/vue/README.md
new file mode 100644 (file)
index 0000000..c89a48c
--- /dev/null
@@ -0,0 +1,264 @@
+<p align="center"><a href="https://vuejs.org" target="_blank" rel="noopener noreferrer"><img width="100" src="https://vuejs.org/images/logo.png" alt="Vue logo"></a></p>
+
+<p align="center">
+  <a href="https://circleci.com/gh/vuejs/vue/tree/dev"><img src="https://img.shields.io/circleci/project/vuejs/vue/dev.svg" alt="Build Status"></a>
+  <a href="https://codecov.io/github/vuejs/vue?branch=dev"><img src="https://img.shields.io/codecov/c/github/vuejs/vue/dev.svg" alt="Coverage Status"></a>
+  <a href="https://npmcharts.com/compare/vue?minimal=true"><img src="https://img.shields.io/npm/dm/vue.svg" alt="Downloads"></a>
+  <a href="https://www.npmjs.com/package/vue"><img src="https://img.shields.io/npm/v/vue.svg" alt="Version"></a>
+  <a href="https://www.npmjs.com/package/vue"><img src="https://img.shields.io/npm/l/vue.svg" alt="License"></a>
+  <a href="https://chat.vuejs.org/"><img src="https://img.shields.io/badge/chat-on%20discord-7289da.svg" alt="Chat"></a>
+  <br>
+  <a href="https://saucelabs.com/u/vuejs"><img src="https://saucelabs.com/browser-matrix/vuejs.svg" alt="Sauce Test Status"></a>
+</p>
+
+<h2 align="center">Supporting Vue.js</h2>
+
+Vue.js is an MIT-licensed open source project. It's an independent project with its ongoing development made possible entirely thanks to the support by these awesome [backers](https://github.com/vuejs/vue/blob/dev/BACKERS.md). If you'd like to join them, please consider:
+
+- [Become a backer or sponsor on Patreon](https://www.patreon.com/evanyou).
+- [Become a backer or sponsor on Open Collective](https://opencollective.com/vuejs).
+- [One-time donation via PayPal or crypto-currencies.](https://vuejs.org/support-vuejs/#One-time-Donations)
+
+#### What's the difference between Patreon and OpenCollective?
+
+Funds donated via Patreon go directly to support Evan You's full-time work on Vue.js. Funds donated via OpenCollective are managed with transparent expenses and will be used for compensating work and expenses for core team members or sponsoring community events. Your name/logo will receive proper recognition and exposure by donating on either platform.
+
+<h3 align="center">Special Sponsors</h3>
+<!--special start-->
+<table>
+  <tbody>
+    <tr>
+      <td align="center" valign="middle">
+        <a href="https://stdlib.com" target="_blank" rel="noopener noreferrer">
+          <img width="222px" src="https://raw.githubusercontent.com/vuejs/vuejs.org/master/themes/vue/source/images/stdlib.png">
+        </a>
+      </td>
+      <td align="center" valign="middle">
+        <a href="https://www.bitsrc.io/?utm_source=vue&utm_medium=vue&utm_campaign=vue&utm_term=vue&utm_content=vue" target="_blank" rel="noopener noreferrer">
+          <img height="90px" src="https://raw.githubusercontent.com/vuejs/vuejs.org/master/themes/vue/source/images/bit-wide.png">
+        </a>
+      </td>
+      <td align="center" valign="middle">
+        <a href="https://xiaozhuanlan.com" target="_blank" rel="noopener noreferrer">
+          <img width="222px" src="https://raw.githubusercontent.com/vuejs/cn.vuejs.org/master/themes/vue/source/images/xiaozhuanlan.png">
+        </a>
+      </td>
+    </tr><tr></tr>
+  </tbody>
+</table>
+<!--special end-->
+
+<h3 align="center">Sponsors via Patreon</h3>
+
+<h4 align="center">Platinum</h4>
+
+<!--platinum start-->
+<table>
+  <tbody>
+    <tr>
+      <td align="center" valign="middle">
+        <a href="http://tooltwist.com/" target="_blank" rel="noopener noreferrer">
+          <img width="222px" src="https://raw.githubusercontent.com/vuejs/vuejs.org/master/themes/vue/source/images/tooltwist.png">
+        </a>
+      </td>
+      <td align="center" valign="middle">
+        <a href="https://vueschool.io/?utm_source=Vuejs.org&utm_medium=Banner&utm_campaign=Sponsored%20Banner&utm_content=V1" target="_blank" rel="noopener noreferrer">
+          <img width="222px" src="https://raw.githubusercontent.com/vuejs/vuejs.org/master/themes/vue/source/images/vueschool.png">
+        </a>
+      </td>
+      <td align="center" valign="middle">
+        <a href="https://www.datacamp.com/careers?utm_source=vuejs&utm_medium=sidebar" target="_blank" rel="noopener noreferrer">
+          <img width="222px" src="https://raw.githubusercontent.com/vuejs/vuejs.org/master/themes/vue/source/images/datacamp.png">
+        </a>
+      </td>
+    </tr><tr></tr>
+  </tbody>
+</table>
+<!--platinum end-->
+
+<h4 align="center">Gold</h4>
+
+<!--gold start-->
+<table>
+  <tbody>
+    <tr>
+      <td align="center" valign="middle">
+        <a href="https://laravel.com" target="_blank" rel="noopener noreferrer">
+          <img width="148px" src="https://raw.githubusercontent.com/vuejs/vuejs.org/master/themes/vue/source/images/laravel.png">
+        </a>
+      </td>
+      <td align="center" valign="middle">
+        <a href="https://htmlburger.com" target="_blank" rel="noopener noreferrer">
+          <img width="148px" src="https://raw.githubusercontent.com/vuejs/vuejs.org/master/themes/vue/source/images/htmlburger.png">
+        </a>
+      </td>
+      <td align="center" valign="middle">
+        <a href="https://chaitin.cn/en/" target="_blank" rel="noopener noreferrer">
+          <img width="148px" src="https://raw.githubusercontent.com/vuejs/vuejs.org/master/themes/vue/source/images/chaitin.png">
+        </a>
+      </td>
+      <td align="center" valign="middle">
+        <a href="https://anymod.com" target="_blank" rel="noopener noreferrer">
+          <img width="148px" src="https://raw.githubusercontent.com/vuejs/vuejs.org/master/themes/vue/source/images/anymod.png">
+        </a>
+      </td>
+      <td align="center" valign="middle">
+        <a href="https://www.frontenddeveloperlove.com/" target="_blank" rel="noopener noreferrer">
+          <img width="148px" src="https://raw.githubusercontent.com/vuejs/vuejs.org/master/themes/vue/source/images/frontend-love.png">
+        </a>
+      </td>
+      <td align="center" valign="middle">
+        <a href="https://onsen.io/vue/" target="_blank" rel="noopener noreferrer">
+          <img width="148px" src="https://raw.githubusercontent.com/vuejs/vuejs.org/master/themes/vue/source/images/onsen-ui.png">
+        </a>
+      </td>
+    </tr><tr></tr>
+    <tr>
+      <td align="center" valign="middle">
+        <a href="https://vuetifyjs.com" target="_blank" rel="noopener noreferrer">
+          <img width="148px" src="https://raw.githubusercontent.com/vuejs/vuejs.org/master/themes/vue/source/images/vuetify.png">
+        </a>
+      </td>
+      <td align="center" valign="middle">
+        <a href="https://neds.com.au/" target="_blank" rel="noopener noreferrer">
+          <img width="148px" src="https://raw.githubusercontent.com/vuejs/vuejs.org/master/themes/vue/source/images/neds.png">
+        </a>
+      </td>
+      <td align="center" valign="middle">
+        <a href="https://hackr.io/tutorials/learn-vue-js" target="_blank" rel="noopener noreferrer">
+          <img width="148px" src="https://raw.githubusercontent.com/vuejs/vuejs.org/master/themes/vue/source/images/hackr-io.png">
+        </a>
+      </td>
+      <td align="center" valign="middle">
+        <a href="https://icons8.com/" target="_blank" rel="noopener noreferrer">
+          <img width="148px" src="https://raw.githubusercontent.com/vuejs/vuejs.org/master/themes/vue/source/images/icons8.png">
+        </a>
+      </td>
+      <td align="center" valign="middle">
+        <a href="https://vuejobs.com/?ref=vuejs" target="_blank" rel="noopener noreferrer">
+          <img width="148px" src="https://raw.githubusercontent.com/vuejs/vuejs.org/master/themes/vue/source/images/vuejobs.png">
+        </a>
+      </td>
+      <td align="center" valign="middle">
+        <a href="https://leanpub.com/vuejs2" target="_blank" rel="noopener noreferrer">
+          <img width="148px" src="https://raw.githubusercontent.com/vuejs/vuejs.org/master/themes/vue/source/images/tmvuejs2.png">
+        </a>
+      </td>
+    </tr><tr></tr>
+    <tr>
+      <td align="center" valign="middle">
+        <a href="https://www.bmqb.com/jobs" target="_blank" rel="noopener noreferrer">
+          <img width="148px" src="https://raw.githubusercontent.com/vuejs/vuejs.org/master/themes/vue/source/images/bmqb.png">
+        </a>
+      </td>
+      <td align="center" valign="middle">
+        <a href="https://codepilot.ai" target="_blank" rel="noopener noreferrer">
+          <img width="148px" src="https://raw.githubusercontent.com/vuejs/vuejs.org/master/themes/vue/source/images/codepilot.png">
+        </a>
+      </td>
+    </tr><tr></tr>
+  </tbody>
+</table>
+<!--gold end-->
+
+<h3 align="center">Sponsors via <a href="https://opencollective.com/vuejs">Open Collective</a></h3>
+
+<h4 align="center">Platinum</h4>
+
+<a href="https://opencollective.com/vuejs/tiers/platinum-sponsors/0/website" target="_blank" rel="noopener noreferrer"><img src="https://opencollective.com/vuejs/tiers/platinum-sponsors/0/avatar.svg"></a>
+<a href="https://opencollective.com/vuejs/tiers/platinum-sponsors/1/website" target="_blank" rel="noopener noreferrer"><img src="https://opencollective.com/vuejs/tiers/platinum-sponsors/1/avatar.svg"></a>
+
+<h4 align="center">Gold</h4>
+
+<a href="https://opencollective.com/vuejs/tiers/gold-sponsors/0/website" target="_blank" rel="noopener noreferrer"><img src="https://opencollective.com/vuejs/tiers/gold-sponsors/0/avatar.svg" height="60px"></a>
+<a href="https://opencollective.com/vuejs/tiers/gold-sponsors/1/website" target="_blank" rel="noopener noreferrer"><img src="https://opencollective.com/vuejs/tiers/gold-sponsors/1/avatar.svg" height="60px"></a>
+<a href="https://opencollective.com/vuejs/tiers/gold-sponsors/2/website" target="_blank" rel="noopener noreferrer"><img src="https://opencollective.com/vuejs/tiers/gold-sponsors/2/avatar.svg" height="60px"></a>
+<a href="https://opencollective.com/vuejs/tiers/gold-sponsors/3/website" target="_blank" rel="noopener noreferrer"><img src="https://opencollective.com/vuejs/tiers/gold-sponsors/3/avatar.svg" height="60px"></a>
+<a href="https://opencollective.com/vuejs/tiers/gold-sponsors/4/website" target="_blank" rel="noopener noreferrer"><img src="https://opencollective.com/vuejs/tiers/gold-sponsors/4/avatar.svg" height="60px"></a>
+
+---
+
+## Introduction
+
+Vue (pronounced `/vjuː/`, like view) is a **progressive framework** for building user interfaces. It is designed from the ground up to be incrementally adoptable, and can easily scale between a library and a framework depending on different use cases. It consists of an approachable core library that focuses on the view layer only, and an ecosystem of supporting libraries that helps you tackle complexity in large Single-Page Applications.
+
+#### Browser Compatibility
+
+Vue.js supports all browsers that are [ES5-compliant](http://kangax.github.io/compat-table/es5/) (IE8 and below are not supported).
+
+## Ecosystem
+
+| Project | Status | Description |
+|---------|--------|-------------|
+| [vue-router]          | [![vue-router-status]][vue-router-package] | Single-page application routing |
+| [vuex]                | [![vuex-status]][vuex-package] | Large-scale state management |
+| [vue-cli]             | [![vue-cli-status]][vue-cli-package] | Project scaffolding |
+| [vue-loader]          | [![vue-loader-status]][vue-loader-package] | Single File Component (`*.vue` file) loader for webpack |
+| [vue-server-renderer] | [![vue-server-renderer-status]][vue-server-renderer-package] | Server-side rendering support |
+| [vue-class-component] | [![vue-class-component-status]][vue-class-component-package] | TypeScript decorator for a class-based API |
+| [vue-rx]              | [![vue-rx-status]][vue-rx-package] | RxJS integration |
+| [vue-devtools]        | [![vue-devtools-status]][vue-devtools-package] | Browser DevTools extension |
+
+[vue-router]: https://github.com/vuejs/vue-router
+[vuex]: https://github.com/vuejs/vuex
+[vue-cli]: https://github.com/vuejs/vue-cli
+[vue-loader]: https://github.com/vuejs/vue-loader
+[vue-server-renderer]: https://github.com/vuejs/vue/tree/dev/packages/vue-server-renderer
+[vue-class-component]: https://github.com/vuejs/vue-class-component
+[vue-rx]: https://github.com/vuejs/vue-rx
+[vue-devtools]:  https://github.com/vuejs/vue-devtools
+
+[vue-router-status]: https://img.shields.io/npm/v/vue-router.svg
+[vuex-status]: https://img.shields.io/npm/v/vuex.svg
+[vue-cli-status]: https://img.shields.io/npm/v/vue-cli.svg
+[vue-loader-status]: https://img.shields.io/npm/v/vue-loader.svg
+[vue-server-renderer-status]: https://img.shields.io/npm/v/vue-server-renderer.svg
+[vue-class-component-status]: https://img.shields.io/npm/v/vue-class-component.svg
+[vue-rx-status]: https://img.shields.io/npm/v/vue-rx.svg
+[vue-devtools-status]: https://img.shields.io/chrome-web-store/v/nhdogjmejiglipccpnnnanhbledajbpd.svg
+
+[vue-router-package]: https://npmjs.com/package/vue-router
+[vuex-package]: https://npmjs.com/package/vuex
+[vue-cli-package]: https://npmjs.com/package/vue-cli
+[vue-loader-package]: https://npmjs.com/package/vue-loader
+[vue-server-renderer-package]: https://npmjs.com/package/vue-server-renderer
+[vue-class-component-package]: https://npmjs.com/package/vue-class-component
+[vue-rx-package]: https://npmjs.com/package/vue-rx
+[vue-devtools-package]: https://chrome.google.com/webstore/detail/vuejs-devtools/nhdogjmejiglipccpnnnanhbledajbpd
+
+## Documentation
+
+To check out [live examples](https://vuejs.org/v2/examples/) and docs, visit [vuejs.org](https://vuejs.org).
+
+## Questions
+
+For questions and support please use the [the official forum](http://forum.vuejs.org) or [community chat](https://chat.vuejs.org/). The issue list of this repo is **exclusively** for bug reports and feature requests.
+
+## Issues
+
+Please make sure to read the [Issue Reporting Checklist](https://github.com/vuejs/vue/blob/dev/.github/CONTRIBUTING.md#issue-reporting-guidelines) before opening an issue. Issues not conforming to the guidelines may be closed immediately.
+
+## Changelog
+
+Detailed changes for each release are documented in the [release notes](https://github.com/vuejs/vue/releases).
+
+## Stay In Touch
+
+- [Twitter](https://twitter.com/vuejs)
+- [Blog](https://medium.com/the-vue-point)
+- [Job Board](https://vuejobs.com/?ref=vuejs)
+
+## Contribution
+
+Please make sure to read the [Contributing Guide](https://github.com/vuejs/vue/blob/dev/.github/CONTRIBUTING.md) before making a pull request. If you have a Vue-related project/component/tool, add it with a pull request to [this curated list](https://github.com/vuejs/awesome-vue)!
+
+Thank you to all the people who already contributed to Vue!
+
+<a href="https://github.com/vuejs/vue/graphs/contributors"><img src="https://opencollective.com/vuejs/contributors.svg?width=890" /></a>
+
+
+## License
+
+[MIT](http://opensource.org/licenses/MIT)
+
+Copyright (c) 2013-present, Yuxi (Evan) You
diff --git a/advancedcontentfilter/vendor/asset/vue/benchmarks/big-table/demo.css b/advancedcontentfilter/vendor/asset/vue/benchmarks/big-table/demo.css
new file mode 100644 (file)
index 0000000..a83742c
--- /dev/null
@@ -0,0 +1,15 @@
+form {
+  margin-bottom: 15px;
+}
+
+td.hidden {
+  color: #ccc;
+}
+
+table.filtered td.item {
+  background-color: #FFFFBF;
+}
+
+table.filtered td.item.hidden {
+  background-color: transparent;
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/benchmarks/big-table/index.html b/advancedcontentfilter/vendor/asset/vue/benchmarks/big-table/index.html
new file mode 100644 (file)
index 0000000..1567546
--- /dev/null
@@ -0,0 +1,163 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <title></title>
+    <script src="../../dist/vue.min.js"></script>
+    <link rel="stylesheet" href="style.css">
+    <link rel="stylesheet" href="demo.css">
+  </head>
+  <body>
+    <div id="el">
+      <h1>Rendering Dynamic Big Table</h1>
+      <p>Reference: <a href="http://insin.github.io/ui-lib-samples/large-datasets/index.html">insin/ui-lib-samples/large-datasets</a></p>
+
+      <p>
+        <span>{{ rows }} x {{ cols }}, {{ optimized ? 'with' : 'without' }} optimization. {{ msg }}</span>
+      </p>
+
+      <p>
+        <button v-if="optimized" @click="loadBase">Disable optimization</button>
+        <button v-else @click="loadOptimized">Enable optimization (Object.freeze)</button>
+        <button @click="unmount">Unmount</button>
+        <button @click="rerender">Rerender with fresh data</button>
+      </p>
+
+      <form>
+        <strong>Filter Data</strong>:
+        <input type="text" v-model="filter">
+
+        <!--
+          If the user is filtering the data, we want to offer some insight into
+          the breadth of the filtering.
+        -->
+        <span v-if="filter">
+          &mdash;
+          Filtering <strong>{{ filter }}</strong>
+          over {{ dataPoints }} data points,
+          {{ visibleCount() }} found.
+        </span>
+
+      </form>
+
+      <table width="100%" cellspacing="2" :class="{ filtered: filter }">
+        <tr v-for="row in grid">
+          <th>{{ row.id }}</th>
+          <td v-for="item in row.items"
+            class="item"
+            :class="{ hidden: !matches(item) }">
+            {{ item.value }}
+          </td>
+        </tr>
+      </table>
+    </div>
+
+    <script>
+    var ROWS = 1000
+    var COLS = 10
+    var OPTIMIZED = window.location.hash === '#optimized'
+
+    window.onhashchange = function () {
+      window.location.reload()
+    }
+
+    function generateGrid( rowCount, columnCount ) {
+      var valuePoints = [
+        "Daenerys", "Jon", "Sansa", "Arya", "Stannis", "Gregor", "Tyrion",
+        "Theon", "Joffrey", "Ramsay", "Cersei", "Bran", "Margaery",
+        "Melisandre", "Daario", "Jamie", "Eddard", "Myrcella", "Robb",
+        "Jorah", "Petyr", "Tommen", "Sandor", "Oberyn", "Drogo", "Ygritte"
+      ]
+      var valueIndex = 0
+      var grid = []
+
+      for ( var r = 0; r < rowCount; r++ ) {
+        var row = {
+          id: r,
+          items: []
+        }
+        for ( var c = 0; c < columnCount; c++ ) {
+          row.items.push({
+            id: ( r + "-" + c ),
+            value: valuePoints[ valueIndex ]
+          })
+          if ( ++valueIndex >= valuePoints.length ) {
+            valueIndex = 0
+          }
+        }
+        grid.push(row)
+      }
+
+      return OPTIMIZED ? Object.freeze(grid) : grid
+    }
+
+    var grid = generateGrid(ROWS, COLS)
+    var s = window.performance.now()
+    console.profile('a')
+    var vm = new Vue({
+
+      el: '#el',
+
+      data: {
+        cols: COLS,
+        rows: ROWS,
+        optimized: OPTIMIZED,
+        msg: 'loading...',
+        grid: grid,
+        dataPoints: grid.length * grid[0].items.length,
+        filter: ''
+      },
+
+      methods: {
+        matches: function (item) {
+          return item.value.toLowerCase().indexOf(this.filter.toLowerCase()) > -1
+        },
+        visibleCount: function () {
+          var count = 0
+          var grid = this.grid
+          for (var i = 0, l = grid.length; i < l; i++) {
+            var row = grid[i].items
+            for (var j = 0, k = row.length; j < k; j++) {
+              var item = row[j]
+              var matched = !this.filter || this.matches(item)
+              if (matched) {
+                count++
+              }
+            }
+          }
+          return count
+        },
+        loadBase: function () {
+          window.location.hash = ''
+        },
+        loadOptimized: function () {
+          window.location.hash = '#optimized'
+        },
+        unmount: function () {
+          console.profile('unmount')
+          var s = window.performance.now()
+          this.grid = []
+          setTimeout(function () {
+            vm.msg = 'umount took: ' + (window.performance.now() - s).toFixed(2) + 'ms'
+            console.profileEnd('unmount')
+          }, 0)
+        },
+        rerender: function () {
+          var grid = generateGrid(1000, 10)
+          var s = window.performance.now()
+          console.profile('rerender')
+          this.grid = grid
+          setTimeout(function () {
+            vm.msg = 'rerender took: ' + (window.performance.now() - s).toFixed(2) + 'ms'
+            console.profileEnd('rerender')
+          }, 0)
+        }
+      }
+    })
+    console.profileEnd('a')
+    setTimeout(function () {
+      vm.msg = 'initial render took: ' + (window.performance.now() - s).toFixed(2) + 'ms'
+    }, 0)
+    </script>
+  </body>
+</html>
diff --git a/advancedcontentfilter/vendor/asset/vue/benchmarks/big-table/style.css b/advancedcontentfilter/vendor/asset/vue/benchmarks/big-table/style.css
new file mode 100644 (file)
index 0000000..d58a918
--- /dev/null
@@ -0,0 +1,553 @@
+@font-face {
+  font-family: octicons-anchor;
+  src: url(data:font/woff;charset=utf-8;base64,d09GRgABAAAAAAYcAA0AAAAACjQAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAABMAAAABwAAAAca8vGTk9TLzIAAAFMAAAARAAAAFZG1VHVY21hcAAAAZAAAAA+AAABQgAP9AdjdnQgAAAB0AAAAAQAAAAEACICiGdhc3AAAAHUAAAACAAAAAj//wADZ2x5ZgAAAdwAAADRAAABEKyikaNoZWFkAAACsAAAAC0AAAA2AtXoA2hoZWEAAALgAAAAHAAAACQHngNFaG10eAAAAvwAAAAQAAAAEAwAACJsb2NhAAADDAAAAAoAAAAKALIAVG1heHAAAAMYAAAAHwAAACABEAB2bmFtZQAAAzgAAALBAAAFu3I9x/Nwb3N0AAAF/AAAAB0AAAAvaoFvbwAAAAEAAAAAzBdyYwAAAADP2IQvAAAAAM/bz7t4nGNgZGFgnMDAysDB1Ml0hoGBoR9CM75mMGLkYGBgYmBlZsAKAtJcUxgcPsR8iGF2+O/AEMPsznAYKMwIkgMA5REMOXicY2BgYGaAYBkGRgYQsAHyGMF8FgYFIM0ChED+h5j//yEk/3KoSgZGNgYYk4GRCUgwMaACRoZhDwCs7QgGAAAAIgKIAAAAAf//AAJ4nHWMMQrCQBBF/0zWrCCIKUQsTDCL2EXMohYGSSmorScInsRGL2DOYJe0Ntp7BK+gJ1BxF1stZvjz/v8DRghQzEc4kIgKwiAppcA9LtzKLSkdNhKFY3HF4lK69ExKslx7Xa+vPRVS43G98vG1DnkDMIBUgFN0MDXflU8tbaZOUkXUH0+U27RoRpOIyCKjbMCVejwypzJJG4jIwb43rfl6wbwanocrJm9XFYfskuVC5K/TPyczNU7b84CXcbxks1Un6H6tLH9vf2LRnn8Ax7A5WQAAAHicY2BkYGAA4teL1+yI57f5ysDNwgAC529f0kOmWRiYVgEpDgYmEA8AUzEKsQAAAHicY2BkYGB2+O/AEMPCAAJAkpEBFbAAADgKAe0EAAAiAAAAAAQAAAAEAAAAAAAAKgAqACoAiAAAeJxjYGRgYGBhsGFgYgABEMkFhAwM/xn0QAIAD6YBhwB4nI1Ty07cMBS9QwKlQapQW3VXySvEqDCZGbGaHULiIQ1FKgjWMxknMfLEke2A+IJu+wntrt/QbVf9gG75jK577Lg8K1qQPCfnnnt8fX1NRC/pmjrk/zprC+8D7tBy9DHgBXoWfQ44Av8t4Bj4Z8CLtBL9CniJluPXASf0Lm4CXqFX8Q84dOLnMB17N4c7tBo1AS/Qi+hTwBH4rwHHwN8DXqQ30XXAS7QaLwSc0Gn8NuAVWou/gFmnjLrEaEh9GmDdDGgL3B4JsrRPDU2hTOiMSuJUIdKQQayiAth69r6akSSFqIJuA19TrzCIaY8sIoxyrNIrL//pw7A2iMygkX5vDj+G+kuoLdX4GlGK/8Lnlz6/h9MpmoO9rafrz7ILXEHHaAx95s9lsI7AHNMBWEZHULnfAXwG9/ZqdzLI08iuwRloXE8kfhXYAvE23+23DU3t626rbs8/8adv+9DWknsHp3E17oCf+Z48rvEQNZ78paYM38qfk3v/u3l3u3GXN2Dmvmvpf1Srwk3pB/VSsp512bA/GG5i2WJ7wu430yQ5K3nFGiOqgtmSB5pJVSizwaacmUZzZhXLlZTq8qGGFY2YcSkqbth6aW1tRmlaCFs2016m5qn36SbJrqosG4uMV4aP2PHBmB3tjtmgN2izkGQyLWprekbIntJFing32a5rKWCN/SdSoga45EJykyQ7asZvHQ8PTm6cslIpwyeyjbVltNikc2HTR7YKh9LBl9DADC0U/jLcBZDKrMhUBfQBvXRzLtFtjU9eNHKin0x5InTqb8lNpfKv1s1xHzTXRqgKzek/mb7nB8RZTCDhGEX3kK/8Q75AmUM/eLkfA+0Hi908Kx4eNsMgudg5GLdRD7a84npi+YxNr5i5KIbW5izXas7cHXIMAau1OueZhfj+cOcP3P8MNIWLyYOBuxL6DRylJ4cAAAB4nGNgYoAALjDJyIAOWMCiTIxMLDmZedkABtIBygAAAA==) format('woff');
+}
+
+body  {
+  -webkit-text-size-adjust: 100%;
+  -ms-text-size-adjust: 100%;
+  text-size-adjust: 100%;
+  color: #333;
+  font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif;
+  font-size: 16px;
+  line-height: 1.6;
+  word-wrap: break-word;
+  padding: 1em;
+}
+
+a {
+  background-color: transparent;
+}
+
+a:active,
+a:hover {
+  outline: 0;
+}
+
+strong {
+  font-weight: bold;
+}
+
+h1 {
+  font-size: 2em;
+  margin: 0.67em 0;
+}
+
+img {
+  border: 0;
+}
+
+hr {
+  box-sizing: content-box;
+  height: 0;
+}
+
+pre {
+  overflow: auto;
+}
+
+code,
+kbd,
+pre {
+  font-family: monospace, monospace;
+  font-size: 1em;
+}
+
+input {
+  color: inherit;
+  font: inherit;
+  margin: 0;
+}
+
+html input[disabled] {
+  cursor: default;
+}
+
+input {
+  line-height: normal;
+}
+
+input[type="checkbox"] {
+  box-sizing: border-box;
+  padding: 0;
+}
+
+table {
+  border-collapse: collapse;
+  border-spacing: 0;
+}
+
+td,
+th {
+  padding: 0;
+}
+
+* {
+  box-sizing: border-box;
+}
+
+input {
+  font: 13px/1.4 Helvetica, arial, nimbussansl, liberationsans, freesans, clean, sans-serif, "Segoe UI Emoji", "Segoe UI Symbol";
+}
+
+a {
+  color: #4078c0;
+  text-decoration: none;
+}
+
+a:hover,
+a:active {
+  text-decoration: underline;
+}
+
+hr {
+  height: 0;
+  margin: 15px 0;
+  overflow: hidden;
+  background: transparent;
+  border: 0;
+  border-bottom: 1px solid #ddd;
+}
+
+hr:before {
+  display: table;
+  content: "";
+}
+
+hr:after {
+  display: table;
+  clear: both;
+  content: "";
+}
+
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+  margin-top: 15px;
+  margin-bottom: 15px;
+  line-height: 1.1;
+}
+
+h1 {
+  font-size: 30px;
+}
+h1:first-child {
+  margin-top: 0;
+}
+
+h2 {
+  font-size: 21px;
+}
+
+h3 {
+  font-size: 16px;
+}
+
+h4 {
+  font-size: 14px;
+}
+
+h5 {
+  font-size: 12px;
+}
+
+h6 {
+  font-size: 11px;
+}
+
+blockquote {
+  margin: 0;
+}
+
+ul,
+ol {
+  padding: 0;
+  margin-top: 0;
+  margin-bottom: 0;
+}
+
+ol ol,
+ul ol {
+  list-style-type: lower-roman;
+}
+
+ul ul ol,
+ul ol ol,
+ol ul ol,
+ol ol ol {
+  list-style-type: lower-alpha;
+}
+
+dd {
+  margin-left: 0;
+}
+
+code {
+  font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace;
+  font-size: 12px;
+}
+
+pre {
+  margin-top: 0;
+  margin-bottom: 0;
+  font: 12px Consolas, "Liberation Mono", Menlo, Courier, monospace;
+}
+
+.octicon {
+  font: normal normal normal 16px/1 octicons-anchor;
+  display: inline-block;
+  text-decoration: none;
+  text-rendering: auto;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
+
+.octicon-link:before {
+  content: '\f05c';
+}
+
+.markdown-body>*:first-child {
+  margin-top: 0 !important;
+}
+
+.markdown-body>*:last-child {
+  margin-bottom: 0 !important;
+}
+
+a:not([href]) {
+  cursor: pointer;
+  text-decoration: none;
+}
+
+.anchor {
+  position: absolute;
+  top: 0;
+  left: 0;
+  display: block;
+  padding-right: 6px;
+  padding-left: 30px;
+  margin-left: -30px;
+}
+
+.anchor:focus {
+  outline: none;
+}
+
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+  position: relative;
+  margin-top: 1em;
+  margin-bottom: 16px;
+  font-weight: bold;
+  line-height: 1.4;
+}
+
+h1 .octicon-link,
+h2 .octicon-link,
+h3 .octicon-link,
+h4 .octicon-link,
+h5 .octicon-link,
+h6 .octicon-link {
+  display: none;
+  color: #000;
+  vertical-align: middle;
+}
+
+h1:hover .anchor,
+h2:hover .anchor,
+h3:hover .anchor,
+h4:hover .anchor,
+h5:hover .anchor,
+h6:hover .anchor {
+  padding-left: 8px;
+  margin-left: -30px;
+  text-decoration: none;
+}
+
+h1:hover .anchor .octicon-link,
+h2:hover .anchor .octicon-link,
+h3:hover .anchor .octicon-link,
+h4:hover .anchor .octicon-link,
+h5:hover .anchor .octicon-link,
+h6:hover .anchor .octicon-link {
+  display: inline-block;
+}
+
+h1 {
+  padding-bottom: 0.3em;
+  font-size: 2.25em;
+  line-height: 1.2;
+  border-bottom: 1px solid #eee;
+}
+
+h1 .anchor {
+  line-height: 1;
+}
+
+h2 {
+  padding-bottom: 0.3em;
+  font-size: 1.75em;
+  line-height: 1.225;
+  border-bottom: 1px solid #eee;
+}
+
+h2 .anchor {
+  line-height: 1;
+}
+
+h3 {
+  font-size: 1.5em;
+  line-height: 1.43;
+}
+
+h3 .anchor {
+  line-height: 1.2;
+}
+
+h4 {
+  font-size: 1.25em;
+}
+
+h4 .anchor {
+  line-height: 1.2;
+}
+
+h5 {
+  font-size: 1em;
+}
+
+h5 .anchor {
+  line-height: 1.1;
+}
+
+h6 {
+  font-size: 1em;
+  color: #777;
+}
+
+h6 .anchor {
+  line-height: 1.1;
+}
+
+p,
+blockquote,
+ul,
+ol,
+dl,
+table,
+pre {
+  margin-top: 0;
+  margin-bottom: 16px;
+}
+
+hr {
+  height: 4px;
+  padding: 0;
+  margin: 16px 0;
+  background-color: #e7e7e7;
+  border: 0 none;
+}
+
+ul,
+ol {
+  padding-left: 2em;
+}
+
+ul ul,
+ul ol,
+ol ol,
+ol ul {
+  margin-top: 0;
+  margin-bottom: 0;
+}
+
+li>p {
+  margin-top: 16px;
+}
+
+dl {
+  padding: 0;
+}
+
+dl dt {
+  padding: 0;
+  margin-top: 16px;
+  font-size: 1em;
+  font-style: italic;
+  font-weight: bold;
+}
+
+dl dd {
+  padding: 0 16px;
+  margin-bottom: 16px;
+}
+
+blockquote {
+  padding: 0 15px;
+  color: #777;
+  border-left: 4px solid #ddd;
+}
+
+blockquote>:first-child {
+  margin-top: 0;
+}
+
+blockquote>:last-child {
+  margin-bottom: 0;
+}
+
+table {
+  display: block;
+  width: 100%;
+  overflow: auto;
+  word-break: normal;
+  word-break: keep-all;
+}
+
+table th {
+  font-weight: bold;
+}
+
+table th,
+table td {
+  padding: 6px 13px;
+  border: 1px solid #ddd;
+}
+
+table tr {
+  background-color: #fff;
+  border-top: 1px solid #ccc;
+}
+
+table tr:nth-child(2n) {
+  background-color: #f8f8f8;
+}
+
+img {
+  max-width: 100%;
+  box-sizing: border-box;
+}
+
+code {
+  padding: 0;
+  padding-top: 0.2em;
+  padding-bottom: 0.2em;
+  margin: 0;
+  font-size: 85%;
+  background-color: rgba(0,0,0,0.04);
+  border-radius: 3px;
+}
+
+code:before,
+code:after {
+  letter-spacing: -0.2em;
+  content: "\00a0";
+}
+
+pre>code {
+  padding: 0;
+  margin: 0;
+  font-size: 100%;
+  word-break: normal;
+  white-space: pre;
+  background: transparent;
+  border: 0;
+}
+
+.highlight {
+  margin-bottom: 16px;
+}
+
+.highlight pre,
+pre {
+  padding: 16px;
+  overflow: auto;
+  font-size: 85%;
+  line-height: 1.45;
+  background-color: #f7f7f7;
+  border-radius: 3px;
+}
+
+.highlight pre {
+  margin-bottom: 0;
+  word-break: normal;
+}
+
+pre {
+  word-wrap: normal;
+}
+
+pre code {
+  display: inline;
+  max-width: initial;
+  padding: 0;
+  margin: 0;
+  overflow: initial;
+  line-height: inherit;
+  word-wrap: normal;
+  background-color: transparent;
+  border: 0;
+}
+
+pre code:before,
+pre code:after {
+  content: normal;
+}
+
+kbd {
+  display: inline-block;
+  padding: 3px 5px;
+  font-size: 11px;
+  line-height: 10px;
+  color: #555;
+  vertical-align: middle;
+  background-color: #fcfcfc;
+  border: solid 1px #ccc;
+  border-bottom-color: #bbb;
+  border-radius: 3px;
+  box-shadow: inset 0 -1px 0 #bbb;
+}
+
+kbd {
+  display: inline-block;
+  padding: 3px 5px;
+  font: 11px Consolas, "Liberation Mono", Menlo, Courier, monospace;
+  line-height: 10px;
+  color: #555;
+  vertical-align: middle;
+  background-color: #fcfcfc;
+  border: solid 1px #ccc;
+  border-bottom-color: #bbb;
+  border-radius: 3px;
+  box-shadow: inset 0 -1px 0 #bbb;
+}
+
+.task-list-item {
+  list-style-type: none;
+}
+
+.task-list-item+.task-list-item {
+  margin-top: 3px;
+}
+
+.task-list-item input {
+  margin: 0 0.35em 0.25em -1.6em;
+  vertical-align: middle;
+}
+
+:checked+.radio-label {
+  z-index: 1;
+  position: relative;
+  border-color: #4078c0;
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/benchmarks/dbmon/ENV.js b/advancedcontentfilter/vendor/asset/vue/benchmarks/dbmon/ENV.js
new file mode 100644 (file)
index 0000000..2559b7a
--- /dev/null
@@ -0,0 +1,211 @@
+var ENV = ENV || (function() {
+
+  var first = true;
+  var counter = 0;
+  var data;
+  var _base;
+  (_base = String.prototype).lpad || (_base.lpad = function(padding, toLength) {
+    return padding.repeat((toLength - this.length) / padding.length).concat(this);
+  });
+
+  function formatElapsed(value) {
+    var str = parseFloat(value).toFixed(2);
+    if (value > 60) {
+      minutes = Math.floor(value / 60);
+      comps = (value % 60).toFixed(2).split('.');
+      seconds = comps[0].lpad('0', 2);
+      ms = comps[1];
+      str = minutes + ":" + seconds + "." + ms;
+    }
+    return str;
+  }
+
+  function getElapsedClassName(elapsed) {
+    var className = 'Query elapsed';
+    if (elapsed >= 10.0) {
+      className += ' warn_long';
+    }
+    else if (elapsed >= 1.0) {
+      className += ' warn';
+    }
+    else {
+      className += ' short';
+    }
+    return className;
+  }
+
+  function countClassName(queries) {
+    var countClassName = "label";
+    if (queries >= 20) {
+      countClassName += " label-important";
+    }
+    else if (queries >= 10) {
+      countClassName += " label-warning";
+    }
+    else {
+      countClassName += " label-success";
+    }
+    return countClassName;
+  }
+
+  function updateQuery(object) {
+    if (!object) {
+      object = {};
+    }
+    var elapsed = Math.random() * 15;
+    object.elapsed = elapsed;
+    object.formatElapsed = formatElapsed(elapsed);
+    object.elapsedClassName = getElapsedClassName(elapsed);
+    object.query = "SELECT blah FROM something";
+    object.waiting = Math.random() < 0.5;
+    if (Math.random() < 0.2) {
+      object.query = "<IDLE> in transaction";
+    }
+    if (Math.random() < 0.1) {
+      object.query = "vacuum";
+    }
+    return object;
+  }
+
+  function cleanQuery(value) {
+    if (value) {
+      value.formatElapsed = "";
+      value.elapsedClassName = "";
+      value.query = "";
+      value.elapsed = null;
+      value.waiting = null;
+    } else {
+      return {
+        query: "***",
+        formatElapsed: "",
+        elapsedClassName: ""
+      };
+    }
+  }
+
+  function generateRow(object, keepIdentity, counter) {
+    var nbQueries = Math.floor((Math.random() * 10) + 1);
+    if (!object) {
+      object = {};
+    }
+    object.lastMutationId = counter;
+    object.nbQueries = nbQueries;
+    if (!object.lastSample) {
+      object.lastSample = {};
+    }
+    if (!object.lastSample.topFiveQueries) {
+      object.lastSample.topFiveQueries = [];
+    }
+    if (keepIdentity) {
+      // for Angular optimization
+      if (!object.lastSample.queries) {
+        object.lastSample.queries = [];
+        for (var l = 0; l < 12; l++) {
+          object.lastSample.queries[l] = cleanQuery();
+        }
+      }
+      for (var j in object.lastSample.queries) {
+        var value = object.lastSample.queries[j];
+        if (j <= nbQueries) {
+          updateQuery(value);
+        } else {
+          cleanQuery(value);
+        }
+      }
+    } else {
+      object.lastSample.queries = [];
+      for (var j = 0; j < 12; j++) {
+        if (j < nbQueries) {
+          var value = updateQuery(cleanQuery());
+          object.lastSample.queries.push(value);
+        } else {
+          object.lastSample.queries.push(cleanQuery());
+        }
+      }
+    }
+    for (var i = 0; i < 5; i++) {
+      var source = object.lastSample.queries[i];
+      object.lastSample.topFiveQueries[i] = source;
+    }
+    object.lastSample.nbQueries = nbQueries;
+    object.lastSample.countClassName = countClassName(nbQueries);
+    return object;
+  }
+
+  function getData(keepIdentity) {
+    var oldData = data;
+    if (!keepIdentity) { // reset for each tick when !keepIdentity
+      data = [];
+      for (var i = 1; i <= ENV.rows; i++) {
+        data.push({ dbname: 'cluster' + i, query: "", formatElapsed: "", elapsedClassName: "" });
+        data.push({ dbname: 'cluster' + i + ' slave', query: "", formatElapsed: "", elapsedClassName: "" });
+      }
+    }
+    if (!data) { // first init when keepIdentity
+      data = [];
+      for (var i = 1; i <= ENV.rows; i++) {
+        data.push({ dbname: 'cluster' + i });
+        data.push({ dbname: 'cluster' + i + ' slave' });
+      }
+      oldData = data;
+    }
+    for (var i in data) {
+      var row = data[i];
+      if (!keepIdentity && oldData && oldData[i]) {
+        row.lastSample = oldData[i].lastSample;
+      }
+      if (!row.lastSample || Math.random() < ENV.mutations()) {
+        counter = counter + 1;
+        if (!keepIdentity) {
+          row.lastSample = null;
+        }
+        generateRow(row, keepIdentity, counter);
+      } else {
+        data[i] = oldData[i];
+      }
+    }
+    first = false;
+    return {
+      toArray: function() {
+        return data;
+      }
+    };
+  }
+
+  var mutationsValue = 0.5;
+
+  function mutations(value) {
+    if (value) {
+      mutationsValue = value;
+      return mutationsValue;
+    } else {
+      return mutationsValue;
+    }
+  }
+
+  var body = document.querySelector('body');
+  var theFirstChild = body.firstChild;
+
+  var sliderContainer = document.createElement( 'div' );
+  sliderContainer.style.cssText = "display: flex";
+  var slider = document.createElement('input');
+  var text = document.createElement('label');
+  text.innerHTML = 'mutations : ' + (mutationsValue * 100).toFixed(0) + '%';
+  text.id = "ratioval";
+  slider.setAttribute("type", "range");
+  slider.style.cssText = 'margin-bottom: 10px; margin-top: 5px';
+  slider.addEventListener('change', function(e) {
+    ENV.mutations(e.target.value / 100);
+    document.querySelector('#ratioval').innerHTML = 'mutations : ' + (ENV.mutations() * 100).toFixed(0) + '%';
+  });
+  sliderContainer.appendChild( text );
+  sliderContainer.appendChild( slider );
+  body.insertBefore( sliderContainer, theFirstChild );
+
+  return  {
+    generateData: getData,
+    rows: 50,
+    timeout: 0,
+    mutations: mutations
+  };
+})();
diff --git a/advancedcontentfilter/vendor/asset/vue/benchmarks/dbmon/app.js b/advancedcontentfilter/vendor/asset/vue/benchmarks/dbmon/app.js
new file mode 100644 (file)
index 0000000..61950d3
--- /dev/null
@@ -0,0 +1,14 @@
+var app = new Vue({
+  el: '#app',
+  data: {
+    databases: []
+  }
+})
+
+function loadSamples() {
+  app.databases = Object.freeze(ENV.generateData().toArray());
+  Monitoring.renderRate.ping();
+  setTimeout(loadSamples, ENV.timeout);
+}
+
+loadSamples()
diff --git a/advancedcontentfilter/vendor/asset/vue/benchmarks/dbmon/index.html b/advancedcontentfilter/vendor/asset/vue/benchmarks/dbmon/index.html
new file mode 100644 (file)
index 0000000..e784bb4
--- /dev/null
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta name="description" content="dbmon vue" />
+<link href="./lib/styles.css" rel="stylesheet" type="text/css" />
+<title>dbmon (Vue)</title>
+</head>
+<body>
+  <h2>
+    Reference: <a href="http://mathieuancelin.github.io/js-repaint-perfs/">js-repaint-perfs</a>
+  </h2>
+  <div id="app">
+    <table class="table table-striped lastest-data">
+      <tbody>
+        <tr v-for="db in databases">
+          <td class="dbname">{{db.dbname}}</td>
+          <td class="query-count">
+            <span :class="db.lastSample.countClassName">{{db.lastSample.nbQueries}}</span>
+          </td>
+          <td v-for="q in db.lastSample.topFiveQueries" :class="'Query ' + q.elapsedClassName">
+            {{q.formatElapsed}}
+            <div class="popover left">
+              <div class="popover-content">{{q.query}}</div>
+              <div class="arrow"></div>
+            </div>
+          </td>
+        </tr>
+      </tbody>
+    </table>
+  </div>
+
+  <script src="./ENV.js"></script>
+  <script src="./lib/memory-stats.js"></script>
+  <script src="./lib/monitor.js"></script>
+  <script src="../../dist/vue.min.js"></script>
+  <script src="./app.js"></script>
+</body>
+</html>
diff --git a/advancedcontentfilter/vendor/asset/vue/benchmarks/dbmon/lib/memory-stats.js b/advancedcontentfilter/vendor/asset/vue/benchmarks/dbmon/lib/memory-stats.js
new file mode 100644 (file)
index 0000000..03272d8
--- /dev/null
@@ -0,0 +1,98 @@
+/**
+ * @author mrdoob / http://mrdoob.com/
+ * @author jetienne / http://jetienne.com/
+ * @author paulirish / http://paulirish.com/
+ */
+var MemoryStats = function (){
+
+       var msMin       = 100;
+       var msMax       = 0;
+
+       var container   = document.createElement( 'div' );
+       container.id    = 'stats';
+       container.style.cssText = 'width:80px;opacity:0.9;cursor:pointer';
+
+       var msDiv       = document.createElement( 'div' );
+       msDiv.id        = 'ms';
+       msDiv.style.cssText = 'padding:0 0 3px 3px;text-align:left;background-color:#020;';
+       container.appendChild( msDiv );
+
+       var msText      = document.createElement( 'div' );
+       msText.id       = 'msText';
+       msText.style.cssText = 'color:#0f0;font-family:Helvetica,Arial,sans-serif;font-size:9px;font-weight:bold;line-height:15px';
+       msText.innerHTML= 'Memory';
+       msDiv.appendChild( msText );
+
+       var msGraph     = document.createElement( 'div' );
+       msGraph.id      = 'msGraph';
+       msGraph.style.cssText = 'position:relative;width:74px;height:30px;background-color:#0f0';
+       msDiv.appendChild( msGraph );
+
+       while ( msGraph.children.length < 74 ) {
+
+               var bar = document.createElement( 'span' );
+               bar.style.cssText = 'width:1px;height:30px;float:left;background-color:#131';
+               msGraph.appendChild( bar );
+
+       }
+
+       var updateGraph = function ( dom, height, color ) {
+
+               var child = dom.appendChild( dom.firstChild );
+               child.style.height = height + 'px';
+               if( color ) child.style.backgroundColor = color;
+
+       }
+
+       var perf = window.performance || {};
+       // polyfill usedJSHeapSize
+       if (!perf.memory){
+               perf.memory = { usedJSHeapSize : 0 };
+       }
+
+       // support of the API?
+       if( perf.memory.totalJSHeapSize === 0 ){
+               console.warn('totalJSHeapSize === 0... performance.memory is only available in Chrome .')
+       }
+
+       // TODO, add a sanity check to see if values are bucketed.
+       // If so, remind user to adopt the --enable-precise-memory-info flag.
+       // open -a "/Applications/Google Chrome.app" --args --enable-precise-memory-info
+
+       var lastTime    = Date.now();
+       var lastUsedHeap= perf.memory.usedJSHeapSize;
+       return {
+               domElement: container,
+
+               update: function () {
+
+                       // refresh only 30time per second
+                       if( Date.now() - lastTime < 1000/30 )   return;
+                       lastTime        = Date.now()
+
+                       var delta       = perf.memory.usedJSHeapSize - lastUsedHeap;
+                       lastUsedHeap    = perf.memory.usedJSHeapSize;
+                       var color       = delta < 0 ? '#830' : '#131';
+
+                       var ms  = perf.memory.usedJSHeapSize;
+                       msMin   = Math.min( msMin, ms );
+                       msMax   = Math.max( msMax, ms );
+                       msText.textContent = "Mem: " + bytesToSize(ms, 2);
+
+                       var normValue   = ms / (30*1024*1024);
+                       var height      = Math.min( 30, 30 - normValue * 30 );
+                       updateGraph( msGraph, height, color);
+
+                       function bytesToSize( bytes, nFractDigit ){
+                               var sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];
+                               if (bytes == 0) return 'n/a';
+                               nFractDigit     = nFractDigit !== undefined ? nFractDigit : 0;
+                               var precision   = Math.pow(10, nFractDigit);
+                               var i           = Math.floor(Math.log(bytes) / Math.log(1024));
+                               return Math.round(bytes*precision / Math.pow(1024, i))/precision + ' ' + sizes[i];
+                       };
+               }
+
+       }
+
+};
diff --git a/advancedcontentfilter/vendor/asset/vue/benchmarks/dbmon/lib/monitor.js b/advancedcontentfilter/vendor/asset/vue/benchmarks/dbmon/lib/monitor.js
new file mode 100644 (file)
index 0000000..dccad19
--- /dev/null
@@ -0,0 +1,60 @@
+var Monitoring = Monitoring || (function() {
+
+  var stats = new MemoryStats();
+  stats.domElement.style.position = 'fixed';
+  stats.domElement.style.right        = '0px';
+  stats.domElement.style.bottom       = '0px';
+  document.body.appendChild( stats.domElement );
+  requestAnimationFrame(function rAFloop(){
+      stats.update();
+      requestAnimationFrame(rAFloop);
+  });
+
+  var RenderRate = function () {
+    var container = document.createElement( 'div' );
+    container.id  = 'stats';
+    container.style.cssText = 'width:150px;opacity:0.9;cursor:pointer;position:fixed;right:80px;bottom:0px;';
+
+    var msDiv = document.createElement( 'div' );
+    msDiv.id  = 'ms';
+    msDiv.style.cssText = 'padding:0 0 3px 3px;text-align:left;background-color:#020;';
+    container.appendChild( msDiv );
+
+    var msText  = document.createElement( 'div' );
+    msText.id = 'msText';
+    msText.style.cssText = 'color:#0f0;font-family:Helvetica,Arial,sans-serif;font-size:9px;font-weight:bold;line-height:15px';
+    msText.innerHTML= 'Repaint rate: 0/sec';
+    msDiv.appendChild( msText );
+
+    var bucketSize = 20;
+    var bucket = [];
+    var lastTime  = Date.now();
+    return {
+      domElement: container,
+      ping: function () {
+        var start = lastTime;
+        var stop = Date.now();
+        var rate = 1000 / (stop - start);
+        bucket.push(rate);
+        if (bucket.length > bucketSize) {
+          bucket.shift();
+        }
+        var sum = 0;
+        for (var i = 0; i < bucket.length; i++) {
+          sum = sum + bucket[i];
+        }
+        msText.textContent = "Repaint rate: " + (sum / bucket.length).toFixed(2) + "/sec";
+        lastTime = stop;
+      }
+    }
+  };
+
+  var renderRate = new RenderRate();
+  document.body.appendChild( renderRate.domElement );
+
+  return {
+    memoryStats: stats,
+    renderRate: renderRate
+  };
+  
+})();
diff --git a/advancedcontentfilter/vendor/asset/vue/benchmarks/dbmon/lib/styles.css b/advancedcontentfilter/vendor/asset/vue/benchmarks/dbmon/lib/styles.css
new file mode 100644 (file)
index 0000000..da43dd9
--- /dev/null
@@ -0,0 +1,26 @@
+body {color:#333;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;margin:0;}
+label {display:inline-block;font-weight:700;margin-bottom:5px;}
+input[type=range] {display:block;width:100%;}
+table {border-collapse:collapse;border-spacing:0;}
+:before,:after {box-sizing: border-box;}
+
+.table > thead > tr > th,.table > tbody > tr > th,.table > tfoot > tr > th,.table > thead > tr > td,.table > tbody > tr > td,.table > tfoot > tr > td {border-top:1px solid #ddd;line-height:1.42857143;padding:8px;vertical-align:top;}
+.table {width:100%;}
+.table-striped > tbody > tr:nth-child(odd) > td,.table-striped > tbody > tr:nth-child(odd) > th {background:#f9f9f9;}
+
+.label {border-radius:.25em;color:#fff;display:inline;font-size:75%;font-weight:700;line-height:1;padding:.2em .6em .3em;text-align:center;vertical-align:baseline;white-space:nowrap;}
+.label-success {background-color:#5cb85c;}
+.label-warning {background-color:#f0ad4e;}
+
+.popover {background-color:#fff;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;box-shadow:0 5px 10px rgba(0,0,0,.2);display:none;left:0;max-width:276px;padding:1px;position:absolute;text-align:left;top:0;white-space:normal;z-index:1010;}
+.popover>.arrow:after {border-width:10px;content:"";}
+.popover.left {margin-left:-10px;}
+.popover.left > .arrow {border-right-width:0;border-left-color:rgba(0,0,0,.25);margin-top:-11px;right:-11px;top:50%;}
+.popover.left > .arrow:after {border-left-color:#fff;border-right-width:0;bottom:-10px;content:" ";right:1px;}
+.popover > .arrow {border-width:11px;}
+.popover > .arrow,.popover>.arrow:after {border-color:transparent;border-style:solid;display:block;height:0;position:absolute;width:0;}
+
+.popover-content {padding:9px 14px;}
+
+.Query {position:relative;}
+.Query:hover .popover {display:block;left:-100%;width:100%;}
diff --git a/advancedcontentfilter/vendor/asset/vue/benchmarks/reorder-list/index.html b/advancedcontentfilter/vendor/asset/vue/benchmarks/reorder-list/index.html
new file mode 100644 (file)
index 0000000..81b5a26
--- /dev/null
@@ -0,0 +1,111 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <title>Vue benchmark</title>
+  </head>
+  <body>
+    <script src="https://cdn.jsdelivr.net/lodash/4.10.0/lodash.min.js"></script>
+    <script src="../../dist/vue.min.js"></script>
+    <style>
+    .danger {
+      background-color: red;
+    }
+    </style>
+
+    <script type="text/x-template" id="t">
+      <div>
+        <h1>{{ total }} Components</h1>
+        <p>{{ action }} took {{time}}ms.</p>
+        <button @click="shuffle">shuffle</button>
+        <button @click="add">add</button>
+        <table class="table table-hover table-striped test-data">
+          <row v-for="item in items" :key="item.id"
+            :class="{ danger: item.id === selected }"
+            :item="item"
+            @select="select(item)"
+            @remove="remove(item)">
+          </row>
+        </table>
+      </div>
+    </script>
+
+    <script type="text/x-template" id="row">
+      <tr>
+        <td class="col-md-1">{{item.id}}</td>
+        <td class="col-md-4">
+            <a @click="$emit('select')">{{item.label}}</a>
+        </td>
+        <td class="col-md-1">
+          <button @click="$emit('remove')">remove</button>
+        </td>
+      </tr>
+    </script>
+
+    <div id="el">
+    </div>
+
+    <script>
+    var total = 1000
+    var items = []
+    for (var i = 0; i < total; i++) {
+      items.push({
+        id: i,
+        label: String(Math.random()).slice(0, 5)
+      })
+    }
+
+    var s = window.performance.now()
+    console.profile('render')
+    var vm = new Vue({
+      el: '#el',
+      template: '#t',
+      data: {
+        total: total,
+        time: 0,
+        action: 'Render',
+        items: items,
+        selected: null
+      },
+      methods: {
+        shuffle: monitor('shuffle', function () {
+          this.items = _.shuffle(this.items)
+        }),
+        add: monitor('add', function () {
+          this.items.push({
+            id: total++,
+            label: String(Math.random()).slice(0, 5)
+          })
+        }),
+        select: monitor('select', function (item) {
+          this.selected = item.id
+        }),
+        remove: monitor('remove', function (item) {
+          this.items.splice(this.items.indexOf(item), 1)
+        })
+      },
+      components: {
+        row: {
+          props: ['item'],
+          template: '#row'
+        }
+      }
+    })
+    setTimeout(function () {
+      vm.time = window.performance.now() - s
+      console.profileEnd('render')
+    }, 0)
+
+    function monitor (action, fn) {
+      return function () {
+        var s = window.performance.now()
+        fn.apply(this, arguments)
+        Vue.nextTick(function () {
+          vm.action = action
+          vm.time = window.performance.now() - s
+        })
+      }
+    }
+    </script>
+  </body>
+</html>
diff --git a/advancedcontentfilter/vendor/asset/vue/benchmarks/ssr/README.md b/advancedcontentfilter/vendor/asset/vue/benchmarks/ssr/README.md
new file mode 100644 (file)
index 0000000..2f0529c
--- /dev/null
@@ -0,0 +1,13 @@
+# Vue.js SSR benchmark
+
+This benchmark renders a table of 1000 rows with 10 columns (10k components), with around 30k normal elements on the page. Note this is not something likely to be seen in a typical app. This benchmark is mostly for stress/regression testing and comparing between `renderToString` and `renderToStream`.
+
+To view the results follow the run section. Note that the overall completion time for the results are variable, this is due to other system related variants at run time (available memory, processing power, etc). In ideal circumstances both should finish within similar results.
+
+`renderToStream` pipes the content through a stream which provides considerable performance benefits (faster time-to-first-byte and non-event-loop-blocking) over `renderToString`. This can be observed through the benchmark.
+
+### run
+
+``` bash
+npm run bench:ssr
+```
diff --git a/advancedcontentfilter/vendor/asset/vue/benchmarks/ssr/common.js b/advancedcontentfilter/vendor/asset/vue/benchmarks/ssr/common.js
new file mode 100644 (file)
index 0000000..688832f
--- /dev/null
@@ -0,0 +1,59 @@
+'use strict'
+
+const self = (global || root)
+
+self.performance = {
+  now: function () {
+    var hrtime = process.hrtime()
+    return ((hrtime[0] * 1000000 + hrtime[1] / 1000) / 1000)
+  }
+}
+
+function generateGrid (rowCount, columnCount) {
+  var grid = []
+
+  for (var r = 0; r < rowCount; r++) {
+    var row = { id: r, items: [] }
+    for (var c = 0; c < columnCount; c++) {
+      row.items.push({ id: (r + '-' + c) })
+    }
+    grid.push(row)
+  }
+
+  return grid
+}
+
+const gridData = generateGrid(1000, 10)
+
+module.exports = {
+  template: '<div><h1>{{ Math.random() }}</h1><my-table></my-table></div>',
+  components: {
+    myTable: {
+      data: function () {
+        return {
+          grid: gridData
+        }
+      },
+      // template: '<table><tr v-for="row in grid"><th>123</th><td v-for="item in row.items">{{ item.id }}</td></tr></table>',
+      template: '<table width="100%" cellspacing="2"><row v-for="row in grid" :row="row"></row></table>',
+      components: {
+        row: {
+          props: ['row'],
+          template: '<tr><th>{{ Math.random() }}</th><column v-for="item in row.items"></column></tr>',
+          components: {
+            column: {
+              template: '<td class="item">' +
+                // 25 plain elements for each cell
+                '<ul class="yoyo">' +
+                  `<li v-for="i in 5" :class="'hihi' + i">` +
+                    `<span :id="i + '_' + j" v-for="j in 5">fsefs</span>` +
+                    '</li>' +
+                '</ul>' +
+              '</td>'
+            }
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/benchmarks/ssr/renderToStream.js b/advancedcontentfilter/vendor/asset/vue/benchmarks/ssr/renderToStream.js
new file mode 100644 (file)
index 0000000..74ca103
--- /dev/null
@@ -0,0 +1,31 @@
+/* eslint-disable no-unused-vars */
+
+'use strict'
+
+process.env.NODE_ENV = 'production'
+
+const Vue = require('../../dist/vue.runtime.common.js')
+const createRenderer = require('../../packages/vue-server-renderer').createRenderer
+const renderToStream = createRenderer().renderToStream
+const gridComponent = require('./common.js')
+
+console.log('--- renderToStream --- ')
+const self = (global || root)
+const s = self.performance.now()
+
+const stream = renderToStream(new Vue(gridComponent))
+let str = ''
+let first
+let complete
+stream.once('data', () => {
+  first = self.performance.now() - s
+})
+stream.on('data', chunk => {
+  str += chunk
+})
+stream.on('end', () => {
+  complete = self.performance.now() - s
+  console.log(`first chunk: ${first.toFixed(2)}ms`)
+  console.log(`complete: ${complete.toFixed(2)}ms`)
+  console.log()
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/benchmarks/ssr/renderToString.js b/advancedcontentfilter/vendor/asset/vue/benchmarks/ssr/renderToString.js
new file mode 100644 (file)
index 0000000..a96373e
--- /dev/null
@@ -0,0 +1,19 @@
+'use strict'
+
+process.env.NODE_ENV = 'production'
+
+const Vue = require('../../dist/vue.runtime.common.js')
+const createRenderer = require('../../packages/vue-server-renderer').createRenderer
+const renderToString = createRenderer().renderToString
+const gridComponent = require('./common.js')
+
+console.log('--- renderToString --- ')
+const self = (global || root)
+self.s = self.performance.now()
+
+renderToString(new Vue(gridComponent), (err, res) => {
+  if (err) throw err
+  // console.log(res)
+  console.log('Complete time: ' + (self.performance.now() - self.s).toFixed(2) + 'ms')
+  console.log()
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/benchmarks/svg/index.html b/advancedcontentfilter/vendor/asset/vue/benchmarks/svg/index.html
new file mode 100644 (file)
index 0000000..cd274cb
--- /dev/null
@@ -0,0 +1,102 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+  <title>vue.js version</title>
+  <script src="https://cdn.jsdelivr.net/stats.js/r11/stats.min.js"></script>
+  <script src="../../dist/vue.min.js"></script>
+  <style>
+  html, body {
+    height: 100%;
+    width: 100%;
+    padding: 0;
+    margin: 0;
+  }
+  svg {
+    width: 800px;
+    height: 600px;
+  }
+  </style>
+</head>
+<body>
+  <h1>Animating 1000 SVG dots</h1>
+  <div id="app">
+    <p>
+      <button @click="toggleOptimization">
+        {{ optimized ? 'disable' : 'enable' }} optimization (Object.freeze)
+      </button>
+    </p>
+    <svg>
+      <circle  v-for='point in model.points' :cx='point.x' :cy='point.y' r='2px' fill='#FC309D'></circle>
+    </svg>
+  </div>
+<script type="text/javascript" charset="utf-8">
+var stats = new Stats()
+stats.setMode(0)
+stats.domElement.style.position = 'absolute'
+stats.domElement.style.right = '0px'
+stats.domElement.style.top = '0px'
+document.body.appendChild(stats.domElement)
+
+var WIDTH = 800
+var HEIGHT = 600
+
+new Vue({
+  el: '#app',
+  data: {
+    model: createModel(1000),
+    optimized: false
+  },
+  created: function () {
+    var self = this
+    requestAnimationFrame(render)
+    stats.begin()
+    function render () {
+      stats.end()
+      stats.begin()
+      requestAnimationFrame(render)
+      self.model.step()
+      if (self.optimized) {
+        self.$forceUpdate()
+      }
+    }
+  },
+  methods: {
+    toggleOptimization: function () {
+      this.model = this.optimized
+        ? createModel(1000)
+        : Object.freeze(createModel(1000))
+      this.optimized = !this.optimized
+    }
+  }
+});
+
+function createModel (count) {
+  var points = []
+  for (var i = 0; i < count; ++i) {
+    points.push({
+      x: Math.random() * WIDTH,
+      y: Math.random() * HEIGHT,
+      vx: Math.random() * 4 - 2,
+      vy: Math.random() * 4 - 2
+    })
+  }
+
+  return {
+    points: points,
+    step: step
+  }
+
+  function step () {
+    points.forEach(move)
+  }
+
+  function move (p) {
+    if (p.x > WIDTH || p.x < 0) p.vx *= -1
+    if (p.y > HEIGHT || p.y < 0) p.vy *= -1
+    p.y += p.vy
+    p.x += p.vx
+  }
+}
+</script>
+</body>
+</html>
diff --git a/advancedcontentfilter/vendor/asset/vue/benchmarks/uptime/index.html b/advancedcontentfilter/vendor/asset/vue/benchmarks/uptime/index.html
new file mode 100644 (file)
index 0000000..4a37515
--- /dev/null
@@ -0,0 +1,200 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <title>Vue benchmark</title>
+    <style type="text/css">
+      html, body {
+        margin: 0;
+        padding: 0 10px;
+        font-family: sans-serif;
+      }
+
+      #fps {
+        position: fixed;
+        top: 0px;
+        right: 0px;
+        padding: 32px;
+        font-size: 32px;
+        text-align: right;
+      }
+
+      * {
+        box-sizing: border-box;
+      }
+
+      .server-uptime {
+        display: block;
+        overflow: hidden;
+        margin: 0 auto;
+        width: 50%;
+      }
+
+      .server-uptime + .server-uptime {
+        margin: 20px auto 0 auto;
+        border-top: 1px solid #999;
+      }
+
+      .days {
+        display: flex;
+        flex-direction: row;
+        flex-flow: wrap;
+      }
+
+      .uptime-day {
+        display: flex;
+      }
+
+      span.uptime-day-status {
+        width: 10px;
+        height: 10px;
+        margin: 1px;
+      }
+
+      .hover {
+        display: none;
+      }
+
+      .uptime-day-status:hover + .hover {
+        display: flex;
+        position: absolute;
+        margin-top: -35px;
+        margin-left: -30px;
+        border-radius: 4px;
+        color: #eee;
+        background-color: #333;
+        padding: 10px;
+        font-size: 11px;
+      }
+    </style>
+  </head>
+  <body>
+    <p>Reference: <a href="https://github.com/tildeio/glimmer/blob/master/packages/glimmer-demos/lib/uptime.ts">Ember Glimmer 2 demo</a></p>
+    <div id="app">
+      <p>FPS: {{ fps }}</p>
+      <button @click="toggle">{{ playing ? 'pause' : 'play' }}</button>
+      <server-uptime
+        v-for="server in servers"
+        :key="server.name"
+        :name="server.name"
+        :days="server.days">
+      </server-uptime>
+    </div>
+    <script src="../../dist/vue.min.js"></script>
+    <script>
+      // functional components are prefect for small, presentational components
+      // and they are much more efficient than stateful ones.
+      Vue.component('uptime-day', {
+        props: ['day'],
+        functional: true,
+        render (h, ctx) {
+          var day = ctx.props.day
+          return h('div', { staticClass: 'uptime-day'}, [
+            h('span', { staticClass: 'uptime-day-status', style: { backgroundColor: day.up ? '#8cc665' : '#ccc' } }),
+            h('span', { staticClass: 'hover' }, [day.number + ': ' + day.up ? 'Servers operational!' : 'Red alert!'])
+          ])
+        }
+      })
+
+      Vue.component('server-uptime', {
+        props: ['name', 'days'],
+        computed: {
+          upDays () {
+            return this.days.reduce(function (upDays, day) {
+              return upDays += (day.up ? 1 : 0)
+            }, 0)
+          },
+          maxStreak () {
+            var streak = this.days.reduce(([max, streak], day) => {
+              if (day.up && streak + 1 > max) {
+                return [streak + 1, streak + 1]
+              } else if (day.up) {
+                return [max, streak + 1]
+              } else {
+                return [max, 0]
+              }
+            }, [0, 0])
+
+            return streak.max
+          }
+        },
+        template: `
+          <div class="server-uptime">
+            <h1>{{name}}</h1>
+            <h2>{{upDays}} Days Up</h2>
+            <h2>Biggest Streak: {{maxStreak}}</h2>
+            <div class="days">
+              <uptime-day
+                v-for="day in days"
+                :key="day.number"
+                :day="day">
+              </uptime-day>
+            </div>
+          </div>
+        `
+      })
+
+      function generateServer (name) {
+        var days = []
+        for (var i=0; i<=364; i++) {
+          var up = Math.random() > 0.2
+          days.push({ number: i, up })
+        }
+        return { name, days }
+      }
+
+      function generateServers () {
+        return [
+          generateServer("Stefan's Server"),
+          generateServer("Godfrey's Server"),
+          generateServer("Yehuda's Server")
+        ]
+      }
+
+      var s = window.performance.now()
+      var app = new Vue({
+        el: '#app',
+        data: {
+          fps: 0,
+          playing: false,
+          servers: Object.freeze(generateServers())
+        },
+        methods: {
+          toggle () {
+            this.playing = !this.playing
+            if (this.playing) {
+              update()
+            } else {
+              clearTimeout(timeoutId)
+            }
+          }
+        }
+      })
+      console.log('initial render: ' + (window.performance.now() - s) + 'ms')
+
+      var fpsMeter = {
+        alpha: 2/121,
+        lastValue: null,
+        push (dataPoint) {
+          if (this.lastValue) {
+            return this.lastValue = this.lastValue + this.alpha * (dataPoint - this.lastValue)
+          } else {
+            return this.lastValue = dataPoint
+          }
+        }
+      }
+
+      var timeoutId
+      var lastFrame = null
+      function update () {
+        var thisFrame = window.performance.now()
+        if (lastFrame) {
+          app.fps = Math.round(fpsMeter.push(1000 / (thisFrame - lastFrame)))
+        }
+        app.servers = Object.freeze(generateServers())
+        timeoutId = setTimeout(update, 0) // not using rAF because that limits us to 60fps!
+        lastFrame = thisFrame
+      }
+    </script>
+  </body>
+</html>
diff --git a/advancedcontentfilter/vendor/asset/vue/dist/README.md b/advancedcontentfilter/vendor/asset/vue/dist/README.md
new file mode 100644 (file)
index 0000000..6b20683
--- /dev/null
@@ -0,0 +1,124 @@
+## Explanation of Build Files
+
+| | UMD | CommonJS | ES Module |
+| --- | --- | --- | --- |
+| **Full** | vue.js | vue.common.js | vue.esm.js |
+| **Runtime-only** | vue.runtime.js | vue.runtime.common.js | vue.runtime.esm.js |
+| **Full (production)** | vue.min.js | | |
+| **Runtime-only (production)** | vue.runtime.min.js | | |
+
+### Terms
+
+- **Full**: builds that contains both the compiler and the runtime.
+
+- **Compiler**: code that is responsible for compiling template strings into JavaScript render functions.
+
+- **Runtime**: code that is responsible for creating Vue instances, rendering and patching virtual DOM, etc. Basically everything minus the compiler.
+
+- **[UMD](https://github.com/umdjs/umd)**: UMD builds can be used directly in the browser via a `<script>` tag. The default file from Unpkg CDN at [https://unpkg.com/vue](https://unpkg.com/vue) is the Runtime + Compiler UMD build (`vue.js`).
+
+- **[CommonJS](http://wiki.commonjs.org/wiki/Modules/1.1)**: CommonJS builds are intended for use with older bundlers like [browserify](http://browserify.org/) or [webpack 1](https://webpack.github.io). The default file for these bundlers (`pkg.main`) is the Runtime only CommonJS build (`vue.runtime.common.js`).
+
+- **[ES Module](http://exploringjs.com/es6/ch_modules.html)**: ES module builds are intended for use with modern bundlers like [webpack 2](https://webpack.js.org) or [rollup](http://rollupjs.org/). The default file for these bundlers (`pkg.module`) is the Runtime only ES Module build (`vue.runtime.esm.js`).
+
+### Runtime + Compiler vs. Runtime-only
+
+If you need to compile templates on the fly (e.g. passing a string to the `template` option, or mounting to an element using its in-DOM HTML as the template), you will need the compiler and thus the full build.
+
+When using `vue-loader` or `vueify`, templates inside `*.vue` files are compiled into JavaScript at build time. You don't really need the compiler in the final bundle, and can therefore use the runtime-only build.
+
+Since the runtime-only builds are roughly 30% lighter-weight than their full-build counterparts, you should use it whenever you can. If you wish to use the full build instead, you need to configure an alias in your bundler.
+
+#### Webpack
+
+``` js
+module.exports = {
+  // ...
+  resolve: {
+    alias: {
+      'vue$': 'vue/dist/vue.esm.js' // 'vue/dist/vue.common.js' for webpack 1
+    }
+  }
+}
+````
+
+#### Rollup
+
+``` js
+const alias = require('rollup-plugin-alias')
+
+rollup({
+  // ...
+  plugins: [
+    alias({
+      'vue': 'vue/dist/vue.esm.js'
+    })
+  ]
+})
+```
+
+#### Browserify
+
+Add to your project's `package.json`:
+
+``` js
+{
+  // ...
+  "browser": {
+    "vue": "vue/dist/vue.common.js"
+  }
+}
+```
+
+### Development vs. Production Mode
+
+Development/production modes are hard-coded for the UMD builds: the un-minified files are for development, and the minified files are for production.
+
+CommonJS and ES Module builds are intended for bundlers, therefore we don't provide minified versions for them. You will be responsible for minifying the final bundle yourself.
+
+CommonJS and ES Module builds also preserve raw checks for `process.env.NODE_ENV` to determine the mode they should run in. You should use appropriate bundler configurations to replace these environment variables in order to control which mode Vue will run in. Replacing `process.env.NODE_ENV` with string literals also allows minifiers like UglifyJS to completely drop the development-only code blocks, reducing final file size.
+
+#### Webpack
+
+Use Webpack's [DefinePlugin](https://webpack.js.org/plugins/define-plugin/):
+
+``` js
+var webpack = require('webpack')
+
+module.exports = {
+  // ...
+  plugins: [
+    // ...
+    new webpack.DefinePlugin({
+      'process.env': {
+        NODE_ENV: JSON.stringify('production')
+      }
+    })
+  ]
+}
+```
+
+#### Rollup
+
+Use [rollup-plugin-replace](https://github.com/rollup/rollup-plugin-replace):
+
+``` js
+const replace = require('rollup-plugin-replace')
+
+rollup({
+  // ...
+  plugins: [
+    replace({
+      'process.env.NODE_ENV': JSON.stringify('production')
+    })
+  ]
+}).then(...)
+```
+
+#### Browserify
+
+Apply a global [envify](https://github.com/hughsk/envify) transform to your bundle.
+
+``` bash
+NODE_ENV=production browserify -g envify -e main.js | uglifyjs -c -m > build.js
+```
diff --git a/advancedcontentfilter/vendor/asset/vue/examples/commits/app.js b/advancedcontentfilter/vendor/asset/vue/examples/commits/app.js
new file mode 100644 (file)
index 0000000..029d660
--- /dev/null
@@ -0,0 +1,47 @@
+var apiURL = 'https://api.github.com/repos/vuejs/vue/commits?per_page=3&sha='
+
+/**
+ * Actual demo
+ */
+
+var demo = new Vue({
+
+  el: '#demo',
+
+  data: {
+    branches: ['master', 'dev'],
+    currentBranch: 'master',
+    commits: null
+  },
+
+  created: function () {
+    this.fetchData()
+  },
+
+  watch: {
+    currentBranch: 'fetchData'
+  },
+
+  filters: {
+    truncate: function (v) {
+      var newline = v.indexOf('\n')
+      return newline > 0 ? v.slice(0, newline) : v
+    },
+    formatDate: function (v) {
+      return v.replace(/T|Z/g, ' ')
+    }
+  },
+
+  methods: {
+    fetchData: function () {
+      var xhr = new XMLHttpRequest()
+      var self = this
+      xhr.open('GET', apiURL + self.currentBranch)
+      xhr.onload = function () {
+        self.commits = JSON.parse(xhr.responseText)
+        console.log(self.commits[0].html_url)
+      }
+      xhr.send()
+    }
+  }
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/examples/commits/index.html b/advancedcontentfilter/vendor/asset/vue/examples/commits/index.html
new file mode 100644 (file)
index 0000000..0b355a2
--- /dev/null
@@ -0,0 +1,47 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <title>Vue.js github commits example</title>
+    <style>
+      #demo {
+        font-family: 'Helvetica', Arial, sans-serif;
+      }
+      a {
+        text-decoration: none;
+        color: #f66;
+      }
+      li {
+        line-height: 1.5em;
+        margin-bottom: 20px;
+      }
+      .author, .date {
+        font-weight: bold;
+      }
+    </style>
+    <!-- Delete ".min" for console warnings in development -->
+    <script src="../../dist/vue.min.js"></script>
+  </head>
+  <body>
+    <div id="demo">
+      <h1>Latest Vue.js Commits</h1>
+      <template v-for="branch in branches">
+        <input type="radio"
+          :id="branch"
+          :value="branch"
+          name="branch"
+          v-model="currentBranch">
+        <label :for="branch">{{ branch }}</label>
+      </template>
+      <p>vuejs/vue@{{ currentBranch }}</p>
+      <ul>
+        <li v-for="record in commits">
+          <a :href="record.html_url" target="_blank" class="commit">{{ record.sha.slice(0, 7) }}</a>
+          - <span class="message">{{ record.commit.message | truncate }}</span><br>
+          by <span class="author"><a :href="record.author.html_url" target="_blank">{{ record.commit.author.name }}</a></span>
+          at <span class="date">{{ record.commit.author.date | formatDate }}</span>
+        </li>
+      </ul>
+    </div>
+    <script src="app.js"></script>
+  </body>
+</html>
diff --git a/advancedcontentfilter/vendor/asset/vue/examples/elastic-header/index.html b/advancedcontentfilter/vendor/asset/vue/examples/elastic-header/index.html
new file mode 100644 (file)
index 0000000..de6d6a2
--- /dev/null
@@ -0,0 +1,105 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no">
+    <title>Vue.js elastic header example</title>
+    <!-- Delete ".min" for console warnings in development -->
+    <script src="../../dist/vue.min.js"></script>
+    <script src="http://dynamicsjs.com/lib/dynamics.js"></script>
+    <link rel="stylesheet" href="style.css">
+    <!-- template for the component -->
+    <script type="text/x-template" id="header-view-template">
+      <div class="draggable-header-view"
+        @mousedown="startDrag" @touchstart="startDrag"
+        @mousemove="onDrag" @touchmove="onDrag"
+        @mouseup="stopDrag" @touchend="stopDrag" @mouseleave="stopDrag">
+        <svg class="bg" width="320" height="560">
+          <path :d="headerPath" fill="#3F51B5"></path>
+        </svg>
+        <div class="header">
+          <slot name="header"></slot>
+        </div>
+        <div class="content" :style="contentPosition">
+          <slot name="content"></slot>
+        </div>
+      </div>
+    </script>
+  </head>
+  <body>
+
+    <div id="app" @touchmove.prevent>
+      <draggable-header-view>
+        <template slot="header">
+          <h1>Elastic Draggable SVG Header</h1>
+          <p>with <a href="https://vuejs.org">Vue.js</a> + <a href="http://dynamicsjs.com">dynamics.js</a></p>
+        </template>
+        <template slot="content">
+          <p>Note this is just an effect demo - there are of course many additional details if you want to use this in production, e.g. handling responsive sizes, reload threshold and content scrolling. Those are out of scope for this quick little hack. However, the idea is that you can hide them as internal details of a Vue.js component and expose a simple Web-Component-like interface.</p>
+        </template>
+      </draggable-header-view>
+    </div>
+
+    <script>
+    Vue.component('draggable-header-view', {
+      template: '#header-view-template',
+      data: function () {
+        return {
+          dragging: false,
+          // quadratic bezier control point
+          c: { x: 160, y: 160 },
+          // record drag start point
+          start: { x: 0, y: 0 }
+        }
+      },
+      computed: {
+        headerPath: function () {
+          return 'M0,0 L320,0 320,160' +
+            'Q' + this.c.x + ',' + this.c.y +
+            ' 0,160'
+        },
+        contentPosition: function () {
+          var dy = this.c.y - 160
+          var dampen = dy > 0 ? 2 : 4
+          return {
+            transform: 'translate3d(0,' + dy / dampen + 'px,0)'
+          }
+        }
+      },
+      methods: {
+        startDrag: function (e) {
+          e = e.changedTouches ? e.changedTouches[0] : e
+          this.dragging = true
+          this.start.x = e.pageX
+          this.start.y = e.pageY
+        },
+        onDrag: function (e) {
+          e = e.changedTouches ? e.changedTouches[0] : e
+          if (this.dragging) {
+            this.c.x = 160 + (e.pageX - this.start.x)
+            // dampen vertical drag by a factor
+            var dy = e.pageY - this.start.y
+            var dampen = dy > 0 ? 1.5 : 4
+            this.c.y = 160 + dy / dampen
+          }
+        },
+        stopDrag: function () {
+          if (this.dragging) {
+            this.dragging = false
+            dynamics.animate(this.c, {
+              x: 160,
+              y: 160
+            }, {
+              type: dynamics.spring,
+              duration: 700,
+              friction: 280
+            })
+          }
+        }
+      }
+    })
+
+    new Vue({ el: '#app' })
+    </script>
+  </body>
+</html>
diff --git a/advancedcontentfilter/vendor/asset/vue/examples/elastic-header/style.css b/advancedcontentfilter/vendor/asset/vue/examples/elastic-header/style.css
new file mode 100644 (file)
index 0000000..6ab44e7
--- /dev/null
@@ -0,0 +1,44 @@
+h1 {
+  font-weight: 300;
+  font-size: 1.8em;
+  margin-top: 0;
+}
+a {
+  color: #fff;
+}
+.draggable-header-view {
+  background-color: #fff;
+  box-shadow: 0 4px 16px rgba(0,0,0,.15);
+  width: 320px;
+  height: 560px;
+  overflow: hidden;
+  margin: 30px auto;
+  position: relative;
+  font-family: 'Roboto', Helvetica, Arial, sans-serif;
+  color: #fff;
+  font-size: 14px;
+  font-weight: 300;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
+.draggable-header-view .bg {
+  position: absolute;
+  top: 0;
+  left: 0;
+  z-index: 0;
+}
+.draggable-header-view .header, .draggable-header-view .content {
+  position: relative;
+  z-index: 1;
+  padding: 30px;
+  box-sizing: border-box;
+}
+.draggable-header-view .header {
+  height: 160px;
+}
+.draggable-header-view .content {
+  color: #333;
+  line-height: 1.5em;
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/examples/firebase/app.js b/advancedcontentfilter/vendor/asset/vue/examples/firebase/app.js
new file mode 100644 (file)
index 0000000..be32903
--- /dev/null
@@ -0,0 +1,57 @@
+var emailRE = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
+
+// Setup Firebase
+var config = {
+  apiKey: "AIzaSyAi_yuJciPXLFr_PYPeU3eTvtXf8jbJ8zw",
+  authDomain: "vue-demo-537e6.firebaseapp.com",
+  databaseURL: "https://vue-demo-537e6.firebaseio.com"
+}
+firebase.initializeApp(config)
+
+var usersRef = firebase.database().ref('users')
+
+// create Vue app
+var app = new Vue({
+  // element to mount to
+  el: '#app',
+  // initial data
+  data: {
+    newUser: {
+      name: '',
+      email: ''
+    }
+  },
+  // firebase binding
+  // https://github.com/vuejs/vuefire
+  firebase: {
+    users: usersRef
+  },
+  // computed property for form validation state
+  computed: {
+    validation: function () {
+      return {
+        name: !!this.newUser.name.trim(),
+        email: emailRE.test(this.newUser.email)
+      }
+    },
+    isValid: function () {
+      var validation = this.validation
+      return Object.keys(validation).every(function (key) {
+        return validation[key]
+      })
+    }
+  },
+  // methods
+  methods: {
+    addUser: function () {
+      if (this.isValid) {
+        usersRef.push(this.newUser)
+        this.newUser.name = ''
+        this.newUser.email = ''
+      }
+    },
+    removeUser: function (user) {
+      usersRef.child(user['.key']).remove()
+    }
+  }
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/examples/firebase/index.html b/advancedcontentfilter/vendor/asset/vue/examples/firebase/index.html
new file mode 100644 (file)
index 0000000..5b1cf3d
--- /dev/null
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <title>Vue.js firebase + validation example</title>
+    <meta charset="utf-8">
+    <link rel="stylesheet" type="text/css" href="style.css">
+    <!-- Vue -->
+    <!-- Delete ".min" for console warnings in development -->
+    <script src="../../dist/vue.min.js"></script>
+    <!-- Firebase -->
+    <script src="https://www.gstatic.com/firebasejs/3.4.0/firebase.js"></script>
+    <!-- VueFire -->
+    <script src="https://unpkg.com/vuefire@1.3.0"></script>
+  </head>
+  <body>
+    <div id="app">
+      <ul is="transition-group">
+        <li v-for="user in users" class="user" :key="user['.key']">
+          <span>{{user.name}} - {{user.email}}</span>
+          <button v-on:click="removeUser(user)">X</button>
+        </li>
+      </ul>
+      <form id="form" v-on:submit.prevent="addUser">
+        <input v-model="newUser.name">
+        <input v-model="newUser.email">
+        <input type="submit" value="Add User">
+      </form>
+      <ul class="errors">
+        <li v-show="!validation.name">Name cannot be empty.</li>
+        <li v-show="!validation.email">Please provide a valid email address.</li>
+      </ul>
+    </div>
+    <script src="app.js"></script>
+  </body>
+</html>
diff --git a/advancedcontentfilter/vendor/asset/vue/examples/firebase/style.css b/advancedcontentfilter/vendor/asset/vue/examples/firebase/style.css
new file mode 100644 (file)
index 0000000..369ab1c
--- /dev/null
@@ -0,0 +1,32 @@
+body {
+  font-family: Helvetica, Arial, sans-serif;
+}
+
+ul {
+  padding: 0;
+}
+
+.user {
+  height: 30px;
+  line-height: 30px;
+  padding: 10px;
+  border-top: 1px solid #eee;
+  overflow: hidden;
+  transition: all .25s ease;
+}
+
+.user:last-child {
+  border-bottom: 1px solid #eee;
+}
+
+.v-enter, .v-leave-to {
+  height: 0;
+  padding-top: 0;
+  padding-bottom: 0;
+  border-top-width: 0;
+  border-bottom-width: 0;
+}
+
+.errors {
+  color: #f00;
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/examples/grid/grid.js b/advancedcontentfilter/vendor/asset/vue/examples/grid/grid.js
new file mode 100644 (file)
index 0000000..8566f1e
--- /dev/null
@@ -0,0 +1,69 @@
+// register the grid component
+Vue.component('demo-grid', {
+  template: '#grid-template',
+  replace: true,
+  props: {
+    data: Array,
+    columns: Array,
+    filterKey: String
+  },
+  data: function () {
+    var sortOrders = {}
+    this.columns.forEach(function (key) {
+      sortOrders[key] = 1
+    })
+    return {
+      sortKey: '',
+      sortOrders: sortOrders
+    }
+  },
+  computed: {
+    filteredData: function () {
+      var sortKey = this.sortKey
+      var filterKey = this.filterKey && this.filterKey.toLowerCase()
+      var order = this.sortOrders[sortKey] || 1
+      var data = this.data
+      if (filterKey) {
+        data = data.filter(function (row) {
+          return Object.keys(row).some(function (key) {
+            return String(row[key]).toLowerCase().indexOf(filterKey) > -1
+          })
+        })
+      }
+      if (sortKey) {
+        data = data.slice().sort(function (a, b) {
+          a = a[sortKey]
+          b = b[sortKey]
+          return (a === b ? 0 : a > b ? 1 : -1) * order
+        })
+      }
+      return data
+    }
+  },
+  filters: {
+    capitalize: function (str) {
+      return str.charAt(0).toUpperCase() + str.slice(1)
+    }
+  },
+  methods: {
+    sortBy: function (key) {
+      this.sortKey = key
+      this.sortOrders[key] = this.sortOrders[key] * -1
+    }
+  }
+})
+
+// bootstrap the demo
+var demo = new Vue({
+  el: '#demo',
+  data: {
+    searchQuery: '',
+    gridColumns: ['name', 'power'],
+    gridData: [
+      { name: 'Chuck Norris', power: Infinity },
+      { name: 'Bruce Lee', power: 9000 },
+      { name: 'Jackie Chan', power: 7000 },
+      { name: 'Jet Li', power: 8000 }
+    ]
+  }
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/examples/grid/index.html b/advancedcontentfilter/vendor/asset/vue/examples/grid/index.html
new file mode 100644 (file)
index 0000000..d668cd7
--- /dev/null
@@ -0,0 +1,52 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <title>Vue.js grid component example</title>
+    <link rel="stylesheet" href="style.css">
+    <!-- Delete ".min" for console warnings in development -->
+    <script src="../../dist/vue.min.js"></script>
+    </head>
+  <body>
+
+    <!-- component template -->
+    <script type="text/x-template" id="grid-template">
+      <table v-if="filteredData.length">
+        <thead>
+          <tr>
+            <th v-for="key in columns"
+              @click="sortBy(key)"
+              :class="{ active: sortKey == key }">
+              {{ key | capitalize }}
+              <span class="arrow" :class="sortOrders[key] > 0 ? 'asc' : 'dsc'">
+              </span>
+            </th>
+          </tr>
+        </thead>
+        <tbody>
+          <tr v-for="entry in filteredData">
+            <td v-for="key in columns">
+              {{entry[key]}}
+            </td>
+          </tr>
+        </tbody>
+      </table>
+      <p v-else>No matches found.</p>
+    </script>
+
+    <!-- demo root element -->
+    <div id="demo">
+      <form id="search">
+        Search <input name="query" v-model="searchQuery">
+      </form>
+      <demo-grid
+        :data="gridData"
+        :columns="gridColumns"
+        :filter-key="searchQuery">
+      </demo-grid>
+    </div>
+
+    <script src="grid.js"></script>
+
+  </body>
+</html>
diff --git a/advancedcontentfilter/vendor/asset/vue/examples/grid/style.css b/advancedcontentfilter/vendor/asset/vue/examples/grid/style.css
new file mode 100644 (file)
index 0000000..2221ea4
--- /dev/null
@@ -0,0 +1,59 @@
+body {
+  font-family: Helvetica Neue, Arial, sans-serif;
+  font-size: 14px;
+  color: #444;
+}
+
+table {
+  border: 2px solid #42b983;
+  border-radius: 3px;
+  background-color: #fff;
+}
+
+th {
+  background-color: #42b983;
+  color: rgba(255,255,255,0.66);
+  cursor: pointer;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
+
+td {
+  background-color: #f9f9f9;
+}
+
+th, td {
+  min-width: 120px;
+  padding: 10px 20px;
+}
+
+th.active {
+  color: #fff;
+}
+
+th.active .arrow {
+  opacity: 1;
+}
+
+.arrow {
+  display: inline-block;
+  vertical-align: middle;
+  width: 0;
+  height: 0;
+  margin-left: 5px;
+  opacity: 0.66;
+}
+
+.arrow.asc {
+  border-left: 4px solid transparent;
+  border-right: 4px solid transparent;
+  border-bottom: 4px solid #fff;
+}
+
+.arrow.dsc {
+  border-left: 4px solid transparent;
+  border-right: 4px solid transparent;
+  border-top: 4px solid #fff;
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/examples/markdown/index.html b/advancedcontentfilter/vendor/asset/vue/examples/markdown/index.html
new file mode 100644 (file)
index 0000000..9ca9874
--- /dev/null
@@ -0,0 +1,39 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <title>Vue.js markdown editor example</title>
+    <link rel="stylesheet" href="style.css">
+    <script src="https://unpkg.com/marked@0.3.6"></script>
+    <script src="https://unpkg.com/lodash@4.16.0"></script>
+    <!-- Delete ".min" for console warnings in development -->
+    <script src="../../dist/vue.min.js"></script>
+  </head>
+  <body>
+
+    <div id="editor">
+      <textarea :value="input" @input="update"></textarea>
+      <div v-html="compiledMarkdown"></div>
+    </div>
+
+    <script>
+      new Vue({
+        el: '#editor',
+        data: {
+          input: '# hello'
+        },
+        computed: {
+          compiledMarkdown: function () {
+            return marked(this.input, { sanitize: true })
+          }
+        },
+        methods: {
+          update: _.debounce(function (e) {
+            this.input = e.target.value
+          }, 300)
+        }
+      })
+    </script>
+
+  </body>
+</html>
diff --git a/advancedcontentfilter/vendor/asset/vue/examples/markdown/style.css b/advancedcontentfilter/vendor/asset/vue/examples/markdown/style.css
new file mode 100644 (file)
index 0000000..2c8ea42
--- /dev/null
@@ -0,0 +1,32 @@
+html, body, #editor {
+  margin: 0;
+  height: 100%;
+  font-family: 'Helvetica Neue', Arial, sans-serif;
+  color: #333;
+}
+
+textarea, #editor div {
+  display: inline-block;
+  width: 49%;
+  height: 100%;
+  vertical-align: top;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+  padding: 0 20px;
+}
+
+textarea {
+  border: none;
+  border-right: 1px solid #ccc;
+  resize: none;
+  outline: none;
+  background-color: #f6f6f6;
+  font-size: 14px;
+  font-family: 'Monaco', courier, monospace;
+  padding: 20px;
+}
+
+code {
+  color: #f66;
+}
\ No newline at end of file
diff --git a/advancedcontentfilter/vendor/asset/vue/examples/modal/index.html b/advancedcontentfilter/vendor/asset/vue/examples/modal/index.html
new file mode 100644 (file)
index 0000000..e212161
--- /dev/null
@@ -0,0 +1,72 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <title>Vue.js modal component example</title>
+    <!-- Delete ".min" for console warnings in development -->
+    <script src="../../dist/vue.min.js"></script>
+    <link rel="stylesheet" href="style.css">
+  </head>
+  <body>
+    <!-- template for the modal component -->
+    <script type="text/x-template" id="modal-template">
+      <transition name="modal">
+        <div class="modal-mask">
+          <div class="modal-wrapper">
+            <div class="modal-container">
+
+              <div class="modal-header">
+                <slot name="header">
+                  default header
+                </slot>
+              </div>
+
+              <div class="modal-body">
+                <slot name="body">
+                  default body
+                </slot>
+              </div>
+
+              <div class="modal-footer">
+                <slot name="footer">
+                  default footer
+                  <button class="modal-default-button" @click="$emit('close')">
+                    OK
+                  </button>
+                </slot>
+              </div>
+            </div>
+          </div>
+        </div>
+      </transition>
+    </script>
+
+    <!-- app -->
+    <div id="app">
+      <button id="show-modal" @click="showModal = true">Show Modal</button>
+      <!-- use the modal component, pass in the prop -->
+      <modal v-if="showModal" @close="showModal = false">
+        <!--
+          you can use custom content here to overwrite
+          default content
+        -->
+        <h3 slot="header">custom header</h3>
+      </modal>
+    </div>
+
+    <script>
+      // register modal component
+      Vue.component('modal', {
+        template: '#modal-template'
+      })
+
+      // start app
+      new Vue({
+        el: '#app',
+        data: {
+          showModal: false
+        }
+      })
+    </script>
+  </body>
+</html>
diff --git a/advancedcontentfilter/vendor/asset/vue/examples/modal/style.css b/advancedcontentfilter/vendor/asset/vue/examples/modal/style.css
new file mode 100644 (file)
index 0000000..4556315
--- /dev/null
@@ -0,0 +1,63 @@
+.modal-mask {
+  position: fixed;
+  z-index: 9998;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  background-color: rgba(0, 0, 0, .5);
+  display: table;
+  transition: opacity .3s ease;
+}
+
+.modal-wrapper {
+  display: table-cell;
+  vertical-align: middle;
+}
+
+.modal-container {
+  width: 300px;
+  margin: 0px auto;
+  padding: 20px 30px;
+  background-color: #fff;
+  border-radius: 2px;
+  box-shadow: 0 2px 8px rgba(0, 0, 0, .33);
+  transition: all .3s ease;
+  font-family: Helvetica, Arial, sans-serif;
+}
+
+.modal-header h3 {
+  margin-top: 0;
+  color: #42b983;
+}
+
+.modal-body {
+  margin: 20px 0;
+}
+
+.modal-default-button {
+  float: right;
+}
+
+/*
+ * The following styles are auto-applied to elements with
+ * transition="modal" when their visibility is toggled
+ * by Vue.js.
+ *
+ * You can easily play with the modal transition by editing
+ * these styles.
+ */
+
+.modal-enter {
+  opacity: 0;
+}
+
+.modal-leave-to {
+  opacity: 0;
+}
+
+.modal-enter .modal-container,
+.modal-leave-to .modal-container {
+  -webkit-transform: scale(1.1);
+  transform: scale(1.1);
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/examples/move-animations/index.html b/advancedcontentfilter/vendor/asset/vue/examples/move-animations/index.html
new file mode 100644 (file)
index 0000000..46819ad
--- /dev/null
@@ -0,0 +1,88 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <title>Move Animations</title>
+    <style>
+      .container {
+        position: relative;
+        padding: 0;
+      }
+      .item {
+        width: 100%;
+        height: 30px;
+        background-color: #f3f3f3;
+        border: 1px solid #666;
+        box-sizing: border-box;
+      }
+      /* 1. declare transition */
+      .fade-move, .fade-enter-active, .fade-leave-active {
+        transition: all .5s cubic-bezier(.55,0,.1,1);
+      }
+      /* 2. declare enter from and leave to state */
+      .fade-enter, .fade-leave-to {
+        opacity: 0;
+        transform: scaleY(0.01) translate(30px, 0);
+      }
+      /* 3. ensure leaving items are taken out of layout flow so that moving
+            animations can be calculated correctly. */
+      .fade-leave-active {
+        position: absolute;
+      }
+    </style>
+    <script src="https://cdn.jsdelivr.net/lodash/4.3.0/lodash.min.js"></script>
+    <!-- Delete ".min" for console warnings in development -->
+    <script src="../../dist/vue.min.js"></script>
+  </head>
+  <body>
+    <div id="el">
+      <button @click="insert">insert at random index</button>
+      <button @click="reset">reset</button>
+      <button @click="shuffle">shuffle</button>
+      <transition-group tag="ul" name="fade" class="container">
+        <item v-for="item in items"
+          class="item"
+          :msg="item"
+          :key="item"
+          @rm="remove(item)">
+        </item>
+      </transition-group>
+    </div>
+
+    <script>
+      var items = [1, 2, 3, 4, 5]
+      var id = items.length + 1
+
+      var vm = new Vue({
+        el: '#el',
+        data: {
+          items: items
+        },
+        components: {
+          item: {
+            props: ['msg'],
+            template: `<div>{{ msg }} <button @click="$emit('rm')">x</button></div>`
+          }
+        },
+        methods: {
+          insert () {
+            var i = Math.round(Math.random() * this.items.length)
+            this.items.splice(i, 0, id++)
+          },
+          reset () {
+            this.items = [1, 2, 3, 4, 5]
+          },
+          shuffle () {
+            this.items = _.shuffle(this.items)
+          },
+          remove (item) {
+            var i = this.items.indexOf(item)
+            if (i > -1) {
+              this.items.splice(i, 1)
+            }
+          }
+        }
+      })
+    </script>
+  </body>
+</html>
diff --git a/advancedcontentfilter/vendor/asset/vue/examples/select2/index.html b/advancedcontentfilter/vendor/asset/vue/examples/select2/index.html
new file mode 100644 (file)
index 0000000..e27e0ef
--- /dev/null
@@ -0,0 +1,84 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <title>Vue.js wrapper component example (jquery plugin: select2)</title>
+    <!-- Delete ".min" for console warnings in development -->
+    <script src="../../dist/vue.min.js"></script>
+    <script src="https://unpkg.com/jquery"></script>
+    <script src="https://unpkg.com/select2@4.0.3"></script>
+    <link href="https://unpkg.com/select2@4.0.3/dist/css/select2.min.css" rel="stylesheet">
+    <style>
+      html, body {
+        font: 13px/18px sans-serif;
+      }
+      select {
+        min-width: 300px;
+      }
+    </style>
+  </head>
+  <body>
+
+    <div id="el">
+    </div>
+
+    <!-- using string template here to work around HTML <option> placement restriction -->
+    <script type="text/x-template" id="demo-template">
+      <div>
+        <p>Selected: {{ selected }}</p>
+        <select2 :options="options" v-model="selected">
+          <option disabled value="0">Select one</option>
+        </select2>
+      </div>
+    </script>
+
+    <script type="text/x-template" id="select2-template">
+      <select>
+        <slot></slot>
+      </select>
+    </script>
+
+    <script>
+    Vue.component('select2', {
+      props: ['options', 'value'],
+      template: '#select2-template',
+      mounted: function () {
+        var vm = this
+        $(this.$el)
+          .val(this.value)
+          // init select2
+          .select2({ data: this.options })
+          // emit event on change.
+          .on('change', function () {
+            vm.$emit('input', this.value)
+          })
+      },
+      watch: {
+        value: function (value) {
+          // update value
+          $(this.$el).val(value).trigger('change')
+        },
+        options: function (options) {
+          // update options
+          $(this.$el).select2({ data: options })
+        }
+      },
+      destroyed: function () {
+        $(this.$el).off().select2('destroy')
+      }
+    })
+
+    var vm = new Vue({
+      el: '#el',
+      template: '#demo-template',
+      data: {
+        selected: 0,
+        options: [
+          { id: 1, text: 'Hello' },
+          { id: 2, text: 'World' }
+        ]
+      }
+    })
+    </script>
+  </body>
+</html>
diff --git a/advancedcontentfilter/vendor/asset/vue/examples/svg/index.html b/advancedcontentfilter/vendor/asset/vue/examples/svg/index.html
new file mode 100644 (file)
index 0000000..e50fc80
--- /dev/null
@@ -0,0 +1,57 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <title>Vue.js SVG graph example</title>
+    <link rel="stylesheet" href="style.css">
+    <!-- Delete ".min" for console warnings in development -->
+    <script src="../../dist/vue.min.js"></script>
+    <script src="https://unpkg.com/marky/dist/marky.min.js"></script>
+  </head>
+  <body>
+
+    <!-- template for the polygraph component. -->
+    <script type="text/x-template" id="polygraph-template">
+      <g>
+        <polygon :points="points"></polygon>
+        <circle cx="100" cy="100" r="80"></circle>
+        <axis-label
+          v-for="(stat, index) in stats"
+          :stat="stat"
+          :index="index"
+          :total="stats.length">
+        </axis-label>
+      </g>
+    </script>
+
+    <!-- template for the axis label component. -->
+    <script type="text/x-template" id="axis-label-template">
+      <text :x="point.x" :y="point.y">{{stat.label}}</text>
+    </script>
+
+    <!-- demo root element -->
+    <div id="demo">
+      <!-- Use the component -->
+      <svg width="200" height="200">
+        <polygraph :stats="stats"></polygraph>
+      </svg>
+      <!-- controls -->
+      <div v-for="stat in stats">
+        <label>{{stat.label}}</label>
+        <input type="range" v-model="stat.value" min="0" max="100">
+        <span>{{stat.value}}</span>
+        <button @click="remove(stat)" class="remove">X</button>
+      </div>
+      <form id="add">
+        <input name="newlabel" v-model="newLabel">
+        <button @click="add">Add a Stat</button>
+      </form>
+      <pre id="raw">{{ stats }}</pre>
+    </div>
+
+    <p style="font-size:12px">* input[type="range"] requires IE10 or above.</p>
+
+    <script src="svg.js"></script>
+
+  </body>
+</html>
diff --git a/advancedcontentfilter/vendor/asset/vue/examples/svg/style.css b/advancedcontentfilter/vendor/asset/vue/examples/svg/style.css
new file mode 100644 (file)
index 0000000..1b61253
--- /dev/null
@@ -0,0 +1,31 @@
+body {
+    font-family: Helvetica Neue, Arial, sans-serif;
+}
+
+polygon {
+    fill: #42b983;
+    opacity: .75;
+}
+
+circle {
+    fill: transparent;
+    stroke: #999;
+}
+
+text {
+    font-family: Helvetica Neue, Arial, sans-serif;
+    font-size: 10px;
+    fill: #666;
+}
+
+label {
+    display: inline-block;
+    margin-left: 10px;
+    width: 20px;
+}
+
+#raw {
+    position: absolute;
+    top: 0;
+    left: 300px;
+}
\ No newline at end of file
diff --git a/advancedcontentfilter/vendor/asset/vue/examples/svg/svg.js b/advancedcontentfilter/vendor/asset/vue/examples/svg/svg.js
new file mode 100644 (file)
index 0000000..f4491ce
--- /dev/null
@@ -0,0 +1,87 @@
+// The raw data to observe
+var stats = [
+  { label: 'A', value: 100 },
+  { label: 'B', value: 100 },
+  { label: 'C', value: 100 },
+  { label: 'D', value: 100 },
+  { label: 'E', value: 100 },
+  { label: 'F', value: 100 }
+]
+
+// A reusable polygon graph component
+Vue.component('polygraph', {
+  props: ['stats'],
+  template: '#polygraph-template',
+  computed: {
+    // a computed property for the polygon's points
+    points: function () {
+      var total = this.stats.length
+      return this.stats.map(function (stat, i) {
+        var point = valueToPoint(stat.value, i, total)
+        return point.x + ',' + point.y
+      }).join(' ')
+    }
+  },
+  components: {
+    // a sub component for the labels
+    'axis-label': {
+      props: {
+        stat: Object,
+        index: Number,
+        total: Number
+      },
+      template: '#axis-label-template',
+      computed: {
+        point: function () {
+          return valueToPoint(
+            +this.stat.value + 10,
+            this.index,
+            this.total
+          )
+        }
+      }
+    }
+  }
+})
+
+// math helper...
+function valueToPoint (value, index, total) {
+  var x     = 0
+  var y     = -value * 0.8
+  var angle = Math.PI * 2 / total * index
+  var cos   = Math.cos(angle)
+  var sin   = Math.sin(angle)
+  var tx    = x * cos - y * sin + 100
+  var ty    = x * sin + y * cos + 100
+  return {
+    x: tx,
+    y: ty
+  }
+}
+
+// bootstrap the demo
+new Vue({
+  el: '#demo',
+  data: {
+    newLabel: '',
+    stats: stats
+  },
+  methods: {
+    add: function (e) {
+      e.preventDefault()
+      if (!this.newLabel) return
+      this.stats.push({
+        label: this.newLabel,
+        value: 100
+      })
+      this.newLabel = ''
+    },
+    remove: function (stat) {
+      if (this.stats.length > 3) {
+        this.stats.splice(this.stats.indexOf(stat), 1)
+      } else {
+        alert('Can\'t delete more!')
+      }
+    }
+  }
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/examples/todomvc/app.js b/advancedcontentfilter/vendor/asset/vue/examples/todomvc/app.js
new file mode 100644 (file)
index 0000000..f8bfeb1
--- /dev/null
@@ -0,0 +1,157 @@
+// Full spec-compliant TodoMVC with localStorage persistence
+// and hash-based routing in ~150 lines.
+
+// localStorage persistence
+var STORAGE_KEY = 'todos-vuejs-2.0'
+var todoStorage = {
+  fetch: function () {
+    var todos = JSON.parse(localStorage.getItem(STORAGE_KEY) || '[]')
+    todos.forEach(function (todo, index) {
+      todo.id = index
+    })
+    todoStorage.uid = todos.length
+    return todos
+  },
+  save: function (todos) {
+    localStorage.setItem(STORAGE_KEY, JSON.stringify(todos))
+  }
+}
+
+// visibility filters
+var filters = {
+  all: function (todos) {
+    return todos
+  },
+  active: function (todos) {
+    return todos.filter(function (todo) {
+      return !todo.completed
+    })
+  },
+  completed: function (todos) {
+    return todos.filter(function (todo) {
+      return todo.completed
+    })
+  }
+}
+
+// app Vue instance
+var app = new Vue({
+  // app initial state
+  data: {
+    todos: todoStorage.fetch(),
+    newTodo: '',
+    editedTodo: null,
+    visibility: 'all'
+  },
+
+  // watch todos change for localStorage persistence
+  watch: {
+    todos: {
+      handler: function (todos) {
+        todoStorage.save(todos)
+      },
+      deep: true
+    }
+  },
+
+  // computed properties
+  // https://vuejs.org/guide/computed.html
+  computed: {
+    filteredTodos: function () {
+      return filters[this.visibility](this.todos)
+    },
+    remaining: function () {
+      return filters.active(this.todos).length
+    },
+    allDone: {
+      get: function () {
+        return this.remaining === 0
+      },
+      set: function (value) {
+        this.todos.forEach(function (todo) {
+          todo.completed = value
+        })
+      }
+    }
+  },
+
+  filters: {
+    pluralize: function (n) {
+      return n === 1 ? 'item' : 'items'
+    }
+  },
+
+  // methods that implement data logic.
+  // note there's no DOM manipulation here at all.
+  methods: {
+    addTodo: function () {
+      var value = this.newTodo && this.newTodo.trim()
+      if (!value) {
+        return
+      }
+      this.todos.push({
+        id: todoStorage.uid++,
+        title: value,
+        completed: false
+      })
+      this.newTodo = ''
+    },
+
+    removeTodo: function (todo) {
+      this.todos.splice(this.todos.indexOf(todo), 1)
+    },
+
+    editTodo: function (todo) {
+      this.beforeEditCache = todo.title
+      this.editedTodo = todo
+    },
+
+    doneEdit: function (todo) {
+      if (!this.editedTodo) {
+        return
+      }
+      this.editedTodo = null
+      todo.title = todo.title.trim()
+      if (!todo.title) {
+        this.removeTodo(todo)
+      }
+    },
+
+    cancelEdit: function (todo) {
+      this.editedTodo = null
+      todo.title = this.beforeEditCache
+    },
+
+    removeCompleted: function () {
+      this.todos = filters.active(this.todos)
+    }
+  },
+
+  // a custom directive to wait for the DOM to be updated
+  // before focusing on the input field.
+  // https://vuejs.org/guide/custom-directive.html
+  directives: {
+    'todo-focus': function (el, binding) {
+      if (binding.value) {
+        el.focus()
+      }
+    }
+  }
+})
+
+// handle routing
+function onHashChange () {
+  var visibility = window.location.hash.replace(/#\/?/, '')
+  if (filters[visibility]) {
+    app.visibility = visibility
+  } else {
+    window.location.hash = ''
+    app.visibility = 'all'
+  }
+}
+
+window.addEventListener('hashchange', onHashChange)
+onHashChange()
+
+// mount
+app.$mount('.todoapp')
diff --git a/advancedcontentfilter/vendor/asset/vue/examples/todomvc/index.html b/advancedcontentfilter/vendor/asset/vue/examples/todomvc/index.html
new file mode 100644 (file)
index 0000000..edf28d8
--- /dev/null
@@ -0,0 +1,69 @@
+<!doctype html>
+<html data-framework="vue">
+  <head>
+    <meta charset="utf-8">
+    <title>Vue.js • TodoMVC</title>
+    <link rel="stylesheet" href="https://unpkg.com/todomvc-app-css@2.0.4/index.css">
+    <script src="https://unpkg.com/director@1.2.8/build/director.js"></script>
+    <style>[v-cloak] { display: none; }</style>
+  </head>
+  <body>
+    <section class="todoapp">
+      <header class="header">
+        <h1>todos</h1>
+        <input class="new-todo"
+          autofocus autocomplete="off"
+          placeholder="What needs to be done?"
+          v-model="newTodo"
+          @keyup.enter="addTodo">
+      </header>
+      <section class="main" v-show="todos.length" v-cloak>
+        <input class="toggle-all" type="checkbox" v-model="allDone">
+        <ul class="todo-list">
+          <li v-for="todo in filteredTodos"
+            class="todo"
+            :key="todo.id"
+            :class="{ completed: todo.completed, editing: todo == editedTodo }">
+            <div class="view">
+              <input class="toggle" type="checkbox" v-model="todo.completed">
+              <label @dblclick="editTodo(todo)">{{ todo.title }}</label>
+              <button class="destroy" @click="removeTodo(todo)"></button>
+            </div>
+            <input class="edit" type="text"
+              v-model="todo.title"
+              v-todo-focus="todo == editedTodo"
+              @blur="doneEdit(todo)"
+              @keyup.enter="doneEdit(todo)"
+              @keyup.esc="cancelEdit(todo)">
+          </li>
+        </ul>
+      </section>
+      <footer class="footer" v-show="todos.length" v-cloak>
+        <span class="todo-count">
+          <strong>{{ remaining }}</strong> {{ remaining | pluralize }} left
+        </span>
+        <ul class="filters">
+          <li><a href="#/all" :class="{ selected: visibility == 'all' }">All</a></li>
+          <li><a href="#/active" :class="{ selected: visibility == 'active' }">Active</a></li>
+          <li><a href="#/completed" :class="{ selected: visibility == 'completed' }">Completed</a></li>
+        </ul>
+        <button class="clear-completed" @click="removeCompleted" v-show="todos.length > remaining">
+          Clear completed
+        </button>
+      </footer>
+    </section>
+    <footer class="info">
+      <p>Double-click to edit a todo</p>
+      <p>Written by <a href="http://evanyou.me">Evan You</a></p>
+      <p>Part of <a href="http://todomvc.com">TodoMVC</a></p>
+    </footer>
+
+    <script>
+    // for testing
+    if (navigator.userAgent.indexOf('PhantomJS') > -1) localStorage.clear()
+    </script>
+    <!-- Delete ".min" for console warnings in development -->
+    <script src="../../dist/vue.min.js"></script>
+    <script src="app.js"></script>
+  </body>
+</html>
diff --git a/advancedcontentfilter/vendor/asset/vue/examples/todomvc/readme.md b/advancedcontentfilter/vendor/asset/vue/examples/todomvc/readme.md
new file mode 100644 (file)
index 0000000..3155b80
--- /dev/null
@@ -0,0 +1,27 @@
+# Vue.js TodoMVC Example
+
+> Vue.js is a library for building interactive web interfaces. 
+It provides data-driven, nestable view components with a simple and flexible API.
+
+> _[Vue.js - vuejs.org](https://vuejs.org)_
+
+## Learning Vue.js
+The [Vue.js website](https://vuejs.org/) is a great resource to get started.
+
+Here are some links you may find helpful:
+
+* [Official Guide](https://vuejs.org/guide/)
+* [API Reference](https://vuejs.org/api/)
+* [Examples](https://vuejs.org/examples/)
+
+Get help from other Vue.js users:
+
+* [Vue.js official forum](http://forum.vuejs.org)
+* [Vue.js on Twitter](https://twitter.com/vuejs)
+* [Vue.js on Gitter](https://gitter.im/vuejs/vue)
+
+_If you have other helpful links to share, or find any of the links above no longer work, please [let us know](https://github.com/tastejs/todomvc/issues)._
+
+## Credit
+
+This TodoMVC application was created by [Evan You](http://evanyou.me).
diff --git a/advancedcontentfilter/vendor/asset/vue/examples/tree/index.html b/advancedcontentfilter/vendor/asset/vue/examples/tree/index.html
new file mode 100644 (file)
index 0000000..bfb9db4
--- /dev/null
@@ -0,0 +1,62 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <title>Vue.js tree view example</title>
+    <style>
+      body {
+        font-family: Menlo, Consolas, monospace;
+        color: #444;
+      }
+      .item {
+        cursor: pointer;
+      }
+      .bold {
+        font-weight: bold;
+      }
+      ul {
+        padding-left: 1em;
+        line-height: 1.5em;
+        list-style-type: dot;
+      }
+    </style>
+    <!-- Delete ".min" for console warnings in development -->
+    <script src="../../dist/vue.min.js"></script>
+  </head>
+  <body>
+
+    <!-- item template -->
+    <script type="text/x-template" id="item-template">
+      <li>
+        <div
+          :class="{bold: isFolder}"
+          @click="toggle"
+          @dblclick="changeType">
+          {{model.name}}
+          <span v-if="isFolder">[{{open ? '-' : '+'}}]</span>
+        </div>
+        <ul v-show="open" v-if="isFolder">
+          <item
+            class="item"
+            v-for="model in model.children"
+            :model="model">
+          </item>
+          <li class="add" @click="addChild">+</li>
+        </ul>
+      </li>
+    </script>
+
+    <p>(You can double click on an item to turn it into a folder.)</p>
+
+    <!-- the demo root element -->
+    <ul id="demo">
+      <item
+        class="item"
+        :model="treeData">
+      </item>
+    </ul>
+
+    <!-- demo code -->
+    <script src="tree.js"></script>
+  </body>
+</html>
diff --git a/advancedcontentfilter/vendor/asset/vue/examples/tree/tree.js b/advancedcontentfilter/vendor/asset/vue/examples/tree/tree.js
new file mode 100644 (file)
index 0000000..eb66c58
--- /dev/null
@@ -0,0 +1,75 @@
+// demo data
+var data = {
+  name: 'My Tree',
+  children: [
+    { name: 'hello' },
+    { name: 'wat' },
+    {
+      name: 'child folder',
+      children: [
+        {
+          name: 'child folder',
+          children: [
+            { name: 'hello' },
+            { name: 'wat' }
+          ]
+        },
+        { name: 'hello' },
+        { name: 'wat' },
+        {
+          name: 'child folder',
+          children: [
+            { name: 'hello' },
+            { name: 'wat' }
+          ]
+        }
+      ]
+    }
+  ]
+}
+
+// define the item component
+Vue.component('item', {
+  template: '#item-template',
+  props: {
+    model: Object
+  },
+  data: function () {
+    return {
+      open: false
+    }
+  },
+  computed: {
+    isFolder: function () {
+      return this.model.children &&
+        this.model.children.length
+    }
+  },
+  methods: {
+    toggle: function () {
+      if (this.isFolder) {
+        this.open = !this.open
+      }
+    },
+    changeType: function () {
+      if (!this.isFolder) {
+        Vue.set(this.model, 'children', [])
+        this.addChild()
+        this.open = true
+      }
+    },
+    addChild: function () {
+      this.model.children.push({
+        name: 'new stuff'
+      })
+    }
+  }
+})
+
+// boot up the demo
+var demo = new Vue({
+  el: '#demo',
+  data: {
+    treeData: data
+  }
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/flow/compiler.js b/advancedcontentfilter/vendor/asset/vue/flow/compiler.js
new file mode 100644 (file)
index 0000000..a3dc1c9
--- /dev/null
@@ -0,0 +1,194 @@
+declare type CompilerOptions = {
+  warn?: Function; // allow customizing warning in different environments; e.g. node
+  modules?: Array<ModuleOptions>; // platform specific modules; e.g. style; class
+  directives?: { [key: string]: Function }; // platform specific directives
+  staticKeys?: string; // a list of AST properties to be considered static; for optimization
+  isUnaryTag?: (tag: string) => ?boolean; // check if a tag is unary for the platform
+  canBeLeftOpenTag?: (tag: string) => ?boolean; // check if a tag can be left opened
+  isReservedTag?: (tag: string) => ?boolean; // check if a tag is a native for the platform
+  preserveWhitespace?: boolean; // preserve whitespace between elements?
+  optimize?: boolean; // optimize static content?
+
+  // web specific
+  mustUseProp?: (tag: string, type: ?string, name: string) => boolean; // check if an attribute should be bound as a property
+  isPreTag?: (attr: string) => ?boolean; // check if a tag needs to preserve whitespace
+  getTagNamespace?: (tag: string) => ?string; // check the namespace for a tag
+  expectHTML?: boolean; // only false for non-web builds
+  isFromDOM?: boolean;
+  shouldDecodeTags?: boolean;
+  shouldDecodeNewlines?:  boolean;
+  shouldDecodeNewlinesForHref?: boolean;
+
+  // runtime user-configurable
+  delimiters?: [string, string]; // template delimiters
+  comments?: boolean; // preserve comments in template
+
+  // for ssr optimization compiler
+  scopeId?: string;
+};
+
+declare type CompiledResult = {
+  ast: ?ASTElement;
+  render: string;
+  staticRenderFns: Array<string>;
+  stringRenderFns?: Array<string>;
+  errors?: Array<string>;
+  tips?: Array<string>;
+};
+
+declare type ModuleOptions = {
+  // transform an AST node before any attributes are processed
+  // returning an ASTElement from pre/transforms replaces the element
+  preTransformNode: (el: ASTElement) => ?ASTElement;
+  // transform an AST node after built-ins like v-if, v-for are processed
+  transformNode: (el: ASTElement) => ?ASTElement;
+  // transform an AST node after its children have been processed
+  // cannot return replacement in postTransform because tree is already finalized
+  postTransformNode: (el: ASTElement) => void;
+  genData: (el: ASTElement) => string; // generate extra data string for an element
+  transformCode?: (el: ASTElement, code: string) => string; // further transform generated code for an element
+  staticKeys?: Array<string>; // AST properties to be considered static
+};
+
+declare type ASTModifiers = { [key: string]: boolean };
+declare type ASTIfCondition = { exp: ?string; block: ASTElement };
+declare type ASTIfConditions = Array<ASTIfCondition>;
+
+declare type ASTElementHandler = {
+  value: string;
+  params?: Array<any>;
+  modifiers: ?ASTModifiers;
+};
+
+declare type ASTElementHandlers = {
+  [key: string]: ASTElementHandler | Array<ASTElementHandler>;
+};
+
+declare type ASTDirective = {
+  name: string;
+  rawName: string;
+  value: string;
+  arg: ?string;
+  modifiers: ?ASTModifiers;
+};
+
+declare type ASTNode = ASTElement | ASTText | ASTExpression;
+
+declare type ASTElement = {
+  type: 1;
+  tag: string;
+  attrsList: Array<{ name: string; value: any }>;
+  attrsMap: { [key: string]: any };
+  parent: ASTElement | void;
+  children: Array<ASTNode>;
+
+  processed?: true;
+
+  static?: boolean;
+  staticRoot?: boolean;
+  staticInFor?: boolean;
+  staticProcessed?: boolean;
+  hasBindings?: boolean;
+
+  text?: string;
+  attrs?: Array<{ name: string; value: any }>;
+  props?: Array<{ name: string; value: string }>;
+  plain?: boolean;
+  pre?: true;
+  ns?: string;
+
+  component?: string;
+  inlineTemplate?: true;
+  transitionMode?: string | null;
+  slotName?: ?string;
+  slotTarget?: ?string;
+  slotScope?: ?string;
+  scopedSlots?: { [name: string]: ASTElement };
+
+  ref?: string;
+  refInFor?: boolean;
+
+  if?: string;
+  ifProcessed?: boolean;
+  elseif?: string;
+  else?: true;
+  ifConditions?: ASTIfConditions;
+
+  for?: string;
+  forProcessed?: boolean;
+  key?: string;
+  alias?: string;
+  iterator1?: string;
+  iterator2?: string;
+
+  staticClass?: string;
+  classBinding?: string;
+  staticStyle?: string;
+  styleBinding?: string;
+  events?: ASTElementHandlers;
+  nativeEvents?: ASTElementHandlers;
+
+  transition?: string | true;
+  transitionOnAppear?: boolean;
+
+  model?: {
+    value: string;
+    callback: string;
+    expression: string;
+  };
+
+  directives?: Array<ASTDirective>;
+
+  forbidden?: true;
+  once?: true;
+  onceProcessed?: boolean;
+  wrapData?: (code: string) => string;
+  wrapListeners?: (code: string) => string;
+
+  // 2.4 ssr optimization
+  ssrOptimizability?: number;
+
+  // weex specific
+  appendAsTree?: boolean;
+};
+
+declare type ASTExpression = {
+  type: 2;
+  expression: string;
+  text: string;
+  tokens: Array<string | Object>;
+  static?: boolean;
+  // 2.4 ssr optimization
+  ssrOptimizability?: number;
+};
+
+declare type ASTText = {
+  type: 3;
+  text: string;
+  static?: boolean;
+  isComment?: boolean;
+  // 2.4 ssr optimization
+  ssrOptimizability?: number;
+};
+
+// SFC-parser related declarations
+
+// an object format describing a single-file component.
+declare type SFCDescriptor = {
+  template: ?SFCBlock;
+  script: ?SFCBlock;
+  styles: Array<SFCBlock>;
+  customBlocks: Array<SFCBlock>;
+};
+
+declare type SFCBlock = {
+  type: string;
+  content: string;
+  attrs: {[attribute:string]: string};
+  start?: number;
+  end?: number;
+  lang?: string;
+  src?: string;
+  scoped?: boolean;
+  module?: string | boolean;
+};
diff --git a/advancedcontentfilter/vendor/asset/vue/flow/component.js b/advancedcontentfilter/vendor/asset/vue/flow/component.js
new file mode 100644 (file)
index 0000000..0dc67a4
--- /dev/null
@@ -0,0 +1,148 @@
+import type { Config } from '../src/core/config'
+import type VNode from '../src/core/vdom/vnode'
+import type Watcher from '../src/core/observer/watcher'
+
+declare interface Component {
+  // constructor information
+  static cid: number;
+  static options: Object;
+  // extend
+  static extend: (options: Object) => Function;
+  static superOptions: Object;
+  static extendOptions: Object;
+  static sealedOptions: Object;
+  static super: Class<Component>;
+  // assets
+  static directive: (id: string, def?: Function | Object) => Function | Object | void;
+  static component: (id: string, def?: Class<Component> | Object) => Class<Component>;
+  static filter: (id: string, def?: Function) => Function | void;
+  // functional context constructor
+  static FunctionalRenderContext: Function;
+
+  // public properties
+  $el: any; // so that we can attach __vue__ to it
+  $data: Object;
+  $props: Object;
+  $options: ComponentOptions;
+  $parent: Component | void;
+  $root: Component;
+  $children: Array<Component>;
+  $refs: { [key: string]: Component | Element | Array<Component | Element> | void };
+  $slots: { [key: string]: Array<VNode> };
+  $scopedSlots: { [key: string]: () => VNodeChildren };
+  $vnode: VNode; // the placeholder node for the component in parent's render tree
+  $attrs: { [key: string] : string };
+  $listeners: { [key: string]: Function | Array<Function> };
+  $isServer: boolean;
+
+  // public methods
+  $mount: (el?: Element | string, hydrating?: boolean) => Component;
+  $forceUpdate: () => void;
+  $destroy: () => void;
+  $set: <T>(target: Object | Array<T>, key: string | number, val: T) => T;
+  $delete: <T>(target: Object | Array<T>, key: string | number) => void;
+  $watch: (expOrFn: string | Function, cb: Function, options?: Object) => Function;
+  $on: (event: string | Array<string>, fn: Function) => Component;
+  $once: (event: string, fn: Function) => Component;
+  $off: (event?: string | Array<string>, fn?: Function) => Component;
+  $emit: (event: string, ...args: Array<mixed>) => Component;
+  $nextTick: (fn: Function) => void | Promise<*>;
+  $createElement: (tag?: string | Component, data?: Object, children?: VNodeChildren) => VNode;
+
+  // private properties
+  _uid: number | string;
+  _name: string; // this only exists in dev mode
+  _isVue: true;
+  _self: Component;
+  _renderProxy: Component;
+  _renderContext: ?Component;
+  _watcher: Watcher;
+  _watchers: Array<Watcher>;
+  _computedWatchers: { [key: string]: Watcher };
+  _data: Object;
+  _props: Object;
+  _events: Object;
+  _inactive: boolean | null;
+  _directInactive: boolean;
+  _isMounted: boolean;
+  _isDestroyed: boolean;
+  _isBeingDestroyed: boolean;
+  _vnode: ?VNode; // self root node
+  _staticTrees: ?Array<VNode>; // v-once cached trees
+  _hasHookEvent: boolean;
+  _provided: ?Object;
+  // _virtualComponents?: { [key: string]: Component };
+
+  // private methods
+
+  // lifecycle
+  _init: Function;
+  _mount: (el?: Element | void, hydrating?: boolean) => Component;
+  _update: (vnode: VNode, hydrating?: boolean) => void;
+
+  // rendering
+  _render: () => VNode;
+
+  __patch__: (
+    a: Element | VNode | void,
+    b: VNode,
+    hydrating?: boolean,
+    removeOnly?: boolean,
+    parentElm?: any,
+    refElm?: any
+  ) => any;
+
+  // createElement
+
+  // _c is internal that accepts `normalizationType` optimization hint
+  _c: (
+    vnode?: VNode,
+    data?: VNodeData,
+    children?: VNodeChildren,
+    normalizationType?: number
+  ) => VNode | void;
+
+  // renderStatic
+  _m: (index: number, isInFor?: boolean) => VNode | VNodeChildren;
+  // markOnce
+  _o: (vnode: VNode | Array<VNode>, index: number, key: string) => VNode | VNodeChildren;
+  // toString
+  _s: (value: mixed) => string;
+  // text to VNode
+  _v: (value: string | number) => VNode;
+  // toNumber
+  _n: (value: string) => number | string;
+  // empty vnode
+  _e: () => VNode;
+  // loose equal
+  _q: (a: mixed, b: mixed) => boolean;
+  // loose indexOf
+  _i: (arr: Array<mixed>, val: mixed) => number;
+  // resolveFilter
+  _f: (id: string) => Function;
+  // renderList
+  _l: (val: mixed, render: Function) => ?Array<VNode>;
+  // renderSlot
+  _t: (name: string, fallback: ?Array<VNode>, props: ?Object) => ?Array<VNode>;
+  // apply v-bind object
+  _b: (data: any, tag: string, value: any, asProp: boolean, isSync?: boolean) => VNodeData;
+  // apply v-on object
+  _g: (data: any, value: any) => VNodeData;
+  // check custom keyCode
+  _k: (eventKeyCode: number, key: string, builtInAlias?: number | Array<number>, eventKeyName?: string) => ?boolean;
+  // resolve scoped slots
+  _u: (scopedSlots: ScopedSlotsData, res?: Object) => { [key: string]: Function };
+
+  // SSR specific
+  _ssrNode: Function;
+  _ssrList: Function;
+  _ssrEscape: Function;
+  _ssrAttr: Function;
+  _ssrAttrs: Function;
+  _ssrDOMProps: Function;
+  _ssrClass: Function;
+  _ssrStyle: Function;
+
+  // allow dynamic method registration
+  [key: string]: any
+};
diff --git a/advancedcontentfilter/vendor/asset/vue/flow/global-api.js b/advancedcontentfilter/vendor/asset/vue/flow/global-api.js
new file mode 100644 (file)
index 0000000..0b2efb2
--- /dev/null
@@ -0,0 +1,21 @@
+declare interface GlobalAPI {
+  cid: number;
+  options: Object;
+  config: Config;
+  util: Object;
+
+  extend: (options: Object) => Function;
+  set: <T>(target: Object | Array<T>, key: string | number, value: T) => T;
+  delete: <T>(target: Object| Array<T>, key: string | number) => void;
+  nextTick: (fn: Function, context?: Object) => void | Promise<*>;
+  use: (plugin: Function | Object) => void;
+  mixin: (mixin: Object) => void;
+  compile: (template: string) => { render: Function, staticRenderFns: Array<Function> };
+
+  directive: (id: string, def?: Function | Object) => Function | Object | void;
+  component: (id: string, def?: Class<Component> | Object) => Class<Component>;
+  filter: (id: string, def?: Function) => Function | void;
+
+  // allow dynamic method registration
+  [key: string]: any
+};
diff --git a/advancedcontentfilter/vendor/asset/vue/flow/modules.js b/advancedcontentfilter/vendor/asset/vue/flow/modules.js
new file mode 100644 (file)
index 0000000..a660e9c
--- /dev/null
@@ -0,0 +1,44 @@
+declare module 'he' {
+  declare function escape(html: string): string;
+  declare function decode(html: string): string;
+}
+
+declare module 'source-map' {
+  declare class SourceMapGenerator {
+    setSourceContent(filename: string, content: string): void;
+    addMapping(mapping: Object): void;
+    toString(): string;
+  }
+  declare class SourceMapConsumer {
+    constructor (map: Object): void;
+    originalPositionFor(position: { line: number; column: number; }): {
+      source: ?string;
+      line: ?number;
+      column: ?number;
+    };
+  }
+}
+
+declare module 'lru-cache' {
+  declare var exports: {
+    (): any
+  }
+}
+
+declare module 'de-indent' {
+  declare var exports: {
+    (input: string): string
+  }
+}
+
+declare module 'serialize-javascript' {
+  declare var exports: {
+    (input: string, options: { isJSON: boolean }): string
+  }
+}
+
+declare module 'lodash.template' {
+  declare var exports: {
+    (input: string, options: { interpolate: RegExp, escape: RegExp }): Function
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/flow/options.js b/advancedcontentfilter/vendor/asset/vue/flow/options.js
new file mode 100644 (file)
index 0000000..e4c6ed1
--- /dev/null
@@ -0,0 +1,93 @@
+declare type InternalComponentOptions = {
+  _isComponent: true;
+  parent: Component;
+  _parentVnode: VNode;
+  _parentElm: ?Node;
+  _refElm: ?Node;
+  render?: Function;
+  staticRenderFns?: Array<Function>
+};
+
+type InjectKey = string | Symbol;
+
+declare type ComponentOptions = {
+  componentId?: string;
+
+  // data
+  data: Object | Function | void;
+  props?: { [key: string]: PropOptions };
+  propsData?: ?Object;
+  computed?: {
+    [key: string]: Function | {
+      get?: Function;
+      set?: Function;
+      cache?: boolean
+    }
+  };
+  methods?: { [key: string]: Function };
+  watch?: { [key: string]: Function | string };
+
+  // DOM
+  el?: string | Element;
+  template?: string;
+  render: (h: () => VNode) => VNode;
+  renderError?: (h: () => VNode, err: Error) => VNode;
+  staticRenderFns?: Array<() => VNode>;
+
+  // lifecycle
+  beforeCreate?: Function;
+  created?: Function;
+  beforeMount?: Function;
+  mounted?: Function;
+  beforeUpdate?: Function;
+  updated?: Function;
+  activated?: Function;
+  deactivated?: Function;
+  beforeDestroy?: Function;
+  destroyed?: Function;
+  errorCaptured?: () => boolean | void;
+
+  // assets
+  directives?: { [key: string]: Object };
+  components?: { [key: string]: Class<Component> };
+  transitions?: { [key: string]: Object };
+  filters?: { [key: string]: Function };
+
+  // context
+  provide?: { [key: string | Symbol]: any } | () => { [key: string | Symbol]: any };
+  inject?: { [key: string]: InjectKey | { from?: InjectKey, default?: any }} | Array<string>;
+
+  // component v-model customization
+  model?: {
+    prop?: string;
+    event?: string;
+  };
+
+  // misc
+  parent?: Component;
+  mixins?: Array<Object>;
+  name?: string;
+  extends?: Class<Component> | Object;
+  delimiters?: [string, string];
+  comments?: boolean;
+  inheritAttrs?: boolean;
+
+  // private
+  _isComponent?: true;
+  _propKeys?: Array<string>;
+  _parentVnode?: VNode;
+  _parentListeners?: ?Object;
+  _renderChildren?: ?Array<VNode>;
+  _componentTag: ?string;
+  _scopeId: ?string;
+  _base: Class<Component>;
+  _parentElm: ?Node;
+  _refElm: ?Node;
+};
+
+declare type PropOptions = {
+  type: Function | Array<Function> | null;
+  default: any;
+  required: ?boolean;
+  validator: ?Function;
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/flow/ssr.js b/advancedcontentfilter/vendor/asset/vue/flow/ssr.js
new file mode 100644 (file)
index 0000000..d6a9459
--- /dev/null
@@ -0,0 +1,21 @@
+declare type ComponentWithCacheContext = {
+  type: 'ComponentWithCache';
+  bufferIndex: number;
+  buffer: Array<string>;
+  key: string;
+};
+
+declare type ElementContext = {
+  type: 'Element';
+  children: Array<VNode>;
+  rendered: number;
+  endTag: string;
+  total: number;
+};
+
+declare type ComponentContext = {
+  type: 'Component';
+  prevActive: Component;
+};
+
+declare type RenderState = ComponentContext | ComponentWithCacheContext | ElementContext;
diff --git a/advancedcontentfilter/vendor/asset/vue/flow/vnode.js b/advancedcontentfilter/vendor/asset/vue/flow/vnode.js
new file mode 100644 (file)
index 0000000..46fe3de
--- /dev/null
@@ -0,0 +1,78 @@
+declare type VNodeChildren = Array<?VNode | string | VNodeChildren> | string;
+
+declare type VNodeComponentOptions = {
+  Ctor: Class<Component>;
+  propsData: ?Object;
+  listeners: ?Object;
+  children: ?Array<VNode>;
+  tag?: string;
+};
+
+declare type MountedComponentVNode = {
+  context: Component;
+  componentOptions: VNodeComponentOptions;
+  componentInstance: Component;
+  parent: VNode;
+  data: VNodeData;
+};
+
+// interface for vnodes in update modules
+declare type VNodeWithData = {
+  tag: string;
+  data: VNodeData;
+  children: ?Array<VNode>;
+  text: void;
+  elm: any;
+  ns: string | void;
+  context: Component;
+  key: string | number | void;
+  parent?: VNodeWithData;
+  componentOptions?: VNodeComponentOptions;
+  componentInstance?: Component;
+  isRootInsert: boolean;
+};
+
+declare interface VNodeData {
+  key?: string | number;
+  slot?: string;
+  ref?: string;
+  is?: string;
+  pre?: boolean;
+  tag?: string;
+  staticClass?: string;
+  class?: any;
+  staticStyle?: { [key: string]: any };
+  style?: Array<Object> | Object;
+  normalizedStyle?: Object;
+  props?: { [key: string]: any };
+  attrs?: { [key: string]: string };
+  domProps?: { [key: string]: any };
+  hook?: { [key: string]: Function };
+  on?: ?{ [key: string]: Function | Array<Function> };
+  nativeOn?: { [key: string]: Function | Array<Function> };
+  transition?: Object;
+  show?: boolean; // marker for v-show
+  inlineTemplate?: {
+    render: Function;
+    staticRenderFns: Array<Function>;
+  };
+  directives?: Array<VNodeDirective>;
+  keepAlive?: boolean;
+  scopedSlots?: { [key: string]: Function };
+  model?: {
+    value: any;
+    callback: Function;
+  };
+};
+
+declare type VNodeDirective = {
+  name: string;
+  rawName: string;
+  value?: any;
+  oldValue?: any;
+  arg?: string;
+  modifiers?: ASTModifiers;
+  def?: Object;
+};
+
+declare type ScopedSlotsData = Array<{ key: string, fn: Function } | ScopedSlotsData>;
diff --git a/advancedcontentfilter/vendor/asset/vue/flow/weex.js b/advancedcontentfilter/vendor/asset/vue/flow/weex.js
new file mode 100644 (file)
index 0000000..2834313
--- /dev/null
@@ -0,0 +1,122 @@
+// global flag to be compiled away
+declare var __WEEX__: boolean;
+
+// global object in Weex
+declare var WXEnvironment: WeexEnvironment;
+
+declare type Weex = {
+  config: WeexConfigAPI;
+  document: WeexDocument;
+  requireModule: (name: string) => Object | void;
+  supports: (condition: string) => boolean | void;
+  isRegisteredModule: (name: string, method?: string) => boolean;
+  isRegisteredComponent: (name: string) => boolean;
+};
+
+declare type WeexConfigAPI = {
+  bundleUrl: string; // === weex.document.URL
+  bundleType: string;
+  env: WeexEnvironment; // === WXEnvironment
+};
+
+declare type WeexEnvironment = {
+  platform: string; // could be "Web", "iOS", "Android"
+  weexVersion: string; // the version of WeexSDK
+
+  osName: string; // could be "iOS", "Android" or others
+  osVersion: string;
+  appName: string; // mobile app name or browser name
+  appVersion: string;
+
+  // informations of current running device
+  deviceModel: string; // phone device model
+  deviceWidth: number;
+  deviceHeight: number;
+  scale: number;
+
+  // only available on the web
+  userAgent?: string;
+  dpr?: number;
+  rem?: number;
+};
+
+declare interface WeexDocument {
+  id: string;
+  URL: string;
+  taskCenter: WeexTaskCenter;
+
+  open: () => void;
+  close: () => void;
+  createElement: (tagName: string, props?: Object) => WeexElement;
+  createComment: (text: string) => Object;
+  fireEvent: (type: string) => void;
+  destroy: () => void;
+};
+
+declare interface WeexTaskCenter {
+  instanceId: string;
+  callbackManager: Object;
+  send: (type: string, params: Object, args: Array<any>, options?: Object) => void;
+  registerHook: (componentId: string, type: string, hook: string, fn: Function) => void;
+  updateData: (componentId: string, data: Object | void, callback?: Function) => void;
+};
+
+declare interface WeexElement {
+  nodeType: number;
+  nodeId: string;
+  type: string;
+  ref: string;
+  text?: string;
+
+  parentNode: WeexElement | void;
+  children: Array<WeexElement>;
+  previousSibling: WeexElement | void;
+  nextSibling: WeexElement | void;
+
+  appendChild: (node: WeexElement) => void;
+  removeChild: (node: WeexElement, preserved?: boolean) => void;
+  insertBefore: (node: WeexElement, before: WeexElement) => void;
+  insertAfter: (node: WeexElement, after: WeexElement) => void;
+  setAttr: (key: string, value: any, silent?: boolean) => void;
+  setAttrs: (attrs: Object, silent?: boolean) => void;
+  setStyle: (key: string, value: any, silent?: boolean) => void;
+  setStyles: (attrs: Object, silent?: boolean) => void;
+  addEvent: (type: string, handler: Function, args?: Array<any>) => void;
+  removeEvent: (type: string) => void;
+  fireEvent: (type: string) => void;
+  destroy: () => void;
+};
+
+declare type WeexInstanceOption = {
+  instanceId: string;
+  config: WeexConfigAPI;
+  document: WeexDocument;
+  Vue?: GlobalAPI;
+  app?: Component;
+  data?: Object;
+};
+
+declare type WeexRuntimeContext = {
+  weex: Weex;
+  service: Object;
+  BroadcastChannel?: Function;
+};
+
+declare type WeexInstanceContext = {
+  Vue: GlobalAPI;
+
+  // DEPRECATED
+  setTimeout?: Function;
+  clearTimeout?: Function;
+  setInterval?: Function;
+  clearInterval?: Function;
+};
+
+declare type WeexCompilerOptions = CompilerOptions & {
+  // whether to compile special template for <recycle-list>
+  recyclable?: boolean;
+};
+
+declare type WeexCompiledResult = CompiledResult & {
+  '@render'?: string;
+};
diff --git a/advancedcontentfilter/vendor/asset/vue/package.json b/advancedcontentfilter/vendor/asset/vue/package.json
new file mode 100644 (file)
index 0000000..63da803
--- /dev/null
@@ -0,0 +1,149 @@
+{
+  "name": "vue",
+  "version": "2.5.16",
+  "description": "Reactive, component-oriented view layer for modern web interfaces.",
+  "main": "dist/vue.runtime.common.js",
+  "module": "dist/vue.runtime.esm.js",
+  "unpkg": "dist/vue.js",
+  "jsdelivr": "dist/vue.js",
+  "typings": "types/index.d.ts",
+  "files": [
+    "src",
+    "dist/*.js",
+    "types/*.d.ts"
+  ],
+  "scripts": {
+    "dev": "rollup -w -c scripts/config.js --environment TARGET:web-full-dev",
+    "dev:cjs": "rollup -w -c scripts/config.js --environment TARGET:web-runtime-cjs",
+    "dev:esm": "rollup -w -c scripts/config.js --environment TARGET:web-runtime-esm",
+    "dev:test": "karma start test/unit/karma.dev.config.js",
+    "dev:ssr": "rollup -w -c scripts/config.js --environment TARGET:web-server-renderer",
+    "dev:compiler": "rollup -w -c scripts/config.js --environment TARGET:web-compiler ",
+    "dev:weex": "rollup -w -c scripts/config.js --environment TARGET:weex-framework",
+    "dev:weex:factory": "rollup -w -c scripts/config.js --environment TARGET:weex-factory",
+    "dev:weex:compiler": "rollup -w -c scripts/config.js --environment TARGET:weex-compiler ",
+    "build": "node scripts/build.js",
+    "build:ssr": "npm run build -- web-runtime-cjs,web-server-renderer",
+    "build:weex": "npm run build -- weex",
+    "test": "npm run lint && flow check && npm run test:types && npm run test:cover && npm run test:e2e -- --env phantomjs && npm run test:ssr && npm run test:weex",
+    "test:unit": "karma start test/unit/karma.unit.config.js",
+    "test:cover": "karma start test/unit/karma.cover.config.js",
+    "test:e2e": "npm run build -- web-full-prod,web-server-basic-renderer && node test/e2e/runner.js",
+    "test:weex": "npm run build:weex && jasmine JASMINE_CONFIG_PATH=test/weex/jasmine.json",
+    "test:ssr": "npm run build:ssr && jasmine JASMINE_CONFIG_PATH=test/ssr/jasmine.json",
+    "test:sauce": "npm run sauce -- 0 && npm run sauce -- 1 && npm run sauce -- 2",
+    "test:types": "tsc -p ./types/test/tsconfig.json",
+    "lint": "eslint --fix src scripts test",
+    "flow": "flow check",
+    "sauce": "karma start test/unit/karma.sauce.config.js",
+    "bench:ssr": "npm run build:ssr && node benchmarks/ssr/renderToString.js && node benchmarks/ssr/renderToStream.js",
+    "release": "bash scripts/release.sh",
+    "release:weex": "bash scripts/release-weex.sh",
+    "release:note": "node scripts/gen-release-note.js",
+    "commit": "git-cz"
+  },
+  "gitHooks": {
+    "pre-commit": "lint-staged",
+    "commit-msg": "node scripts/verify-commit-msg.js"
+  },
+  "lint-staged": {
+    "*.js": [
+      "eslint --fix",
+      "git add"
+    ]
+  },
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/vuejs/vue.git"
+  },
+  "keywords": [
+    "vue"
+  ],
+  "author": "Evan You",
+  "license": "MIT",
+  "bugs": {
+    "url": "https://github.com/vuejs/vue/issues"
+  },
+  "homepage": "https://github.com/vuejs/vue#readme",
+  "devDependencies": {
+    "@types/node": "^8.0.33",
+    "@types/webpack": "^3.0.13",
+    "acorn": "^5.2.1",
+    "babel-core": "^6.25.0",
+    "babel-eslint": "^8.0.3",
+    "babel-helper-vue-jsx-merge-props": "^2.0.2",
+    "babel-loader": "^7.0.0",
+    "babel-plugin-istanbul": "^4.1.4",
+    "babel-plugin-syntax-dynamic-import": "^6.18.0",
+    "babel-plugin-syntax-jsx": "^6.18.0",
+    "babel-plugin-transform-vue-jsx": "^3.4.3",
+    "babel-preset-es2015": "^6.24.1",
+    "babel-preset-flow-vue": "^1.0.0",
+    "buble": "^0.19.3",
+    "chalk": "^2.3.0",
+    "chromedriver": "^2.30.1",
+    "codecov": "^3.0.0",
+    "commitizen": "^2.9.6",
+    "conventional-changelog": "^1.1.3",
+    "cross-spawn": "^5.1.0",
+    "cz-conventional-changelog": "^2.0.0",
+    "de-indent": "^1.0.2",
+    "es6-promise": "^4.1.0",
+    "escodegen": "^1.8.1",
+    "eslint": "^4.13.1",
+    "eslint-loader": "^1.7.1",
+    "eslint-plugin-flowtype": "^2.34.0",
+    "eslint-plugin-jasmine": "^2.8.4",
+    "eslint-plugin-vue-libs": "^2.0.1",
+    "file-loader": "^1.1.5",
+    "flow-bin": "^0.61.0",
+    "hash-sum": "^1.0.2",
+    "he": "^1.1.1",
+    "http-server": "^0.11.1",
+    "jasmine": "^2.99.0",
+    "jasmine-core": "^2.99.0",
+    "karma": "^2.0.0",
+    "karma-chrome-launcher": "^2.1.1",
+    "karma-coverage": "^1.1.1",
+    "karma-firefox-launcher": "^1.0.1",
+    "karma-jasmine": "^1.1.0",
+    "karma-mocha-reporter": "^2.2.3",
+    "karma-phantomjs-launcher": "^1.0.4",
+    "karma-safari-launcher": "^1.0.0",
+    "karma-sauce-launcher": "^1.1.0",
+    "karma-sourcemap-loader": "^0.3.7",
+    "karma-webpack": "^2.0.3",
+    "lint-staged": "^7.0.0",
+    "lodash": "^4.17.4",
+    "lodash.template": "^4.4.0",
+    "lodash.uniq": "^4.5.0",
+    "lru-cache": "^4.1.1",
+    "nightwatch": "^0.9.16",
+    "nightwatch-helpers": "^1.2.0",
+    "phantomjs-prebuilt": "^2.1.14",
+    "resolve": "^1.3.3",
+    "rollup": "^0.54.1",
+    "rollup-plugin-alias": "^1.3.1",
+    "rollup-plugin-babel": "^3.0.2",
+    "rollup-plugin-buble": "^0.19.2",
+    "rollup-plugin-commonjs": "^8.0.0",
+    "rollup-plugin-flow-no-whitespace": "^1.0.0",
+    "rollup-plugin-node-resolve": "^3.0.0",
+    "rollup-plugin-replace": "^2.0.0",
+    "rollup-watch": "^4.0.0",
+    "selenium-server": "^2.53.1",
+    "serialize-javascript": "^1.3.0",
+    "shelljs": "^0.8.1",
+    "typescript": "^2.7.1",
+    "uglify-js": "^3.0.15",
+    "webpack": "^3.11.0",
+    "weex-js-runtime": "^0.23.6",
+    "weex-styler": "^0.3.0",
+    "yorkie": "^1.0.1"
+  },
+  "config": {
+    "commitizen": {
+      "path": "./node_modules/cz-conventional-changelog"
+    }
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/packages/vue-server-renderer/README.md b/advancedcontentfilter/vendor/asset/vue/packages/vue-server-renderer/README.md
new file mode 100644 (file)
index 0000000..2921c51
--- /dev/null
@@ -0,0 +1,8 @@
+# vue-server-renderer
+
+> This package is auto-generated. For pull requests please see [src/platforms/web/entry-server-renderer.js](https://github.com/vuejs/vue/blob/dev/src/platforms/web/entry-server-renderer.js).
+
+This package offers Node.js server-side rendering for Vue 2.0.
+
+- [API Reference](https://ssr.vuejs.org/en/api.html)
+- [Vue.js Server-Side Rendering Guide](https://ssr.vuejs.org)
diff --git a/advancedcontentfilter/vendor/asset/vue/packages/vue-server-renderer/client-plugin.d.ts b/advancedcontentfilter/vendor/asset/vue/packages/vue-server-renderer/client-plugin.d.ts
new file mode 100644 (file)
index 0000000..005c0f6
--- /dev/null
@@ -0,0 +1,3 @@
+import { WebpackPlugin } from './types/plugin';
+declare const Plugin: WebpackPlugin;
+export = Plugin;
diff --git a/advancedcontentfilter/vendor/asset/vue/packages/vue-server-renderer/index.js b/advancedcontentfilter/vendor/asset/vue/packages/vue-server-renderer/index.js
new file mode 100644 (file)
index 0000000..4a8ddd8
--- /dev/null
@@ -0,0 +1,16 @@
+try {
+  var vueVersion = require('vue').version
+} catch (e) {}
+
+var packageName = require('./package.json').name
+var packageVersion = require('./package.json').version
+if (vueVersion && vueVersion !== packageVersion) {
+  throw new Error(
+    '\n\nVue packages version mismatch:\n\n' +
+    '- vue@' + vueVersion + '\n' +
+    '- ' + packageName + '@' + packageVersion + '\n\n' +
+    'This may cause things to work incorrectly. Make sure to use the same version for both.\n'
+  )
+}
+
+module.exports = require('./build')
diff --git a/advancedcontentfilter/vendor/asset/vue/packages/vue-server-renderer/package.json b/advancedcontentfilter/vendor/asset/vue/packages/vue-server-renderer/package.json
new file mode 100644 (file)
index 0000000..b036916
--- /dev/null
@@ -0,0 +1,35 @@
+{
+  "name": "vue-server-renderer",
+  "version": "2.5.16",
+  "description": "server renderer for Vue 2.0",
+  "main": "index.js",
+  "types": "types/index.d.ts",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/vuejs/vue.git"
+  },
+  "keywords": [
+    "vue",
+    "server",
+    "ssr"
+  ],
+  "author": "Evan You",
+  "license": "MIT",
+  "bugs": {
+    "url": "https://github.com/vuejs/vue/issues"
+  },
+  "dependencies": {
+    "chalk": "^1.1.3",
+    "hash-sum": "^1.0.2",
+    "he": "^1.1.0",
+    "lodash.template": "^4.4.0",
+    "lodash.uniq": "^4.5.0",
+    "resolve": "^1.2.0",
+    "serialize-javascript": "^1.3.0",
+    "source-map": "0.5.6"
+  },
+  "devDependencies": {
+    "vue": "file:../.."
+  },
+  "homepage": "https://github.com/vuejs/vue/tree/dev/packages/vue-server-renderer#readme"
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/packages/vue-server-renderer/server-plugin.d.ts b/advancedcontentfilter/vendor/asset/vue/packages/vue-server-renderer/server-plugin.d.ts
new file mode 100644 (file)
index 0000000..005c0f6
--- /dev/null
@@ -0,0 +1,3 @@
+import { WebpackPlugin } from './types/plugin';
+declare const Plugin: WebpackPlugin;
+export = Plugin;
diff --git a/advancedcontentfilter/vendor/asset/vue/packages/vue-server-renderer/types/index.d.ts b/advancedcontentfilter/vendor/asset/vue/packages/vue-server-renderer/types/index.d.ts
new file mode 100644 (file)
index 0000000..1c7e8bd
--- /dev/null
@@ -0,0 +1,49 @@
+import Vue, { VNode, VNodeDirective } from 'vue';
+import { Readable } from 'stream';
+
+export declare function createRenderer(options?: RendererOptions): Renderer;
+
+export declare function createBundleRenderer(bundle: string | object, options?: BundleRendererOptions): BundleRenderer;
+
+type RenderCallback = (err: Error | null, html: string) => void;
+
+interface Renderer {
+  renderToString(vm: Vue, callback: RenderCallback): void;
+  renderToString(vm: Vue, context: object, callback: RenderCallback): void;
+  renderToString(vm: Vue): Promise<string>;
+  renderToString(vm: Vue, context: object): Promise<string>;
+
+  renderToStream(vm: Vue, context?: object): Readable;
+}
+
+interface BundleRenderer {
+  renderToString(callback: RenderCallback): void;
+  renderToString(context: object, callback: RenderCallback): void;
+  renderToString(): Promise<string>;
+  renderToString(context: object): Promise<string>;
+
+  renderToStream(context?: object): Readable;
+}
+
+interface RendererOptions {
+  template?: string;
+  inject?: boolean;
+  shouldPreload?: (file: string, type: string) => boolean;
+  shouldPrefetch?: (file: string, type: string) => boolean;
+  cache?: RenderCache;
+  directives?: {
+    [key: string]: (vnode: VNode, dir: VNodeDirective) => void
+  };
+}
+
+interface BundleRendererOptions extends RendererOptions {
+  clientManifest?: object;
+  runInNewContext?: boolean | 'once';
+  basedir?: string;
+}
+
+interface RenderCache {
+  get: (key: string, cb?: (res: string) => void) => string | void;
+  set: (key: string, val: string) => void;
+  has?: (key: string, cb?: (hit: boolean) => void) => boolean | void;
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/packages/vue-server-renderer/types/plugin.d.ts b/advancedcontentfilter/vendor/asset/vue/packages/vue-server-renderer/types/plugin.d.ts
new file mode 100644 (file)
index 0000000..50b6422
--- /dev/null
@@ -0,0 +1,9 @@
+import { Plugin } from 'webpack';
+
+interface WebpackPluginOptions {
+  filename?: string;
+}
+
+export interface WebpackPlugin {
+  new (options?: WebpackPluginOptions): Plugin;
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/packages/vue-server-renderer/types/tsconfig.json b/advancedcontentfilter/vendor/asset/vue/packages/vue-server-renderer/types/tsconfig.json
new file mode 100644 (file)
index 0000000..084dd31
--- /dev/null
@@ -0,0 +1,13 @@
+{
+  "compilerOptions": {
+    "target": "es5",
+    "module": "commonjs",
+    "moduleResolution": "node",
+    "strict": true,
+    "noEmit": true
+  },
+  "compileOnSave": false,
+  "include": [
+    "**/*.ts"
+  ]
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/packages/vue-template-compiler/README.md b/advancedcontentfilter/vendor/asset/vue/packages/vue-template-compiler/README.md
new file mode 100644 (file)
index 0000000..41d9b58
--- /dev/null
@@ -0,0 +1,112 @@
+# vue-template-compiler
+
+> This package is auto-generated. For pull requests please see [src/platforms/web/entry-compiler.js](https://github.com/vuejs/vue/tree/dev/src/platforms/web/entry-compiler.js).
+
+This package can be used to pre-compile Vue 2.0 templates into render functions to avoid runtime-compilation overhead and CSP restrictions. You will only need it if you are writing build tools with very specific needs. In most cases you should be using [`vue-loader`](https://github.com/vuejs/vue-loader) or [`vueify`](https://github.com/vuejs/vueify) instead, both of which use this package internally.
+
+## Installation
+
+``` bash
+npm install vue-template-compiler
+```
+
+``` js
+const compiler = require('vue-template-compiler')
+```
+
+## API
+
+### compiler.compile(template, [options])
+
+Compiles a template string and returns compiled JavaScript code. The returned result is an object of the following format:
+
+``` js
+{
+  ast: ?ASTElement, // parsed template elements to AST
+  render: string, // main render function code
+  staticRenderFns: Array<string>, // render code for static sub trees, if any
+  errors: Array<string> // template syntax errors, if any
+}
+```
+
+Note the returned function code uses `with` and thus cannot be used in strict mode code.
+
+#### Options
+
+It's possible to hook into the compilation process to support custom template features. **However, beware that by injecting custom compile-time modules, your templates will not work with other build tools built on standard built-in modules, e.g `vue-loader` and `vueify`.**
+
+The optional `options` object can contain the following:
+
+- `modules`
+
+  An array of compiler modules. For details on compiler modules, refer to the `ModuleOptions` type in [flow declarations](https://github.com/vuejs/vue/blob/dev/flow/compiler.js#L38-L45) and the [built-in modules](https://github.com/vuejs/vue/tree/dev/src/platforms/web/compiler/modules).
+
+- `directives`
+
+  An object where the key is the directive name and the value is a function that transforms an template AST node. For example:
+
+  ``` js
+  compiler.compile('<div v-test></div>', {
+    directives: {
+      test (node, directiveMeta) {
+        // transform node based on directiveMeta
+      }
+    }
+  })
+  ```
+
+  By default, a compile-time directive will extract the directive and the directive will not be present at runtime. If you want the directive to also be handled by a runtime definition, return `true` in the transform function.
+
+  Refer to the implementation of some [built-in compile-time directives](https://github.com/vuejs/vue/tree/dev/src/platforms/web/compiler/directives).
+
+- `preserveWhitespace`
+
+  Defaults to `true`. This means the compiled render function preserves all whitespace characters between HTML tags. If set to `false`, whitespace between tags will be ignored. This can result in slightly better performance but may affect layout for inline elements.
+
+---
+
+### compiler.compileToFunctions(template)
+
+Similar to `compiler.compile`, but directly returns instantiated functions:
+
+``` js
+{
+  render: Function,
+  staticRenderFns: Array<Function>
+}
+```
+
+This is only useful at runtime with pre-configured builds, so it doesn't accept any compile-time options. In addition, this method uses `new Function()` so it is not CSP-compliant.
+
+---
+
+### compiler.ssrCompile(template, [options])
+
+> 2.4.0+
+
+Same as `compiler.compile` but generates SSR-specific render function code by optimizing parts of the template into string concatenation in order to improve SSR performance.
+
+This is used by default in `vue-loader@>=12` and can be disabled using the [`optimizeSSR`](https://vue-loader.vuejs.org/en/options.html#optimizessr) option.
+
+---
+
+### compiler.ssrCompileToFunctions(template)
+
+> 2.4.0+
+
+Same as `compiler.compileToFunction` but generates SSR-specific render function code by optimizing parts of the template into string concatenation in order to improve SSR performance.
+
+---
+
+### compiler.parseComponent(file, [options])
+
+Parse a SFC (single-file component, or `*.vue` file) into a descriptor (refer to the `SFCDescriptor` type in [flow declarations](https://github.com/vuejs/vue/blob/dev/flow/compiler.js)). This is used in SFC build tools like `vue-loader` and `vueify`.
+
+#### Options
+
+#### `pad`
+
+`pad` is useful when you are piping the extracted content into other pre-processors, as you will get correct line numbers or character indices if there are any syntax errors.
+
+- with `{ pad: "line" }`, the extracted content for each block will be prefixed with one newline for each line in the leading content from the original file to ensure that the line numbers align with the original file.
+- with `{ pad: "space" }`, the extracted content for each block will be prefixed with one space for each character in the leading content from the original file to ensure that the character count remains the same as the original file.
diff --git a/advancedcontentfilter/vendor/asset/vue/packages/vue-template-compiler/browser.js b/advancedcontentfilter/vendor/asset/vue/packages/vue-template-compiler/browser.js
new file mode 100644 (file)
index 0000000..3e099ca
--- /dev/null
@@ -0,0 +1,5237 @@
+(function (global, factory) {
+       typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
+       typeof define === 'function' && define.amd ? define(['exports'], factory) :
+       (factory((global.VueTemplateCompiler = {})));
+}(this, (function (exports) { 'use strict';
+
+var splitRE = /\r?\n/g;
+var emptyRE = /^\s*$/;
+var needFixRE = /^(\r?\n)*[\t\s]/;
+
+var deIndent = function deindent (str) {
+  if (!needFixRE.test(str)) {
+    return str
+  }
+  var lines = str.split(splitRE);
+  var min = Infinity;
+  var type, cur, c;
+  for (var i = 0; i < lines.length; i++) {
+    var line = lines[i];
+    if (!emptyRE.test(line)) {
+      if (!type) {
+        c = line.charAt(0);
+        if (c === ' ' || c === '\t') {
+          type = c;
+          cur = count(line, type);
+          if (cur < min) {
+            min = cur;
+          }
+        } else {
+          return str
+        }
+      } else {
+        cur = count(line, type);
+        if (cur < min) {
+          min = cur;
+        }
+      }
+    }
+  }
+  return lines.map(function (line) {
+    return line.slice(min)
+  }).join('\n')
+};
+
+function count (line, type) {
+  var i = 0;
+  while (line.charAt(i) === type) {
+    i++;
+  }
+  return i
+}
+
+/*  */
+
+var emptyObject = Object.freeze({});
+
+// these helpers produces better vm code in JS engines due to their
+// explicitness and function inlining
+function isUndef (v) {
+  return v === undefined || v === null
+}
+
+
+
+
+
+
+
+/**
+ * Check if value is primitive
+ */
+function isPrimitive (value) {
+  return (
+    typeof value === 'string' ||
+    typeof value === 'number' ||
+    // $flow-disable-line
+    typeof value === 'symbol' ||
+    typeof value === 'boolean'
+  )
+}
+
+/**
+ * Quick object check - this is primarily used to tell
+ * Objects from primitive values when we know the value
+ * is a JSON-compliant type.
+ */
+function isObject (obj) {
+  return obj !== null && typeof obj === 'object'
+}
+
+/**
+ * Get the raw type string of a value e.g. [object Object]
+ */
+var _toString = Object.prototype.toString;
+
+function toRawType (value) {
+  return _toString.call(value).slice(8, -1)
+}
+
+/**
+ * Strict object type check. Only returns true
+ * for plain JavaScript objects.
+ */
+function isPlainObject (obj) {
+  return _toString.call(obj) === '[object Object]'
+}
+
+
+
+/**
+ * Check if val is a valid array index.
+ */
+function isValidArrayIndex (val) {
+  var n = parseFloat(String(val));
+  return n >= 0 && Math.floor(n) === n && isFinite(val)
+}
+
+/**
+ * Convert a value to a string that is actually rendered.
+ */
+
+
+/**
+ * Convert a input value to a number for persistence.
+ * If the conversion fails, return original string.
+ */
+
+
+/**
+ * Make a map and return a function for checking if a key
+ * is in that map.
+ */
+function makeMap (
+  str,
+  expectsLowerCase
+) {
+  var map = Object.create(null);
+  var list = str.split(',');
+  for (var i = 0; i < list.length; i++) {
+    map[list[i]] = true;
+  }
+  return expectsLowerCase
+    ? function (val) { return map[val.toLowerCase()]; }
+    : function (val) { return map[val]; }
+}
+
+/**
+ * Check if a tag is a built-in tag.
+ */
+var isBuiltInTag = makeMap('slot,component', true);
+
+/**
+ * Check if a attribute is a reserved attribute.
+ */
+var isReservedAttribute = makeMap('key,ref,slot,slot-scope,is');
+
+/**
+ * Remove an item from an array
+ */
+function remove (arr, item) {
+  if (arr.length) {
+    var index = arr.indexOf(item);
+    if (index > -1) {
+      return arr.splice(index, 1)
+    }
+  }
+}
+
+/**
+ * Check whether the object has the property.
+ */
+var hasOwnProperty = Object.prototype.hasOwnProperty;
+function hasOwn (obj, key) {
+  return hasOwnProperty.call(obj, key)
+}
+
+/**
+ * Create a cached version of a pure function.
+ */
+function cached (fn) {
+  var cache = Object.create(null);
+  return (function cachedFn (str) {
+    var hit = cache[str];
+    return hit || (cache[str] = fn(str))
+  })
+}
+
+/**
+ * Camelize a hyphen-delimited string.
+ */
+var camelizeRE = /-(\w)/g;
+var camelize = cached(function (str) {
+  return str.replace(camelizeRE, function (_, c) { return c ? c.toUpperCase() : ''; })
+});
+
+/**
+ * Capitalize a string.
+ */
+
+
+
+
+/**
+ * Simple bind polyfill for environments that do not support it... e.g.
+ * PhantomJS 1.x. Technically we don't need this anymore since native bind is
+ * now more performant in most browsers, but removing it would be breaking for
+ * code that was able to run in PhantomJS 1.x, so this must be kept for
+ * backwards compatibility.
+ */
+
+/* istanbul ignore next */
+function polyfillBind (fn, ctx) {
+  function boundFn (a) {
+    var l = arguments.length;
+    return l
+      ? l > 1
+        ? fn.apply(ctx, arguments)
+        : fn.call(ctx, a)
+      : fn.call(ctx)
+  }
+
+  boundFn._length = fn.length;
+  return boundFn
+}
+
+function nativeBind (fn, ctx) {
+  return fn.bind(ctx)
+}
+
+var bind = Function.prototype.bind
+  ? nativeBind
+  : polyfillBind;
+
+/**
+ * Convert an Array-like object to a real Array.
+ */
+
+
+/**
+ * Mix properties into target object.
+ */
+function extend (to, _from) {
+  for (var key in _from) {
+    to[key] = _from[key];
+  }
+  return to
+}
+
+/**
+ * Merge an Array of Objects into a single Object.
+ */
+
+
+/**
+ * Perform no operation.
+ * Stubbing args to make Flow happy without leaving useless transpiled code
+ * with ...rest (https://flow.org/blog/2017/05/07/Strict-Function-Call-Arity/)
+ */
+function noop (a, b, c) {}
+
+/**
+ * Always return false.
+ */
+var no = function (a, b, c) { return false; };
+
+/**
+ * Return same value
+ */
+var identity = function (_) { return _; };
+
+/**
+ * Generate a static keys string from compiler modules.
+ */
+function genStaticKeys (modules) {
+  return modules.reduce(function (keys, m) {
+    return keys.concat(m.staticKeys || [])
+  }, []).join(',')
+}
+
+/**
+ * Check if two values are loosely equal - that is,
+ * if they are plain objects, do they have the same shape?
+ */
+
+
+
+
+/**
+ * Ensure a function is called only once.
+ */
+
+/*  */
+
+var isUnaryTag = makeMap(
+  'area,base,br,col,embed,frame,hr,img,input,isindex,keygen,' +
+  'link,meta,param,source,track,wbr'
+);
+
+// Elements that you can, intentionally, leave open
+// (and which close themselves)
+var canBeLeftOpenTag = makeMap(
+  'colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr,source'
+);
+
+// HTML5 tags https://html.spec.whatwg.org/multipage/indices.html#elements-3
+// Phrasing Content https://html.spec.whatwg.org/multipage/dom.html#phrasing-content
+var isNonPhrasingTag = makeMap(
+  'address,article,aside,base,blockquote,body,caption,col,colgroup,dd,' +
+  'details,dialog,div,dl,dt,fieldset,figcaption,figure,footer,form,' +
+  'h1,h2,h3,h4,h5,h6,head,header,hgroup,hr,html,legend,li,menuitem,meta,' +
+  'optgroup,option,param,rp,rt,source,style,summary,tbody,td,tfoot,th,thead,' +
+  'title,tr,track'
+);
+
+/**
+ * Not type-checking this file because it's mostly vendor code.
+ */
+
+/*!
+ * HTML Parser By John Resig (ejohn.org)
+ * Modified by Juriy "kangax" Zaytsev
+ * Original code by Erik Arvidsson, Mozilla Public License
+ * http://erik.eae.net/simplehtmlparser/simplehtmlparser.js
+ */
+
+// Regular Expressions for parsing tags and attributes
+var attribute = /^\s*([^\s"'<>\/=]+)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/;
+// could use https://www.w3.org/TR/1999/REC-xml-names-19990114/#NT-QName
+// but for Vue templates we can enforce a simple charset
+var ncname = '[a-zA-Z_][\\w\\-\\.]*';
+var qnameCapture = "((?:" + ncname + "\\:)?" + ncname + ")";
+var startTagOpen = new RegExp(("^<" + qnameCapture));
+var startTagClose = /^\s*(\/?)>/;
+var endTag = new RegExp(("^<\\/" + qnameCapture + "[^>]*>"));
+var doctype = /^<!DOCTYPE [^>]+>/i;
+// #7298: escape - to avoid being pased as HTML comment when inlined in page
+var comment = /^<!\--/;
+var conditionalComment = /^<!\[/;
+
+var IS_REGEX_CAPTURING_BROKEN = false;
+'x'.replace(/x(.)?/g, function (m, g) {
+  IS_REGEX_CAPTURING_BROKEN = g === '';
+});
+
+// Special Elements (can contain anything)
+var isPlainTextElement = makeMap('script,style,textarea', true);
+var reCache = {};
+
+var decodingMap = {
+  '&lt;': '<',
+  '&gt;': '>',
+  '&quot;': '"',
+  '&amp;': '&',
+  '&#10;': '\n',
+  '&#9;': '\t'
+};
+var encodedAttr = /&(?:lt|gt|quot|amp);/g;
+var encodedAttrWithNewLines = /&(?:lt|gt|quot|amp|#10|#9);/g;
+
+// #5992
+var isIgnoreNewlineTag = makeMap('pre,textarea', true);
+var shouldIgnoreFirstNewline = function (tag, html) { return tag && isIgnoreNewlineTag(tag) && html[0] === '\n'; };
+
+function decodeAttr (value, shouldDecodeNewlines) {
+  var re = shouldDecodeNewlines ? encodedAttrWithNewLines : encodedAttr;
+  return value.replace(re, function (match) { return decodingMap[match]; })
+}
+
+function parseHTML (html, options) {
+  var stack = [];
+  var expectHTML = options.expectHTML;
+  var isUnaryTag$$1 = options.isUnaryTag || no;
+  var canBeLeftOpenTag$$1 = options.canBeLeftOpenTag || no;
+  var index = 0;
+  var last, lastTag;
+  while (html) {
+    last = html;
+    // Make sure we're not in a plaintext content element like script/style
+    if (!lastTag || !isPlainTextElement(lastTag)) {
+      var textEnd = html.indexOf('<');
+      if (textEnd === 0) {
+        // Comment:
+        if (comment.test(html)) {
+          var commentEnd = html.indexOf('-->');
+
+          if (commentEnd >= 0) {
+            if (options.shouldKeepComment) {
+              options.comment(html.substring(4, commentEnd));
+            }
+            advance(commentEnd + 3);
+            continue
+          }
+        }
+
+        // http://en.wikipedia.org/wiki/Conditional_comment#Downlevel-revealed_conditional_comment
+        if (conditionalComment.test(html)) {
+          var conditionalEnd = html.indexOf(']>');
+
+          if (conditionalEnd >= 0) {
+            advance(conditionalEnd + 2);
+            continue
+          }
+        }
+
+        // Doctype:
+        var doctypeMatch = html.match(doctype);
+        if (doctypeMatch) {
+          advance(doctypeMatch[0].length);
+          continue
+        }
+
+        // End tag:
+        var endTagMatch = html.match(endTag);
+        if (endTagMatch) {
+          var curIndex = index;
+          advance(endTagMatch[0].length);
+          parseEndTag(endTagMatch[1], curIndex, index);
+          continue
+        }
+
+        // Start tag:
+        var startTagMatch = parseStartTag();
+        if (startTagMatch) {
+          handleStartTag(startTagMatch);
+          if (shouldIgnoreFirstNewline(lastTag, html)) {
+            advance(1);
+          }
+          continue
+        }
+      }
+
+      var text = (void 0), rest = (void 0), next = (void 0);
+      if (textEnd >= 0) {
+        rest = html.slice(textEnd);
+        while (
+          !endTag.test(rest) &&
+          !startTagOpen.test(rest) &&
+          !comment.test(rest) &&
+          !conditionalComment.test(rest)
+        ) {
+          // < in plain text, be forgiving and treat it as text
+          next = rest.indexOf('<', 1);
+          if (next < 0) { break }
+          textEnd += next;
+          rest = html.slice(textEnd);
+        }
+        text = html.substring(0, textEnd);
+        advance(textEnd);
+      }
+
+      if (textEnd < 0) {
+        text = html;
+        html = '';
+      }
+
+      if (options.chars && text) {
+        options.chars(text);
+      }
+    } else {
+      var endTagLength = 0;
+      var stackedTag = lastTag.toLowerCase();
+      var reStackedTag = reCache[stackedTag] || (reCache[stackedTag] = new RegExp('([\\s\\S]*?)(</' + stackedTag + '[^>]*>)', 'i'));
+      var rest$1 = html.replace(reStackedTag, function (all, text, endTag) {
+        endTagLength = endTag.length;
+        if (!isPlainTextElement(stackedTag) && stackedTag !== 'noscript') {
+          text = text
+            .replace(/<!\--([\s\S]*?)-->/g, '$1') // #7298
+            .replace(/<!\[CDATA\[([\s\S]*?)]]>/g, '$1');
+        }
+        if (shouldIgnoreFirstNewline(stackedTag, text)) {
+          text = text.slice(1);
+        }
+        if (options.chars) {
+          options.chars(text);
+        }
+        return ''
+      });
+      index += html.length - rest$1.length;
+      html = rest$1;
+      parseEndTag(stackedTag, index - endTagLength, index);
+    }
+
+    if (html === last) {
+      options.chars && options.chars(html);
+      if ("development" !== 'production' && !stack.length && options.warn) {
+        options.warn(("Mal-formatted tag at end of template: \"" + html + "\""));
+      }
+      break
+    }
+  }
+
+  // Clean up any remaining tags
+  parseEndTag();
+
+  function advance (n) {
+    index += n;
+    html = html.substring(n);
+  }
+
+  function parseStartTag () {
+    var start = html.match(startTagOpen);
+    if (start) {
+      var match = {
+        tagName: start[1],
+        attrs: [],
+        start: index
+      };
+      advance(start[0].length);
+      var end, attr;
+      while (!(end = html.match(startTagClose)) && (attr = html.match(attribute))) {
+        advance(attr[0].length);
+        match.attrs.push(attr);
+      }
+      if (end) {
+        match.unarySlash = end[1];
+        advance(end[0].length);
+        match.end = index;
+        return match
+      }
+    }
+  }
+
+  function handleStartTag (match) {
+    var tagName = match.tagName;
+    var unarySlash = match.unarySlash;
+
+    if (expectHTML) {
+      if (lastTag === 'p' && isNonPhrasingTag(tagName)) {
+        parseEndTag(lastTag);
+      }
+      if (canBeLeftOpenTag$$1(tagName) && lastTag === tagName) {
+        parseEndTag(tagName);
+      }
+    }
+
+    var unary = isUnaryTag$$1(tagName) || !!unarySlash;
+
+    var l = match.attrs.length;
+    var attrs = new Array(l);
+    for (var i = 0; i < l; i++) {
+      var args = match.attrs[i];
+      // hackish work around FF bug https://bugzilla.mozilla.org/show_bug.cgi?id=369778
+      if (IS_REGEX_CAPTURING_BROKEN && args[0].indexOf('""') === -1) {
+        if (args[3] === '') { delete args[3]; }
+        if (args[4] === '') { delete args[4]; }
+        if (args[5] === '') { delete args[5]; }
+      }
+      var value = args[3] || args[4] || args[5] || '';
+      var shouldDecodeNewlines = tagName === 'a' && args[1] === 'href'
+        ? options.shouldDecodeNewlinesForHref
+        : options.shouldDecodeNewlines;
+      attrs[i] = {
+        name: args[1],
+        value: decodeAttr(value, shouldDecodeNewlines)
+      };
+    }
+
+    if (!unary) {
+      stack.push({ tag: tagName, lowerCasedTag: tagName.toLowerCase(), attrs: attrs });
+      lastTag = tagName;
+    }
+
+    if (options.start) {
+      options.start(tagName, attrs, unary, match.start, match.end);
+    }
+  }
+
+  function parseEndTag (tagName, start, end) {
+    var pos, lowerCasedTagName;
+    if (start == null) { start = index; }
+    if (end == null) { end = index; }
+
+    if (tagName) {
+      lowerCasedTagName = tagName.toLowerCase();
+    }
+
+    // Find the closest opened tag of the same type
+    if (tagName) {
+      for (pos = stack.length - 1; pos >= 0; pos--) {
+        if (stack[pos].lowerCasedTag === lowerCasedTagName) {
+          break
+        }
+      }
+    } else {
+      // If no tag name is provided, clean shop
+      pos = 0;
+    }
+
+    if (pos >= 0) {
+      // Close all the open elements, up the stack
+      for (var i = stack.length - 1; i >= pos; i--) {
+        if ("development" !== 'production' &&
+          (i > pos || !tagName) &&
+          options.warn
+        ) {
+          options.warn(
+            ("tag <" + (stack[i].tag) + "> has no matching end tag.")
+          );
+        }
+        if (options.end) {
+          options.end(stack[i].tag, start, end);
+        }
+      }
+
+      // Remove the open elements from the stack
+      stack.length = pos;
+      lastTag = pos && stack[pos - 1].tag;
+    } else if (lowerCasedTagName === 'br') {
+      if (options.start) {
+        options.start(tagName, [], true, start, end);
+      }
+    } else if (lowerCasedTagName === 'p') {
+      if (options.start) {
+        options.start(tagName, [], false, start, end);
+      }
+      if (options.end) {
+        options.end(tagName, start, end);
+      }
+    }
+  }
+}
+
+/*  */
+
+var splitRE$1 = /\r?\n/g;
+var replaceRE = /./g;
+var isSpecialTag = makeMap('script,style,template', true);
+
+
+
+/**
+ * Parse a single-file component (*.vue) file into an SFC Descriptor Object.
+ */
+function parseComponent (
+  content,
+  options
+) {
+  if ( options === void 0 ) options = {};
+
+  var sfc = {
+    template: null,
+    script: null,
+    styles: [],
+    customBlocks: []
+  };
+  var depth = 0;
+  var currentBlock = null;
+
+  function start (
+    tag,
+    attrs,
+    unary,
+    start,
+    end
+  ) {
+    if (depth === 0) {
+      currentBlock = {
+        type: tag,
+        content: '',
+        start: end,
+        attrs: attrs.reduce(function (cumulated, ref) {
+          var name = ref.name;
+          var value = ref.value;
+
+          cumulated[name] = value || true;
+          return cumulated
+        }, {})
+      };
+      if (isSpecialTag(tag)) {
+        checkAttrs(currentBlock, attrs);
+        if (tag === 'style') {
+          sfc.styles.push(currentBlock);
+        } else {
+          sfc[tag] = currentBlock;
+        }
+      } else { // custom blocks
+        sfc.customBlocks.push(currentBlock);
+      }
+    }
+    if (!unary) {
+      depth++;
+    }
+  }
+
+  function checkAttrs (block, attrs) {
+    for (var i = 0; i < attrs.length; i++) {
+      var attr = attrs[i];
+      if (attr.name === 'lang') {
+        block.lang = attr.value;
+      }
+      if (attr.name === 'scoped') {
+        block.scoped = true;
+      }
+      if (attr.name === 'module') {
+        block.module = attr.value || true;
+      }
+      if (attr.name === 'src') {
+        block.src = attr.value;
+      }
+    }
+  }
+
+  function end (tag, start, end) {
+    if (depth === 1 && currentBlock) {
+      currentBlock.end = start;
+      var text = deIndent(content.slice(currentBlock.start, currentBlock.end));
+      // pad content so that linters and pre-processors can output correct
+      // line numbers in errors and warnings
+      if (currentBlock.type !== 'template' && options.pad) {
+        text = padContent(currentBlock, options.pad) + text;
+      }
+      currentBlock.content = text;
+      currentBlock = null;
+    }
+    depth--;
+  }
+
+  function padContent (block, pad) {
+    if (pad === 'space') {
+      return content.slice(0, block.start).replace(replaceRE, ' ')
+    } else {
+      var offset = content.slice(0, block.start).split(splitRE$1).length;
+      var padChar = block.type === 'script' && !block.lang
+        ? '//\n'
+        : '\n';
+      return Array(offset).join(padChar)
+    }
+  }
+
+  parseHTML(content, {
+    start: start,
+    end: end
+  });
+
+  return sfc
+}
+
+/*  */
+
+/**
+ * Check if a string starts with $ or _
+ */
+
+
+/**
+ * Define a property.
+ */
+function def (obj, key, val, enumerable) {
+  Object.defineProperty(obj, key, {
+    value: val,
+    enumerable: !!enumerable,
+    writable: true,
+    configurable: true
+  });
+}
+
+/*  */
+
+// can we use __proto__?
+var hasProto = '__proto__' in {};
+
+// Browser environment sniffing
+var inBrowser = typeof window !== 'undefined';
+var inWeex = typeof WXEnvironment !== 'undefined' && !!WXEnvironment.platform;
+var weexPlatform = inWeex && WXEnvironment.platform.toLowerCase();
+var UA = inBrowser && window.navigator.userAgent.toLowerCase();
+var isIE = UA && /msie|trident/.test(UA);
+var isIE9 = UA && UA.indexOf('msie 9.0') > 0;
+var isEdge = UA && UA.indexOf('edge/') > 0;
+var isAndroid = (UA && UA.indexOf('android') > 0) || (weexPlatform === 'android');
+var isIOS = (UA && /iphone|ipad|ipod|ios/.test(UA)) || (weexPlatform === 'ios');
+var isChrome = UA && /chrome\/\d+/.test(UA) && !isEdge;
+
+// Firefox has a "watch" function on Object.prototype...
+var nativeWatch = ({}).watch;
+
+
+if (inBrowser) {
+  try {
+    var opts = {};
+    Object.defineProperty(opts, 'passive', ({
+      get: function get () {
+        /* istanbul ignore next */
+        
+      }
+    })); // https://github.com/facebook/flow/issues/285
+    window.addEventListener('test-passive', null, opts);
+  } catch (e) {}
+}
+
+// this needs to be lazy-evaled because vue may be required before
+// vue-server-renderer can set VUE_ENV
+var _isServer;
+var isServerRendering = function () {
+  if (_isServer === undefined) {
+    /* istanbul ignore if */
+    if (!inBrowser && !inWeex && typeof global !== 'undefined') {
+      // detect presence of vue-server-renderer and avoid
+      // Webpack shimming the process
+      _isServer = global['process'].env.VUE_ENV === 'server';
+    } else {
+      _isServer = false;
+    }
+  }
+  return _isServer
+};
+
+// detect devtools
+var devtools = inBrowser && window.__VUE_DEVTOOLS_GLOBAL_HOOK__;
+
+/* istanbul ignore next */
+function isNative (Ctor) {
+  return typeof Ctor === 'function' && /native code/.test(Ctor.toString())
+}
+
+var hasSymbol =
+  typeof Symbol !== 'undefined' && isNative(Symbol) &&
+  typeof Reflect !== 'undefined' && isNative(Reflect.ownKeys);
+
+/* istanbul ignore if */ // $flow-disable-line
+if (typeof Set !== 'undefined' && isNative(Set)) {
+  // use native Set when available.
+  
+} else {
+  // a non-standard Set polyfill that only works with primitive keys.
+  
+}
+
+var ASSET_TYPES = [
+  'component',
+  'directive',
+  'filter'
+];
+
+var LIFECYCLE_HOOKS = [
+  'beforeCreate',
+  'created',
+  'beforeMount',
+  'mounted',
+  'beforeUpdate',
+  'updated',
+  'beforeDestroy',
+  'destroyed',
+  'activated',
+  'deactivated',
+  'errorCaptured'
+];
+
+/*  */
+
+var config = ({
+  /**
+   * Option merge strategies (used in core/util/options)
+   */
+  // $flow-disable-line
+  optionMergeStrategies: Object.create(null),
+
+  /**
+   * Whether to suppress warnings.
+   */
+  silent: false,
+
+  /**
+   * Show production mode tip message on boot?
+   */
+  productionTip: "development" !== 'production',
+
+  /**
+   * Whether to enable devtools
+   */
+  devtools: "development" !== 'production',
+
+  /**
+   * Whether to record perf
+   */
+  performance: false,
+
+  /**
+   * Error handler for watcher errors
+   */
+  errorHandler: null,
+
+  /**
+   * Warn handler for watcher warns
+   */
+  warnHandler: null,
+
+  /**
+   * Ignore certain custom elements
+   */
+  ignoredElements: [],
+
+  /**
+   * Custom user key aliases for v-on
+   */
+  // $flow-disable-line
+  keyCodes: Object.create(null),
+
+  /**
+   * Check if a tag is reserved so that it cannot be registered as a
+   * component. This is platform-dependent and may be overwritten.
+   */
+  isReservedTag: no,
+
+  /**
+   * Check if an attribute is reserved so that it cannot be used as a component
+   * prop. This is platform-dependent and may be overwritten.
+   */
+  isReservedAttr: no,
+
+  /**
+   * Check if a tag is an unknown element.
+   * Platform-dependent.
+   */
+  isUnknownElement: no,
+
+  /**
+   * Get the namespace of an element
+   */
+  getTagNamespace: noop,
+
+  /**
+   * Parse the real tag name for the specific platform.
+   */
+  parsePlatformTagName: identity,
+
+  /**
+   * Check if an attribute must be bound using property, e.g. value
+   * Platform-dependent.
+   */
+  mustUseProp: no,
+
+  /**
+   * Exposed for legacy reasons
+   */
+  _lifecycleHooks: LIFECYCLE_HOOKS
+})
+
+/*  */
+
+var warn = noop;
+var tip = noop;
+var generateComponentTrace = (noop); // work around flow check
+var formatComponentName = (noop);
+
+{
+  var hasConsole = typeof console !== 'undefined';
+  var classifyRE = /(?:^|[-_])(\w)/g;
+  var classify = function (str) { return str
+    .replace(classifyRE, function (c) { return c.toUpperCase(); })
+    .replace(/[-_]/g, ''); };
+
+  warn = function (msg, vm) {
+    var trace = vm ? generateComponentTrace(vm) : '';
+
+    if (config.warnHandler) {
+      config.warnHandler.call(null, msg, vm, trace);
+    } else if (hasConsole && (!config.silent)) {
+      console.error(("[Vue warn]: " + msg + trace));
+    }
+  };
+
+  tip = function (msg, vm) {
+    if (hasConsole && (!config.silent)) {
+      console.warn("[Vue tip]: " + msg + (
+        vm ? generateComponentTrace(vm) : ''
+      ));
+    }
+  };
+
+  formatComponentName = function (vm, includeFile) {
+    if (vm.$root === vm) {
+      return '<Root>'
+    }
+    var options = typeof vm === 'function' && vm.cid != null
+      ? vm.options
+      : vm._isVue
+        ? vm.$options || vm.constructor.options
+        : vm || {};
+    var name = options.name || options._componentTag;
+    var file = options.__file;
+    if (!name && file) {
+      var match = file.match(/([^/\\]+)\.vue$/);
+      name = match && match[1];
+    }
+
+    return (
+      (name ? ("<" + (classify(name)) + ">") : "<Anonymous>") +
+      (file && includeFile !== false ? (" at " + file) : '')
+    )
+  };
+
+  var repeat = function (str, n) {
+    var res = '';
+    while (n) {
+      if (n % 2 === 1) { res += str; }
+      if (n > 1) { str += str; }
+      n >>= 1;
+    }
+    return res
+  };
+
+  generateComponentTrace = function (vm) {
+    if (vm._isVue && vm.$parent) {
+      var tree = [];
+      var currentRecursiveSequence = 0;
+      while (vm) {
+        if (tree.length > 0) {
+          var last = tree[tree.length - 1];
+          if (last.constructor === vm.constructor) {
+            currentRecursiveSequence++;
+            vm = vm.$parent;
+            continue
+          } else if (currentRecursiveSequence > 0) {
+            tree[tree.length - 1] = [last, currentRecursiveSequence];
+            currentRecursiveSequence = 0;
+          }
+        }
+        tree.push(vm);
+        vm = vm.$parent;
+      }
+      return '\n\nfound in\n\n' + tree
+        .map(function (vm, i) { return ("" + (i === 0 ? '---> ' : repeat(' ', 5 + i * 2)) + (Array.isArray(vm)
+            ? ((formatComponentName(vm[0])) + "... (" + (vm[1]) + " recursive calls)")
+            : formatComponentName(vm))); })
+        .join('\n')
+    } else {
+      return ("\n\n(found in " + (formatComponentName(vm)) + ")")
+    }
+  };
+}
+
+/*  */
+
+
+var uid = 0;
+
+/**
+ * A dep is an observable that can have multiple
+ * directives subscribing to it.
+ */
+var Dep = function Dep () {
+  this.id = uid++;
+  this.subs = [];
+};
+
+Dep.prototype.addSub = function addSub (sub) {
+  this.subs.push(sub);
+};
+
+Dep.prototype.removeSub = function removeSub (sub) {
+  remove(this.subs, sub);
+};
+
+Dep.prototype.depend = function depend () {
+  if (Dep.target) {
+    Dep.target.addDep(this);
+  }
+};
+
+Dep.prototype.notify = function notify () {
+  // stabilize the subscriber list first
+  var subs = this.subs.slice();
+  for (var i = 0, l = subs.length; i < l; i++) {
+    subs[i].update();
+  }
+};
+
+// the current target watcher being evaluated.
+// this is globally unique because there could be only one
+// watcher being evaluated at any time.
+Dep.target = null;
+
+/*  */
+
+var VNode = function VNode (
+  tag,
+  data,
+  children,
+  text,
+  elm,
+  context,
+  componentOptions,
+  asyncFactory
+) {
+  this.tag = tag;
+  this.data = data;
+  this.children = children;
+  this.text = text;
+  this.elm = elm;
+  this.ns = undefined;
+  this.context = context;
+  this.fnContext = undefined;
+  this.fnOptions = undefined;
+  this.fnScopeId = undefined;
+  this.key = data && data.key;
+  this.componentOptions = componentOptions;
+  this.componentInstance = undefined;
+  this.parent = undefined;
+  this.raw = false;
+  this.isStatic = false;
+  this.isRootInsert = true;
+  this.isComment = false;
+  this.isCloned = false;
+  this.isOnce = false;
+  this.asyncFactory = asyncFactory;
+  this.asyncMeta = undefined;
+  this.isAsyncPlaceholder = false;
+};
+
+var prototypeAccessors = { child: { configurable: true } };
+
+// DEPRECATED: alias for componentInstance for backwards compat.
+/* istanbul ignore next */
+prototypeAccessors.child.get = function () {
+  return this.componentInstance
+};
+
+Object.defineProperties( VNode.prototype, prototypeAccessors );
+
+
+
+
+
+// optimized shallow clone
+// used for static nodes and slot nodes because they may be reused across
+// multiple renders, cloning them avoids errors when DOM manipulations rely
+// on their elm reference.
+
+/*
+ * not type checking this file because flow doesn't play well with
+ * dynamically accessing methods on Array prototype
+ */
+
+var arrayProto = Array.prototype;
+var arrayMethods = Object.create(arrayProto);
+
+var methodsToPatch = [
+  'push',
+  'pop',
+  'shift',
+  'unshift',
+  'splice',
+  'sort',
+  'reverse'
+];
+
+/**
+ * Intercept mutating methods and emit events
+ */
+methodsToPatch.forEach(function (method) {
+  // cache original method
+  var original = arrayProto[method];
+  def(arrayMethods, method, function mutator () {
+    var args = [], len = arguments.length;
+    while ( len-- ) args[ len ] = arguments[ len ];
+
+    var result = original.apply(this, args);
+    var ob = this.__ob__;
+    var inserted;
+    switch (method) {
+      case 'push':
+      case 'unshift':
+        inserted = args;
+        break
+      case 'splice':
+        inserted = args.slice(2);
+        break
+    }
+    if (inserted) { ob.observeArray(inserted); }
+    // notify change
+    ob.dep.notify();
+    return result
+  });
+});
+
+/*  */
+
+var arrayKeys = Object.getOwnPropertyNames(arrayMethods);
+
+/**
+ * In some cases we may want to disable observation inside a component's
+ * update computation.
+ */
+var shouldObserve = true;
+
+
+
+/**
+ * Observer class that is attached to each observed
+ * object. Once attached, the observer converts the target
+ * object's property keys into getter/setters that
+ * collect dependencies and dispatch updates.
+ */
+var Observer = function Observer (value) {
+  this.value = value;
+  this.dep = new Dep();
+  this.vmCount = 0;
+  def(value, '__ob__', this);
+  if (Array.isArray(value)) {
+    var augment = hasProto
+      ? protoAugment
+      : copyAugment;
+    augment(value, arrayMethods, arrayKeys);
+    this.observeArray(value);
+  } else {
+    this.walk(value);
+  }
+};
+
+/**
+ * Walk through each property and convert them into
+ * getter/setters. This method should only be called when
+ * value type is Object.
+ */
+Observer.prototype.walk = function walk (obj) {
+  var keys = Object.keys(obj);
+  for (var i = 0; i < keys.length; i++) {
+    defineReactive(obj, keys[i]);
+  }
+};
+
+/**
+ * Observe a list of Array items.
+ */
+Observer.prototype.observeArray = function observeArray (items) {
+  for (var i = 0, l = items.length; i < l; i++) {
+    observe(items[i]);
+  }
+};
+
+// helpers
+
+/**
+ * Augment an target Object or Array by intercepting
+ * the prototype chain using __proto__
+ */
+function protoAugment (target, src, keys) {
+  /* eslint-disable no-proto */
+  target.__proto__ = src;
+  /* eslint-enable no-proto */
+}
+
+/**
+ * Augment an target Object or Array by defining
+ * hidden properties.
+ */
+/* istanbul ignore next */
+function copyAugment (target, src, keys) {
+  for (var i = 0, l = keys.length; i < l; i++) {
+    var key = keys[i];
+    def(target, key, src[key]);
+  }
+}
+
+/**
+ * Attempt to create an observer instance for a value,
+ * returns the new observer if successfully observed,
+ * or the existing observer if the value already has one.
+ */
+function observe (value, asRootData) {
+  if (!isObject(value) || value instanceof VNode) {
+    return
+  }
+  var ob;
+  if (hasOwn(value, '__ob__') && value.__ob__ instanceof Observer) {
+    ob = value.__ob__;
+  } else if (
+    shouldObserve &&
+    !isServerRendering() &&
+    (Array.isArray(value) || isPlainObject(value)) &&
+    Object.isExtensible(value) &&
+    !value._isVue
+  ) {
+    ob = new Observer(value);
+  }
+  if (asRootData && ob) {
+    ob.vmCount++;
+  }
+  return ob
+}
+
+/**
+ * Define a reactive property on an Object.
+ */
+function defineReactive (
+  obj,
+  key,
+  val,
+  customSetter,
+  shallow
+) {
+  var dep = new Dep();
+
+  var property = Object.getOwnPropertyDescriptor(obj, key);
+  if (property && property.configurable === false) {
+    return
+  }
+
+  // cater for pre-defined getter/setters
+  var getter = property && property.get;
+  if (!getter && arguments.length === 2) {
+    val = obj[key];
+  }
+  var setter = property && property.set;
+
+  var childOb = !shallow && observe(val);
+  Object.defineProperty(obj, key, {
+    enumerable: true,
+    configurable: true,
+    get: function reactiveGetter () {
+      var value = getter ? getter.call(obj) : val;
+      if (Dep.target) {
+        dep.depend();
+        if (childOb) {
+          childOb.dep.depend();
+          if (Array.isArray(value)) {
+            dependArray(value);
+          }
+        }
+      }
+      return value
+    },
+    set: function reactiveSetter (newVal) {
+      var value = getter ? getter.call(obj) : val;
+      /* eslint-disable no-self-compare */
+      if (newVal === value || (newVal !== newVal && value !== value)) {
+        return
+      }
+      /* eslint-enable no-self-compare */
+      if ("development" !== 'production' && customSetter) {
+        customSetter();
+      }
+      if (setter) {
+        setter.call(obj, newVal);
+      } else {
+        val = newVal;
+      }
+      childOb = !shallow && observe(newVal);
+      dep.notify();
+    }
+  });
+}
+
+/**
+ * Set a property on an object. Adds the new property and
+ * triggers change notification if the property doesn't
+ * already exist.
+ */
+function set (target, key, val) {
+  if ("development" !== 'production' &&
+    (isUndef(target) || isPrimitive(target))
+  ) {
+    warn(("Cannot set reactive property on undefined, null, or primitive value: " + ((target))));
+  }
+  if (Array.isArray(target) && isValidArrayIndex(key)) {
+    target.length = Math.max(target.length, key);
+    target.splice(key, 1, val);
+    return val
+  }
+  if (key in target && !(key in Object.prototype)) {
+    target[key] = val;
+    return val
+  }
+  var ob = (target).__ob__;
+  if (target._isVue || (ob && ob.vmCount)) {
+    "development" !== 'production' && warn(
+      'Avoid adding reactive properties to a Vue instance or its root $data ' +
+      'at runtime - declare it upfront in the data option.'
+    );
+    return val
+  }
+  if (!ob) {
+    target[key] = val;
+    return val
+  }
+  defineReactive(ob.value, key, val);
+  ob.dep.notify();
+  return val
+}
+
+/**
+ * Delete a property and trigger change if necessary.
+ */
+
+
+/**
+ * Collect dependencies on array elements when the array is touched, since
+ * we cannot intercept array element access like property getters.
+ */
+function dependArray (value) {
+  for (var e = (void 0), i = 0, l = value.length; i < l; i++) {
+    e = value[i];
+    e && e.__ob__ && e.__ob__.dep.depend();
+    if (Array.isArray(e)) {
+      dependArray(e);
+    }
+  }
+}
+
+/*  */
+
+/**
+ * Option overwriting strategies are functions that handle
+ * how to merge a parent option value and a child option
+ * value into the final value.
+ */
+var strats = config.optionMergeStrategies;
+
+/**
+ * Options with restrictions
+ */
+{
+  strats.el = strats.propsData = function (parent, child, vm, key) {
+    if (!vm) {
+      warn(
+        "option \"" + key + "\" can only be used during instance " +
+        'creation with the `new` keyword.'
+      );
+    }
+    return defaultStrat(parent, child)
+  };
+}
+
+/**
+ * Helper that recursively merges two data objects together.
+ */
+function mergeData (to, from) {
+  if (!from) { return to }
+  var key, toVal, fromVal;
+  var keys = Object.keys(from);
+  for (var i = 0; i < keys.length; i++) {
+    key = keys[i];
+    toVal = to[key];
+    fromVal = from[key];
+    if (!hasOwn(to, key)) {
+      set(to, key, fromVal);
+    } else if (isPlainObject(toVal) && isPlainObject(fromVal)) {
+      mergeData(toVal, fromVal);
+    }
+  }
+  return to
+}
+
+/**
+ * Data
+ */
+function mergeDataOrFn (
+  parentVal,
+  childVal,
+  vm
+) {
+  if (!vm) {
+    // in a Vue.extend merge, both should be functions
+    if (!childVal) {
+      return parentVal
+    }
+    if (!parentVal) {
+      return childVal
+    }
+    // when parentVal & childVal are both present,
+    // we need to return a function that returns the
+    // merged result of both functions... no need to
+    // check if parentVal is a function here because
+    // it has to be a function to pass previous merges.
+    return function mergedDataFn () {
+      return mergeData(
+        typeof childVal === 'function' ? childVal.call(this, this) : childVal,
+        typeof parentVal === 'function' ? parentVal.call(this, this) : parentVal
+      )
+    }
+  } else {
+    return function mergedInstanceDataFn () {
+      // instance merge
+      var instanceData = typeof childVal === 'function'
+        ? childVal.call(vm, vm)
+        : childVal;
+      var defaultData = typeof parentVal === 'function'
+        ? parentVal.call(vm, vm)
+        : parentVal;
+      if (instanceData) {
+        return mergeData(instanceData, defaultData)
+      } else {
+        return defaultData
+      }
+    }
+  }
+}
+
+strats.data = function (
+  parentVal,
+  childVal,
+  vm
+) {
+  if (!vm) {
+    if (childVal && typeof childVal !== 'function') {
+      "development" !== 'production' && warn(
+        'The "data" option should be a function ' +
+        'that returns a per-instance value in component ' +
+        'definitions.',
+        vm
+      );
+
+      return parentVal
+    }
+    return mergeDataOrFn(parentVal, childVal)
+  }
+
+  return mergeDataOrFn(parentVal, childVal, vm)
+};
+
+/**
+ * Hooks and props are merged as arrays.
+ */
+function mergeHook (
+  parentVal,
+  childVal
+) {
+  return childVal
+    ? parentVal
+      ? parentVal.concat(childVal)
+      : Array.isArray(childVal)
+        ? childVal
+        : [childVal]
+    : parentVal
+}
+
+LIFECYCLE_HOOKS.forEach(function (hook) {
+  strats[hook] = mergeHook;
+});
+
+/**
+ * Assets
+ *
+ * When a vm is present (instance creation), we need to do
+ * a three-way merge between constructor options, instance
+ * options and parent options.
+ */
+function mergeAssets (
+  parentVal,
+  childVal,
+  vm,
+  key
+) {
+  var res = Object.create(parentVal || null);
+  if (childVal) {
+    "development" !== 'production' && assertObjectType(key, childVal, vm);
+    return extend(res, childVal)
+  } else {
+    return res
+  }
+}
+
+ASSET_TYPES.forEach(function (type) {
+  strats[type + 's'] = mergeAssets;
+});
+
+/**
+ * Watchers.
+ *
+ * Watchers hashes should not overwrite one
+ * another, so we merge them as arrays.
+ */
+strats.watch = function (
+  parentVal,
+  childVal,
+  vm,
+  key
+) {
+  // work around Firefox's Object.prototype.watch...
+  if (parentVal === nativeWatch) { parentVal = undefined; }
+  if (childVal === nativeWatch) { childVal = undefined; }
+  /* istanbul ignore if */
+  if (!childVal) { return Object.create(parentVal || null) }
+  {
+    assertObjectType(key, childVal, vm);
+  }
+  if (!parentVal) { return childVal }
+  var ret = {};
+  extend(ret, parentVal);
+  for (var key$1 in childVal) {
+    var parent = ret[key$1];
+    var child = childVal[key$1];
+    if (parent && !Array.isArray(parent)) {
+      parent = [parent];
+    }
+    ret[key$1] = parent
+      ? parent.concat(child)
+      : Array.isArray(child) ? child : [child];
+  }
+  return ret
+};
+
+/**
+ * Other object hashes.
+ */
+strats.props =
+strats.methods =
+strats.inject =
+strats.computed = function (
+  parentVal,
+  childVal,
+  vm,
+  key
+) {
+  if (childVal && "development" !== 'production') {
+    assertObjectType(key, childVal, vm);
+  }
+  if (!parentVal) { return childVal }
+  var ret = Object.create(null);
+  extend(ret, parentVal);
+  if (childVal) { extend(ret, childVal); }
+  return ret
+};
+strats.provide = mergeDataOrFn;
+
+/**
+ * Default strategy.
+ */
+var defaultStrat = function (parentVal, childVal) {
+  return childVal === undefined
+    ? parentVal
+    : childVal
+};
+
+
+
+function assertObjectType (name, value, vm) {
+  if (!isPlainObject(value)) {
+    warn(
+      "Invalid value for option \"" + name + "\": expected an Object, " +
+      "but got " + (toRawType(value)) + ".",
+      vm
+    );
+  }
+}
+
+/**
+ * Merge two option objects into a new one.
+ * Core utility used in both instantiation and inheritance.
+ */
+
+
+/**
+ * Resolve an asset.
+ * This function is used because child instances need access
+ * to assets defined in its ancestor chain.
+ */
+
+/*  */
+
+/*  */
+
+/*  */
+/* globals MessageChannel */
+
+var callbacks = [];
+function flushCallbacks () {
+  var copies = callbacks.slice(0);
+  callbacks.length = 0;
+  for (var i = 0; i < copies.length; i++) {
+    copies[i]();
+  }
+}
+
+// Determine (macro) task defer implementation.
+// Technically setImmediate should be the ideal choice, but it's only available
+// in IE. The only polyfill that consistently queues the callback after all DOM
+// events triggered in the same loop is by using MessageChannel.
+/* istanbul ignore if */
+if (typeof setImmediate !== 'undefined' && isNative(setImmediate)) {
+  
+} else if (typeof MessageChannel !== 'undefined' && (
+  isNative(MessageChannel) ||
+  // PhantomJS
+  MessageChannel.toString() === '[object MessageChannelConstructor]'
+)) {
+  var channel = new MessageChannel();
+  channel.port1.onmessage = flushCallbacks;
+  
+} else {
+  /* istanbul ignore next */
+  
+}
+
+// Determine microtask defer implementation.
+/* istanbul ignore next, $flow-disable-line */
+if (typeof Promise !== 'undefined' && isNative(Promise)) {
+  
+} else {
+  // fallback to macro
+  
+}
+
+/**
+ * Wrap a function so that if any code inside triggers state change,
+ * the changes are queued using a (macro) task instead of a microtask.
+ */
+
+/*  */
+
+/*  */
+
+// these are reserved for web because they are directly compiled away
+// during template compilation
+var isReservedAttr = makeMap('style,class');
+
+// attributes that should be using props for binding
+var acceptValue = makeMap('input,textarea,option,select,progress');
+var mustUseProp = function (tag, type, attr) {
+  return (
+    (attr === 'value' && acceptValue(tag)) && type !== 'button' ||
+    (attr === 'selected' && tag === 'option') ||
+    (attr === 'checked' && tag === 'input') ||
+    (attr === 'muted' && tag === 'video')
+  )
+};
+
+var isEnumeratedAttr = makeMap('contenteditable,draggable,spellcheck');
+
+var isBooleanAttr = makeMap(
+  'allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,' +
+  'default,defaultchecked,defaultmuted,defaultselected,defer,disabled,' +
+  'enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,' +
+  'muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,' +
+  'required,reversed,scoped,seamless,selected,sortable,translate,' +
+  'truespeed,typemustmatch,visible'
+);
+
+/*  */
+
+/*  */
+
+
+
+var isHTMLTag = makeMap(
+  'html,body,base,head,link,meta,style,title,' +
+  'address,article,aside,footer,header,h1,h2,h3,h4,h5,h6,hgroup,nav,section,' +
+  'div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,' +
+  'a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,rtc,ruby,' +
+  's,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,' +
+  'embed,object,param,source,canvas,script,noscript,del,ins,' +
+  'caption,col,colgroup,table,thead,tbody,td,th,tr,' +
+  'button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,' +
+  'output,progress,select,textarea,' +
+  'details,dialog,menu,menuitem,summary,' +
+  'content,element,shadow,template,blockquote,iframe,tfoot'
+);
+
+// this map is intentionally selective, only covering SVG elements that may
+// contain child elements.
+var isSVG = makeMap(
+  'svg,animate,circle,clippath,cursor,defs,desc,ellipse,filter,font-face,' +
+  'foreignObject,g,glyph,image,line,marker,mask,missing-glyph,path,pattern,' +
+  'polygon,polyline,rect,switch,symbol,text,textpath,tspan,use,view',
+  true
+);
+
+var isPreTag = function (tag) { return tag === 'pre'; };
+
+var isReservedTag = function (tag) {
+  return isHTMLTag(tag) || isSVG(tag)
+};
+
+function getTagNamespace (tag) {
+  if (isSVG(tag)) {
+    return 'svg'
+  }
+  // basic support for MathML
+  // note it doesn't support other MathML elements being component roots
+  if (tag === 'math') {
+    return 'math'
+  }
+}
+
+
+
+var isTextInputType = makeMap('text,number,password,search,email,tel,url');
+
+/*  */
+
+/**
+ * Query an element selector if it's not an element already.
+ */
+
+/*  */
+
+var validDivisionCharRE = /[\w).+\-_$\]]/;
+
+function parseFilters (exp) {
+  var inSingle = false;
+  var inDouble = false;
+  var inTemplateString = false;
+  var inRegex = false;
+  var curly = 0;
+  var square = 0;
+  var paren = 0;
+  var lastFilterIndex = 0;
+  var c, prev, i, expression, filters;
+
+  for (i = 0; i < exp.length; i++) {
+    prev = c;
+    c = exp.charCodeAt(i);
+    if (inSingle) {
+      if (c === 0x27 && prev !== 0x5C) { inSingle = false; }
+    } else if (inDouble) {
+      if (c === 0x22 && prev !== 0x5C) { inDouble = false; }
+    } else if (inTemplateString) {
+      if (c === 0x60 && prev !== 0x5C) { inTemplateString = false; }
+    } else if (inRegex) {
+      if (c === 0x2f && prev !== 0x5C) { inRegex = false; }
+    } else if (
+      c === 0x7C && // pipe
+      exp.charCodeAt(i + 1) !== 0x7C &&
+      exp.charCodeAt(i - 1) !== 0x7C &&
+      !curly && !square && !paren
+    ) {
+      if (expression === undefined) {
+        // first filter, end of expression
+        lastFilterIndex = i + 1;
+        expression = exp.slice(0, i).trim();
+      } else {
+        pushFilter();
+      }
+    } else {
+      switch (c) {
+        case 0x22: inDouble = true; break         // "
+        case 0x27: inSingle = true; break         // '
+        case 0x60: inTemplateString = true; break // `
+        case 0x28: paren++; break                 // (
+        case 0x29: paren--; break                 // )
+        case 0x5B: square++; break                // [
+        case 0x5D: square--; break                // ]
+        case 0x7B: curly++; break                 // {
+        case 0x7D: curly--; break                 // }
+      }
+      if (c === 0x2f) { // /
+        var j = i - 1;
+        var p = (void 0);
+        // find first non-whitespace prev char
+        for (; j >= 0; j--) {
+          p = exp.charAt(j);
+          if (p !== ' ') { break }
+        }
+        if (!p || !validDivisionCharRE.test(p)) {
+          inRegex = true;
+        }
+      }
+    }
+  }
+
+  if (expression === undefined) {
+    expression = exp.slice(0, i).trim();
+  } else if (lastFilterIndex !== 0) {
+    pushFilter();
+  }
+
+  function pushFilter () {
+    (filters || (filters = [])).push(exp.slice(lastFilterIndex, i).trim());
+    lastFilterIndex = i + 1;
+  }
+
+  if (filters) {
+    for (i = 0; i < filters.length; i++) {
+      expression = wrapFilter(expression, filters[i]);
+    }
+  }
+
+  return expression
+}
+
+function wrapFilter (exp, filter) {
+  var i = filter.indexOf('(');
+  if (i < 0) {
+    // _f: resolveFilter
+    return ("_f(\"" + filter + "\")(" + exp + ")")
+  } else {
+    var name = filter.slice(0, i);
+    var args = filter.slice(i + 1);
+    return ("_f(\"" + name + "\")(" + exp + (args !== ')' ? ',' + args : args))
+  }
+}
+
+/*  */
+
+var defaultTagRE = /\{\{((?:.|\n)+?)\}\}/g;
+var regexEscapeRE = /[-.*+?^${}()|[\]\/\\]/g;
+
+var buildRegex = cached(function (delimiters) {
+  var open = delimiters[0].replace(regexEscapeRE, '\\$&');
+  var close = delimiters[1].replace(regexEscapeRE, '\\$&');
+  return new RegExp(open + '((?:.|\\n)+?)' + close, 'g')
+});
+
+
+
+function parseText (
+  text,
+  delimiters
+) {
+  var tagRE = delimiters ? buildRegex(delimiters) : defaultTagRE;
+  if (!tagRE.test(text)) {
+    return
+  }
+  var tokens = [];
+  var rawTokens = [];
+  var lastIndex = tagRE.lastIndex = 0;
+  var match, index, tokenValue;
+  while ((match = tagRE.exec(text))) {
+    index = match.index;
+    // push text token
+    if (index > lastIndex) {
+      rawTokens.push(tokenValue = text.slice(lastIndex, index));
+      tokens.push(JSON.stringify(tokenValue));
+    }
+    // tag token
+    var exp = parseFilters(match[1].trim());
+    tokens.push(("_s(" + exp + ")"));
+    rawTokens.push({ '@binding': exp });
+    lastIndex = index + match[0].length;
+  }
+  if (lastIndex < text.length) {
+    rawTokens.push(tokenValue = text.slice(lastIndex));
+    tokens.push(JSON.stringify(tokenValue));
+  }
+  return {
+    expression: tokens.join('+'),
+    tokens: rawTokens
+  }
+}
+
+/*  */
+
+function baseWarn (msg) {
+  console.error(("[Vue compiler]: " + msg));
+}
+
+function pluckModuleFunction (
+  modules,
+  key
+) {
+  return modules
+    ? modules.map(function (m) { return m[key]; }).filter(function (_) { return _; })
+    : []
+}
+
+function addProp (el, name, value) {
+  (el.props || (el.props = [])).push({ name: name, value: value });
+  el.plain = false;
+}
+
+function addAttr (el, name, value) {
+  (el.attrs || (el.attrs = [])).push({ name: name, value: value });
+  el.plain = false;
+}
+
+// add a raw attr (use this in preTransforms)
+function addRawAttr (el, name, value) {
+  el.attrsMap[name] = value;
+  el.attrsList.push({ name: name, value: value });
+}
+
+function addDirective (
+  el,
+  name,
+  rawName,
+  value,
+  arg,
+  modifiers
+) {
+  (el.directives || (el.directives = [])).push({ name: name, rawName: rawName, value: value, arg: arg, modifiers: modifiers });
+  el.plain = false;
+}
+
+function addHandler (
+  el,
+  name,
+  value,
+  modifiers,
+  important,
+  warn
+) {
+  modifiers = modifiers || emptyObject;
+  // warn prevent and passive modifier
+  /* istanbul ignore if */
+  if (
+    "development" !== 'production' && warn &&
+    modifiers.prevent && modifiers.passive
+  ) {
+    warn(
+      'passive and prevent can\'t be used together. ' +
+      'Passive handler can\'t prevent default event.'
+    );
+  }
+
+  // check capture modifier
+  if (modifiers.capture) {
+    delete modifiers.capture;
+    name = '!' + name; // mark the event as captured
+  }
+  if (modifiers.once) {
+    delete modifiers.once;
+    name = '~' + name; // mark the event as once
+  }
+  /* istanbul ignore if */
+  if (modifiers.passive) {
+    delete modifiers.passive;
+    name = '&' + name; // mark the event as passive
+  }
+
+  // normalize click.right and click.middle since they don't actually fire
+  // this is technically browser-specific, but at least for now browsers are
+  // the only target envs that have right/middle clicks.
+  if (name === 'click') {
+    if (modifiers.right) {
+      name = 'contextmenu';
+      delete modifiers.right;
+    } else if (modifiers.middle) {
+      name = 'mouseup';
+    }
+  }
+
+  var events;
+  if (modifiers.native) {
+    delete modifiers.native;
+    events = el.nativeEvents || (el.nativeEvents = {});
+  } else {
+    events = el.events || (el.events = {});
+  }
+
+  var newHandler = {
+    value: value.trim()
+  };
+  if (modifiers !== emptyObject) {
+    newHandler.modifiers = modifiers;
+  }
+
+  var handlers = events[name];
+  /* istanbul ignore if */
+  if (Array.isArray(handlers)) {
+    important ? handlers.unshift(newHandler) : handlers.push(newHandler);
+  } else if (handlers) {
+    events[name] = important ? [newHandler, handlers] : [handlers, newHandler];
+  } else {
+    events[name] = newHandler;
+  }
+
+  el.plain = false;
+}
+
+function getBindingAttr (
+  el,
+  name,
+  getStatic
+) {
+  var dynamicValue =
+    getAndRemoveAttr(el, ':' + name) ||
+    getAndRemoveAttr(el, 'v-bind:' + name);
+  if (dynamicValue != null) {
+    return parseFilters(dynamicValue)
+  } else if (getStatic !== false) {
+    var staticValue = getAndRemoveAttr(el, name);
+    if (staticValue != null) {
+      return JSON.stringify(staticValue)
+    }
+  }
+}
+
+// note: this only removes the attr from the Array (attrsList) so that it
+// doesn't get processed by processAttrs.
+// By default it does NOT remove it from the map (attrsMap) because the map is
+// needed during codegen.
+function getAndRemoveAttr (
+  el,
+  name,
+  removeFromMap
+) {
+  var val;
+  if ((val = el.attrsMap[name]) != null) {
+    var list = el.attrsList;
+    for (var i = 0, l = list.length; i < l; i++) {
+      if (list[i].name === name) {
+        list.splice(i, 1);
+        break
+      }
+    }
+  }
+  if (removeFromMap) {
+    delete el.attrsMap[name];
+  }
+  return val
+}
+
+/*  */
+
+function transformNode (el, options) {
+  var warn = options.warn || baseWarn;
+  var staticClass = getAndRemoveAttr(el, 'class');
+  if ("development" !== 'production' && staticClass) {
+    var res = parseText(staticClass, options.delimiters);
+    if (res) {
+      warn(
+        "class=\"" + staticClass + "\": " +
+        'Interpolation inside attributes has been removed. ' +
+        'Use v-bind or the colon shorthand instead. For example, ' +
+        'instead of <div class="{{ val }}">, use <div :class="val">.'
+      );
+    }
+  }
+  if (staticClass) {
+    el.staticClass = JSON.stringify(staticClass);
+  }
+  var classBinding = getBindingAttr(el, 'class', false /* getStatic */);
+  if (classBinding) {
+    el.classBinding = classBinding;
+  }
+}
+
+function genData (el) {
+  var data = '';
+  if (el.staticClass) {
+    data += "staticClass:" + (el.staticClass) + ",";
+  }
+  if (el.classBinding) {
+    data += "class:" + (el.classBinding) + ",";
+  }
+  return data
+}
+
+var klass = {
+  staticKeys: ['staticClass'],
+  transformNode: transformNode,
+  genData: genData
+}
+
+/*  */
+
+var parseStyleText = cached(function (cssText) {
+  var res = {};
+  var listDelimiter = /;(?![^(]*\))/g;
+  var propertyDelimiter = /:(.+)/;
+  cssText.split(listDelimiter).forEach(function (item) {
+    if (item) {
+      var tmp = item.split(propertyDelimiter);
+      tmp.length > 1 && (res[tmp[0].trim()] = tmp[1].trim());
+    }
+  });
+  return res
+});
+
+// normalize possible array / string values into Object
+
+
+/**
+ * parent component style should be after child's
+ * so that parent component's style could override it
+ */
+
+/*  */
+
+function transformNode$1 (el, options) {
+  var warn = options.warn || baseWarn;
+  var staticStyle = getAndRemoveAttr(el, 'style');
+  if (staticStyle) {
+    /* istanbul ignore if */
+    {
+      var res = parseText(staticStyle, options.delimiters);
+      if (res) {
+        warn(
+          "style=\"" + staticStyle + "\": " +
+          'Interpolation inside attributes has been removed. ' +
+          'Use v-bind or the colon shorthand instead. For example, ' +
+          'instead of <div style="{{ val }}">, use <div :style="val">.'
+        );
+      }
+    }
+    el.staticStyle = JSON.stringify(parseStyleText(staticStyle));
+  }
+
+  var styleBinding = getBindingAttr(el, 'style', false /* getStatic */);
+  if (styleBinding) {
+    el.styleBinding = styleBinding;
+  }
+}
+
+function genData$1 (el) {
+  var data = '';
+  if (el.staticStyle) {
+    data += "staticStyle:" + (el.staticStyle) + ",";
+  }
+  if (el.styleBinding) {
+    data += "style:(" + (el.styleBinding) + "),";
+  }
+  return data
+}
+
+var style = {
+  staticKeys: ['staticStyle'],
+  transformNode: transformNode$1,
+  genData: genData$1
+}
+
+var commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
+
+
+
+
+
+function createCommonjsModule(fn, module) {
+       return module = { exports: {} }, fn(module, module.exports), module.exports;
+}
+
+var he = createCommonjsModule(function (module, exports) {
+/*! https://mths.be/he v1.1.1 by @mathias | MIT license */
+(function(root) {
+
+       // Detect free variables `exports`.
+       var freeExports = 'object' == 'object' && exports;
+
+       // Detect free variable `module`.
+       var freeModule = 'object' == 'object' && module &&
+               module.exports == freeExports && module;
+
+       // Detect free variable `global`, from Node.js or Browserified code,
+       // and use it as `root`.
+       var freeGlobal = typeof commonjsGlobal == 'object' && commonjsGlobal;
+       if (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal) {
+               root = freeGlobal;
+       }
+
+       /*--------------------------------------------------------------------------*/
+
+       // All astral symbols.
+       var regexAstralSymbols = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g;
+       // All ASCII symbols (not just printable ASCII) except those listed in the
+       // first column of the overrides table.
+       // https://html.spec.whatwg.org/multipage/syntax.html#table-charref-overrides
+       var regexAsciiWhitelist = /[\x01-\x7F]/g;
+       // All BMP symbols that are not ASCII newlines, printable ASCII symbols, or
+       // code points listed in the first column of the overrides table on
+       // https://html.spec.whatwg.org/multipage/syntax.html#table-charref-overrides.
+       var regexBmpWhitelist = /[\x01-\t\x0B\f\x0E-\x1F\x7F\x81\x8D\x8F\x90\x9D\xA0-\uFFFF]/g;
+
+       var regexEncodeNonAscii = /<\u20D2|=\u20E5|>\u20D2|\u205F\u200A|\u219D\u0338|\u2202\u0338|\u2220\u20D2|\u2229\uFE00|\u222A\uFE00|\u223C\u20D2|\u223D\u0331|\u223E\u0333|\u2242\u0338|\u224B\u0338|\u224D\u20D2|\u224E\u0338|\u224F\u0338|\u2250\u0338|\u2261\u20E5|\u2264\u20D2|\u2265\u20D2|\u2266\u0338|\u2267\u0338|\u2268\uFE00|\u2269\uFE00|\u226A\u0338|\u226A\u20D2|\u226B\u0338|\u226B\u20D2|\u227F\u0338|\u2282\u20D2|\u2283\u20D2|\u228A\uFE00|\u228B\uFE00|\u228F\u0338|\u2290\u0338|\u2293\uFE00|\u2294\uFE00|\u22B4\u20D2|\u22B5\u20D2|\u22D8\u0338|\u22D9\u0338|\u22DA\uFE00|\u22DB\uFE00|\u22F5\u0338|\u22F9\u0338|\u2933\u0338|\u29CF\u0338|\u29D0\u0338|\u2A6D\u0338|\u2A70\u0338|\u2A7D\u0338|\u2A7E\u0338|\u2AA1\u0338|\u2AA2\u0338|\u2AAC\uFE00|\u2AAD\uFE00|\u2AAF\u0338|\u2AB0\u0338|\u2AC5\u0338|\u2AC6\u0338|\u2ACB\uFE00|\u2ACC\uFE00|\u2AFD\u20E5|[\xA0-\u0113\u0116-\u0122\u0124-\u012B\u012E-\u014D\u0150-\u017E\u0192\u01B5\u01F5\u0237\u02C6\u02C7\u02D8-\u02DD\u0311\u0391-\u03A1\u03A3-\u03A9\u03B1-\u03C9\u03D1\u03D2\u03D5\u03D6\u03DC\u03DD\u03F0\u03F1\u03F5\u03F6\u0401-\u040C\u040E-\u044F\u0451-\u045C\u045E\u045F\u2002-\u2005\u2007-\u2010\u2013-\u2016\u2018-\u201A\u201C-\u201E\u2020-\u2022\u2025\u2026\u2030-\u2035\u2039\u203A\u203E\u2041\u2043\u2044\u204F\u2057\u205F-\u2063\u20AC\u20DB\u20DC\u2102\u2105\u210A-\u2113\u2115-\u211E\u2122\u2124\u2127-\u2129\u212C\u212D\u212F-\u2131\u2133-\u2138\u2145-\u2148\u2153-\u215E\u2190-\u219B\u219D-\u21A7\u21A9-\u21AE\u21B0-\u21B3\u21B5-\u21B7\u21BA-\u21DB\u21DD\u21E4\u21E5\u21F5\u21FD-\u2205\u2207-\u2209\u220B\u220C\u220F-\u2214\u2216-\u2218\u221A\u221D-\u2238\u223A-\u2257\u2259\u225A\u225C\u225F-\u2262\u2264-\u228B\u228D-\u229B\u229D-\u22A5\u22A7-\u22B0\u22B2-\u22BB\u22BD-\u22DB\u22DE-\u22E3\u22E6-\u22F7\u22F9-\u22FE\u2305\u2306\u2308-\u2310\u2312\u2313\u2315\u2316\u231C-\u231F\u2322\u2323\u232D\u232E\u2336\u233D\u233F\u237C\u23B0\u23B1\u23B4-\u23B6\u23DC-\u23DF\u23E2\u23E7\u2423\u24C8\u2500\u2502\u250C\u2510\u2514\u2518\u251C\u2524\u252C\u2534\u253C\u2550-\u256C\u2580\u2584\u2588\u2591-\u2593\u25A1\u25AA\u25AB\u25AD\u25AE\u25B1\u25B3-\u25B5\u25B8\u25B9\u25BD-\u25BF\u25C2\u25C3\u25CA\u25CB\u25EC\u25EF\u25F8-\u25FC\u2605\u2606\u260E\u2640\u2642\u2660\u2663\u2665\u2666\u266A\u266D-\u266F\u2713\u2717\u2720\u2736\u2758\u2772\u2773\u27C8\u27C9\u27E6-\u27ED\u27F5-\u27FA\u27FC\u27FF\u2902-\u2905\u290C-\u2913\u2916\u2919-\u2920\u2923-\u292A\u2933\u2935-\u2939\u293C\u293D\u2945\u2948-\u294B\u294E-\u2976\u2978\u2979\u297B-\u297F\u2985\u2986\u298B-\u2996\u299A\u299C\u299D\u29A4-\u29B7\u29B9\u29BB\u29BC\u29BE-\u29C5\u29C9\u29CD-\u29D0\u29DC-\u29DE\u29E3-\u29E5\u29EB\u29F4\u29F6\u2A00-\u2A02\u2A04\u2A06\u2A0C\u2A0D\u2A10-\u2A17\u2A22-\u2A27\u2A29\u2A2A\u2A2D-\u2A31\u2A33-\u2A3C\u2A3F\u2A40\u2A42-\u2A4D\u2A50\u2A53-\u2A58\u2A5A-\u2A5D\u2A5F\u2A66\u2A6A\u2A6D-\u2A75\u2A77-\u2A9A\u2A9D-\u2AA2\u2AA4-\u2AB0\u2AB3-\u2AC8\u2ACB\u2ACC\u2ACF-\u2ADB\u2AE4\u2AE6-\u2AE9\u2AEB-\u2AF3\u2AFD\uFB00-\uFB04]|\uD835[\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDCCF\uDD04\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDD6B]/g;
+       var encodeMap = {'\xAD':'shy','\u200C':'zwnj','\u200D':'zwj','\u200E':'lrm','\u2063':'ic','\u2062':'it','\u2061':'af','\u200F':'rlm','\u200B':'ZeroWidthSpace','\u2060':'NoBreak','\u0311':'DownBreve','\u20DB':'tdot','\u20DC':'DotDot','\t':'Tab','\n':'NewLine','\u2008':'puncsp','\u205F':'MediumSpace','\u2009':'thinsp','\u200A':'hairsp','\u2004':'emsp13','\u2002':'ensp','\u2005':'emsp14','\u2003':'emsp','\u2007':'numsp','\xA0':'nbsp','\u205F\u200A':'ThickSpace','\u203E':'oline','_':'lowbar','\u2010':'dash','\u2013':'ndash','\u2014':'mdash','\u2015':'horbar',',':'comma',';':'semi','\u204F':'bsemi',':':'colon','\u2A74':'Colone','!':'excl','\xA1':'iexcl','?':'quest','\xBF':'iquest','.':'period','\u2025':'nldr','\u2026':'mldr','\xB7':'middot','\'':'apos','\u2018':'lsquo','\u2019':'rsquo','\u201A':'sbquo','\u2039':'lsaquo','\u203A':'rsaquo','"':'quot','\u201C':'ldquo','\u201D':'rdquo','\u201E':'bdquo','\xAB':'laquo','\xBB':'raquo','(':'lpar',')':'rpar','[':'lsqb',']':'rsqb','{':'lcub','}':'rcub','\u2308':'lceil','\u2309':'rceil','\u230A':'lfloor','\u230B':'rfloor','\u2985':'lopar','\u2986':'ropar','\u298B':'lbrke','\u298C':'rbrke','\u298D':'lbrkslu','\u298E':'rbrksld','\u298F':'lbrksld','\u2990':'rbrkslu','\u2991':'langd','\u2992':'rangd','\u2993':'lparlt','\u2994':'rpargt','\u2995':'gtlPar','\u2996':'ltrPar','\u27E6':'lobrk','\u27E7':'robrk','\u27E8':'lang','\u27E9':'rang','\u27EA':'Lang','\u27EB':'Rang','\u27EC':'loang','\u27ED':'roang','\u2772':'lbbrk','\u2773':'rbbrk','\u2016':'Vert','\xA7':'sect','\xB6':'para','@':'commat','*':'ast','/':'sol','undefined':null,'&':'amp','#':'num','%':'percnt','\u2030':'permil','\u2031':'pertenk','\u2020':'dagger','\u2021':'Dagger','\u2022':'bull','\u2043':'hybull','\u2032':'prime','\u2033':'Prime','\u2034':'tprime','\u2057':'qprime','\u2035':'bprime','\u2041':'caret','`':'grave','\xB4':'acute','\u02DC':'tilde','^':'Hat','\xAF':'macr','\u02D8':'breve','\u02D9':'dot','\xA8':'die','\u02DA':'ring','\u02DD':'dblac','\xB8':'cedil','\u02DB':'ogon','\u02C6':'circ','\u02C7':'caron','\xB0':'deg','\xA9':'copy','\xAE':'reg','\u2117':'copysr','\u2118':'wp','\u211E':'rx','\u2127':'mho','\u2129':'iiota','\u2190':'larr','\u219A':'nlarr','\u2192':'rarr','\u219B':'nrarr','\u2191':'uarr','\u2193':'darr','\u2194':'harr','\u21AE':'nharr','\u2195':'varr','\u2196':'nwarr','\u2197':'nearr','\u2198':'searr','\u2199':'swarr','\u219D':'rarrw','\u219D\u0338':'nrarrw','\u219E':'Larr','\u219F':'Uarr','\u21A0':'Rarr','\u21A1':'Darr','\u21A2':'larrtl','\u21A3':'rarrtl','\u21A4':'mapstoleft','\u21A5':'mapstoup','\u21A6':'map','\u21A7':'mapstodown','\u21A9':'larrhk','\u21AA':'rarrhk','\u21AB':'larrlp','\u21AC':'rarrlp','\u21AD':'harrw','\u21B0':'lsh','\u21B1':'rsh','\u21B2':'ldsh','\u21B3':'rdsh','\u21B5':'crarr','\u21B6':'cularr','\u21B7':'curarr','\u21BA':'olarr','\u21BB':'orarr','\u21BC':'lharu','\u21BD':'lhard','\u21BE':'uharr','\u21BF':'uharl','\u21C0':'rharu','\u21C1':'rhard','\u21C2':'dharr','\u21C3':'dharl','\u21C4':'rlarr','\u21C5':'udarr','\u21C6':'lrarr','\u21C7':'llarr','\u21C8':'uuarr','\u21C9':'rrarr','\u21CA':'ddarr','\u21CB':'lrhar','\u21CC':'rlhar','\u21D0':'lArr','\u21CD':'nlArr','\u21D1':'uArr','\u21D2':'rArr','\u21CF':'nrArr','\u21D3':'dArr','\u21D4':'iff','\u21CE':'nhArr','\u21D5':'vArr','\u21D6':'nwArr','\u21D7':'neArr','\u21D8':'seArr','\u21D9':'swArr','\u21DA':'lAarr','\u21DB':'rAarr','\u21DD':'zigrarr','\u21E4':'larrb','\u21E5':'rarrb','\u21F5':'duarr','\u21FD':'loarr','\u21FE':'roarr','\u21FF':'hoarr','\u2200':'forall','\u2201':'comp','\u2202':'part','\u2202\u0338':'npart','\u2203':'exist','\u2204':'nexist','\u2205':'empty','\u2207':'Del','\u2208':'in','\u2209':'notin','\u220B':'ni','\u220C':'notni','\u03F6':'bepsi','\u220F':'prod','\u2210':'coprod','\u2211':'sum','+':'plus','\xB1':'pm','\xF7':'div','\xD7':'times','<':'lt','\u226E':'nlt','<\u20D2':'nvlt','=':'equals','\u2260':'ne','=\u20E5':'bne','\u2A75':'Equal','>':'gt','\u226F':'ngt','>\u20D2':'nvgt','\xAC':'not','|':'vert','\xA6':'brvbar','\u2212':'minus','\u2213':'mp','\u2214':'plusdo','\u2044':'frasl','\u2216':'setmn','\u2217':'lowast','\u2218':'compfn','\u221A':'Sqrt','\u221D':'prop','\u221E':'infin','\u221F':'angrt','\u2220':'ang','\u2220\u20D2':'nang','\u2221':'angmsd','\u2222':'angsph','\u2223':'mid','\u2224':'nmid','\u2225':'par','\u2226':'npar','\u2227':'and','\u2228':'or','\u2229':'cap','\u2229\uFE00':'caps','\u222A':'cup','\u222A\uFE00':'cups','\u222B':'int','\u222C':'Int','\u222D':'tint','\u2A0C':'qint','\u222E':'oint','\u222F':'Conint','\u2230':'Cconint','\u2231':'cwint','\u2232':'cwconint','\u2233':'awconint','\u2234':'there4','\u2235':'becaus','\u2236':'ratio','\u2237':'Colon','\u2238':'minusd','\u223A':'mDDot','\u223B':'homtht','\u223C':'sim','\u2241':'nsim','\u223C\u20D2':'nvsim','\u223D':'bsim','\u223D\u0331':'race','\u223E':'ac','\u223E\u0333':'acE','\u223F':'acd','\u2240':'wr','\u2242':'esim','\u2242\u0338':'nesim','\u2243':'sime','\u2244':'nsime','\u2245':'cong','\u2247':'ncong','\u2246':'simne','\u2248':'ap','\u2249':'nap','\u224A':'ape','\u224B':'apid','\u224B\u0338':'napid','\u224C':'bcong','\u224D':'CupCap','\u226D':'NotCupCap','\u224D\u20D2':'nvap','\u224E':'bump','\u224E\u0338':'nbump','\u224F':'bumpe','\u224F\u0338':'nbumpe','\u2250':'doteq','\u2250\u0338':'nedot','\u2251':'eDot','\u2252':'efDot','\u2253':'erDot','\u2254':'colone','\u2255':'ecolon','\u2256':'ecir','\u2257':'cire','\u2259':'wedgeq','\u225A':'veeeq','\u225C':'trie','\u225F':'equest','\u2261':'equiv','\u2262':'nequiv','\u2261\u20E5':'bnequiv','\u2264':'le','\u2270':'nle','\u2264\u20D2':'nvle','\u2265':'ge','\u2271':'nge','\u2265\u20D2':'nvge','\u2266':'lE','\u2266\u0338':'nlE','\u2267':'gE','\u2267\u0338':'ngE','\u2268\uFE00':'lvnE','\u2268':'lnE','\u2269':'gnE','\u2269\uFE00':'gvnE','\u226A':'ll','\u226A\u0338':'nLtv','\u226A\u20D2':'nLt','\u226B':'gg','\u226B\u0338':'nGtv','\u226B\u20D2':'nGt','\u226C':'twixt','\u2272':'lsim','\u2274':'nlsim','\u2273':'gsim','\u2275':'ngsim','\u2276':'lg','\u2278':'ntlg','\u2277':'gl','\u2279':'ntgl','\u227A':'pr','\u2280':'npr','\u227B':'sc','\u2281':'nsc','\u227C':'prcue','\u22E0':'nprcue','\u227D':'sccue','\u22E1':'nsccue','\u227E':'prsim','\u227F':'scsim','\u227F\u0338':'NotSucceedsTilde','\u2282':'sub','\u2284':'nsub','\u2282\u20D2':'vnsub','\u2283':'sup','\u2285':'nsup','\u2283\u20D2':'vnsup','\u2286':'sube','\u2288':'nsube','\u2287':'supe','\u2289':'nsupe','\u228A\uFE00':'vsubne','\u228A':'subne','\u228B\uFE00':'vsupne','\u228B':'supne','\u228D':'cupdot','\u228E':'uplus','\u228F':'sqsub','\u228F\u0338':'NotSquareSubset','\u2290':'sqsup','\u2290\u0338':'NotSquareSuperset','\u2291':'sqsube','\u22E2':'nsqsube','\u2292':'sqsupe','\u22E3':'nsqsupe','\u2293':'sqcap','\u2293\uFE00':'sqcaps','\u2294':'sqcup','\u2294\uFE00':'sqcups','\u2295':'oplus','\u2296':'ominus','\u2297':'otimes','\u2298':'osol','\u2299':'odot','\u229A':'ocir','\u229B':'oast','\u229D':'odash','\u229E':'plusb','\u229F':'minusb','\u22A0':'timesb','\u22A1':'sdotb','\u22A2':'vdash','\u22AC':'nvdash','\u22A3':'dashv','\u22A4':'top','\u22A5':'bot','\u22A7':'models','\u22A8':'vDash','\u22AD':'nvDash','\u22A9':'Vdash','\u22AE':'nVdash','\u22AA':'Vvdash','\u22AB':'VDash','\u22AF':'nVDash','\u22B0':'prurel','\u22B2':'vltri','\u22EA':'nltri','\u22B3':'vrtri','\u22EB':'nrtri','\u22B4':'ltrie','\u22EC':'nltrie','\u22B4\u20D2':'nvltrie','\u22B5':'rtrie','\u22ED':'nrtrie','\u22B5\u20D2':'nvrtrie','\u22B6':'origof','\u22B7':'imof','\u22B8':'mumap','\u22B9':'hercon','\u22BA':'intcal','\u22BB':'veebar','\u22BD':'barvee','\u22BE':'angrtvb','\u22BF':'lrtri','\u22C0':'Wedge','\u22C1':'Vee','\u22C2':'xcap','\u22C3':'xcup','\u22C4':'diam','\u22C5':'sdot','\u22C6':'Star','\u22C7':'divonx','\u22C8':'bowtie','\u22C9':'ltimes','\u22CA':'rtimes','\u22CB':'lthree','\u22CC':'rthree','\u22CD':'bsime','\u22CE':'cuvee','\u22CF':'cuwed','\u22D0':'Sub','\u22D1':'Sup','\u22D2':'Cap','\u22D3':'Cup','\u22D4':'fork','\u22D5':'epar','\u22D6':'ltdot','\u22D7':'gtdot','\u22D8':'Ll','\u22D8\u0338':'nLl','\u22D9':'Gg','\u22D9\u0338':'nGg','\u22DA\uFE00':'lesg','\u22DA':'leg','\u22DB':'gel','\u22DB\uFE00':'gesl','\u22DE':'cuepr','\u22DF':'cuesc','\u22E6':'lnsim','\u22E7':'gnsim','\u22E8':'prnsim','\u22E9':'scnsim','\u22EE':'vellip','\u22EF':'ctdot','\u22F0':'utdot','\u22F1':'dtdot','\u22F2':'disin','\u22F3':'isinsv','\u22F4':'isins','\u22F5':'isindot','\u22F5\u0338':'notindot','\u22F6':'notinvc','\u22F7':'notinvb','\u22F9':'isinE','\u22F9\u0338':'notinE','\u22FA':'nisd','\u22FB':'xnis','\u22FC':'nis','\u22FD':'notnivc','\u22FE':'notnivb','\u2305':'barwed','\u2306':'Barwed','\u230C':'drcrop','\u230D':'dlcrop','\u230E':'urcrop','\u230F':'ulcrop','\u2310':'bnot','\u2312':'profline','\u2313':'profsurf','\u2315':'telrec','\u2316':'target','\u231C':'ulcorn','\u231D':'urcorn','\u231E':'dlcorn','\u231F':'drcorn','\u2322':'frown','\u2323':'smile','\u232D':'cylcty','\u232E':'profalar','\u2336':'topbot','\u233D':'ovbar','\u233F':'solbar','\u237C':'angzarr','\u23B0':'lmoust','\u23B1':'rmoust','\u23B4':'tbrk','\u23B5':'bbrk','\u23B6':'bbrktbrk','\u23DC':'OverParenthesis','\u23DD':'UnderParenthesis','\u23DE':'OverBrace','\u23DF':'UnderBrace','\u23E2':'trpezium','\u23E7':'elinters','\u2423':'blank','\u2500':'boxh','\u2502':'boxv','\u250C':'boxdr','\u2510':'boxdl','\u2514':'boxur','\u2518':'boxul','\u251C':'boxvr','\u2524':'boxvl','\u252C':'boxhd','\u2534':'boxhu','\u253C':'boxvh','\u2550':'boxH','\u2551':'boxV','\u2552':'boxdR','\u2553':'boxDr','\u2554':'boxDR','\u2555':'boxdL','\u2556':'boxDl','\u2557':'boxDL','\u2558':'boxuR','\u2559':'boxUr','\u255A':'boxUR','\u255B':'boxuL','\u255C':'boxUl','\u255D':'boxUL','\u255E':'boxvR','\u255F':'boxVr','\u2560':'boxVR','\u2561':'boxvL','\u2562':'boxVl','\u2563':'boxVL','\u2564':'boxHd','\u2565':'boxhD','\u2566':'boxHD','\u2567':'boxHu','\u2568':'boxhU','\u2569':'boxHU','\u256A':'boxvH','\u256B':'boxVh','\u256C':'boxVH','\u2580':'uhblk','\u2584':'lhblk','\u2588':'block','\u2591':'blk14','\u2592':'blk12','\u2593':'blk34','\u25A1':'squ','\u25AA':'squf','\u25AB':'EmptyVerySmallSquare','\u25AD':'rect','\u25AE':'marker','\u25B1':'fltns','\u25B3':'xutri','\u25B4':'utrif','\u25B5':'utri','\u25B8':'rtrif','\u25B9':'rtri','\u25BD':'xdtri','\u25BE':'dtrif','\u25BF':'dtri','\u25C2':'ltrif','\u25C3':'ltri','\u25CA':'loz','\u25CB':'cir','\u25EC':'tridot','\u25EF':'xcirc','\u25F8':'ultri','\u25F9':'urtri','\u25FA':'lltri','\u25FB':'EmptySmallSquare','\u25FC':'FilledSmallSquare','\u2605':'starf','\u2606':'star','\u260E':'phone','\u2640':'female','\u2642':'male','\u2660':'spades','\u2663':'clubs','\u2665':'hearts','\u2666':'diams','\u266A':'sung','\u2713':'check','\u2717':'cross','\u2720':'malt','\u2736':'sext','\u2758':'VerticalSeparator','\u27C8':'bsolhsub','\u27C9':'suphsol','\u27F5':'xlarr','\u27F6':'xrarr','\u27F7':'xharr','\u27F8':'xlArr','\u27F9':'xrArr','\u27FA':'xhArr','\u27FC':'xmap','\u27FF':'dzigrarr','\u2902':'nvlArr','\u2903':'nvrArr','\u2904':'nvHarr','\u2905':'Map','\u290C':'lbarr','\u290D':'rbarr','\u290E':'lBarr','\u290F':'rBarr','\u2910':'RBarr','\u2911':'DDotrahd','\u2912':'UpArrowBar','\u2913':'DownArrowBar','\u2916':'Rarrtl','\u2919':'latail','\u291A':'ratail','\u291B':'lAtail','\u291C':'rAtail','\u291D':'larrfs','\u291E':'rarrfs','\u291F':'larrbfs','\u2920':'rarrbfs','\u2923':'nwarhk','\u2924':'nearhk','\u2925':'searhk','\u2926':'swarhk','\u2927':'nwnear','\u2928':'toea','\u2929':'tosa','\u292A':'swnwar','\u2933':'rarrc','\u2933\u0338':'nrarrc','\u2935':'cudarrr','\u2936':'ldca','\u2937':'rdca','\u2938':'cudarrl','\u2939':'larrpl','\u293C':'curarrm','\u293D':'cularrp','\u2945':'rarrpl','\u2948':'harrcir','\u2949':'Uarrocir','\u294A':'lurdshar','\u294B':'ldrushar','\u294E':'LeftRightVector','\u294F':'RightUpDownVector','\u2950':'DownLeftRightVector','\u2951':'LeftUpDownVector','\u2952':'LeftVectorBar','\u2953':'RightVectorBar','\u2954':'RightUpVectorBar','\u2955':'RightDownVectorBar','\u2956':'DownLeftVectorBar','\u2957':'DownRightVectorBar','\u2958':'LeftUpVectorBar','\u2959':'LeftDownVectorBar','\u295A':'LeftTeeVector','\u295B':'RightTeeVector','\u295C':'RightUpTeeVector','\u295D':'RightDownTeeVector','\u295E':'DownLeftTeeVector','\u295F':'DownRightTeeVector','\u2960':'LeftUpTeeVector','\u2961':'LeftDownTeeVector','\u2962':'lHar','\u2963':'uHar','\u2964':'rHar','\u2965':'dHar','\u2966':'luruhar','\u2967':'ldrdhar','\u2968':'ruluhar','\u2969':'rdldhar','\u296A':'lharul','\u296B':'llhard','\u296C':'rharul','\u296D':'lrhard','\u296E':'udhar','\u296F':'duhar','\u2970':'RoundImplies','\u2971':'erarr','\u2972':'simrarr','\u2973':'larrsim','\u2974':'rarrsim','\u2975':'rarrap','\u2976':'ltlarr','\u2978':'gtrarr','\u2979':'subrarr','\u297B':'suplarr','\u297C':'lfisht','\u297D':'rfisht','\u297E':'ufisht','\u297F':'dfisht','\u299A':'vzigzag','\u299C':'vangrt','\u299D':'angrtvbd','\u29A4':'ange','\u29A5':'range','\u29A6':'dwangle','\u29A7':'uwangle','\u29A8':'angmsdaa','\u29A9':'angmsdab','\u29AA':'angmsdac','\u29AB':'angmsdad','\u29AC':'angmsdae','\u29AD':'angmsdaf','\u29AE':'angmsdag','\u29AF':'angmsdah','\u29B0':'bemptyv','\u29B1':'demptyv','\u29B2':'cemptyv','\u29B3':'raemptyv','\u29B4':'laemptyv','\u29B5':'ohbar','\u29B6':'omid','\u29B7':'opar','\u29B9':'operp','\u29BB':'olcross','\u29BC':'odsold','\u29BE':'olcir','\u29BF':'ofcir','\u29C0':'olt','\u29C1':'ogt','\u29C2':'cirscir','\u29C3':'cirE','\u29C4':'solb','\u29C5':'bsolb','\u29C9':'boxbox','\u29CD':'trisb','\u29CE':'rtriltri','\u29CF':'LeftTriangleBar','\u29CF\u0338':'NotLeftTriangleBar','\u29D0':'RightTriangleBar','\u29D0\u0338':'NotRightTriangleBar','\u29DC':'iinfin','\u29DD':'infintie','\u29DE':'nvinfin','\u29E3':'eparsl','\u29E4':'smeparsl','\u29E5':'eqvparsl','\u29EB':'lozf','\u29F4':'RuleDelayed','\u29F6':'dsol','\u2A00':'xodot','\u2A01':'xoplus','\u2A02':'xotime','\u2A04':'xuplus','\u2A06':'xsqcup','\u2A0D':'fpartint','\u2A10':'cirfnint','\u2A11':'awint','\u2A12':'rppolint','\u2A13':'scpolint','\u2A14':'npolint','\u2A15':'pointint','\u2A16':'quatint','\u2A17':'intlarhk','\u2A22':'pluscir','\u2A23':'plusacir','\u2A24':'simplus','\u2A25':'plusdu','\u2A26':'plussim','\u2A27':'plustwo','\u2A29':'mcomma','\u2A2A':'minusdu','\u2A2D':'loplus','\u2A2E':'roplus','\u2A2F':'Cross','\u2A30':'timesd','\u2A31':'timesbar','\u2A33':'smashp','\u2A34':'lotimes','\u2A35':'rotimes','\u2A36':'otimesas','\u2A37':'Otimes','\u2A38':'odiv','\u2A39':'triplus','\u2A3A':'triminus','\u2A3B':'tritime','\u2A3C':'iprod','\u2A3F':'amalg','\u2A40':'capdot','\u2A42':'ncup','\u2A43':'ncap','\u2A44':'capand','\u2A45':'cupor','\u2A46':'cupcap','\u2A47':'capcup','\u2A48':'cupbrcap','\u2A49':'capbrcup','\u2A4A':'cupcup','\u2A4B':'capcap','\u2A4C':'ccups','\u2A4D':'ccaps','\u2A50':'ccupssm','\u2A53':'And','\u2A54':'Or','\u2A55':'andand','\u2A56':'oror','\u2A57':'orslope','\u2A58':'andslope','\u2A5A':'andv','\u2A5B':'orv','\u2A5C':'andd','\u2A5D':'ord','\u2A5F':'wedbar','\u2A66':'sdote','\u2A6A':'simdot','\u2A6D':'congdot','\u2A6D\u0338':'ncongdot','\u2A6E':'easter','\u2A6F':'apacir','\u2A70':'apE','\u2A70\u0338':'napE','\u2A71':'eplus','\u2A72':'pluse','\u2A73':'Esim','\u2A77':'eDDot','\u2A78':'equivDD','\u2A79':'ltcir','\u2A7A':'gtcir','\u2A7B':'ltquest','\u2A7C':'gtquest','\u2A7D':'les','\u2A7D\u0338':'nles','\u2A7E':'ges','\u2A7E\u0338':'nges','\u2A7F':'lesdot','\u2A80':'gesdot','\u2A81':'lesdoto','\u2A82':'gesdoto','\u2A83':'lesdotor','\u2A84':'gesdotol','\u2A85':'lap','\u2A86':'gap','\u2A87':'lne','\u2A88':'gne','\u2A89':'lnap','\u2A8A':'gnap','\u2A8B':'lEg','\u2A8C':'gEl','\u2A8D':'lsime','\u2A8E':'gsime','\u2A8F':'lsimg','\u2A90':'gsiml','\u2A91':'lgE','\u2A92':'glE','\u2A93':'lesges','\u2A94':'gesles','\u2A95':'els','\u2A96':'egs','\u2A97':'elsdot','\u2A98':'egsdot','\u2A99':'el','\u2A9A':'eg','\u2A9D':'siml','\u2A9E':'simg','\u2A9F':'simlE','\u2AA0':'simgE','\u2AA1':'LessLess','\u2AA1\u0338':'NotNestedLessLess','\u2AA2':'GreaterGreater','\u2AA2\u0338':'NotNestedGreaterGreater','\u2AA4':'glj','\u2AA5':'gla','\u2AA6':'ltcc','\u2AA7':'gtcc','\u2AA8':'lescc','\u2AA9':'gescc','\u2AAA':'smt','\u2AAB':'lat','\u2AAC':'smte','\u2AAC\uFE00':'smtes','\u2AAD':'late','\u2AAD\uFE00':'lates','\u2AAE':'bumpE','\u2AAF':'pre','\u2AAF\u0338':'npre','\u2AB0':'sce','\u2AB0\u0338':'nsce','\u2AB3':'prE','\u2AB4':'scE','\u2AB5':'prnE','\u2AB6':'scnE','\u2AB7':'prap','\u2AB8':'scap','\u2AB9':'prnap','\u2ABA':'scnap','\u2ABB':'Pr','\u2ABC':'Sc','\u2ABD':'subdot','\u2ABE':'supdot','\u2ABF':'subplus','\u2AC0':'supplus','\u2AC1':'submult','\u2AC2':'supmult','\u2AC3':'subedot','\u2AC4':'supedot','\u2AC5':'subE','\u2AC5\u0338':'nsubE','\u2AC6':'supE','\u2AC6\u0338':'nsupE','\u2AC7':'subsim','\u2AC8':'supsim','\u2ACB\uFE00':'vsubnE','\u2ACB':'subnE','\u2ACC\uFE00':'vsupnE','\u2ACC':'supnE','\u2ACF':'csub','\u2AD0':'csup','\u2AD1':'csube','\u2AD2':'csupe','\u2AD3':'subsup','\u2AD4':'supsub','\u2AD5':'subsub','\u2AD6':'supsup','\u2AD7':'suphsub','\u2AD8':'supdsub','\u2AD9':'forkv','\u2ADA':'topfork','\u2ADB':'mlcp','\u2AE4':'Dashv','\u2AE6':'Vdashl','\u2AE7':'Barv','\u2AE8':'vBar','\u2AE9':'vBarv','\u2AEB':'Vbar','\u2AEC':'Not','\u2AED':'bNot','\u2AEE':'rnmid','\u2AEF':'cirmid','\u2AF0':'midcir','\u2AF1':'topcir','\u2AF2':'nhpar','\u2AF3':'parsim','\u2AFD':'parsl','\u2AFD\u20E5':'nparsl','\u266D':'flat','\u266E':'natur','\u266F':'sharp','\xA4':'curren','\xA2':'cent','$':'dollar','\xA3':'pound','\xA5':'yen','\u20AC':'euro','\xB9':'sup1','\xBD':'half','\u2153':'frac13','\xBC':'frac14','\u2155':'frac15','\u2159':'frac16','\u215B':'frac18','\xB2':'sup2','\u2154':'frac23','\u2156':'frac25','\xB3':'sup3','\xBE':'frac34','\u2157':'frac35','\u215C':'frac38','\u2158':'frac45','\u215A':'frac56','\u215D':'frac58','\u215E':'frac78','\uD835\uDCB6':'ascr','\uD835\uDD52':'aopf','\uD835\uDD1E':'afr','\uD835\uDD38':'Aopf','\uD835\uDD04':'Afr','\uD835\uDC9C':'Ascr','\xAA':'ordf','\xE1':'aacute','\xC1':'Aacute','\xE0':'agrave','\xC0':'Agrave','\u0103':'abreve','\u0102':'Abreve','\xE2':'acirc','\xC2':'Acirc','\xE5':'aring','\xC5':'angst','\xE4':'auml','\xC4':'Auml','\xE3':'atilde','\xC3':'Atilde','\u0105':'aogon','\u0104':'Aogon','\u0101':'amacr','\u0100':'Amacr','\xE6':'aelig','\xC6':'AElig','\uD835\uDCB7':'bscr','\uD835\uDD53':'bopf','\uD835\uDD1F':'bfr','\uD835\uDD39':'Bopf','\u212C':'Bscr','\uD835\uDD05':'Bfr','\uD835\uDD20':'cfr','\uD835\uDCB8':'cscr','\uD835\uDD54':'copf','\u212D':'Cfr','\uD835\uDC9E':'Cscr','\u2102':'Copf','\u0107':'cacute','\u0106':'Cacute','\u0109':'ccirc','\u0108':'Ccirc','\u010D':'ccaron','\u010C':'Ccaron','\u010B':'cdot','\u010A':'Cdot','\xE7':'ccedil','\xC7':'Ccedil','\u2105':'incare','\uD835\uDD21':'dfr','\u2146':'dd','\uD835\uDD55':'dopf','\uD835\uDCB9':'dscr','\uD835\uDC9F':'Dscr','\uD835\uDD07':'Dfr','\u2145':'DD','\uD835\uDD3B':'Dopf','\u010F':'dcaron','\u010E':'Dcaron','\u0111':'dstrok','\u0110':'Dstrok','\xF0':'eth','\xD0':'ETH','\u2147':'ee','\u212F':'escr','\uD835\uDD22':'efr','\uD835\uDD56':'eopf','\u2130':'Escr','\uD835\uDD08':'Efr','\uD835\uDD3C':'Eopf','\xE9':'eacute','\xC9':'Eacute','\xE8':'egrave','\xC8':'Egrave','\xEA':'ecirc','\xCA':'Ecirc','\u011B':'ecaron','\u011A':'Ecaron','\xEB':'euml','\xCB':'Euml','\u0117':'edot','\u0116':'Edot','\u0119':'eogon','\u0118':'Eogon','\u0113':'emacr','\u0112':'Emacr','\uD835\uDD23':'ffr','\uD835\uDD57':'fopf','\uD835\uDCBB':'fscr','\uD835\uDD09':'Ffr','\uD835\uDD3D':'Fopf','\u2131':'Fscr','\uFB00':'fflig','\uFB03':'ffilig','\uFB04':'ffllig','\uFB01':'filig','fj':'fjlig','\uFB02':'fllig','\u0192':'fnof','\u210A':'gscr','\uD835\uDD58':'gopf','\uD835\uDD24':'gfr','\uD835\uDCA2':'Gscr','\uD835\uDD3E':'Gopf','\uD835\uDD0A':'Gfr','\u01F5':'gacute','\u011F':'gbreve','\u011E':'Gbreve','\u011D':'gcirc','\u011C':'Gcirc','\u0121':'gdot','\u0120':'Gdot','\u0122':'Gcedil','\uD835\uDD25':'hfr','\u210E':'planckh','\uD835\uDCBD':'hscr','\uD835\uDD59':'hopf','\u210B':'Hscr','\u210C':'Hfr','\u210D':'Hopf','\u0125':'hcirc','\u0124':'Hcirc','\u210F':'hbar','\u0127':'hstrok','\u0126':'Hstrok','\uD835\uDD5A':'iopf','\uD835\uDD26':'ifr','\uD835\uDCBE':'iscr','\u2148':'ii','\uD835\uDD40':'Iopf','\u2110':'Iscr','\u2111':'Im','\xED':'iacute','\xCD':'Iacute','\xEC':'igrave','\xCC':'Igrave','\xEE':'icirc','\xCE':'Icirc','\xEF':'iuml','\xCF':'Iuml','\u0129':'itilde','\u0128':'Itilde','\u0130':'Idot','\u012F':'iogon','\u012E':'Iogon','\u012B':'imacr','\u012A':'Imacr','\u0133':'ijlig','\u0132':'IJlig','\u0131':'imath','\uD835\uDCBF':'jscr','\uD835\uDD5B':'jopf','\uD835\uDD27':'jfr','\uD835\uDCA5':'Jscr','\uD835\uDD0D':'Jfr','\uD835\uDD41':'Jopf','\u0135':'jcirc','\u0134':'Jcirc','\u0237':'jmath','\uD835\uDD5C':'kopf','\uD835\uDCC0':'kscr','\uD835\uDD28':'kfr','\uD835\uDCA6':'Kscr','\uD835\uDD42':'Kopf','\uD835\uDD0E':'Kfr','\u0137':'kcedil','\u0136':'Kcedil','\uD835\uDD29':'lfr','\uD835\uDCC1':'lscr','\u2113':'ell','\uD835\uDD5D':'lopf','\u2112':'Lscr','\uD835\uDD0F':'Lfr','\uD835\uDD43':'Lopf','\u013A':'lacute','\u0139':'Lacute','\u013E':'lcaron','\u013D':'Lcaron','\u013C':'lcedil','\u013B':'Lcedil','\u0142':'lstrok','\u0141':'Lstrok','\u0140':'lmidot','\u013F':'Lmidot','\uD835\uDD2A':'mfr','\uD835\uDD5E':'mopf','\uD835\uDCC2':'mscr','\uD835\uDD10':'Mfr','\uD835\uDD44':'Mopf','\u2133':'Mscr','\uD835\uDD2B':'nfr','\uD835\uDD5F':'nopf','\uD835\uDCC3':'nscr','\u2115':'Nopf','\uD835\uDCA9':'Nscr','\uD835\uDD11':'Nfr','\u0144':'nacute','\u0143':'Nacute','\u0148':'ncaron','\u0147':'Ncaron','\xF1':'ntilde','\xD1':'Ntilde','\u0146':'ncedil','\u0145':'Ncedil','\u2116':'numero','\u014B':'eng','\u014A':'ENG','\uD835\uDD60':'oopf','\uD835\uDD2C':'ofr','\u2134':'oscr','\uD835\uDCAA':'Oscr','\uD835\uDD12':'Ofr','\uD835\uDD46':'Oopf','\xBA':'ordm','\xF3':'oacute','\xD3':'Oacute','\xF2':'ograve','\xD2':'Ograve','\xF4':'ocirc','\xD4':'Ocirc','\xF6':'ouml','\xD6':'Ouml','\u0151':'odblac','\u0150':'Odblac','\xF5':'otilde','\xD5':'Otilde','\xF8':'oslash','\xD8':'Oslash','\u014D':'omacr','\u014C':'Omacr','\u0153':'oelig','\u0152':'OElig','\uD835\uDD2D':'pfr','\uD835\uDCC5':'pscr','\uD835\uDD61':'popf','\u2119':'Popf','\uD835\uDD13':'Pfr','\uD835\uDCAB':'Pscr','\uD835\uDD62':'qopf','\uD835\uDD2E':'qfr','\uD835\uDCC6':'qscr','\uD835\uDCAC':'Qscr','\uD835\uDD14':'Qfr','\u211A':'Qopf','\u0138':'kgreen','\uD835\uDD2F':'rfr','\uD835\uDD63':'ropf','\uD835\uDCC7':'rscr','\u211B':'Rscr','\u211C':'Re','\u211D':'Ropf','\u0155':'racute','\u0154':'Racute','\u0159':'rcaron','\u0158':'Rcaron','\u0157':'rcedil','\u0156':'Rcedil','\uD835\uDD64':'sopf','\uD835\uDCC8':'sscr','\uD835\uDD30':'sfr','\uD835\uDD4A':'Sopf','\uD835\uDD16':'Sfr','\uD835\uDCAE':'Sscr','\u24C8':'oS','\u015B':'sacute','\u015A':'Sacute','\u015D':'scirc','\u015C':'Scirc','\u0161':'scaron','\u0160':'Scaron','\u015F':'scedil','\u015E':'Scedil','\xDF':'szlig','\uD835\uDD31':'tfr','\uD835\uDCC9':'tscr','\uD835\uDD65':'topf','\uD835\uDCAF':'Tscr','\uD835\uDD17':'Tfr','\uD835\uDD4B':'Topf','\u0165':'tcaron','\u0164':'Tcaron','\u0163':'tcedil','\u0162':'Tcedil','\u2122':'trade','\u0167':'tstrok','\u0166':'Tstrok','\uD835\uDCCA':'uscr','\uD835\uDD66':'uopf','\uD835\uDD32':'ufr','\uD835\uDD4C':'Uopf','\uD835\uDD18':'Ufr','\uD835\uDCB0':'Uscr','\xFA':'uacute','\xDA':'Uacute','\xF9':'ugrave','\xD9':'Ugrave','\u016D':'ubreve','\u016C':'Ubreve','\xFB':'ucirc','\xDB':'Ucirc','\u016F':'uring','\u016E':'Uring','\xFC':'uuml','\xDC':'Uuml','\u0171':'udblac','\u0170':'Udblac','\u0169':'utilde','\u0168':'Utilde','\u0173':'uogon','\u0172':'Uogon','\u016B':'umacr','\u016A':'Umacr','\uD835\uDD33':'vfr','\uD835\uDD67':'vopf','\uD835\uDCCB':'vscr','\uD835\uDD19':'Vfr','\uD835\uDD4D':'Vopf','\uD835\uDCB1':'Vscr','\uD835\uDD68':'wopf','\uD835\uDCCC':'wscr','\uD835\uDD34':'wfr','\uD835\uDCB2':'Wscr','\uD835\uDD4E':'Wopf','\uD835\uDD1A':'Wfr','\u0175':'wcirc','\u0174':'Wcirc','\uD835\uDD35':'xfr','\uD835\uDCCD':'xscr','\uD835\uDD69':'xopf','\uD835\uDD4F':'Xopf','\uD835\uDD1B':'Xfr','\uD835\uDCB3':'Xscr','\uD835\uDD36':'yfr','\uD835\uDCCE':'yscr','\uD835\uDD6A':'yopf','\uD835\uDCB4':'Yscr','\uD835\uDD1C':'Yfr','\uD835\uDD50':'Yopf','\xFD':'yacute','\xDD':'Yacute','\u0177':'ycirc','\u0176':'Ycirc','\xFF':'yuml','\u0178':'Yuml','\uD835\uDCCF':'zscr','\uD835\uDD37':'zfr','\uD835\uDD6B':'zopf','\u2128':'Zfr','\u2124':'Zopf','\uD835\uDCB5':'Zscr','\u017A':'zacute','\u0179':'Zacute','\u017E':'zcaron','\u017D':'Zcaron','\u017C':'zdot','\u017B':'Zdot','\u01B5':'imped','\xFE':'thorn','\xDE':'THORN','\u0149':'napos','\u03B1':'alpha','\u0391':'Alpha','\u03B2':'beta','\u0392':'Beta','\u03B3':'gamma','\u0393':'Gamma','\u03B4':'delta','\u0394':'Delta','\u03B5':'epsi','\u03F5':'epsiv','\u0395':'Epsilon','\u03DD':'gammad','\u03DC':'Gammad','\u03B6':'zeta','\u0396':'Zeta','\u03B7':'eta','\u0397':'Eta','\u03B8':'theta','\u03D1':'thetav','\u0398':'Theta','\u03B9':'iota','\u0399':'Iota','\u03BA':'kappa','\u03F0':'kappav','\u039A':'Kappa','\u03BB':'lambda','\u039B':'Lambda','\u03BC':'mu','\xB5':'micro','\u039C':'Mu','\u03BD':'nu','\u039D':'Nu','\u03BE':'xi','\u039E':'Xi','\u03BF':'omicron','\u039F':'Omicron','\u03C0':'pi','\u03D6':'piv','\u03A0':'Pi','\u03C1':'rho','\u03F1':'rhov','\u03A1':'Rho','\u03C3':'sigma','\u03A3':'Sigma','\u03C2':'sigmaf','\u03C4':'tau','\u03A4':'Tau','\u03C5':'upsi','\u03A5':'Upsilon','\u03D2':'Upsi','\u03C6':'phi','\u03D5':'phiv','\u03A6':'Phi','\u03C7':'chi','\u03A7':'Chi','\u03C8':'psi','\u03A8':'Psi','\u03C9':'omega','\u03A9':'ohm','\u0430':'acy','\u0410':'Acy','\u0431':'bcy','\u0411':'Bcy','\u0432':'vcy','\u0412':'Vcy','\u0433':'gcy','\u0413':'Gcy','\u0453':'gjcy','\u0403':'GJcy','\u0434':'dcy','\u0414':'Dcy','\u0452':'djcy','\u0402':'DJcy','\u0435':'iecy','\u0415':'IEcy','\u0451':'iocy','\u0401':'IOcy','\u0454':'jukcy','\u0404':'Jukcy','\u0436':'zhcy','\u0416':'ZHcy','\u0437':'zcy','\u0417':'Zcy','\u0455':'dscy','\u0405':'DScy','\u0438':'icy','\u0418':'Icy','\u0456':'iukcy','\u0406':'Iukcy','\u0457':'yicy','\u0407':'YIcy','\u0439':'jcy','\u0419':'Jcy','\u0458':'jsercy','\u0408':'Jsercy','\u043A':'kcy','\u041A':'Kcy','\u045C':'kjcy','\u040C':'KJcy','\u043B':'lcy','\u041B':'Lcy','\u0459':'ljcy','\u0409':'LJcy','\u043C':'mcy','\u041C':'Mcy','\u043D':'ncy','\u041D':'Ncy','\u045A':'njcy','\u040A':'NJcy','\u043E':'ocy','\u041E':'Ocy','\u043F':'pcy','\u041F':'Pcy','\u0440':'rcy','\u0420':'Rcy','\u0441':'scy','\u0421':'Scy','\u0442':'tcy','\u0422':'Tcy','\u045B':'tshcy','\u040B':'TSHcy','\u0443':'ucy','\u0423':'Ucy','\u045E':'ubrcy','\u040E':'Ubrcy','\u0444':'fcy','\u0424':'Fcy','\u0445':'khcy','\u0425':'KHcy','\u0446':'tscy','\u0426':'TScy','\u0447':'chcy','\u0427':'CHcy','\u045F':'dzcy','\u040F':'DZcy','\u0448':'shcy','\u0428':'SHcy','\u0449':'shchcy','\u0429':'SHCHcy','\u044A':'hardcy','\u042A':'HARDcy','\u044B':'ycy','\u042B':'Ycy','\u044C':'softcy','\u042C':'SOFTcy','\u044D':'ecy','\u042D':'Ecy','\u044E':'yucy','\u042E':'YUcy','\u044F':'yacy','\u042F':'YAcy','\u2135':'aleph','\u2136':'beth','\u2137':'gimel','\u2138':'daleth'};
+
+       var regexEscape = /["&'<>`]/g;
+       var escapeMap = {
+               '"': '&quot;',
+               '&': '&amp;',
+               '\'': '&#x27;',
+               '<': '&lt;',
+               // See https://mathiasbynens.be/notes/ambiguous-ampersands: in HTML, the
+               // following is not strictly necessary unless it’s part of a tag or an
+               // unquoted attribute value. We’re only escaping it to support those
+               // situations, and for XML support.
+               '>': '&gt;',
+               // In Internet Explorer ≤ 8, the backtick character can be used
+               // to break out of (un)quoted attribute values or HTML comments.
+               // See http://html5sec.org/#102, http://html5sec.org/#108, and
+               // http://html5sec.org/#133.
+               '`': '&#x60;'
+       };
+
+       var regexInvalidEntity = /&#(?:[xX][^a-fA-F0-9]|[^0-9xX])/;
+       var regexInvalidRawCodePoint = /[\0-\x08\x0B\x0E-\x1F\x7F-\x9F\uFDD0-\uFDEF\uFFFE\uFFFF]|[\uD83F\uD87F\uD8BF\uD8FF\uD93F\uD97F\uD9BF\uD9FF\uDA3F\uDA7F\uDABF\uDAFF\uDB3F\uDB7F\uDBBF\uDBFF][\uDFFE\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/;
+       var regexDecode = /&#([0-9]+)(;?)|&#[xX]([a-fA-F0-9]+)(;?)|&([0-9a-zA-Z]+);|&(Aacute|Agrave|Atilde|Ccedil|Eacute|Egrave|Iacute|Igrave|Ntilde|Oacute|Ograve|Oslash|Otilde|Uacute|Ugrave|Yacute|aacute|agrave|atilde|brvbar|ccedil|curren|divide|eacute|egrave|frac12|frac14|frac34|iacute|igrave|iquest|middot|ntilde|oacute|ograve|oslash|otilde|plusmn|uacute|ugrave|yacute|AElig|Acirc|Aring|Ecirc|Icirc|Ocirc|THORN|Ucirc|acirc|acute|aelig|aring|cedil|ecirc|icirc|iexcl|laquo|micro|ocirc|pound|raquo|szlig|thorn|times|ucirc|Auml|COPY|Euml|Iuml|Ouml|QUOT|Uuml|auml|cent|copy|euml|iuml|macr|nbsp|ordf|ordm|ouml|para|quot|sect|sup1|sup2|sup3|uuml|yuml|AMP|ETH|REG|amp|deg|eth|not|reg|shy|uml|yen|GT|LT|gt|lt)([=a-zA-Z0-9])?/g;
+       var decodeMap = {'aacute':'\xE1','Aacute':'\xC1','abreve':'\u0103','Abreve':'\u0102','ac':'\u223E','acd':'\u223F','acE':'\u223E\u0333','acirc':'\xE2','Acirc':'\xC2','acute':'\xB4','acy':'\u0430','Acy':'\u0410','aelig':'\xE6','AElig':'\xC6','af':'\u2061','afr':'\uD835\uDD1E','Afr':'\uD835\uDD04','agrave':'\xE0','Agrave':'\xC0','alefsym':'\u2135','aleph':'\u2135','alpha':'\u03B1','Alpha':'\u0391','amacr':'\u0101','Amacr':'\u0100','amalg':'\u2A3F','amp':'&','AMP':'&','and':'\u2227','And':'\u2A53','andand':'\u2A55','andd':'\u2A5C','andslope':'\u2A58','andv':'\u2A5A','ang':'\u2220','ange':'\u29A4','angle':'\u2220','angmsd':'\u2221','angmsdaa':'\u29A8','angmsdab':'\u29A9','angmsdac':'\u29AA','angmsdad':'\u29AB','angmsdae':'\u29AC','angmsdaf':'\u29AD','angmsdag':'\u29AE','angmsdah':'\u29AF','angrt':'\u221F','angrtvb':'\u22BE','angrtvbd':'\u299D','angsph':'\u2222','angst':'\xC5','angzarr':'\u237C','aogon':'\u0105','Aogon':'\u0104','aopf':'\uD835\uDD52','Aopf':'\uD835\uDD38','ap':'\u2248','apacir':'\u2A6F','ape':'\u224A','apE':'\u2A70','apid':'\u224B','apos':'\'','ApplyFunction':'\u2061','approx':'\u2248','approxeq':'\u224A','aring':'\xE5','Aring':'\xC5','ascr':'\uD835\uDCB6','Ascr':'\uD835\uDC9C','Assign':'\u2254','ast':'*','asymp':'\u2248','asympeq':'\u224D','atilde':'\xE3','Atilde':'\xC3','auml':'\xE4','Auml':'\xC4','awconint':'\u2233','awint':'\u2A11','backcong':'\u224C','backepsilon':'\u03F6','backprime':'\u2035','backsim':'\u223D','backsimeq':'\u22CD','Backslash':'\u2216','Barv':'\u2AE7','barvee':'\u22BD','barwed':'\u2305','Barwed':'\u2306','barwedge':'\u2305','bbrk':'\u23B5','bbrktbrk':'\u23B6','bcong':'\u224C','bcy':'\u0431','Bcy':'\u0411','bdquo':'\u201E','becaus':'\u2235','because':'\u2235','Because':'\u2235','bemptyv':'\u29B0','bepsi':'\u03F6','bernou':'\u212C','Bernoullis':'\u212C','beta':'\u03B2','Beta':'\u0392','beth':'\u2136','between':'\u226C','bfr':'\uD835\uDD1F','Bfr':'\uD835\uDD05','bigcap':'\u22C2','bigcirc':'\u25EF','bigcup':'\u22C3','bigodot':'\u2A00','bigoplus':'\u2A01','bigotimes':'\u2A02','bigsqcup':'\u2A06','bigstar':'\u2605','bigtriangledown':'\u25BD','bigtriangleup':'\u25B3','biguplus':'\u2A04','bigvee':'\u22C1','bigwedge':'\u22C0','bkarow':'\u290D','blacklozenge':'\u29EB','blacksquare':'\u25AA','blacktriangle':'\u25B4','blacktriangledown':'\u25BE','blacktriangleleft':'\u25C2','blacktriangleright':'\u25B8','blank':'\u2423','blk12':'\u2592','blk14':'\u2591','blk34':'\u2593','block':'\u2588','bne':'=\u20E5','bnequiv':'\u2261\u20E5','bnot':'\u2310','bNot':'\u2AED','bopf':'\uD835\uDD53','Bopf':'\uD835\uDD39','bot':'\u22A5','bottom':'\u22A5','bowtie':'\u22C8','boxbox':'\u29C9','boxdl':'\u2510','boxdL':'\u2555','boxDl':'\u2556','boxDL':'\u2557','boxdr':'\u250C','boxdR':'\u2552','boxDr':'\u2553','boxDR':'\u2554','boxh':'\u2500','boxH':'\u2550','boxhd':'\u252C','boxhD':'\u2565','boxHd':'\u2564','boxHD':'\u2566','boxhu':'\u2534','boxhU':'\u2568','boxHu':'\u2567','boxHU':'\u2569','boxminus':'\u229F','boxplus':'\u229E','boxtimes':'\u22A0','boxul':'\u2518','boxuL':'\u255B','boxUl':'\u255C','boxUL':'\u255D','boxur':'\u2514','boxuR':'\u2558','boxUr':'\u2559','boxUR':'\u255A','boxv':'\u2502','boxV':'\u2551','boxvh':'\u253C','boxvH':'\u256A','boxVh':'\u256B','boxVH':'\u256C','boxvl':'\u2524','boxvL':'\u2561','boxVl':'\u2562','boxVL':'\u2563','boxvr':'\u251C','boxvR':'\u255E','boxVr':'\u255F','boxVR':'\u2560','bprime':'\u2035','breve':'\u02D8','Breve':'\u02D8','brvbar':'\xA6','bscr':'\uD835\uDCB7','Bscr':'\u212C','bsemi':'\u204F','bsim':'\u223D','bsime':'\u22CD','bsol':'\\','bsolb':'\u29C5','bsolhsub':'\u27C8','bull':'\u2022','bullet':'\u2022','bump':'\u224E','bumpe':'\u224F','bumpE':'\u2AAE','bumpeq':'\u224F','Bumpeq':'\u224E','cacute':'\u0107','Cacute':'\u0106','cap':'\u2229','Cap':'\u22D2','capand':'\u2A44','capbrcup':'\u2A49','capcap':'\u2A4B','capcup':'\u2A47','capdot':'\u2A40','CapitalDifferentialD':'\u2145','caps':'\u2229\uFE00','caret':'\u2041','caron':'\u02C7','Cayleys':'\u212D','ccaps':'\u2A4D','ccaron':'\u010D','Ccaron':'\u010C','ccedil':'\xE7','Ccedil':'\xC7','ccirc':'\u0109','Ccirc':'\u0108','Cconint':'\u2230','ccups':'\u2A4C','ccupssm':'\u2A50','cdot':'\u010B','Cdot':'\u010A','cedil':'\xB8','Cedilla':'\xB8','cemptyv':'\u29B2','cent':'\xA2','centerdot':'\xB7','CenterDot':'\xB7','cfr':'\uD835\uDD20','Cfr':'\u212D','chcy':'\u0447','CHcy':'\u0427','check':'\u2713','checkmark':'\u2713','chi':'\u03C7','Chi':'\u03A7','cir':'\u25CB','circ':'\u02C6','circeq':'\u2257','circlearrowleft':'\u21BA','circlearrowright':'\u21BB','circledast':'\u229B','circledcirc':'\u229A','circleddash':'\u229D','CircleDot':'\u2299','circledR':'\xAE','circledS':'\u24C8','CircleMinus':'\u2296','CirclePlus':'\u2295','CircleTimes':'\u2297','cire':'\u2257','cirE':'\u29C3','cirfnint':'\u2A10','cirmid':'\u2AEF','cirscir':'\u29C2','ClockwiseContourIntegral':'\u2232','CloseCurlyDoubleQuote':'\u201D','CloseCurlyQuote':'\u2019','clubs':'\u2663','clubsuit':'\u2663','colon':':','Colon':'\u2237','colone':'\u2254','Colone':'\u2A74','coloneq':'\u2254','comma':',','commat':'@','comp':'\u2201','compfn':'\u2218','complement':'\u2201','complexes':'\u2102','cong':'\u2245','congdot':'\u2A6D','Congruent':'\u2261','conint':'\u222E','Conint':'\u222F','ContourIntegral':'\u222E','copf':'\uD835\uDD54','Copf':'\u2102','coprod':'\u2210','Coproduct':'\u2210','copy':'\xA9','COPY':'\xA9','copysr':'\u2117','CounterClockwiseContourIntegral':'\u2233','crarr':'\u21B5','cross':'\u2717','Cross':'\u2A2F','cscr':'\uD835\uDCB8','Cscr':'\uD835\uDC9E','csub':'\u2ACF','csube':'\u2AD1','csup':'\u2AD0','csupe':'\u2AD2','ctdot':'\u22EF','cudarrl':'\u2938','cudarrr':'\u2935','cuepr':'\u22DE','cuesc':'\u22DF','cularr':'\u21B6','cularrp':'\u293D','cup':'\u222A','Cup':'\u22D3','cupbrcap':'\u2A48','cupcap':'\u2A46','CupCap':'\u224D','cupcup':'\u2A4A','cupdot':'\u228D','cupor':'\u2A45','cups':'\u222A\uFE00','curarr':'\u21B7','curarrm':'\u293C','curlyeqprec':'\u22DE','curlyeqsucc':'\u22DF','curlyvee':'\u22CE','curlywedge':'\u22CF','curren':'\xA4','curvearrowleft':'\u21B6','curvearrowright':'\u21B7','cuvee':'\u22CE','cuwed':'\u22CF','cwconint':'\u2232','cwint':'\u2231','cylcty':'\u232D','dagger':'\u2020','Dagger':'\u2021','daleth':'\u2138','darr':'\u2193','dArr':'\u21D3','Darr':'\u21A1','dash':'\u2010','dashv':'\u22A3','Dashv':'\u2AE4','dbkarow':'\u290F','dblac':'\u02DD','dcaron':'\u010F','Dcaron':'\u010E','dcy':'\u0434','Dcy':'\u0414','dd':'\u2146','DD':'\u2145','ddagger':'\u2021','ddarr':'\u21CA','DDotrahd':'\u2911','ddotseq':'\u2A77','deg':'\xB0','Del':'\u2207','delta':'\u03B4','Delta':'\u0394','demptyv':'\u29B1','dfisht':'\u297F','dfr':'\uD835\uDD21','Dfr':'\uD835\uDD07','dHar':'\u2965','dharl':'\u21C3','dharr':'\u21C2','DiacriticalAcute':'\xB4','DiacriticalDot':'\u02D9','DiacriticalDoubleAcute':'\u02DD','DiacriticalGrave':'`','DiacriticalTilde':'\u02DC','diam':'\u22C4','diamond':'\u22C4','Diamond':'\u22C4','diamondsuit':'\u2666','diams':'\u2666','die':'\xA8','DifferentialD':'\u2146','digamma':'\u03DD','disin':'\u22F2','div':'\xF7','divide':'\xF7','divideontimes':'\u22C7','divonx':'\u22C7','djcy':'\u0452','DJcy':'\u0402','dlcorn':'\u231E','dlcrop':'\u230D','dollar':'$','dopf':'\uD835\uDD55','Dopf':'\uD835\uDD3B','dot':'\u02D9','Dot':'\xA8','DotDot':'\u20DC','doteq':'\u2250','doteqdot':'\u2251','DotEqual':'\u2250','dotminus':'\u2238','dotplus':'\u2214','dotsquare':'\u22A1','doublebarwedge':'\u2306','DoubleContourIntegral':'\u222F','DoubleDot':'\xA8','DoubleDownArrow':'\u21D3','DoubleLeftArrow':'\u21D0','DoubleLeftRightArrow':'\u21D4','DoubleLeftTee':'\u2AE4','DoubleLongLeftArrow':'\u27F8','DoubleLongLeftRightArrow':'\u27FA','DoubleLongRightArrow':'\u27F9','DoubleRightArrow':'\u21D2','DoubleRightTee':'\u22A8','DoubleUpArrow':'\u21D1','DoubleUpDownArrow':'\u21D5','DoubleVerticalBar':'\u2225','downarrow':'\u2193','Downarrow':'\u21D3','DownArrow':'\u2193','DownArrowBar':'\u2913','DownArrowUpArrow':'\u21F5','DownBreve':'\u0311','downdownarrows':'\u21CA','downharpoonleft':'\u21C3','downharpoonright':'\u21C2','DownLeftRightVector':'\u2950','DownLeftTeeVector':'\u295E','DownLeftVector':'\u21BD','DownLeftVectorBar':'\u2956','DownRightTeeVector':'\u295F','DownRightVector':'\u21C1','DownRightVectorBar':'\u2957','DownTee':'\u22A4','DownTeeArrow':'\u21A7','drbkarow':'\u2910','drcorn':'\u231F','drcrop':'\u230C','dscr':'\uD835\uDCB9','Dscr':'\uD835\uDC9F','dscy':'\u0455','DScy':'\u0405','dsol':'\u29F6','dstrok':'\u0111','Dstrok':'\u0110','dtdot':'\u22F1','dtri':'\u25BF','dtrif':'\u25BE','duarr':'\u21F5','duhar':'\u296F','dwangle':'\u29A6','dzcy':'\u045F','DZcy':'\u040F','dzigrarr':'\u27FF','eacute':'\xE9','Eacute':'\xC9','easter':'\u2A6E','ecaron':'\u011B','Ecaron':'\u011A','ecir':'\u2256','ecirc':'\xEA','Ecirc':'\xCA','ecolon':'\u2255','ecy':'\u044D','Ecy':'\u042D','eDDot':'\u2A77','edot':'\u0117','eDot':'\u2251','Edot':'\u0116','ee':'\u2147','efDot':'\u2252','efr':'\uD835\uDD22','Efr':'\uD835\uDD08','eg':'\u2A9A','egrave':'\xE8','Egrave':'\xC8','egs':'\u2A96','egsdot':'\u2A98','el':'\u2A99','Element':'\u2208','elinters':'\u23E7','ell':'\u2113','els':'\u2A95','elsdot':'\u2A97','emacr':'\u0113','Emacr':'\u0112','empty':'\u2205','emptyset':'\u2205','EmptySmallSquare':'\u25FB','emptyv':'\u2205','EmptyVerySmallSquare':'\u25AB','emsp':'\u2003','emsp13':'\u2004','emsp14':'\u2005','eng':'\u014B','ENG':'\u014A','ensp':'\u2002','eogon':'\u0119','Eogon':'\u0118','eopf':'\uD835\uDD56','Eopf':'\uD835\uDD3C','epar':'\u22D5','eparsl':'\u29E3','eplus':'\u2A71','epsi':'\u03B5','epsilon':'\u03B5','Epsilon':'\u0395','epsiv':'\u03F5','eqcirc':'\u2256','eqcolon':'\u2255','eqsim':'\u2242','eqslantgtr':'\u2A96','eqslantless':'\u2A95','Equal':'\u2A75','equals':'=','EqualTilde':'\u2242','equest':'\u225F','Equilibrium':'\u21CC','equiv':'\u2261','equivDD':'\u2A78','eqvparsl':'\u29E5','erarr':'\u2971','erDot':'\u2253','escr':'\u212F','Escr':'\u2130','esdot':'\u2250','esim':'\u2242','Esim':'\u2A73','eta':'\u03B7','Eta':'\u0397','eth':'\xF0','ETH':'\xD0','euml':'\xEB','Euml':'\xCB','euro':'\u20AC','excl':'!','exist':'\u2203','Exists':'\u2203','expectation':'\u2130','exponentiale':'\u2147','ExponentialE':'\u2147','fallingdotseq':'\u2252','fcy':'\u0444','Fcy':'\u0424','female':'\u2640','ffilig':'\uFB03','fflig':'\uFB00','ffllig':'\uFB04','ffr':'\uD835\uDD23','Ffr':'\uD835\uDD09','filig':'\uFB01','FilledSmallSquare':'\u25FC','FilledVerySmallSquare':'\u25AA','fjlig':'fj','flat':'\u266D','fllig':'\uFB02','fltns':'\u25B1','fnof':'\u0192','fopf':'\uD835\uDD57','Fopf':'\uD835\uDD3D','forall':'\u2200','ForAll':'\u2200','fork':'\u22D4','forkv':'\u2AD9','Fouriertrf':'\u2131','fpartint':'\u2A0D','frac12':'\xBD','frac13':'\u2153','frac14':'\xBC','frac15':'\u2155','frac16':'\u2159','frac18':'\u215B','frac23':'\u2154','frac25':'\u2156','frac34':'\xBE','frac35':'\u2157','frac38':'\u215C','frac45':'\u2158','frac56':'\u215A','frac58':'\u215D','frac78':'\u215E','frasl':'\u2044','frown':'\u2322','fscr':'\uD835\uDCBB','Fscr':'\u2131','gacute':'\u01F5','gamma':'\u03B3','Gamma':'\u0393','gammad':'\u03DD','Gammad':'\u03DC','gap':'\u2A86','gbreve':'\u011F','Gbreve':'\u011E','Gcedil':'\u0122','gcirc':'\u011D','Gcirc':'\u011C','gcy':'\u0433','Gcy':'\u0413','gdot':'\u0121','Gdot':'\u0120','ge':'\u2265','gE':'\u2267','gel':'\u22DB','gEl':'\u2A8C','geq':'\u2265','geqq':'\u2267','geqslant':'\u2A7E','ges':'\u2A7E','gescc':'\u2AA9','gesdot':'\u2A80','gesdoto':'\u2A82','gesdotol':'\u2A84','gesl':'\u22DB\uFE00','gesles':'\u2A94','gfr':'\uD835\uDD24','Gfr':'\uD835\uDD0A','gg':'\u226B','Gg':'\u22D9','ggg':'\u22D9','gimel':'\u2137','gjcy':'\u0453','GJcy':'\u0403','gl':'\u2277','gla':'\u2AA5','glE':'\u2A92','glj':'\u2AA4','gnap':'\u2A8A','gnapprox':'\u2A8A','gne':'\u2A88','gnE':'\u2269','gneq':'\u2A88','gneqq':'\u2269','gnsim':'\u22E7','gopf':'\uD835\uDD58','Gopf':'\uD835\uDD3E','grave':'`','GreaterEqual':'\u2265','GreaterEqualLess':'\u22DB','GreaterFullEqual':'\u2267','GreaterGreater':'\u2AA2','GreaterLess':'\u2277','GreaterSlantEqual':'\u2A7E','GreaterTilde':'\u2273','gscr':'\u210A','Gscr':'\uD835\uDCA2','gsim':'\u2273','gsime':'\u2A8E','gsiml':'\u2A90','gt':'>','Gt':'\u226B','GT':'>','gtcc':'\u2AA7','gtcir':'\u2A7A','gtdot':'\u22D7','gtlPar':'\u2995','gtquest':'\u2A7C','gtrapprox':'\u2A86','gtrarr':'\u2978','gtrdot':'\u22D7','gtreqless':'\u22DB','gtreqqless':'\u2A8C','gtrless':'\u2277','gtrsim':'\u2273','gvertneqq':'\u2269\uFE00','gvnE':'\u2269\uFE00','Hacek':'\u02C7','hairsp':'\u200A','half':'\xBD','hamilt':'\u210B','hardcy':'\u044A','HARDcy':'\u042A','harr':'\u2194','hArr':'\u21D4','harrcir':'\u2948','harrw':'\u21AD','Hat':'^','hbar':'\u210F','hcirc':'\u0125','Hcirc':'\u0124','hearts':'\u2665','heartsuit':'\u2665','hellip':'\u2026','hercon':'\u22B9','hfr':'\uD835\uDD25','Hfr':'\u210C','HilbertSpace':'\u210B','hksearow':'\u2925','hkswarow':'\u2926','hoarr':'\u21FF','homtht':'\u223B','hookleftarrow':'\u21A9','hookrightarrow':'\u21AA','hopf':'\uD835\uDD59','Hopf':'\u210D','horbar':'\u2015','HorizontalLine':'\u2500','hscr':'\uD835\uDCBD','Hscr':'\u210B','hslash':'\u210F','hstrok':'\u0127','Hstrok':'\u0126','HumpDownHump':'\u224E','HumpEqual':'\u224F','hybull':'\u2043','hyphen':'\u2010','iacute':'\xED','Iacute':'\xCD','ic':'\u2063','icirc':'\xEE','Icirc':'\xCE','icy':'\u0438','Icy':'\u0418','Idot':'\u0130','iecy':'\u0435','IEcy':'\u0415','iexcl':'\xA1','iff':'\u21D4','ifr':'\uD835\uDD26','Ifr':'\u2111','igrave':'\xEC','Igrave':'\xCC','ii':'\u2148','iiiint':'\u2A0C','iiint':'\u222D','iinfin':'\u29DC','iiota':'\u2129','ijlig':'\u0133','IJlig':'\u0132','Im':'\u2111','imacr':'\u012B','Imacr':'\u012A','image':'\u2111','ImaginaryI':'\u2148','imagline':'\u2110','imagpart':'\u2111','imath':'\u0131','imof':'\u22B7','imped':'\u01B5','Implies':'\u21D2','in':'\u2208','incare':'\u2105','infin':'\u221E','infintie':'\u29DD','inodot':'\u0131','int':'\u222B','Int':'\u222C','intcal':'\u22BA','integers':'\u2124','Integral':'\u222B','intercal':'\u22BA','Intersection':'\u22C2','intlarhk':'\u2A17','intprod':'\u2A3C','InvisibleComma':'\u2063','InvisibleTimes':'\u2062','iocy':'\u0451','IOcy':'\u0401','iogon':'\u012F','Iogon':'\u012E','iopf':'\uD835\uDD5A','Iopf':'\uD835\uDD40','iota':'\u03B9','Iota':'\u0399','iprod':'\u2A3C','iquest':'\xBF','iscr':'\uD835\uDCBE','Iscr':'\u2110','isin':'\u2208','isindot':'\u22F5','isinE':'\u22F9','isins':'\u22F4','isinsv':'\u22F3','isinv':'\u2208','it':'\u2062','itilde':'\u0129','Itilde':'\u0128','iukcy':'\u0456','Iukcy':'\u0406','iuml':'\xEF','Iuml':'\xCF','jcirc':'\u0135','Jcirc':'\u0134','jcy':'\u0439','Jcy':'\u0419','jfr':'\uD835\uDD27','Jfr':'\uD835\uDD0D','jmath':'\u0237','jopf':'\uD835\uDD5B','Jopf':'\uD835\uDD41','jscr':'\uD835\uDCBF','Jscr':'\uD835\uDCA5','jsercy':'\u0458','Jsercy':'\u0408','jukcy':'\u0454','Jukcy':'\u0404','kappa':'\u03BA','Kappa':'\u039A','kappav':'\u03F0','kcedil':'\u0137','Kcedil':'\u0136','kcy':'\u043A','Kcy':'\u041A','kfr':'\uD835\uDD28','Kfr':'\uD835\uDD0E','kgreen':'\u0138','khcy':'\u0445','KHcy':'\u0425','kjcy':'\u045C','KJcy':'\u040C','kopf':'\uD835\uDD5C','Kopf':'\uD835\uDD42','kscr':'\uD835\uDCC0','Kscr':'\uD835\uDCA6','lAarr':'\u21DA','lacute':'\u013A','Lacute':'\u0139','laemptyv':'\u29B4','lagran':'\u2112','lambda':'\u03BB','Lambda':'\u039B','lang':'\u27E8','Lang':'\u27EA','langd':'\u2991','langle':'\u27E8','lap':'\u2A85','Laplacetrf':'\u2112','laquo':'\xAB','larr':'\u2190','lArr':'\u21D0','Larr':'\u219E','larrb':'\u21E4','larrbfs':'\u291F','larrfs':'\u291D','larrhk':'\u21A9','larrlp':'\u21AB','larrpl':'\u2939','larrsim':'\u2973','larrtl':'\u21A2','lat':'\u2AAB','latail':'\u2919','lAtail':'\u291B','late':'\u2AAD','lates':'\u2AAD\uFE00','lbarr':'\u290C','lBarr':'\u290E','lbbrk':'\u2772','lbrace':'{','lbrack':'[','lbrke':'\u298B','lbrksld':'\u298F','lbrkslu':'\u298D','lcaron':'\u013E','Lcaron':'\u013D','lcedil':'\u013C','Lcedil':'\u013B','lceil':'\u2308','lcub':'{','lcy':'\u043B','Lcy':'\u041B','ldca':'\u2936','ldquo':'\u201C','ldquor':'\u201E','ldrdhar':'\u2967','ldrushar':'\u294B','ldsh':'\u21B2','le':'\u2264','lE':'\u2266','LeftAngleBracket':'\u27E8','leftarrow':'\u2190','Leftarrow':'\u21D0','LeftArrow':'\u2190','LeftArrowBar':'\u21E4','LeftArrowRightArrow':'\u21C6','leftarrowtail':'\u21A2','LeftCeiling':'\u2308','LeftDoubleBracket':'\u27E6','LeftDownTeeVector':'\u2961','LeftDownVector':'\u21C3','LeftDownVectorBar':'\u2959','LeftFloor':'\u230A','leftharpoondown':'\u21BD','leftharpoonup':'\u21BC','leftleftarrows':'\u21C7','leftrightarrow':'\u2194','Leftrightarrow':'\u21D4','LeftRightArrow':'\u2194','leftrightarrows':'\u21C6','leftrightharpoons':'\u21CB','leftrightsquigarrow':'\u21AD','LeftRightVector':'\u294E','LeftTee':'\u22A3','LeftTeeArrow':'\u21A4','LeftTeeVector':'\u295A','leftthreetimes':'\u22CB','LeftTriangle':'\u22B2','LeftTriangleBar':'\u29CF','LeftTriangleEqual':'\u22B4','LeftUpDownVector':'\u2951','LeftUpTeeVector':'\u2960','LeftUpVector':'\u21BF','LeftUpVectorBar':'\u2958','LeftVector':'\u21BC','LeftVectorBar':'\u2952','leg':'\u22DA','lEg':'\u2A8B','leq':'\u2264','leqq':'\u2266','leqslant':'\u2A7D','les':'\u2A7D','lescc':'\u2AA8','lesdot':'\u2A7F','lesdoto':'\u2A81','lesdotor':'\u2A83','lesg':'\u22DA\uFE00','lesges':'\u2A93','lessapprox':'\u2A85','lessdot':'\u22D6','lesseqgtr':'\u22DA','lesseqqgtr':'\u2A8B','LessEqualGreater':'\u22DA','LessFullEqual':'\u2266','LessGreater':'\u2276','lessgtr':'\u2276','LessLess':'\u2AA1','lesssim':'\u2272','LessSlantEqual':'\u2A7D','LessTilde':'\u2272','lfisht':'\u297C','lfloor':'\u230A','lfr':'\uD835\uDD29','Lfr':'\uD835\uDD0F','lg':'\u2276','lgE':'\u2A91','lHar':'\u2962','lhard':'\u21BD','lharu':'\u21BC','lharul':'\u296A','lhblk':'\u2584','ljcy':'\u0459','LJcy':'\u0409','ll':'\u226A','Ll':'\u22D8','llarr':'\u21C7','llcorner':'\u231E','Lleftarrow':'\u21DA','llhard':'\u296B','lltri':'\u25FA','lmidot':'\u0140','Lmidot':'\u013F','lmoust':'\u23B0','lmoustache':'\u23B0','lnap':'\u2A89','lnapprox':'\u2A89','lne':'\u2A87','lnE':'\u2268','lneq':'\u2A87','lneqq':'\u2268','lnsim':'\u22E6','loang':'\u27EC','loarr':'\u21FD','lobrk':'\u27E6','longleftarrow':'\u27F5','Longleftarrow':'\u27F8','LongLeftArrow':'\u27F5','longleftrightarrow':'\u27F7','Longleftrightarrow':'\u27FA','LongLeftRightArrow':'\u27F7','longmapsto':'\u27FC','longrightarrow':'\u27F6','Longrightarrow':'\u27F9','LongRightArrow':'\u27F6','looparrowleft':'\u21AB','looparrowright':'\u21AC','lopar':'\u2985','lopf':'\uD835\uDD5D','Lopf':'\uD835\uDD43','loplus':'\u2A2D','lotimes':'\u2A34','lowast':'\u2217','lowbar':'_','LowerLeftArrow':'\u2199','LowerRightArrow':'\u2198','loz':'\u25CA','lozenge':'\u25CA','lozf':'\u29EB','lpar':'(','lparlt':'\u2993','lrarr':'\u21C6','lrcorner':'\u231F','lrhar':'\u21CB','lrhard':'\u296D','lrm':'\u200E','lrtri':'\u22BF','lsaquo':'\u2039','lscr':'\uD835\uDCC1','Lscr':'\u2112','lsh':'\u21B0','Lsh':'\u21B0','lsim':'\u2272','lsime':'\u2A8D','lsimg':'\u2A8F','lsqb':'[','lsquo':'\u2018','lsquor':'\u201A','lstrok':'\u0142','Lstrok':'\u0141','lt':'<','Lt':'\u226A','LT':'<','ltcc':'\u2AA6','ltcir':'\u2A79','ltdot':'\u22D6','lthree':'\u22CB','ltimes':'\u22C9','ltlarr':'\u2976','ltquest':'\u2A7B','ltri':'\u25C3','ltrie':'\u22B4','ltrif':'\u25C2','ltrPar':'\u2996','lurdshar':'\u294A','luruhar':'\u2966','lvertneqq':'\u2268\uFE00','lvnE':'\u2268\uFE00','macr':'\xAF','male':'\u2642','malt':'\u2720','maltese':'\u2720','map':'\u21A6','Map':'\u2905','mapsto':'\u21A6','mapstodown':'\u21A7','mapstoleft':'\u21A4','mapstoup':'\u21A5','marker':'\u25AE','mcomma':'\u2A29','mcy':'\u043C','Mcy':'\u041C','mdash':'\u2014','mDDot':'\u223A','measuredangle':'\u2221','MediumSpace':'\u205F','Mellintrf':'\u2133','mfr':'\uD835\uDD2A','Mfr':'\uD835\uDD10','mho':'\u2127','micro':'\xB5','mid':'\u2223','midast':'*','midcir':'\u2AF0','middot':'\xB7','minus':'\u2212','minusb':'\u229F','minusd':'\u2238','minusdu':'\u2A2A','MinusPlus':'\u2213','mlcp':'\u2ADB','mldr':'\u2026','mnplus':'\u2213','models':'\u22A7','mopf':'\uD835\uDD5E','Mopf':'\uD835\uDD44','mp':'\u2213','mscr':'\uD835\uDCC2','Mscr':'\u2133','mstpos':'\u223E','mu':'\u03BC','Mu':'\u039C','multimap':'\u22B8','mumap':'\u22B8','nabla':'\u2207','nacute':'\u0144','Nacute':'\u0143','nang':'\u2220\u20D2','nap':'\u2249','napE':'\u2A70\u0338','napid':'\u224B\u0338','napos':'\u0149','napprox':'\u2249','natur':'\u266E','natural':'\u266E','naturals':'\u2115','nbsp':'\xA0','nbump':'\u224E\u0338','nbumpe':'\u224F\u0338','ncap':'\u2A43','ncaron':'\u0148','Ncaron':'\u0147','ncedil':'\u0146','Ncedil':'\u0145','ncong':'\u2247','ncongdot':'\u2A6D\u0338','ncup':'\u2A42','ncy':'\u043D','Ncy':'\u041D','ndash':'\u2013','ne':'\u2260','nearhk':'\u2924','nearr':'\u2197','neArr':'\u21D7','nearrow':'\u2197','nedot':'\u2250\u0338','NegativeMediumSpace':'\u200B','NegativeThickSpace':'\u200B','NegativeThinSpace':'\u200B','NegativeVeryThinSpace':'\u200B','nequiv':'\u2262','nesear':'\u2928','nesim':'\u2242\u0338','NestedGreaterGreater':'\u226B','NestedLessLess':'\u226A','NewLine':'\n','nexist':'\u2204','nexists':'\u2204','nfr':'\uD835\uDD2B','Nfr':'\uD835\uDD11','nge':'\u2271','ngE':'\u2267\u0338','ngeq':'\u2271','ngeqq':'\u2267\u0338','ngeqslant':'\u2A7E\u0338','nges':'\u2A7E\u0338','nGg':'\u22D9\u0338','ngsim':'\u2275','ngt':'\u226F','nGt':'\u226B\u20D2','ngtr':'\u226F','nGtv':'\u226B\u0338','nharr':'\u21AE','nhArr':'\u21CE','nhpar':'\u2AF2','ni':'\u220B','nis':'\u22FC','nisd':'\u22FA','niv':'\u220B','njcy':'\u045A','NJcy':'\u040A','nlarr':'\u219A','nlArr':'\u21CD','nldr':'\u2025','nle':'\u2270','nlE':'\u2266\u0338','nleftarrow':'\u219A','nLeftarrow':'\u21CD','nleftrightarrow':'\u21AE','nLeftrightarrow':'\u21CE','nleq':'\u2270','nleqq':'\u2266\u0338','nleqslant':'\u2A7D\u0338','nles':'\u2A7D\u0338','nless':'\u226E','nLl':'\u22D8\u0338','nlsim':'\u2274','nlt':'\u226E','nLt':'\u226A\u20D2','nltri':'\u22EA','nltrie':'\u22EC','nLtv':'\u226A\u0338','nmid':'\u2224','NoBreak':'\u2060','NonBreakingSpace':'\xA0','nopf':'\uD835\uDD5F','Nopf':'\u2115','not':'\xAC','Not':'\u2AEC','NotCongruent':'\u2262','NotCupCap':'\u226D','NotDoubleVerticalBar':'\u2226','NotElement':'\u2209','NotEqual':'\u2260','NotEqualTilde':'\u2242\u0338','NotExists':'\u2204','NotGreater':'\u226F','NotGreaterEqual':'\u2271','NotGreaterFullEqual':'\u2267\u0338','NotGreaterGreater':'\u226B\u0338','NotGreaterLess':'\u2279','NotGreaterSlantEqual':'\u2A7E\u0338','NotGreaterTilde':'\u2275','NotHumpDownHump':'\u224E\u0338','NotHumpEqual':'\u224F\u0338','notin':'\u2209','notindot':'\u22F5\u0338','notinE':'\u22F9\u0338','notinva':'\u2209','notinvb':'\u22F7','notinvc':'\u22F6','NotLeftTriangle':'\u22EA','NotLeftTriangleBar':'\u29CF\u0338','NotLeftTriangleEqual':'\u22EC','NotLess':'\u226E','NotLessEqual':'\u2270','NotLessGreater':'\u2278','NotLessLess':'\u226A\u0338','NotLessSlantEqual':'\u2A7D\u0338','NotLessTilde':'\u2274','NotNestedGreaterGreater':'\u2AA2\u0338','NotNestedLessLess':'\u2AA1\u0338','notni':'\u220C','notniva':'\u220C','notnivb':'\u22FE','notnivc':'\u22FD','NotPrecedes':'\u2280','NotPrecedesEqual':'\u2AAF\u0338','NotPrecedesSlantEqual':'\u22E0','NotReverseElement':'\u220C','NotRightTriangle':'\u22EB','NotRightTriangleBar':'\u29D0\u0338','NotRightTriangleEqual':'\u22ED','NotSquareSubset':'\u228F\u0338','NotSquareSubsetEqual':'\u22E2','NotSquareSuperset':'\u2290\u0338','NotSquareSupersetEqual':'\u22E3','NotSubset':'\u2282\u20D2','NotSubsetEqual':'\u2288','NotSucceeds':'\u2281','NotSucceedsEqual':'\u2AB0\u0338','NotSucceedsSlantEqual':'\u22E1','NotSucceedsTilde':'\u227F\u0338','NotSuperset':'\u2283\u20D2','NotSupersetEqual':'\u2289','NotTilde':'\u2241','NotTildeEqual':'\u2244','NotTildeFullEqual':'\u2247','NotTildeTilde':'\u2249','NotVerticalBar':'\u2224','npar':'\u2226','nparallel':'\u2226','nparsl':'\u2AFD\u20E5','npart':'\u2202\u0338','npolint':'\u2A14','npr':'\u2280','nprcue':'\u22E0','npre':'\u2AAF\u0338','nprec':'\u2280','npreceq':'\u2AAF\u0338','nrarr':'\u219B','nrArr':'\u21CF','nrarrc':'\u2933\u0338','nrarrw':'\u219D\u0338','nrightarrow':'\u219B','nRightarrow':'\u21CF','nrtri':'\u22EB','nrtrie':'\u22ED','nsc':'\u2281','nsccue':'\u22E1','nsce':'\u2AB0\u0338','nscr':'\uD835\uDCC3','Nscr':'\uD835\uDCA9','nshortmid':'\u2224','nshortparallel':'\u2226','nsim':'\u2241','nsime':'\u2244','nsimeq':'\u2244','nsmid':'\u2224','nspar':'\u2226','nsqsube':'\u22E2','nsqsupe':'\u22E3','nsub':'\u2284','nsube':'\u2288','nsubE':'\u2AC5\u0338','nsubset':'\u2282\u20D2','nsubseteq':'\u2288','nsubseteqq':'\u2AC5\u0338','nsucc':'\u2281','nsucceq':'\u2AB0\u0338','nsup':'\u2285','nsupe':'\u2289','nsupE':'\u2AC6\u0338','nsupset':'\u2283\u20D2','nsupseteq':'\u2289','nsupseteqq':'\u2AC6\u0338','ntgl':'\u2279','ntilde':'\xF1','Ntilde':'\xD1','ntlg':'\u2278','ntriangleleft':'\u22EA','ntrianglelefteq':'\u22EC','ntriangleright':'\u22EB','ntrianglerighteq':'\u22ED','nu':'\u03BD','Nu':'\u039D','num':'#','numero':'\u2116','numsp':'\u2007','nvap':'\u224D\u20D2','nvdash':'\u22AC','nvDash':'\u22AD','nVdash':'\u22AE','nVDash':'\u22AF','nvge':'\u2265\u20D2','nvgt':'>\u20D2','nvHarr':'\u2904','nvinfin':'\u29DE','nvlArr':'\u2902','nvle':'\u2264\u20D2','nvlt':'<\u20D2','nvltrie':'\u22B4\u20D2','nvrArr':'\u2903','nvrtrie':'\u22B5\u20D2','nvsim':'\u223C\u20D2','nwarhk':'\u2923','nwarr':'\u2196','nwArr':'\u21D6','nwarrow':'\u2196','nwnear':'\u2927','oacute':'\xF3','Oacute':'\xD3','oast':'\u229B','ocir':'\u229A','ocirc':'\xF4','Ocirc':'\xD4','ocy':'\u043E','Ocy':'\u041E','odash':'\u229D','odblac':'\u0151','Odblac':'\u0150','odiv':'\u2A38','odot':'\u2299','odsold':'\u29BC','oelig':'\u0153','OElig':'\u0152','ofcir':'\u29BF','ofr':'\uD835\uDD2C','Ofr':'\uD835\uDD12','ogon':'\u02DB','ograve':'\xF2','Ograve':'\xD2','ogt':'\u29C1','ohbar':'\u29B5','ohm':'\u03A9','oint':'\u222E','olarr':'\u21BA','olcir':'\u29BE','olcross':'\u29BB','oline':'\u203E','olt':'\u29C0','omacr':'\u014D','Omacr':'\u014C','omega':'\u03C9','Omega':'\u03A9','omicron':'\u03BF','Omicron':'\u039F','omid':'\u29B6','ominus':'\u2296','oopf':'\uD835\uDD60','Oopf':'\uD835\uDD46','opar':'\u29B7','OpenCurlyDoubleQuote':'\u201C','OpenCurlyQuote':'\u2018','operp':'\u29B9','oplus':'\u2295','or':'\u2228','Or':'\u2A54','orarr':'\u21BB','ord':'\u2A5D','order':'\u2134','orderof':'\u2134','ordf':'\xAA','ordm':'\xBA','origof':'\u22B6','oror':'\u2A56','orslope':'\u2A57','orv':'\u2A5B','oS':'\u24C8','oscr':'\u2134','Oscr':'\uD835\uDCAA','oslash':'\xF8','Oslash':'\xD8','osol':'\u2298','otilde':'\xF5','Otilde':'\xD5','otimes':'\u2297','Otimes':'\u2A37','otimesas':'\u2A36','ouml':'\xF6','Ouml':'\xD6','ovbar':'\u233D','OverBar':'\u203E','OverBrace':'\u23DE','OverBracket':'\u23B4','OverParenthesis':'\u23DC','par':'\u2225','para':'\xB6','parallel':'\u2225','parsim':'\u2AF3','parsl':'\u2AFD','part':'\u2202','PartialD':'\u2202','pcy':'\u043F','Pcy':'\u041F','percnt':'%','period':'.','permil':'\u2030','perp':'\u22A5','pertenk':'\u2031','pfr':'\uD835\uDD2D','Pfr':'\uD835\uDD13','phi':'\u03C6','Phi':'\u03A6','phiv':'\u03D5','phmmat':'\u2133','phone':'\u260E','pi':'\u03C0','Pi':'\u03A0','pitchfork':'\u22D4','piv':'\u03D6','planck':'\u210F','planckh':'\u210E','plankv':'\u210F','plus':'+','plusacir':'\u2A23','plusb':'\u229E','pluscir':'\u2A22','plusdo':'\u2214','plusdu':'\u2A25','pluse':'\u2A72','PlusMinus':'\xB1','plusmn':'\xB1','plussim':'\u2A26','plustwo':'\u2A27','pm':'\xB1','Poincareplane':'\u210C','pointint':'\u2A15','popf':'\uD835\uDD61','Popf':'\u2119','pound':'\xA3','pr':'\u227A','Pr':'\u2ABB','prap':'\u2AB7','prcue':'\u227C','pre':'\u2AAF','prE':'\u2AB3','prec':'\u227A','precapprox':'\u2AB7','preccurlyeq':'\u227C','Precedes':'\u227A','PrecedesEqual':'\u2AAF','PrecedesSlantEqual':'\u227C','PrecedesTilde':'\u227E','preceq':'\u2AAF','precnapprox':'\u2AB9','precneqq':'\u2AB5','precnsim':'\u22E8','precsim':'\u227E','prime':'\u2032','Prime':'\u2033','primes':'\u2119','prnap':'\u2AB9','prnE':'\u2AB5','prnsim':'\u22E8','prod':'\u220F','Product':'\u220F','profalar':'\u232E','profline':'\u2312','profsurf':'\u2313','prop':'\u221D','Proportion':'\u2237','Proportional':'\u221D','propto':'\u221D','prsim':'\u227E','prurel':'\u22B0','pscr':'\uD835\uDCC5','Pscr':'\uD835\uDCAB','psi':'\u03C8','Psi':'\u03A8','puncsp':'\u2008','qfr':'\uD835\uDD2E','Qfr':'\uD835\uDD14','qint':'\u2A0C','qopf':'\uD835\uDD62','Qopf':'\u211A','qprime':'\u2057','qscr':'\uD835\uDCC6','Qscr':'\uD835\uDCAC','quaternions':'\u210D','quatint':'\u2A16','quest':'?','questeq':'\u225F','quot':'"','QUOT':'"','rAarr':'\u21DB','race':'\u223D\u0331','racute':'\u0155','Racute':'\u0154','radic':'\u221A','raemptyv':'\u29B3','rang':'\u27E9','Rang':'\u27EB','rangd':'\u2992','range':'\u29A5','rangle':'\u27E9','raquo':'\xBB','rarr':'\u2192','rArr':'\u21D2','Rarr':'\u21A0','rarrap':'\u2975','rarrb':'\u21E5','rarrbfs':'\u2920','rarrc':'\u2933','rarrfs':'\u291E','rarrhk':'\u21AA','rarrlp':'\u21AC','rarrpl':'\u2945','rarrsim':'\u2974','rarrtl':'\u21A3','Rarrtl':'\u2916','rarrw':'\u219D','ratail':'\u291A','rAtail':'\u291C','ratio':'\u2236','rationals':'\u211A','rbarr':'\u290D','rBarr':'\u290F','RBarr':'\u2910','rbbrk':'\u2773','rbrace':'}','rbrack':']','rbrke':'\u298C','rbrksld':'\u298E','rbrkslu':'\u2990','rcaron':'\u0159','Rcaron':'\u0158','rcedil':'\u0157','Rcedil':'\u0156','rceil':'\u2309','rcub':'}','rcy':'\u0440','Rcy':'\u0420','rdca':'\u2937','rdldhar':'\u2969','rdquo':'\u201D','rdquor':'\u201D','rdsh':'\u21B3','Re':'\u211C','real':'\u211C','realine':'\u211B','realpart':'\u211C','reals':'\u211D','rect':'\u25AD','reg':'\xAE','REG':'\xAE','ReverseElement':'\u220B','ReverseEquilibrium':'\u21CB','ReverseUpEquilibrium':'\u296F','rfisht':'\u297D','rfloor':'\u230B','rfr':'\uD835\uDD2F','Rfr':'\u211C','rHar':'\u2964','rhard':'\u21C1','rharu':'\u21C0','rharul':'\u296C','rho':'\u03C1','Rho':'\u03A1','rhov':'\u03F1','RightAngleBracket':'\u27E9','rightarrow':'\u2192','Rightarrow':'\u21D2','RightArrow':'\u2192','RightArrowBar':'\u21E5','RightArrowLeftArrow':'\u21C4','rightarrowtail':'\u21A3','RightCeiling':'\u2309','RightDoubleBracket':'\u27E7','RightDownTeeVector':'\u295D','RightDownVector':'\u21C2','RightDownVectorBar':'\u2955','RightFloor':'\u230B','rightharpoondown':'\u21C1','rightharpoonup':'\u21C0','rightleftarrows':'\u21C4','rightleftharpoons':'\u21CC','rightrightarrows':'\u21C9','rightsquigarrow':'\u219D','RightTee':'\u22A2','RightTeeArrow':'\u21A6','RightTeeVector':'\u295B','rightthreetimes':'\u22CC','RightTriangle':'\u22B3','RightTriangleBar':'\u29D0','RightTriangleEqual':'\u22B5','RightUpDownVector':'\u294F','RightUpTeeVector':'\u295C','RightUpVector':'\u21BE','RightUpVectorBar':'\u2954','RightVector':'\u21C0','RightVectorBar':'\u2953','ring':'\u02DA','risingdotseq':'\u2253','rlarr':'\u21C4','rlhar':'\u21CC','rlm':'\u200F','rmoust':'\u23B1','rmoustache':'\u23B1','rnmid':'\u2AEE','roang':'\u27ED','roarr':'\u21FE','robrk':'\u27E7','ropar':'\u2986','ropf':'\uD835\uDD63','Ropf':'\u211D','roplus':'\u2A2E','rotimes':'\u2A35','RoundImplies':'\u2970','rpar':')','rpargt':'\u2994','rppolint':'\u2A12','rrarr':'\u21C9','Rrightarrow':'\u21DB','rsaquo':'\u203A','rscr':'\uD835\uDCC7','Rscr':'\u211B','rsh':'\u21B1','Rsh':'\u21B1','rsqb':']','rsquo':'\u2019','rsquor':'\u2019','rthree':'\u22CC','rtimes':'\u22CA','rtri':'\u25B9','rtrie':'\u22B5','rtrif':'\u25B8','rtriltri':'\u29CE','RuleDelayed':'\u29F4','ruluhar':'\u2968','rx':'\u211E','sacute':'\u015B','Sacute':'\u015A','sbquo':'\u201A','sc':'\u227B','Sc':'\u2ABC','scap':'\u2AB8','scaron':'\u0161','Scaron':'\u0160','sccue':'\u227D','sce':'\u2AB0','scE':'\u2AB4','scedil':'\u015F','Scedil':'\u015E','scirc':'\u015D','Scirc':'\u015C','scnap':'\u2ABA','scnE':'\u2AB6','scnsim':'\u22E9','scpolint':'\u2A13','scsim':'\u227F','scy':'\u0441','Scy':'\u0421','sdot':'\u22C5','sdotb':'\u22A1','sdote':'\u2A66','searhk':'\u2925','searr':'\u2198','seArr':'\u21D8','searrow':'\u2198','sect':'\xA7','semi':';','seswar':'\u2929','setminus':'\u2216','setmn':'\u2216','sext':'\u2736','sfr':'\uD835\uDD30','Sfr':'\uD835\uDD16','sfrown':'\u2322','sharp':'\u266F','shchcy':'\u0449','SHCHcy':'\u0429','shcy':'\u0448','SHcy':'\u0428','ShortDownArrow':'\u2193','ShortLeftArrow':'\u2190','shortmid':'\u2223','shortparallel':'\u2225','ShortRightArrow':'\u2192','ShortUpArrow':'\u2191','shy':'\xAD','sigma':'\u03C3','Sigma':'\u03A3','sigmaf':'\u03C2','sigmav':'\u03C2','sim':'\u223C','simdot':'\u2A6A','sime':'\u2243','simeq':'\u2243','simg':'\u2A9E','simgE':'\u2AA0','siml':'\u2A9D','simlE':'\u2A9F','simne':'\u2246','simplus':'\u2A24','simrarr':'\u2972','slarr':'\u2190','SmallCircle':'\u2218','smallsetminus':'\u2216','smashp':'\u2A33','smeparsl':'\u29E4','smid':'\u2223','smile':'\u2323','smt':'\u2AAA','smte':'\u2AAC','smtes':'\u2AAC\uFE00','softcy':'\u044C','SOFTcy':'\u042C','sol':'/','solb':'\u29C4','solbar':'\u233F','sopf':'\uD835\uDD64','Sopf':'\uD835\uDD4A','spades':'\u2660','spadesuit':'\u2660','spar':'\u2225','sqcap':'\u2293','sqcaps':'\u2293\uFE00','sqcup':'\u2294','sqcups':'\u2294\uFE00','Sqrt':'\u221A','sqsub':'\u228F','sqsube':'\u2291','sqsubset':'\u228F','sqsubseteq':'\u2291','sqsup':'\u2290','sqsupe':'\u2292','sqsupset':'\u2290','sqsupseteq':'\u2292','squ':'\u25A1','square':'\u25A1','Square':'\u25A1','SquareIntersection':'\u2293','SquareSubset':'\u228F','SquareSubsetEqual':'\u2291','SquareSuperset':'\u2290','SquareSupersetEqual':'\u2292','SquareUnion':'\u2294','squarf':'\u25AA','squf':'\u25AA','srarr':'\u2192','sscr':'\uD835\uDCC8','Sscr':'\uD835\uDCAE','ssetmn':'\u2216','ssmile':'\u2323','sstarf':'\u22C6','star':'\u2606','Star':'\u22C6','starf':'\u2605','straightepsilon':'\u03F5','straightphi':'\u03D5','strns':'\xAF','sub':'\u2282','Sub':'\u22D0','subdot':'\u2ABD','sube':'\u2286','subE':'\u2AC5','subedot':'\u2AC3','submult':'\u2AC1','subne':'\u228A','subnE':'\u2ACB','subplus':'\u2ABF','subrarr':'\u2979','subset':'\u2282','Subset':'\u22D0','subseteq':'\u2286','subseteqq':'\u2AC5','SubsetEqual':'\u2286','subsetneq':'\u228A','subsetneqq':'\u2ACB','subsim':'\u2AC7','subsub':'\u2AD5','subsup':'\u2AD3','succ':'\u227B','succapprox':'\u2AB8','succcurlyeq':'\u227D','Succeeds':'\u227B','SucceedsEqual':'\u2AB0','SucceedsSlantEqual':'\u227D','SucceedsTilde':'\u227F','succeq':'\u2AB0','succnapprox':'\u2ABA','succneqq':'\u2AB6','succnsim':'\u22E9','succsim':'\u227F','SuchThat':'\u220B','sum':'\u2211','Sum':'\u2211','sung':'\u266A','sup':'\u2283','Sup':'\u22D1','sup1':'\xB9','sup2':'\xB2','sup3':'\xB3','supdot':'\u2ABE','supdsub':'\u2AD8','supe':'\u2287','supE':'\u2AC6','supedot':'\u2AC4','Superset':'\u2283','SupersetEqual':'\u2287','suphsol':'\u27C9','suphsub':'\u2AD7','suplarr':'\u297B','supmult':'\u2AC2','supne':'\u228B','supnE':'\u2ACC','supplus':'\u2AC0','supset':'\u2283','Supset':'\u22D1','supseteq':'\u2287','supseteqq':'\u2AC6','supsetneq':'\u228B','supsetneqq':'\u2ACC','supsim':'\u2AC8','supsub':'\u2AD4','supsup':'\u2AD6','swarhk':'\u2926','swarr':'\u2199','swArr':'\u21D9','swarrow':'\u2199','swnwar':'\u292A','szlig':'\xDF','Tab':'\t','target':'\u2316','tau':'\u03C4','Tau':'\u03A4','tbrk':'\u23B4','tcaron':'\u0165','Tcaron':'\u0164','tcedil':'\u0163','Tcedil':'\u0162','tcy':'\u0442','Tcy':'\u0422','tdot':'\u20DB','telrec':'\u2315','tfr':'\uD835\uDD31','Tfr':'\uD835\uDD17','there4':'\u2234','therefore':'\u2234','Therefore':'\u2234','theta':'\u03B8','Theta':'\u0398','thetasym':'\u03D1','thetav':'\u03D1','thickapprox':'\u2248','thicksim':'\u223C','ThickSpace':'\u205F\u200A','thinsp':'\u2009','ThinSpace':'\u2009','thkap':'\u2248','thksim':'\u223C','thorn':'\xFE','THORN':'\xDE','tilde':'\u02DC','Tilde':'\u223C','TildeEqual':'\u2243','TildeFullEqual':'\u2245','TildeTilde':'\u2248','times':'\xD7','timesb':'\u22A0','timesbar':'\u2A31','timesd':'\u2A30','tint':'\u222D','toea':'\u2928','top':'\u22A4','topbot':'\u2336','topcir':'\u2AF1','topf':'\uD835\uDD65','Topf':'\uD835\uDD4B','topfork':'\u2ADA','tosa':'\u2929','tprime':'\u2034','trade':'\u2122','TRADE':'\u2122','triangle':'\u25B5','triangledown':'\u25BF','triangleleft':'\u25C3','trianglelefteq':'\u22B4','triangleq':'\u225C','triangleright':'\u25B9','trianglerighteq':'\u22B5','tridot':'\u25EC','trie':'\u225C','triminus':'\u2A3A','TripleDot':'\u20DB','triplus':'\u2A39','trisb':'\u29CD','tritime':'\u2A3B','trpezium':'\u23E2','tscr':'\uD835\uDCC9','Tscr':'\uD835\uDCAF','tscy':'\u0446','TScy':'\u0426','tshcy':'\u045B','TSHcy':'\u040B','tstrok':'\u0167','Tstrok':'\u0166','twixt':'\u226C','twoheadleftarrow':'\u219E','twoheadrightarrow':'\u21A0','uacute':'\xFA','Uacute':'\xDA','uarr':'\u2191','uArr':'\u21D1','Uarr':'\u219F','Uarrocir':'\u2949','ubrcy':'\u045E','Ubrcy':'\u040E','ubreve':'\u016D','Ubreve':'\u016C','ucirc':'\xFB','Ucirc':'\xDB','ucy':'\u0443','Ucy':'\u0423','udarr':'\u21C5','udblac':'\u0171','Udblac':'\u0170','udhar':'\u296E','ufisht':'\u297E','ufr':'\uD835\uDD32','Ufr':'\uD835\uDD18','ugrave':'\xF9','Ugrave':'\xD9','uHar':'\u2963','uharl':'\u21BF','uharr':'\u21BE','uhblk':'\u2580','ulcorn':'\u231C','ulcorner':'\u231C','ulcrop':'\u230F','ultri':'\u25F8','umacr':'\u016B','Umacr':'\u016A','uml':'\xA8','UnderBar':'_','UnderBrace':'\u23DF','UnderBracket':'\u23B5','UnderParenthesis':'\u23DD','Union':'\u22C3','UnionPlus':'\u228E','uogon':'\u0173','Uogon':'\u0172','uopf':'\uD835\uDD66','Uopf':'\uD835\uDD4C','uparrow':'\u2191','Uparrow':'\u21D1','UpArrow':'\u2191','UpArrowBar':'\u2912','UpArrowDownArrow':'\u21C5','updownarrow':'\u2195','Updownarrow':'\u21D5','UpDownArrow':'\u2195','UpEquilibrium':'\u296E','upharpoonleft':'\u21BF','upharpoonright':'\u21BE','uplus':'\u228E','UpperLeftArrow':'\u2196','UpperRightArrow':'\u2197','upsi':'\u03C5','Upsi':'\u03D2','upsih':'\u03D2','upsilon':'\u03C5','Upsilon':'\u03A5','UpTee':'\u22A5','UpTeeArrow':'\u21A5','upuparrows':'\u21C8','urcorn':'\u231D','urcorner':'\u231D','urcrop':'\u230E','uring':'\u016F','Uring':'\u016E','urtri':'\u25F9','uscr':'\uD835\uDCCA','Uscr':'\uD835\uDCB0','utdot':'\u22F0','utilde':'\u0169','Utilde':'\u0168','utri':'\u25B5','utrif':'\u25B4','uuarr':'\u21C8','uuml':'\xFC','Uuml':'\xDC','uwangle':'\u29A7','vangrt':'\u299C','varepsilon':'\u03F5','varkappa':'\u03F0','varnothing':'\u2205','varphi':'\u03D5','varpi':'\u03D6','varpropto':'\u221D','varr':'\u2195','vArr':'\u21D5','varrho':'\u03F1','varsigma':'\u03C2','varsubsetneq':'\u228A\uFE00','varsubsetneqq':'\u2ACB\uFE00','varsupsetneq':'\u228B\uFE00','varsupsetneqq':'\u2ACC\uFE00','vartheta':'\u03D1','vartriangleleft':'\u22B2','vartriangleright':'\u22B3','vBar':'\u2AE8','Vbar':'\u2AEB','vBarv':'\u2AE9','vcy':'\u0432','Vcy':'\u0412','vdash':'\u22A2','vDash':'\u22A8','Vdash':'\u22A9','VDash':'\u22AB','Vdashl':'\u2AE6','vee':'\u2228','Vee':'\u22C1','veebar':'\u22BB','veeeq':'\u225A','vellip':'\u22EE','verbar':'|','Verbar':'\u2016','vert':'|','Vert':'\u2016','VerticalBar':'\u2223','VerticalLine':'|','VerticalSeparator':'\u2758','VerticalTilde':'\u2240','VeryThinSpace':'\u200A','vfr':'\uD835\uDD33','Vfr':'\uD835\uDD19','vltri':'\u22B2','vnsub':'\u2282\u20D2','vnsup':'\u2283\u20D2','vopf':'\uD835\uDD67','Vopf':'\uD835\uDD4D','vprop':'\u221D','vrtri':'\u22B3','vscr':'\uD835\uDCCB','Vscr':'\uD835\uDCB1','vsubne':'\u228A\uFE00','vsubnE':'\u2ACB\uFE00','vsupne':'\u228B\uFE00','vsupnE':'\u2ACC\uFE00','Vvdash':'\u22AA','vzigzag':'\u299A','wcirc':'\u0175','Wcirc':'\u0174','wedbar':'\u2A5F','wedge':'\u2227','Wedge':'\u22C0','wedgeq':'\u2259','weierp':'\u2118','wfr':'\uD835\uDD34','Wfr':'\uD835\uDD1A','wopf':'\uD835\uDD68','Wopf':'\uD835\uDD4E','wp':'\u2118','wr':'\u2240','wreath':'\u2240','wscr':'\uD835\uDCCC','Wscr':'\uD835\uDCB2','xcap':'\u22C2','xcirc':'\u25EF','xcup':'\u22C3','xdtri':'\u25BD','xfr':'\uD835\uDD35','Xfr':'\uD835\uDD1B','xharr':'\u27F7','xhArr':'\u27FA','xi':'\u03BE','Xi':'\u039E','xlarr':'\u27F5','xlArr':'\u27F8','xmap':'\u27FC','xnis':'\u22FB','xodot':'\u2A00','xopf':'\uD835\uDD69','Xopf':'\uD835\uDD4F','xoplus':'\u2A01','xotime':'\u2A02','xrarr':'\u27F6','xrArr':'\u27F9','xscr':'\uD835\uDCCD','Xscr':'\uD835\uDCB3','xsqcup':'\u2A06','xuplus':'\u2A04','xutri':'\u25B3','xvee':'\u22C1','xwedge':'\u22C0','yacute':'\xFD','Yacute':'\xDD','yacy':'\u044F','YAcy':'\u042F','ycirc':'\u0177','Ycirc':'\u0176','ycy':'\u044B','Ycy':'\u042B','yen':'\xA5','yfr':'\uD835\uDD36','Yfr':'\uD835\uDD1C','yicy':'\u0457','YIcy':'\u0407','yopf':'\uD835\uDD6A','Yopf':'\uD835\uDD50','yscr':'\uD835\uDCCE','Yscr':'\uD835\uDCB4','yucy':'\u044E','YUcy':'\u042E','yuml':'\xFF','Yuml':'\u0178','zacute':'\u017A','Zacute':'\u0179','zcaron':'\u017E','Zcaron':'\u017D','zcy':'\u0437','Zcy':'\u0417','zdot':'\u017C','Zdot':'\u017B','zeetrf':'\u2128','ZeroWidthSpace':'\u200B','zeta':'\u03B6','Zeta':'\u0396','zfr':'\uD835\uDD37','Zfr':'\u2128','zhcy':'\u0436','ZHcy':'\u0416','zigrarr':'\u21DD','zopf':'\uD835\uDD6B','Zopf':'\u2124','zscr':'\uD835\uDCCF','Zscr':'\uD835\uDCB5','zwj':'\u200D','zwnj':'\u200C'};
+       var decodeMapLegacy = {'aacute':'\xE1','Aacute':'\xC1','acirc':'\xE2','Acirc':'\xC2','acute':'\xB4','aelig':'\xE6','AElig':'\xC6','agrave':'\xE0','Agrave':'\xC0','amp':'&','AMP':'&','aring':'\xE5','Aring':'\xC5','atilde':'\xE3','Atilde':'\xC3','auml':'\xE4','Auml':'\xC4','brvbar':'\xA6','ccedil':'\xE7','Ccedil':'\xC7','cedil':'\xB8','cent':'\xA2','copy':'\xA9','COPY':'\xA9','curren':'\xA4','deg':'\xB0','divide':'\xF7','eacute':'\xE9','Eacute':'\xC9','ecirc':'\xEA','Ecirc':'\xCA','egrave':'\xE8','Egrave':'\xC8','eth':'\xF0','ETH':'\xD0','euml':'\xEB','Euml':'\xCB','frac12':'\xBD','frac14':'\xBC','frac34':'\xBE','gt':'>','GT':'>','iacute':'\xED','Iacute':'\xCD','icirc':'\xEE','Icirc':'\xCE','iexcl':'\xA1','igrave':'\xEC','Igrave':'\xCC','iquest':'\xBF','iuml':'\xEF','Iuml':'\xCF','laquo':'\xAB','lt':'<','LT':'<','macr':'\xAF','micro':'\xB5','middot':'\xB7','nbsp':'\xA0','not':'\xAC','ntilde':'\xF1','Ntilde':'\xD1','oacute':'\xF3','Oacute':'\xD3','ocirc':'\xF4','Ocirc':'\xD4','ograve':'\xF2','Ograve':'\xD2','ordf':'\xAA','ordm':'\xBA','oslash':'\xF8','Oslash':'\xD8','otilde':'\xF5','Otilde':'\xD5','ouml':'\xF6','Ouml':'\xD6','para':'\xB6','plusmn':'\xB1','pound':'\xA3','quot':'"','QUOT':'"','raquo':'\xBB','reg':'\xAE','REG':'\xAE','sect':'\xA7','shy':'\xAD','sup1':'\xB9','sup2':'\xB2','sup3':'\xB3','szlig':'\xDF','thorn':'\xFE','THORN':'\xDE','times':'\xD7','uacute':'\xFA','Uacute':'\xDA','ucirc':'\xFB','Ucirc':'\xDB','ugrave':'\xF9','Ugrave':'\xD9','uml':'\xA8','uuml':'\xFC','Uuml':'\xDC','yacute':'\xFD','Yacute':'\xDD','yen':'\xA5','yuml':'\xFF'};
+       var decodeMapNumeric = {'0':'\uFFFD','128':'\u20AC','130':'\u201A','131':'\u0192','132':'\u201E','133':'\u2026','134':'\u2020','135':'\u2021','136':'\u02C6','137':'\u2030','138':'\u0160','139':'\u2039','140':'\u0152','142':'\u017D','145':'\u2018','146':'\u2019','147':'\u201C','148':'\u201D','149':'\u2022','150':'\u2013','151':'\u2014','152':'\u02DC','153':'\u2122','154':'\u0161','155':'\u203A','156':'\u0153','158':'\u017E','159':'\u0178'};
+       var invalidReferenceCodePoints = [1,2,3,4,5,6,7,8,11,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,64976,64977,64978,64979,64980,64981,64982,64983,64984,64985,64986,64987,64988,64989,64990,64991,64992,64993,64994,64995,64996,64997,64998,64999,65000,65001,65002,65003,65004,65005,65006,65007,65534,65535,131070,131071,196606,196607,262142,262143,327678,327679,393214,393215,458750,458751,524286,524287,589822,589823,655358,655359,720894,720895,786430,786431,851966,851967,917502,917503,983038,983039,1048574,1048575,1114110,1114111];
+
+       /*--------------------------------------------------------------------------*/
+
+       var stringFromCharCode = String.fromCharCode;
+
+       var object = {};
+       var hasOwnProperty = object.hasOwnProperty;
+       var has = function(object, propertyName) {
+               return hasOwnProperty.call(object, propertyName);
+       };
+
+       var contains = function(array, value) {
+               var index = -1;
+               var length = array.length;
+               while (++index < length) {
+                       if (array[index] == value) {
+                               return true;
+                       }
+               }
+               return false;
+       };
+
+       var merge = function(options, defaults) {
+               if (!options) {
+                       return defaults;
+               }
+               var result = {};
+               var key;
+               for (key in defaults) {
+                       // A `hasOwnProperty` check is not needed here, since only recognized
+                       // option names are used anyway. Any others are ignored.
+                       result[key] = has(options, key) ? options[key] : defaults[key];
+               }
+               return result;
+       };
+
+       // Modified version of `ucs2encode`; see https://mths.be/punycode.
+       var codePointToSymbol = function(codePoint, strict) {
+               var output = '';
+               if ((codePoint >= 0xD800 && codePoint <= 0xDFFF) || codePoint > 0x10FFFF) {
+                       // See issue #4:
+                       // “Otherwise, if the number is in the range 0xD800 to 0xDFFF or is
+                       // greater than 0x10FFFF, then this is a parse error. Return a U+FFFD
+                       // REPLACEMENT CHARACTER.”
+                       if (strict) {
+                               parseError('character reference outside the permissible Unicode range');
+                       }
+                       return '\uFFFD';
+               }
+               if (has(decodeMapNumeric, codePoint)) {
+                       if (strict) {
+                               parseError('disallowed character reference');
+                       }
+                       return decodeMapNumeric[codePoint];
+               }
+               if (strict && contains(invalidReferenceCodePoints, codePoint)) {
+                       parseError('disallowed character reference');
+               }
+               if (codePoint > 0xFFFF) {
+                       codePoint -= 0x10000;
+                       output += stringFromCharCode(codePoint >>> 10 & 0x3FF | 0xD800);
+                       codePoint = 0xDC00 | codePoint & 0x3FF;
+               }
+               output += stringFromCharCode(codePoint);
+               return output;
+       };
+
+       var hexEscape = function(codePoint) {
+               return '&#x' + codePoint.toString(16).toUpperCase() + ';';
+       };
+
+       var decEscape = function(codePoint) {
+               return '&#' + codePoint + ';';
+       };
+
+       var parseError = function(message) {
+               throw Error('Parse error: ' + message);
+       };
+
+       /*--------------------------------------------------------------------------*/
+
+       var encode = function(string, options) {
+               options = merge(options, encode.options);
+               var strict = options.strict;
+               if (strict && regexInvalidRawCodePoint.test(string)) {
+                       parseError('forbidden code point');
+               }
+               var encodeEverything = options.encodeEverything;
+               var useNamedReferences = options.useNamedReferences;
+               var allowUnsafeSymbols = options.allowUnsafeSymbols;
+               var escapeCodePoint = options.decimal ? decEscape : hexEscape;
+
+               var escapeBmpSymbol = function(symbol) {
+                       return escapeCodePoint(symbol.charCodeAt(0));
+               };
+
+               if (encodeEverything) {
+                       // Encode ASCII symbols.
+                       string = string.replace(regexAsciiWhitelist, function(symbol) {
+                               // Use named references if requested & possible.
+                               if (useNamedReferences && has(encodeMap, symbol)) {
+                                       return '&' + encodeMap[symbol] + ';';
+                               }
+                               return escapeBmpSymbol(symbol);
+                       });
+                       // Shorten a few escapes that represent two symbols, of which at least one
+                       // is within the ASCII range.
+                       if (useNamedReferences) {
+                               string = string
+                                       .replace(/&gt;\u20D2/g, '&nvgt;')
+                                       .replace(/&lt;\u20D2/g, '&nvlt;')
+                                       .replace(/&#x66;&#x6A;/g, '&fjlig;');
+                       }
+                       // Encode non-ASCII symbols.
+                       if (useNamedReferences) {
+                               // Encode non-ASCII symbols that can be replaced with a named reference.
+                               string = string.replace(regexEncodeNonAscii, function(string) {
+                                       // Note: there is no need to check `has(encodeMap, string)` here.
+                                       return '&' + encodeMap[string] + ';';
+                               });
+                       }
+                       // Note: any remaining non-ASCII symbols are handled outside of the `if`.
+               } else if (useNamedReferences) {
+                       // Apply named character references.
+                       // Encode `<>"'&` using named character references.
+                       if (!allowUnsafeSymbols) {
+                               string = string.replace(regexEscape, function(string) {
+                                       return '&' + encodeMap[string] + ';'; // no need to check `has()` here
+                               });
+                       }
+                       // Shorten escapes that represent two symbols, of which at least one is
+                       // `<>"'&`.
+                       string = string
+                               .replace(/&gt;\u20D2/g, '&nvgt;')
+                               .replace(/&lt;\u20D2/g, '&nvlt;');
+                       // Encode non-ASCII symbols that can be replaced with a named reference.
+                       string = string.replace(regexEncodeNonAscii, function(string) {
+                               // Note: there is no need to check `has(encodeMap, string)` here.
+                               return '&' + encodeMap[string] + ';';
+                       });
+               } else if (!allowUnsafeSymbols) {
+                       // Encode `<>"'&` using hexadecimal escapes, now that they’re not handled
+                       // using named character references.
+                       string = string.replace(regexEscape, escapeBmpSymbol);
+               }
+               return string
+                       // Encode astral symbols.
+                       .replace(regexAstralSymbols, function($0) {
+                               // https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae
+                               var high = $0.charCodeAt(0);
+                               var low = $0.charCodeAt(1);
+                               var codePoint = (high - 0xD800) * 0x400 + low - 0xDC00 + 0x10000;
+                               return escapeCodePoint(codePoint);
+                       })
+                       // Encode any remaining BMP symbols that are not printable ASCII symbols
+                       // using a hexadecimal escape.
+                       .replace(regexBmpWhitelist, escapeBmpSymbol);
+       };
+       // Expose default options (so they can be overridden globally).
+       encode.options = {
+               'allowUnsafeSymbols': false,
+               'encodeEverything': false,
+               'strict': false,
+               'useNamedReferences': false,
+               'decimal' : false
+       };
+
+       var decode = function(html, options) {
+               options = merge(options, decode.options);
+               var strict = options.strict;
+               if (strict && regexInvalidEntity.test(html)) {
+                       parseError('malformed character reference');
+               }
+               return html.replace(regexDecode, function($0, $1, $2, $3, $4, $5, $6, $7) {
+                       var codePoint;
+                       var semicolon;
+                       var decDigits;
+                       var hexDigits;
+                       var reference;
+                       var next;
+                       if ($1) {
+                               // Decode decimal escapes, e.g. `&#119558;`.
+                               decDigits = $1;
+                               semicolon = $2;
+                               if (strict && !semicolon) {
+                                       parseError('character reference was not terminated by a semicolon');
+                               }
+                               codePoint = parseInt(decDigits, 10);
+                               return codePointToSymbol(codePoint, strict);
+                       }
+                       if ($3) {
+                               // Decode hexadecimal escapes, e.g. `&#x1D306;`.
+                               hexDigits = $3;
+                               semicolon = $4;
+                               if (strict && !semicolon) {
+                                       parseError('character reference was not terminated by a semicolon');
+                               }
+                               codePoint = parseInt(hexDigits, 16);
+                               return codePointToSymbol(codePoint, strict);
+                       }
+                       if ($5) {
+                               // Decode named character references with trailing `;`, e.g. `&copy;`.
+                               reference = $5;
+                               if (has(decodeMap, reference)) {
+                                       return decodeMap[reference];
+                               } else {
+                                       // Ambiguous ampersand. https://mths.be/notes/ambiguous-ampersands
+                                       if (strict) {
+                                               parseError(
+                                                       'named character reference was not terminated by a semicolon'
+                                               );
+                                       }
+                                       return $0;
+                               }
+                       }
+                       // If we’re still here, it’s a legacy reference for sure. No need for an
+                       // extra `if` check.
+                       // Decode named character references without trailing `;`, e.g. `&amp`
+                       // This is only a parse error if it gets converted to `&`, or if it is
+                       // followed by `=` in an attribute context.
+                       reference = $6;
+                       next = $7;
+                       if (next && options.isAttributeValue) {
+                               if (strict && next == '=') {
+                                       parseError('`&` did not start a character reference');
+                               }
+                               return $0;
+                       } else {
+                               if (strict) {
+                                       parseError(
+                                               'named character reference was not terminated by a semicolon'
+                                       );
+                               }
+                               // Note: there is no need to check `has(decodeMapLegacy, reference)`.
+                               return decodeMapLegacy[reference] + (next || '');
+                       }
+               });
+       };
+       // Expose default options (so they can be overridden globally).
+       decode.options = {
+               'isAttributeValue': false,
+               'strict': false
+       };
+
+       var escape = function(string) {
+               return string.replace(regexEscape, function($0) {
+                       // Note: there is no need to check `has(escapeMap, $0)` here.
+                       return escapeMap[$0];
+               });
+       };
+
+       /*--------------------------------------------------------------------------*/
+
+       var he = {
+               'version': '1.1.1',
+               'encode': encode,
+               'decode': decode,
+               'escape': escape,
+               'unescape': decode
+       };
+
+       // Some AMD build optimizers, like r.js, check for specific condition patterns
+       // like the following:
+       if (
+               typeof undefined == 'function' &&
+               typeof undefined.amd == 'object' &&
+               undefined.amd
+       ) {
+               undefined(function() {
+                       return he;
+               });
+       }       else if (freeExports && !freeExports.nodeType) {
+               if (freeModule) { // in Node.js, io.js, or RingoJS v0.8.0+
+                       freeModule.exports = he;
+               } else { // in Narwhal or RingoJS v0.7.0-
+                       for (var key in he) {
+                               has(he, key) && (freeExports[key] = he[key]);
+                       }
+               }
+       } else { // in Rhino or a web browser
+               root.he = he;
+       }
+
+}(commonjsGlobal));
+});
+
+/*  */
+
+/**
+ * Cross-platform code generation for component v-model
+ */
+function genComponentModel (
+  el,
+  value,
+  modifiers
+) {
+  var ref = modifiers || {};
+  var number = ref.number;
+  var trim = ref.trim;
+
+  var baseValueExpression = '$$v';
+  var valueExpression = baseValueExpression;
+  if (trim) {
+    valueExpression =
+      "(typeof " + baseValueExpression + " === 'string'" +
+      "? " + baseValueExpression + ".trim()" +
+      ": " + baseValueExpression + ")";
+  }
+  if (number) {
+    valueExpression = "_n(" + valueExpression + ")";
+  }
+  var assignment = genAssignmentCode(value, valueExpression);
+
+  el.model = {
+    value: ("(" + value + ")"),
+    expression: ("\"" + value + "\""),
+    callback: ("function (" + baseValueExpression + ") {" + assignment + "}")
+  };
+}
+
+/**
+ * Cross-platform codegen helper for generating v-model value assignment code.
+ */
+function genAssignmentCode (
+  value,
+  assignment
+) {
+  var res = parseModel(value);
+  if (res.key === null) {
+    return (value + "=" + assignment)
+  } else {
+    return ("$set(" + (res.exp) + ", " + (res.key) + ", " + assignment + ")")
+  }
+}
+
+/**
+ * Parse a v-model expression into a base path and a final key segment.
+ * Handles both dot-path and possible square brackets.
+ *
+ * Possible cases:
+ *
+ * - test
+ * - test[key]
+ * - test[test1[key]]
+ * - test["a"][key]
+ * - xxx.test[a[a].test1[key]]
+ * - test.xxx.a["asa"][test1[key]]
+ *
+ */
+
+var len;
+var str;
+var chr;
+var index;
+var expressionPos;
+var expressionEndPos;
+
+
+
+function parseModel (val) {
+  // Fix https://github.com/vuejs/vue/pull/7730
+  // allow v-model="obj.val " (trailing whitespace)
+  val = val.trim();
+  len = val.length;
+
+  if (val.indexOf('[') < 0 || val.lastIndexOf(']') < len - 1) {
+    index = val.lastIndexOf('.');
+    if (index > -1) {
+      return {
+        exp: val.slice(0, index),
+        key: '"' + val.slice(index + 1) + '"'
+      }
+    } else {
+      return {
+        exp: val,
+        key: null
+      }
+    }
+  }
+
+  str = val;
+  index = expressionPos = expressionEndPos = 0;
+
+  while (!eof()) {
+    chr = next();
+    /* istanbul ignore if */
+    if (isStringStart(chr)) {
+      parseString(chr);
+    } else if (chr === 0x5B) {
+      parseBracket(chr);
+    }
+  }
+
+  return {
+    exp: val.slice(0, expressionPos),
+    key: val.slice(expressionPos + 1, expressionEndPos)
+  }
+}
+
+function next () {
+  return str.charCodeAt(++index)
+}
+
+function eof () {
+  return index >= len
+}
+
+function isStringStart (chr) {
+  return chr === 0x22 || chr === 0x27
+}
+
+function parseBracket (chr) {
+  var inBracket = 1;
+  expressionPos = index;
+  while (!eof()) {
+    chr = next();
+    if (isStringStart(chr)) {
+      parseString(chr);
+      continue
+    }
+    if (chr === 0x5B) { inBracket++; }
+    if (chr === 0x5D) { inBracket--; }
+    if (inBracket === 0) {
+      expressionEndPos = index;
+      break
+    }
+  }
+}
+
+function parseString (chr) {
+  var stringQuote = chr;
+  while (!eof()) {
+    chr = next();
+    if (chr === stringQuote) {
+      break
+    }
+  }
+}
+
+/*  */
+
+var onRE = /^@|^v-on:/;
+var dirRE = /^v-|^@|^:/;
+var forAliasRE = /([^]*?)\s+(?:in|of)\s+([^]*)/;
+var forIteratorRE = /,([^,\}\]]*)(?:,([^,\}\]]*))?$/;
+var stripParensRE = /^\(|\)$/g;
+
+var argRE = /:(.*)$/;
+var bindRE = /^:|^v-bind:/;
+var modifierRE = /\.[^.]+/g;
+
+var decodeHTMLCached = cached(he.decode);
+
+// configurable state
+var warn$1;
+var delimiters;
+var transforms;
+var preTransforms;
+var postTransforms;
+var platformIsPreTag;
+var platformMustUseProp;
+var platformGetTagNamespace;
+
+
+
+function createASTElement (
+  tag,
+  attrs,
+  parent
+) {
+  return {
+    type: 1,
+    tag: tag,
+    attrsList: attrs,
+    attrsMap: makeAttrsMap(attrs),
+    parent: parent,
+    children: []
+  }
+}
+
+/**
+ * Convert HTML string to AST.
+ */
+function parse (
+  template,
+  options
+) {
+  warn$1 = options.warn || baseWarn;
+
+  platformIsPreTag = options.isPreTag || no;
+  platformMustUseProp = options.mustUseProp || no;
+  platformGetTagNamespace = options.getTagNamespace || no;
+
+  transforms = pluckModuleFunction(options.modules, 'transformNode');
+  preTransforms = pluckModuleFunction(options.modules, 'preTransformNode');
+  postTransforms = pluckModuleFunction(options.modules, 'postTransformNode');
+
+  delimiters = options.delimiters;
+
+  var stack = [];
+  var preserveWhitespace = options.preserveWhitespace !== false;
+  var root;
+  var currentParent;
+  var inVPre = false;
+  var inPre = false;
+  var warned = false;
+
+  function warnOnce (msg) {
+    if (!warned) {
+      warned = true;
+      warn$1(msg);
+    }
+  }
+
+  function closeElement (element) {
+    // check pre state
+    if (element.pre) {
+      inVPre = false;
+    }
+    if (platformIsPreTag(element.tag)) {
+      inPre = false;
+    }
+    // apply post-transforms
+    for (var i = 0; i < postTransforms.length; i++) {
+      postTransforms[i](element, options);
+    }
+  }
+
+  parseHTML(template, {
+    warn: warn$1,
+    expectHTML: options.expectHTML,
+    isUnaryTag: options.isUnaryTag,
+    canBeLeftOpenTag: options.canBeLeftOpenTag,
+    shouldDecodeNewlines: options.shouldDecodeNewlines,
+    shouldDecodeNewlinesForHref: options.shouldDecodeNewlinesForHref,
+    shouldKeepComment: options.comments,
+    start: function start (tag, attrs, unary) {
+      // check namespace.
+      // inherit parent ns if there is one
+      var ns = (currentParent && currentParent.ns) || platformGetTagNamespace(tag);
+
+      // handle IE svg bug
+      /* istanbul ignore if */
+      if (isIE && ns === 'svg') {
+        attrs = guardIESVGBug(attrs);
+      }
+
+      var element = createASTElement(tag, attrs, currentParent);
+      if (ns) {
+        element.ns = ns;
+      }
+
+      if (isForbiddenTag(element) && !isServerRendering()) {
+        element.forbidden = true;
+        "development" !== 'production' && warn$1(
+          'Templates should only be responsible for mapping the state to the ' +
+          'UI. Avoid placing tags with side-effects in your templates, such as ' +
+          "<" + tag + ">" + ', as they will not be parsed.'
+        );
+      }
+
+      // apply pre-transforms
+      for (var i = 0; i < preTransforms.length; i++) {
+        element = preTransforms[i](element, options) || element;
+      }
+
+      if (!inVPre) {
+        processPre(element);
+        if (element.pre) {
+          inVPre = true;
+        }
+      }
+      if (platformIsPreTag(element.tag)) {
+        inPre = true;
+      }
+      if (inVPre) {
+        processRawAttrs(element);
+      } else if (!element.processed) {
+        // structural directives
+        processFor(element);
+        processIf(element);
+        processOnce(element);
+        // element-scope stuff
+        processElement(element, options);
+      }
+
+      function checkRootConstraints (el) {
+        {
+          if (el.tag === 'slot' || el.tag === 'template') {
+            warnOnce(
+              "Cannot use <" + (el.tag) + "> as component root element because it may " +
+              'contain multiple nodes.'
+            );
+          }
+          if (el.attrsMap.hasOwnProperty('v-for')) {
+            warnOnce(
+              'Cannot use v-for on stateful component root element because ' +
+              'it renders multiple elements.'
+            );
+          }
+        }
+      }
+
+      // tree management
+      if (!root) {
+        root = element;
+        checkRootConstraints(root);
+      } else if (!stack.length) {
+        // allow root elements with v-if, v-else-if and v-else
+        if (root.if && (element.elseif || element.else)) {
+          checkRootConstraints(element);
+          addIfCondition(root, {
+            exp: element.elseif,
+            block: element
+          });
+        } else {
+          warnOnce(
+            "Component template should contain exactly one root element. " +
+            "If you are using v-if on multiple elements, " +
+            "use v-else-if to chain them instead."
+          );
+        }
+      }
+      if (currentParent && !element.forbidden) {
+        if (element.elseif || element.else) {
+          processIfConditions(element, currentParent);
+        } else if (element.slotScope) { // scoped slot
+          currentParent.plain = false;
+          var name = element.slotTarget || '"default"';(currentParent.scopedSlots || (currentParent.scopedSlots = {}))[name] = element;
+        } else {
+          currentParent.children.push(element);
+          element.parent = currentParent;
+        }
+      }
+      if (!unary) {
+        currentParent = element;
+        stack.push(element);
+      } else {
+        closeElement(element);
+      }
+    },
+
+    end: function end () {
+      // remove trailing whitespace
+      var element = stack[stack.length - 1];
+      var lastNode = element.children[element.children.length - 1];
+      if (lastNode && lastNode.type === 3 && lastNode.text === ' ' && !inPre) {
+        element.children.pop();
+      }
+      // pop stack
+      stack.length -= 1;
+      currentParent = stack[stack.length - 1];
+      closeElement(element);
+    },
+
+    chars: function chars (text) {
+      if (!currentParent) {
+        {
+          if (text === template) {
+            warnOnce(
+              'Component template requires a root element, rather than just text.'
+            );
+          } else if ((text = text.trim())) {
+            warnOnce(
+              ("text \"" + text + "\" outside root element will be ignored.")
+            );
+          }
+        }
+        return
+      }
+      // IE textarea placeholder bug
+      /* istanbul ignore if */
+      if (isIE &&
+        currentParent.tag === 'textarea' &&
+        currentParent.attrsMap.placeholder === text
+      ) {
+        return
+      }
+      var children = currentParent.children;
+      text = inPre || text.trim()
+        ? isTextTag(currentParent) ? text : decodeHTMLCached(text)
+        // only preserve whitespace if its not right after a starting tag
+        : preserveWhitespace && children.length ? ' ' : '';
+      if (text) {
+        var res;
+        if (!inVPre && text !== ' ' && (res = parseText(text, delimiters))) {
+          children.push({
+            type: 2,
+            expression: res.expression,
+            tokens: res.tokens,
+            text: text
+          });
+        } else if (text !== ' ' || !children.length || children[children.length - 1].text !== ' ') {
+          children.push({
+            type: 3,
+            text: text
+          });
+        }
+      }
+    },
+    comment: function comment (text) {
+      currentParent.children.push({
+        type: 3,
+        text: text,
+        isComment: true
+      });
+    }
+  });
+  return root
+}
+
+function processPre (el) {
+  if (getAndRemoveAttr(el, 'v-pre') != null) {
+    el.pre = true;
+  }
+}
+
+function processRawAttrs (el) {
+  var l = el.attrsList.length;
+  if (l) {
+    var attrs = el.attrs = new Array(l);
+    for (var i = 0; i < l; i++) {
+      attrs[i] = {
+        name: el.attrsList[i].name,
+        value: JSON.stringify(el.attrsList[i].value)
+      };
+    }
+  } else if (!el.pre) {
+    // non root node in pre blocks with no attributes
+    el.plain = true;
+  }
+}
+
+function processElement (element, options) {
+  processKey(element);
+
+  // determine whether this is a plain element after
+  // removing structural attributes
+  element.plain = !element.key && !element.attrsList.length;
+
+  processRef(element);
+  processSlot(element);
+  processComponent(element);
+  for (var i = 0; i < transforms.length; i++) {
+    element = transforms[i](element, options) || element;
+  }
+  processAttrs(element);
+}
+
+function processKey (el) {
+  var exp = getBindingAttr(el, 'key');
+  if (exp) {
+    if ("development" !== 'production' && el.tag === 'template') {
+      warn$1("<template> cannot be keyed. Place the key on real elements instead.");
+    }
+    el.key = exp;
+  }
+}
+
+function processRef (el) {
+  var ref = getBindingAttr(el, 'ref');
+  if (ref) {
+    el.ref = ref;
+    el.refInFor = checkInFor(el);
+  }
+}
+
+function processFor (el) {
+  var exp;
+  if ((exp = getAndRemoveAttr(el, 'v-for'))) {
+    var res = parseFor(exp);
+    if (res) {
+      extend(el, res);
+    } else {
+      warn$1(
+        ("Invalid v-for expression: " + exp)
+      );
+    }
+  }
+}
+
+
+
+function parseFor (exp) {
+  var inMatch = exp.match(forAliasRE);
+  if (!inMatch) { return }
+  var res = {};
+  res.for = inMatch[2].trim();
+  var alias = inMatch[1].trim().replace(stripParensRE, '');
+  var iteratorMatch = alias.match(forIteratorRE);
+  if (iteratorMatch) {
+    res.alias = alias.replace(forIteratorRE, '');
+    res.iterator1 = iteratorMatch[1].trim();
+    if (iteratorMatch[2]) {
+      res.iterator2 = iteratorMatch[2].trim();
+    }
+  } else {
+    res.alias = alias;
+  }
+  return res
+}
+
+function processIf (el) {
+  var exp = getAndRemoveAttr(el, 'v-if');
+  if (exp) {
+    el.if = exp;
+    addIfCondition(el, {
+      exp: exp,
+      block: el
+    });
+  } else {
+    if (getAndRemoveAttr(el, 'v-else') != null) {
+      el.else = true;
+    }
+    var elseif = getAndRemoveAttr(el, 'v-else-if');
+    if (elseif) {
+      el.elseif = elseif;
+    }
+  }
+}
+
+function processIfConditions (el, parent) {
+  var prev = findPrevElement(parent.children);
+  if (prev && prev.if) {
+    addIfCondition(prev, {
+      exp: el.elseif,
+      block: el
+    });
+  } else {
+    warn$1(
+      "v-" + (el.elseif ? ('else-if="' + el.elseif + '"') : 'else') + " " +
+      "used on element <" + (el.tag) + "> without corresponding v-if."
+    );
+  }
+}
+
+function findPrevElement (children) {
+  var i = children.length;
+  while (i--) {
+    if (children[i].type === 1) {
+      return children[i]
+    } else {
+      if ("development" !== 'production' && children[i].text !== ' ') {
+        warn$1(
+          "text \"" + (children[i].text.trim()) + "\" between v-if and v-else(-if) " +
+          "will be ignored."
+        );
+      }
+      children.pop();
+    }
+  }
+}
+
+function addIfCondition (el, condition) {
+  if (!el.ifConditions) {
+    el.ifConditions = [];
+  }
+  el.ifConditions.push(condition);
+}
+
+function processOnce (el) {
+  var once$$1 = getAndRemoveAttr(el, 'v-once');
+  if (once$$1 != null) {
+    el.once = true;
+  }
+}
+
+function processSlot (el) {
+  if (el.tag === 'slot') {
+    el.slotName = getBindingAttr(el, 'name');
+    if ("development" !== 'production' && el.key) {
+      warn$1(
+        "`key` does not work on <slot> because slots are abstract outlets " +
+        "and can possibly expand into multiple elements. " +
+        "Use the key on a wrapping element instead."
+      );
+    }
+  } else {
+    var slotScope;
+    if (el.tag === 'template') {
+      slotScope = getAndRemoveAttr(el, 'scope');
+      /* istanbul ignore if */
+      if ("development" !== 'production' && slotScope) {
+        warn$1(
+          "the \"scope\" attribute for scoped slots have been deprecated and " +
+          "replaced by \"slot-scope\" since 2.5. The new \"slot-scope\" attribute " +
+          "can also be used on plain elements in addition to <template> to " +
+          "denote scoped slots.",
+          true
+        );
+      }
+      el.slotScope = slotScope || getAndRemoveAttr(el, 'slot-scope');
+    } else if ((slotScope = getAndRemoveAttr(el, 'slot-scope'))) {
+      /* istanbul ignore if */
+      if ("development" !== 'production' && el.attrsMap['v-for']) {
+        warn$1(
+          "Ambiguous combined usage of slot-scope and v-for on <" + (el.tag) + "> " +
+          "(v-for takes higher priority). Use a wrapper <template> for the " +
+          "scoped slot to make it clearer.",
+          true
+        );
+      }
+      el.slotScope = slotScope;
+    }
+    var slotTarget = getBindingAttr(el, 'slot');
+    if (slotTarget) {
+      el.slotTarget = slotTarget === '""' ? '"default"' : slotTarget;
+      // preserve slot as an attribute for native shadow DOM compat
+      // only for non-scoped slots.
+      if (el.tag !== 'template' && !el.slotScope) {
+        addAttr(el, 'slot', slotTarget);
+      }
+    }
+  }
+}
+
+function processComponent (el) {
+  var binding;
+  if ((binding = getBindingAttr(el, 'is'))) {
+    el.component = binding;
+  }
+  if (getAndRemoveAttr(el, 'inline-template') != null) {
+    el.inlineTemplate = true;
+  }
+}
+
+function processAttrs (el) {
+  var list = el.attrsList;
+  var i, l, name, rawName, value, modifiers, isProp;
+  for (i = 0, l = list.length; i < l; i++) {
+    name = rawName = list[i].name;
+    value = list[i].value;
+    if (dirRE.test(name)) {
+      // mark element as dynamic
+      el.hasBindings = true;
+      // modifiers
+      modifiers = parseModifiers(name);
+      if (modifiers) {
+        name = name.replace(modifierRE, '');
+      }
+      if (bindRE.test(name)) { // v-bind
+        name = name.replace(bindRE, '');
+        value = parseFilters(value);
+        isProp = false;
+        if (modifiers) {
+          if (modifiers.prop) {
+            isProp = true;
+            name = camelize(name);
+            if (name === 'innerHtml') { name = 'innerHTML'; }
+          }
+          if (modifiers.camel) {
+            name = camelize(name);
+          }
+          if (modifiers.sync) {
+            addHandler(
+              el,
+              ("update:" + (camelize(name))),
+              genAssignmentCode(value, "$event")
+            );
+          }
+        }
+        if (isProp || (
+          !el.component && platformMustUseProp(el.tag, el.attrsMap.type, name)
+        )) {
+          addProp(el, name, value);
+        } else {
+          addAttr(el, name, value);
+        }
+      } else if (onRE.test(name)) { // v-on
+        name = name.replace(onRE, '');
+        addHandler(el, name, value, modifiers, false, warn$1);
+      } else { // normal directives
+        name = name.replace(dirRE, '');
+        // parse arg
+        var argMatch = name.match(argRE);
+        var arg = argMatch && argMatch[1];
+        if (arg) {
+          name = name.slice(0, -(arg.length + 1));
+        }
+        addDirective(el, name, rawName, value, arg, modifiers);
+        if ("development" !== 'production' && name === 'model') {
+          checkForAliasModel(el, value);
+        }
+      }
+    } else {
+      // literal attribute
+      {
+        var res = parseText(value, delimiters);
+        if (res) {
+          warn$1(
+            name + "=\"" + value + "\": " +
+            'Interpolation inside attributes has been removed. ' +
+            'Use v-bind or the colon shorthand instead. For example, ' +
+            'instead of <div id="{{ val }}">, use <div :id="val">.'
+          );
+        }
+      }
+      addAttr(el, name, JSON.stringify(value));
+      // #6887 firefox doesn't update muted state if set via attribute
+      // even immediately after element creation
+      if (!el.component &&
+          name === 'muted' &&
+          platformMustUseProp(el.tag, el.attrsMap.type, name)) {
+        addProp(el, name, 'true');
+      }
+    }
+  }
+}
+
+function checkInFor (el) {
+  var parent = el;
+  while (parent) {
+    if (parent.for !== undefined) {
+      return true
+    }
+    parent = parent.parent;
+  }
+  return false
+}
+
+function parseModifiers (name) {
+  var match = name.match(modifierRE);
+  if (match) {
+    var ret = {};
+    match.forEach(function (m) { ret[m.slice(1)] = true; });
+    return ret
+  }
+}
+
+function makeAttrsMap (attrs) {
+  var map = {};
+  for (var i = 0, l = attrs.length; i < l; i++) {
+    if (
+      "development" !== 'production' &&
+      map[attrs[i].name] && !isIE && !isEdge
+    ) {
+      warn$1('duplicate attribute: ' + attrs[i].name);
+    }
+    map[attrs[i].name] = attrs[i].value;
+  }
+  return map
+}
+
+// for script (e.g. type="x/template") or style, do not decode content
+function isTextTag (el) {
+  return el.tag === 'script' || el.tag === 'style'
+}
+
+function isForbiddenTag (el) {
+  return (
+    el.tag === 'style' ||
+    (el.tag === 'script' && (
+      !el.attrsMap.type ||
+      el.attrsMap.type === 'text/javascript'
+    ))
+  )
+}
+
+var ieNSBug = /^xmlns:NS\d+/;
+var ieNSPrefix = /^NS\d+:/;
+
+/* istanbul ignore next */
+function guardIESVGBug (attrs) {
+  var res = [];
+  for (var i = 0; i < attrs.length; i++) {
+    var attr = attrs[i];
+    if (!ieNSBug.test(attr.name)) {
+      attr.name = attr.name.replace(ieNSPrefix, '');
+      res.push(attr);
+    }
+  }
+  return res
+}
+
+function checkForAliasModel (el, value) {
+  var _el = el;
+  while (_el) {
+    if (_el.for && _el.alias === value) {
+      warn$1(
+        "<" + (el.tag) + " v-model=\"" + value + "\">: " +
+        "You are binding v-model directly to a v-for iteration alias. " +
+        "This will not be able to modify the v-for source array because " +
+        "writing to the alias is like modifying a function local variable. " +
+        "Consider using an array of objects and use v-model on an object property instead."
+      );
+    }
+    _el = _el.parent;
+  }
+}
+
+/*  */
+
+/**
+ * Expand input[v-model] with dyanmic type bindings into v-if-else chains
+ * Turn this:
+ *   <input v-model="data[type]" :type="type">
+ * into this:
+ *   <input v-if="type === 'checkbox'" type="checkbox" v-model="data[type]">
+ *   <input v-else-if="type === 'radio'" type="radio" v-model="data[type]">
+ *   <input v-else :type="type" v-model="data[type]">
+ */
+
+function preTransformNode (el, options) {
+  if (el.tag === 'input') {
+    var map = el.attrsMap;
+    if (!map['v-model']) {
+      return
+    }
+
+    var typeBinding;
+    if (map[':type'] || map['v-bind:type']) {
+      typeBinding = getBindingAttr(el, 'type');
+    }
+    if (!map.type && !typeBinding && map['v-bind']) {
+      typeBinding = "(" + (map['v-bind']) + ").type";
+    }
+
+    if (typeBinding) {
+      var ifCondition = getAndRemoveAttr(el, 'v-if', true);
+      var ifConditionExtra = ifCondition ? ("&&(" + ifCondition + ")") : "";
+      var hasElse = getAndRemoveAttr(el, 'v-else', true) != null;
+      var elseIfCondition = getAndRemoveAttr(el, 'v-else-if', true);
+      // 1. checkbox
+      var branch0 = cloneASTElement(el);
+      // process for on the main node
+      processFor(branch0);
+      addRawAttr(branch0, 'type', 'checkbox');
+      processElement(branch0, options);
+      branch0.processed = true; // prevent it from double-processed
+      branch0.if = "(" + typeBinding + ")==='checkbox'" + ifConditionExtra;
+      addIfCondition(branch0, {
+        exp: branch0.if,
+        block: branch0
+      });
+      // 2. add radio else-if condition
+      var branch1 = cloneASTElement(el);
+      getAndRemoveAttr(branch1, 'v-for', true);
+      addRawAttr(branch1, 'type', 'radio');
+      processElement(branch1, options);
+      addIfCondition(branch0, {
+        exp: "(" + typeBinding + ")==='radio'" + ifConditionExtra,
+        block: branch1
+      });
+      // 3. other
+      var branch2 = cloneASTElement(el);
+      getAndRemoveAttr(branch2, 'v-for', true);
+      addRawAttr(branch2, ':type', typeBinding);
+      processElement(branch2, options);
+      addIfCondition(branch0, {
+        exp: ifCondition,
+        block: branch2
+      });
+
+      if (hasElse) {
+        branch0.else = true;
+      } else if (elseIfCondition) {
+        branch0.elseif = elseIfCondition;
+      }
+
+      return branch0
+    }
+  }
+}
+
+function cloneASTElement (el) {
+  return createASTElement(el.tag, el.attrsList.slice(), el.parent)
+}
+
+var model = {
+  preTransformNode: preTransformNode
+}
+
+var modules = [
+  klass,
+  style,
+  model
+]
+
+/*  */
+
+var warn$2;
+
+// in some cases, the event used has to be determined at runtime
+// so we used some reserved tokens during compile.
+var RANGE_TOKEN = '__r';
+
+
+function model$1 (
+  el,
+  dir,
+  _warn
+) {
+  warn$2 = _warn;
+  var value = dir.value;
+  var modifiers = dir.modifiers;
+  var tag = el.tag;
+  var type = el.attrsMap.type;
+
+  {
+    // inputs with type="file" are read only and setting the input's
+    // value will throw an error.
+    if (tag === 'input' && type === 'file') {
+      warn$2(
+        "<" + (el.tag) + " v-model=\"" + value + "\" type=\"file\">:\n" +
+        "File inputs are read only. Use a v-on:change listener instead."
+      );
+    }
+  }
+
+  if (el.component) {
+    genComponentModel(el, value, modifiers);
+    // component v-model doesn't need extra runtime
+    return false
+  } else if (tag === 'select') {
+    genSelect(el, value, modifiers);
+  } else if (tag === 'input' && type === 'checkbox') {
+    genCheckboxModel(el, value, modifiers);
+  } else if (tag === 'input' && type === 'radio') {
+    genRadioModel(el, value, modifiers);
+  } else if (tag === 'input' || tag === 'textarea') {
+    genDefaultModel(el, value, modifiers);
+  } else if (!config.isReservedTag(tag)) {
+    genComponentModel(el, value, modifiers);
+    // component v-model doesn't need extra runtime
+    return false
+  } else {
+    warn$2(
+      "<" + (el.tag) + " v-model=\"" + value + "\">: " +
+      "v-model is not supported on this element type. " +
+      'If you are working with contenteditable, it\'s recommended to ' +
+      'wrap a library dedicated for that purpose inside a custom component.'
+    );
+  }
+
+  // ensure runtime directive metadata
+  return true
+}
+
+function genCheckboxModel (
+  el,
+  value,
+  modifiers
+) {
+  var number = modifiers && modifiers.number;
+  var valueBinding = getBindingAttr(el, 'value') || 'null';
+  var trueValueBinding = getBindingAttr(el, 'true-value') || 'true';
+  var falseValueBinding = getBindingAttr(el, 'false-value') || 'false';
+  addProp(el, 'checked',
+    "Array.isArray(" + value + ")" +
+    "?_i(" + value + "," + valueBinding + ")>-1" + (
+      trueValueBinding === 'true'
+        ? (":(" + value + ")")
+        : (":_q(" + value + "," + trueValueBinding + ")")
+    )
+  );
+  addHandler(el, 'change',
+    "var $$a=" + value + "," +
+        '$$el=$event.target,' +
+        "$$c=$$el.checked?(" + trueValueBinding + "):(" + falseValueBinding + ");" +
+    'if(Array.isArray($$a)){' +
+      "var $$v=" + (number ? '_n(' + valueBinding + ')' : valueBinding) + "," +
+          '$$i=_i($$a,$$v);' +
+      "if($$el.checked){$$i<0&&(" + (genAssignmentCode(value, '$$a.concat([$$v])')) + ")}" +
+      "else{$$i>-1&&(" + (genAssignmentCode(value, '$$a.slice(0,$$i).concat($$a.slice($$i+1))')) + ")}" +
+    "}else{" + (genAssignmentCode(value, '$$c')) + "}",
+    null, true
+  );
+}
+
+function genRadioModel (
+  el,
+  value,
+  modifiers
+) {
+  var number = modifiers && modifiers.number;
+  var valueBinding = getBindingAttr(el, 'value') || 'null';
+  valueBinding = number ? ("_n(" + valueBinding + ")") : valueBinding;
+  addProp(el, 'checked', ("_q(" + value + "," + valueBinding + ")"));
+  addHandler(el, 'change', genAssignmentCode(value, valueBinding), null, true);
+}
+
+function genSelect (
+  el,
+  value,
+  modifiers
+) {
+  var number = modifiers && modifiers.number;
+  var selectedVal = "Array.prototype.filter" +
+    ".call($event.target.options,function(o){return o.selected})" +
+    ".map(function(o){var val = \"_value\" in o ? o._value : o.value;" +
+    "return " + (number ? '_n(val)' : 'val') + "})";
+
+  var assignment = '$event.target.multiple ? $$selectedVal : $$selectedVal[0]';
+  var code = "var $$selectedVal = " + selectedVal + ";";
+  code = code + " " + (genAssignmentCode(value, assignment));
+  addHandler(el, 'change', code, null, true);
+}
+
+function genDefaultModel (
+  el,
+  value,
+  modifiers
+) {
+  var type = el.attrsMap.type;
+
+  // warn if v-bind:value conflicts with v-model
+  // except for inputs with v-bind:type
+  {
+    var value$1 = el.attrsMap['v-bind:value'] || el.attrsMap[':value'];
+    var typeBinding = el.attrsMap['v-bind:type'] || el.attrsMap[':type'];
+    if (value$1 && !typeBinding) {
+      var binding = el.attrsMap['v-bind:value'] ? 'v-bind:value' : ':value';
+      warn$2(
+        binding + "=\"" + value$1 + "\" conflicts with v-model on the same element " +
+        'because the latter already expands to a value binding internally'
+      );
+    }
+  }
+
+  var ref = modifiers || {};
+  var lazy = ref.lazy;
+  var number = ref.number;
+  var trim = ref.trim;
+  var needCompositionGuard = !lazy && type !== 'range';
+  var event = lazy
+    ? 'change'
+    : type === 'range'
+      ? RANGE_TOKEN
+      : 'input';
+
+  var valueExpression = '$event.target.value';
+  if (trim) {
+    valueExpression = "$event.target.value.trim()";
+  }
+  if (number) {
+    valueExpression = "_n(" + valueExpression + ")";
+  }
+
+  var code = genAssignmentCode(value, valueExpression);
+  if (needCompositionGuard) {
+    code = "if($event.target.composing)return;" + code;
+  }
+
+  addProp(el, 'value', ("(" + value + ")"));
+  addHandler(el, event, code, null, true);
+  if (trim || number) {
+    addHandler(el, 'blur', '$forceUpdate()');
+  }
+}
+
+/*  */
+
+function text (el, dir) {
+  if (dir.value) {
+    addProp(el, 'textContent', ("_s(" + (dir.value) + ")"));
+  }
+}
+
+/*  */
+
+function html (el, dir) {
+  if (dir.value) {
+    addProp(el, 'innerHTML', ("_s(" + (dir.value) + ")"));
+  }
+}
+
+var directives = {
+  model: model$1,
+  text: text,
+  html: html
+}
+
+/*  */
+
+var baseOptions = {
+  expectHTML: true,
+  modules: modules,
+  directives: directives,
+  isPreTag: isPreTag,
+  isUnaryTag: isUnaryTag,
+  mustUseProp: mustUseProp,
+  canBeLeftOpenTag: canBeLeftOpenTag,
+  isReservedTag: isReservedTag,
+  getTagNamespace: getTagNamespace,
+  staticKeys: genStaticKeys(modules)
+};
+
+/*  */
+
+var isStaticKey;
+var isPlatformReservedTag;
+
+var genStaticKeysCached = cached(genStaticKeys$1);
+
+/**
+ * Goal of the optimizer: walk the generated template AST tree
+ * and detect sub-trees that are purely static, i.e. parts of
+ * the DOM that never needs to change.
+ *
+ * Once we detect these sub-trees, we can:
+ *
+ * 1. Hoist them into constants, so that we no longer need to
+ *    create fresh nodes for them on each re-render;
+ * 2. Completely skip them in the patching process.
+ */
+function optimize (root, options) {
+  if (!root) { return }
+  isStaticKey = genStaticKeysCached(options.staticKeys || '');
+  isPlatformReservedTag = options.isReservedTag || no;
+  // first pass: mark all non-static nodes.
+  markStatic(root);
+  // second pass: mark static roots.
+  markStaticRoots(root, false);
+}
+
+function genStaticKeys$1 (keys) {
+  return makeMap(
+    'type,tag,attrsList,attrsMap,plain,parent,children,attrs' +
+    (keys ? ',' + keys : '')
+  )
+}
+
+function markStatic (node) {
+  node.static = isStatic(node);
+  if (node.type === 1) {
+    // do not make component slot content static. this avoids
+    // 1. components not able to mutate slot nodes
+    // 2. static slot content fails for hot-reloading
+    if (
+      !isPlatformReservedTag(node.tag) &&
+      node.tag !== 'slot' &&
+      node.attrsMap['inline-template'] == null
+    ) {
+      return
+    }
+    for (var i = 0, l = node.children.length; i < l; i++) {
+      var child = node.children[i];
+      markStatic(child);
+      if (!child.static) {
+        node.static = false;
+      }
+    }
+    if (node.ifConditions) {
+      for (var i$1 = 1, l$1 = node.ifConditions.length; i$1 < l$1; i$1++) {
+        var block = node.ifConditions[i$1].block;
+        markStatic(block);
+        if (!block.static) {
+          node.static = false;
+        }
+      }
+    }
+  }
+}
+
+function markStaticRoots (node, isInFor) {
+  if (node.type === 1) {
+    if (node.static || node.once) {
+      node.staticInFor = isInFor;
+    }
+    // For a node to qualify as a static root, it should have children that
+    // are not just static text. Otherwise the cost of hoisting out will
+    // outweigh the benefits and it's better off to just always render it fresh.
+    if (node.static && node.children.length && !(
+      node.children.length === 1 &&
+      node.children[0].type === 3
+    )) {
+      node.staticRoot = true;
+      return
+    } else {
+      node.staticRoot = false;
+    }
+    if (node.children) {
+      for (var i = 0, l = node.children.length; i < l; i++) {
+        markStaticRoots(node.children[i], isInFor || !!node.for);
+      }
+    }
+    if (node.ifConditions) {
+      for (var i$1 = 1, l$1 = node.ifConditions.length; i$1 < l$1; i$1++) {
+        markStaticRoots(node.ifConditions[i$1].block, isInFor);
+      }
+    }
+  }
+}
+
+function isStatic (node) {
+  if (node.type === 2) { // expression
+    return false
+  }
+  if (node.type === 3) { // text
+    return true
+  }
+  return !!(node.pre || (
+    !node.hasBindings && // no dynamic bindings
+    !node.if && !node.for && // not v-if or v-for or v-else
+    !isBuiltInTag(node.tag) && // not a built-in
+    isPlatformReservedTag(node.tag) && // not a component
+    !isDirectChildOfTemplateFor(node) &&
+    Object.keys(node).every(isStaticKey)
+  ))
+}
+
+function isDirectChildOfTemplateFor (node) {
+  while (node.parent) {
+    node = node.parent;
+    if (node.tag !== 'template') {
+      return false
+    }
+    if (node.for) {
+      return true
+    }
+  }
+  return false
+}
+
+/*  */
+
+var fnExpRE = /^([\w$_]+|\([^)]*?\))\s*=>|^function\s*\(/;
+var simplePathRE = /^[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*|\['[^']*?']|\["[^"]*?"]|\[\d+]|\[[A-Za-z_$][\w$]*])*$/;
+
+// KeyboardEvent.keyCode aliases
+var keyCodes = {
+  esc: 27,
+  tab: 9,
+  enter: 13,
+  space: 32,
+  up: 38,
+  left: 37,
+  right: 39,
+  down: 40,
+  'delete': [8, 46]
+};
+
+// KeyboardEvent.key aliases
+var keyNames = {
+  esc: 'Escape',
+  tab: 'Tab',
+  enter: 'Enter',
+  space: ' ',
+  // #7806: IE11 uses key names without `Arrow` prefix for arrow keys.
+  up: ['Up', 'ArrowUp'],
+  left: ['Left', 'ArrowLeft'],
+  right: ['Right', 'ArrowRight'],
+  down: ['Down', 'ArrowDown'],
+  'delete': ['Backspace', 'Delete']
+};
+
+// #4868: modifiers that prevent the execution of the listener
+// need to explicitly return null so that we can determine whether to remove
+// the listener for .once
+var genGuard = function (condition) { return ("if(" + condition + ")return null;"); };
+
+var modifierCode = {
+  stop: '$event.stopPropagation();',
+  prevent: '$event.preventDefault();',
+  self: genGuard("$event.target !== $event.currentTarget"),
+  ctrl: genGuard("!$event.ctrlKey"),
+  shift: genGuard("!$event.shiftKey"),
+  alt: genGuard("!$event.altKey"),
+  meta: genGuard("!$event.metaKey"),
+  left: genGuard("'button' in $event && $event.button !== 0"),
+  middle: genGuard("'button' in $event && $event.button !== 1"),
+  right: genGuard("'button' in $event && $event.button !== 2")
+};
+
+function genHandlers (
+  events,
+  isNative,
+  warn
+) {
+  var res = isNative ? 'nativeOn:{' : 'on:{';
+  for (var name in events) {
+    res += "\"" + name + "\":" + (genHandler(name, events[name])) + ",";
+  }
+  return res.slice(0, -1) + '}'
+}
+
+function genHandler (
+  name,
+  handler
+) {
+  if (!handler) {
+    return 'function(){}'
+  }
+
+  if (Array.isArray(handler)) {
+    return ("[" + (handler.map(function (handler) { return genHandler(name, handler); }).join(',')) + "]")
+  }
+
+  var isMethodPath = simplePathRE.test(handler.value);
+  var isFunctionExpression = fnExpRE.test(handler.value);
+
+  if (!handler.modifiers) {
+    if (isMethodPath || isFunctionExpression) {
+      return handler.value
+    }
+    /* istanbul ignore if */
+    return ("function($event){" + (handler.value) + "}") // inline statement
+  } else {
+    var code = '';
+    var genModifierCode = '';
+    var keys = [];
+    for (var key in handler.modifiers) {
+      if (modifierCode[key]) {
+        genModifierCode += modifierCode[key];
+        // left/right
+        if (keyCodes[key]) {
+          keys.push(key);
+        }
+      } else if (key === 'exact') {
+        var modifiers = (handler.modifiers);
+        genModifierCode += genGuard(
+          ['ctrl', 'shift', 'alt', 'meta']
+            .filter(function (keyModifier) { return !modifiers[keyModifier]; })
+            .map(function (keyModifier) { return ("$event." + keyModifier + "Key"); })
+            .join('||')
+        );
+      } else {
+        keys.push(key);
+      }
+    }
+    if (keys.length) {
+      code += genKeyFilter(keys);
+    }
+    // Make sure modifiers like prevent and stop get executed after key filtering
+    if (genModifierCode) {
+      code += genModifierCode;
+    }
+    var handlerCode = isMethodPath
+      ? ("return " + (handler.value) + "($event)")
+      : isFunctionExpression
+        ? ("return (" + (handler.value) + ")($event)")
+        : handler.value;
+    /* istanbul ignore if */
+    return ("function($event){" + code + handlerCode + "}")
+  }
+}
+
+function genKeyFilter (keys) {
+  return ("if(!('button' in $event)&&" + (keys.map(genFilterCode).join('&&')) + ")return null;")
+}
+
+function genFilterCode (key) {
+  var keyVal = parseInt(key, 10);
+  if (keyVal) {
+    return ("$event.keyCode!==" + keyVal)
+  }
+  var keyCode = keyCodes[key];
+  var keyName = keyNames[key];
+  return (
+    "_k($event.keyCode," +
+    (JSON.stringify(key)) + "," +
+    (JSON.stringify(keyCode)) + "," +
+    "$event.key," +
+    "" + (JSON.stringify(keyName)) +
+    ")"
+  )
+}
+
+/*  */
+
+function on (el, dir) {
+  if ("development" !== 'production' && dir.modifiers) {
+    warn("v-on without argument does not support modifiers.");
+  }
+  el.wrapListeners = function (code) { return ("_g(" + code + "," + (dir.value) + ")"); };
+}
+
+/*  */
+
+function bind$1 (el, dir) {
+  el.wrapData = function (code) {
+    return ("_b(" + code + ",'" + (el.tag) + "'," + (dir.value) + "," + (dir.modifiers && dir.modifiers.prop ? 'true' : 'false') + (dir.modifiers && dir.modifiers.sync ? ',true' : '') + ")")
+  };
+}
+
+/*  */
+
+var baseDirectives = {
+  on: on,
+  bind: bind$1,
+  cloak: noop
+}
+
+/*  */
+
+var CodegenState = function CodegenState (options) {
+  this.options = options;
+  this.warn = options.warn || baseWarn;
+  this.transforms = pluckModuleFunction(options.modules, 'transformCode');
+  this.dataGenFns = pluckModuleFunction(options.modules, 'genData');
+  this.directives = extend(extend({}, baseDirectives), options.directives);
+  var isReservedTag = options.isReservedTag || no;
+  this.maybeComponent = function (el) { return !isReservedTag(el.tag); };
+  this.onceId = 0;
+  this.staticRenderFns = [];
+};
+
+
+
+function generate (
+  ast,
+  options
+) {
+  var state = new CodegenState(options);
+  var code = ast ? genElement(ast, state) : '_c("div")';
+  return {
+    render: ("with(this){return " + code + "}"),
+    staticRenderFns: state.staticRenderFns
+  }
+}
+
+function genElement (el, state) {
+  if (el.staticRoot && !el.staticProcessed) {
+    return genStatic(el, state)
+  } else if (el.once && !el.onceProcessed) {
+    return genOnce(el, state)
+  } else if (el.for && !el.forProcessed) {
+    return genFor(el, state)
+  } else if (el.if && !el.ifProcessed) {
+    return genIf(el, state)
+  } else if (el.tag === 'template' && !el.slotTarget) {
+    return genChildren(el, state) || 'void 0'
+  } else if (el.tag === 'slot') {
+    return genSlot(el, state)
+  } else {
+    // component or element
+    var code;
+    if (el.component) {
+      code = genComponent(el.component, el, state);
+    } else {
+      var data = el.plain ? undefined : genData$2(el, state);
+
+      var children = el.inlineTemplate ? null : genChildren(el, state, true);
+      code = "_c('" + (el.tag) + "'" + (data ? ("," + data) : '') + (children ? ("," + children) : '') + ")";
+    }
+    // module transforms
+    for (var i = 0; i < state.transforms.length; i++) {
+      code = state.transforms[i](el, code);
+    }
+    return code
+  }
+}
+
+// hoist static sub-trees out
+function genStatic (el, state) {
+  el.staticProcessed = true;
+  state.staticRenderFns.push(("with(this){return " + (genElement(el, state)) + "}"));
+  return ("_m(" + (state.staticRenderFns.length - 1) + (el.staticInFor ? ',true' : '') + ")")
+}
+
+// v-once
+function genOnce (el, state) {
+  el.onceProcessed = true;
+  if (el.if && !el.ifProcessed) {
+    return genIf(el, state)
+  } else if (el.staticInFor) {
+    var key = '';
+    var parent = el.parent;
+    while (parent) {
+      if (parent.for) {
+        key = parent.key;
+        break
+      }
+      parent = parent.parent;
+    }
+    if (!key) {
+      "development" !== 'production' && state.warn(
+        "v-once can only be used inside v-for that is keyed. "
+      );
+      return genElement(el, state)
+    }
+    return ("_o(" + (genElement(el, state)) + "," + (state.onceId++) + "," + key + ")")
+  } else {
+    return genStatic(el, state)
+  }
+}
+
+function genIf (
+  el,
+  state,
+  altGen,
+  altEmpty
+) {
+  el.ifProcessed = true; // avoid recursion
+  return genIfConditions(el.ifConditions.slice(), state, altGen, altEmpty)
+}
+
+function genIfConditions (
+  conditions,
+  state,
+  altGen,
+  altEmpty
+) {
+  if (!conditions.length) {
+    return altEmpty || '_e()'
+  }
+
+  var condition = conditions.shift();
+  if (condition.exp) {
+    return ("(" + (condition.exp) + ")?" + (genTernaryExp(condition.block)) + ":" + (genIfConditions(conditions, state, altGen, altEmpty)))
+  } else {
+    return ("" + (genTernaryExp(condition.block)))
+  }
+
+  // v-if with v-once should generate code like (a)?_m(0):_m(1)
+  function genTernaryExp (el) {
+    return altGen
+      ? altGen(el, state)
+      : el.once
+        ? genOnce(el, state)
+        : genElement(el, state)
+  }
+}
+
+function genFor (
+  el,
+  state,
+  altGen,
+  altHelper
+) {
+  var exp = el.for;
+  var alias = el.alias;
+  var iterator1 = el.iterator1 ? ("," + (el.iterator1)) : '';
+  var iterator2 = el.iterator2 ? ("," + (el.iterator2)) : '';
+
+  if ("development" !== 'production' &&
+    state.maybeComponent(el) &&
+    el.tag !== 'slot' &&
+    el.tag !== 'template' &&
+    !el.key
+  ) {
+    state.warn(
+      "<" + (el.tag) + " v-for=\"" + alias + " in " + exp + "\">: component lists rendered with " +
+      "v-for should have explicit keys. " +
+      "See https://vuejs.org/guide/list.html#key for more info.",
+      true /* tip */
+    );
+  }
+
+  el.forProcessed = true; // avoid recursion
+  return (altHelper || '_l') + "((" + exp + ")," +
+    "function(" + alias + iterator1 + iterator2 + "){" +
+      "return " + ((altGen || genElement)(el, state)) +
+    '})'
+}
+
+function genData$2 (el, state) {
+  var data = '{';
+
+  // directives first.
+  // directives may mutate the el's other properties before they are generated.
+  var dirs = genDirectives(el, state);
+  if (dirs) { data += dirs + ','; }
+
+  // key
+  if (el.key) {
+    data += "key:" + (el.key) + ",";
+  }
+  // ref
+  if (el.ref) {
+    data += "ref:" + (el.ref) + ",";
+  }
+  if (el.refInFor) {
+    data += "refInFor:true,";
+  }
+  // pre
+  if (el.pre) {
+    data += "pre:true,";
+  }
+  // record original tag name for components using "is" attribute
+  if (el.component) {
+    data += "tag:\"" + (el.tag) + "\",";
+  }
+  // module data generation functions
+  for (var i = 0; i < state.dataGenFns.length; i++) {
+    data += state.dataGenFns[i](el);
+  }
+  // attributes
+  if (el.attrs) {
+    data += "attrs:{" + (genProps(el.attrs)) + "},";
+  }
+  // DOM props
+  if (el.props) {
+    data += "domProps:{" + (genProps(el.props)) + "},";
+  }
+  // event handlers
+  if (el.events) {
+    data += (genHandlers(el.events, false, state.warn)) + ",";
+  }
+  if (el.nativeEvents) {
+    data += (genHandlers(el.nativeEvents, true, state.warn)) + ",";
+  }
+  // slot target
+  // only for non-scoped slots
+  if (el.slotTarget && !el.slotScope) {
+    data += "slot:" + (el.slotTarget) + ",";
+  }
+  // scoped slots
+  if (el.scopedSlots) {
+    data += (genScopedSlots(el.scopedSlots, state)) + ",";
+  }
+  // component v-model
+  if (el.model) {
+    data += "model:{value:" + (el.model.value) + ",callback:" + (el.model.callback) + ",expression:" + (el.model.expression) + "},";
+  }
+  // inline-template
+  if (el.inlineTemplate) {
+    var inlineTemplate = genInlineTemplate(el, state);
+    if (inlineTemplate) {
+      data += inlineTemplate + ",";
+    }
+  }
+  data = data.replace(/,$/, '') + '}';
+  // v-bind data wrap
+  if (el.wrapData) {
+    data = el.wrapData(data);
+  }
+  // v-on data wrap
+  if (el.wrapListeners) {
+    data = el.wrapListeners(data);
+  }
+  return data
+}
+
+function genDirectives (el, state) {
+  var dirs = el.directives;
+  if (!dirs) { return }
+  var res = 'directives:[';
+  var hasRuntime = false;
+  var i, l, dir, needRuntime;
+  for (i = 0, l = dirs.length; i < l; i++) {
+    dir = dirs[i];
+    needRuntime = true;
+    var gen = state.directives[dir.name];
+    if (gen) {
+      // compile-time directive that manipulates AST.
+      // returns true if it also needs a runtime counterpart.
+      needRuntime = !!gen(el, dir, state.warn);
+    }
+    if (needRuntime) {
+      hasRuntime = true;
+      res += "{name:\"" + (dir.name) + "\",rawName:\"" + (dir.rawName) + "\"" + (dir.value ? (",value:(" + (dir.value) + "),expression:" + (JSON.stringify(dir.value))) : '') + (dir.arg ? (",arg:\"" + (dir.arg) + "\"") : '') + (dir.modifiers ? (",modifiers:" + (JSON.stringify(dir.modifiers))) : '') + "},";
+    }
+  }
+  if (hasRuntime) {
+    return res.slice(0, -1) + ']'
+  }
+}
+
+function genInlineTemplate (el, state) {
+  var ast = el.children[0];
+  if ("development" !== 'production' && (
+    el.children.length !== 1 || ast.type !== 1
+  )) {
+    state.warn('Inline-template components must have exactly one child element.');
+  }
+  if (ast.type === 1) {
+    var inlineRenderFns = generate(ast, state.options);
+    return ("inlineTemplate:{render:function(){" + (inlineRenderFns.render) + "},staticRenderFns:[" + (inlineRenderFns.staticRenderFns.map(function (code) { return ("function(){" + code + "}"); }).join(',')) + "]}")
+  }
+}
+
+function genScopedSlots (
+  slots,
+  state
+) {
+  return ("scopedSlots:_u([" + (Object.keys(slots).map(function (key) {
+      return genScopedSlot(key, slots[key], state)
+    }).join(',')) + "])")
+}
+
+function genScopedSlot (
+  key,
+  el,
+  state
+) {
+  if (el.for && !el.forProcessed) {
+    return genForScopedSlot(key, el, state)
+  }
+  var fn = "function(" + (String(el.slotScope)) + "){" +
+    "return " + (el.tag === 'template'
+      ? el.if
+        ? ((el.if) + "?" + (genChildren(el, state) || 'undefined') + ":undefined")
+        : genChildren(el, state) || 'undefined'
+      : genElement(el, state)) + "}";
+  return ("{key:" + key + ",fn:" + fn + "}")
+}
+
+function genForScopedSlot (
+  key,
+  el,
+  state
+) {
+  var exp = el.for;
+  var alias = el.alias;
+  var iterator1 = el.iterator1 ? ("," + (el.iterator1)) : '';
+  var iterator2 = el.iterator2 ? ("," + (el.iterator2)) : '';
+  el.forProcessed = true; // avoid recursion
+  return "_l((" + exp + ")," +
+    "function(" + alias + iterator1 + iterator2 + "){" +
+      "return " + (genScopedSlot(key, el, state)) +
+    '})'
+}
+
+function genChildren (
+  el,
+  state,
+  checkSkip,
+  altGenElement,
+  altGenNode
+) {
+  var children = el.children;
+  if (children.length) {
+    var el$1 = children[0];
+    // optimize single v-for
+    if (children.length === 1 &&
+      el$1.for &&
+      el$1.tag !== 'template' &&
+      el$1.tag !== 'slot'
+    ) {
+      return (altGenElement || genElement)(el$1, state)
+    }
+    var normalizationType = checkSkip
+      ? getNormalizationType(children, state.maybeComponent)
+      : 0;
+    var gen = altGenNode || genNode;
+    return ("[" + (children.map(function (c) { return gen(c, state); }).join(',')) + "]" + (normalizationType ? ("," + normalizationType) : ''))
+  }
+}
+
+// determine the normalization needed for the children array.
+// 0: no normalization needed
+// 1: simple normalization needed (possible 1-level deep nested array)
+// 2: full normalization needed
+function getNormalizationType (
+  children,
+  maybeComponent
+) {
+  var res = 0;
+  for (var i = 0; i < children.length; i++) {
+    var el = children[i];
+    if (el.type !== 1) {
+      continue
+    }
+    if (needsNormalization(el) ||
+        (el.ifConditions && el.ifConditions.some(function (c) { return needsNormalization(c.block); }))) {
+      res = 2;
+      break
+    }
+    if (maybeComponent(el) ||
+        (el.ifConditions && el.ifConditions.some(function (c) { return maybeComponent(c.block); }))) {
+      res = 1;
+    }
+  }
+  return res
+}
+
+function needsNormalization (el) {
+  return el.for !== undefined || el.tag === 'template' || el.tag === 'slot'
+}
+
+function genNode (node, state) {
+  if (node.type === 1) {
+    return genElement(node, state)
+  } if (node.type === 3 && node.isComment) {
+    return genComment(node)
+  } else {
+    return genText(node)
+  }
+}
+
+function genText (text) {
+  return ("_v(" + (text.type === 2
+    ? text.expression // no need for () because already wrapped in _s()
+    : transformSpecialNewlines(JSON.stringify(text.text))) + ")")
+}
+
+function genComment (comment) {
+  return ("_e(" + (JSON.stringify(comment.text)) + ")")
+}
+
+function genSlot (el, state) {
+  var slotName = el.slotName || '"default"';
+  var children = genChildren(el, state);
+  var res = "_t(" + slotName + (children ? ("," + children) : '');
+  var attrs = el.attrs && ("{" + (el.attrs.map(function (a) { return ((camelize(a.name)) + ":" + (a.value)); }).join(',')) + "}");
+  var bind$$1 = el.attrsMap['v-bind'];
+  if ((attrs || bind$$1) && !children) {
+    res += ",null";
+  }
+  if (attrs) {
+    res += "," + attrs;
+  }
+  if (bind$$1) {
+    res += (attrs ? '' : ',null') + "," + bind$$1;
+  }
+  return res + ')'
+}
+
+// componentName is el.component, take it as argument to shun flow's pessimistic refinement
+function genComponent (
+  componentName,
+  el,
+  state
+) {
+  var children = el.inlineTemplate ? null : genChildren(el, state, true);
+  return ("_c(" + componentName + "," + (genData$2(el, state)) + (children ? ("," + children) : '') + ")")
+}
+
+function genProps (props) {
+  var res = '';
+  for (var i = 0; i < props.length; i++) {
+    var prop = props[i];
+    /* istanbul ignore if */
+    {
+      res += "\"" + (prop.name) + "\":" + (transformSpecialNewlines(prop.value)) + ",";
+    }
+  }
+  return res.slice(0, -1)
+}
+
+// #3895, #4268
+function transformSpecialNewlines (text) {
+  return text
+    .replace(/\u2028/g, '\\u2028')
+    .replace(/\u2029/g, '\\u2029')
+}
+
+/*  */
+
+// these keywords should not appear inside expressions, but operators like
+// typeof, instanceof and in are allowed
+var prohibitedKeywordRE = new RegExp('\\b' + (
+  'do,if,for,let,new,try,var,case,else,with,await,break,catch,class,const,' +
+  'super,throw,while,yield,delete,export,import,return,switch,default,' +
+  'extends,finally,continue,debugger,function,arguments'
+).split(',').join('\\b|\\b') + '\\b');
+
+// these unary operators should not be used as property/method names
+var unaryOperatorsRE = new RegExp('\\b' + (
+  'delete,typeof,void'
+).split(',').join('\\s*\\([^\\)]*\\)|\\b') + '\\s*\\([^\\)]*\\)');
+
+// strip strings in expressions
+var stripStringRE = /'(?:[^'\\]|\\.)*'|"(?:[^"\\]|\\.)*"|`(?:[^`\\]|\\.)*\$\{|\}(?:[^`\\]|\\.)*`|`(?:[^`\\]|\\.)*`/g;
+
+// detect problematic expressions in a template
+function detectErrors (ast) {
+  var errors = [];
+  if (ast) {
+    checkNode(ast, errors);
+  }
+  return errors
+}
+
+function checkNode (node, errors) {
+  if (node.type === 1) {
+    for (var name in node.attrsMap) {
+      if (dirRE.test(name)) {
+        var value = node.attrsMap[name];
+        if (value) {
+          if (name === 'v-for') {
+            checkFor(node, ("v-for=\"" + value + "\""), errors);
+          } else if (onRE.test(name)) {
+            checkEvent(value, (name + "=\"" + value + "\""), errors);
+          } else {
+            checkExpression(value, (name + "=\"" + value + "\""), errors);
+          }
+        }
+      }
+    }
+    if (node.children) {
+      for (var i = 0; i < node.children.length; i++) {
+        checkNode(node.children[i], errors);
+      }
+    }
+  } else if (node.type === 2) {
+    checkExpression(node.expression, node.text, errors);
+  }
+}
+
+function checkEvent (exp, text, errors) {
+  var stipped = exp.replace(stripStringRE, '');
+  var keywordMatch = stipped.match(unaryOperatorsRE);
+  if (keywordMatch && stipped.charAt(keywordMatch.index - 1) !== '$') {
+    errors.push(
+      "avoid using JavaScript unary operator as property name: " +
+      "\"" + (keywordMatch[0]) + "\" in expression " + (text.trim())
+    );
+  }
+  checkExpression(exp, text, errors);
+}
+
+function checkFor (node, text, errors) {
+  checkExpression(node.for || '', text, errors);
+  checkIdentifier(node.alias, 'v-for alias', text, errors);
+  checkIdentifier(node.iterator1, 'v-for iterator', text, errors);
+  checkIdentifier(node.iterator2, 'v-for iterator', text, errors);
+}
+
+function checkIdentifier (
+  ident,
+  type,
+  text,
+  errors
+) {
+  if (typeof ident === 'string') {
+    try {
+      new Function(("var " + ident + "=_"));
+    } catch (e) {
+      errors.push(("invalid " + type + " \"" + ident + "\" in expression: " + (text.trim())));
+    }
+  }
+}
+
+function checkExpression (exp, text, errors) {
+  try {
+    new Function(("return " + exp));
+  } catch (e) {
+    var keywordMatch = exp.replace(stripStringRE, '').match(prohibitedKeywordRE);
+    if (keywordMatch) {
+      errors.push(
+        "avoid using JavaScript keyword as property name: " +
+        "\"" + (keywordMatch[0]) + "\"\n  Raw expression: " + (text.trim())
+      );
+    } else {
+      errors.push(
+        "invalid expression: " + (e.message) + " in\n\n" +
+        "    " + exp + "\n\n" +
+        "  Raw expression: " + (text.trim()) + "\n"
+      );
+    }
+  }
+}
+
+/*  */
+
+function createFunction (code, errors) {
+  try {
+    return new Function(code)
+  } catch (err) {
+    errors.push({ err: err, code: code });
+    return noop
+  }
+}
+
+function createCompileToFunctionFn (compile) {
+  var cache = Object.create(null);
+
+  return function compileToFunctions (
+    template,
+    options,
+    vm
+  ) {
+    options = extend({}, options);
+    var warn$$1 = options.warn || warn;
+    delete options.warn;
+
+    /* istanbul ignore if */
+    {
+      // detect possible CSP restriction
+      try {
+        new Function('return 1');
+      } catch (e) {
+        if (e.toString().match(/unsafe-eval|CSP/)) {
+          warn$$1(
+            'It seems you are using the standalone build of Vue.js in an ' +
+            'environment with Content Security Policy that prohibits unsafe-eval. ' +
+            'The template compiler cannot work in this environment. Consider ' +
+            'relaxing the policy to allow unsafe-eval or pre-compiling your ' +
+            'templates into render functions.'
+          );
+        }
+      }
+    }
+
+    // check cache
+    var key = options.delimiters
+      ? String(options.delimiters) + template
+      : template;
+    if (cache[key]) {
+      return cache[key]
+    }
+
+    // compile
+    var compiled = compile(template, options);
+
+    // check compilation errors/tips
+    {
+      if (compiled.errors && compiled.errors.length) {
+        warn$$1(
+          "Error compiling template:\n\n" + template + "\n\n" +
+          compiled.errors.map(function (e) { return ("- " + e); }).join('\n') + '\n',
+          vm
+        );
+      }
+      if (compiled.tips && compiled.tips.length) {
+        compiled.tips.forEach(function (msg) { return tip(msg, vm); });
+      }
+    }
+
+    // turn code into functions
+    var res = {};
+    var fnGenErrors = [];
+    res.render = createFunction(compiled.render, fnGenErrors);
+    res.staticRenderFns = compiled.staticRenderFns.map(function (code) {
+      return createFunction(code, fnGenErrors)
+    });
+
+    // check function generation errors.
+    // this should only happen if there is a bug in the compiler itself.
+    // mostly for codegen development use
+    /* istanbul ignore if */
+    {
+      if ((!compiled.errors || !compiled.errors.length) && fnGenErrors.length) {
+        warn$$1(
+          "Failed to generate render function:\n\n" +
+          fnGenErrors.map(function (ref) {
+            var err = ref.err;
+            var code = ref.code;
+
+            return ((err.toString()) + " in\n\n" + code + "\n");
+        }).join('\n'),
+          vm
+        );
+      }
+    }
+
+    return (cache[key] = res)
+  }
+}
+
+/*  */
+
+function createCompilerCreator (baseCompile) {
+  return function createCompiler (baseOptions) {
+    function compile (
+      template,
+      options
+    ) {
+      var finalOptions = Object.create(baseOptions);
+      var errors = [];
+      var tips = [];
+      finalOptions.warn = function (msg, tip) {
+        (tip ? tips : errors).push(msg);
+      };
+
+      if (options) {
+        // merge custom modules
+        if (options.modules) {
+          finalOptions.modules =
+            (baseOptions.modules || []).concat(options.modules);
+        }
+        // merge custom directives
+        if (options.directives) {
+          finalOptions.directives = extend(
+            Object.create(baseOptions.directives || null),
+            options.directives
+          );
+        }
+        // copy other options
+        for (var key in options) {
+          if (key !== 'modules' && key !== 'directives') {
+            finalOptions[key] = options[key];
+          }
+        }
+      }
+
+      var compiled = baseCompile(template, finalOptions);
+      {
+        errors.push.apply(errors, detectErrors(compiled.ast));
+      }
+      compiled.errors = errors;
+      compiled.tips = tips;
+      return compiled
+    }
+
+    return {
+      compile: compile,
+      compileToFunctions: createCompileToFunctionFn(compile)
+    }
+  }
+}
+
+/*  */
+
+// `createCompilerCreator` allows creating compilers that use alternative
+// parser/optimizer/codegen, e.g the SSR optimizing compiler.
+// Here we just export a default compiler using the default parts.
+var createCompiler = createCompilerCreator(function baseCompile (
+  template,
+  options
+) {
+  var ast = parse(template.trim(), options);
+  if (options.optimize !== false) {
+    optimize(ast, options);
+  }
+  var code = generate(ast, options);
+  return {
+    ast: ast,
+    render: code.render,
+    staticRenderFns: code.staticRenderFns
+  }
+});
+
+/*  */
+
+var ref = createCompiler(baseOptions);
+var compile = ref.compile;
+var compileToFunctions = ref.compileToFunctions;
+
+/*  */
+
+var isAttr = makeMap(
+  'accept,accept-charset,accesskey,action,align,alt,async,autocomplete,' +
+  'autofocus,autoplay,autosave,bgcolor,border,buffered,challenge,charset,' +
+  'checked,cite,class,code,codebase,color,cols,colspan,content,http-equiv,' +
+  'name,contenteditable,contextmenu,controls,coords,data,datetime,default,' +
+  'defer,dir,dirname,disabled,download,draggable,dropzone,enctype,method,for,' +
+  'form,formaction,headers,height,hidden,high,href,hreflang,http-equiv,' +
+  'icon,id,ismap,itemprop,keytype,kind,label,lang,language,list,loop,low,' +
+  'manifest,max,maxlength,media,method,GET,POST,min,multiple,email,file,' +
+  'muted,name,novalidate,open,optimum,pattern,ping,placeholder,poster,' +
+  'preload,radiogroup,readonly,rel,required,reversed,rows,rowspan,sandbox,' +
+  'scope,scoped,seamless,selected,shape,size,type,text,password,sizes,span,' +
+  'spellcheck,src,srcdoc,srclang,srcset,start,step,style,summary,tabindex,' +
+  'target,title,type,usemap,value,width,wrap'
+);
+
+/* istanbul ignore next */
+var isRenderableAttr = function (name) {
+  return (
+    isAttr(name) ||
+    name.indexOf('data-') === 0 ||
+    name.indexOf('aria-') === 0
+  )
+};
+var propsToAttrMap = {
+  acceptCharset: 'accept-charset',
+  className: 'class',
+  htmlFor: 'for',
+  httpEquiv: 'http-equiv'
+};
+
+var ESC = {
+  '<': '&lt;',
+  '>': '&gt;',
+  '"': '&quot;',
+  '&': '&amp;'
+};
+
+function escape (s) {
+  return s.replace(/[<>"&]/g, escapeChar)
+}
+
+function escapeChar (a) {
+  return ESC[a] || a
+}
+
+/*  */
+
+var plainStringRE = /^"(?:[^"\\]|\\.)*"$|^'(?:[^'\\]|\\.)*'$/;
+
+// let the model AST transform translate v-model into appropriate
+// props bindings
+function applyModelTransform (el, state) {
+  if (el.directives) {
+    for (var i = 0; i < el.directives.length; i++) {
+      var dir = el.directives[i];
+      if (dir.name === 'model') {
+        state.directives.model(el, dir, state.warn);
+        // remove value for textarea as its converted to text
+        if (el.tag === 'textarea' && el.props) {
+          el.props = el.props.filter(function (p) { return p.name !== 'value'; });
+        }
+        break
+      }
+    }
+  }
+}
+
+function genAttrSegments (
+  attrs
+) {
+  return attrs.map(function (ref) {
+    var name = ref.name;
+    var value = ref.value;
+
+    return genAttrSegment(name, value);
+  })
+}
+
+function genDOMPropSegments (
+  props,
+  attrs
+) {
+  var segments = [];
+  props.forEach(function (ref) {
+    var name = ref.name;
+    var value = ref.value;
+
+    name = propsToAttrMap[name] || name.toLowerCase();
+    if (isRenderableAttr(name) &&
+      !(attrs && attrs.some(function (a) { return a.name === name; }))
+    ) {
+      segments.push(genAttrSegment(name, value));
+    }
+  });
+  return segments
+}
+
+function genAttrSegment (name, value) {
+  if (plainStringRE.test(value)) {
+    // force double quote
+    value = value.replace(/^'|'$/g, '"');
+    // force enumerated attr to "true"
+    if (isEnumeratedAttr(name) && value !== "\"false\"") {
+      value = "\"true\"";
+    }
+    return {
+      type: RAW,
+      value: isBooleanAttr(name)
+        ? (" " + name + "=\"" + name + "\"")
+        : value === '""'
+          ? (" " + name)
+          : (" " + name + "=\"" + (JSON.parse(value)) + "\"")
+    }
+  } else {
+    return {
+      type: EXPRESSION,
+      value: ("_ssrAttr(" + (JSON.stringify(name)) + "," + value + ")")
+    }
+  }
+}
+
+function genClassSegments (
+  staticClass,
+  classBinding
+) {
+  if (staticClass && !classBinding) {
+    return [{ type: RAW, value: (" class=" + staticClass) }]
+  } else {
+    return [{
+      type: EXPRESSION,
+      value: ("_ssrClass(" + (staticClass || 'null') + "," + (classBinding || 'null') + ")")
+    }]
+  }
+}
+
+function genStyleSegments (
+  staticStyle,
+  parsedStaticStyle,
+  styleBinding,
+  vShowExpression
+) {
+  if (staticStyle && !styleBinding && !vShowExpression) {
+    return [{ type: RAW, value: (" style=" + (JSON.stringify(staticStyle))) }]
+  } else {
+    return [{
+      type: EXPRESSION,
+      value: ("_ssrStyle(" + (parsedStaticStyle || 'null') + "," + (styleBinding || 'null') + ", " + (vShowExpression
+          ? ("{ display: (" + vShowExpression + ") ? '' : 'none' }")
+          : 'null') + ")")
+    }]
+  }
+}
+
+/*  */
+
+/**
+ * In SSR, the vdom tree is generated only once and never patched, so
+ * we can optimize most element / trees into plain string render functions.
+ * The SSR optimizer walks the AST tree to detect optimizable elements and trees.
+ *
+ * The criteria for SSR optimizability is quite a bit looser than static tree
+ * detection (which is designed for client re-render). In SSR we bail only for
+ * components/slots/custom directives.
+ */
+
+// optimizability constants
+var optimizability = {
+  FALSE: 0,    // whole sub tree un-optimizable
+  FULL: 1,     // whole sub tree optimizable
+  SELF: 2,     // self optimizable but has some un-optimizable children
+  CHILDREN: 3, // self un-optimizable but have fully optimizable children
+  PARTIAL: 4   // self un-optimizable with some un-optimizable children
+};
+
+var isPlatformReservedTag$1;
+
+function optimize$1 (root, options) {
+  if (!root) { return }
+  isPlatformReservedTag$1 = options.isReservedTag || no;
+  walk(root, true);
+}
+
+function walk (node, isRoot) {
+  if (isUnOptimizableTree(node)) {
+    node.ssrOptimizability = optimizability.FALSE;
+    return
+  }
+  // root node or nodes with custom directives should always be a VNode
+  var selfUnoptimizable = isRoot || hasCustomDirective(node);
+  var check = function (child) {
+    if (child.ssrOptimizability !== optimizability.FULL) {
+      node.ssrOptimizability = selfUnoptimizable
+        ? optimizability.PARTIAL
+        : optimizability.SELF;
+    }
+  };
+  if (selfUnoptimizable) {
+    node.ssrOptimizability = optimizability.CHILDREN;
+  }
+  if (node.type === 1) {
+    for (var i = 0, l = node.children.length; i < l; i++) {
+      var child = node.children[i];
+      walk(child);
+      check(child);
+    }
+    if (node.ifConditions) {
+      for (var i$1 = 1, l$1 = node.ifConditions.length; i$1 < l$1; i$1++) {
+        var block = node.ifConditions[i$1].block;
+        walk(block, isRoot);
+        check(block);
+      }
+    }
+    if (node.ssrOptimizability == null ||
+      (!isRoot && (node.attrsMap['v-html'] || node.attrsMap['v-text']))
+    ) {
+      node.ssrOptimizability = optimizability.FULL;
+    } else {
+      node.children = optimizeSiblings(node);
+    }
+  } else {
+    node.ssrOptimizability = optimizability.FULL;
+  }
+}
+
+function optimizeSiblings (el) {
+  var children = el.children;
+  var optimizedChildren = [];
+
+  var currentOptimizableGroup = [];
+  var pushGroup = function () {
+    if (currentOptimizableGroup.length) {
+      optimizedChildren.push({
+        type: 1,
+        parent: el,
+        tag: 'template',
+        attrsList: [],
+        attrsMap: {},
+        children: currentOptimizableGroup,
+        ssrOptimizability: optimizability.FULL
+      });
+    }
+    currentOptimizableGroup = [];
+  };
+
+  for (var i = 0; i < children.length; i++) {
+    var c = children[i];
+    if (c.ssrOptimizability === optimizability.FULL) {
+      currentOptimizableGroup.push(c);
+    } else {
+      // wrap fully-optimizable adjacent siblings inside a template tag
+      // so that they can be optimized into a single ssrNode by codegen
+      pushGroup();
+      optimizedChildren.push(c);
+    }
+  }
+  pushGroup();
+  return optimizedChildren
+}
+
+function isUnOptimizableTree (node) {
+  if (node.type === 2 || node.type === 3) { // text or expression
+    return false
+  }
+  return (
+    isBuiltInTag(node.tag) || // built-in (slot, component)
+    !isPlatformReservedTag$1(node.tag) || // custom component
+    !!node.component || // "is" component
+    isSelectWithModel(node) // <select v-model> requires runtime inspection
+  )
+}
+
+var isBuiltInDir = makeMap('text,html,show,on,bind,model,pre,cloak,once');
+
+function hasCustomDirective (node) {
+  return (
+    node.type === 1 &&
+    node.directives &&
+    node.directives.some(function (d) { return !isBuiltInDir(d.name); })
+  )
+}
+
+// <select v-model> cannot be optimized because it requires a runtime check
+// to determine proper selected option
+function isSelectWithModel (node) {
+  return (
+    node.type === 1 &&
+    node.tag === 'select' &&
+    node.directives != null &&
+    node.directives.some(function (d) { return d.name === 'model'; })
+  )
+}
+
+/*  */
+
+// The SSR codegen is essentially extending the default codegen to handle
+// SSR-optimizable nodes and turn them into string render fns. In cases where
+// a node is not optimizable it simply falls back to the default codegen.
+
+// segment types
+var RAW = 0;
+var INTERPOLATION = 1;
+var EXPRESSION = 2;
+
+function generate$1 (
+  ast,
+  options
+) {
+  var state = new CodegenState(options);
+  var code = ast ? genSSRElement(ast, state) : '_c("div")';
+  return {
+    render: ("with(this){return " + code + "}"),
+    staticRenderFns: state.staticRenderFns
+  }
+}
+
+function genSSRElement (el, state) {
+  if (el.for && !el.forProcessed) {
+    return genFor(el, state, genSSRElement)
+  } else if (el.if && !el.ifProcessed) {
+    return genIf(el, state, genSSRElement)
+  } else if (el.tag === 'template' && !el.slotTarget) {
+    return el.ssrOptimizability === optimizability.FULL
+      ? genChildrenAsStringNode(el, state)
+      : genSSRChildren(el, state) || 'void 0'
+  }
+
+  switch (el.ssrOptimizability) {
+    case optimizability.FULL:
+      // stringify whole tree
+      return genStringElement(el, state)
+    case optimizability.SELF:
+      // stringify self and check children
+      return genStringElementWithChildren(el, state)
+    case optimizability.CHILDREN:
+      // generate self as VNode and stringify children
+      return genNormalElement(el, state, true)
+    case optimizability.PARTIAL:
+      // generate self as VNode and check children
+      return genNormalElement(el, state, false)
+    default:
+      // bail whole tree
+      return genElement(el, state)
+  }
+}
+
+function genNormalElement (el, state, stringifyChildren) {
+  var data = el.plain ? undefined : genData$2(el, state);
+  var children = stringifyChildren
+    ? ("[" + (genChildrenAsStringNode(el, state)) + "]")
+    : genSSRChildren(el, state, true);
+  return ("_c('" + (el.tag) + "'" + (data ? ("," + data) : '') + (children ? ("," + children) : '') + ")")
+}
+
+function genSSRChildren (el, state, checkSkip) {
+  return genChildren(el, state, checkSkip, genSSRElement, genSSRNode)
+}
+
+function genSSRNode (el, state) {
+  return el.type === 1
+    ? genSSRElement(el, state)
+    : genText(el)
+}
+
+function genChildrenAsStringNode (el, state) {
+  return el.children.length
+    ? ("_ssrNode(" + (flattenSegments(childrenToSegments(el, state))) + ")")
+    : ''
+}
+
+function genStringElement (el, state) {
+  return ("_ssrNode(" + (elementToString(el, state)) + ")")
+}
+
+function genStringElementWithChildren (el, state) {
+  var children = genSSRChildren(el, state, true);
+  return ("_ssrNode(" + (flattenSegments(elementToOpenTagSegments(el, state))) + ",\"</" + (el.tag) + ">\"" + (children ? ("," + children) : '') + ")")
+}
+
+function elementToString (el, state) {
+  return ("(" + (flattenSegments(elementToSegments(el, state))) + ")")
+}
+
+function elementToSegments (el, state) {
+  // v-for / v-if
+  if (el.for && !el.forProcessed) {
+    el.forProcessed = true;
+    return [{
+      type: EXPRESSION,
+      value: genFor(el, state, elementToString, '_ssrList')
+    }]
+  } else if (el.if && !el.ifProcessed) {
+    el.ifProcessed = true;
+    return [{
+      type: EXPRESSION,
+      value: genIf(el, state, elementToString, '"<!---->"')
+    }]
+  } else if (el.tag === 'template') {
+    return childrenToSegments(el, state)
+  }
+
+  var openSegments = elementToOpenTagSegments(el, state);
+  var childrenSegments = childrenToSegments(el, state);
+  var ref = state.options;
+  var isUnaryTag = ref.isUnaryTag;
+  var close = (isUnaryTag && isUnaryTag(el.tag))
+    ? []
+    : [{ type: RAW, value: ("</" + (el.tag) + ">") }];
+  return openSegments.concat(childrenSegments, close)
+}
+
+function elementToOpenTagSegments (el, state) {
+  applyModelTransform(el, state);
+  var binding;
+  var segments = [{ type: RAW, value: ("<" + (el.tag)) }];
+  // attrs
+  if (el.attrs) {
+    segments.push.apply(segments, genAttrSegments(el.attrs));
+  }
+  // domProps
+  if (el.props) {
+    segments.push.apply(segments, genDOMPropSegments(el.props, el.attrs));
+  }
+  // v-bind="object"
+  if ((binding = el.attrsMap['v-bind'])) {
+    segments.push({ type: EXPRESSION, value: ("_ssrAttrs(" + binding + ")") });
+  }
+  // v-bind.prop="object"
+  if ((binding = el.attrsMap['v-bind.prop'])) {
+    segments.push({ type: EXPRESSION, value: ("_ssrDOMProps(" + binding + ")") });
+  }
+  // class
+  if (el.staticClass || el.classBinding) {
+    segments.push.apply(
+      segments,
+      genClassSegments(el.staticClass, el.classBinding)
+    );
+  }
+  // style & v-show
+  if (el.staticStyle || el.styleBinding || el.attrsMap['v-show']) {
+    segments.push.apply(
+      segments,
+      genStyleSegments(
+        el.attrsMap.style,
+        el.staticStyle,
+        el.styleBinding,
+        el.attrsMap['v-show']
+      )
+    );
+  }
+  // _scopedId
+  if (state.options.scopeId) {
+    segments.push({ type: RAW, value: (" " + (state.options.scopeId)) });
+  }
+  segments.push({ type: RAW, value: ">" });
+  return segments
+}
+
+function childrenToSegments (el, state) {
+  var binding;
+  if ((binding = el.attrsMap['v-html'])) {
+    return [{ type: EXPRESSION, value: ("_s(" + binding + ")") }]
+  }
+  if ((binding = el.attrsMap['v-text'])) {
+    return [{ type: INTERPOLATION, value: ("_s(" + binding + ")") }]
+  }
+  if (el.tag === 'textarea' && (binding = el.attrsMap['v-model'])) {
+    return [{ type: INTERPOLATION, value: ("_s(" + binding + ")") }]
+  }
+  return el.children
+    ? nodesToSegments(el.children, state)
+    : []
+}
+
+function nodesToSegments (
+  children,
+  state
+) {
+  var segments = [];
+  for (var i = 0; i < children.length; i++) {
+    var c = children[i];
+    if (c.type === 1) {
+      segments.push.apply(segments, elementToSegments(c, state));
+    } else if (c.type === 2) {
+      segments.push({ type: INTERPOLATION, value: c.expression });
+    } else if (c.type === 3) {
+      segments.push({ type: RAW, value: escape(c.text) });
+    }
+  }
+  return segments
+}
+
+function flattenSegments (segments) {
+  var mergedSegments = [];
+  var textBuffer = '';
+
+  var pushBuffer = function () {
+    if (textBuffer) {
+      mergedSegments.push(JSON.stringify(textBuffer));
+      textBuffer = '';
+    }
+  };
+
+  for (var i = 0; i < segments.length; i++) {
+    var s = segments[i];
+    if (s.type === RAW) {
+      textBuffer += s.value;
+    } else if (s.type === INTERPOLATION) {
+      pushBuffer();
+      mergedSegments.push(("_ssrEscape(" + (s.value) + ")"));
+    } else if (s.type === EXPRESSION) {
+      pushBuffer();
+      mergedSegments.push(("(" + (s.value) + ")"));
+    }
+  }
+  pushBuffer();
+
+  return mergedSegments.join('+')
+}
+
+/*  */
+
+var createCompiler$1 = createCompilerCreator(function baseCompile (
+  template,
+  options
+) {
+  var ast = parse(template.trim(), options);
+  optimize$1(ast, options);
+  var code = generate$1(ast, options);
+  return {
+    ast: ast,
+    render: code.render,
+    staticRenderFns: code.staticRenderFns
+  }
+});
+
+/*  */
+
+var ref$1 = createCompiler$1(baseOptions);
+var compile$1 = ref$1.compile;
+var compileToFunctions$1 = ref$1.compileToFunctions;
+
+/*  */
+
+exports.parseComponent = parseComponent;
+exports.compile = compile;
+exports.compileToFunctions = compileToFunctions;
+exports.ssrCompile = compile$1;
+exports.ssrCompileToFunctions = compileToFunctions$1;
+
+Object.defineProperty(exports, '__esModule', { value: true });
+
+})));
diff --git a/advancedcontentfilter/vendor/asset/vue/packages/vue-template-compiler/index.js b/advancedcontentfilter/vendor/asset/vue/packages/vue-template-compiler/index.js
new file mode 100644 (file)
index 0000000..287d281
--- /dev/null
@@ -0,0 +1,18 @@
+try {
+  var vueVersion = require('vue').version
+} catch (e) {}
+
+var packageName = require('./package.json').name
+var packageVersion = require('./package.json').version
+if (vueVersion && vueVersion !== packageVersion) {
+  throw new Error(
+    '\n\nVue packages version mismatch:\n\n' +
+    '- vue@' + vueVersion + '\n' +
+    '- ' + packageName + '@' + packageVersion + '\n\n' +
+    'This may cause things to work incorrectly. Make sure to use the same version for both.\n' +
+    'If you are using vue-loader@>=10.0, simply update vue-template-compiler.\n' +
+    'If you are using vue-loader@<10.0 or vueify, re-installing vue-loader/vueify should bump ' + packageName + ' to the latest.\n'
+  )
+}
+
+module.exports = require('./build')
diff --git a/advancedcontentfilter/vendor/asset/vue/packages/vue-template-compiler/package.json b/advancedcontentfilter/vendor/asset/vue/packages/vue-template-compiler/package.json
new file mode 100644 (file)
index 0000000..93e5c52
--- /dev/null
@@ -0,0 +1,27 @@
+{
+  "name": "vue-template-compiler",
+  "version": "2.5.16",
+  "description": "template compiler for Vue 2.0",
+  "main": "index.js",
+  "unpkg": "browser.js",
+  "jsdelivr": "browser.js",
+  "browser": "browser.js",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/vuejs/vue.git"
+  },
+  "keywords": [
+    "vue",
+    "compiler"
+  ],
+  "author": "Evan You",
+  "license": "MIT",
+  "bugs": {
+    "url": "https://github.com/vuejs/vue/issues"
+  },
+  "homepage": "https://github.com/vuejs/vue/tree/dev/packages/vue-template-compiler#readme",
+  "dependencies": {
+    "he": "^1.1.0",
+    "de-indent": "^1.0.2"
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/packages/weex-template-compiler/README.md b/advancedcontentfilter/vendor/asset/vue/packages/weex-template-compiler/README.md
new file mode 100644 (file)
index 0000000..6ebca96
--- /dev/null
@@ -0,0 +1,3 @@
+# weex-template-compiler
+
+> This package is auto-generated. For pull requests please see [src/platforms/weex/entry-compiler.js](https://github.com/vuejs/vue/tree/dev/src/platforms/weex/entry-compiler.js).
diff --git a/advancedcontentfilter/vendor/asset/vue/packages/weex-template-compiler/build.js b/advancedcontentfilter/vendor/asset/vue/packages/weex-template-compiler/build.js
new file mode 100644 (file)
index 0000000..d6951d5
--- /dev/null
@@ -0,0 +1,4403 @@
+'use strict';
+
+Object.defineProperty(exports, '__esModule', { value: true });
+
+function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
+
+var he = _interopDefault(require('he'));
+
+/*  */
+
+var emptyObject = Object.freeze({});
+
+// these helpers produces better vm code in JS engines due to their
+// explicitness and function inlining
+function isUndef (v) {
+  return v === undefined || v === null
+}
+
+
+
+
+
+
+
+/**
+ * Check if value is primitive
+ */
+function isPrimitive (value) {
+  return (
+    typeof value === 'string' ||
+    typeof value === 'number' ||
+    // $flow-disable-line
+    typeof value === 'symbol' ||
+    typeof value === 'boolean'
+  )
+}
+
+/**
+ * Quick object check - this is primarily used to tell
+ * Objects from primitive values when we know the value
+ * is a JSON-compliant type.
+ */
+function isObject (obj) {
+  return obj !== null && typeof obj === 'object'
+}
+
+/**
+ * Get the raw type string of a value e.g. [object Object]
+ */
+var _toString = Object.prototype.toString;
+
+function toRawType (value) {
+  return _toString.call(value).slice(8, -1)
+}
+
+/**
+ * Strict object type check. Only returns true
+ * for plain JavaScript objects.
+ */
+function isPlainObject (obj) {
+  return _toString.call(obj) === '[object Object]'
+}
+
+
+
+/**
+ * Check if val is a valid array index.
+ */
+function isValidArrayIndex (val) {
+  var n = parseFloat(String(val));
+  return n >= 0 && Math.floor(n) === n && isFinite(val)
+}
+
+/**
+ * Convert a value to a string that is actually rendered.
+ */
+
+
+/**
+ * Convert a input value to a number for persistence.
+ * If the conversion fails, return original string.
+ */
+
+
+/**
+ * Make a map and return a function for checking if a key
+ * is in that map.
+ */
+function makeMap (
+  str,
+  expectsLowerCase
+) {
+  var map = Object.create(null);
+  var list = str.split(',');
+  for (var i = 0; i < list.length; i++) {
+    map[list[i]] = true;
+  }
+  return expectsLowerCase
+    ? function (val) { return map[val.toLowerCase()]; }
+    : function (val) { return map[val]; }
+}
+
+/**
+ * Check if a tag is a built-in tag.
+ */
+var isBuiltInTag = makeMap('slot,component', true);
+
+/**
+ * Check if a attribute is a reserved attribute.
+ */
+var isReservedAttribute = makeMap('key,ref,slot,slot-scope,is');
+
+/**
+ * Remove an item from an array
+ */
+function remove (arr, item) {
+  if (arr.length) {
+    var index = arr.indexOf(item);
+    if (index > -1) {
+      return arr.splice(index, 1)
+    }
+  }
+}
+
+/**
+ * Check whether the object has the property.
+ */
+var hasOwnProperty = Object.prototype.hasOwnProperty;
+function hasOwn (obj, key) {
+  return hasOwnProperty.call(obj, key)
+}
+
+/**
+ * Create a cached version of a pure function.
+ */
+function cached (fn) {
+  var cache = Object.create(null);
+  return (function cachedFn (str) {
+    var hit = cache[str];
+    return hit || (cache[str] = fn(str))
+  })
+}
+
+/**
+ * Camelize a hyphen-delimited string.
+ */
+var camelizeRE = /-(\w)/g;
+var camelize = cached(function (str) {
+  return str.replace(camelizeRE, function (_, c) { return c ? c.toUpperCase() : ''; })
+});
+
+/**
+ * Capitalize a string.
+ */
+
+
+
+
+/**
+ * Simple bind polyfill for environments that do not support it... e.g.
+ * PhantomJS 1.x. Technically we don't need this anymore since native bind is
+ * now more performant in most browsers, but removing it would be breaking for
+ * code that was able to run in PhantomJS 1.x, so this must be kept for
+ * backwards compatibility.
+ */
+
+/* istanbul ignore next */
+function polyfillBind (fn, ctx) {
+  function boundFn (a) {
+    var l = arguments.length;
+    return l
+      ? l > 1
+        ? fn.apply(ctx, arguments)
+        : fn.call(ctx, a)
+      : fn.call(ctx)
+  }
+
+  boundFn._length = fn.length;
+  return boundFn
+}
+
+function nativeBind (fn, ctx) {
+  return fn.bind(ctx)
+}
+
+var bind = Function.prototype.bind
+  ? nativeBind
+  : polyfillBind;
+
+/**
+ * Convert an Array-like object to a real Array.
+ */
+
+
+/**
+ * Mix properties into target object.
+ */
+function extend (to, _from) {
+  for (var key in _from) {
+    to[key] = _from[key];
+  }
+  return to
+}
+
+/**
+ * Merge an Array of Objects into a single Object.
+ */
+
+
+/**
+ * Perform no operation.
+ * Stubbing args to make Flow happy without leaving useless transpiled code
+ * with ...rest (https://flow.org/blog/2017/05/07/Strict-Function-Call-Arity/)
+ */
+function noop (a, b, c) {}
+
+/**
+ * Always return false.
+ */
+var no = function (a, b, c) { return false; };
+
+/**
+ * Return same value
+ */
+var identity = function (_) { return _; };
+
+/**
+ * Generate a static keys string from compiler modules.
+ */
+function genStaticKeys (modules) {
+  return modules.reduce(function (keys, m) {
+    return keys.concat(m.staticKeys || [])
+  }, []).join(',')
+}
+
+/**
+ * Check if two values are loosely equal - that is,
+ * if they are plain objects, do they have the same shape?
+ */
+
+
+
+
+/**
+ * Ensure a function is called only once.
+ */
+
+/*  */
+
+var isUnaryTag = makeMap(
+  'area,base,br,col,embed,frame,hr,img,input,isindex,keygen,' +
+  'link,meta,param,source,track,wbr'
+);
+
+// Elements that you can, intentionally, leave open
+// (and which close themselves)
+var canBeLeftOpenTag = makeMap(
+  'colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr,source'
+);
+
+// HTML5 tags https://html.spec.whatwg.org/multipage/indices.html#elements-3
+// Phrasing Content https://html.spec.whatwg.org/multipage/dom.html#phrasing-content
+var isNonPhrasingTag = makeMap(
+  'address,article,aside,base,blockquote,body,caption,col,colgroup,dd,' +
+  'details,dialog,div,dl,dt,fieldset,figcaption,figure,footer,form,' +
+  'h1,h2,h3,h4,h5,h6,head,header,hgroup,hr,html,legend,li,menuitem,meta,' +
+  'optgroup,option,param,rp,rt,source,style,summary,tbody,td,tfoot,th,thead,' +
+  'title,tr,track'
+);
+
+/**
+ * Not type-checking this file because it's mostly vendor code.
+ */
+
+/*!
+ * HTML Parser By John Resig (ejohn.org)
+ * Modified by Juriy "kangax" Zaytsev
+ * Original code by Erik Arvidsson, Mozilla Public License
+ * http://erik.eae.net/simplehtmlparser/simplehtmlparser.js
+ */
+
+// Regular Expressions for parsing tags and attributes
+var attribute = /^\s*([^\s"'<>\/=]+)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/;
+// could use https://www.w3.org/TR/1999/REC-xml-names-19990114/#NT-QName
+// but for Vue templates we can enforce a simple charset
+var ncname = '[a-zA-Z_][\\w\\-\\.]*';
+var qnameCapture = "((?:" + ncname + "\\:)?" + ncname + ")";
+var startTagOpen = new RegExp(("^<" + qnameCapture));
+var startTagClose = /^\s*(\/?)>/;
+var endTag = new RegExp(("^<\\/" + qnameCapture + "[^>]*>"));
+var doctype = /^<!DOCTYPE [^>]+>/i;
+// #7298: escape - to avoid being pased as HTML comment when inlined in page
+var comment = /^<!\--/;
+var conditionalComment = /^<!\[/;
+
+var IS_REGEX_CAPTURING_BROKEN = false;
+'x'.replace(/x(.)?/g, function (m, g) {
+  IS_REGEX_CAPTURING_BROKEN = g === '';
+});
+
+// Special Elements (can contain anything)
+var isPlainTextElement = makeMap('script,style,textarea', true);
+var reCache = {};
+
+var decodingMap = {
+  '&lt;': '<',
+  '&gt;': '>',
+  '&quot;': '"',
+  '&amp;': '&',
+  '&#10;': '\n',
+  '&#9;': '\t'
+};
+var encodedAttr = /&(?:lt|gt|quot|amp);/g;
+var encodedAttrWithNewLines = /&(?:lt|gt|quot|amp|#10|#9);/g;
+
+// #5992
+var isIgnoreNewlineTag = makeMap('pre,textarea', true);
+var shouldIgnoreFirstNewline = function (tag, html) { return tag && isIgnoreNewlineTag(tag) && html[0] === '\n'; };
+
+function decodeAttr (value, shouldDecodeNewlines) {
+  var re = shouldDecodeNewlines ? encodedAttrWithNewLines : encodedAttr;
+  return value.replace(re, function (match) { return decodingMap[match]; })
+}
+
+function parseHTML (html, options) {
+  var stack = [];
+  var expectHTML = options.expectHTML;
+  var isUnaryTag$$1 = options.isUnaryTag || no;
+  var canBeLeftOpenTag$$1 = options.canBeLeftOpenTag || no;
+  var index = 0;
+  var last, lastTag;
+  while (html) {
+    last = html;
+    // Make sure we're not in a plaintext content element like script/style
+    if (!lastTag || !isPlainTextElement(lastTag)) {
+      var textEnd = html.indexOf('<');
+      if (textEnd === 0) {
+        // Comment:
+        if (comment.test(html)) {
+          var commentEnd = html.indexOf('-->');
+
+          if (commentEnd >= 0) {
+            if (options.shouldKeepComment) {
+              options.comment(html.substring(4, commentEnd));
+            }
+            advance(commentEnd + 3);
+            continue
+          }
+        }
+
+        // http://en.wikipedia.org/wiki/Conditional_comment#Downlevel-revealed_conditional_comment
+        if (conditionalComment.test(html)) {
+          var conditionalEnd = html.indexOf(']>');
+
+          if (conditionalEnd >= 0) {
+            advance(conditionalEnd + 2);
+            continue
+          }
+        }
+
+        // Doctype:
+        var doctypeMatch = html.match(doctype);
+        if (doctypeMatch) {
+          advance(doctypeMatch[0].length);
+          continue
+        }
+
+        // End tag:
+        var endTagMatch = html.match(endTag);
+        if (endTagMatch) {
+          var curIndex = index;
+          advance(endTagMatch[0].length);
+          parseEndTag(endTagMatch[1], curIndex, index);
+          continue
+        }
+
+        // Start tag:
+        var startTagMatch = parseStartTag();
+        if (startTagMatch) {
+          handleStartTag(startTagMatch);
+          if (shouldIgnoreFirstNewline(lastTag, html)) {
+            advance(1);
+          }
+          continue
+        }
+      }
+
+      var text = (void 0), rest = (void 0), next = (void 0);
+      if (textEnd >= 0) {
+        rest = html.slice(textEnd);
+        while (
+          !endTag.test(rest) &&
+          !startTagOpen.test(rest) &&
+          !comment.test(rest) &&
+          !conditionalComment.test(rest)
+        ) {
+          // < in plain text, be forgiving and treat it as text
+          next = rest.indexOf('<', 1);
+          if (next < 0) { break }
+          textEnd += next;
+          rest = html.slice(textEnd);
+        }
+        text = html.substring(0, textEnd);
+        advance(textEnd);
+      }
+
+      if (textEnd < 0) {
+        text = html;
+        html = '';
+      }
+
+      if (options.chars && text) {
+        options.chars(text);
+      }
+    } else {
+      var endTagLength = 0;
+      var stackedTag = lastTag.toLowerCase();
+      var reStackedTag = reCache[stackedTag] || (reCache[stackedTag] = new RegExp('([\\s\\S]*?)(</' + stackedTag + '[^>]*>)', 'i'));
+      var rest$1 = html.replace(reStackedTag, function (all, text, endTag) {
+        endTagLength = endTag.length;
+        if (!isPlainTextElement(stackedTag) && stackedTag !== 'noscript') {
+          text = text
+            .replace(/<!\--([\s\S]*?)-->/g, '$1') // #7298
+            .replace(/<!\[CDATA\[([\s\S]*?)]]>/g, '$1');
+        }
+        if (shouldIgnoreFirstNewline(stackedTag, text)) {
+          text = text.slice(1);
+        }
+        if (options.chars) {
+          options.chars(text);
+        }
+        return ''
+      });
+      index += html.length - rest$1.length;
+      html = rest$1;
+      parseEndTag(stackedTag, index - endTagLength, index);
+    }
+
+    if (html === last) {
+      options.chars && options.chars(html);
+      if (process.env.NODE_ENV !== 'production' && !stack.length && options.warn) {
+        options.warn(("Mal-formatted tag at end of template: \"" + html + "\""));
+      }
+      break
+    }
+  }
+
+  // Clean up any remaining tags
+  parseEndTag();
+
+  function advance (n) {
+    index += n;
+    html = html.substring(n);
+  }
+
+  function parseStartTag () {
+    var start = html.match(startTagOpen);
+    if (start) {
+      var match = {
+        tagName: start[1],
+        attrs: [],
+        start: index
+      };
+      advance(start[0].length);
+      var end, attr;
+      while (!(end = html.match(startTagClose)) && (attr = html.match(attribute))) {
+        advance(attr[0].length);
+        match.attrs.push(attr);
+      }
+      if (end) {
+        match.unarySlash = end[1];
+        advance(end[0].length);
+        match.end = index;
+        return match
+      }
+    }
+  }
+
+  function handleStartTag (match) {
+    var tagName = match.tagName;
+    var unarySlash = match.unarySlash;
+
+    if (expectHTML) {
+      if (lastTag === 'p' && isNonPhrasingTag(tagName)) {
+        parseEndTag(lastTag);
+      }
+      if (canBeLeftOpenTag$$1(tagName) && lastTag === tagName) {
+        parseEndTag(tagName);
+      }
+    }
+
+    var unary = isUnaryTag$$1(tagName) || !!unarySlash;
+
+    var l = match.attrs.length;
+    var attrs = new Array(l);
+    for (var i = 0; i < l; i++) {
+      var args = match.attrs[i];
+      // hackish work around FF bug https://bugzilla.mozilla.org/show_bug.cgi?id=369778
+      if (IS_REGEX_CAPTURING_BROKEN && args[0].indexOf('""') === -1) {
+        if (args[3] === '') { delete args[3]; }
+        if (args[4] === '') { delete args[4]; }
+        if (args[5] === '') { delete args[5]; }
+      }
+      var value = args[3] || args[4] || args[5] || '';
+      var shouldDecodeNewlines = tagName === 'a' && args[1] === 'href'
+        ? options.shouldDecodeNewlinesForHref
+        : options.shouldDecodeNewlines;
+      attrs[i] = {
+        name: args[1],
+        value: decodeAttr(value, shouldDecodeNewlines)
+      };
+    }
+
+    if (!unary) {
+      stack.push({ tag: tagName, lowerCasedTag: tagName.toLowerCase(), attrs: attrs });
+      lastTag = tagName;
+    }
+
+    if (options.start) {
+      options.start(tagName, attrs, unary, match.start, match.end);
+    }
+  }
+
+  function parseEndTag (tagName, start, end) {
+    var pos, lowerCasedTagName;
+    if (start == null) { start = index; }
+    if (end == null) { end = index; }
+
+    if (tagName) {
+      lowerCasedTagName = tagName.toLowerCase();
+    }
+
+    // Find the closest opened tag of the same type
+    if (tagName) {
+      for (pos = stack.length - 1; pos >= 0; pos--) {
+        if (stack[pos].lowerCasedTag === lowerCasedTagName) {
+          break
+        }
+      }
+    } else {
+      // If no tag name is provided, clean shop
+      pos = 0;
+    }
+
+    if (pos >= 0) {
+      // Close all the open elements, up the stack
+      for (var i = stack.length - 1; i >= pos; i--) {
+        if (process.env.NODE_ENV !== 'production' &&
+          (i > pos || !tagName) &&
+          options.warn
+        ) {
+          options.warn(
+            ("tag <" + (stack[i].tag) + "> has no matching end tag.")
+          );
+        }
+        if (options.end) {
+          options.end(stack[i].tag, start, end);
+        }
+      }
+
+      // Remove the open elements from the stack
+      stack.length = pos;
+      lastTag = pos && stack[pos - 1].tag;
+    } else if (lowerCasedTagName === 'br') {
+      if (options.start) {
+        options.start(tagName, [], true, start, end);
+      }
+    } else if (lowerCasedTagName === 'p') {
+      if (options.start) {
+        options.start(tagName, [], false, start, end);
+      }
+      if (options.end) {
+        options.end(tagName, start, end);
+      }
+    }
+  }
+}
+
+/*  */
+
+var validDivisionCharRE = /[\w).+\-_$\]]/;
+
+function parseFilters (exp) {
+  var inSingle = false;
+  var inDouble = false;
+  var inTemplateString = false;
+  var inRegex = false;
+  var curly = 0;
+  var square = 0;
+  var paren = 0;
+  var lastFilterIndex = 0;
+  var c, prev, i, expression, filters;
+
+  for (i = 0; i < exp.length; i++) {
+    prev = c;
+    c = exp.charCodeAt(i);
+    if (inSingle) {
+      if (c === 0x27 && prev !== 0x5C) { inSingle = false; }
+    } else if (inDouble) {
+      if (c === 0x22 && prev !== 0x5C) { inDouble = false; }
+    } else if (inTemplateString) {
+      if (c === 0x60 && prev !== 0x5C) { inTemplateString = false; }
+    } else if (inRegex) {
+      if (c === 0x2f && prev !== 0x5C) { inRegex = false; }
+    } else if (
+      c === 0x7C && // pipe
+      exp.charCodeAt(i + 1) !== 0x7C &&
+      exp.charCodeAt(i - 1) !== 0x7C &&
+      !curly && !square && !paren
+    ) {
+      if (expression === undefined) {
+        // first filter, end of expression
+        lastFilterIndex = i + 1;
+        expression = exp.slice(0, i).trim();
+      } else {
+        pushFilter();
+      }
+    } else {
+      switch (c) {
+        case 0x22: inDouble = true; break         // "
+        case 0x27: inSingle = true; break         // '
+        case 0x60: inTemplateString = true; break // `
+        case 0x28: paren++; break                 // (
+        case 0x29: paren--; break                 // )
+        case 0x5B: square++; break                // [
+        case 0x5D: square--; break                // ]
+        case 0x7B: curly++; break                 // {
+        case 0x7D: curly--; break                 // }
+      }
+      if (c === 0x2f) { // /
+        var j = i - 1;
+        var p = (void 0);
+        // find first non-whitespace prev char
+        for (; j >= 0; j--) {
+          p = exp.charAt(j);
+          if (p !== ' ') { break }
+        }
+        if (!p || !validDivisionCharRE.test(p)) {
+          inRegex = true;
+        }
+      }
+    }
+  }
+
+  if (expression === undefined) {
+    expression = exp.slice(0, i).trim();
+  } else if (lastFilterIndex !== 0) {
+    pushFilter();
+  }
+
+  function pushFilter () {
+    (filters || (filters = [])).push(exp.slice(lastFilterIndex, i).trim());
+    lastFilterIndex = i + 1;
+  }
+
+  if (filters) {
+    for (i = 0; i < filters.length; i++) {
+      expression = wrapFilter(expression, filters[i]);
+    }
+  }
+
+  return expression
+}
+
+function wrapFilter (exp, filter) {
+  var i = filter.indexOf('(');
+  if (i < 0) {
+    // _f: resolveFilter
+    return ("_f(\"" + filter + "\")(" + exp + ")")
+  } else {
+    var name = filter.slice(0, i);
+    var args = filter.slice(i + 1);
+    return ("_f(\"" + name + "\")(" + exp + (args !== ')' ? ',' + args : args))
+  }
+}
+
+/*  */
+
+var defaultTagRE = /\{\{((?:.|\n)+?)\}\}/g;
+var regexEscapeRE = /[-.*+?^${}()|[\]\/\\]/g;
+
+var buildRegex = cached(function (delimiters) {
+  var open = delimiters[0].replace(regexEscapeRE, '\\$&');
+  var close = delimiters[1].replace(regexEscapeRE, '\\$&');
+  return new RegExp(open + '((?:.|\\n)+?)' + close, 'g')
+});
+
+
+
+function parseText (
+  text,
+  delimiters
+) {
+  var tagRE = delimiters ? buildRegex(delimiters) : defaultTagRE;
+  if (!tagRE.test(text)) {
+    return
+  }
+  var tokens = [];
+  var rawTokens = [];
+  var lastIndex = tagRE.lastIndex = 0;
+  var match, index, tokenValue;
+  while ((match = tagRE.exec(text))) {
+    index = match.index;
+    // push text token
+    if (index > lastIndex) {
+      rawTokens.push(tokenValue = text.slice(lastIndex, index));
+      tokens.push(JSON.stringify(tokenValue));
+    }
+    // tag token
+    var exp = parseFilters(match[1].trim());
+    tokens.push(("_s(" + exp + ")"));
+    rawTokens.push({ '@binding': exp });
+    lastIndex = index + match[0].length;
+  }
+  if (lastIndex < text.length) {
+    rawTokens.push(tokenValue = text.slice(lastIndex));
+    tokens.push(JSON.stringify(tokenValue));
+  }
+  return {
+    expression: tokens.join('+'),
+    tokens: rawTokens
+  }
+}
+
+/*  */
+
+/**
+ * Cross-platform code generation for component v-model
+ */
+function genComponentModel (
+  el,
+  value,
+  modifiers
+) {
+  var ref = modifiers || {};
+  var number = ref.number;
+  var trim = ref.trim;
+
+  var baseValueExpression = '$$v';
+  var valueExpression = baseValueExpression;
+  if (trim) {
+    valueExpression =
+      "(typeof " + baseValueExpression + " === 'string'" +
+      "? " + baseValueExpression + ".trim()" +
+      ": " + baseValueExpression + ")";
+  }
+  if (number) {
+    valueExpression = "_n(" + valueExpression + ")";
+  }
+  var assignment = genAssignmentCode(value, valueExpression);
+
+  el.model = {
+    value: ("(" + value + ")"),
+    expression: ("\"" + value + "\""),
+    callback: ("function (" + baseValueExpression + ") {" + assignment + "}")
+  };
+}
+
+/**
+ * Cross-platform codegen helper for generating v-model value assignment code.
+ */
+function genAssignmentCode (
+  value,
+  assignment
+) {
+  var res = parseModel(value);
+  if (res.key === null) {
+    return (value + "=" + assignment)
+  } else {
+    return ("$set(" + (res.exp) + ", " + (res.key) + ", " + assignment + ")")
+  }
+}
+
+/**
+ * Parse a v-model expression into a base path and a final key segment.
+ * Handles both dot-path and possible square brackets.
+ *
+ * Possible cases:
+ *
+ * - test
+ * - test[key]
+ * - test[test1[key]]
+ * - test["a"][key]
+ * - xxx.test[a[a].test1[key]]
+ * - test.xxx.a["asa"][test1[key]]
+ *
+ */
+
+var len;
+var str;
+var chr;
+var index;
+var expressionPos;
+var expressionEndPos;
+
+
+
+function parseModel (val) {
+  // Fix https://github.com/vuejs/vue/pull/7730
+  // allow v-model="obj.val " (trailing whitespace)
+  val = val.trim();
+  len = val.length;
+
+  if (val.indexOf('[') < 0 || val.lastIndexOf(']') < len - 1) {
+    index = val.lastIndexOf('.');
+    if (index > -1) {
+      return {
+        exp: val.slice(0, index),
+        key: '"' + val.slice(index + 1) + '"'
+      }
+    } else {
+      return {
+        exp: val,
+        key: null
+      }
+    }
+  }
+
+  str = val;
+  index = expressionPos = expressionEndPos = 0;
+
+  while (!eof()) {
+    chr = next();
+    /* istanbul ignore if */
+    if (isStringStart(chr)) {
+      parseString(chr);
+    } else if (chr === 0x5B) {
+      parseBracket(chr);
+    }
+  }
+
+  return {
+    exp: val.slice(0, expressionPos),
+    key: val.slice(expressionPos + 1, expressionEndPos)
+  }
+}
+
+function next () {
+  return str.charCodeAt(++index)
+}
+
+function eof () {
+  return index >= len
+}
+
+function isStringStart (chr) {
+  return chr === 0x22 || chr === 0x27
+}
+
+function parseBracket (chr) {
+  var inBracket = 1;
+  expressionPos = index;
+  while (!eof()) {
+    chr = next();
+    if (isStringStart(chr)) {
+      parseString(chr);
+      continue
+    }
+    if (chr === 0x5B) { inBracket++; }
+    if (chr === 0x5D) { inBracket--; }
+    if (inBracket === 0) {
+      expressionEndPos = index;
+      break
+    }
+  }
+}
+
+function parseString (chr) {
+  var stringQuote = chr;
+  while (!eof()) {
+    chr = next();
+    if (chr === stringQuote) {
+      break
+    }
+  }
+}
+
+/*  */
+
+// can we use __proto__?
+var hasProto = '__proto__' in {};
+
+// Browser environment sniffing
+var inBrowser = typeof window !== 'undefined';
+var inWeex = typeof WXEnvironment !== 'undefined' && !!WXEnvironment.platform;
+var weexPlatform = inWeex && WXEnvironment.platform.toLowerCase();
+var UA = inBrowser && window.navigator.userAgent.toLowerCase();
+var isIE = UA && /msie|trident/.test(UA);
+var isIE9 = UA && UA.indexOf('msie 9.0') > 0;
+var isEdge = UA && UA.indexOf('edge/') > 0;
+var isAndroid = (UA && UA.indexOf('android') > 0) || (weexPlatform === 'android');
+var isIOS = (UA && /iphone|ipad|ipod|ios/.test(UA)) || (weexPlatform === 'ios');
+var isChrome = UA && /chrome\/\d+/.test(UA) && !isEdge;
+
+// Firefox has a "watch" function on Object.prototype...
+var nativeWatch = ({}).watch;
+
+
+if (inBrowser) {
+  try {
+    var opts = {};
+    Object.defineProperty(opts, 'passive', ({
+      get: function get () {
+        /* istanbul ignore next */
+        
+      }
+    })); // https://github.com/facebook/flow/issues/285
+    window.addEventListener('test-passive', null, opts);
+  } catch (e) {}
+}
+
+// this needs to be lazy-evaled because vue may be required before
+// vue-server-renderer can set VUE_ENV
+var _isServer;
+var isServerRendering = function () {
+  if (_isServer === undefined) {
+    /* istanbul ignore if */
+    if (!inBrowser && !inWeex && typeof global !== 'undefined') {
+      // detect presence of vue-server-renderer and avoid
+      // Webpack shimming the process
+      _isServer = global['process'].env.VUE_ENV === 'server';
+    } else {
+      _isServer = false;
+    }
+  }
+  return _isServer
+};
+
+// detect devtools
+var devtools = inBrowser && window.__VUE_DEVTOOLS_GLOBAL_HOOK__;
+
+/* istanbul ignore next */
+function isNative (Ctor) {
+  return typeof Ctor === 'function' && /native code/.test(Ctor.toString())
+}
+
+var hasSymbol =
+  typeof Symbol !== 'undefined' && isNative(Symbol) &&
+  typeof Reflect !== 'undefined' && isNative(Reflect.ownKeys);
+
+/* istanbul ignore if */ // $flow-disable-line
+if (typeof Set !== 'undefined' && isNative(Set)) {
+  // use native Set when available.
+  
+} else {
+  // a non-standard Set polyfill that only works with primitive keys.
+  
+}
+
+/*  */
+
+function baseWarn (msg) {
+  console.error(("[Vue compiler]: " + msg));
+}
+
+function pluckModuleFunction (
+  modules,
+  key
+) {
+  return modules
+    ? modules.map(function (m) { return m[key]; }).filter(function (_) { return _; })
+    : []
+}
+
+function addProp (el, name, value) {
+  (el.props || (el.props = [])).push({ name: name, value: value });
+  el.plain = false;
+}
+
+function addAttr (el, name, value) {
+  (el.attrs || (el.attrs = [])).push({ name: name, value: value });
+  el.plain = false;
+}
+
+// add a raw attr (use this in preTransforms)
+function addRawAttr (el, name, value) {
+  el.attrsMap[name] = value;
+  el.attrsList.push({ name: name, value: value });
+}
+
+function addDirective (
+  el,
+  name,
+  rawName,
+  value,
+  arg,
+  modifiers
+) {
+  (el.directives || (el.directives = [])).push({ name: name, rawName: rawName, value: value, arg: arg, modifiers: modifiers });
+  el.plain = false;
+}
+
+function addHandler (
+  el,
+  name,
+  value,
+  modifiers,
+  important,
+  warn
+) {
+  modifiers = modifiers || emptyObject;
+  // warn prevent and passive modifier
+  /* istanbul ignore if */
+  if (
+    process.env.NODE_ENV !== 'production' && warn &&
+    modifiers.prevent && modifiers.passive
+  ) {
+    warn(
+      'passive and prevent can\'t be used together. ' +
+      'Passive handler can\'t prevent default event.'
+    );
+  }
+
+  // check capture modifier
+  if (modifiers.capture) {
+    delete modifiers.capture;
+    name = '!' + name; // mark the event as captured
+  }
+  if (modifiers.once) {
+    delete modifiers.once;
+    name = '~' + name; // mark the event as once
+  }
+  /* istanbul ignore if */
+  if (modifiers.passive) {
+    delete modifiers.passive;
+    name = '&' + name; // mark the event as passive
+  }
+
+  // normalize click.right and click.middle since they don't actually fire
+  // this is technically browser-specific, but at least for now browsers are
+  // the only target envs that have right/middle clicks.
+  if (name === 'click') {
+    if (modifiers.right) {
+      name = 'contextmenu';
+      delete modifiers.right;
+    } else if (modifiers.middle) {
+      name = 'mouseup';
+    }
+  }
+
+  var events;
+  if (modifiers.native) {
+    delete modifiers.native;
+    events = el.nativeEvents || (el.nativeEvents = {});
+  } else {
+    events = el.events || (el.events = {});
+  }
+
+  var newHandler = {
+    value: value.trim()
+  };
+  if (modifiers !== emptyObject) {
+    newHandler.modifiers = modifiers;
+  }
+
+  var handlers = events[name];
+  /* istanbul ignore if */
+  if (Array.isArray(handlers)) {
+    important ? handlers.unshift(newHandler) : handlers.push(newHandler);
+  } else if (handlers) {
+    events[name] = important ? [newHandler, handlers] : [handlers, newHandler];
+  } else {
+    events[name] = newHandler;
+  }
+
+  el.plain = false;
+}
+
+function getBindingAttr (
+  el,
+  name,
+  getStatic
+) {
+  var dynamicValue =
+    getAndRemoveAttr(el, ':' + name) ||
+    getAndRemoveAttr(el, 'v-bind:' + name);
+  if (dynamicValue != null) {
+    return parseFilters(dynamicValue)
+  } else if (getStatic !== false) {
+    var staticValue = getAndRemoveAttr(el, name);
+    if (staticValue != null) {
+      return JSON.stringify(staticValue)
+    }
+  }
+}
+
+// note: this only removes the attr from the Array (attrsList) so that it
+// doesn't get processed by processAttrs.
+// By default it does NOT remove it from the map (attrsMap) because the map is
+// needed during codegen.
+function getAndRemoveAttr (
+  el,
+  name,
+  removeFromMap
+) {
+  var val;
+  if ((val = el.attrsMap[name]) != null) {
+    var list = el.attrsList;
+    for (var i = 0, l = list.length; i < l; i++) {
+      if (list[i].name === name) {
+        list.splice(i, 1);
+        break
+      }
+    }
+  }
+  if (removeFromMap) {
+    delete el.attrsMap[name];
+  }
+  return val
+}
+
+/*  */
+
+var onRE = /^@|^v-on:/;
+var dirRE = /^v-|^@|^:/;
+var forAliasRE = /([^]*?)\s+(?:in|of)\s+([^]*)/;
+var forIteratorRE = /,([^,\}\]]*)(?:,([^,\}\]]*))?$/;
+var stripParensRE = /^\(|\)$/g;
+
+var argRE = /:(.*)$/;
+var bindRE = /^:|^v-bind:/;
+var modifierRE = /\.[^.]+/g;
+
+var decodeHTMLCached = cached(he.decode);
+
+// configurable state
+var warn;
+var delimiters;
+var transforms;
+var preTransforms;
+var postTransforms;
+var platformIsPreTag;
+var platformMustUseProp;
+var platformGetTagNamespace;
+
+
+
+function createASTElement (
+  tag,
+  attrs,
+  parent
+) {
+  return {
+    type: 1,
+    tag: tag,
+    attrsList: attrs,
+    attrsMap: makeAttrsMap(attrs),
+    parent: parent,
+    children: []
+  }
+}
+
+/**
+ * Convert HTML string to AST.
+ */
+function parse (
+  template,
+  options
+) {
+  warn = options.warn || baseWarn;
+
+  platformIsPreTag = options.isPreTag || no;
+  platformMustUseProp = options.mustUseProp || no;
+  platformGetTagNamespace = options.getTagNamespace || no;
+
+  transforms = pluckModuleFunction(options.modules, 'transformNode');
+  preTransforms = pluckModuleFunction(options.modules, 'preTransformNode');
+  postTransforms = pluckModuleFunction(options.modules, 'postTransformNode');
+
+  delimiters = options.delimiters;
+
+  var stack = [];
+  var preserveWhitespace = options.preserveWhitespace !== false;
+  var root;
+  var currentParent;
+  var inVPre = false;
+  var inPre = false;
+  var warned = false;
+
+  function warnOnce (msg) {
+    if (!warned) {
+      warned = true;
+      warn(msg);
+    }
+  }
+
+  function closeElement (element) {
+    // check pre state
+    if (element.pre) {
+      inVPre = false;
+    }
+    if (platformIsPreTag(element.tag)) {
+      inPre = false;
+    }
+    // apply post-transforms
+    for (var i = 0; i < postTransforms.length; i++) {
+      postTransforms[i](element, options);
+    }
+  }
+
+  parseHTML(template, {
+    warn: warn,
+    expectHTML: options.expectHTML,
+    isUnaryTag: options.isUnaryTag,
+    canBeLeftOpenTag: options.canBeLeftOpenTag,
+    shouldDecodeNewlines: options.shouldDecodeNewlines,
+    shouldDecodeNewlinesForHref: options.shouldDecodeNewlinesForHref,
+    shouldKeepComment: options.comments,
+    start: function start (tag, attrs, unary) {
+      // check namespace.
+      // inherit parent ns if there is one
+      var ns = (currentParent && currentParent.ns) || platformGetTagNamespace(tag);
+
+      // handle IE svg bug
+      /* istanbul ignore if */
+      if (isIE && ns === 'svg') {
+        attrs = guardIESVGBug(attrs);
+      }
+
+      var element = createASTElement(tag, attrs, currentParent);
+      if (ns) {
+        element.ns = ns;
+      }
+
+      if (isForbiddenTag(element) && !isServerRendering()) {
+        element.forbidden = true;
+        process.env.NODE_ENV !== 'production' && warn(
+          'Templates should only be responsible for mapping the state to the ' +
+          'UI. Avoid placing tags with side-effects in your templates, such as ' +
+          "<" + tag + ">" + ', as they will not be parsed.'
+        );
+      }
+
+      // apply pre-transforms
+      for (var i = 0; i < preTransforms.length; i++) {
+        element = preTransforms[i](element, options) || element;
+      }
+
+      if (!inVPre) {
+        processPre(element);
+        if (element.pre) {
+          inVPre = true;
+        }
+      }
+      if (platformIsPreTag(element.tag)) {
+        inPre = true;
+      }
+      if (inVPre) {
+        processRawAttrs(element);
+      } else if (!element.processed) {
+        // structural directives
+        processFor(element);
+        processIf(element);
+        processOnce(element);
+        // element-scope stuff
+        processElement(element, options);
+      }
+
+      function checkRootConstraints (el) {
+        if (process.env.NODE_ENV !== 'production') {
+          if (el.tag === 'slot' || el.tag === 'template') {
+            warnOnce(
+              "Cannot use <" + (el.tag) + "> as component root element because it may " +
+              'contain multiple nodes.'
+            );
+          }
+          if (el.attrsMap.hasOwnProperty('v-for')) {
+            warnOnce(
+              'Cannot use v-for on stateful component root element because ' +
+              'it renders multiple elements.'
+            );
+          }
+        }
+      }
+
+      // tree management
+      if (!root) {
+        root = element;
+        checkRootConstraints(root);
+      } else if (!stack.length) {
+        // allow root elements with v-if, v-else-if and v-else
+        if (root.if && (element.elseif || element.else)) {
+          checkRootConstraints(element);
+          addIfCondition(root, {
+            exp: element.elseif,
+            block: element
+          });
+        } else if (process.env.NODE_ENV !== 'production') {
+          warnOnce(
+            "Component template should contain exactly one root element. " +
+            "If you are using v-if on multiple elements, " +
+            "use v-else-if to chain them instead."
+          );
+        }
+      }
+      if (currentParent && !element.forbidden) {
+        if (element.elseif || element.else) {
+          processIfConditions(element, currentParent);
+        } else if (element.slotScope) { // scoped slot
+          currentParent.plain = false;
+          var name = element.slotTarget || '"default"';(currentParent.scopedSlots || (currentParent.scopedSlots = {}))[name] = element;
+        } else {
+          currentParent.children.push(element);
+          element.parent = currentParent;
+        }
+      }
+      if (!unary) {
+        currentParent = element;
+        stack.push(element);
+      } else {
+        closeElement(element);
+      }
+    },
+
+    end: function end () {
+      // remove trailing whitespace
+      var element = stack[stack.length - 1];
+      var lastNode = element.children[element.children.length - 1];
+      if (lastNode && lastNode.type === 3 && lastNode.text === ' ' && !inPre) {
+        element.children.pop();
+      }
+      // pop stack
+      stack.length -= 1;
+      currentParent = stack[stack.length - 1];
+      closeElement(element);
+    },
+
+    chars: function chars (text) {
+      if (!currentParent) {
+        if (process.env.NODE_ENV !== 'production') {
+          if (text === template) {
+            warnOnce(
+              'Component template requires a root element, rather than just text.'
+            );
+          } else if ((text = text.trim())) {
+            warnOnce(
+              ("text \"" + text + "\" outside root element will be ignored.")
+            );
+          }
+        }
+        return
+      }
+      // IE textarea placeholder bug
+      /* istanbul ignore if */
+      if (isIE &&
+        currentParent.tag === 'textarea' &&
+        currentParent.attrsMap.placeholder === text
+      ) {
+        return
+      }
+      var children = currentParent.children;
+      text = inPre || text.trim()
+        ? isTextTag(currentParent) ? text : decodeHTMLCached(text)
+        // only preserve whitespace if its not right after a starting tag
+        : preserveWhitespace && children.length ? ' ' : '';
+      if (text) {
+        var res;
+        if (!inVPre && text !== ' ' && (res = parseText(text, delimiters))) {
+          children.push({
+            type: 2,
+            expression: res.expression,
+            tokens: res.tokens,
+            text: text
+          });
+        } else if (text !== ' ' || !children.length || children[children.length - 1].text !== ' ') {
+          children.push({
+            type: 3,
+            text: text
+          });
+        }
+      }
+    },
+    comment: function comment (text) {
+      currentParent.children.push({
+        type: 3,
+        text: text,
+        isComment: true
+      });
+    }
+  });
+  return root
+}
+
+function processPre (el) {
+  if (getAndRemoveAttr(el, 'v-pre') != null) {
+    el.pre = true;
+  }
+}
+
+function processRawAttrs (el) {
+  var l = el.attrsList.length;
+  if (l) {
+    var attrs = el.attrs = new Array(l);
+    for (var i = 0; i < l; i++) {
+      attrs[i] = {
+        name: el.attrsList[i].name,
+        value: JSON.stringify(el.attrsList[i].value)
+      };
+    }
+  } else if (!el.pre) {
+    // non root node in pre blocks with no attributes
+    el.plain = true;
+  }
+}
+
+function processElement (element, options) {
+  processKey(element);
+
+  // determine whether this is a plain element after
+  // removing structural attributes
+  element.plain = !element.key && !element.attrsList.length;
+
+  processRef(element);
+  processSlot(element);
+  processComponent(element);
+  for (var i = 0; i < transforms.length; i++) {
+    element = transforms[i](element, options) || element;
+  }
+  processAttrs(element);
+}
+
+function processKey (el) {
+  var exp = getBindingAttr(el, 'key');
+  if (exp) {
+    if (process.env.NODE_ENV !== 'production' && el.tag === 'template') {
+      warn("<template> cannot be keyed. Place the key on real elements instead.");
+    }
+    el.key = exp;
+  }
+}
+
+function processRef (el) {
+  var ref = getBindingAttr(el, 'ref');
+  if (ref) {
+    el.ref = ref;
+    el.refInFor = checkInFor(el);
+  }
+}
+
+function processFor (el) {
+  var exp;
+  if ((exp = getAndRemoveAttr(el, 'v-for'))) {
+    var res = parseFor(exp);
+    if (res) {
+      extend(el, res);
+    } else if (process.env.NODE_ENV !== 'production') {
+      warn(
+        ("Invalid v-for expression: " + exp)
+      );
+    }
+  }
+}
+
+
+
+function parseFor (exp) {
+  var inMatch = exp.match(forAliasRE);
+  if (!inMatch) { return }
+  var res = {};
+  res.for = inMatch[2].trim();
+  var alias = inMatch[1].trim().replace(stripParensRE, '');
+  var iteratorMatch = alias.match(forIteratorRE);
+  if (iteratorMatch) {
+    res.alias = alias.replace(forIteratorRE, '');
+    res.iterator1 = iteratorMatch[1].trim();
+    if (iteratorMatch[2]) {
+      res.iterator2 = iteratorMatch[2].trim();
+    }
+  } else {
+    res.alias = alias;
+  }
+  return res
+}
+
+function processIf (el) {
+  var exp = getAndRemoveAttr(el, 'v-if');
+  if (exp) {
+    el.if = exp;
+    addIfCondition(el, {
+      exp: exp,
+      block: el
+    });
+  } else {
+    if (getAndRemoveAttr(el, 'v-else') != null) {
+      el.else = true;
+    }
+    var elseif = getAndRemoveAttr(el, 'v-else-if');
+    if (elseif) {
+      el.elseif = elseif;
+    }
+  }
+}
+
+function processIfConditions (el, parent) {
+  var prev = findPrevElement(parent.children);
+  if (prev && prev.if) {
+    addIfCondition(prev, {
+      exp: el.elseif,
+      block: el
+    });
+  } else if (process.env.NODE_ENV !== 'production') {
+    warn(
+      "v-" + (el.elseif ? ('else-if="' + el.elseif + '"') : 'else') + " " +
+      "used on element <" + (el.tag) + "> without corresponding v-if."
+    );
+  }
+}
+
+function findPrevElement (children) {
+  var i = children.length;
+  while (i--) {
+    if (children[i].type === 1) {
+      return children[i]
+    } else {
+      if (process.env.NODE_ENV !== 'production' && children[i].text !== ' ') {
+        warn(
+          "text \"" + (children[i].text.trim()) + "\" between v-if and v-else(-if) " +
+          "will be ignored."
+        );
+      }
+      children.pop();
+    }
+  }
+}
+
+function addIfCondition (el, condition) {
+  if (!el.ifConditions) {
+    el.ifConditions = [];
+  }
+  el.ifConditions.push(condition);
+}
+
+function processOnce (el) {
+  var once$$1 = getAndRemoveAttr(el, 'v-once');
+  if (once$$1 != null) {
+    el.once = true;
+  }
+}
+
+function processSlot (el) {
+  if (el.tag === 'slot') {
+    el.slotName = getBindingAttr(el, 'name');
+    if (process.env.NODE_ENV !== 'production' && el.key) {
+      warn(
+        "`key` does not work on <slot> because slots are abstract outlets " +
+        "and can possibly expand into multiple elements. " +
+        "Use the key on a wrapping element instead."
+      );
+    }
+  } else {
+    var slotScope;
+    if (el.tag === 'template') {
+      slotScope = getAndRemoveAttr(el, 'scope');
+      /* istanbul ignore if */
+      if (process.env.NODE_ENV !== 'production' && slotScope) {
+        warn(
+          "the \"scope\" attribute for scoped slots have been deprecated and " +
+          "replaced by \"slot-scope\" since 2.5. The new \"slot-scope\" attribute " +
+          "can also be used on plain elements in addition to <template> to " +
+          "denote scoped slots.",
+          true
+        );
+      }
+      el.slotScope = slotScope || getAndRemoveAttr(el, 'slot-scope');
+    } else if ((slotScope = getAndRemoveAttr(el, 'slot-scope'))) {
+      /* istanbul ignore if */
+      if (process.env.NODE_ENV !== 'production' && el.attrsMap['v-for']) {
+        warn(
+          "Ambiguous combined usage of slot-scope and v-for on <" + (el.tag) + "> " +
+          "(v-for takes higher priority). Use a wrapper <template> for the " +
+          "scoped slot to make it clearer.",
+          true
+        );
+      }
+      el.slotScope = slotScope;
+    }
+    var slotTarget = getBindingAttr(el, 'slot');
+    if (slotTarget) {
+      el.slotTarget = slotTarget === '""' ? '"default"' : slotTarget;
+      // preserve slot as an attribute for native shadow DOM compat
+      // only for non-scoped slots.
+      if (el.tag !== 'template' && !el.slotScope) {
+        addAttr(el, 'slot', slotTarget);
+      }
+    }
+  }
+}
+
+function processComponent (el) {
+  var binding;
+  if ((binding = getBindingAttr(el, 'is'))) {
+    el.component = binding;
+  }
+  if (getAndRemoveAttr(el, 'inline-template') != null) {
+    el.inlineTemplate = true;
+  }
+}
+
+function processAttrs (el) {
+  var list = el.attrsList;
+  var i, l, name, rawName, value, modifiers, isProp;
+  for (i = 0, l = list.length; i < l; i++) {
+    name = rawName = list[i].name;
+    value = list[i].value;
+    if (dirRE.test(name)) {
+      // mark element as dynamic
+      el.hasBindings = true;
+      // modifiers
+      modifiers = parseModifiers(name);
+      if (modifiers) {
+        name = name.replace(modifierRE, '');
+      }
+      if (bindRE.test(name)) { // v-bind
+        name = name.replace(bindRE, '');
+        value = parseFilters(value);
+        isProp = false;
+        if (modifiers) {
+          if (modifiers.prop) {
+            isProp = true;
+            name = camelize(name);
+            if (name === 'innerHtml') { name = 'innerHTML'; }
+          }
+          if (modifiers.camel) {
+            name = camelize(name);
+          }
+          if (modifiers.sync) {
+            addHandler(
+              el,
+              ("update:" + (camelize(name))),
+              genAssignmentCode(value, "$event")
+            );
+          }
+        }
+        if (isProp || (
+          !el.component && platformMustUseProp(el.tag, el.attrsMap.type, name)
+        )) {
+          addProp(el, name, value);
+        } else {
+          addAttr(el, name, value);
+        }
+      } else if (onRE.test(name)) { // v-on
+        name = name.replace(onRE, '');
+        addHandler(el, name, value, modifiers, false, warn);
+      } else { // normal directives
+        name = name.replace(dirRE, '');
+        // parse arg
+        var argMatch = name.match(argRE);
+        var arg = argMatch && argMatch[1];
+        if (arg) {
+          name = name.slice(0, -(arg.length + 1));
+        }
+        addDirective(el, name, rawName, value, arg, modifiers);
+        if (process.env.NODE_ENV !== 'production' && name === 'model') {
+          checkForAliasModel(el, value);
+        }
+      }
+    } else {
+      // literal attribute
+      if (process.env.NODE_ENV !== 'production') {
+        var res = parseText(value, delimiters);
+        if (res) {
+          warn(
+            name + "=\"" + value + "\": " +
+            'Interpolation inside attributes has been removed. ' +
+            'Use v-bind or the colon shorthand instead. For example, ' +
+            'instead of <div id="{{ val }}">, use <div :id="val">.'
+          );
+        }
+      }
+      addAttr(el, name, JSON.stringify(value));
+      // #6887 firefox doesn't update muted state if set via attribute
+      // even immediately after element creation
+      if (!el.component &&
+          name === 'muted' &&
+          platformMustUseProp(el.tag, el.attrsMap.type, name)) {
+        addProp(el, name, 'true');
+      }
+    }
+  }
+}
+
+function checkInFor (el) {
+  var parent = el;
+  while (parent) {
+    if (parent.for !== undefined) {
+      return true
+    }
+    parent = parent.parent;
+  }
+  return false
+}
+
+function parseModifiers (name) {
+  var match = name.match(modifierRE);
+  if (match) {
+    var ret = {};
+    match.forEach(function (m) { ret[m.slice(1)] = true; });
+    return ret
+  }
+}
+
+function makeAttrsMap (attrs) {
+  var map = {};
+  for (var i = 0, l = attrs.length; i < l; i++) {
+    if (
+      process.env.NODE_ENV !== 'production' &&
+      map[attrs[i].name] && !isIE && !isEdge
+    ) {
+      warn('duplicate attribute: ' + attrs[i].name);
+    }
+    map[attrs[i].name] = attrs[i].value;
+  }
+  return map
+}
+
+// for script (e.g. type="x/template") or style, do not decode content
+function isTextTag (el) {
+  return el.tag === 'script' || el.tag === 'style'
+}
+
+function isForbiddenTag (el) {
+  return (
+    el.tag === 'style' ||
+    (el.tag === 'script' && (
+      !el.attrsMap.type ||
+      el.attrsMap.type === 'text/javascript'
+    ))
+  )
+}
+
+var ieNSBug = /^xmlns:NS\d+/;
+var ieNSPrefix = /^NS\d+:/;
+
+/* istanbul ignore next */
+function guardIESVGBug (attrs) {
+  var res = [];
+  for (var i = 0; i < attrs.length; i++) {
+    var attr = attrs[i];
+    if (!ieNSBug.test(attr.name)) {
+      attr.name = attr.name.replace(ieNSPrefix, '');
+      res.push(attr);
+    }
+  }
+  return res
+}
+
+function checkForAliasModel (el, value) {
+  var _el = el;
+  while (_el) {
+    if (_el.for && _el.alias === value) {
+      warn(
+        "<" + (el.tag) + " v-model=\"" + value + "\">: " +
+        "You are binding v-model directly to a v-for iteration alias. " +
+        "This will not be able to modify the v-for source array because " +
+        "writing to the alias is like modifying a function local variable. " +
+        "Consider using an array of objects and use v-model on an object property instead."
+      );
+    }
+    _el = _el.parent;
+  }
+}
+
+/*  */
+
+var isStaticKey;
+var isPlatformReservedTag;
+
+var genStaticKeysCached = cached(genStaticKeys$1);
+
+/**
+ * Goal of the optimizer: walk the generated template AST tree
+ * and detect sub-trees that are purely static, i.e. parts of
+ * the DOM that never needs to change.
+ *
+ * Once we detect these sub-trees, we can:
+ *
+ * 1. Hoist them into constants, so that we no longer need to
+ *    create fresh nodes for them on each re-render;
+ * 2. Completely skip them in the patching process.
+ */
+function optimize (root, options) {
+  if (!root) { return }
+  isStaticKey = genStaticKeysCached(options.staticKeys || '');
+  isPlatformReservedTag = options.isReservedTag || no;
+  // first pass: mark all non-static nodes.
+  markStatic(root);
+  // second pass: mark static roots.
+  markStaticRoots(root, false);
+}
+
+function genStaticKeys$1 (keys) {
+  return makeMap(
+    'type,tag,attrsList,attrsMap,plain,parent,children,attrs' +
+    (keys ? ',' + keys : '')
+  )
+}
+
+function markStatic (node) {
+  node.static = isStatic(node);
+  if (node.type === 1) {
+    // do not make component slot content static. this avoids
+    // 1. components not able to mutate slot nodes
+    // 2. static slot content fails for hot-reloading
+    if (
+      !isPlatformReservedTag(node.tag) &&
+      node.tag !== 'slot' &&
+      node.attrsMap['inline-template'] == null
+    ) {
+      return
+    }
+    for (var i = 0, l = node.children.length; i < l; i++) {
+      var child = node.children[i];
+      markStatic(child);
+      if (!child.static) {
+        node.static = false;
+      }
+    }
+    if (node.ifConditions) {
+      for (var i$1 = 1, l$1 = node.ifConditions.length; i$1 < l$1; i$1++) {
+        var block = node.ifConditions[i$1].block;
+        markStatic(block);
+        if (!block.static) {
+          node.static = false;
+        }
+      }
+    }
+  }
+}
+
+function markStaticRoots (node, isInFor) {
+  if (node.type === 1) {
+    if (node.static || node.once) {
+      node.staticInFor = isInFor;
+    }
+    // For a node to qualify as a static root, it should have children that
+    // are not just static text. Otherwise the cost of hoisting out will
+    // outweigh the benefits and it's better off to just always render it fresh.
+    if (node.static && node.children.length && !(
+      node.children.length === 1 &&
+      node.children[0].type === 3
+    )) {
+      node.staticRoot = true;
+      return
+    } else {
+      node.staticRoot = false;
+    }
+    if (node.children) {
+      for (var i = 0, l = node.children.length; i < l; i++) {
+        markStaticRoots(node.children[i], isInFor || !!node.for);
+      }
+    }
+    if (node.ifConditions) {
+      for (var i$1 = 1, l$1 = node.ifConditions.length; i$1 < l$1; i$1++) {
+        markStaticRoots(node.ifConditions[i$1].block, isInFor);
+      }
+    }
+  }
+}
+
+function isStatic (node) {
+  if (node.type === 2) { // expression
+    return false
+  }
+  if (node.type === 3) { // text
+    return true
+  }
+  return !!(node.pre || (
+    !node.hasBindings && // no dynamic bindings
+    !node.if && !node.for && // not v-if or v-for or v-else
+    !isBuiltInTag(node.tag) && // not a built-in
+    isPlatformReservedTag(node.tag) && // not a component
+    !isDirectChildOfTemplateFor(node) &&
+    Object.keys(node).every(isStaticKey)
+  ))
+}
+
+function isDirectChildOfTemplateFor (node) {
+  while (node.parent) {
+    node = node.parent;
+    if (node.tag !== 'template') {
+      return false
+    }
+    if (node.for) {
+      return true
+    }
+  }
+  return false
+}
+
+/*  */
+
+var fnExpRE = /^([\w$_]+|\([^)]*?\))\s*=>|^function\s*\(/;
+var simplePathRE = /^[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*|\['[^']*?']|\["[^"]*?"]|\[\d+]|\[[A-Za-z_$][\w$]*])*$/;
+
+// KeyboardEvent.keyCode aliases
+var keyCodes = {
+  esc: 27,
+  tab: 9,
+  enter: 13,
+  space: 32,
+  up: 38,
+  left: 37,
+  right: 39,
+  down: 40,
+  'delete': [8, 46]
+};
+
+// KeyboardEvent.key aliases
+var keyNames = {
+  esc: 'Escape',
+  tab: 'Tab',
+  enter: 'Enter',
+  space: ' ',
+  // #7806: IE11 uses key names without `Arrow` prefix for arrow keys.
+  up: ['Up', 'ArrowUp'],
+  left: ['Left', 'ArrowLeft'],
+  right: ['Right', 'ArrowRight'],
+  down: ['Down', 'ArrowDown'],
+  'delete': ['Backspace', 'Delete']
+};
+
+// #4868: modifiers that prevent the execution of the listener
+// need to explicitly return null so that we can determine whether to remove
+// the listener for .once
+var genGuard = function (condition) { return ("if(" + condition + ")return null;"); };
+
+var modifierCode = {
+  stop: '$event.stopPropagation();',
+  prevent: '$event.preventDefault();',
+  self: genGuard("$event.target !== $event.currentTarget"),
+  ctrl: genGuard("!$event.ctrlKey"),
+  shift: genGuard("!$event.shiftKey"),
+  alt: genGuard("!$event.altKey"),
+  meta: genGuard("!$event.metaKey"),
+  left: genGuard("'button' in $event && $event.button !== 0"),
+  middle: genGuard("'button' in $event && $event.button !== 1"),
+  right: genGuard("'button' in $event && $event.button !== 2")
+};
+
+function genHandlers (
+  events,
+  isNative,
+  warn
+) {
+  var res = isNative ? 'nativeOn:{' : 'on:{';
+  for (var name in events) {
+    res += "\"" + name + "\":" + (genHandler(name, events[name])) + ",";
+  }
+  return res.slice(0, -1) + '}'
+}
+
+// Generate handler code with binding params on Weex
+/* istanbul ignore next */
+function genWeexHandler (params, handlerCode) {
+  var innerHandlerCode = handlerCode;
+  var exps = params.filter(function (exp) { return simplePathRE.test(exp) && exp !== '$event'; });
+  var bindings = exps.map(function (exp) { return ({ '@binding': exp }); });
+  var args = exps.map(function (exp, i) {
+    var key = "$_" + (i + 1);
+    innerHandlerCode = innerHandlerCode.replace(exp, key);
+    return key
+  });
+  args.push('$event');
+  return '{\n' +
+    "handler:function(" + (args.join(',')) + "){" + innerHandlerCode + "},\n" +
+    "params:" + (JSON.stringify(bindings)) + "\n" +
+    '}'
+}
+
+function genHandler (
+  name,
+  handler
+) {
+  if (!handler) {
+    return 'function(){}'
+  }
+
+  if (Array.isArray(handler)) {
+    return ("[" + (handler.map(function (handler) { return genHandler(name, handler); }).join(',')) + "]")
+  }
+
+  var isMethodPath = simplePathRE.test(handler.value);
+  var isFunctionExpression = fnExpRE.test(handler.value);
+
+  if (!handler.modifiers) {
+    if (isMethodPath || isFunctionExpression) {
+      return handler.value
+    }
+    /* istanbul ignore if */
+    if (true && handler.params) {
+      return genWeexHandler(handler.params, handler.value)
+    }
+    return ("function($event){" + (handler.value) + "}") // inline statement
+  } else {
+    var code = '';
+    var genModifierCode = '';
+    var keys = [];
+    for (var key in handler.modifiers) {
+      if (modifierCode[key]) {
+        genModifierCode += modifierCode[key];
+        // left/right
+        if (keyCodes[key]) {
+          keys.push(key);
+        }
+      } else if (key === 'exact') {
+        var modifiers = (handler.modifiers);
+        genModifierCode += genGuard(
+          ['ctrl', 'shift', 'alt', 'meta']
+            .filter(function (keyModifier) { return !modifiers[keyModifier]; })
+            .map(function (keyModifier) { return ("$event." + keyModifier + "Key"); })
+            .join('||')
+        );
+      } else {
+        keys.push(key);
+      }
+    }
+    if (keys.length) {
+      code += genKeyFilter(keys);
+    }
+    // Make sure modifiers like prevent and stop get executed after key filtering
+    if (genModifierCode) {
+      code += genModifierCode;
+    }
+    var handlerCode = isMethodPath
+      ? ("return " + (handler.value) + "($event)")
+      : isFunctionExpression
+        ? ("return (" + (handler.value) + ")($event)")
+        : handler.value;
+    /* istanbul ignore if */
+    if (true && handler.params) {
+      return genWeexHandler(handler.params, code + handlerCode)
+    }
+    return ("function($event){" + code + handlerCode + "}")
+  }
+}
+
+function genKeyFilter (keys) {
+  return ("if(!('button' in $event)&&" + (keys.map(genFilterCode).join('&&')) + ")return null;")
+}
+
+function genFilterCode (key) {
+  var keyVal = parseInt(key, 10);
+  if (keyVal) {
+    return ("$event.keyCode!==" + keyVal)
+  }
+  var keyCode = keyCodes[key];
+  var keyName = keyNames[key];
+  return (
+    "_k($event.keyCode," +
+    (JSON.stringify(key)) + "," +
+    (JSON.stringify(keyCode)) + "," +
+    "$event.key," +
+    "" + (JSON.stringify(keyName)) +
+    ")"
+  )
+}
+
+/*  */
+
+/**
+ * Check if a string starts with $ or _
+ */
+
+
+/**
+ * Define a property.
+ */
+function def (obj, key, val, enumerable) {
+  Object.defineProperty(obj, key, {
+    value: val,
+    enumerable: !!enumerable,
+    writable: true,
+    configurable: true
+  });
+}
+
+var ASSET_TYPES = [
+  'component',
+  'directive',
+  'filter'
+];
+
+var LIFECYCLE_HOOKS = [
+  'beforeCreate',
+  'created',
+  'beforeMount',
+  'mounted',
+  'beforeUpdate',
+  'updated',
+  'beforeDestroy',
+  'destroyed',
+  'activated',
+  'deactivated',
+  'errorCaptured'
+];
+
+/*  */
+
+var config = ({
+  /**
+   * Option merge strategies (used in core/util/options)
+   */
+  // $flow-disable-line
+  optionMergeStrategies: Object.create(null),
+
+  /**
+   * Whether to suppress warnings.
+   */
+  silent: false,
+
+  /**
+   * Show production mode tip message on boot?
+   */
+  productionTip: process.env.NODE_ENV !== 'production',
+
+  /**
+   * Whether to enable devtools
+   */
+  devtools: process.env.NODE_ENV !== 'production',
+
+  /**
+   * Whether to record perf
+   */
+  performance: false,
+
+  /**
+   * Error handler for watcher errors
+   */
+  errorHandler: null,
+
+  /**
+   * Warn handler for watcher warns
+   */
+  warnHandler: null,
+
+  /**
+   * Ignore certain custom elements
+   */
+  ignoredElements: [],
+
+  /**
+   * Custom user key aliases for v-on
+   */
+  // $flow-disable-line
+  keyCodes: Object.create(null),
+
+  /**
+   * Check if a tag is reserved so that it cannot be registered as a
+   * component. This is platform-dependent and may be overwritten.
+   */
+  isReservedTag: no,
+
+  /**
+   * Check if an attribute is reserved so that it cannot be used as a component
+   * prop. This is platform-dependent and may be overwritten.
+   */
+  isReservedAttr: no,
+
+  /**
+   * Check if a tag is an unknown element.
+   * Platform-dependent.
+   */
+  isUnknownElement: no,
+
+  /**
+   * Get the namespace of an element
+   */
+  getTagNamespace: noop,
+
+  /**
+   * Parse the real tag name for the specific platform.
+   */
+  parsePlatformTagName: identity,
+
+  /**
+   * Check if an attribute must be bound using property, e.g. value
+   * Platform-dependent.
+   */
+  mustUseProp: no,
+
+  /**
+   * Exposed for legacy reasons
+   */
+  _lifecycleHooks: LIFECYCLE_HOOKS
+})
+
+/*  */
+
+var warn$1 = noop;
+var tip = noop;
+var generateComponentTrace = (noop); // work around flow check
+var formatComponentName = (noop);
+
+if (process.env.NODE_ENV !== 'production') {
+  var hasConsole = typeof console !== 'undefined';
+  var classifyRE = /(?:^|[-_])(\w)/g;
+  var classify = function (str) { return str
+    .replace(classifyRE, function (c) { return c.toUpperCase(); })
+    .replace(/[-_]/g, ''); };
+
+  warn$1 = function (msg, vm) {
+    var trace = vm ? generateComponentTrace(vm) : '';
+
+    if (config.warnHandler) {
+      config.warnHandler.call(null, msg, vm, trace);
+    } else if (hasConsole && (!config.silent)) {
+      console.error(("[Vue warn]: " + msg + trace));
+    }
+  };
+
+  tip = function (msg, vm) {
+    if (hasConsole && (!config.silent)) {
+      console.warn("[Vue tip]: " + msg + (
+        vm ? generateComponentTrace(vm) : ''
+      ));
+    }
+  };
+
+  formatComponentName = function (vm, includeFile) {
+    if (vm.$root === vm) {
+      return '<Root>'
+    }
+    var options = typeof vm === 'function' && vm.cid != null
+      ? vm.options
+      : vm._isVue
+        ? vm.$options || vm.constructor.options
+        : vm || {};
+    var name = options.name || options._componentTag;
+    var file = options.__file;
+    if (!name && file) {
+      var match = file.match(/([^/\\]+)\.vue$/);
+      name = match && match[1];
+    }
+
+    return (
+      (name ? ("<" + (classify(name)) + ">") : "<Anonymous>") +
+      (file && includeFile !== false ? (" at " + file) : '')
+    )
+  };
+
+  var repeat = function (str, n) {
+    var res = '';
+    while (n) {
+      if (n % 2 === 1) { res += str; }
+      if (n > 1) { str += str; }
+      n >>= 1;
+    }
+    return res
+  };
+
+  generateComponentTrace = function (vm) {
+    if (vm._isVue && vm.$parent) {
+      var tree = [];
+      var currentRecursiveSequence = 0;
+      while (vm) {
+        if (tree.length > 0) {
+          var last = tree[tree.length - 1];
+          if (last.constructor === vm.constructor) {
+            currentRecursiveSequence++;
+            vm = vm.$parent;
+            continue
+          } else if (currentRecursiveSequence > 0) {
+            tree[tree.length - 1] = [last, currentRecursiveSequence];
+            currentRecursiveSequence = 0;
+          }
+        }
+        tree.push(vm);
+        vm = vm.$parent;
+      }
+      return '\n\nfound in\n\n' + tree
+        .map(function (vm, i) { return ("" + (i === 0 ? '---> ' : repeat(' ', 5 + i * 2)) + (Array.isArray(vm)
+            ? ((formatComponentName(vm[0])) + "... (" + (vm[1]) + " recursive calls)")
+            : formatComponentName(vm))); })
+        .join('\n')
+    } else {
+      return ("\n\n(found in " + (formatComponentName(vm)) + ")")
+    }
+  };
+}
+
+/*  */
+
+
+var uid = 0;
+
+/**
+ * A dep is an observable that can have multiple
+ * directives subscribing to it.
+ */
+var Dep = function Dep () {
+  this.id = uid++;
+  this.subs = [];
+};
+
+Dep.prototype.addSub = function addSub (sub) {
+  this.subs.push(sub);
+};
+
+Dep.prototype.removeSub = function removeSub (sub) {
+  remove(this.subs, sub);
+};
+
+Dep.prototype.depend = function depend () {
+  if (Dep.target) {
+    Dep.target.addDep(this);
+  }
+};
+
+Dep.prototype.notify = function notify () {
+  // stabilize the subscriber list first
+  var subs = this.subs.slice();
+  for (var i = 0, l = subs.length; i < l; i++) {
+    subs[i].update();
+  }
+};
+
+// the current target watcher being evaluated.
+// this is globally unique because there could be only one
+// watcher being evaluated at any time.
+Dep.target = null;
+
+/*  */
+
+var VNode = function VNode (
+  tag,
+  data,
+  children,
+  text,
+  elm,
+  context,
+  componentOptions,
+  asyncFactory
+) {
+  this.tag = tag;
+  this.data = data;
+  this.children = children;
+  this.text = text;
+  this.elm = elm;
+  this.ns = undefined;
+  this.context = context;
+  this.fnContext = undefined;
+  this.fnOptions = undefined;
+  this.fnScopeId = undefined;
+  this.key = data && data.key;
+  this.componentOptions = componentOptions;
+  this.componentInstance = undefined;
+  this.parent = undefined;
+  this.raw = false;
+  this.isStatic = false;
+  this.isRootInsert = true;
+  this.isComment = false;
+  this.isCloned = false;
+  this.isOnce = false;
+  this.asyncFactory = asyncFactory;
+  this.asyncMeta = undefined;
+  this.isAsyncPlaceholder = false;
+};
+
+var prototypeAccessors = { child: { configurable: true } };
+
+// DEPRECATED: alias for componentInstance for backwards compat.
+/* istanbul ignore next */
+prototypeAccessors.child.get = function () {
+  return this.componentInstance
+};
+
+Object.defineProperties( VNode.prototype, prototypeAccessors );
+
+
+
+
+
+// optimized shallow clone
+// used for static nodes and slot nodes because they may be reused across
+// multiple renders, cloning them avoids errors when DOM manipulations rely
+// on their elm reference.
+
+/*
+ * not type checking this file because flow doesn't play well with
+ * dynamically accessing methods on Array prototype
+ */
+
+var arrayProto = Array.prototype;
+var arrayMethods = Object.create(arrayProto);
+
+var methodsToPatch = [
+  'push',
+  'pop',
+  'shift',
+  'unshift',
+  'splice',
+  'sort',
+  'reverse'
+];
+
+/**
+ * Intercept mutating methods and emit events
+ */
+methodsToPatch.forEach(function (method) {
+  // cache original method
+  var original = arrayProto[method];
+  def(arrayMethods, method, function mutator () {
+    var args = [], len = arguments.length;
+    while ( len-- ) args[ len ] = arguments[ len ];
+
+    var result = original.apply(this, args);
+    var ob = this.__ob__;
+    var inserted;
+    switch (method) {
+      case 'push':
+      case 'unshift':
+        inserted = args;
+        break
+      case 'splice':
+        inserted = args.slice(2);
+        break
+    }
+    if (inserted) { ob.observeArray(inserted); }
+    // notify change
+    ob.dep.notify();
+    return result
+  });
+});
+
+/*  */
+
+var arrayKeys = Object.getOwnPropertyNames(arrayMethods);
+
+/**
+ * In some cases we may want to disable observation inside a component's
+ * update computation.
+ */
+var shouldObserve = true;
+
+
+
+/**
+ * Observer class that is attached to each observed
+ * object. Once attached, the observer converts the target
+ * object's property keys into getter/setters that
+ * collect dependencies and dispatch updates.
+ */
+var Observer = function Observer (value) {
+  this.value = value;
+  this.dep = new Dep();
+  this.vmCount = 0;
+  def(value, '__ob__', this);
+  if (Array.isArray(value)) {
+    var augment = hasProto
+      ? protoAugment
+      : copyAugment;
+    augment(value, arrayMethods, arrayKeys);
+    this.observeArray(value);
+  } else {
+    this.walk(value);
+  }
+};
+
+/**
+ * Walk through each property and convert them into
+ * getter/setters. This method should only be called when
+ * value type is Object.
+ */
+Observer.prototype.walk = function walk (obj) {
+  var keys = Object.keys(obj);
+  for (var i = 0; i < keys.length; i++) {
+    defineReactive(obj, keys[i]);
+  }
+};
+
+/**
+ * Observe a list of Array items.
+ */
+Observer.prototype.observeArray = function observeArray (items) {
+  for (var i = 0, l = items.length; i < l; i++) {
+    observe(items[i]);
+  }
+};
+
+// helpers
+
+/**
+ * Augment an target Object or Array by intercepting
+ * the prototype chain using __proto__
+ */
+function protoAugment (target, src, keys) {
+  /* eslint-disable no-proto */
+  target.__proto__ = src;
+  /* eslint-enable no-proto */
+}
+
+/**
+ * Augment an target Object or Array by defining
+ * hidden properties.
+ */
+/* istanbul ignore next */
+function copyAugment (target, src, keys) {
+  for (var i = 0, l = keys.length; i < l; i++) {
+    var key = keys[i];
+    def(target, key, src[key]);
+  }
+}
+
+/**
+ * Attempt to create an observer instance for a value,
+ * returns the new observer if successfully observed,
+ * or the existing observer if the value already has one.
+ */
+function observe (value, asRootData) {
+  if (!isObject(value) || value instanceof VNode) {
+    return
+  }
+  var ob;
+  if (hasOwn(value, '__ob__') && value.__ob__ instanceof Observer) {
+    ob = value.__ob__;
+  } else if (
+    shouldObserve &&
+    !isServerRendering() &&
+    (Array.isArray(value) || isPlainObject(value)) &&
+    Object.isExtensible(value) &&
+    !value._isVue
+  ) {
+    ob = new Observer(value);
+  }
+  if (asRootData && ob) {
+    ob.vmCount++;
+  }
+  return ob
+}
+
+/**
+ * Define a reactive property on an Object.
+ */
+function defineReactive (
+  obj,
+  key,
+  val,
+  customSetter,
+  shallow
+) {
+  var dep = new Dep();
+
+  var property = Object.getOwnPropertyDescriptor(obj, key);
+  if (property && property.configurable === false) {
+    return
+  }
+
+  // cater for pre-defined getter/setters
+  var getter = property && property.get;
+  if (!getter && arguments.length === 2) {
+    val = obj[key];
+  }
+  var setter = property && property.set;
+
+  var childOb = !shallow && observe(val);
+  Object.defineProperty(obj, key, {
+    enumerable: true,
+    configurable: true,
+    get: function reactiveGetter () {
+      var value = getter ? getter.call(obj) : val;
+      if (Dep.target) {
+        dep.depend();
+        if (childOb) {
+          childOb.dep.depend();
+          if (Array.isArray(value)) {
+            dependArray(value);
+          }
+        }
+      }
+      return value
+    },
+    set: function reactiveSetter (newVal) {
+      var value = getter ? getter.call(obj) : val;
+      /* eslint-disable no-self-compare */
+      if (newVal === value || (newVal !== newVal && value !== value)) {
+        return
+      }
+      /* eslint-enable no-self-compare */
+      if (process.env.NODE_ENV !== 'production' && customSetter) {
+        customSetter();
+      }
+      if (setter) {
+        setter.call(obj, newVal);
+      } else {
+        val = newVal;
+      }
+      childOb = !shallow && observe(newVal);
+      dep.notify();
+    }
+  });
+}
+
+/**
+ * Set a property on an object. Adds the new property and
+ * triggers change notification if the property doesn't
+ * already exist.
+ */
+function set (target, key, val) {
+  if (process.env.NODE_ENV !== 'production' &&
+    (isUndef(target) || isPrimitive(target))
+  ) {
+    warn$1(("Cannot set reactive property on undefined, null, or primitive value: " + ((target))));
+  }
+  if (Array.isArray(target) && isValidArrayIndex(key)) {
+    target.length = Math.max(target.length, key);
+    target.splice(key, 1, val);
+    return val
+  }
+  if (key in target && !(key in Object.prototype)) {
+    target[key] = val;
+    return val
+  }
+  var ob = (target).__ob__;
+  if (target._isVue || (ob && ob.vmCount)) {
+    process.env.NODE_ENV !== 'production' && warn$1(
+      'Avoid adding reactive properties to a Vue instance or its root $data ' +
+      'at runtime - declare it upfront in the data option.'
+    );
+    return val
+  }
+  if (!ob) {
+    target[key] = val;
+    return val
+  }
+  defineReactive(ob.value, key, val);
+  ob.dep.notify();
+  return val
+}
+
+/**
+ * Delete a property and trigger change if necessary.
+ */
+
+
+/**
+ * Collect dependencies on array elements when the array is touched, since
+ * we cannot intercept array element access like property getters.
+ */
+function dependArray (value) {
+  for (var e = (void 0), i = 0, l = value.length; i < l; i++) {
+    e = value[i];
+    e && e.__ob__ && e.__ob__.dep.depend();
+    if (Array.isArray(e)) {
+      dependArray(e);
+    }
+  }
+}
+
+/*  */
+
+/**
+ * Option overwriting strategies are functions that handle
+ * how to merge a parent option value and a child option
+ * value into the final value.
+ */
+var strats = config.optionMergeStrategies;
+
+/**
+ * Options with restrictions
+ */
+if (process.env.NODE_ENV !== 'production') {
+  strats.el = strats.propsData = function (parent, child, vm, key) {
+    if (!vm) {
+      warn$1(
+        "option \"" + key + "\" can only be used during instance " +
+        'creation with the `new` keyword.'
+      );
+    }
+    return defaultStrat(parent, child)
+  };
+}
+
+/**
+ * Helper that recursively merges two data objects together.
+ */
+function mergeData (to, from) {
+  if (!from) { return to }
+  var key, toVal, fromVal;
+  var keys = Object.keys(from);
+  for (var i = 0; i < keys.length; i++) {
+    key = keys[i];
+    toVal = to[key];
+    fromVal = from[key];
+    if (!hasOwn(to, key)) {
+      set(to, key, fromVal);
+    } else if (isPlainObject(toVal) && isPlainObject(fromVal)) {
+      mergeData(toVal, fromVal);
+    }
+  }
+  return to
+}
+
+/**
+ * Data
+ */
+function mergeDataOrFn (
+  parentVal,
+  childVal,
+  vm
+) {
+  if (!vm) {
+    // in a Vue.extend merge, both should be functions
+    if (!childVal) {
+      return parentVal
+    }
+    if (!parentVal) {
+      return childVal
+    }
+    // when parentVal & childVal are both present,
+    // we need to return a function that returns the
+    // merged result of both functions... no need to
+    // check if parentVal is a function here because
+    // it has to be a function to pass previous merges.
+    return function mergedDataFn () {
+      return mergeData(
+        typeof childVal === 'function' ? childVal.call(this, this) : childVal,
+        typeof parentVal === 'function' ? parentVal.call(this, this) : parentVal
+      )
+    }
+  } else {
+    return function mergedInstanceDataFn () {
+      // instance merge
+      var instanceData = typeof childVal === 'function'
+        ? childVal.call(vm, vm)
+        : childVal;
+      var defaultData = typeof parentVal === 'function'
+        ? parentVal.call(vm, vm)
+        : parentVal;
+      if (instanceData) {
+        return mergeData(instanceData, defaultData)
+      } else {
+        return defaultData
+      }
+    }
+  }
+}
+
+strats.data = function (
+  parentVal,
+  childVal,
+  vm
+) {
+  if (!vm) {
+    if (childVal && typeof childVal !== 'function') {
+      process.env.NODE_ENV !== 'production' && warn$1(
+        'The "data" option should be a function ' +
+        'that returns a per-instance value in component ' +
+        'definitions.',
+        vm
+      );
+
+      return parentVal
+    }
+    return mergeDataOrFn(parentVal, childVal)
+  }
+
+  return mergeDataOrFn(parentVal, childVal, vm)
+};
+
+/**
+ * Hooks and props are merged as arrays.
+ */
+function mergeHook (
+  parentVal,
+  childVal
+) {
+  return childVal
+    ? parentVal
+      ? parentVal.concat(childVal)
+      : Array.isArray(childVal)
+        ? childVal
+        : [childVal]
+    : parentVal
+}
+
+LIFECYCLE_HOOKS.forEach(function (hook) {
+  strats[hook] = mergeHook;
+});
+
+/**
+ * Assets
+ *
+ * When a vm is present (instance creation), we need to do
+ * a three-way merge between constructor options, instance
+ * options and parent options.
+ */
+function mergeAssets (
+  parentVal,
+  childVal,
+  vm,
+  key
+) {
+  var res = Object.create(parentVal || null);
+  if (childVal) {
+    process.env.NODE_ENV !== 'production' && assertObjectType(key, childVal, vm);
+    return extend(res, childVal)
+  } else {
+    return res
+  }
+}
+
+ASSET_TYPES.forEach(function (type) {
+  strats[type + 's'] = mergeAssets;
+});
+
+/**
+ * Watchers.
+ *
+ * Watchers hashes should not overwrite one
+ * another, so we merge them as arrays.
+ */
+strats.watch = function (
+  parentVal,
+  childVal,
+  vm,
+  key
+) {
+  // work around Firefox's Object.prototype.watch...
+  if (parentVal === nativeWatch) { parentVal = undefined; }
+  if (childVal === nativeWatch) { childVal = undefined; }
+  /* istanbul ignore if */
+  if (!childVal) { return Object.create(parentVal || null) }
+  if (process.env.NODE_ENV !== 'production') {
+    assertObjectType(key, childVal, vm);
+  }
+  if (!parentVal) { return childVal }
+  var ret = {};
+  extend(ret, parentVal);
+  for (var key$1 in childVal) {
+    var parent = ret[key$1];
+    var child = childVal[key$1];
+    if (parent && !Array.isArray(parent)) {
+      parent = [parent];
+    }
+    ret[key$1] = parent
+      ? parent.concat(child)
+      : Array.isArray(child) ? child : [child];
+  }
+  return ret
+};
+
+/**
+ * Other object hashes.
+ */
+strats.props =
+strats.methods =
+strats.inject =
+strats.computed = function (
+  parentVal,
+  childVal,
+  vm,
+  key
+) {
+  if (childVal && process.env.NODE_ENV !== 'production') {
+    assertObjectType(key, childVal, vm);
+  }
+  if (!parentVal) { return childVal }
+  var ret = Object.create(null);
+  extend(ret, parentVal);
+  if (childVal) { extend(ret, childVal); }
+  return ret
+};
+strats.provide = mergeDataOrFn;
+
+/**
+ * Default strategy.
+ */
+var defaultStrat = function (parentVal, childVal) {
+  return childVal === undefined
+    ? parentVal
+    : childVal
+};
+
+
+
+function assertObjectType (name, value, vm) {
+  if (!isPlainObject(value)) {
+    warn$1(
+      "Invalid value for option \"" + name + "\": expected an Object, " +
+      "but got " + (toRawType(value)) + ".",
+      vm
+    );
+  }
+}
+
+/**
+ * Merge two option objects into a new one.
+ * Core utility used in both instantiation and inheritance.
+ */
+
+
+/**
+ * Resolve an asset.
+ * This function is used because child instances need access
+ * to assets defined in its ancestor chain.
+ */
+
+/*  */
+
+/*  */
+
+/*  */
+/* globals MessageChannel */
+
+var callbacks = [];
+function flushCallbacks () {
+  var copies = callbacks.slice(0);
+  callbacks.length = 0;
+  for (var i = 0; i < copies.length; i++) {
+    copies[i]();
+  }
+}
+
+// Determine (macro) task defer implementation.
+// Technically setImmediate should be the ideal choice, but it's only available
+// in IE. The only polyfill that consistently queues the callback after all DOM
+// events triggered in the same loop is by using MessageChannel.
+/* istanbul ignore if */
+if (typeof setImmediate !== 'undefined' && isNative(setImmediate)) {
+  
+} else if (typeof MessageChannel !== 'undefined' && (
+  isNative(MessageChannel) ||
+  // PhantomJS
+  MessageChannel.toString() === '[object MessageChannelConstructor]'
+)) {
+  var channel = new MessageChannel();
+  channel.port1.onmessage = flushCallbacks;
+  
+} else {
+  /* istanbul ignore next */
+  
+}
+
+// Determine microtask defer implementation.
+/* istanbul ignore next, $flow-disable-line */
+if (typeof Promise !== 'undefined' && isNative(Promise)) {
+  
+} else {
+  // fallback to macro
+  
+}
+
+/**
+ * Wrap a function so that if any code inside triggers state change,
+ * the changes are queued using a (macro) task instead of a microtask.
+ */
+
+/*  */
+
+/*  */
+
+function on (el, dir) {
+  if (process.env.NODE_ENV !== 'production' && dir.modifiers) {
+    warn$1("v-on without argument does not support modifiers.");
+  }
+  el.wrapListeners = function (code) { return ("_g(" + code + "," + (dir.value) + ")"); };
+}
+
+/*  */
+
+function bind$1 (el, dir) {
+  el.wrapData = function (code) {
+    return ("_b(" + code + ",'" + (el.tag) + "'," + (dir.value) + "," + (dir.modifiers && dir.modifiers.prop ? 'true' : 'false') + (dir.modifiers && dir.modifiers.sync ? ',true' : '') + ")")
+  };
+}
+
+/*  */
+
+var baseDirectives = {
+  on: on,
+  bind: bind$1,
+  cloak: noop
+}
+
+/*  */
+
+var CodegenState = function CodegenState (options) {
+  this.options = options;
+  this.warn = options.warn || baseWarn;
+  this.transforms = pluckModuleFunction(options.modules, 'transformCode');
+  this.dataGenFns = pluckModuleFunction(options.modules, 'genData');
+  this.directives = extend(extend({}, baseDirectives), options.directives);
+  var isReservedTag = options.isReservedTag || no;
+  this.maybeComponent = function (el) { return !isReservedTag(el.tag); };
+  this.onceId = 0;
+  this.staticRenderFns = [];
+};
+
+
+
+function generate (
+  ast,
+  options
+) {
+  var state = new CodegenState(options);
+  var code = ast ? genElement(ast, state) : '_c("div")';
+  return {
+    render: ("with(this){return " + code + "}"),
+    staticRenderFns: state.staticRenderFns
+  }
+}
+
+function genElement (el, state) {
+  if (el.staticRoot && !el.staticProcessed) {
+    return genStatic(el, state)
+  } else if (el.once && !el.onceProcessed) {
+    return genOnce(el, state)
+  } else if (el.for && !el.forProcessed) {
+    return genFor(el, state)
+  } else if (el.if && !el.ifProcessed) {
+    return genIf(el, state)
+  } else if (el.tag === 'template' && !el.slotTarget) {
+    return genChildren(el, state) || 'void 0'
+  } else if (el.tag === 'slot') {
+    return genSlot(el, state)
+  } else {
+    // component or element
+    var code;
+    if (el.component) {
+      code = genComponent(el.component, el, state);
+    } else {
+      var data = el.plain ? undefined : genData(el, state);
+
+      var children = el.inlineTemplate ? null : genChildren(el, state, true);
+      code = "_c('" + (el.tag) + "'" + (data ? ("," + data) : '') + (children ? ("," + children) : '') + ")";
+    }
+    // module transforms
+    for (var i = 0; i < state.transforms.length; i++) {
+      code = state.transforms[i](el, code);
+    }
+    return code
+  }
+}
+
+// hoist static sub-trees out
+function genStatic (el, state) {
+  el.staticProcessed = true;
+  state.staticRenderFns.push(("with(this){return " + (genElement(el, state)) + "}"));
+  return ("_m(" + (state.staticRenderFns.length - 1) + (el.staticInFor ? ',true' : '') + ")")
+}
+
+// v-once
+function genOnce (el, state) {
+  el.onceProcessed = true;
+  if (el.if && !el.ifProcessed) {
+    return genIf(el, state)
+  } else if (el.staticInFor) {
+    var key = '';
+    var parent = el.parent;
+    while (parent) {
+      if (parent.for) {
+        key = parent.key;
+        break
+      }
+      parent = parent.parent;
+    }
+    if (!key) {
+      process.env.NODE_ENV !== 'production' && state.warn(
+        "v-once can only be used inside v-for that is keyed. "
+      );
+      return genElement(el, state)
+    }
+    return ("_o(" + (genElement(el, state)) + "," + (state.onceId++) + "," + key + ")")
+  } else {
+    return genStatic(el, state)
+  }
+}
+
+function genIf (
+  el,
+  state,
+  altGen,
+  altEmpty
+) {
+  el.ifProcessed = true; // avoid recursion
+  return genIfConditions(el.ifConditions.slice(), state, altGen, altEmpty)
+}
+
+function genIfConditions (
+  conditions,
+  state,
+  altGen,
+  altEmpty
+) {
+  if (!conditions.length) {
+    return altEmpty || '_e()'
+  }
+
+  var condition = conditions.shift();
+  if (condition.exp) {
+    return ("(" + (condition.exp) + ")?" + (genTernaryExp(condition.block)) + ":" + (genIfConditions(conditions, state, altGen, altEmpty)))
+  } else {
+    return ("" + (genTernaryExp(condition.block)))
+  }
+
+  // v-if with v-once should generate code like (a)?_m(0):_m(1)
+  function genTernaryExp (el) {
+    return altGen
+      ? altGen(el, state)
+      : el.once
+        ? genOnce(el, state)
+        : genElement(el, state)
+  }
+}
+
+function genFor (
+  el,
+  state,
+  altGen,
+  altHelper
+) {
+  var exp = el.for;
+  var alias = el.alias;
+  var iterator1 = el.iterator1 ? ("," + (el.iterator1)) : '';
+  var iterator2 = el.iterator2 ? ("," + (el.iterator2)) : '';
+
+  if (process.env.NODE_ENV !== 'production' &&
+    state.maybeComponent(el) &&
+    el.tag !== 'slot' &&
+    el.tag !== 'template' &&
+    !el.key
+  ) {
+    state.warn(
+      "<" + (el.tag) + " v-for=\"" + alias + " in " + exp + "\">: component lists rendered with " +
+      "v-for should have explicit keys. " +
+      "See https://vuejs.org/guide/list.html#key for more info.",
+      true /* tip */
+    );
+  }
+
+  el.forProcessed = true; // avoid recursion
+  return (altHelper || '_l') + "((" + exp + ")," +
+    "function(" + alias + iterator1 + iterator2 + "){" +
+      "return " + ((altGen || genElement)(el, state)) +
+    '})'
+}
+
+function genData (el, state) {
+  var data = '{';
+
+  // directives first.
+  // directives may mutate the el's other properties before they are generated.
+  var dirs = genDirectives(el, state);
+  if (dirs) { data += dirs + ','; }
+
+  // key
+  if (el.key) {
+    data += "key:" + (el.key) + ",";
+  }
+  // ref
+  if (el.ref) {
+    data += "ref:" + (el.ref) + ",";
+  }
+  if (el.refInFor) {
+    data += "refInFor:true,";
+  }
+  // pre
+  if (el.pre) {
+    data += "pre:true,";
+  }
+  // record original tag name for components using "is" attribute
+  if (el.component) {
+    data += "tag:\"" + (el.tag) + "\",";
+  }
+  // module data generation functions
+  for (var i = 0; i < state.dataGenFns.length; i++) {
+    data += state.dataGenFns[i](el);
+  }
+  // attributes
+  if (el.attrs) {
+    data += "attrs:{" + (genProps(el.attrs)) + "},";
+  }
+  // DOM props
+  if (el.props) {
+    data += "domProps:{" + (genProps(el.props)) + "},";
+  }
+  // event handlers
+  if (el.events) {
+    data += (genHandlers(el.events, false, state.warn)) + ",";
+  }
+  if (el.nativeEvents) {
+    data += (genHandlers(el.nativeEvents, true, state.warn)) + ",";
+  }
+  // slot target
+  // only for non-scoped slots
+  if (el.slotTarget && !el.slotScope) {
+    data += "slot:" + (el.slotTarget) + ",";
+  }
+  // scoped slots
+  if (el.scopedSlots) {
+    data += (genScopedSlots(el.scopedSlots, state)) + ",";
+  }
+  // component v-model
+  if (el.model) {
+    data += "model:{value:" + (el.model.value) + ",callback:" + (el.model.callback) + ",expression:" + (el.model.expression) + "},";
+  }
+  // inline-template
+  if (el.inlineTemplate) {
+    var inlineTemplate = genInlineTemplate(el, state);
+    if (inlineTemplate) {
+      data += inlineTemplate + ",";
+    }
+  }
+  data = data.replace(/,$/, '') + '}';
+  // v-bind data wrap
+  if (el.wrapData) {
+    data = el.wrapData(data);
+  }
+  // v-on data wrap
+  if (el.wrapListeners) {
+    data = el.wrapListeners(data);
+  }
+  return data
+}
+
+function genDirectives (el, state) {
+  var dirs = el.directives;
+  if (!dirs) { return }
+  var res = 'directives:[';
+  var hasRuntime = false;
+  var i, l, dir, needRuntime;
+  for (i = 0, l = dirs.length; i < l; i++) {
+    dir = dirs[i];
+    needRuntime = true;
+    var gen = state.directives[dir.name];
+    if (gen) {
+      // compile-time directive that manipulates AST.
+      // returns true if it also needs a runtime counterpart.
+      needRuntime = !!gen(el, dir, state.warn);
+    }
+    if (needRuntime) {
+      hasRuntime = true;
+      res += "{name:\"" + (dir.name) + "\",rawName:\"" + (dir.rawName) + "\"" + (dir.value ? (",value:(" + (dir.value) + "),expression:" + (JSON.stringify(dir.value))) : '') + (dir.arg ? (",arg:\"" + (dir.arg) + "\"") : '') + (dir.modifiers ? (",modifiers:" + (JSON.stringify(dir.modifiers))) : '') + "},";
+    }
+  }
+  if (hasRuntime) {
+    return res.slice(0, -1) + ']'
+  }
+}
+
+function genInlineTemplate (el, state) {
+  var ast = el.children[0];
+  if (process.env.NODE_ENV !== 'production' && (
+    el.children.length !== 1 || ast.type !== 1
+  )) {
+    state.warn('Inline-template components must have exactly one child element.');
+  }
+  if (ast.type === 1) {
+    var inlineRenderFns = generate(ast, state.options);
+    return ("inlineTemplate:{render:function(){" + (inlineRenderFns.render) + "},staticRenderFns:[" + (inlineRenderFns.staticRenderFns.map(function (code) { return ("function(){" + code + "}"); }).join(',')) + "]}")
+  }
+}
+
+function genScopedSlots (
+  slots,
+  state
+) {
+  return ("scopedSlots:_u([" + (Object.keys(slots).map(function (key) {
+      return genScopedSlot(key, slots[key], state)
+    }).join(',')) + "])")
+}
+
+function genScopedSlot (
+  key,
+  el,
+  state
+) {
+  if (el.for && !el.forProcessed) {
+    return genForScopedSlot(key, el, state)
+  }
+  var fn = "function(" + (String(el.slotScope)) + "){" +
+    "return " + (el.tag === 'template'
+      ? el.if
+        ? ((el.if) + "?" + (genChildren(el, state) || 'undefined') + ":undefined")
+        : genChildren(el, state) || 'undefined'
+      : genElement(el, state)) + "}";
+  return ("{key:" + key + ",fn:" + fn + "}")
+}
+
+function genForScopedSlot (
+  key,
+  el,
+  state
+) {
+  var exp = el.for;
+  var alias = el.alias;
+  var iterator1 = el.iterator1 ? ("," + (el.iterator1)) : '';
+  var iterator2 = el.iterator2 ? ("," + (el.iterator2)) : '';
+  el.forProcessed = true; // avoid recursion
+  return "_l((" + exp + ")," +
+    "function(" + alias + iterator1 + iterator2 + "){" +
+      "return " + (genScopedSlot(key, el, state)) +
+    '})'
+}
+
+function genChildren (
+  el,
+  state,
+  checkSkip,
+  altGenElement,
+  altGenNode
+) {
+  var children = el.children;
+  if (children.length) {
+    var el$1 = children[0];
+    // optimize single v-for
+    if (children.length === 1 &&
+      el$1.for &&
+      el$1.tag !== 'template' &&
+      el$1.tag !== 'slot'
+    ) {
+      return (altGenElement || genElement)(el$1, state)
+    }
+    var normalizationType = checkSkip
+      ? getNormalizationType(children, state.maybeComponent)
+      : 0;
+    var gen = altGenNode || genNode;
+    return ("[" + (children.map(function (c) { return gen(c, state); }).join(',')) + "]" + (normalizationType ? ("," + normalizationType) : ''))
+  }
+}
+
+// determine the normalization needed for the children array.
+// 0: no normalization needed
+// 1: simple normalization needed (possible 1-level deep nested array)
+// 2: full normalization needed
+function getNormalizationType (
+  children,
+  maybeComponent
+) {
+  var res = 0;
+  for (var i = 0; i < children.length; i++) {
+    var el = children[i];
+    if (el.type !== 1) {
+      continue
+    }
+    if (needsNormalization(el) ||
+        (el.ifConditions && el.ifConditions.some(function (c) { return needsNormalization(c.block); }))) {
+      res = 2;
+      break
+    }
+    if (maybeComponent(el) ||
+        (el.ifConditions && el.ifConditions.some(function (c) { return maybeComponent(c.block); }))) {
+      res = 1;
+    }
+  }
+  return res
+}
+
+function needsNormalization (el) {
+  return el.for !== undefined || el.tag === 'template' || el.tag === 'slot'
+}
+
+function genNode (node, state) {
+  if (node.type === 1) {
+    return genElement(node, state)
+  } if (node.type === 3 && node.isComment) {
+    return genComment(node)
+  } else {
+    return genText(node)
+  }
+}
+
+function genText (text) {
+  return ("_v(" + (text.type === 2
+    ? text.expression // no need for () because already wrapped in _s()
+    : transformSpecialNewlines(JSON.stringify(text.text))) + ")")
+}
+
+function genComment (comment) {
+  return ("_e(" + (JSON.stringify(comment.text)) + ")")
+}
+
+function genSlot (el, state) {
+  var slotName = el.slotName || '"default"';
+  var children = genChildren(el, state);
+  var res = "_t(" + slotName + (children ? ("," + children) : '');
+  var attrs = el.attrs && ("{" + (el.attrs.map(function (a) { return ((camelize(a.name)) + ":" + (a.value)); }).join(',')) + "}");
+  var bind$$1 = el.attrsMap['v-bind'];
+  if ((attrs || bind$$1) && !children) {
+    res += ",null";
+  }
+  if (attrs) {
+    res += "," + attrs;
+  }
+  if (bind$$1) {
+    res += (attrs ? '' : ',null') + "," + bind$$1;
+  }
+  return res + ')'
+}
+
+// componentName is el.component, take it as argument to shun flow's pessimistic refinement
+function genComponent (
+  componentName,
+  el,
+  state
+) {
+  var children = el.inlineTemplate ? null : genChildren(el, state, true);
+  return ("_c(" + componentName + "," + (genData(el, state)) + (children ? ("," + children) : '') + ")")
+}
+
+function genProps (props) {
+  var res = '';
+  for (var i = 0; i < props.length; i++) {
+    var prop = props[i];
+    /* istanbul ignore if */
+    {
+      res += "\"" + (prop.name) + "\":" + (generateValue(prop.value)) + ",";
+    }
+  }
+  return res.slice(0, -1)
+}
+
+/* istanbul ignore next */
+function generateValue (value) {
+  if (typeof value === 'string') {
+    return transformSpecialNewlines(value)
+  }
+  return JSON.stringify(value)
+}
+
+// #3895, #4268
+function transformSpecialNewlines (text) {
+  return text
+    .replace(/\u2028/g, '\\u2028')
+    .replace(/\u2029/g, '\\u2029')
+}
+
+/*  */
+
+// these keywords should not appear inside expressions, but operators like
+// typeof, instanceof and in are allowed
+var prohibitedKeywordRE = new RegExp('\\b' + (
+  'do,if,for,let,new,try,var,case,else,with,await,break,catch,class,const,' +
+  'super,throw,while,yield,delete,export,import,return,switch,default,' +
+  'extends,finally,continue,debugger,function,arguments'
+).split(',').join('\\b|\\b') + '\\b');
+
+// these unary operators should not be used as property/method names
+var unaryOperatorsRE = new RegExp('\\b' + (
+  'delete,typeof,void'
+).split(',').join('\\s*\\([^\\)]*\\)|\\b') + '\\s*\\([^\\)]*\\)');
+
+// strip strings in expressions
+var stripStringRE = /'(?:[^'\\]|\\.)*'|"(?:[^"\\]|\\.)*"|`(?:[^`\\]|\\.)*\$\{|\}(?:[^`\\]|\\.)*`|`(?:[^`\\]|\\.)*`/g;
+
+// detect problematic expressions in a template
+function detectErrors (ast) {
+  var errors = [];
+  if (ast) {
+    checkNode(ast, errors);
+  }
+  return errors
+}
+
+function checkNode (node, errors) {
+  if (node.type === 1) {
+    for (var name in node.attrsMap) {
+      if (dirRE.test(name)) {
+        var value = node.attrsMap[name];
+        if (value) {
+          if (name === 'v-for') {
+            checkFor(node, ("v-for=\"" + value + "\""), errors);
+          } else if (onRE.test(name)) {
+            checkEvent(value, (name + "=\"" + value + "\""), errors);
+          } else {
+            checkExpression(value, (name + "=\"" + value + "\""), errors);
+          }
+        }
+      }
+    }
+    if (node.children) {
+      for (var i = 0; i < node.children.length; i++) {
+        checkNode(node.children[i], errors);
+      }
+    }
+  } else if (node.type === 2) {
+    checkExpression(node.expression, node.text, errors);
+  }
+}
+
+function checkEvent (exp, text, errors) {
+  var stipped = exp.replace(stripStringRE, '');
+  var keywordMatch = stipped.match(unaryOperatorsRE);
+  if (keywordMatch && stipped.charAt(keywordMatch.index - 1) !== '$') {
+    errors.push(
+      "avoid using JavaScript unary operator as property name: " +
+      "\"" + (keywordMatch[0]) + "\" in expression " + (text.trim())
+    );
+  }
+  checkExpression(exp, text, errors);
+}
+
+function checkFor (node, text, errors) {
+  checkExpression(node.for || '', text, errors);
+  checkIdentifier(node.alias, 'v-for alias', text, errors);
+  checkIdentifier(node.iterator1, 'v-for iterator', text, errors);
+  checkIdentifier(node.iterator2, 'v-for iterator', text, errors);
+}
+
+function checkIdentifier (
+  ident,
+  type,
+  text,
+  errors
+) {
+  if (typeof ident === 'string') {
+    try {
+      new Function(("var " + ident + "=_"));
+    } catch (e) {
+      errors.push(("invalid " + type + " \"" + ident + "\" in expression: " + (text.trim())));
+    }
+  }
+}
+
+function checkExpression (exp, text, errors) {
+  try {
+    new Function(("return " + exp));
+  } catch (e) {
+    var keywordMatch = exp.replace(stripStringRE, '').match(prohibitedKeywordRE);
+    if (keywordMatch) {
+      errors.push(
+        "avoid using JavaScript keyword as property name: " +
+        "\"" + (keywordMatch[0]) + "\"\n  Raw expression: " + (text.trim())
+      );
+    } else {
+      errors.push(
+        "invalid expression: " + (e.message) + " in\n\n" +
+        "    " + exp + "\n\n" +
+        "  Raw expression: " + (text.trim()) + "\n"
+      );
+    }
+  }
+}
+
+/*  */
+
+function createFunction (code, errors) {
+  try {
+    return new Function(code)
+  } catch (err) {
+    errors.push({ err: err, code: code });
+    return noop
+  }
+}
+
+function createCompileToFunctionFn (compile) {
+  var cache = Object.create(null);
+
+  return function compileToFunctions (
+    template,
+    options,
+    vm
+  ) {
+    options = extend({}, options);
+    var warn$$1 = options.warn || warn$1;
+    delete options.warn;
+
+    /* istanbul ignore if */
+    if (process.env.NODE_ENV !== 'production') {
+      // detect possible CSP restriction
+      try {
+        new Function('return 1');
+      } catch (e) {
+        if (e.toString().match(/unsafe-eval|CSP/)) {
+          warn$$1(
+            'It seems you are using the standalone build of Vue.js in an ' +
+            'environment with Content Security Policy that prohibits unsafe-eval. ' +
+            'The template compiler cannot work in this environment. Consider ' +
+            'relaxing the policy to allow unsafe-eval or pre-compiling your ' +
+            'templates into render functions.'
+          );
+        }
+      }
+    }
+
+    // check cache
+    var key = options.delimiters
+      ? String(options.delimiters) + template
+      : template;
+    if (cache[key]) {
+      return cache[key]
+    }
+
+    // compile
+    var compiled = compile(template, options);
+
+    // check compilation errors/tips
+    if (process.env.NODE_ENV !== 'production') {
+      if (compiled.errors && compiled.errors.length) {
+        warn$$1(
+          "Error compiling template:\n\n" + template + "\n\n" +
+          compiled.errors.map(function (e) { return ("- " + e); }).join('\n') + '\n',
+          vm
+        );
+      }
+      if (compiled.tips && compiled.tips.length) {
+        compiled.tips.forEach(function (msg) { return tip(msg, vm); });
+      }
+    }
+
+    // turn code into functions
+    var res = {};
+    var fnGenErrors = [];
+    res.render = createFunction(compiled.render, fnGenErrors);
+    res.staticRenderFns = compiled.staticRenderFns.map(function (code) {
+      return createFunction(code, fnGenErrors)
+    });
+
+    // check function generation errors.
+    // this should only happen if there is a bug in the compiler itself.
+    // mostly for codegen development use
+    /* istanbul ignore if */
+    if (process.env.NODE_ENV !== 'production') {
+      if ((!compiled.errors || !compiled.errors.length) && fnGenErrors.length) {
+        warn$$1(
+          "Failed to generate render function:\n\n" +
+          fnGenErrors.map(function (ref) {
+            var err = ref.err;
+            var code = ref.code;
+
+            return ((err.toString()) + " in\n\n" + code + "\n");
+        }).join('\n'),
+          vm
+        );
+      }
+    }
+
+    return (cache[key] = res)
+  }
+}
+
+/*  */
+
+function createCompilerCreator (baseCompile) {
+  return function createCompiler (baseOptions) {
+    function compile (
+      template,
+      options
+    ) {
+      var finalOptions = Object.create(baseOptions);
+      var errors = [];
+      var tips = [];
+      finalOptions.warn = function (msg, tip) {
+        (tip ? tips : errors).push(msg);
+      };
+
+      if (options) {
+        // merge custom modules
+        if (options.modules) {
+          finalOptions.modules =
+            (baseOptions.modules || []).concat(options.modules);
+        }
+        // merge custom directives
+        if (options.directives) {
+          finalOptions.directives = extend(
+            Object.create(baseOptions.directives || null),
+            options.directives
+          );
+        }
+        // copy other options
+        for (var key in options) {
+          if (key !== 'modules' && key !== 'directives') {
+            finalOptions[key] = options[key];
+          }
+        }
+      }
+
+      var compiled = baseCompile(template, finalOptions);
+      if (process.env.NODE_ENV !== 'production') {
+        errors.push.apply(errors, detectErrors(compiled.ast));
+      }
+      compiled.errors = errors;
+      compiled.tips = tips;
+      return compiled
+    }
+
+    return {
+      compile: compile,
+      compileToFunctions: createCompileToFunctionFn(compile)
+    }
+  }
+}
+
+/*  */
+
+// `createCompilerCreator` allows creating compilers that use alternative
+// parser/optimizer/codegen, e.g the SSR optimizing compiler.
+// Here we just export a default compiler using the default parts.
+var createCompiler = createCompilerCreator(function baseCompile (
+  template,
+  options
+) {
+  var ast = parse(template.trim(), options);
+  if (options.optimize !== false) {
+    optimize(ast, options);
+  }
+  var code = generate(ast, options);
+  return {
+    ast: ast,
+    render: code.render,
+    staticRenderFns: code.staticRenderFns
+  }
+});
+
+/*  */
+
+function transformNode (el, options) {
+  var warn = options.warn || baseWarn;
+  var staticClass = getAndRemoveAttr(el, 'class');
+  var ref = parseStaticClass(staticClass, options);
+  var dynamic = ref.dynamic;
+  var classResult = ref.classResult;
+  if (process.env.NODE_ENV !== 'production' && dynamic && staticClass) {
+    warn(
+      "class=\"" + staticClass + "\": " +
+      'Interpolation inside attributes has been deprecated. ' +
+      'Use v-bind or the colon shorthand instead.'
+    );
+  }
+  if (!dynamic && classResult) {
+    el.staticClass = classResult;
+  }
+  var classBinding = getBindingAttr(el, 'class', false /* getStatic */);
+  if (classBinding) {
+    el.classBinding = classBinding;
+  } else if (dynamic) {
+    el.classBinding = classResult;
+  }
+}
+
+function genData$1 (el) {
+  var data = '';
+  if (el.staticClass) {
+    data += "staticClass:" + (el.staticClass) + ",";
+  }
+  if (el.classBinding) {
+    data += "class:" + (el.classBinding) + ",";
+  }
+  return data
+}
+
+function parseStaticClass (staticClass, options) {
+  // "a b c" -> ["a", "b", "c"] => staticClass: ["a", "b", "c"]
+  // "a {{x}} c" -> ["a", x, "c"] => classBinding: '["a", x, "c"]'
+  var dynamic = false;
+  var classResult = '';
+  if (staticClass) {
+    var classList = staticClass.trim().split(' ').map(function (name) {
+      var result = parseText(name, options.delimiters);
+      if (result) {
+        dynamic = true;
+        return result.expression
+      }
+      return JSON.stringify(name)
+    });
+    if (classList.length) {
+      classResult = '[' + classList.join(',') + ']';
+    }
+  }
+  return { dynamic: dynamic, classResult: classResult }
+}
+
+var klass = {
+  staticKeys: ['staticClass'],
+  transformNode: transformNode,
+  genData: genData$1
+}
+
+/*  */
+
+var normalize = cached(camelize);
+
+function transformNode$1 (el, options) {
+  var warn = options.warn || baseWarn;
+  var staticStyle = getAndRemoveAttr(el, 'style');
+  var ref = parseStaticStyle(staticStyle, options);
+  var dynamic = ref.dynamic;
+  var styleResult = ref.styleResult;
+  if (process.env.NODE_ENV !== 'production' && dynamic) {
+    warn(
+      "style=\"" + (String(staticStyle)) + "\": " +
+      'Interpolation inside attributes has been deprecated. ' +
+      'Use v-bind or the colon shorthand instead.'
+    );
+  }
+  if (!dynamic && styleResult) {
+    // $flow-disable-line
+    el.staticStyle = styleResult;
+  }
+  var styleBinding = getBindingAttr(el, 'style', false /* getStatic */);
+  if (styleBinding) {
+    el.styleBinding = styleBinding;
+  } else if (dynamic) {
+    // $flow-disable-line
+    el.styleBinding = styleResult;
+  }
+}
+
+function genData$2 (el) {
+  var data = '';
+  if (el.staticStyle) {
+    data += "staticStyle:" + (el.staticStyle) + ",";
+  }
+  if (el.styleBinding) {
+    data += "style:" + (el.styleBinding) + ",";
+  }
+  return data
+}
+
+function parseStaticStyle (staticStyle, options) {
+  // "width: 200px; height: 200px;" -> {width: 200, height: 200}
+  // "width: 200px; height: {{y}}" -> {width: 200, height: y}
+  var dynamic = false;
+  var styleResult = '';
+  if (typeof staticStyle === 'string') {
+    var styleList = staticStyle.trim().split(';').map(function (style) {
+      var result = style.trim().split(':');
+      if (result.length !== 2) {
+        return
+      }
+      var key = normalize(result[0].trim());
+      var value = result[1].trim();
+      var dynamicValue = parseText(value, options.delimiters);
+      if (dynamicValue) {
+        dynamic = true;
+        return key + ':' + dynamicValue.expression
+      }
+      return key + ':' + JSON.stringify(value)
+    }).filter(function (result) { return result; });
+    if (styleList.length) {
+      styleResult = '{' + styleList.join(',') + '}';
+    }
+  } else if (isPlainObject(staticStyle)) {
+    styleResult = JSON.stringify(staticStyle) || '';
+  }
+  return { dynamic: dynamic, styleResult: styleResult }
+}
+
+var style = {
+  staticKeys: ['staticStyle'],
+  transformNode: transformNode$1,
+  genData: genData$2
+}
+
+/*  */
+
+var normalize$1 = cached(camelize);
+
+function normalizeKeyName (str) {
+  if (str.match(/^v\-/)) {
+    return str.replace(/(v-[a-z\-]+\:)([a-z\-]+)$/i, function ($, directive, prop) {
+      return directive + normalize$1(prop)
+    })
+  }
+  return normalize$1(str)
+}
+
+function transformNode$2 (el, options) {
+  if (Array.isArray(el.attrsList)) {
+    el.attrsList.forEach(function (attr) {
+      if (attr.name && attr.name.match(/\-/)) {
+        var realName = normalizeKeyName(attr.name);
+        if (el.attrsMap) {
+          el.attrsMap[realName] = el.attrsMap[attr.name];
+          delete el.attrsMap[attr.name];
+        }
+        attr.name = realName;
+      }
+    });
+  }
+}
+var props = {
+  transformNode: transformNode$2
+}
+
+/*  */
+
+// The "unitary tag" means that the tag node and its children
+// must be sent to the native together.
+var isUnitaryTag = makeMap('cell,header,cell-slot,recycle-list', true);
+
+function preTransformNode (el, options) {
+  if (isUnitaryTag(el.tag) && !el.attrsList.some(function (item) { return item.name === 'append'; })) {
+    el.attrsMap.append = 'tree';
+    el.attrsList.push({ name: 'append', value: 'tree' });
+  }
+  if (el.attrsMap.append === 'tree') {
+    el.appendAsTree = true;
+  }
+}
+
+function genData$3 (el) {
+  return el.appendAsTree ? "appendAsTree:true," : ''
+}
+
+var append = {
+  staticKeys: ['appendAsTree'],
+  preTransformNode: preTransformNode,
+  genData: genData$3
+}
+
+/*  */
+
+/**
+ * Map the following syntax to corresponding attrs:
+ *
+ * <recycle-list for="(item, i) in longList" switch="cellType">
+ *   <cell-slot case="A"> ... </cell-slot>
+ *   <cell-slot case="B"> ... </cell-slot>
+ * </recycle-list>
+ */
+
+function preTransformRecycleList (
+  el,
+  options
+) {
+  var exp = getAndRemoveAttr(el, 'for');
+  if (!exp) {
+    if (options.warn) {
+      options.warn("Invalid <recycle-list> syntax: missing \"for\" expression.");
+    }
+    return
+  }
+
+  var res = parseFor(exp);
+  if (!res) {
+    if (options.warn) {
+      options.warn(("Invalid <recycle-list> syntax: " + exp + "."));
+    }
+    return
+  }
+
+  addRawAttr(el, ':list-data', res.for);
+  addRawAttr(el, 'binding-expression', res.for);
+  addRawAttr(el, 'alias', res.alias);
+  if (res.iterator2) {
+    // (item, key, index) for object iteration
+    // is this even supported?
+    addRawAttr(el, 'index', res.iterator2);
+  } else if (res.iterator1) {
+    addRawAttr(el, 'index', res.iterator1);
+  }
+
+  var switchKey = getAndRemoveAttr(el, 'switch');
+  if (switchKey) {
+    addRawAttr(el, 'switch', switchKey);
+  }
+}
+
+/*  */
+
+
+var RECYCLE_LIST_MARKER = '@inRecycleList';
+
+// Register the component hook to weex native render engine.
+// The hook will be triggered by native, not javascript.
+
+
+// Updates the state of the component to weex native render engine.
+
+/*  */
+
+// mark components as inside recycle-list so that we know we need to invoke
+// their special @render function instead of render in create-component.js
+function postTransformComponent (
+  el,
+  options
+) {
+  // $flow-disable-line (we know isReservedTag is there)
+  if (!options.isReservedTag(el.tag) && el.tag !== 'cell-slot') {
+    addAttr(el, RECYCLE_LIST_MARKER, 'true');
+  }
+}
+
+/*  */
+
+// mark component root nodes as
+function postTransformComponentRoot (
+  el,
+  options
+) {
+  if (!el.parent) {
+    // component root
+    addAttr(el, '@isComponentRoot', 'true');
+    addAttr(el, '@templateId', '_uid');
+    addAttr(el, '@componentProps', '$props || {}');
+  }
+}
+
+/*  */
+
+function genText$1 (node) {
+  var value = node.type === 3
+    ? node.text
+    : node.type === 2
+      ? node.tokens.length === 1
+        ? node.tokens[0]
+        : node.tokens
+      : '';
+  return JSON.stringify(value)
+}
+
+function postTransformText (el, options) {
+  // weex <text> can only contain text, so the parser
+  // always generates a single child.
+  if (el.children.length) {
+    addAttr(el, 'value', genText$1(el.children[0]));
+    el.children = [];
+  }
+}
+
+/*  */
+
+// import { warn } from 'core/util/index'
+
+// this will be preserved during build
+// $flow-disable-line
+var acorn = require('acorn'); // $flow-disable-line
+var walk = require('acorn/dist/walk'); // $flow-disable-line
+var escodegen = require('escodegen');
+
+function nodeToBinding (node) {
+  switch (node.type) {
+    case 'Literal': return node.value
+    case 'Identifier':
+    case 'UnaryExpression':
+    case 'BinaryExpression':
+    case 'LogicalExpression':
+    case 'ConditionalExpression':
+    case 'MemberExpression': return { '@binding': escodegen.generate(node) }
+    case 'ArrayExpression': return node.elements.map(function (_) { return nodeToBinding(_); })
+    case 'ObjectExpression': {
+      var object = {};
+      node.properties.forEach(function (prop) {
+        if (!prop.key || prop.key.type !== 'Identifier') {
+          return
+        }
+        var key = escodegen.generate(prop.key);
+        var value = nodeToBinding(prop.value);
+        if (key && value) {
+          object[key] = value;
+        }
+      });
+      return object
+    }
+    default: {
+      // warn(`Not support ${node.type}: "${escodegen.generate(node)}"`)
+      return ''
+    }
+  }
+}
+
+function generateBinding (exp) {
+  if (exp && typeof exp === 'string') {
+    var ast = null;
+    try {
+      ast = acorn.parse(("(" + exp + ")"));
+    } catch (e) {
+      // warn(`Failed to parse the expression: "${exp}"`)
+      return ''
+    }
+
+    var output = '';
+    walk.simple(ast, {
+      Expression: function Expression (node) {
+        output = nodeToBinding(node);
+      }
+    });
+    return output
+  }
+}
+
+/*  */
+
+function parseAttrName (name) {
+  return camelize(name.replace(bindRE, ''))
+}
+
+function preTransformVBind (el, options) {
+  for (var attr in el.attrsMap) {
+    if (bindRE.test(attr)) {
+      var name = parseAttrName(attr);
+      var value = generateBinding(getAndRemoveAttr(el, attr));
+      delete el.attrsMap[attr];
+      addRawAttr(el, name, value);
+    }
+  }
+}
+
+/*  */
+
+function hasConditionDirective (el) {
+  for (var attr in el.attrsMap) {
+    if (/^v\-if|v\-else|v\-else\-if$/.test(attr)) {
+      return true
+    }
+  }
+  return false
+}
+
+function getPreviousConditions (el) {
+  var conditions = [];
+  if (el.parent && el.parent.children) {
+    for (var c = 0, n = el.parent.children.length; c < n; ++c) {
+      // $flow-disable-line
+      var ifConditions = el.parent.children[c].ifConditions;
+      if (ifConditions) {
+        for (var i = 0, l = ifConditions.length; i < l; ++i) {
+          var condition = ifConditions[i];
+          if (condition && condition.exp) {
+            conditions.push(condition.exp);
+          }
+        }
+      }
+    }
+  }
+  return conditions
+}
+
+function preTransformVIf (el, options) {
+  if (hasConditionDirective(el)) {
+    var exp;
+    var ifExp = getAndRemoveAttr(el, 'v-if', true /* remove from attrsMap */);
+    var elseifExp = getAndRemoveAttr(el, 'v-else-if', true);
+    // don't need the value, but remove it to avoid being generated as a
+    // custom directive
+    getAndRemoveAttr(el, 'v-else', true);
+    if (ifExp) {
+      exp = ifExp;
+      addIfCondition(el, { exp: ifExp, block: el });
+    } else {
+      elseifExp && addIfCondition(el, { exp: elseifExp, block: el });
+      var prevConditions = getPreviousConditions(el);
+      if (prevConditions.length) {
+        var prevMatch = prevConditions.join(' || ');
+        exp = elseifExp
+          ? ("!(" + prevMatch + ") && (" + elseifExp + ")") // v-else-if
+          : ("!(" + prevMatch + ")"); // v-else
+      } else if (process.env.NODE_ENV !== 'production' && options.warn) {
+        options.warn(
+          "v-" + (elseifExp ? ('else-if="' + elseifExp + '"') : 'else') + " " +
+          "used on element <" + (el.tag) + "> without corresponding v-if."
+        );
+        return
+      }
+    }
+    addRawAttr(el, '[[match]]', exp);
+  }
+}
+
+/*  */
+
+function preTransformVFor (el, options) {
+  var exp = getAndRemoveAttr(el, 'v-for');
+  if (!exp) {
+    return
+  }
+
+  var res = parseFor(exp);
+  if (!res) {
+    if (process.env.NODE_ENV !== 'production' && options.warn) {
+      options.warn(("Invalid v-for expression: " + exp));
+    }
+    return
+  }
+
+  var desc = {
+    '@expression': res.for,
+    '@alias': res.alias
+  };
+  if (res.iterator2) {
+    desc['@key'] = res.iterator1;
+    desc['@index'] = res.iterator2;
+  } else {
+    desc['@index'] = res.iterator1;
+  }
+
+  delete el.attrsMap['v-for'];
+  addRawAttr(el, '[[repeat]]', desc);
+}
+
+/*  */
+
+var inlineStatementRE = /^\s*([A-Za-z_$0-9\['\."\]]+)*\s*\(\s*(([A-Za-z_$0-9\['\."\]]+)?(\s*,\s*([A-Za-z_$0-9\['\."\]]+))*)\s*\)$/;
+
+function parseHandlerParams (handler) {
+  var res = inlineStatementRE.exec(handler.value);
+  if (res && res[2]) {
+    handler.params = res[2].split(/\s*,\s*/);
+  }
+}
+
+function postTransformVOn (el, options) {
+  var events = el.events;
+  if (!events) {
+    return
+  }
+  for (var name in events) {
+    var handler = events[name];
+    if (Array.isArray(handler)) {
+      handler.map(function (fn) { return parseHandlerParams(fn); });
+    } else {
+      parseHandlerParams(handler);
+    }
+  }
+}
+
+/*  */
+
+function containVOnce (el) {
+  for (var attr in el.attrsMap) {
+    if (/^v\-once$/i.test(attr)) {
+      return true
+    }
+  }
+  return false
+}
+
+function preTransformVOnce (el, options) {
+  if (containVOnce(el)) {
+    getAndRemoveAttr(el, 'v-once', true);
+    addRawAttr(el, '[[once]]', true);
+  }
+}
+
+/*  */
+
+var currentRecycleList = null;
+
+function shouldCompile (el, options) {
+  return options.recyclable ||
+    (currentRecycleList && el !== currentRecycleList)
+}
+
+function preTransformNode$1 (el, options) {
+  if (el.tag === 'recycle-list') {
+    preTransformRecycleList(el, options);
+    currentRecycleList = el;
+  }
+  if (shouldCompile(el, options)) {
+    preTransformVBind(el, options);
+    preTransformVIf(el, options); // also v-else-if and v-else
+    preTransformVFor(el, options);
+    preTransformVOnce(el, options);
+  }
+}
+
+function transformNode$3 (el, options) {
+  if (shouldCompile(el, options)) {
+    // do nothing yet
+  }
+}
+
+function postTransformNode (el, options) {
+  if (shouldCompile(el, options)) {
+    // mark child component in parent template
+    postTransformComponent(el, options);
+    // mark root in child component template
+    postTransformComponentRoot(el, options);
+    // <text>: transform children text into value attr
+    if (el.tag === 'text') {
+      postTransformText(el, options);
+    }
+    postTransformVOn(el, options);
+  }
+  if (el === currentRecycleList) {
+    currentRecycleList = null;
+  }
+}
+
+var recycleList = {
+  preTransformNode: preTransformNode$1,
+  transformNode: transformNode$3,
+  postTransformNode: postTransformNode
+}
+
+var modules = [
+  recycleList,
+  klass,
+  style,
+  props,
+  append
+]
+
+/*  */
+
+function model (
+  el,
+  dir,
+  _warn
+) {
+  if (el.tag === 'input' || el.tag === 'textarea') {
+    genDefaultModel(el, dir.value, dir.modifiers);
+  } else {
+    genComponentModel(el, dir.value, dir.modifiers);
+  }
+}
+
+function genDefaultModel (
+  el,
+  value,
+  modifiers
+) {
+  var ref = modifiers || {};
+  var lazy = ref.lazy;
+  var trim = ref.trim;
+  var number = ref.number;
+  var event = lazy ? 'change' : 'input';
+
+  var valueExpression = "$event.target.attr.value" + (trim ? '.trim()' : '');
+  if (number) {
+    valueExpression = "_n(" + valueExpression + ")";
+  }
+
+  var code = genAssignmentCode(value, valueExpression);
+  addAttr(el, 'value', ("(" + value + ")"));
+  addHandler(el, event, code, null, true);
+}
+
+var directives = {
+  model: model
+}
+
+/*  */
+
+// These util functions are split into its own file because Rollup cannot drop
+// makeMap() due to potential side effects, so these variables end up
+// bloating the web builds.
+
+var isReservedTag = makeMap(
+  'template,script,style,element,content,slot,link,meta,svg,view,' +
+  'a,div,img,image,text,span,input,switch,textarea,spinner,select,' +
+  'slider,slider-neighbor,indicator,canvas,' +
+  'list,cell,header,loading,loading-indicator,refresh,scrollable,scroller,' +
+  'video,web,embed,tabbar,tabheader,datepicker,timepicker,marquee,countdown',
+  true
+);
+
+// Elements that you can, intentionally, leave open (and which close themselves)
+// more flexible than web
+var canBeLeftOpenTag$1 = makeMap(
+  'web,spinner,switch,video,textarea,canvas,' +
+  'indicator,marquee,countdown',
+  true
+);
+
+var isRuntimeComponent = makeMap(
+  'richtext,transition,transition-group',
+  true
+);
+
+var isUnaryTag$1 = makeMap(
+  'embed,img,image,input,link,meta',
+  true
+);
+
+function mustUseProp (tag, type, name) {
+  return false
+}
+
+function getTagNamespace (tag) { }
+
+/*  */
+
+var baseOptions = {
+  modules: modules,
+  directives: directives,
+  isUnaryTag: isUnaryTag$1,
+  mustUseProp: mustUseProp,
+  canBeLeftOpenTag: canBeLeftOpenTag$1,
+  isReservedTag: isReservedTag,
+  getTagNamespace: getTagNamespace,
+  preserveWhitespace: false,
+  recyclable: false,
+  staticKeys: genStaticKeys(modules)
+};
+
+var compiler = createCompiler(baseOptions);
+
+function compile (
+  template,
+  options
+) {
+  var generateAltRender = false;
+  if (options && options.recyclable === true) {
+    generateAltRender = true;
+    options.recyclable = false;
+  }
+  var result = compiler.compile(template, options);
+
+  // generate @render function for <recycle-list>
+  if (options && generateAltRender) {
+    options.recyclable = true;
+    // disable static optimizations
+    options.optimize = false;
+    var ref = compiler.compile(template, options);
+    var render = ref.render;
+    result['@render'] = render;
+  }
+  return result
+}
+
+exports.compile = compile;
diff --git a/advancedcontentfilter/vendor/asset/vue/packages/weex-template-compiler/index.js b/advancedcontentfilter/vendor/asset/vue/packages/weex-template-compiler/index.js
new file mode 100644 (file)
index 0000000..f50a0e6
--- /dev/null
@@ -0,0 +1,17 @@
+try {
+  var vueVersion = require('weex-vue-framework').version
+} catch (e) {}
+
+var packageName = require('./package.json').name
+var packageVersion = require('./package.json').version
+if (vueVersion && vueVersion !== packageVersion) {
+  throw new Error(
+    '\n\nVue packages version mismatch:\n\n' +
+    '- vue@' + vueVersion + '\n' +
+    '- ' + packageName + '@' + packageVersion + '\n\n' +
+    'This may cause things to work incorrectly. Make sure to use the same version for both.\n' +
+    'If you are using weex-vue-loader, re-installing them should bump ' + packageName + ' to the latest.\n'
+  )
+}
+
+module.exports = require('./build')
diff --git a/advancedcontentfilter/vendor/asset/vue/packages/weex-template-compiler/package.json b/advancedcontentfilter/vendor/asset/vue/packages/weex-template-compiler/package.json
new file mode 100644 (file)
index 0000000..ad08235
--- /dev/null
@@ -0,0 +1,25 @@
+{
+  "name": "weex-template-compiler",
+  "version": "2.4.2-weex.1",
+  "description": "Weex template compiler for Vue 2.0",
+  "main": "index.js",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/vuejs/vue.git"
+  },
+  "keywords": [
+    "vue",
+    "compiler"
+  ],
+  "author": "Evan You",
+  "license": "MIT",
+  "bugs": {
+    "url": "https://github.com/vuejs/vue/issues"
+  },
+  "homepage": "https://github.com/vuejs/vue/tree/dev/packages/weex-template-compiler#readme",
+  "dependencies": {
+    "acorn": "^5.2.1",
+    "escodegen": "^1.8.1",
+    "he": "^1.1.0"
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/packages/weex-vue-framework/README.md b/advancedcontentfilter/vendor/asset/vue/packages/weex-vue-framework/README.md
new file mode 100644 (file)
index 0000000..9f31831
--- /dev/null
@@ -0,0 +1,3 @@
+# weex-vue-framework
+
+> This package is auto-generated. For pull requests please see [src/platforms/weex/entry-framework.js](https://github.com/vuejs/vue/blob/dev/src/platforms/weex/entry-framework.js).
diff --git a/advancedcontentfilter/vendor/asset/vue/packages/weex-vue-framework/factory.js b/advancedcontentfilter/vendor/asset/vue/packages/weex-vue-framework/factory.js
new file mode 100644 (file)
index 0000000..8bcfb67
--- /dev/null
@@ -0,0 +1,7474 @@
+'use strict';
+
+module.exports = function weexFactory (exports, document) {
+
+/*  */
+
+var emptyObject = Object.freeze({});
+
+// these helpers produces better vm code in JS engines due to their
+// explicitness and function inlining
+function isUndef (v) {
+  return v === undefined || v === null
+}
+
+function isDef (v) {
+  return v !== undefined && v !== null
+}
+
+function isTrue (v) {
+  return v === true
+}
+
+function isFalse (v) {
+  return v === false
+}
+
+/**
+ * Check if value is primitive
+ */
+function isPrimitive (value) {
+  return (
+    typeof value === 'string' ||
+    typeof value === 'number' ||
+    // $flow-disable-line
+    typeof value === 'symbol' ||
+    typeof value === 'boolean'
+  )
+}
+
+/**
+ * Quick object check - this is primarily used to tell
+ * Objects from primitive values when we know the value
+ * is a JSON-compliant type.
+ */
+function isObject (obj) {
+  return obj !== null && typeof obj === 'object'
+}
+
+/**
+ * Get the raw type string of a value e.g. [object Object]
+ */
+var _toString = Object.prototype.toString;
+
+function toRawType (value) {
+  return _toString.call(value).slice(8, -1)
+}
+
+/**
+ * Strict object type check. Only returns true
+ * for plain JavaScript objects.
+ */
+function isPlainObject (obj) {
+  return _toString.call(obj) === '[object Object]'
+}
+
+function isRegExp (v) {
+  return _toString.call(v) === '[object RegExp]'
+}
+
+/**
+ * Check if val is a valid array index.
+ */
+function isValidArrayIndex (val) {
+  var n = parseFloat(String(val));
+  return n >= 0 && Math.floor(n) === n && isFinite(val)
+}
+
+/**
+ * Convert a value to a string that is actually rendered.
+ */
+function toString (val) {
+  return val == null
+    ? ''
+    : typeof val === 'object'
+      ? JSON.stringify(val, null, 2)
+      : String(val)
+}
+
+/**
+ * Convert a input value to a number for persistence.
+ * If the conversion fails, return original string.
+ */
+function toNumber (val) {
+  var n = parseFloat(val);
+  return isNaN(n) ? val : n
+}
+
+/**
+ * Make a map and return a function for checking if a key
+ * is in that map.
+ */
+function makeMap (
+  str,
+  expectsLowerCase
+) {
+  var map = Object.create(null);
+  var list = str.split(',');
+  for (var i = 0; i < list.length; i++) {
+    map[list[i]] = true;
+  }
+  return expectsLowerCase
+    ? function (val) { return map[val.toLowerCase()]; }
+    : function (val) { return map[val]; }
+}
+
+/**
+ * Check if a tag is a built-in tag.
+ */
+var isBuiltInTag = makeMap('slot,component', true);
+
+/**
+ * Check if a attribute is a reserved attribute.
+ */
+var isReservedAttribute = makeMap('key,ref,slot,slot-scope,is');
+
+/**
+ * Remove an item from an array
+ */
+function remove (arr, item) {
+  if (arr.length) {
+    var index = arr.indexOf(item);
+    if (index > -1) {
+      return arr.splice(index, 1)
+    }
+  }
+}
+
+/**
+ * Check whether the object has the property.
+ */
+var hasOwnProperty = Object.prototype.hasOwnProperty;
+function hasOwn (obj, key) {
+  return hasOwnProperty.call(obj, key)
+}
+
+/**
+ * Create a cached version of a pure function.
+ */
+function cached (fn) {
+  var cache = Object.create(null);
+  return (function cachedFn (str) {
+    var hit = cache[str];
+    return hit || (cache[str] = fn(str))
+  })
+}
+
+/**
+ * Camelize a hyphen-delimited string.
+ */
+var camelizeRE = /-(\w)/g;
+var camelize = cached(function (str) {
+  return str.replace(camelizeRE, function (_, c) { return c ? c.toUpperCase() : ''; })
+});
+
+/**
+ * Capitalize a string.
+ */
+var capitalize = cached(function (str) {
+  return str.charAt(0).toUpperCase() + str.slice(1)
+});
+
+/**
+ * Hyphenate a camelCase string.
+ */
+var hyphenateRE = /\B([A-Z])/g;
+var hyphenate = cached(function (str) {
+  return str.replace(hyphenateRE, '-$1').toLowerCase()
+});
+
+/**
+ * Simple bind polyfill for environments that do not support it... e.g.
+ * PhantomJS 1.x. Technically we don't need this anymore since native bind is
+ * now more performant in most browsers, but removing it would be breaking for
+ * code that was able to run in PhantomJS 1.x, so this must be kept for
+ * backwards compatibility.
+ */
+
+/* istanbul ignore next */
+function polyfillBind (fn, ctx) {
+  function boundFn (a) {
+    var l = arguments.length;
+    return l
+      ? l > 1
+        ? fn.apply(ctx, arguments)
+        : fn.call(ctx, a)
+      : fn.call(ctx)
+  }
+
+  boundFn._length = fn.length;
+  return boundFn
+}
+
+function nativeBind (fn, ctx) {
+  return fn.bind(ctx)
+}
+
+var bind = Function.prototype.bind
+  ? nativeBind
+  : polyfillBind;
+
+/**
+ * Convert an Array-like object to a real Array.
+ */
+function toArray (list, start) {
+  start = start || 0;
+  var i = list.length - start;
+  var ret = new Array(i);
+  while (i--) {
+    ret[i] = list[i + start];
+  }
+  return ret
+}
+
+/**
+ * Mix properties into target object.
+ */
+function extend (to, _from) {
+  for (var key in _from) {
+    to[key] = _from[key];
+  }
+  return to
+}
+
+/**
+ * Merge an Array of Objects into a single Object.
+ */
+function toObject (arr) {
+  var res = {};
+  for (var i = 0; i < arr.length; i++) {
+    if (arr[i]) {
+      extend(res, arr[i]);
+    }
+  }
+  return res
+}
+
+/**
+ * Perform no operation.
+ * Stubbing args to make Flow happy without leaving useless transpiled code
+ * with ...rest (https://flow.org/blog/2017/05/07/Strict-Function-Call-Arity/)
+ */
+function noop (a, b, c) {}
+
+/**
+ * Always return false.
+ */
+var no = function (a, b, c) { return false; };
+
+/**
+ * Return same value
+ */
+var identity = function (_) { return _; };
+
+/**
+ * Generate a static keys string from compiler modules.
+ */
+
+
+/**
+ * Check if two values are loosely equal - that is,
+ * if they are plain objects, do they have the same shape?
+ */
+function looseEqual (a, b) {
+  if (a === b) { return true }
+  var isObjectA = isObject(a);
+  var isObjectB = isObject(b);
+  if (isObjectA && isObjectB) {
+    try {
+      var isArrayA = Array.isArray(a);
+      var isArrayB = Array.isArray(b);
+      if (isArrayA && isArrayB) {
+        return a.length === b.length && a.every(function (e, i) {
+          return looseEqual(e, b[i])
+        })
+      } else if (!isArrayA && !isArrayB) {
+        var keysA = Object.keys(a);
+        var keysB = Object.keys(b);
+        return keysA.length === keysB.length && keysA.every(function (key) {
+          return looseEqual(a[key], b[key])
+        })
+      } else {
+        /* istanbul ignore next */
+        return false
+      }
+    } catch (e) {
+      /* istanbul ignore next */
+      return false
+    }
+  } else if (!isObjectA && !isObjectB) {
+    return String(a) === String(b)
+  } else {
+    return false
+  }
+}
+
+function looseIndexOf (arr, val) {
+  for (var i = 0; i < arr.length; i++) {
+    if (looseEqual(arr[i], val)) { return i }
+  }
+  return -1
+}
+
+/**
+ * Ensure a function is called only once.
+ */
+function once (fn) {
+  var called = false;
+  return function () {
+    if (!called) {
+      called = true;
+      fn.apply(this, arguments);
+    }
+  }
+}
+
+var SSR_ATTR = 'data-server-rendered';
+
+var ASSET_TYPES = [
+  'component',
+  'directive',
+  'filter'
+];
+
+var LIFECYCLE_HOOKS = [
+  'beforeCreate',
+  'created',
+  'beforeMount',
+  'mounted',
+  'beforeUpdate',
+  'updated',
+  'beforeDestroy',
+  'destroyed',
+  'activated',
+  'deactivated',
+  'errorCaptured'
+];
+
+/*  */
+
+var config = ({
+  /**
+   * Option merge strategies (used in core/util/options)
+   */
+  // $flow-disable-line
+  optionMergeStrategies: Object.create(null),
+
+  /**
+   * Whether to suppress warnings.
+   */
+  silent: false,
+
+  /**
+   * Show production mode tip message on boot?
+   */
+  productionTip: process.env.NODE_ENV !== 'production',
+
+  /**
+   * Whether to enable devtools
+   */
+  devtools: process.env.NODE_ENV !== 'production',
+
+  /**
+   * Whether to record perf
+   */
+  performance: false,
+
+  /**
+   * Error handler for watcher errors
+   */
+  errorHandler: null,
+
+  /**
+   * Warn handler for watcher warns
+   */
+  warnHandler: null,
+
+  /**
+   * Ignore certain custom elements
+   */
+  ignoredElements: [],
+
+  /**
+   * Custom user key aliases for v-on
+   */
+  // $flow-disable-line
+  keyCodes: Object.create(null),
+
+  /**
+   * Check if a tag is reserved so that it cannot be registered as a
+   * component. This is platform-dependent and may be overwritten.
+   */
+  isReservedTag: no,
+
+  /**
+   * Check if an attribute is reserved so that it cannot be used as a component
+   * prop. This is platform-dependent and may be overwritten.
+   */
+  isReservedAttr: no,
+
+  /**
+   * Check if a tag is an unknown element.
+   * Platform-dependent.
+   */
+  isUnknownElement: no,
+
+  /**
+   * Get the namespace of an element
+   */
+  getTagNamespace: noop,
+
+  /**
+   * Parse the real tag name for the specific platform.
+   */
+  parsePlatformTagName: identity,
+
+  /**
+   * Check if an attribute must be bound using property, e.g. value
+   * Platform-dependent.
+   */
+  mustUseProp: no,
+
+  /**
+   * Exposed for legacy reasons
+   */
+  _lifecycleHooks: LIFECYCLE_HOOKS
+})
+
+/*  */
+
+/**
+ * Check if a string starts with $ or _
+ */
+function isReserved (str) {
+  var c = (str + '').charCodeAt(0);
+  return c === 0x24 || c === 0x5F
+}
+
+/**
+ * Define a property.
+ */
+function def (obj, key, val, enumerable) {
+  Object.defineProperty(obj, key, {
+    value: val,
+    enumerable: !!enumerable,
+    writable: true,
+    configurable: true
+  });
+}
+
+/**
+ * Parse simple path.
+ */
+var bailRE = /[^\w.$]/;
+function parsePath (path) {
+  if (bailRE.test(path)) {
+    return
+  }
+  var segments = path.split('.');
+  return function (obj) {
+    for (var i = 0; i < segments.length; i++) {
+      if (!obj) { return }
+      obj = obj[segments[i]];
+    }
+    return obj
+  }
+}
+
+/*  */
+
+// can we use __proto__?
+var hasProto = '__proto__' in {};
+
+// Browser environment sniffing
+var inBrowser = typeof window !== 'undefined';
+var inWeex = typeof WXEnvironment !== 'undefined' && !!WXEnvironment.platform;
+var weexPlatform = inWeex && WXEnvironment.platform.toLowerCase();
+var UA = inBrowser && window.navigator.userAgent.toLowerCase();
+var isIE = UA && /msie|trident/.test(UA);
+var isIE9 = UA && UA.indexOf('msie 9.0') > 0;
+var isEdge = UA && UA.indexOf('edge/') > 0;
+var isAndroid = (UA && UA.indexOf('android') > 0) || (weexPlatform === 'android');
+var isIOS = (UA && /iphone|ipad|ipod|ios/.test(UA)) || (weexPlatform === 'ios');
+var isChrome = UA && /chrome\/\d+/.test(UA) && !isEdge;
+
+// Firefox has a "watch" function on Object.prototype...
+var nativeWatch = ({}).watch;
+
+
+if (inBrowser) {
+  try {
+    var opts = {};
+    Object.defineProperty(opts, 'passive', ({
+      get: function get () {
+        /* istanbul ignore next */
+        
+      }
+    })); // https://github.com/facebook/flow/issues/285
+    window.addEventListener('test-passive', null, opts);
+  } catch (e) {}
+}
+
+// this needs to be lazy-evaled because vue may be required before
+// vue-server-renderer can set VUE_ENV
+var _isServer;
+var isServerRendering = function () {
+  if (_isServer === undefined) {
+    /* istanbul ignore if */
+    if (!inBrowser && !inWeex && typeof global !== 'undefined') {
+      // detect presence of vue-server-renderer and avoid
+      // Webpack shimming the process
+      _isServer = global['process'].env.VUE_ENV === 'server';
+    } else {
+      _isServer = false;
+    }
+  }
+  return _isServer
+};
+
+// detect devtools
+var devtools = inBrowser && window.__VUE_DEVTOOLS_GLOBAL_HOOK__;
+
+/* istanbul ignore next */
+function isNative (Ctor) {
+  return typeof Ctor === 'function' && /native code/.test(Ctor.toString())
+}
+
+var hasSymbol =
+  typeof Symbol !== 'undefined' && isNative(Symbol) &&
+  typeof Reflect !== 'undefined' && isNative(Reflect.ownKeys);
+
+var _Set;
+/* istanbul ignore if */ // $flow-disable-line
+if (typeof Set !== 'undefined' && isNative(Set)) {
+  // use native Set when available.
+  _Set = Set;
+} else {
+  // a non-standard Set polyfill that only works with primitive keys.
+  _Set = (function () {
+    function Set () {
+      this.set = Object.create(null);
+    }
+    Set.prototype.has = function has (key) {
+      return this.set[key] === true
+    };
+    Set.prototype.add = function add (key) {
+      this.set[key] = true;
+    };
+    Set.prototype.clear = function clear () {
+      this.set = Object.create(null);
+    };
+
+    return Set;
+  }());
+}
+
+/*  */
+
+var warn = noop;
+var tip = noop;
+var generateComponentTrace = (noop); // work around flow check
+var formatComponentName = (noop);
+
+if (process.env.NODE_ENV !== 'production') {
+  var hasConsole = typeof console !== 'undefined';
+  var classifyRE = /(?:^|[-_])(\w)/g;
+  var classify = function (str) { return str
+    .replace(classifyRE, function (c) { return c.toUpperCase(); })
+    .replace(/[-_]/g, ''); };
+
+  warn = function (msg, vm) {
+    var trace = vm ? generateComponentTrace(vm) : '';
+
+    if (config.warnHandler) {
+      config.warnHandler.call(null, msg, vm, trace);
+    } else if (hasConsole && (!config.silent)) {
+      console.error(("[Vue warn]: " + msg + trace));
+    }
+  };
+
+  tip = function (msg, vm) {
+    if (hasConsole && (!config.silent)) {
+      console.warn("[Vue tip]: " + msg + (
+        vm ? generateComponentTrace(vm) : ''
+      ));
+    }
+  };
+
+  formatComponentName = function (vm, includeFile) {
+    if (vm.$root === vm) {
+      return '<Root>'
+    }
+    var options = typeof vm === 'function' && vm.cid != null
+      ? vm.options
+      : vm._isVue
+        ? vm.$options || vm.constructor.options
+        : vm || {};
+    var name = options.name || options._componentTag;
+    var file = options.__file;
+    if (!name && file) {
+      var match = file.match(/([^/\\]+)\.vue$/);
+      name = match && match[1];
+    }
+
+    return (
+      (name ? ("<" + (classify(name)) + ">") : "<Anonymous>") +
+      (file && includeFile !== false ? (" at " + file) : '')
+    )
+  };
+
+  var repeat = function (str, n) {
+    var res = '';
+    while (n) {
+      if (n % 2 === 1) { res += str; }
+      if (n > 1) { str += str; }
+      n >>= 1;
+    }
+    return res
+  };
+
+  generateComponentTrace = function (vm) {
+    if (vm._isVue && vm.$parent) {
+      var tree = [];
+      var currentRecursiveSequence = 0;
+      while (vm) {
+        if (tree.length > 0) {
+          var last = tree[tree.length - 1];
+          if (last.constructor === vm.constructor) {
+            currentRecursiveSequence++;
+            vm = vm.$parent;
+            continue
+          } else if (currentRecursiveSequence > 0) {
+            tree[tree.length - 1] = [last, currentRecursiveSequence];
+            currentRecursiveSequence = 0;
+          }
+        }
+        tree.push(vm);
+        vm = vm.$parent;
+      }
+      return '\n\nfound in\n\n' + tree
+        .map(function (vm, i) { return ("" + (i === 0 ? '---> ' : repeat(' ', 5 + i * 2)) + (Array.isArray(vm)
+            ? ((formatComponentName(vm[0])) + "... (" + (vm[1]) + " recursive calls)")
+            : formatComponentName(vm))); })
+        .join('\n')
+    } else {
+      return ("\n\n(found in " + (formatComponentName(vm)) + ")")
+    }
+  };
+}
+
+/*  */
+
+
+var uid = 0;
+
+/**
+ * A dep is an observable that can have multiple
+ * directives subscribing to it.
+ */
+var Dep = function Dep () {
+  this.id = uid++;
+  this.subs = [];
+};
+
+Dep.prototype.addSub = function addSub (sub) {
+  this.subs.push(sub);
+};
+
+Dep.prototype.removeSub = function removeSub (sub) {
+  remove(this.subs, sub);
+};
+
+Dep.prototype.depend = function depend () {
+  if (Dep.target) {
+    Dep.target.addDep(this);
+  }
+};
+
+Dep.prototype.notify = function notify () {
+  // stabilize the subscriber list first
+  var subs = this.subs.slice();
+  for (var i = 0, l = subs.length; i < l; i++) {
+    subs[i].update();
+  }
+};
+
+// the current target watcher being evaluated.
+// this is globally unique because there could be only one
+// watcher being evaluated at any time.
+Dep.target = null;
+var targetStack = [];
+
+function pushTarget (_target) {
+  if (Dep.target) { targetStack.push(Dep.target); }
+  Dep.target = _target;
+}
+
+function popTarget () {
+  Dep.target = targetStack.pop();
+}
+
+/*  */
+
+var VNode = function VNode (
+  tag,
+  data,
+  children,
+  text,
+  elm,
+  context,
+  componentOptions,
+  asyncFactory
+) {
+  this.tag = tag;
+  this.data = data;
+  this.children = children;
+  this.text = text;
+  this.elm = elm;
+  this.ns = undefined;
+  this.context = context;
+  this.fnContext = undefined;
+  this.fnOptions = undefined;
+  this.fnScopeId = undefined;
+  this.key = data && data.key;
+  this.componentOptions = componentOptions;
+  this.componentInstance = undefined;
+  this.parent = undefined;
+  this.raw = false;
+  this.isStatic = false;
+  this.isRootInsert = true;
+  this.isComment = false;
+  this.isCloned = false;
+  this.isOnce = false;
+  this.asyncFactory = asyncFactory;
+  this.asyncMeta = undefined;
+  this.isAsyncPlaceholder = false;
+};
+
+var prototypeAccessors = { child: { configurable: true } };
+
+// DEPRECATED: alias for componentInstance for backwards compat.
+/* istanbul ignore next */
+prototypeAccessors.child.get = function () {
+  return this.componentInstance
+};
+
+Object.defineProperties( VNode.prototype, prototypeAccessors );
+
+var createEmptyVNode = function (text) {
+  if ( text === void 0 ) text = '';
+
+  var node = new VNode();
+  node.text = text;
+  node.isComment = true;
+  return node
+};
+
+function createTextVNode (val) {
+  return new VNode(undefined, undefined, undefined, String(val))
+}
+
+// optimized shallow clone
+// used for static nodes and slot nodes because they may be reused across
+// multiple renders, cloning them avoids errors when DOM manipulations rely
+// on their elm reference.
+function cloneVNode (vnode) {
+  var cloned = new VNode(
+    vnode.tag,
+    vnode.data,
+    vnode.children,
+    vnode.text,
+    vnode.elm,
+    vnode.context,
+    vnode.componentOptions,
+    vnode.asyncFactory
+  );
+  cloned.ns = vnode.ns;
+  cloned.isStatic = vnode.isStatic;
+  cloned.key = vnode.key;
+  cloned.isComment = vnode.isComment;
+  cloned.fnContext = vnode.fnContext;
+  cloned.fnOptions = vnode.fnOptions;
+  cloned.fnScopeId = vnode.fnScopeId;
+  cloned.isCloned = true;
+  return cloned
+}
+
+/*
+ * not type checking this file because flow doesn't play well with
+ * dynamically accessing methods on Array prototype
+ */
+
+var arrayProto = Array.prototype;
+var arrayMethods = Object.create(arrayProto);
+
+var methodsToPatch = [
+  'push',
+  'pop',
+  'shift',
+  'unshift',
+  'splice',
+  'sort',
+  'reverse'
+];
+
+/**
+ * Intercept mutating methods and emit events
+ */
+methodsToPatch.forEach(function (method) {
+  // cache original method
+  var original = arrayProto[method];
+  def(arrayMethods, method, function mutator () {
+    var args = [], len = arguments.length;
+    while ( len-- ) args[ len ] = arguments[ len ];
+
+    var result = original.apply(this, args);
+    var ob = this.__ob__;
+    var inserted;
+    switch (method) {
+      case 'push':
+      case 'unshift':
+        inserted = args;
+        break
+      case 'splice':
+        inserted = args.slice(2);
+        break
+    }
+    if (inserted) { ob.observeArray(inserted); }
+    // notify change
+    ob.dep.notify();
+    return result
+  });
+});
+
+/*  */
+
+var arrayKeys = Object.getOwnPropertyNames(arrayMethods);
+
+/**
+ * In some cases we may want to disable observation inside a component's
+ * update computation.
+ */
+var shouldObserve = true;
+
+function toggleObserving (value) {
+  shouldObserve = value;
+}
+
+/**
+ * Observer class that is attached to each observed
+ * object. Once attached, the observer converts the target
+ * object's property keys into getter/setters that
+ * collect dependencies and dispatch updates.
+ */
+var Observer = function Observer (value) {
+  this.value = value;
+  this.dep = new Dep();
+  this.vmCount = 0;
+  def(value, '__ob__', this);
+  if (Array.isArray(value)) {
+    var augment = hasProto
+      ? protoAugment
+      : copyAugment;
+    augment(value, arrayMethods, arrayKeys);
+    this.observeArray(value);
+  } else {
+    this.walk(value);
+  }
+};
+
+/**
+ * Walk through each property and convert them into
+ * getter/setters. This method should only be called when
+ * value type is Object.
+ */
+Observer.prototype.walk = function walk (obj) {
+  var keys = Object.keys(obj);
+  for (var i = 0; i < keys.length; i++) {
+    defineReactive(obj, keys[i]);
+  }
+};
+
+/**
+ * Observe a list of Array items.
+ */
+Observer.prototype.observeArray = function observeArray (items) {
+  for (var i = 0, l = items.length; i < l; i++) {
+    observe(items[i]);
+  }
+};
+
+// helpers
+
+/**
+ * Augment an target Object or Array by intercepting
+ * the prototype chain using __proto__
+ */
+function protoAugment (target, src, keys) {
+  /* eslint-disable no-proto */
+  target.__proto__ = src;
+  /* eslint-enable no-proto */
+}
+
+/**
+ * Augment an target Object or Array by defining
+ * hidden properties.
+ */
+/* istanbul ignore next */
+function copyAugment (target, src, keys) {
+  for (var i = 0, l = keys.length; i < l; i++) {
+    var key = keys[i];
+    def(target, key, src[key]);
+  }
+}
+
+/**
+ * Attempt to create an observer instance for a value,
+ * returns the new observer if successfully observed,
+ * or the existing observer if the value already has one.
+ */
+function observe (value, asRootData) {
+  if (!isObject(value) || value instanceof VNode) {
+    return
+  }
+  var ob;
+  if (hasOwn(value, '__ob__') && value.__ob__ instanceof Observer) {
+    ob = value.__ob__;
+  } else if (
+    shouldObserve &&
+    !isServerRendering() &&
+    (Array.isArray(value) || isPlainObject(value)) &&
+    Object.isExtensible(value) &&
+    !value._isVue
+  ) {
+    ob = new Observer(value);
+  }
+  if (asRootData && ob) {
+    ob.vmCount++;
+  }
+  return ob
+}
+
+/**
+ * Define a reactive property on an Object.
+ */
+function defineReactive (
+  obj,
+  key,
+  val,
+  customSetter,
+  shallow
+) {
+  var dep = new Dep();
+
+  var property = Object.getOwnPropertyDescriptor(obj, key);
+  if (property && property.configurable === false) {
+    return
+  }
+
+  // cater for pre-defined getter/setters
+  var getter = property && property.get;
+  if (!getter && arguments.length === 2) {
+    val = obj[key];
+  }
+  var setter = property && property.set;
+
+  var childOb = !shallow && observe(val);
+  Object.defineProperty(obj, key, {
+    enumerable: true,
+    configurable: true,
+    get: function reactiveGetter () {
+      var value = getter ? getter.call(obj) : val;
+      if (Dep.target) {
+        dep.depend();
+        if (childOb) {
+          childOb.dep.depend();
+          if (Array.isArray(value)) {
+            dependArray(value);
+          }
+        }
+      }
+      return value
+    },
+    set: function reactiveSetter (newVal) {
+      var value = getter ? getter.call(obj) : val;
+      /* eslint-disable no-self-compare */
+      if (newVal === value || (newVal !== newVal && value !== value)) {
+        return
+      }
+      /* eslint-enable no-self-compare */
+      if (process.env.NODE_ENV !== 'production' && customSetter) {
+        customSetter();
+      }
+      if (setter) {
+        setter.call(obj, newVal);
+      } else {
+        val = newVal;
+      }
+      childOb = !shallow && observe(newVal);
+      dep.notify();
+    }
+  });
+}
+
+/**
+ * Set a property on an object. Adds the new property and
+ * triggers change notification if the property doesn't
+ * already exist.
+ */
+function set (target, key, val) {
+  if (process.env.NODE_ENV !== 'production' &&
+    (isUndef(target) || isPrimitive(target))
+  ) {
+    warn(("Cannot set reactive property on undefined, null, or primitive value: " + ((target))));
+  }
+  if (Array.isArray(target) && isValidArrayIndex(key)) {
+    target.length = Math.max(target.length, key);
+    target.splice(key, 1, val);
+    return val
+  }
+  if (key in target && !(key in Object.prototype)) {
+    target[key] = val;
+    return val
+  }
+  var ob = (target).__ob__;
+  if (target._isVue || (ob && ob.vmCount)) {
+    process.env.NODE_ENV !== 'production' && warn(
+      'Avoid adding reactive properties to a Vue instance or its root $data ' +
+      'at runtime - declare it upfront in the data option.'
+    );
+    return val
+  }
+  if (!ob) {
+    target[key] = val;
+    return val
+  }
+  defineReactive(ob.value, key, val);
+  ob.dep.notify();
+  return val
+}
+
+/**
+ * Delete a property and trigger change if necessary.
+ */
+function del (target, key) {
+  if (process.env.NODE_ENV !== 'production' &&
+    (isUndef(target) || isPrimitive(target))
+  ) {
+    warn(("Cannot delete reactive property on undefined, null, or primitive value: " + ((target))));
+  }
+  if (Array.isArray(target) && isValidArrayIndex(key)) {
+    target.splice(key, 1);
+    return
+  }
+  var ob = (target).__ob__;
+  if (target._isVue || (ob && ob.vmCount)) {
+    process.env.NODE_ENV !== 'production' && warn(
+      'Avoid deleting properties on a Vue instance or its root $data ' +
+      '- just set it to null.'
+    );
+    return
+  }
+  if (!hasOwn(target, key)) {
+    return
+  }
+  delete target[key];
+  if (!ob) {
+    return
+  }
+  ob.dep.notify();
+}
+
+/**
+ * Collect dependencies on array elements when the array is touched, since
+ * we cannot intercept array element access like property getters.
+ */
+function dependArray (value) {
+  for (var e = (void 0), i = 0, l = value.length; i < l; i++) {
+    e = value[i];
+    e && e.__ob__ && e.__ob__.dep.depend();
+    if (Array.isArray(e)) {
+      dependArray(e);
+    }
+  }
+}
+
+/*  */
+
+/**
+ * Option overwriting strategies are functions that handle
+ * how to merge a parent option value and a child option
+ * value into the final value.
+ */
+var strats = config.optionMergeStrategies;
+
+/**
+ * Options with restrictions
+ */
+if (process.env.NODE_ENV !== 'production') {
+  strats.el = strats.propsData = function (parent, child, vm, key) {
+    if (!vm) {
+      warn(
+        "option \"" + key + "\" can only be used during instance " +
+        'creation with the `new` keyword.'
+      );
+    }
+    return defaultStrat(parent, child)
+  };
+}
+
+/**
+ * Helper that recursively merges two data objects together.
+ */
+function mergeData (to, from) {
+  if (!from) { return to }
+  var key, toVal, fromVal;
+  var keys = Object.keys(from);
+  for (var i = 0; i < keys.length; i++) {
+    key = keys[i];
+    toVal = to[key];
+    fromVal = from[key];
+    if (!hasOwn(to, key)) {
+      set(to, key, fromVal);
+    } else if (isPlainObject(toVal) && isPlainObject(fromVal)) {
+      mergeData(toVal, fromVal);
+    }
+  }
+  return to
+}
+
+/**
+ * Data
+ */
+function mergeDataOrFn (
+  parentVal,
+  childVal,
+  vm
+) {
+  if (!vm) {
+    // in a Vue.extend merge, both should be functions
+    if (!childVal) {
+      return parentVal
+    }
+    if (!parentVal) {
+      return childVal
+    }
+    // when parentVal & childVal are both present,
+    // we need to return a function that returns the
+    // merged result of both functions... no need to
+    // check if parentVal is a function here because
+    // it has to be a function to pass previous merges.
+    return function mergedDataFn () {
+      return mergeData(
+        typeof childVal === 'function' ? childVal.call(this, this) : childVal,
+        typeof parentVal === 'function' ? parentVal.call(this, this) : parentVal
+      )
+    }
+  } else {
+    return function mergedInstanceDataFn () {
+      // instance merge
+      var instanceData = typeof childVal === 'function'
+        ? childVal.call(vm, vm)
+        : childVal;
+      var defaultData = typeof parentVal === 'function'
+        ? parentVal.call(vm, vm)
+        : parentVal;
+      if (instanceData) {
+        return mergeData(instanceData, defaultData)
+      } else {
+        return defaultData
+      }
+    }
+  }
+}
+
+strats.data = function (
+  parentVal,
+  childVal,
+  vm
+) {
+  if (!vm) {
+    if (childVal && typeof childVal !== 'function') {
+      process.env.NODE_ENV !== 'production' && warn(
+        'The "data" option should be a function ' +
+        'that returns a per-instance value in component ' +
+        'definitions.',
+        vm
+      );
+
+      return parentVal
+    }
+    return mergeDataOrFn(parentVal, childVal)
+  }
+
+  return mergeDataOrFn(parentVal, childVal, vm)
+};
+
+/**
+ * Hooks and props are merged as arrays.
+ */
+function mergeHook (
+  parentVal,
+  childVal
+) {
+  return childVal
+    ? parentVal
+      ? parentVal.concat(childVal)
+      : Array.isArray(childVal)
+        ? childVal
+        : [childVal]
+    : parentVal
+}
+
+LIFECYCLE_HOOKS.forEach(function (hook) {
+  strats[hook] = mergeHook;
+});
+
+/**
+ * Assets
+ *
+ * When a vm is present (instance creation), we need to do
+ * a three-way merge between constructor options, instance
+ * options and parent options.
+ */
+function mergeAssets (
+  parentVal,
+  childVal,
+  vm,
+  key
+) {
+  var res = Object.create(parentVal || null);
+  if (childVal) {
+    process.env.NODE_ENV !== 'production' && assertObjectType(key, childVal, vm);
+    return extend(res, childVal)
+  } else {
+    return res
+  }
+}
+
+ASSET_TYPES.forEach(function (type) {
+  strats[type + 's'] = mergeAssets;
+});
+
+/**
+ * Watchers.
+ *
+ * Watchers hashes should not overwrite one
+ * another, so we merge them as arrays.
+ */
+strats.watch = function (
+  parentVal,
+  childVal,
+  vm,
+  key
+) {
+  // work around Firefox's Object.prototype.watch...
+  if (parentVal === nativeWatch) { parentVal = undefined; }
+  if (childVal === nativeWatch) { childVal = undefined; }
+  /* istanbul ignore if */
+  if (!childVal) { return Object.create(parentVal || null) }
+  if (process.env.NODE_ENV !== 'production') {
+    assertObjectType(key, childVal, vm);
+  }
+  if (!parentVal) { return childVal }
+  var ret = {};
+  extend(ret, parentVal);
+  for (var key$1 in childVal) {
+    var parent = ret[key$1];
+    var child = childVal[key$1];
+    if (parent && !Array.isArray(parent)) {
+      parent = [parent];
+    }
+    ret[key$1] = parent
+      ? parent.concat(child)
+      : Array.isArray(child) ? child : [child];
+  }
+  return ret
+};
+
+/**
+ * Other object hashes.
+ */
+strats.props =
+strats.methods =
+strats.inject =
+strats.computed = function (
+  parentVal,
+  childVal,
+  vm,
+  key
+) {
+  if (childVal && process.env.NODE_ENV !== 'production') {
+    assertObjectType(key, childVal, vm);
+  }
+  if (!parentVal) { return childVal }
+  var ret = Object.create(null);
+  extend(ret, parentVal);
+  if (childVal) { extend(ret, childVal); }
+  return ret
+};
+strats.provide = mergeDataOrFn;
+
+/**
+ * Default strategy.
+ */
+var defaultStrat = function (parentVal, childVal) {
+  return childVal === undefined
+    ? parentVal
+    : childVal
+};
+
+/**
+ * Validate component names
+ */
+function checkComponents (options) {
+  for (var key in options.components) {
+    validateComponentName(key);
+  }
+}
+
+function validateComponentName (name) {
+  if (!/^[a-zA-Z][\w-]*$/.test(name)) {
+    warn(
+      'Invalid component name: "' + name + '". Component names ' +
+      'can only contain alphanumeric characters and the hyphen, ' +
+      'and must start with a letter.'
+    );
+  }
+  if (isBuiltInTag(name) || config.isReservedTag(name)) {
+    warn(
+      'Do not use built-in or reserved HTML elements as component ' +
+      'id: ' + name
+    );
+  }
+}
+
+/**
+ * Ensure all props option syntax are normalized into the
+ * Object-based format.
+ */
+function normalizeProps (options, vm) {
+  var props = options.props;
+  if (!props) { return }
+  var res = {};
+  var i, val, name;
+  if (Array.isArray(props)) {
+    i = props.length;
+    while (i--) {
+      val = props[i];
+      if (typeof val === 'string') {
+        name = camelize(val);
+        res[name] = { type: null };
+      } else if (process.env.NODE_ENV !== 'production') {
+        warn('props must be strings when using array syntax.');
+      }
+    }
+  } else if (isPlainObject(props)) {
+    for (var key in props) {
+      val = props[key];
+      name = camelize(key);
+      res[name] = isPlainObject(val)
+        ? val
+        : { type: val };
+    }
+  } else if (process.env.NODE_ENV !== 'production') {
+    warn(
+      "Invalid value for option \"props\": expected an Array or an Object, " +
+      "but got " + (toRawType(props)) + ".",
+      vm
+    );
+  }
+  options.props = res;
+}
+
+/**
+ * Normalize all injections into Object-based format
+ */
+function normalizeInject (options, vm) {
+  var inject = options.inject;
+  if (!inject) { return }
+  var normalized = options.inject = {};
+  if (Array.isArray(inject)) {
+    for (var i = 0; i < inject.length; i++) {
+      normalized[inject[i]] = { from: inject[i] };
+    }
+  } else if (isPlainObject(inject)) {
+    for (var key in inject) {
+      var val = inject[key];
+      normalized[key] = isPlainObject(val)
+        ? extend({ from: key }, val)
+        : { from: val };
+    }
+  } else if (process.env.NODE_ENV !== 'production') {
+    warn(
+      "Invalid value for option \"inject\": expected an Array or an Object, " +
+      "but got " + (toRawType(inject)) + ".",
+      vm
+    );
+  }
+}
+
+/**
+ * Normalize raw function directives into object format.
+ */
+function normalizeDirectives (options) {
+  var dirs = options.directives;
+  if (dirs) {
+    for (var key in dirs) {
+      var def = dirs[key];
+      if (typeof def === 'function') {
+        dirs[key] = { bind: def, update: def };
+      }
+    }
+  }
+}
+
+function assertObjectType (name, value, vm) {
+  if (!isPlainObject(value)) {
+    warn(
+      "Invalid value for option \"" + name + "\": expected an Object, " +
+      "but got " + (toRawType(value)) + ".",
+      vm
+    );
+  }
+}
+
+/**
+ * Merge two option objects into a new one.
+ * Core utility used in both instantiation and inheritance.
+ */
+function mergeOptions (
+  parent,
+  child,
+  vm
+) {
+  if (process.env.NODE_ENV !== 'production') {
+    checkComponents(child);
+  }
+
+  if (typeof child === 'function') {
+    child = child.options;
+  }
+
+  normalizeProps(child, vm);
+  normalizeInject(child, vm);
+  normalizeDirectives(child);
+  var extendsFrom = child.extends;
+  if (extendsFrom) {
+    parent = mergeOptions(parent, extendsFrom, vm);
+  }
+  if (child.mixins) {
+    for (var i = 0, l = child.mixins.length; i < l; i++) {
+      parent = mergeOptions(parent, child.mixins[i], vm);
+    }
+  }
+  var options = {};
+  var key;
+  for (key in parent) {
+    mergeField(key);
+  }
+  for (key in child) {
+    if (!hasOwn(parent, key)) {
+      mergeField(key);
+    }
+  }
+  function mergeField (key) {
+    var strat = strats[key] || defaultStrat;
+    options[key] = strat(parent[key], child[key], vm, key);
+  }
+  return options
+}
+
+/**
+ * Resolve an asset.
+ * This function is used because child instances need access
+ * to assets defined in its ancestor chain.
+ */
+function resolveAsset (
+  options,
+  type,
+  id,
+  warnMissing
+) {
+  /* istanbul ignore if */
+  if (typeof id !== 'string') {
+    return
+  }
+  var assets = options[type];
+  // check local registration variations first
+  if (hasOwn(assets, id)) { return assets[id] }
+  var camelizedId = camelize(id);
+  if (hasOwn(assets, camelizedId)) { return assets[camelizedId] }
+  var PascalCaseId = capitalize(camelizedId);
+  if (hasOwn(assets, PascalCaseId)) { return assets[PascalCaseId] }
+  // fallback to prototype chain
+  var res = assets[id] || assets[camelizedId] || assets[PascalCaseId];
+  if (process.env.NODE_ENV !== 'production' && warnMissing && !res) {
+    warn(
+      'Failed to resolve ' + type.slice(0, -1) + ': ' + id,
+      options
+    );
+  }
+  return res
+}
+
+/*  */
+
+function validateProp (
+  key,
+  propOptions,
+  propsData,
+  vm
+) {
+  var prop = propOptions[key];
+  var absent = !hasOwn(propsData, key);
+  var value = propsData[key];
+  // boolean casting
+  var booleanIndex = getTypeIndex(Boolean, prop.type);
+  if (booleanIndex > -1) {
+    if (absent && !hasOwn(prop, 'default')) {
+      value = false;
+    } else if (value === '' || value === hyphenate(key)) {
+      // only cast empty string / same name to boolean if
+      // boolean has higher priority
+      var stringIndex = getTypeIndex(String, prop.type);
+      if (stringIndex < 0 || booleanIndex < stringIndex) {
+        value = true;
+      }
+    }
+  }
+  // check default value
+  if (value === undefined) {
+    value = getPropDefaultValue(vm, prop, key);
+    // since the default value is a fresh copy,
+    // make sure to observe it.
+    var prevShouldObserve = shouldObserve;
+    toggleObserving(true);
+    observe(value);
+    toggleObserving(prevShouldObserve);
+  }
+  if (
+    process.env.NODE_ENV !== 'production' &&
+    // skip validation for weex recycle-list child component props
+    !(true && isObject(value) && ('@binding' in value))
+  ) {
+    assertProp(prop, key, value, vm, absent);
+  }
+  return value
+}
+
+/**
+ * Get the default value of a prop.
+ */
+function getPropDefaultValue (vm, prop, key) {
+  // no default, return undefined
+  if (!hasOwn(prop, 'default')) {
+    return undefined
+  }
+  var def = prop.default;
+  // warn against non-factory defaults for Object & Array
+  if (process.env.NODE_ENV !== 'production' && isObject(def)) {
+    warn(
+      'Invalid default value for prop "' + key + '": ' +
+      'Props with type Object/Array must use a factory function ' +
+      'to return the default value.',
+      vm
+    );
+  }
+  // the raw prop value was also undefined from previous render,
+  // return previous default value to avoid unnecessary watcher trigger
+  if (vm && vm.$options.propsData &&
+    vm.$options.propsData[key] === undefined &&
+    vm._props[key] !== undefined
+  ) {
+    return vm._props[key]
+  }
+  // call factory function for non-Function types
+  // a value is Function if its prototype is function even across different execution context
+  return typeof def === 'function' && getType(prop.type) !== 'Function'
+    ? def.call(vm)
+    : def
+}
+
+/**
+ * Assert whether a prop is valid.
+ */
+function assertProp (
+  prop,
+  name,
+  value,
+  vm,
+  absent
+) {
+  if (prop.required && absent) {
+    warn(
+      'Missing required prop: "' + name + '"',
+      vm
+    );
+    return
+  }
+  if (value == null && !prop.required) {
+    return
+  }
+  var type = prop.type;
+  var valid = !type || type === true;
+  var expectedTypes = [];
+  if (type) {
+    if (!Array.isArray(type)) {
+      type = [type];
+    }
+    for (var i = 0; i < type.length && !valid; i++) {
+      var assertedType = assertType(value, type[i]);
+      expectedTypes.push(assertedType.expectedType || '');
+      valid = assertedType.valid;
+    }
+  }
+  if (!valid) {
+    warn(
+      "Invalid prop: type check failed for prop \"" + name + "\"." +
+      " Expected " + (expectedTypes.map(capitalize).join(', ')) +
+      ", got " + (toRawType(value)) + ".",
+      vm
+    );
+    return
+  }
+  var validator = prop.validator;
+  if (validator) {
+    if (!validator(value)) {
+      warn(
+        'Invalid prop: custom validator check failed for prop "' + name + '".',
+        vm
+      );
+    }
+  }
+}
+
+var simpleCheckRE = /^(String|Number|Boolean|Function|Symbol)$/;
+
+function assertType (value, type) {
+  var valid;
+  var expectedType = getType(type);
+  if (simpleCheckRE.test(expectedType)) {
+    var t = typeof value;
+    valid = t === expectedType.toLowerCase();
+    // for primitive wrapper objects
+    if (!valid && t === 'object') {
+      valid = value instanceof type;
+    }
+  } else if (expectedType === 'Object') {
+    valid = isPlainObject(value);
+  } else if (expectedType === 'Array') {
+    valid = Array.isArray(value);
+  } else {
+    valid = value instanceof type;
+  }
+  return {
+    valid: valid,
+    expectedType: expectedType
+  }
+}
+
+/**
+ * Use function string name to check built-in types,
+ * because a simple equality check will fail when running
+ * across different vms / iframes.
+ */
+function getType (fn) {
+  var match = fn && fn.toString().match(/^\s*function (\w+)/);
+  return match ? match[1] : ''
+}
+
+function isSameType (a, b) {
+  return getType(a) === getType(b)
+}
+
+function getTypeIndex (type, expectedTypes) {
+  if (!Array.isArray(expectedTypes)) {
+    return isSameType(expectedTypes, type) ? 0 : -1
+  }
+  for (var i = 0, len = expectedTypes.length; i < len; i++) {
+    if (isSameType(expectedTypes[i], type)) {
+      return i
+    }
+  }
+  return -1
+}
+
+/*  */
+
+function handleError (err, vm, info) {
+  if (vm) {
+    var cur = vm;
+    while ((cur = cur.$parent)) {
+      var hooks = cur.$options.errorCaptured;
+      if (hooks) {
+        for (var i = 0; i < hooks.length; i++) {
+          try {
+            var capture = hooks[i].call(cur, err, vm, info) === false;
+            if (capture) { return }
+          } catch (e) {
+            globalHandleError(e, cur, 'errorCaptured hook');
+          }
+        }
+      }
+    }
+  }
+  globalHandleError(err, vm, info);
+}
+
+function globalHandleError (err, vm, info) {
+  if (config.errorHandler) {
+    try {
+      return config.errorHandler.call(null, err, vm, info)
+    } catch (e) {
+      logError(e, null, 'config.errorHandler');
+    }
+  }
+  logError(err, vm, info);
+}
+
+function logError (err, vm, info) {
+  if (process.env.NODE_ENV !== 'production') {
+    warn(("Error in " + info + ": \"" + (err.toString()) + "\""), vm);
+  }
+  /* istanbul ignore else */
+  if ((inBrowser || inWeex) && typeof console !== 'undefined') {
+    console.error(err);
+  } else {
+    throw err
+  }
+}
+
+/*  */
+/* globals MessageChannel */
+
+var callbacks = [];
+var pending = false;
+
+function flushCallbacks () {
+  pending = false;
+  var copies = callbacks.slice(0);
+  callbacks.length = 0;
+  for (var i = 0; i < copies.length; i++) {
+    copies[i]();
+  }
+}
+
+// Here we have async deferring wrappers using both microtasks and (macro) tasks.
+// In < 2.4 we used microtasks everywhere, but there are some scenarios where
+// microtasks have too high a priority and fire in between supposedly
+// sequential events (e.g. #4521, #6690) or even between bubbling of the same
+// event (#6566). However, using (macro) tasks everywhere also has subtle problems
+// when state is changed right before repaint (e.g. #6813, out-in transitions).
+// Here we use microtask by default, but expose a way to force (macro) task when
+// needed (e.g. in event handlers attached by v-on).
+var microTimerFunc;
+var macroTimerFunc;
+var useMacroTask = false;
+
+// Determine (macro) task defer implementation.
+// Technically setImmediate should be the ideal choice, but it's only available
+// in IE. The only polyfill that consistently queues the callback after all DOM
+// events triggered in the same loop is by using MessageChannel.
+/* istanbul ignore if */
+if (typeof setImmediate !== 'undefined' && isNative(setImmediate)) {
+  macroTimerFunc = function () {
+    setImmediate(flushCallbacks);
+  };
+} else if (typeof MessageChannel !== 'undefined' && (
+  isNative(MessageChannel) ||
+  // PhantomJS
+  MessageChannel.toString() === '[object MessageChannelConstructor]'
+)) {
+  var channel = new MessageChannel();
+  var port = channel.port2;
+  channel.port1.onmessage = flushCallbacks;
+  macroTimerFunc = function () {
+    port.postMessage(1);
+  };
+} else {
+  /* istanbul ignore next */
+  macroTimerFunc = function () {
+    setTimeout(flushCallbacks, 0);
+  };
+}
+
+// Determine microtask defer implementation.
+/* istanbul ignore next, $flow-disable-line */
+if (typeof Promise !== 'undefined' && isNative(Promise)) {
+  var p = Promise.resolve();
+  microTimerFunc = function () {
+    p.then(flushCallbacks);
+    // in problematic UIWebViews, Promise.then doesn't completely break, but
+    // it can get stuck in a weird state where callbacks are pushed into the
+    // microtask queue but the queue isn't being flushed, until the browser
+    // needs to do some other work, e.g. handle a timer. Therefore we can
+    // "force" the microtask queue to be flushed by adding an empty timer.
+    if (isIOS) { setTimeout(noop); }
+  };
+} else {
+  // fallback to macro
+  microTimerFunc = macroTimerFunc;
+}
+
+/**
+ * Wrap a function so that if any code inside triggers state change,
+ * the changes are queued using a (macro) task instead of a microtask.
+ */
+
+
+function nextTick (cb, ctx) {
+  var _resolve;
+  callbacks.push(function () {
+    if (cb) {
+      try {
+        cb.call(ctx);
+      } catch (e) {
+        handleError(e, ctx, 'nextTick');
+      }
+    } else if (_resolve) {
+      _resolve(ctx);
+    }
+  });
+  if (!pending) {
+    pending = true;
+    if (useMacroTask) {
+      macroTimerFunc();
+    } else {
+      microTimerFunc();
+    }
+  }
+  // $flow-disable-line
+  if (!cb && typeof Promise !== 'undefined') {
+    return new Promise(function (resolve) {
+      _resolve = resolve;
+    })
+  }
+}
+
+/*  */
+
+/* not type checking this file because flow doesn't play well with Proxy */
+
+var initProxy;
+
+if (process.env.NODE_ENV !== 'production') {
+  var allowedGlobals = makeMap(
+    'Infinity,undefined,NaN,isFinite,isNaN,' +
+    'parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,' +
+    'Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,' +
+    'require' // for Webpack/Browserify
+  );
+
+  var warnNonPresent = function (target, key) {
+    warn(
+      "Property or method \"" + key + "\" is not defined on the instance but " +
+      'referenced during render. Make sure that this property is reactive, ' +
+      'either in the data option, or for class-based components, by ' +
+      'initializing the property. ' +
+      'See: https://vuejs.org/v2/guide/reactivity.html#Declaring-Reactive-Properties.',
+      target
+    );
+  };
+
+  var hasProxy =
+    typeof Proxy !== 'undefined' && isNative(Proxy);
+
+  if (hasProxy) {
+    var isBuiltInModifier = makeMap('stop,prevent,self,ctrl,shift,alt,meta,exact');
+    config.keyCodes = new Proxy(config.keyCodes, {
+      set: function set (target, key, value) {
+        if (isBuiltInModifier(key)) {
+          warn(("Avoid overwriting built-in modifier in config.keyCodes: ." + key));
+          return false
+        } else {
+          target[key] = value;
+          return true
+        }
+      }
+    });
+  }
+
+  var hasHandler = {
+    has: function has (target, key) {
+      var has = key in target;
+      var isAllowed = allowedGlobals(key) || key.charAt(0) === '_';
+      if (!has && !isAllowed) {
+        warnNonPresent(target, key);
+      }
+      return has || !isAllowed
+    }
+  };
+
+  var getHandler = {
+    get: function get (target, key) {
+      if (typeof key === 'string' && !(key in target)) {
+        warnNonPresent(target, key);
+      }
+      return target[key]
+    }
+  };
+
+  initProxy = function initProxy (vm) {
+    if (hasProxy) {
+      // determine which proxy handler to use
+      var options = vm.$options;
+      var handlers = options.render && options.render._withStripped
+        ? getHandler
+        : hasHandler;
+      vm._renderProxy = new Proxy(vm, handlers);
+    } else {
+      vm._renderProxy = vm;
+    }
+  };
+}
+
+/*  */
+
+var seenObjects = new _Set();
+
+/**
+ * Recursively traverse an object to evoke all converted
+ * getters, so that every nested property inside the object
+ * is collected as a "deep" dependency.
+ */
+function traverse (val) {
+  _traverse(val, seenObjects);
+  seenObjects.clear();
+}
+
+function _traverse (val, seen) {
+  var i, keys;
+  var isA = Array.isArray(val);
+  if ((!isA && !isObject(val)) || Object.isFrozen(val) || val instanceof VNode) {
+    return
+  }
+  if (val.__ob__) {
+    var depId = val.__ob__.dep.id;
+    if (seen.has(depId)) {
+      return
+    }
+    seen.add(depId);
+  }
+  if (isA) {
+    i = val.length;
+    while (i--) { _traverse(val[i], seen); }
+  } else {
+    keys = Object.keys(val);
+    i = keys.length;
+    while (i--) { _traverse(val[keys[i]], seen); }
+  }
+}
+
+var mark;
+var measure;
+
+if (process.env.NODE_ENV !== 'production') {
+  var perf = inBrowser && window.performance;
+  /* istanbul ignore if */
+  if (
+    perf &&
+    perf.mark &&
+    perf.measure &&
+    perf.clearMarks &&
+    perf.clearMeasures
+  ) {
+    mark = function (tag) { return perf.mark(tag); };
+    measure = function (name, startTag, endTag) {
+      perf.measure(name, startTag, endTag);
+      perf.clearMarks(startTag);
+      perf.clearMarks(endTag);
+      perf.clearMeasures(name);
+    };
+  }
+}
+
+/*  */
+
+var normalizeEvent = cached(function (name) {
+  var passive = name.charAt(0) === '&';
+  name = passive ? name.slice(1) : name;
+  var once$$1 = name.charAt(0) === '~'; // Prefixed last, checked first
+  name = once$$1 ? name.slice(1) : name;
+  var capture = name.charAt(0) === '!';
+  name = capture ? name.slice(1) : name;
+  return {
+    name: name,
+    once: once$$1,
+    capture: capture,
+    passive: passive
+  }
+});
+
+function createFnInvoker (fns) {
+  function invoker () {
+    var arguments$1 = arguments;
+
+    var fns = invoker.fns;
+    if (Array.isArray(fns)) {
+      var cloned = fns.slice();
+      for (var i = 0; i < cloned.length; i++) {
+        cloned[i].apply(null, arguments$1);
+      }
+    } else {
+      // return handler return value for single handlers
+      return fns.apply(null, arguments)
+    }
+  }
+  invoker.fns = fns;
+  return invoker
+}
+
+function updateListeners (
+  on,
+  oldOn,
+  add,
+  remove$$1,
+  vm
+) {
+  var name, def, cur, old, event;
+  for (name in on) {
+    def = cur = on[name];
+    old = oldOn[name];
+    event = normalizeEvent(name);
+    /* istanbul ignore if */
+    if (true && isPlainObject(def)) {
+      cur = def.handler;
+      event.params = def.params;
+    }
+    if (isUndef(cur)) {
+      process.env.NODE_ENV !== 'production' && warn(
+        "Invalid handler for event \"" + (event.name) + "\": got " + String(cur),
+        vm
+      );
+    } else if (isUndef(old)) {
+      if (isUndef(cur.fns)) {
+        cur = on[name] = createFnInvoker(cur);
+      }
+      add(event.name, cur, event.once, event.capture, event.passive, event.params);
+    } else if (cur !== old) {
+      old.fns = cur;
+      on[name] = old;
+    }
+  }
+  for (name in oldOn) {
+    if (isUndef(on[name])) {
+      event = normalizeEvent(name);
+      remove$$1(event.name, oldOn[name], event.capture);
+    }
+  }
+}
+
+/*  */
+
+function mergeVNodeHook (def, hookKey, hook) {
+  if (def instanceof VNode) {
+    def = def.data.hook || (def.data.hook = {});
+  }
+  var invoker;
+  var oldHook = def[hookKey];
+
+  function wrappedHook () {
+    hook.apply(this, arguments);
+    // important: remove merged hook to ensure it's called only once
+    // and prevent memory leak
+    remove(invoker.fns, wrappedHook);
+  }
+
+  if (isUndef(oldHook)) {
+    // no existing hook
+    invoker = createFnInvoker([wrappedHook]);
+  } else {
+    /* istanbul ignore if */
+    if (isDef(oldHook.fns) && isTrue(oldHook.merged)) {
+      // already a merged invoker
+      invoker = oldHook;
+      invoker.fns.push(wrappedHook);
+    } else {
+      // existing plain hook
+      invoker = createFnInvoker([oldHook, wrappedHook]);
+    }
+  }
+
+  invoker.merged = true;
+  def[hookKey] = invoker;
+}
+
+/*  */
+
+function extractPropsFromVNodeData (
+  data,
+  Ctor,
+  tag
+) {
+  // we are only extracting raw values here.
+  // validation and default values are handled in the child
+  // component itself.
+  var propOptions = Ctor.options.props;
+  if (isUndef(propOptions)) {
+    return
+  }
+  var res = {};
+  var attrs = data.attrs;
+  var props = data.props;
+  if (isDef(attrs) || isDef(props)) {
+    for (var key in propOptions) {
+      var altKey = hyphenate(key);
+      if (process.env.NODE_ENV !== 'production') {
+        var keyInLowerCase = key.toLowerCase();
+        if (
+          key !== keyInLowerCase &&
+          attrs && hasOwn(attrs, keyInLowerCase)
+        ) {
+          tip(
+            "Prop \"" + keyInLowerCase + "\" is passed to component " +
+            (formatComponentName(tag || Ctor)) + ", but the declared prop name is" +
+            " \"" + key + "\". " +
+            "Note that HTML attributes are case-insensitive and camelCased " +
+            "props need to use their kebab-case equivalents when using in-DOM " +
+            "templates. You should probably use \"" + altKey + "\" instead of \"" + key + "\"."
+          );
+        }
+      }
+      checkProp(res, props, key, altKey, true) ||
+      checkProp(res, attrs, key, altKey, false);
+    }
+  }
+  return res
+}
+
+function checkProp (
+  res,
+  hash,
+  key,
+  altKey,
+  preserve
+) {
+  if (isDef(hash)) {
+    if (hasOwn(hash, key)) {
+      res[key] = hash[key];
+      if (!preserve) {
+        delete hash[key];
+      }
+      return true
+    } else if (hasOwn(hash, altKey)) {
+      res[key] = hash[altKey];
+      if (!preserve) {
+        delete hash[altKey];
+      }
+      return true
+    }
+  }
+  return false
+}
+
+/*  */
+
+// The template compiler attempts to minimize the need for normalization by
+// statically analyzing the template at compile time.
+//
+// For plain HTML markup, normalization can be completely skipped because the
+// generated render function is guaranteed to return Array<VNode>. There are
+// two cases where extra normalization is needed:
+
+// 1. When the children contains components - because a functional component
+// may return an Array instead of a single root. In this case, just a simple
+// normalization is needed - if any child is an Array, we flatten the whole
+// thing with Array.prototype.concat. It is guaranteed to be only 1-level deep
+// because functional components already normalize their own children.
+function simpleNormalizeChildren (children) {
+  for (var i = 0; i < children.length; i++) {
+    if (Array.isArray(children[i])) {
+      return Array.prototype.concat.apply([], children)
+    }
+  }
+  return children
+}
+
+// 2. When the children contains constructs that always generated nested Arrays,
+// e.g. <template>, <slot>, v-for, or when the children is provided by user
+// with hand-written render functions / JSX. In such cases a full normalization
+// is needed to cater to all possible types of children values.
+function normalizeChildren (children) {
+  return isPrimitive(children)
+    ? [createTextVNode(children)]
+    : Array.isArray(children)
+      ? normalizeArrayChildren(children)
+      : undefined
+}
+
+function isTextNode (node) {
+  return isDef(node) && isDef(node.text) && isFalse(node.isComment)
+}
+
+function normalizeArrayChildren (children, nestedIndex) {
+  var res = [];
+  var i, c, lastIndex, last;
+  for (i = 0; i < children.length; i++) {
+    c = children[i];
+    if (isUndef(c) || typeof c === 'boolean') { continue }
+    lastIndex = res.length - 1;
+    last = res[lastIndex];
+    //  nested
+    if (Array.isArray(c)) {
+      if (c.length > 0) {
+        c = normalizeArrayChildren(c, ((nestedIndex || '') + "_" + i));
+        // merge adjacent text nodes
+        if (isTextNode(c[0]) && isTextNode(last)) {
+          res[lastIndex] = createTextVNode(last.text + (c[0]).text);
+          c.shift();
+        }
+        res.push.apply(res, c);
+      }
+    } else if (isPrimitive(c)) {
+      if (isTextNode(last)) {
+        // merge adjacent text nodes
+        // this is necessary for SSR hydration because text nodes are
+        // essentially merged when rendered to HTML strings
+        res[lastIndex] = createTextVNode(last.text + c);
+      } else if (c !== '') {
+        // convert primitive to vnode
+        res.push(createTextVNode(c));
+      }
+    } else {
+      if (isTextNode(c) && isTextNode(last)) {
+        // merge adjacent text nodes
+        res[lastIndex] = createTextVNode(last.text + c.text);
+      } else {
+        // default key for nested array children (likely generated by v-for)
+        if (isTrue(children._isVList) &&
+          isDef(c.tag) &&
+          isUndef(c.key) &&
+          isDef(nestedIndex)) {
+          c.key = "__vlist" + nestedIndex + "_" + i + "__";
+        }
+        res.push(c);
+      }
+    }
+  }
+  return res
+}
+
+/*  */
+
+function ensureCtor (comp, base) {
+  if (
+    comp.__esModule ||
+    (hasSymbol && comp[Symbol.toStringTag] === 'Module')
+  ) {
+    comp = comp.default;
+  }
+  return isObject(comp)
+    ? base.extend(comp)
+    : comp
+}
+
+function createAsyncPlaceholder (
+  factory,
+  data,
+  context,
+  children,
+  tag
+) {
+  var node = createEmptyVNode();
+  node.asyncFactory = factory;
+  node.asyncMeta = { data: data, context: context, children: children, tag: tag };
+  return node
+}
+
+function resolveAsyncComponent (
+  factory,
+  baseCtor,
+  context
+) {
+  if (isTrue(factory.error) && isDef(factory.errorComp)) {
+    return factory.errorComp
+  }
+
+  if (isDef(factory.resolved)) {
+    return factory.resolved
+  }
+
+  if (isTrue(factory.loading) && isDef(factory.loadingComp)) {
+    return factory.loadingComp
+  }
+
+  if (isDef(factory.contexts)) {
+    // already pending
+    factory.contexts.push(context);
+  } else {
+    var contexts = factory.contexts = [context];
+    var sync = true;
+
+    var forceRender = function () {
+      for (var i = 0, l = contexts.length; i < l; i++) {
+        contexts[i].$forceUpdate();
+      }
+    };
+
+    var resolve = once(function (res) {
+      // cache resolved
+      factory.resolved = ensureCtor(res, baseCtor);
+      // invoke callbacks only if this is not a synchronous resolve
+      // (async resolves are shimmed as synchronous during SSR)
+      if (!sync) {
+        forceRender();
+      }
+    });
+
+    var reject = once(function (reason) {
+      process.env.NODE_ENV !== 'production' && warn(
+        "Failed to resolve async component: " + (String(factory)) +
+        (reason ? ("\nReason: " + reason) : '')
+      );
+      if (isDef(factory.errorComp)) {
+        factory.error = true;
+        forceRender();
+      }
+    });
+
+    var res = factory(resolve, reject);
+
+    if (isObject(res)) {
+      if (typeof res.then === 'function') {
+        // () => Promise
+        if (isUndef(factory.resolved)) {
+          res.then(resolve, reject);
+        }
+      } else if (isDef(res.component) && typeof res.component.then === 'function') {
+        res.component.then(resolve, reject);
+
+        if (isDef(res.error)) {
+          factory.errorComp = ensureCtor(res.error, baseCtor);
+        }
+
+        if (isDef(res.loading)) {
+          factory.loadingComp = ensureCtor(res.loading, baseCtor);
+          if (res.delay === 0) {
+            factory.loading = true;
+          } else {
+            setTimeout(function () {
+              if (isUndef(factory.resolved) && isUndef(factory.error)) {
+                factory.loading = true;
+                forceRender();
+              }
+            }, res.delay || 200);
+          }
+        }
+
+        if (isDef(res.timeout)) {
+          setTimeout(function () {
+            if (isUndef(factory.resolved)) {
+              reject(
+                process.env.NODE_ENV !== 'production'
+                  ? ("timeout (" + (res.timeout) + "ms)")
+                  : null
+              );
+            }
+          }, res.timeout);
+        }
+      }
+    }
+
+    sync = false;
+    // return in case resolved synchronously
+    return factory.loading
+      ? factory.loadingComp
+      : factory.resolved
+  }
+}
+
+/*  */
+
+function isAsyncPlaceholder (node) {
+  return node.isComment && node.asyncFactory
+}
+
+/*  */
+
+function getFirstComponentChild (children) {
+  if (Array.isArray(children)) {
+    for (var i = 0; i < children.length; i++) {
+      var c = children[i];
+      if (isDef(c) && (isDef(c.componentOptions) || isAsyncPlaceholder(c))) {
+        return c
+      }
+    }
+  }
+}
+
+/*  */
+
+/*  */
+
+function initEvents (vm) {
+  vm._events = Object.create(null);
+  vm._hasHookEvent = false;
+  // init parent attached events
+  var listeners = vm.$options._parentListeners;
+  if (listeners) {
+    updateComponentListeners(vm, listeners);
+  }
+}
+
+var target;
+
+function add (event, fn, once) {
+  if (once) {
+    target.$once(event, fn);
+  } else {
+    target.$on(event, fn);
+  }
+}
+
+function remove$1 (event, fn) {
+  target.$off(event, fn);
+}
+
+function updateComponentListeners (
+  vm,
+  listeners,
+  oldListeners
+) {
+  target = vm;
+  updateListeners(listeners, oldListeners || {}, add, remove$1, vm);
+  target = undefined;
+}
+
+function eventsMixin (Vue) {
+  var hookRE = /^hook:/;
+  Vue.prototype.$on = function (event, fn) {
+    var this$1 = this;
+
+    var vm = this;
+    if (Array.isArray(event)) {
+      for (var i = 0, l = event.length; i < l; i++) {
+        this$1.$on(event[i], fn);
+      }
+    } else {
+      (vm._events[event] || (vm._events[event] = [])).push(fn);
+      // optimize hook:event cost by using a boolean flag marked at registration
+      // instead of a hash lookup
+      if (hookRE.test(event)) {
+        vm._hasHookEvent = true;
+      }
+    }
+    return vm
+  };
+
+  Vue.prototype.$once = function (event, fn) {
+    var vm = this;
+    function on () {
+      vm.$off(event, on);
+      fn.apply(vm, arguments);
+    }
+    on.fn = fn;
+    vm.$on(event, on);
+    return vm
+  };
+
+  Vue.prototype.$off = function (event, fn) {
+    var this$1 = this;
+
+    var vm = this;
+    // all
+    if (!arguments.length) {
+      vm._events = Object.create(null);
+      return vm
+    }
+    // array of events
+    if (Array.isArray(event)) {
+      for (var i = 0, l = event.length; i < l; i++) {
+        this$1.$off(event[i], fn);
+      }
+      return vm
+    }
+    // specific event
+    var cbs = vm._events[event];
+    if (!cbs) {
+      return vm
+    }
+    if (!fn) {
+      vm._events[event] = null;
+      return vm
+    }
+    if (fn) {
+      // specific handler
+      var cb;
+      var i$1 = cbs.length;
+      while (i$1--) {
+        cb = cbs[i$1];
+        if (cb === fn || cb.fn === fn) {
+          cbs.splice(i$1, 1);
+          break
+        }
+      }
+    }
+    return vm
+  };
+
+  Vue.prototype.$emit = function (event) {
+    var vm = this;
+    if (process.env.NODE_ENV !== 'production') {
+      var lowerCaseEvent = event.toLowerCase();
+      if (lowerCaseEvent !== event && vm._events[lowerCaseEvent]) {
+        tip(
+          "Event \"" + lowerCaseEvent + "\" is emitted in component " +
+          (formatComponentName(vm)) + " but the handler is registered for \"" + event + "\". " +
+          "Note that HTML attributes are case-insensitive and you cannot use " +
+          "v-on to listen to camelCase events when using in-DOM templates. " +
+          "You should probably use \"" + (hyphenate(event)) + "\" instead of \"" + event + "\"."
+        );
+      }
+    }
+    var cbs = vm._events[event];
+    if (cbs) {
+      cbs = cbs.length > 1 ? toArray(cbs) : cbs;
+      var args = toArray(arguments, 1);
+      for (var i = 0, l = cbs.length; i < l; i++) {
+        try {
+          cbs[i].apply(vm, args);
+        } catch (e) {
+          handleError(e, vm, ("event handler for \"" + event + "\""));
+        }
+      }
+    }
+    return vm
+  };
+}
+
+/*  */
+
+
+
+/**
+ * Runtime helper for resolving raw children VNodes into a slot object.
+ */
+function resolveSlots (
+  children,
+  context
+) {
+  var slots = {};
+  if (!children) {
+    return slots
+  }
+  for (var i = 0, l = children.length; i < l; i++) {
+    var child = children[i];
+    var data = child.data;
+    // remove slot attribute if the node is resolved as a Vue slot node
+    if (data && data.attrs && data.attrs.slot) {
+      delete data.attrs.slot;
+    }
+    // named slots should only be respected if the vnode was rendered in the
+    // same context.
+    if ((child.context === context || child.fnContext === context) &&
+      data && data.slot != null
+    ) {
+      var name = data.slot;
+      var slot = (slots[name] || (slots[name] = []));
+      if (child.tag === 'template') {
+        slot.push.apply(slot, child.children || []);
+      } else {
+        slot.push(child);
+      }
+    } else {
+      (slots.default || (slots.default = [])).push(child);
+    }
+  }
+  // ignore slots that contains only whitespace
+  for (var name$1 in slots) {
+    if (slots[name$1].every(isWhitespace)) {
+      delete slots[name$1];
+    }
+  }
+  return slots
+}
+
+function isWhitespace (node) {
+  return (node.isComment && !node.asyncFactory) || node.text === ' '
+}
+
+function resolveScopedSlots (
+  fns, // see flow/vnode
+  res
+) {
+  res = res || {};
+  for (var i = 0; i < fns.length; i++) {
+    if (Array.isArray(fns[i])) {
+      resolveScopedSlots(fns[i], res);
+    } else {
+      res[fns[i].key] = fns[i].fn;
+    }
+  }
+  return res
+}
+
+/*  */
+
+var activeInstance = null;
+var isUpdatingChildComponent = false;
+
+function initLifecycle (vm) {
+  var options = vm.$options;
+
+  // locate first non-abstract parent
+  var parent = options.parent;
+  if (parent && !options.abstract) {
+    while (parent.$options.abstract && parent.$parent) {
+      parent = parent.$parent;
+    }
+    parent.$children.push(vm);
+  }
+
+  vm.$parent = parent;
+  vm.$root = parent ? parent.$root : vm;
+
+  vm.$children = [];
+  vm.$refs = {};
+
+  vm._watcher = null;
+  vm._inactive = null;
+  vm._directInactive = false;
+  vm._isMounted = false;
+  vm._isDestroyed = false;
+  vm._isBeingDestroyed = false;
+}
+
+function lifecycleMixin (Vue) {
+  Vue.prototype._update = function (vnode, hydrating) {
+    var vm = this;
+    if (vm._isMounted) {
+      callHook(vm, 'beforeUpdate');
+    }
+    var prevEl = vm.$el;
+    var prevVnode = vm._vnode;
+    var prevActiveInstance = activeInstance;
+    activeInstance = vm;
+    vm._vnode = vnode;
+    // Vue.prototype.__patch__ is injected in entry points
+    // based on the rendering backend used.
+    if (!prevVnode) {
+      // initial render
+      vm.$el = vm.__patch__(
+        vm.$el, vnode, hydrating, false /* removeOnly */,
+        vm.$options._parentElm,
+        vm.$options._refElm
+      );
+      // no need for the ref nodes after initial patch
+      // this prevents keeping a detached DOM tree in memory (#5851)
+      vm.$options._parentElm = vm.$options._refElm = null;
+    } else {
+      // updates
+      vm.$el = vm.__patch__(prevVnode, vnode);
+    }
+    activeInstance = prevActiveInstance;
+    // update __vue__ reference
+    if (prevEl) {
+      prevEl.__vue__ = null;
+    }
+    if (vm.$el) {
+      vm.$el.__vue__ = vm;
+    }
+    // if parent is an HOC, update its $el as well
+    if (vm.$vnode && vm.$parent && vm.$vnode === vm.$parent._vnode) {
+      vm.$parent.$el = vm.$el;
+    }
+    // updated hook is called by the scheduler to ensure that children are
+    // updated in a parent's updated hook.
+  };
+
+  Vue.prototype.$forceUpdate = function () {
+    var vm = this;
+    if (vm._watcher) {
+      vm._watcher.update();
+    }
+  };
+
+  Vue.prototype.$destroy = function () {
+    var vm = this;
+    if (vm._isBeingDestroyed) {
+      return
+    }
+    callHook(vm, 'beforeDestroy');
+    vm._isBeingDestroyed = true;
+    // remove self from parent
+    var parent = vm.$parent;
+    if (parent && !parent._isBeingDestroyed && !vm.$options.abstract) {
+      remove(parent.$children, vm);
+    }
+    // teardown watchers
+    if (vm._watcher) {
+      vm._watcher.teardown();
+    }
+    var i = vm._watchers.length;
+    while (i--) {
+      vm._watchers[i].teardown();
+    }
+    // remove reference from data ob
+    // frozen object may not have observer.
+    if (vm._data.__ob__) {
+      vm._data.__ob__.vmCount--;
+    }
+    // call the last hook...
+    vm._isDestroyed = true;
+    // invoke destroy hooks on current rendered tree
+    vm.__patch__(vm._vnode, null);
+    // fire destroyed hook
+    callHook(vm, 'destroyed');
+    // turn off all instance listeners.
+    vm.$off();
+    // remove __vue__ reference
+    if (vm.$el) {
+      vm.$el.__vue__ = null;
+    }
+    // release circular reference (#6759)
+    if (vm.$vnode) {
+      vm.$vnode.parent = null;
+    }
+  };
+}
+
+function mountComponent (
+  vm,
+  el,
+  hydrating
+) {
+  vm.$el = el;
+  if (!vm.$options.render) {
+    vm.$options.render = createEmptyVNode;
+    if (process.env.NODE_ENV !== 'production') {
+      /* istanbul ignore if */
+      if ((vm.$options.template && vm.$options.template.charAt(0) !== '#') ||
+        vm.$options.el || el) {
+        warn(
+          'You are using the runtime-only build of Vue where the template ' +
+          'compiler is not available. Either pre-compile the templates into ' +
+          'render functions, or use the compiler-included build.',
+          vm
+        );
+      } else {
+        warn(
+          'Failed to mount component: template or render function not defined.',
+          vm
+        );
+      }
+    }
+  }
+  callHook(vm, 'beforeMount');
+
+  var updateComponent;
+  /* istanbul ignore if */
+  if (process.env.NODE_ENV !== 'production' && config.performance && mark) {
+    updateComponent = function () {
+      var name = vm._name;
+      var id = vm._uid;
+      var startTag = "vue-perf-start:" + id;
+      var endTag = "vue-perf-end:" + id;
+
+      mark(startTag);
+      var vnode = vm._render();
+      mark(endTag);
+      measure(("vue " + name + " render"), startTag, endTag);
+
+      mark(startTag);
+      vm._update(vnode, hydrating);
+      mark(endTag);
+      measure(("vue " + name + " patch"), startTag, endTag);
+    };
+  } else {
+    updateComponent = function () {
+      vm._update(vm._render(), hydrating);
+    };
+  }
+
+  // we set this to vm._watcher inside the watcher's constructor
+  // since the watcher's initial patch may call $forceUpdate (e.g. inside child
+  // component's mounted hook), which relies on vm._watcher being already defined
+  new Watcher(vm, updateComponent, noop, null, true /* isRenderWatcher */);
+  hydrating = false;
+
+  // manually mounted instance, call mounted on self
+  // mounted is called for render-created child components in its inserted hook
+  if (vm.$vnode == null) {
+    vm._isMounted = true;
+    callHook(vm, 'mounted');
+  }
+  return vm
+}
+
+function updateChildComponent (
+  vm,
+  propsData,
+  listeners,
+  parentVnode,
+  renderChildren
+) {
+  if (process.env.NODE_ENV !== 'production') {
+    isUpdatingChildComponent = true;
+  }
+
+  // determine whether component has slot children
+  // we need to do this before overwriting $options._renderChildren
+  var hasChildren = !!(
+    renderChildren ||               // has new static slots
+    vm.$options._renderChildren ||  // has old static slots
+    parentVnode.data.scopedSlots || // has new scoped slots
+    vm.$scopedSlots !== emptyObject // has old scoped slots
+  );
+
+  vm.$options._parentVnode = parentVnode;
+  vm.$vnode = parentVnode; // update vm's placeholder node without re-render
+
+  if (vm._vnode) { // update child tree's parent
+    vm._vnode.parent = parentVnode;
+  }
+  vm.$options._renderChildren = renderChildren;
+
+  // update $attrs and $listeners hash
+  // these are also reactive so they may trigger child update if the child
+  // used them during render
+  vm.$attrs = parentVnode.data.attrs || emptyObject;
+  vm.$listeners = listeners || emptyObject;
+
+  // update props
+  if (propsData && vm.$options.props) {
+    toggleObserving(false);
+    var props = vm._props;
+    var propKeys = vm.$options._propKeys || [];
+    for (var i = 0; i < propKeys.length; i++) {
+      var key = propKeys[i];
+      var propOptions = vm.$options.props; // wtf flow?
+      props[key] = validateProp(key, propOptions, propsData, vm);
+    }
+    toggleObserving(true);
+    // keep a copy of raw propsData
+    vm.$options.propsData = propsData;
+  }
+
+  // update listeners
+  listeners = listeners || emptyObject;
+  var oldListeners = vm.$options._parentListeners;
+  vm.$options._parentListeners = listeners;
+  updateComponentListeners(vm, listeners, oldListeners);
+
+  // resolve slots + force update if has children
+  if (hasChildren) {
+    vm.$slots = resolveSlots(renderChildren, parentVnode.context);
+    vm.$forceUpdate();
+  }
+
+  if (process.env.NODE_ENV !== 'production') {
+    isUpdatingChildComponent = false;
+  }
+}
+
+function isInInactiveTree (vm) {
+  while (vm && (vm = vm.$parent)) {
+    if (vm._inactive) { return true }
+  }
+  return false
+}
+
+function activateChildComponent (vm, direct) {
+  if (direct) {
+    vm._directInactive = false;
+    if (isInInactiveTree(vm)) {
+      return
+    }
+  } else if (vm._directInactive) {
+    return
+  }
+  if (vm._inactive || vm._inactive === null) {
+    vm._inactive = false;
+    for (var i = 0; i < vm.$children.length; i++) {
+      activateChildComponent(vm.$children[i]);
+    }
+    callHook(vm, 'activated');
+  }
+}
+
+function deactivateChildComponent (vm, direct) {
+  if (direct) {
+    vm._directInactive = true;
+    if (isInInactiveTree(vm)) {
+      return
+    }
+  }
+  if (!vm._inactive) {
+    vm._inactive = true;
+    for (var i = 0; i < vm.$children.length; i++) {
+      deactivateChildComponent(vm.$children[i]);
+    }
+    callHook(vm, 'deactivated');
+  }
+}
+
+function callHook (vm, hook) {
+  // #7573 disable dep collection when invoking lifecycle hooks
+  pushTarget();
+  var handlers = vm.$options[hook];
+  if (handlers) {
+    for (var i = 0, j = handlers.length; i < j; i++) {
+      try {
+        handlers[i].call(vm);
+      } catch (e) {
+        handleError(e, vm, (hook + " hook"));
+      }
+    }
+  }
+  if (vm._hasHookEvent) {
+    vm.$emit('hook:' + hook);
+  }
+  popTarget();
+}
+
+/*  */
+
+
+var MAX_UPDATE_COUNT = 100;
+
+var queue = [];
+var activatedChildren = [];
+var has = {};
+var circular = {};
+var waiting = false;
+var flushing = false;
+var index = 0;
+
+/**
+ * Reset the scheduler's state.
+ */
+function resetSchedulerState () {
+  index = queue.length = activatedChildren.length = 0;
+  has = {};
+  if (process.env.NODE_ENV !== 'production') {
+    circular = {};
+  }
+  waiting = flushing = false;
+}
+
+/**
+ * Flush both queues and run the watchers.
+ */
+function flushSchedulerQueue () {
+  flushing = true;
+  var watcher, id;
+
+  // Sort queue before flush.
+  // This ensures that:
+  // 1. Components are updated from parent to child. (because parent is always
+  //    created before the child)
+  // 2. A component's user watchers are run before its render watcher (because
+  //    user watchers are created before the render watcher)
+  // 3. If a component is destroyed during a parent component's watcher run,
+  //    its watchers can be skipped.
+  queue.sort(function (a, b) { return a.id - b.id; });
+
+  // do not cache length because more watchers might be pushed
+  // as we run existing watchers
+  for (index = 0; index < queue.length; index++) {
+    watcher = queue[index];
+    id = watcher.id;
+    has[id] = null;
+    watcher.run();
+    // in dev build, check and stop circular updates.
+    if (process.env.NODE_ENV !== 'production' && has[id] != null) {
+      circular[id] = (circular[id] || 0) + 1;
+      if (circular[id] > MAX_UPDATE_COUNT) {
+        warn(
+          'You may have an infinite update loop ' + (
+            watcher.user
+              ? ("in watcher with expression \"" + (watcher.expression) + "\"")
+              : "in a component render function."
+          ),
+          watcher.vm
+        );
+        break
+      }
+    }
+  }
+
+  // keep copies of post queues before resetting state
+  var activatedQueue = activatedChildren.slice();
+  var updatedQueue = queue.slice();
+
+  resetSchedulerState();
+
+  // call component updated and activated hooks
+  callActivatedHooks(activatedQueue);
+  callUpdatedHooks(updatedQueue);
+
+  // devtool hook
+  /* istanbul ignore if */
+  if (devtools && config.devtools) {
+    devtools.emit('flush');
+  }
+}
+
+function callUpdatedHooks (queue) {
+  var i = queue.length;
+  while (i--) {
+    var watcher = queue[i];
+    var vm = watcher.vm;
+    if (vm._watcher === watcher && vm._isMounted) {
+      callHook(vm, 'updated');
+    }
+  }
+}
+
+/**
+ * Queue a kept-alive component that was activated during patch.
+ * The queue will be processed after the entire tree has been patched.
+ */
+function queueActivatedComponent (vm) {
+  // setting _inactive to false here so that a render function can
+  // rely on checking whether it's in an inactive tree (e.g. router-view)
+  vm._inactive = false;
+  activatedChildren.push(vm);
+}
+
+function callActivatedHooks (queue) {
+  for (var i = 0; i < queue.length; i++) {
+    queue[i]._inactive = true;
+    activateChildComponent(queue[i], true /* true */);
+  }
+}
+
+/**
+ * Push a watcher into the watcher queue.
+ * Jobs with duplicate IDs will be skipped unless it's
+ * pushed when the queue is being flushed.
+ */
+function queueWatcher (watcher) {
+  var id = watcher.id;
+  if (has[id] == null) {
+    has[id] = true;
+    if (!flushing) {
+      queue.push(watcher);
+    } else {
+      // if already flushing, splice the watcher based on its id
+      // if already past its id, it will be run next immediately.
+      var i = queue.length - 1;
+      while (i > index && queue[i].id > watcher.id) {
+        i--;
+      }
+      queue.splice(i + 1, 0, watcher);
+    }
+    // queue the flush
+    if (!waiting) {
+      waiting = true;
+      nextTick(flushSchedulerQueue);
+    }
+  }
+}
+
+/*  */
+
+var uid$1 = 0;
+
+/**
+ * A watcher parses an expression, collects dependencies,
+ * and fires callback when the expression value changes.
+ * This is used for both the $watch() api and directives.
+ */
+var Watcher = function Watcher (
+  vm,
+  expOrFn,
+  cb,
+  options,
+  isRenderWatcher
+) {
+  this.vm = vm;
+  if (isRenderWatcher) {
+    vm._watcher = this;
+  }
+  vm._watchers.push(this);
+  // options
+  if (options) {
+    this.deep = !!options.deep;
+    this.user = !!options.user;
+    this.lazy = !!options.lazy;
+    this.sync = !!options.sync;
+  } else {
+    this.deep = this.user = this.lazy = this.sync = false;
+  }
+  this.cb = cb;
+  this.id = ++uid$1; // uid for batching
+  this.active = true;
+  this.dirty = this.lazy; // for lazy watchers
+  this.deps = [];
+  this.newDeps = [];
+  this.depIds = new _Set();
+  this.newDepIds = new _Set();
+  this.expression = process.env.NODE_ENV !== 'production'
+    ? expOrFn.toString()
+    : '';
+  // parse expression for getter
+  if (typeof expOrFn === 'function') {
+    this.getter = expOrFn;
+  } else {
+    this.getter = parsePath(expOrFn);
+    if (!this.getter) {
+      this.getter = function () {};
+      process.env.NODE_ENV !== 'production' && warn(
+        "Failed watching path: \"" + expOrFn + "\" " +
+        'Watcher only accepts simple dot-delimited paths. ' +
+        'For full control, use a function instead.',
+        vm
+      );
+    }
+  }
+  this.value = this.lazy
+    ? undefined
+    : this.get();
+};
+
+/**
+ * Evaluate the getter, and re-collect dependencies.
+ */
+Watcher.prototype.get = function get () {
+  pushTarget(this);
+  var value;
+  var vm = this.vm;
+  try {
+    value = this.getter.call(vm, vm);
+  } catch (e) {
+    if (this.user) {
+      handleError(e, vm, ("getter for watcher \"" + (this.expression) + "\""));
+    } else {
+      throw e
+    }
+  } finally {
+    // "touch" every property so they are all tracked as
+    // dependencies for deep watching
+    if (this.deep) {
+      traverse(value);
+    }
+    popTarget();
+    this.cleanupDeps();
+  }
+  return value
+};
+
+/**
+ * Add a dependency to this directive.
+ */
+Watcher.prototype.addDep = function addDep (dep) {
+  var id = dep.id;
+  if (!this.newDepIds.has(id)) {
+    this.newDepIds.add(id);
+    this.newDeps.push(dep);
+    if (!this.depIds.has(id)) {
+      dep.addSub(this);
+    }
+  }
+};
+
+/**
+ * Clean up for dependency collection.
+ */
+Watcher.prototype.cleanupDeps = function cleanupDeps () {
+    var this$1 = this;
+
+  var i = this.deps.length;
+  while (i--) {
+    var dep = this$1.deps[i];
+    if (!this$1.newDepIds.has(dep.id)) {
+      dep.removeSub(this$1);
+    }
+  }
+  var tmp = this.depIds;
+  this.depIds = this.newDepIds;
+  this.newDepIds = tmp;
+  this.newDepIds.clear();
+  tmp = this.deps;
+  this.deps = this.newDeps;
+  this.newDeps = tmp;
+  this.newDeps.length = 0;
+};
+
+/**
+ * Subscriber interface.
+ * Will be called when a dependency changes.
+ */
+Watcher.prototype.update = function update () {
+  /* istanbul ignore else */
+  if (this.lazy) {
+    this.dirty = true;
+  } else if (this.sync) {
+    this.run();
+  } else {
+    queueWatcher(this);
+  }
+};
+
+/**
+ * Scheduler job interface.
+ * Will be called by the scheduler.
+ */
+Watcher.prototype.run = function run () {
+  if (this.active) {
+    var value = this.get();
+    if (
+      value !== this.value ||
+      // Deep watchers and watchers on Object/Arrays should fire even
+      // when the value is the same, because the value may
+      // have mutated.
+      isObject(value) ||
+      this.deep
+    ) {
+      // set new value
+      var oldValue = this.value;
+      this.value = value;
+      if (this.user) {
+        try {
+          this.cb.call(this.vm, value, oldValue);
+        } catch (e) {
+          handleError(e, this.vm, ("callback for watcher \"" + (this.expression) + "\""));
+        }
+      } else {
+        this.cb.call(this.vm, value, oldValue);
+      }
+    }
+  }
+};
+
+/**
+ * Evaluate the value of the watcher.
+ * This only gets called for lazy watchers.
+ */
+Watcher.prototype.evaluate = function evaluate () {
+  this.value = this.get();
+  this.dirty = false;
+};
+
+/**
+ * Depend on all deps collected by this watcher.
+ */
+Watcher.prototype.depend = function depend () {
+    var this$1 = this;
+
+  var i = this.deps.length;
+  while (i--) {
+    this$1.deps[i].depend();
+  }
+};
+
+/**
+ * Remove self from all dependencies' subscriber list.
+ */
+Watcher.prototype.teardown = function teardown () {
+    var this$1 = this;
+
+  if (this.active) {
+    // remove self from vm's watcher list
+    // this is a somewhat expensive operation so we skip it
+    // if the vm is being destroyed.
+    if (!this.vm._isBeingDestroyed) {
+      remove(this.vm._watchers, this);
+    }
+    var i = this.deps.length;
+    while (i--) {
+      this$1.deps[i].removeSub(this$1);
+    }
+    this.active = false;
+  }
+};
+
+/*  */
+
+var sharedPropertyDefinition = {
+  enumerable: true,
+  configurable: true,
+  get: noop,
+  set: noop
+};
+
+function proxy (target, sourceKey, key) {
+  sharedPropertyDefinition.get = function proxyGetter () {
+    return this[sourceKey][key]
+  };
+  sharedPropertyDefinition.set = function proxySetter (val) {
+    this[sourceKey][key] = val;
+  };
+  Object.defineProperty(target, key, sharedPropertyDefinition);
+}
+
+function initState (vm) {
+  vm._watchers = [];
+  var opts = vm.$options;
+  if (opts.props) { initProps(vm, opts.props); }
+  if (opts.methods) { initMethods(vm, opts.methods); }
+  if (opts.data) {
+    initData(vm);
+  } else {
+    observe(vm._data = {}, true /* asRootData */);
+  }
+  if (opts.computed) { initComputed(vm, opts.computed); }
+  if (opts.watch && opts.watch !== nativeWatch) {
+    initWatch(vm, opts.watch);
+  }
+}
+
+function initProps (vm, propsOptions) {
+  var propsData = vm.$options.propsData || {};
+  var props = vm._props = {};
+  // cache prop keys so that future props updates can iterate using Array
+  // instead of dynamic object key enumeration.
+  var keys = vm.$options._propKeys = [];
+  var isRoot = !vm.$parent;
+  // root instance props should be converted
+  if (!isRoot) {
+    toggleObserving(false);
+  }
+  var loop = function ( key ) {
+    keys.push(key);
+    var value = validateProp(key, propsOptions, propsData, vm);
+    /* istanbul ignore else */
+    if (process.env.NODE_ENV !== 'production') {
+      var hyphenatedKey = hyphenate(key);
+      if (isReservedAttribute(hyphenatedKey) ||
+          config.isReservedAttr(hyphenatedKey)) {
+        warn(
+          ("\"" + hyphenatedKey + "\" is a reserved attribute and cannot be used as component prop."),
+          vm
+        );
+      }
+      defineReactive(props, key, value, function () {
+        if (vm.$parent && !isUpdatingChildComponent) {
+          warn(
+            "Avoid mutating a prop directly since the value will be " +
+            "overwritten whenever the parent component re-renders. " +
+            "Instead, use a data or computed property based on the prop's " +
+            "value. Prop being mutated: \"" + key + "\"",
+            vm
+          );
+        }
+      });
+    } else {
+      defineReactive(props, key, value);
+    }
+    // static props are already proxied on the component's prototype
+    // during Vue.extend(). We only need to proxy props defined at
+    // instantiation here.
+    if (!(key in vm)) {
+      proxy(vm, "_props", key);
+    }
+  };
+
+  for (var key in propsOptions) loop( key );
+  toggleObserving(true);
+}
+
+function initData (vm) {
+  var data = vm.$options.data;
+  data = vm._data = typeof data === 'function'
+    ? getData(data, vm)
+    : data || {};
+  if (!isPlainObject(data)) {
+    data = {};
+    process.env.NODE_ENV !== 'production' && warn(
+      'data functions should return an object:\n' +
+      'https://vuejs.org/v2/guide/components.html#data-Must-Be-a-Function',
+      vm
+    );
+  }
+  // proxy data on instance
+  var keys = Object.keys(data);
+  var props = vm.$options.props;
+  var methods = vm.$options.methods;
+  var i = keys.length;
+  while (i--) {
+    var key = keys[i];
+    if (process.env.NODE_ENV !== 'production') {
+      if (methods && hasOwn(methods, key)) {
+        warn(
+          ("Method \"" + key + "\" has already been defined as a data property."),
+          vm
+        );
+      }
+    }
+    if (props && hasOwn(props, key)) {
+      process.env.NODE_ENV !== 'production' && warn(
+        "The data property \"" + key + "\" is already declared as a prop. " +
+        "Use prop default value instead.",
+        vm
+      );
+    } else if (!isReserved(key)) {
+      proxy(vm, "_data", key);
+    }
+  }
+  // observe data
+  observe(data, true /* asRootData */);
+}
+
+function getData (data, vm) {
+  // #7573 disable dep collection when invoking data getters
+  pushTarget();
+  try {
+    return data.call(vm, vm)
+  } catch (e) {
+    handleError(e, vm, "data()");
+    return {}
+  } finally {
+    popTarget();
+  }
+}
+
+var computedWatcherOptions = { lazy: true };
+
+function initComputed (vm, computed) {
+  // $flow-disable-line
+  var watchers = vm._computedWatchers = Object.create(null);
+  // computed properties are just getters during SSR
+  var isSSR = isServerRendering();
+
+  for (var key in computed) {
+    var userDef = computed[key];
+    var getter = typeof userDef === 'function' ? userDef : userDef.get;
+    if (process.env.NODE_ENV !== 'production' && getter == null) {
+      warn(
+        ("Getter is missing for computed property \"" + key + "\"."),
+        vm
+      );
+    }
+
+    if (!isSSR) {
+      // create internal watcher for the computed property.
+      watchers[key] = new Watcher(
+        vm,
+        getter || noop,
+        noop,
+        computedWatcherOptions
+      );
+    }
+
+    // component-defined computed properties are already defined on the
+    // component prototype. We only need to define computed properties defined
+    // at instantiation here.
+    if (!(key in vm)) {
+      defineComputed(vm, key, userDef);
+    } else if (process.env.NODE_ENV !== 'production') {
+      if (key in vm.$data) {
+        warn(("The computed property \"" + key + "\" is already defined in data."), vm);
+      } else if (vm.$options.props && key in vm.$options.props) {
+        warn(("The computed property \"" + key + "\" is already defined as a prop."), vm);
+      }
+    }
+  }
+}
+
+function defineComputed (
+  target,
+  key,
+  userDef
+) {
+  var shouldCache = !isServerRendering();
+  if (typeof userDef === 'function') {
+    sharedPropertyDefinition.get = shouldCache
+      ? createComputedGetter(key)
+      : userDef;
+    sharedPropertyDefinition.set = noop;
+  } else {
+    sharedPropertyDefinition.get = userDef.get
+      ? shouldCache && userDef.cache !== false
+        ? createComputedGetter(key)
+        : userDef.get
+      : noop;
+    sharedPropertyDefinition.set = userDef.set
+      ? userDef.set
+      : noop;
+  }
+  if (process.env.NODE_ENV !== 'production' &&
+      sharedPropertyDefinition.set === noop) {
+    sharedPropertyDefinition.set = function () {
+      warn(
+        ("Computed property \"" + key + "\" was assigned to but it has no setter."),
+        this
+      );
+    };
+  }
+  Object.defineProperty(target, key, sharedPropertyDefinition);
+}
+
+function createComputedGetter (key) {
+  return function computedGetter () {
+    var watcher = this._computedWatchers && this._computedWatchers[key];
+    if (watcher) {
+      if (watcher.dirty) {
+        watcher.evaluate();
+      }
+      if (Dep.target) {
+        watcher.depend();
+      }
+      return watcher.value
+    }
+  }
+}
+
+function initMethods (vm, methods) {
+  var props = vm.$options.props;
+  for (var key in methods) {
+    if (process.env.NODE_ENV !== 'production') {
+      if (methods[key] == null) {
+        warn(
+          "Method \"" + key + "\" has an undefined value in the component definition. " +
+          "Did you reference the function correctly?",
+          vm
+        );
+      }
+      if (props && hasOwn(props, key)) {
+        warn(
+          ("Method \"" + key + "\" has already been defined as a prop."),
+          vm
+        );
+      }
+      if ((key in vm) && isReserved(key)) {
+        warn(
+          "Method \"" + key + "\" conflicts with an existing Vue instance method. " +
+          "Avoid defining component methods that start with _ or $."
+        );
+      }
+    }
+    vm[key] = methods[key] == null ? noop : bind(methods[key], vm);
+  }
+}
+
+function initWatch (vm, watch) {
+  for (var key in watch) {
+    var handler = watch[key];
+    if (Array.isArray(handler)) {
+      for (var i = 0; i < handler.length; i++) {
+        createWatcher(vm, key, handler[i]);
+      }
+    } else {
+      createWatcher(vm, key, handler);
+    }
+  }
+}
+
+function createWatcher (
+  vm,
+  expOrFn,
+  handler,
+  options
+) {
+  if (isPlainObject(handler)) {
+    options = handler;
+    handler = handler.handler;
+  }
+  if (typeof handler === 'string') {
+    handler = vm[handler];
+  }
+  return vm.$watch(expOrFn, handler, options)
+}
+
+function stateMixin (Vue) {
+  // flow somehow has problems with directly declared definition object
+  // when using Object.defineProperty, so we have to procedurally build up
+  // the object here.
+  var dataDef = {};
+  dataDef.get = function () { return this._data };
+  var propsDef = {};
+  propsDef.get = function () { return this._props };
+  if (process.env.NODE_ENV !== 'production') {
+    dataDef.set = function (newData) {
+      warn(
+        'Avoid replacing instance root $data. ' +
+        'Use nested data properties instead.',
+        this
+      );
+    };
+    propsDef.set = function () {
+      warn("$props is readonly.", this);
+    };
+  }
+  Object.defineProperty(Vue.prototype, '$data', dataDef);
+  Object.defineProperty(Vue.prototype, '$props', propsDef);
+
+  Vue.prototype.$set = set;
+  Vue.prototype.$delete = del;
+
+  Vue.prototype.$watch = function (
+    expOrFn,
+    cb,
+    options
+  ) {
+    var vm = this;
+    if (isPlainObject(cb)) {
+      return createWatcher(vm, expOrFn, cb, options)
+    }
+    options = options || {};
+    options.user = true;
+    var watcher = new Watcher(vm, expOrFn, cb, options);
+    if (options.immediate) {
+      cb.call(vm, watcher.value);
+    }
+    return function unwatchFn () {
+      watcher.teardown();
+    }
+  };
+}
+
+/*  */
+
+function initProvide (vm) {
+  var provide = vm.$options.provide;
+  if (provide) {
+    vm._provided = typeof provide === 'function'
+      ? provide.call(vm)
+      : provide;
+  }
+}
+
+function initInjections (vm) {
+  var result = resolveInject(vm.$options.inject, vm);
+  if (result) {
+    toggleObserving(false);
+    Object.keys(result).forEach(function (key) {
+      /* istanbul ignore else */
+      if (process.env.NODE_ENV !== 'production') {
+        defineReactive(vm, key, result[key], function () {
+          warn(
+            "Avoid mutating an injected value directly since the changes will be " +
+            "overwritten whenever the provided component re-renders. " +
+            "injection being mutated: \"" + key + "\"",
+            vm
+          );
+        });
+      } else {
+        defineReactive(vm, key, result[key]);
+      }
+    });
+    toggleObserving(true);
+  }
+}
+
+function resolveInject (inject, vm) {
+  if (inject) {
+    // inject is :any because flow is not smart enough to figure out cached
+    var result = Object.create(null);
+    var keys = hasSymbol
+      ? Reflect.ownKeys(inject).filter(function (key) {
+        /* istanbul ignore next */
+        return Object.getOwnPropertyDescriptor(inject, key).enumerable
+      })
+      : Object.keys(inject);
+
+    for (var i = 0; i < keys.length; i++) {
+      var key = keys[i];
+      var provideKey = inject[key].from;
+      var source = vm;
+      while (source) {
+        if (source._provided && hasOwn(source._provided, provideKey)) {
+          result[key] = source._provided[provideKey];
+          break
+        }
+        source = source.$parent;
+      }
+      if (!source) {
+        if ('default' in inject[key]) {
+          var provideDefault = inject[key].default;
+          result[key] = typeof provideDefault === 'function'
+            ? provideDefault.call(vm)
+            : provideDefault;
+        } else if (process.env.NODE_ENV !== 'production') {
+          warn(("Injection \"" + key + "\" not found"), vm);
+        }
+      }
+    }
+    return result
+  }
+}
+
+/*  */
+
+/**
+ * Runtime helper for rendering v-for lists.
+ */
+function renderList (
+  val,
+  render
+) {
+  var ret, i, l, keys, key;
+  if (Array.isArray(val) || typeof val === 'string') {
+    ret = new Array(val.length);
+    for (i = 0, l = val.length; i < l; i++) {
+      ret[i] = render(val[i], i);
+    }
+  } else if (typeof val === 'number') {
+    ret = new Array(val);
+    for (i = 0; i < val; i++) {
+      ret[i] = render(i + 1, i);
+    }
+  } else if (isObject(val)) {
+    keys = Object.keys(val);
+    ret = new Array(keys.length);
+    for (i = 0, l = keys.length; i < l; i++) {
+      key = keys[i];
+      ret[i] = render(val[key], key, i);
+    }
+  }
+  if (isDef(ret)) {
+    (ret)._isVList = true;
+  }
+  return ret
+}
+
+/*  */
+
+/**
+ * Runtime helper for rendering <slot>
+ */
+function renderSlot (
+  name,
+  fallback,
+  props,
+  bindObject
+) {
+  var scopedSlotFn = this.$scopedSlots[name];
+  var nodes;
+  if (scopedSlotFn) { // scoped slot
+    props = props || {};
+    if (bindObject) {
+      if (process.env.NODE_ENV !== 'production' && !isObject(bindObject)) {
+        warn(
+          'slot v-bind without argument expects an Object',
+          this
+        );
+      }
+      props = extend(extend({}, bindObject), props);
+    }
+    nodes = scopedSlotFn(props) || fallback;
+  } else {
+    var slotNodes = this.$slots[name];
+    // warn duplicate slot usage
+    if (slotNodes) {
+      if (process.env.NODE_ENV !== 'production' && slotNodes._rendered) {
+        warn(
+          "Duplicate presence of slot \"" + name + "\" found in the same render tree " +
+          "- this will likely cause render errors.",
+          this
+        );
+      }
+      slotNodes._rendered = true;
+    }
+    nodes = slotNodes || fallback;
+  }
+
+  var target = props && props.slot;
+  if (target) {
+    return this.$createElement('template', { slot: target }, nodes)
+  } else {
+    return nodes
+  }
+}
+
+/*  */
+
+/**
+ * Runtime helper for resolving filters
+ */
+function resolveFilter (id) {
+  return resolveAsset(this.$options, 'filters', id, true) || identity
+}
+
+/*  */
+
+function isKeyNotMatch (expect, actual) {
+  if (Array.isArray(expect)) {
+    return expect.indexOf(actual) === -1
+  } else {
+    return expect !== actual
+  }
+}
+
+/**
+ * Runtime helper for checking keyCodes from config.
+ * exposed as Vue.prototype._k
+ * passing in eventKeyName as last argument separately for backwards compat
+ */
+function checkKeyCodes (
+  eventKeyCode,
+  key,
+  builtInKeyCode,
+  eventKeyName,
+  builtInKeyName
+) {
+  var mappedKeyCode = config.keyCodes[key] || builtInKeyCode;
+  if (builtInKeyName && eventKeyName && !config.keyCodes[key]) {
+    return isKeyNotMatch(builtInKeyName, eventKeyName)
+  } else if (mappedKeyCode) {
+    return isKeyNotMatch(mappedKeyCode, eventKeyCode)
+  } else if (eventKeyName) {
+    return hyphenate(eventKeyName) !== key
+  }
+}
+
+/*  */
+
+/**
+ * Runtime helper for merging v-bind="object" into a VNode's data.
+ */
+function bindObjectProps (
+  data,
+  tag,
+  value,
+  asProp,
+  isSync
+) {
+  if (value) {
+    if (!isObject(value)) {
+      process.env.NODE_ENV !== 'production' && warn(
+        'v-bind without argument expects an Object or Array value',
+        this
+      );
+    } else {
+      if (Array.isArray(value)) {
+        value = toObject(value);
+      }
+      var hash;
+      var loop = function ( key ) {
+        if (
+          key === 'class' ||
+          key === 'style' ||
+          isReservedAttribute(key)
+        ) {
+          hash = data;
+        } else {
+          var type = data.attrs && data.attrs.type;
+          hash = asProp || config.mustUseProp(tag, type, key)
+            ? data.domProps || (data.domProps = {})
+            : data.attrs || (data.attrs = {});
+        }
+        if (!(key in hash)) {
+          hash[key] = value[key];
+
+          if (isSync) {
+            var on = data.on || (data.on = {});
+            on[("update:" + key)] = function ($event) {
+              value[key] = $event;
+            };
+          }
+        }
+      };
+
+      for (var key in value) loop( key );
+    }
+  }
+  return data
+}
+
+/*  */
+
+/**
+ * Runtime helper for rendering static trees.
+ */
+function renderStatic (
+  index,
+  isInFor
+) {
+  var cached = this._staticTrees || (this._staticTrees = []);
+  var tree = cached[index];
+  // if has already-rendered static tree and not inside v-for,
+  // we can reuse the same tree.
+  if (tree && !isInFor) {
+    return tree
+  }
+  // otherwise, render a fresh tree.
+  tree = cached[index] = this.$options.staticRenderFns[index].call(
+    this._renderProxy,
+    null,
+    this // for render fns generated for functional component templates
+  );
+  markStatic(tree, ("__static__" + index), false);
+  return tree
+}
+
+/**
+ * Runtime helper for v-once.
+ * Effectively it means marking the node as static with a unique key.
+ */
+function markOnce (
+  tree,
+  index,
+  key
+) {
+  markStatic(tree, ("__once__" + index + (key ? ("_" + key) : "")), true);
+  return tree
+}
+
+function markStatic (
+  tree,
+  key,
+  isOnce
+) {
+  if (Array.isArray(tree)) {
+    for (var i = 0; i < tree.length; i++) {
+      if (tree[i] && typeof tree[i] !== 'string') {
+        markStaticNode(tree[i], (key + "_" + i), isOnce);
+      }
+    }
+  } else {
+    markStaticNode(tree, key, isOnce);
+  }
+}
+
+function markStaticNode (node, key, isOnce) {
+  node.isStatic = true;
+  node.key = key;
+  node.isOnce = isOnce;
+}
+
+/*  */
+
+function bindObjectListeners (data, value) {
+  if (value) {
+    if (!isPlainObject(value)) {
+      process.env.NODE_ENV !== 'production' && warn(
+        'v-on without argument expects an Object value',
+        this
+      );
+    } else {
+      var on = data.on = data.on ? extend({}, data.on) : {};
+      for (var key in value) {
+        var existing = on[key];
+        var ours = value[key];
+        on[key] = existing ? [].concat(existing, ours) : ours;
+      }
+    }
+  }
+  return data
+}
+
+/*  */
+
+function installRenderHelpers (target) {
+  target._o = markOnce;
+  target._n = toNumber;
+  target._s = toString;
+  target._l = renderList;
+  target._t = renderSlot;
+  target._q = looseEqual;
+  target._i = looseIndexOf;
+  target._m = renderStatic;
+  target._f = resolveFilter;
+  target._k = checkKeyCodes;
+  target._b = bindObjectProps;
+  target._v = createTextVNode;
+  target._e = createEmptyVNode;
+  target._u = resolveScopedSlots;
+  target._g = bindObjectListeners;
+}
+
+/*  */
+
+function FunctionalRenderContext (
+  data,
+  props,
+  children,
+  parent,
+  Ctor
+) {
+  var options = Ctor.options;
+  // ensure the createElement function in functional components
+  // gets a unique context - this is necessary for correct named slot check
+  var contextVm;
+  if (hasOwn(parent, '_uid')) {
+    contextVm = Object.create(parent);
+    // $flow-disable-line
+    contextVm._original = parent;
+  } else {
+    // the context vm passed in is a functional context as well.
+    // in this case we want to make sure we are able to get a hold to the
+    // real context instance.
+    contextVm = parent;
+    // $flow-disable-line
+    parent = parent._original;
+  }
+  var isCompiled = isTrue(options._compiled);
+  var needNormalization = !isCompiled;
+
+  this.data = data;
+  this.props = props;
+  this.children = children;
+  this.parent = parent;
+  this.listeners = data.on || emptyObject;
+  this.injections = resolveInject(options.inject, parent);
+  this.slots = function () { return resolveSlots(children, parent); };
+
+  // support for compiled functional template
+  if (isCompiled) {
+    // exposing $options for renderStatic()
+    this.$options = options;
+    // pre-resolve slots for renderSlot()
+    this.$slots = this.slots();
+    this.$scopedSlots = data.scopedSlots || emptyObject;
+  }
+
+  if (options._scopeId) {
+    this._c = function (a, b, c, d) {
+      var vnode = createElement(contextVm, a, b, c, d, needNormalization);
+      if (vnode && !Array.isArray(vnode)) {
+        vnode.fnScopeId = options._scopeId;
+        vnode.fnContext = parent;
+      }
+      return vnode
+    };
+  } else {
+    this._c = function (a, b, c, d) { return createElement(contextVm, a, b, c, d, needNormalization); };
+  }
+}
+
+installRenderHelpers(FunctionalRenderContext.prototype);
+
+function createFunctionalComponent (
+  Ctor,
+  propsData,
+  data,
+  contextVm,
+  children
+) {
+  var options = Ctor.options;
+  var props = {};
+  var propOptions = options.props;
+  if (isDef(propOptions)) {
+    for (var key in propOptions) {
+      props[key] = validateProp(key, propOptions, propsData || emptyObject);
+    }
+  } else {
+    if (isDef(data.attrs)) { mergeProps(props, data.attrs); }
+    if (isDef(data.props)) { mergeProps(props, data.props); }
+  }
+
+  var renderContext = new FunctionalRenderContext(
+    data,
+    props,
+    children,
+    contextVm,
+    Ctor
+  );
+
+  var vnode = options.render.call(null, renderContext._c, renderContext);
+
+  if (vnode instanceof VNode) {
+    return cloneAndMarkFunctionalResult(vnode, data, renderContext.parent, options)
+  } else if (Array.isArray(vnode)) {
+    var vnodes = normalizeChildren(vnode) || [];
+    var res = new Array(vnodes.length);
+    for (var i = 0; i < vnodes.length; i++) {
+      res[i] = cloneAndMarkFunctionalResult(vnodes[i], data, renderContext.parent, options);
+    }
+    return res
+  }
+}
+
+function cloneAndMarkFunctionalResult (vnode, data, contextVm, options) {
+  // #7817 clone node before setting fnContext, otherwise if the node is reused
+  // (e.g. it was from a cached normal slot) the fnContext causes named slots
+  // that should not be matched to match.
+  var clone = cloneVNode(vnode);
+  clone.fnContext = contextVm;
+  clone.fnOptions = options;
+  if (data.slot) {
+    (clone.data || (clone.data = {})).slot = data.slot;
+  }
+  return clone
+}
+
+function mergeProps (to, from) {
+  for (var key in from) {
+    to[camelize(key)] = from[key];
+  }
+}
+
+/*  */
+
+
+var RECYCLE_LIST_MARKER = '@inRecycleList';
+
+// Register the component hook to weex native render engine.
+// The hook will be triggered by native, not javascript.
+function registerComponentHook (
+  componentId,
+  type, // hook type, could be "lifecycle" or "instance"
+  hook, // hook name
+  fn
+) {
+  if (!document || !document.taskCenter) {
+    warn("Can't find available \"document\" or \"taskCenter\".");
+    return
+  }
+  if (typeof document.taskCenter.registerHook === 'function') {
+    return document.taskCenter.registerHook(componentId, type, hook, fn)
+  }
+  warn(("Failed to register component hook \"" + type + "@" + hook + "#" + componentId + "\"."));
+}
+
+// Updates the state of the component to weex native render engine.
+function updateComponentData (
+  componentId,
+  newData,
+  callback
+) {
+  if (!document || !document.taskCenter) {
+    warn("Can't find available \"document\" or \"taskCenter\".");
+    return
+  }
+  if (typeof document.taskCenter.updateData === 'function') {
+    return document.taskCenter.updateData(componentId, newData, callback)
+  }
+  warn(("Failed to update component data (" + componentId + ")."));
+}
+
+/*  */
+
+// https://github.com/Hanks10100/weex-native-directive/tree/master/component
+
+var uid$2 = 0;
+
+// override Vue.prototype._init
+function initVirtualComponent (options) {
+  if ( options === void 0 ) options = {};
+
+  var vm = this;
+  var componentId = options.componentId;
+
+  // virtual component uid
+  vm._uid = "virtual-component-" + (uid$2++);
+
+  // a flag to avoid this being observed
+  vm._isVue = true;
+  // merge options
+  if (options && options._isComponent) {
+    // optimize internal component instantiation
+    // since dynamic options merging is pretty slow, and none of the
+    // internal component options needs special treatment.
+    initInternalComponent(vm, options);
+  } else {
+    vm.$options = mergeOptions(
+      resolveConstructorOptions(vm.constructor),
+      options || {},
+      vm
+    );
+  }
+
+  /* istanbul ignore else */
+  if (process.env.NODE_ENV !== 'production') {
+    initProxy(vm);
+  } else {
+    vm._renderProxy = vm;
+  }
+
+  vm._self = vm;
+  initLifecycle(vm);
+  initEvents(vm);
+  initRender(vm);
+  callHook(vm, 'beforeCreate');
+  initInjections(vm); // resolve injections before data/props
+  initState(vm);
+  initProvide(vm); // resolve provide after data/props
+  callHook(vm, 'created');
+
+  // send initial data to native
+  var data = vm.$options.data;
+  var params = typeof data === 'function'
+    ? getData(data, vm)
+    : data || {};
+  if (isPlainObject(params)) {
+    updateComponentData(componentId, params);
+  }
+
+  registerComponentHook(componentId, 'lifecycle', 'attach', function () {
+    callHook(vm, 'beforeMount');
+
+    var updateComponent = function () {
+      vm._update(vm._vnode, false);
+    };
+    new Watcher(vm, updateComponent, noop, null, true);
+
+    vm._isMounted = true;
+    callHook(vm, 'mounted');
+  });
+
+  registerComponentHook(componentId, 'lifecycle', 'detach', function () {
+    vm.$destroy();
+  });
+}
+
+// override Vue.prototype._update
+function updateVirtualComponent (vnode) {
+  var vm = this;
+  var componentId = vm.$options.componentId;
+  if (vm._isMounted) {
+    callHook(vm, 'beforeUpdate');
+  }
+  vm._vnode = vnode;
+  if (vm._isMounted && componentId) {
+    // TODO: data should be filtered and without bindings
+    var data = Object.assign({}, vm._data);
+    updateComponentData(componentId, data, function () {
+      callHook(vm, 'updated');
+    });
+  }
+}
+
+// listening on native callback
+function resolveVirtualComponent (vnode) {
+  var BaseCtor = vnode.componentOptions.Ctor;
+  var VirtualComponent = BaseCtor.extend({});
+  var cid = VirtualComponent.cid;
+  VirtualComponent.prototype._init = initVirtualComponent;
+  VirtualComponent.prototype._update = updateVirtualComponent;
+
+  vnode.componentOptions.Ctor = BaseCtor.extend({
+    beforeCreate: function beforeCreate () {
+      // const vm: Component = this
+
+      // TODO: listen on all events and dispatch them to the
+      // corresponding virtual components according to the componentId.
+      // vm._virtualComponents = {}
+      var createVirtualComponent = function (componentId, propsData) {
+        // create virtual component
+        // const subVm =
+        new VirtualComponent({
+          componentId: componentId,
+          propsData: propsData
+        });
+        // if (vm._virtualComponents) {
+        //   vm._virtualComponents[componentId] = subVm
+        // }
+      };
+
+      registerComponentHook(cid, 'lifecycle', 'create', createVirtualComponent);
+    },
+    beforeDestroy: function beforeDestroy () {
+      delete this._virtualComponents;
+    }
+  });
+}
+
+/*  */
+
+function isRecyclableComponent (vnode) {
+  return vnode.data.attrs
+    ? (RECYCLE_LIST_MARKER in vnode.data.attrs)
+    : false
+}
+
+function renderRecyclableComponentTemplate (vnode) {
+  // $flow-disable-line
+  delete vnode.data.attrs[RECYCLE_LIST_MARKER];
+  resolveVirtualComponent(vnode);
+  var vm = createComponentInstanceForVnode(vnode);
+  var render = (vm.$options)['@render'];
+  if (render) {
+    try {
+      return render.call(vm)
+    } catch (err) {
+      handleError(err, vm, "@render");
+    }
+  } else {
+    warn(
+      "@render function not defined on component used in <recycle-list>. " +
+      "Make sure to declare `recyclable=\"true\"` on the component's template.",
+      vm
+    );
+  }
+}
+
+/*  */
+
+// inline hooks to be invoked on component VNodes during patch
+var componentVNodeHooks = {
+  init: function init (
+    vnode,
+    hydrating,
+    parentElm,
+    refElm
+  ) {
+    if (
+      vnode.componentInstance &&
+      !vnode.componentInstance._isDestroyed &&
+      vnode.data.keepAlive
+    ) {
+      // kept-alive components, treat as a patch
+      var mountedNode = vnode; // work around flow
+      componentVNodeHooks.prepatch(mountedNode, mountedNode);
+    } else {
+      var child = vnode.componentInstance = createComponentInstanceForVnode(
+        vnode,
+        activeInstance,
+        parentElm,
+        refElm
+      );
+      child.$mount(hydrating ? vnode.elm : undefined, hydrating);
+    }
+  },
+
+  prepatch: function prepatch (oldVnode, vnode) {
+    var options = vnode.componentOptions;
+    var child = vnode.componentInstance = oldVnode.componentInstance;
+    updateChildComponent(
+      child,
+      options.propsData, // updated props
+      options.listeners, // updated listeners
+      vnode, // new parent vnode
+      options.children // new children
+    );
+  },
+
+  insert: function insert (vnode) {
+    var context = vnode.context;
+    var componentInstance = vnode.componentInstance;
+    if (!componentInstance._isMounted) {
+      componentInstance._isMounted = true;
+      callHook(componentInstance, 'mounted');
+    }
+    if (vnode.data.keepAlive) {
+      if (context._isMounted) {
+        // vue-router#1212
+        // During updates, a kept-alive component's child components may
+        // change, so directly walking the tree here may call activated hooks
+        // on incorrect children. Instead we push them into a queue which will
+        // be processed after the whole patch process ended.
+        queueActivatedComponent(componentInstance);
+      } else {
+        activateChildComponent(componentInstance, true /* direct */);
+      }
+    }
+  },
+
+  destroy: function destroy (vnode) {
+    var componentInstance = vnode.componentInstance;
+    if (!componentInstance._isDestroyed) {
+      if (!vnode.data.keepAlive) {
+        componentInstance.$destroy();
+      } else {
+        deactivateChildComponent(componentInstance, true /* direct */);
+      }
+    }
+  }
+};
+
+var hooksToMerge = Object.keys(componentVNodeHooks);
+
+function createComponent (
+  Ctor,
+  data,
+  context,
+  children,
+  tag
+) {
+  if (isUndef(Ctor)) {
+    return
+  }
+
+  var baseCtor = context.$options._base;
+
+  // plain options object: turn it into a constructor
+  if (isObject(Ctor)) {
+    Ctor = baseCtor.extend(Ctor);
+  }
+
+  // if at this stage it's not a constructor or an async component factory,
+  // reject.
+  if (typeof Ctor !== 'function') {
+    if (process.env.NODE_ENV !== 'production') {
+      warn(("Invalid Component definition: " + (String(Ctor))), context);
+    }
+    return
+  }
+
+  // async component
+  var asyncFactory;
+  if (isUndef(Ctor.cid)) {
+    asyncFactory = Ctor;
+    Ctor = resolveAsyncComponent(asyncFactory, baseCtor, context);
+    if (Ctor === undefined) {
+      // return a placeholder node for async component, which is rendered
+      // as a comment node but preserves all the raw information for the node.
+      // the information will be used for async server-rendering and hydration.
+      return createAsyncPlaceholder(
+        asyncFactory,
+        data,
+        context,
+        children,
+        tag
+      )
+    }
+  }
+
+  data = data || {};
+
+  // resolve constructor options in case global mixins are applied after
+  // component constructor creation
+  resolveConstructorOptions(Ctor);
+
+  // transform component v-model data into props & events
+  if (isDef(data.model)) {
+    transformModel(Ctor.options, data);
+  }
+
+  // extract props
+  var propsData = extractPropsFromVNodeData(data, Ctor, tag);
+
+  // functional component
+  if (isTrue(Ctor.options.functional)) {
+    return createFunctionalComponent(Ctor, propsData, data, context, children)
+  }
+
+  // extract listeners, since these needs to be treated as
+  // child component listeners instead of DOM listeners
+  var listeners = data.on;
+  // replace with listeners with .native modifier
+  // so it gets processed during parent component patch.
+  data.on = data.nativeOn;
+
+  if (isTrue(Ctor.options.abstract)) {
+    // abstract components do not keep anything
+    // other than props & listeners & slot
+
+    // work around flow
+    var slot = data.slot;
+    data = {};
+    if (slot) {
+      data.slot = slot;
+    }
+  }
+
+  // install component management hooks onto the placeholder node
+  installComponentHooks(data);
+
+  // return a placeholder vnode
+  var name = Ctor.options.name || tag;
+  var vnode = new VNode(
+    ("vue-component-" + (Ctor.cid) + (name ? ("-" + name) : '')),
+    data, undefined, undefined, undefined, context,
+    { Ctor: Ctor, propsData: propsData, listeners: listeners, tag: tag, children: children },
+    asyncFactory
+  );
+
+  // Weex specific: invoke recycle-list optimized @render function for
+  // extracting cell-slot template.
+  // https://github.com/Hanks10100/weex-native-directive/tree/master/component
+  /* istanbul ignore if */
+  if (true && isRecyclableComponent(vnode)) {
+    return renderRecyclableComponentTemplate(vnode)
+  }
+
+  return vnode
+}
+
+function createComponentInstanceForVnode (
+  vnode, // we know it's MountedComponentVNode but flow doesn't
+  parent, // activeInstance in lifecycle state
+  parentElm,
+  refElm
+) {
+  var options = {
+    _isComponent: true,
+    parent: parent,
+    _parentVnode: vnode,
+    _parentElm: parentElm || null,
+    _refElm: refElm || null
+  };
+  // check inline-template render functions
+  var inlineTemplate = vnode.data.inlineTemplate;
+  if (isDef(inlineTemplate)) {
+    options.render = inlineTemplate.render;
+    options.staticRenderFns = inlineTemplate.staticRenderFns;
+  }
+  return new vnode.componentOptions.Ctor(options)
+}
+
+function installComponentHooks (data) {
+  var hooks = data.hook || (data.hook = {});
+  for (var i = 0; i < hooksToMerge.length; i++) {
+    var key = hooksToMerge[i];
+    hooks[key] = componentVNodeHooks[key];
+  }
+}
+
+// transform component v-model info (value and callback) into
+// prop and event handler respectively.
+function transformModel (options, data) {
+  var prop = (options.model && options.model.prop) || 'value';
+  var event = (options.model && options.model.event) || 'input';(data.props || (data.props = {}))[prop] = data.model.value;
+  var on = data.on || (data.on = {});
+  if (isDef(on[event])) {
+    on[event] = [data.model.callback].concat(on[event]);
+  } else {
+    on[event] = data.model.callback;
+  }
+}
+
+/*  */
+
+var SIMPLE_NORMALIZE = 1;
+var ALWAYS_NORMALIZE = 2;
+
+// wrapper function for providing a more flexible interface
+// without getting yelled at by flow
+function createElement (
+  context,
+  tag,
+  data,
+  children,
+  normalizationType,
+  alwaysNormalize
+) {
+  if (Array.isArray(data) || isPrimitive(data)) {
+    normalizationType = children;
+    children = data;
+    data = undefined;
+  }
+  if (isTrue(alwaysNormalize)) {
+    normalizationType = ALWAYS_NORMALIZE;
+  }
+  return _createElement(context, tag, data, children, normalizationType)
+}
+
+function _createElement (
+  context,
+  tag,
+  data,
+  children,
+  normalizationType
+) {
+  if (isDef(data) && isDef((data).__ob__)) {
+    process.env.NODE_ENV !== 'production' && warn(
+      "Avoid using observed data object as vnode data: " + (JSON.stringify(data)) + "\n" +
+      'Always create fresh vnode data objects in each render!',
+      context
+    );
+    return createEmptyVNode()
+  }
+  // object syntax in v-bind
+  if (isDef(data) && isDef(data.is)) {
+    tag = data.is;
+  }
+  if (!tag) {
+    // in case of component :is set to falsy value
+    return createEmptyVNode()
+  }
+  // warn against non-primitive key
+  if (process.env.NODE_ENV !== 'production' &&
+    isDef(data) && isDef(data.key) && !isPrimitive(data.key)
+  ) {
+    if (!true || !('@binding' in data.key)) {
+      warn(
+        'Avoid using non-primitive value as key, ' +
+        'use string/number value instead.',
+        context
+      );
+    }
+  }
+  // support single function children as default scoped slot
+  if (Array.isArray(children) &&
+    typeof children[0] === 'function'
+  ) {
+    data = data || {};
+    data.scopedSlots = { default: children[0] };
+    children.length = 0;
+  }
+  if (normalizationType === ALWAYS_NORMALIZE) {
+    children = normalizeChildren(children);
+  } else if (normalizationType === SIMPLE_NORMALIZE) {
+    children = simpleNormalizeChildren(children);
+  }
+  var vnode, ns;
+  if (typeof tag === 'string') {
+    var Ctor;
+    ns = (context.$vnode && context.$vnode.ns) || config.getTagNamespace(tag);
+    if (config.isReservedTag(tag)) {
+      // platform built-in elements
+      vnode = new VNode(
+        config.parsePlatformTagName(tag), data, children,
+        undefined, undefined, context
+      );
+    } else if (isDef(Ctor = resolveAsset(context.$options, 'components', tag))) {
+      // component
+      vnode = createComponent(Ctor, data, context, children, tag);
+    } else {
+      // unknown or unlisted namespaced elements
+      // check at runtime because it may get assigned a namespace when its
+      // parent normalizes children
+      vnode = new VNode(
+        tag, data, children,
+        undefined, undefined, context
+      );
+    }
+  } else {
+    // direct component options / constructor
+    vnode = createComponent(tag, data, context, children);
+  }
+  if (Array.isArray(vnode)) {
+    return vnode
+  } else if (isDef(vnode)) {
+    if (isDef(ns)) { applyNS(vnode, ns); }
+    if (isDef(data)) { registerDeepBindings(data); }
+    return vnode
+  } else {
+    return createEmptyVNode()
+  }
+}
+
+function applyNS (vnode, ns, force) {
+  vnode.ns = ns;
+  if (vnode.tag === 'foreignObject') {
+    // use default namespace inside foreignObject
+    ns = undefined;
+    force = true;
+  }
+  if (isDef(vnode.children)) {
+    for (var i = 0, l = vnode.children.length; i < l; i++) {
+      var child = vnode.children[i];
+      if (isDef(child.tag) && (
+        isUndef(child.ns) || (isTrue(force) && child.tag !== 'svg'))) {
+        applyNS(child, ns, force);
+      }
+    }
+  }
+}
+
+// ref #5318
+// necessary to ensure parent re-render when deep bindings like :style and
+// :class are used on slot nodes
+function registerDeepBindings (data) {
+  if (isObject(data.style)) {
+    traverse(data.style);
+  }
+  if (isObject(data.class)) {
+    traverse(data.class);
+  }
+}
+
+/*  */
+
+function initRender (vm) {
+  vm._vnode = null; // the root of the child tree
+  vm._staticTrees = null; // v-once cached trees
+  var options = vm.$options;
+  var parentVnode = vm.$vnode = options._parentVnode; // the placeholder node in parent tree
+  var renderContext = parentVnode && parentVnode.context;
+  vm.$slots = resolveSlots(options._renderChildren, renderContext);
+  vm.$scopedSlots = emptyObject;
+  // bind the createElement fn to this instance
+  // so that we get proper render context inside it.
+  // args order: tag, data, children, normalizationType, alwaysNormalize
+  // internal version is used by render functions compiled from templates
+  vm._c = function (a, b, c, d) { return createElement(vm, a, b, c, d, false); };
+  // normalization is always applied for the public version, used in
+  // user-written render functions.
+  vm.$createElement = function (a, b, c, d) { return createElement(vm, a, b, c, d, true); };
+
+  // $attrs & $listeners are exposed for easier HOC creation.
+  // they need to be reactive so that HOCs using them are always updated
+  var parentData = parentVnode && parentVnode.data;
+
+  /* istanbul ignore else */
+  if (process.env.NODE_ENV !== 'production') {
+    defineReactive(vm, '$attrs', parentData && parentData.attrs || emptyObject, function () {
+      !isUpdatingChildComponent && warn("$attrs is readonly.", vm);
+    }, true);
+    defineReactive(vm, '$listeners', options._parentListeners || emptyObject, function () {
+      !isUpdatingChildComponent && warn("$listeners is readonly.", vm);
+    }, true);
+  } else {
+    defineReactive(vm, '$attrs', parentData && parentData.attrs || emptyObject, null, true);
+    defineReactive(vm, '$listeners', options._parentListeners || emptyObject, null, true);
+  }
+}
+
+function renderMixin (Vue) {
+  // install runtime convenience helpers
+  installRenderHelpers(Vue.prototype);
+
+  Vue.prototype.$nextTick = function (fn) {
+    return nextTick(fn, this)
+  };
+
+  Vue.prototype._render = function () {
+    var vm = this;
+    var ref = vm.$options;
+    var render = ref.render;
+    var _parentVnode = ref._parentVnode;
+
+    // reset _rendered flag on slots for duplicate slot check
+    if (process.env.NODE_ENV !== 'production') {
+      for (var key in vm.$slots) {
+        // $flow-disable-line
+        vm.$slots[key]._rendered = false;
+      }
+    }
+
+    if (_parentVnode) {
+      vm.$scopedSlots = _parentVnode.data.scopedSlots || emptyObject;
+    }
+
+    // set parent vnode. this allows render functions to have access
+    // to the data on the placeholder node.
+    vm.$vnode = _parentVnode;
+    // render self
+    var vnode;
+    try {
+      vnode = render.call(vm._renderProxy, vm.$createElement);
+    } catch (e) {
+      handleError(e, vm, "render");
+      // return error render result,
+      // or previous vnode to prevent render error causing blank component
+      /* istanbul ignore else */
+      if (process.env.NODE_ENV !== 'production') {
+        if (vm.$options.renderError) {
+          try {
+            vnode = vm.$options.renderError.call(vm._renderProxy, vm.$createElement, e);
+          } catch (e) {
+            handleError(e, vm, "renderError");
+            vnode = vm._vnode;
+          }
+        } else {
+          vnode = vm._vnode;
+        }
+      } else {
+        vnode = vm._vnode;
+      }
+    }
+    // return empty vnode in case the render function errored out
+    if (!(vnode instanceof VNode)) {
+      if (process.env.NODE_ENV !== 'production' && Array.isArray(vnode)) {
+        warn(
+          'Multiple root nodes returned from render function. Render function ' +
+          'should return a single root node.',
+          vm
+        );
+      }
+      vnode = createEmptyVNode();
+    }
+    // set parent
+    vnode.parent = _parentVnode;
+    return vnode
+  };
+}
+
+/*  */
+
+var uid$3 = 0;
+
+function initMixin (Vue) {
+  Vue.prototype._init = function (options) {
+    var vm = this;
+    // a uid
+    vm._uid = uid$3++;
+
+    var startTag, endTag;
+    /* istanbul ignore if */
+    if (process.env.NODE_ENV !== 'production' && config.performance && mark) {
+      startTag = "vue-perf-start:" + (vm._uid);
+      endTag = "vue-perf-end:" + (vm._uid);
+      mark(startTag);
+    }
+
+    // a flag to avoid this being observed
+    vm._isVue = true;
+    // merge options
+    if (options && options._isComponent) {
+      // optimize internal component instantiation
+      // since dynamic options merging is pretty slow, and none of the
+      // internal component options needs special treatment.
+      initInternalComponent(vm, options);
+    } else {
+      vm.$options = mergeOptions(
+        resolveConstructorOptions(vm.constructor),
+        options || {},
+        vm
+      );
+    }
+    /* istanbul ignore else */
+    if (process.env.NODE_ENV !== 'production') {
+      initProxy(vm);
+    } else {
+      vm._renderProxy = vm;
+    }
+    // expose real self
+    vm._self = vm;
+    initLifecycle(vm);
+    initEvents(vm);
+    initRender(vm);
+    callHook(vm, 'beforeCreate');
+    initInjections(vm); // resolve injections before data/props
+    initState(vm);
+    initProvide(vm); // resolve provide after data/props
+    callHook(vm, 'created');
+
+    /* istanbul ignore if */
+    if (process.env.NODE_ENV !== 'production' && config.performance && mark) {
+      vm._name = formatComponentName(vm, false);
+      mark(endTag);
+      measure(("vue " + (vm._name) + " init"), startTag, endTag);
+    }
+
+    if (vm.$options.el) {
+      vm.$mount(vm.$options.el);
+    }
+  };
+}
+
+function initInternalComponent (vm, options) {
+  var opts = vm.$options = Object.create(vm.constructor.options);
+  // doing this because it's faster than dynamic enumeration.
+  var parentVnode = options._parentVnode;
+  opts.parent = options.parent;
+  opts._parentVnode = parentVnode;
+  opts._parentElm = options._parentElm;
+  opts._refElm = options._refElm;
+
+  var vnodeComponentOptions = parentVnode.componentOptions;
+  opts.propsData = vnodeComponentOptions.propsData;
+  opts._parentListeners = vnodeComponentOptions.listeners;
+  opts._renderChildren = vnodeComponentOptions.children;
+  opts._componentTag = vnodeComponentOptions.tag;
+
+  if (options.render) {
+    opts.render = options.render;
+    opts.staticRenderFns = options.staticRenderFns;
+  }
+}
+
+function resolveConstructorOptions (Ctor) {
+  var options = Ctor.options;
+  if (Ctor.super) {
+    var superOptions = resolveConstructorOptions(Ctor.super);
+    var cachedSuperOptions = Ctor.superOptions;
+    if (superOptions !== cachedSuperOptions) {
+      // super option changed,
+      // need to resolve new options.
+      Ctor.superOptions = superOptions;
+      // check if there are any late-modified/attached options (#4976)
+      var modifiedOptions = resolveModifiedOptions(Ctor);
+      // update base extend options
+      if (modifiedOptions) {
+        extend(Ctor.extendOptions, modifiedOptions);
+      }
+      options = Ctor.options = mergeOptions(superOptions, Ctor.extendOptions);
+      if (options.name) {
+        options.components[options.name] = Ctor;
+      }
+    }
+  }
+  return options
+}
+
+function resolveModifiedOptions (Ctor) {
+  var modified;
+  var latest = Ctor.options;
+  var extended = Ctor.extendOptions;
+  var sealed = Ctor.sealedOptions;
+  for (var key in latest) {
+    if (latest[key] !== sealed[key]) {
+      if (!modified) { modified = {}; }
+      modified[key] = dedupe(latest[key], extended[key], sealed[key]);
+    }
+  }
+  return modified
+}
+
+function dedupe (latest, extended, sealed) {
+  // compare latest and sealed to ensure lifecycle hooks won't be duplicated
+  // between merges
+  if (Array.isArray(latest)) {
+    var res = [];
+    sealed = Array.isArray(sealed) ? sealed : [sealed];
+    extended = Array.isArray(extended) ? extended : [extended];
+    for (var i = 0; i < latest.length; i++) {
+      // push original options and not sealed options to exclude duplicated options
+      if (extended.indexOf(latest[i]) >= 0 || sealed.indexOf(latest[i]) < 0) {
+        res.push(latest[i]);
+      }
+    }
+    return res
+  } else {
+    return latest
+  }
+}
+
+function Vue (options) {
+  if (process.env.NODE_ENV !== 'production' &&
+    !(this instanceof Vue)
+  ) {
+    warn('Vue is a constructor and should be called with the `new` keyword');
+  }
+  this._init(options);
+}
+
+initMixin(Vue);
+stateMixin(Vue);
+eventsMixin(Vue);
+lifecycleMixin(Vue);
+renderMixin(Vue);
+
+/*  */
+
+function initUse (Vue) {
+  Vue.use = function (plugin) {
+    var installedPlugins = (this._installedPlugins || (this._installedPlugins = []));
+    if (installedPlugins.indexOf(plugin) > -1) {
+      return this
+    }
+
+    // additional parameters
+    var args = toArray(arguments, 1);
+    args.unshift(this);
+    if (typeof plugin.install === 'function') {
+      plugin.install.apply(plugin, args);
+    } else if (typeof plugin === 'function') {
+      plugin.apply(null, args);
+    }
+    installedPlugins.push(plugin);
+    return this
+  };
+}
+
+/*  */
+
+function initMixin$1 (Vue) {
+  Vue.mixin = function (mixin) {
+    this.options = mergeOptions(this.options, mixin);
+    return this
+  };
+}
+
+/*  */
+
+function initExtend (Vue) {
+  /**
+   * Each instance constructor, including Vue, has a unique
+   * cid. This enables us to create wrapped "child
+   * constructors" for prototypal inheritance and cache them.
+   */
+  Vue.cid = 0;
+  var cid = 1;
+
+  /**
+   * Class inheritance
+   */
+  Vue.extend = function (extendOptions) {
+    extendOptions = extendOptions || {};
+    var Super = this;
+    var SuperId = Super.cid;
+    var cachedCtors = extendOptions._Ctor || (extendOptions._Ctor = {});
+    if (cachedCtors[SuperId]) {
+      return cachedCtors[SuperId]
+    }
+
+    var name = extendOptions.name || Super.options.name;
+    if (process.env.NODE_ENV !== 'production' && name) {
+      validateComponentName(name);
+    }
+
+    var Sub = function VueComponent (options) {
+      this._init(options);
+    };
+    Sub.prototype = Object.create(Super.prototype);
+    Sub.prototype.constructor = Sub;
+    Sub.cid = cid++;
+    Sub.options = mergeOptions(
+      Super.options,
+      extendOptions
+    );
+    Sub['super'] = Super;
+
+    // For props and computed properties, we define the proxy getters on
+    // the Vue instances at extension time, on the extended prototype. This
+    // avoids Object.defineProperty calls for each instance created.
+    if (Sub.options.props) {
+      initProps$1(Sub);
+    }
+    if (Sub.options.computed) {
+      initComputed$1(Sub);
+    }
+
+    // allow further extension/mixin/plugin usage
+    Sub.extend = Super.extend;
+    Sub.mixin = Super.mixin;
+    Sub.use = Super.use;
+
+    // create asset registers, so extended classes
+    // can have their private assets too.
+    ASSET_TYPES.forEach(function (type) {
+      Sub[type] = Super[type];
+    });
+    // enable recursive self-lookup
+    if (name) {
+      Sub.options.components[name] = Sub;
+    }
+
+    // keep a reference to the super options at extension time.
+    // later at instantiation we can check if Super's options have
+    // been updated.
+    Sub.superOptions = Super.options;
+    Sub.extendOptions = extendOptions;
+    Sub.sealedOptions = extend({}, Sub.options);
+
+    // cache constructor
+    cachedCtors[SuperId] = Sub;
+    return Sub
+  };
+}
+
+function initProps$1 (Comp) {
+  var props = Comp.options.props;
+  for (var key in props) {
+    proxy(Comp.prototype, "_props", key);
+  }
+}
+
+function initComputed$1 (Comp) {
+  var computed = Comp.options.computed;
+  for (var key in computed) {
+    defineComputed(Comp.prototype, key, computed[key]);
+  }
+}
+
+/*  */
+
+function initAssetRegisters (Vue) {
+  /**
+   * Create asset registration methods.
+   */
+  ASSET_TYPES.forEach(function (type) {
+    Vue[type] = function (
+      id,
+      definition
+    ) {
+      if (!definition) {
+        return this.options[type + 's'][id]
+      } else {
+        /* istanbul ignore if */
+        if (process.env.NODE_ENV !== 'production' && type === 'component') {
+          validateComponentName(id);
+        }
+        if (type === 'component' && isPlainObject(definition)) {
+          definition.name = definition.name || id;
+          definition = this.options._base.extend(definition);
+        }
+        if (type === 'directive' && typeof definition === 'function') {
+          definition = { bind: definition, update: definition };
+        }
+        this.options[type + 's'][id] = definition;
+        return definition
+      }
+    };
+  });
+}
+
+/*  */
+
+function getComponentName (opts) {
+  return opts && (opts.Ctor.options.name || opts.tag)
+}
+
+function matches (pattern, name) {
+  if (Array.isArray(pattern)) {
+    return pattern.indexOf(name) > -1
+  } else if (typeof pattern === 'string') {
+    return pattern.split(',').indexOf(name) > -1
+  } else if (isRegExp(pattern)) {
+    return pattern.test(name)
+  }
+  /* istanbul ignore next */
+  return false
+}
+
+function pruneCache (keepAliveInstance, filter) {
+  var cache = keepAliveInstance.cache;
+  var keys = keepAliveInstance.keys;
+  var _vnode = keepAliveInstance._vnode;
+  for (var key in cache) {
+    var cachedNode = cache[key];
+    if (cachedNode) {
+      var name = getComponentName(cachedNode.componentOptions);
+      if (name && !filter(name)) {
+        pruneCacheEntry(cache, key, keys, _vnode);
+      }
+    }
+  }
+}
+
+function pruneCacheEntry (
+  cache,
+  key,
+  keys,
+  current
+) {
+  var cached$$1 = cache[key];
+  if (cached$$1 && (!current || cached$$1.tag !== current.tag)) {
+    cached$$1.componentInstance.$destroy();
+  }
+  cache[key] = null;
+  remove(keys, key);
+}
+
+var patternTypes = [String, RegExp, Array];
+
+var KeepAlive = {
+  name: 'keep-alive',
+  abstract: true,
+
+  props: {
+    include: patternTypes,
+    exclude: patternTypes,
+    max: [String, Number]
+  },
+
+  created: function created () {
+    this.cache = Object.create(null);
+    this.keys = [];
+  },
+
+  destroyed: function destroyed () {
+    var this$1 = this;
+
+    for (var key in this$1.cache) {
+      pruneCacheEntry(this$1.cache, key, this$1.keys);
+    }
+  },
+
+  mounted: function mounted () {
+    var this$1 = this;
+
+    this.$watch('include', function (val) {
+      pruneCache(this$1, function (name) { return matches(val, name); });
+    });
+    this.$watch('exclude', function (val) {
+      pruneCache(this$1, function (name) { return !matches(val, name); });
+    });
+  },
+
+  render: function render () {
+    var slot = this.$slots.default;
+    var vnode = getFirstComponentChild(slot);
+    var componentOptions = vnode && vnode.componentOptions;
+    if (componentOptions) {
+      // check pattern
+      var name = getComponentName(componentOptions);
+      var ref = this;
+      var include = ref.include;
+      var exclude = ref.exclude;
+      if (
+        // not included
+        (include && (!name || !matches(include, name))) ||
+        // excluded
+        (exclude && name && matches(exclude, name))
+      ) {
+        return vnode
+      }
+
+      var ref$1 = this;
+      var cache = ref$1.cache;
+      var keys = ref$1.keys;
+      var key = vnode.key == null
+        // same constructor may get registered as different local components
+        // so cid alone is not enough (#3269)
+        ? componentOptions.Ctor.cid + (componentOptions.tag ? ("::" + (componentOptions.tag)) : '')
+        : vnode.key;
+      if (cache[key]) {
+        vnode.componentInstance = cache[key].componentInstance;
+        // make current key freshest
+        remove(keys, key);
+        keys.push(key);
+      } else {
+        cache[key] = vnode;
+        keys.push(key);
+        // prune oldest entry
+        if (this.max && keys.length > parseInt(this.max)) {
+          pruneCacheEntry(cache, keys[0], keys, this._vnode);
+        }
+      }
+
+      vnode.data.keepAlive = true;
+    }
+    return vnode || (slot && slot[0])
+  }
+}
+
+var builtInComponents = {
+  KeepAlive: KeepAlive
+}
+
+/*  */
+
+function initGlobalAPI (Vue) {
+  // config
+  var configDef = {};
+  configDef.get = function () { return config; };
+  if (process.env.NODE_ENV !== 'production') {
+    configDef.set = function () {
+      warn(
+        'Do not replace the Vue.config object, set individual fields instead.'
+      );
+    };
+  }
+  Object.defineProperty(Vue, 'config', configDef);
+
+  // exposed util methods.
+  // NOTE: these are not considered part of the public API - avoid relying on
+  // them unless you are aware of the risk.
+  Vue.util = {
+    warn: warn,
+    extend: extend,
+    mergeOptions: mergeOptions,
+    defineReactive: defineReactive
+  };
+
+  Vue.set = set;
+  Vue.delete = del;
+  Vue.nextTick = nextTick;
+
+  Vue.options = Object.create(null);
+  ASSET_TYPES.forEach(function (type) {
+    Vue.options[type + 's'] = Object.create(null);
+  });
+
+  // this is used to identify the "base" constructor to extend all plain-object
+  // components with in Weex's multi-instance scenarios.
+  Vue.options._base = Vue;
+
+  extend(Vue.options.components, builtInComponents);
+
+  initUse(Vue);
+  initMixin$1(Vue);
+  initExtend(Vue);
+  initAssetRegisters(Vue);
+}
+
+initGlobalAPI(Vue);
+
+Object.defineProperty(Vue.prototype, '$isServer', {
+  get: isServerRendering
+});
+
+Object.defineProperty(Vue.prototype, '$ssrContext', {
+  get: function get () {
+    /* istanbul ignore next */
+    return this.$vnode && this.$vnode.ssrContext
+  }
+});
+
+// expose FunctionalRenderContext for ssr runtime helper installation
+Object.defineProperty(Vue, 'FunctionalRenderContext', {
+  value: FunctionalRenderContext
+});
+
+Vue.version = '2.5.15';
+
+var latestNodeId = 1;
+
+function TextNode (text) {
+  this.instanceId = '';
+  this.nodeId = latestNodeId++;
+  this.parentNode = null;
+  this.nodeType = 3;
+  this.text = text;
+}
+
+/*  */
+
+
+var namespaceMap = {};
+
+function createElement$1 (tagName) {
+  return document.createElement(tagName)
+}
+
+function createElementNS (namespace, tagName) {
+  return document.createElement(namespace + ':' + tagName)
+}
+
+function createTextNode (text) {
+  return new TextNode(text)
+}
+
+function createComment (text) {
+  return document.createComment(text)
+}
+
+function insertBefore (
+  node,
+  target,
+  before
+) {
+  if (target.nodeType === 3) {
+    if (node.type === 'text') {
+      node.setAttr('value', target.text);
+      target.parentNode = node;
+    } else {
+      var text = createElement$1('text');
+      text.setAttr('value', target.text);
+      node.insertBefore(text, before);
+    }
+    return
+  }
+  node.insertBefore(target, before);
+}
+
+function removeChild (node, child) {
+  if (child.nodeType === 3) {
+    node.setAttr('value', '');
+    return
+  }
+  node.removeChild(child);
+}
+
+function appendChild (node, child) {
+  if (child.nodeType === 3) {
+    if (node.type === 'text') {
+      node.setAttr('value', child.text);
+      child.parentNode = node;
+    } else {
+      var text = createElement$1('text');
+      text.setAttr('value', child.text);
+      node.appendChild(text);
+    }
+    return
+  }
+
+  node.appendChild(child);
+}
+
+function parentNode (node) {
+  return node.parentNode
+}
+
+function nextSibling (node) {
+  return node.nextSibling
+}
+
+function tagName (node) {
+  return node.type
+}
+
+function setTextContent (node, text) {
+  if (node.parentNode) {
+    node.parentNode.setAttr('value', text);
+  }
+}
+
+function setAttribute (node, key, val) {
+  node.setAttr(key, val);
+}
+
+function setStyleScope (node, scopeId) {
+  node.setAttr('@styleScope', scopeId);
+}
+
+
+var nodeOps = Object.freeze({
+       namespaceMap: namespaceMap,
+       createElement: createElement$1,
+       createElementNS: createElementNS,
+       createTextNode: createTextNode,
+       createComment: createComment,
+       insertBefore: insertBefore,
+       removeChild: removeChild,
+       appendChild: appendChild,
+       parentNode: parentNode,
+       nextSibling: nextSibling,
+       tagName: tagName,
+       setTextContent: setTextContent,
+       setAttribute: setAttribute,
+       setStyleScope: setStyleScope
+});
+
+/*  */
+
+var ref = {
+  create: function create (_, vnode) {
+    registerRef(vnode);
+  },
+  update: function update (oldVnode, vnode) {
+    if (oldVnode.data.ref !== vnode.data.ref) {
+      registerRef(oldVnode, true);
+      registerRef(vnode);
+    }
+  },
+  destroy: function destroy (vnode) {
+    registerRef(vnode, true);
+  }
+}
+
+function registerRef (vnode, isRemoval) {
+  var key = vnode.data.ref;
+  if (!isDef(key)) { return }
+
+  var vm = vnode.context;
+  var ref = vnode.componentInstance || vnode.elm;
+  var refs = vm.$refs;
+  if (isRemoval) {
+    if (Array.isArray(refs[key])) {
+      remove(refs[key], ref);
+    } else if (refs[key] === ref) {
+      refs[key] = undefined;
+    }
+  } else {
+    if (vnode.data.refInFor) {
+      if (!Array.isArray(refs[key])) {
+        refs[key] = [ref];
+      } else if (refs[key].indexOf(ref) < 0) {
+        // $flow-disable-line
+        refs[key].push(ref);
+      }
+    } else {
+      refs[key] = ref;
+    }
+  }
+}
+
+/*  */
+
+
+
+var isHTMLTag = makeMap(
+  'html,body,base,head,link,meta,style,title,' +
+  'address,article,aside,footer,header,h1,h2,h3,h4,h5,h6,hgroup,nav,section,' +
+  'div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,' +
+  'a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,rtc,ruby,' +
+  's,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,' +
+  'embed,object,param,source,canvas,script,noscript,del,ins,' +
+  'caption,col,colgroup,table,thead,tbody,td,th,tr,' +
+  'button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,' +
+  'output,progress,select,textarea,' +
+  'details,dialog,menu,menuitem,summary,' +
+  'content,element,shadow,template,blockquote,iframe,tfoot'
+);
+
+// this map is intentionally selective, only covering SVG elements that may
+// contain child elements.
+var isSVG = makeMap(
+  'svg,animate,circle,clippath,cursor,defs,desc,ellipse,filter,font-face,' +
+  'foreignObject,g,glyph,image,line,marker,mask,missing-glyph,path,pattern,' +
+  'polygon,polyline,rect,switch,symbol,text,textpath,tspan,use,view',
+  true
+);
+
+
+
+
+
+
+
+
+
+var isTextInputType = makeMap('text,number,password,search,email,tel,url');
+
+/**
+ * Virtual DOM patching algorithm based on Snabbdom by
+ * Simon Friis Vindum (@paldepind)
+ * Licensed under the MIT License
+ * https://github.com/paldepind/snabbdom/blob/master/LICENSE
+ *
+ * modified by Evan You (@yyx990803)
+ *
+ * Not type-checking this because this file is perf-critical and the cost
+ * of making flow understand it is not worth it.
+ */
+
+var emptyNode = new VNode('', {}, []);
+
+var hooks = ['create', 'activate', 'update', 'remove', 'destroy'];
+
+function sameVnode (a, b) {
+  return (
+    a.key === b.key && (
+      (
+        a.tag === b.tag &&
+        a.isComment === b.isComment &&
+        isDef(a.data) === isDef(b.data) &&
+        sameInputType(a, b)
+      ) || (
+        isTrue(a.isAsyncPlaceholder) &&
+        a.asyncFactory === b.asyncFactory &&
+        isUndef(b.asyncFactory.error)
+      )
+    )
+  )
+}
+
+function sameInputType (a, b) {
+  if (a.tag !== 'input') { return true }
+  var i;
+  var typeA = isDef(i = a.data) && isDef(i = i.attrs) && i.type;
+  var typeB = isDef(i = b.data) && isDef(i = i.attrs) && i.type;
+  return typeA === typeB || isTextInputType(typeA) && isTextInputType(typeB)
+}
+
+function createKeyToOldIdx (children, beginIdx, endIdx) {
+  var i, key;
+  var map = {};
+  for (i = beginIdx; i <= endIdx; ++i) {
+    key = children[i].key;
+    if (isDef(key)) { map[key] = i; }
+  }
+  return map
+}
+
+function createPatchFunction (backend) {
+  var i, j;
+  var cbs = {};
+
+  var modules = backend.modules;
+  var nodeOps = backend.nodeOps;
+
+  for (i = 0; i < hooks.length; ++i) {
+    cbs[hooks[i]] = [];
+    for (j = 0; j < modules.length; ++j) {
+      if (isDef(modules[j][hooks[i]])) {
+        cbs[hooks[i]].push(modules[j][hooks[i]]);
+      }
+    }
+  }
+
+  function emptyNodeAt (elm) {
+    return new VNode(nodeOps.tagName(elm).toLowerCase(), {}, [], undefined, elm)
+  }
+
+  function createRmCb (childElm, listeners) {
+    function remove () {
+      if (--remove.listeners === 0) {
+        removeNode(childElm);
+      }
+    }
+    remove.listeners = listeners;
+    return remove
+  }
+
+  function removeNode (el) {
+    var parent = nodeOps.parentNode(el);
+    // element may have already been removed due to v-html / v-text
+    if (isDef(parent)) {
+      nodeOps.removeChild(parent, el);
+    }
+  }
+
+  function isUnknownElement$$1 (vnode, inVPre) {
+    return (
+      !inVPre &&
+      !vnode.ns &&
+      !(
+        config.ignoredElements.length &&
+        config.ignoredElements.some(function (ignore) {
+          return isRegExp(ignore)
+            ? ignore.test(vnode.tag)
+            : ignore === vnode.tag
+        })
+      ) &&
+      config.isUnknownElement(vnode.tag)
+    )
+  }
+
+  var creatingElmInVPre = 0;
+
+  function createElm (
+    vnode,
+    insertedVnodeQueue,
+    parentElm,
+    refElm,
+    nested,
+    ownerArray,
+    index
+  ) {
+    if (isDef(vnode.elm) && isDef(ownerArray)) {
+      // This vnode was used in a previous render!
+      // now it's used as a new node, overwriting its elm would cause
+      // potential patch errors down the road when it's used as an insertion
+      // reference node. Instead, we clone the node on-demand before creating
+      // associated DOM element for it.
+      vnode = ownerArray[index] = cloneVNode(vnode);
+    }
+
+    vnode.isRootInsert = !nested; // for transition enter check
+    if (createComponent(vnode, insertedVnodeQueue, parentElm, refElm)) {
+      return
+    }
+
+    var data = vnode.data;
+    var children = vnode.children;
+    var tag = vnode.tag;
+    if (isDef(tag)) {
+      if (process.env.NODE_ENV !== 'production') {
+        if (data && data.pre) {
+          creatingElmInVPre++;
+        }
+        if (isUnknownElement$$1(vnode, creatingElmInVPre)) {
+          warn(
+            'Unknown custom element: <' + tag + '> - did you ' +
+            'register the component correctly? For recursive components, ' +
+            'make sure to provide the "name" option.',
+            vnode.context
+          );
+        }
+      }
+
+      vnode.elm = vnode.ns
+        ? nodeOps.createElementNS(vnode.ns, tag)
+        : nodeOps.createElement(tag, vnode);
+      setScope(vnode);
+
+      /* istanbul ignore if */
+      {
+        // in Weex, the default insertion order is parent-first.
+        // List items can be optimized to use children-first insertion
+        // with append="tree".
+        var appendAsTree = isDef(data) && isTrue(data.appendAsTree);
+        if (!appendAsTree) {
+          if (isDef(data)) {
+            invokeCreateHooks(vnode, insertedVnodeQueue);
+          }
+          insert(parentElm, vnode.elm, refElm);
+        }
+        createChildren(vnode, children, insertedVnodeQueue);
+        if (appendAsTree) {
+          if (isDef(data)) {
+            invokeCreateHooks(vnode, insertedVnodeQueue);
+          }
+          insert(parentElm, vnode.elm, refElm);
+        }
+      }
+
+      if (process.env.NODE_ENV !== 'production' && data && data.pre) {
+        creatingElmInVPre--;
+      }
+    } else if (isTrue(vnode.isComment)) {
+      vnode.elm = nodeOps.createComment(vnode.text);
+      insert(parentElm, vnode.elm, refElm);
+    } else {
+      vnode.elm = nodeOps.createTextNode(vnode.text);
+      insert(parentElm, vnode.elm, refElm);
+    }
+  }
+
+  function createComponent (vnode, insertedVnodeQueue, parentElm, refElm) {
+    var i = vnode.data;
+    if (isDef(i)) {
+      var isReactivated = isDef(vnode.componentInstance) && i.keepAlive;
+      if (isDef(i = i.hook) && isDef(i = i.init)) {
+        i(vnode, false /* hydrating */, parentElm, refElm);
+      }
+      // after calling the init hook, if the vnode is a child component
+      // it should've created a child instance and mounted it. the child
+      // component also has set the placeholder vnode's elm.
+      // in that case we can just return the element and be done.
+      if (isDef(vnode.componentInstance)) {
+        initComponent(vnode, insertedVnodeQueue);
+        if (isTrue(isReactivated)) {
+          reactivateComponent(vnode, insertedVnodeQueue, parentElm, refElm);
+        }
+        return true
+      }
+    }
+  }
+
+  function initComponent (vnode, insertedVnodeQueue) {
+    if (isDef(vnode.data.pendingInsert)) {
+      insertedVnodeQueue.push.apply(insertedVnodeQueue, vnode.data.pendingInsert);
+      vnode.data.pendingInsert = null;
+    }
+    vnode.elm = vnode.componentInstance.$el;
+    if (isPatchable(vnode)) {
+      invokeCreateHooks(vnode, insertedVnodeQueue);
+      setScope(vnode);
+    } else {
+      // empty component root.
+      // skip all element-related modules except for ref (#3455)
+      registerRef(vnode);
+      // make sure to invoke the insert hook
+      insertedVnodeQueue.push(vnode);
+    }
+  }
+
+  function reactivateComponent (vnode, insertedVnodeQueue, parentElm, refElm) {
+    var i;
+    // hack for #4339: a reactivated component with inner transition
+    // does not trigger because the inner node's created hooks are not called
+    // again. It's not ideal to involve module-specific logic in here but
+    // there doesn't seem to be a better way to do it.
+    var innerNode = vnode;
+    while (innerNode.componentInstance) {
+      innerNode = innerNode.componentInstance._vnode;
+      if (isDef(i = innerNode.data) && isDef(i = i.transition)) {
+        for (i = 0; i < cbs.activate.length; ++i) {
+          cbs.activate[i](emptyNode, innerNode);
+        }
+        insertedVnodeQueue.push(innerNode);
+        break
+      }
+    }
+    // unlike a newly created component,
+    // a reactivated keep-alive component doesn't insert itself
+    insert(parentElm, vnode.elm, refElm);
+  }
+
+  function insert (parent, elm, ref$$1) {
+    if (isDef(parent)) {
+      if (isDef(ref$$1)) {
+        if (ref$$1.parentNode === parent) {
+          nodeOps.insertBefore(parent, elm, ref$$1);
+        }
+      } else {
+        nodeOps.appendChild(parent, elm);
+      }
+    }
+  }
+
+  function createChildren (vnode, children, insertedVnodeQueue) {
+    if (Array.isArray(children)) {
+      if (process.env.NODE_ENV !== 'production') {
+        checkDuplicateKeys(children);
+      }
+      for (var i = 0; i < children.length; ++i) {
+        createElm(children[i], insertedVnodeQueue, vnode.elm, null, true, children, i);
+      }
+    } else if (isPrimitive(vnode.text)) {
+      nodeOps.appendChild(vnode.elm, nodeOps.createTextNode(String(vnode.text)));
+    }
+  }
+
+  function isPatchable (vnode) {
+    while (vnode.componentInstance) {
+      vnode = vnode.componentInstance._vnode;
+    }
+    return isDef(vnode.tag)
+  }
+
+  function invokeCreateHooks (vnode, insertedVnodeQueue) {
+    for (var i$1 = 0; i$1 < cbs.create.length; ++i$1) {
+      cbs.create[i$1](emptyNode, vnode);
+    }
+    i = vnode.data.hook; // Reuse variable
+    if (isDef(i)) {
+      if (isDef(i.create)) { i.create(emptyNode, vnode); }
+      if (isDef(i.insert)) { insertedVnodeQueue.push(vnode); }
+    }
+  }
+
+  // set scope id attribute for scoped CSS.
+  // this is implemented as a special case to avoid the overhead
+  // of going through the normal attribute patching process.
+  function setScope (vnode) {
+    var i;
+    if (isDef(i = vnode.fnScopeId)) {
+      nodeOps.setStyleScope(vnode.elm, i);
+    } else {
+      var ancestor = vnode;
+      while (ancestor) {
+        if (isDef(i = ancestor.context) && isDef(i = i.$options._scopeId)) {
+          nodeOps.setStyleScope(vnode.elm, i);
+        }
+        ancestor = ancestor.parent;
+      }
+    }
+    // for slot content they should also get the scopeId from the host instance.
+    if (isDef(i = activeInstance) &&
+      i !== vnode.context &&
+      i !== vnode.fnContext &&
+      isDef(i = i.$options._scopeId)
+    ) {
+      nodeOps.setStyleScope(vnode.elm, i);
+    }
+  }
+
+  function addVnodes (parentElm, refElm, vnodes, startIdx, endIdx, insertedVnodeQueue) {
+    for (; startIdx <= endIdx; ++startIdx) {
+      createElm(vnodes[startIdx], insertedVnodeQueue, parentElm, refElm, false, vnodes, startIdx);
+    }
+  }
+
+  function invokeDestroyHook (vnode) {
+    var i, j;
+    var data = vnode.data;
+    if (isDef(data)) {
+      if (isDef(i = data.hook) && isDef(i = i.destroy)) { i(vnode); }
+      for (i = 0; i < cbs.destroy.length; ++i) { cbs.destroy[i](vnode); }
+    }
+    if (isDef(i = vnode.children)) {
+      for (j = 0; j < vnode.children.length; ++j) {
+        invokeDestroyHook(vnode.children[j]);
+      }
+    }
+  }
+
+  function removeVnodes (parentElm, vnodes, startIdx, endIdx) {
+    for (; startIdx <= endIdx; ++startIdx) {
+      var ch = vnodes[startIdx];
+      if (isDef(ch)) {
+        if (isDef(ch.tag)) {
+          removeAndInvokeRemoveHook(ch);
+          invokeDestroyHook(ch);
+        } else { // Text node
+          removeNode(ch.elm);
+        }
+      }
+    }
+  }
+
+  function removeAndInvokeRemoveHook (vnode, rm) {
+    if (isDef(rm) || isDef(vnode.data)) {
+      var i;
+      var listeners = cbs.remove.length + 1;
+      if (isDef(rm)) {
+        // we have a recursively passed down rm callback
+        // increase the listeners count
+        rm.listeners += listeners;
+      } else {
+        // directly removing
+        rm = createRmCb(vnode.elm, listeners);
+      }
+      // recursively invoke hooks on child component root node
+      if (isDef(i = vnode.componentInstance) && isDef(i = i._vnode) && isDef(i.data)) {
+        removeAndInvokeRemoveHook(i, rm);
+      }
+      for (i = 0; i < cbs.remove.length; ++i) {
+        cbs.remove[i](vnode, rm);
+      }
+      if (isDef(i = vnode.data.hook) && isDef(i = i.remove)) {
+        i(vnode, rm);
+      } else {
+        rm();
+      }
+    } else {
+      removeNode(vnode.elm);
+    }
+  }
+
+  function updateChildren (parentElm, oldCh, newCh, insertedVnodeQueue, removeOnly) {
+    var oldStartIdx = 0;
+    var newStartIdx = 0;
+    var oldEndIdx = oldCh.length - 1;
+    var oldStartVnode = oldCh[0];
+    var oldEndVnode = oldCh[oldEndIdx];
+    var newEndIdx = newCh.length - 1;
+    var newStartVnode = newCh[0];
+    var newEndVnode = newCh[newEndIdx];
+    var oldKeyToIdx, idxInOld, vnodeToMove, refElm;
+
+    // removeOnly is a special flag used only by <transition-group>
+    // to ensure removed elements stay in correct relative positions
+    // during leaving transitions
+    var canMove = !removeOnly;
+
+    if (process.env.NODE_ENV !== 'production') {
+      checkDuplicateKeys(newCh);
+    }
+
+    while (oldStartIdx <= oldEndIdx && newStartIdx <= newEndIdx) {
+      if (isUndef(oldStartVnode)) {
+        oldStartVnode = oldCh[++oldStartIdx]; // Vnode has been moved left
+      } else if (isUndef(oldEndVnode)) {
+        oldEndVnode = oldCh[--oldEndIdx];
+      } else if (sameVnode(oldStartVnode, newStartVnode)) {
+        patchVnode(oldStartVnode, newStartVnode, insertedVnodeQueue);
+        oldStartVnode = oldCh[++oldStartIdx];
+        newStartVnode = newCh[++newStartIdx];
+      } else if (sameVnode(oldEndVnode, newEndVnode)) {
+        patchVnode(oldEndVnode, newEndVnode, insertedVnodeQueue);
+        oldEndVnode = oldCh[--oldEndIdx];
+        newEndVnode = newCh[--newEndIdx];
+      } else if (sameVnode(oldStartVnode, newEndVnode)) { // Vnode moved right
+        patchVnode(oldStartVnode, newEndVnode, insertedVnodeQueue);
+        canMove && nodeOps.insertBefore(parentElm, oldStartVnode.elm, nodeOps.nextSibling(oldEndVnode.elm));
+        oldStartVnode = oldCh[++oldStartIdx];
+        newEndVnode = newCh[--newEndIdx];
+      } else if (sameVnode(oldEndVnode, newStartVnode)) { // Vnode moved left
+        patchVnode(oldEndVnode, newStartVnode, insertedVnodeQueue);
+        canMove && nodeOps.insertBefore(parentElm, oldEndVnode.elm, oldStartVnode.elm);
+        oldEndVnode = oldCh[--oldEndIdx];
+        newStartVnode = newCh[++newStartIdx];
+      } else {
+        if (isUndef(oldKeyToIdx)) { oldKeyToIdx = createKeyToOldIdx(oldCh, oldStartIdx, oldEndIdx); }
+        idxInOld = isDef(newStartVnode.key)
+          ? oldKeyToIdx[newStartVnode.key]
+          : findIdxInOld(newStartVnode, oldCh, oldStartIdx, oldEndIdx);
+        if (isUndef(idxInOld)) { // New element
+          createElm(newStartVnode, insertedVnodeQueue, parentElm, oldStartVnode.elm, false, newCh, newStartIdx);
+        } else {
+          vnodeToMove = oldCh[idxInOld];
+          if (sameVnode(vnodeToMove, newStartVnode)) {
+            patchVnode(vnodeToMove, newStartVnode, insertedVnodeQueue);
+            oldCh[idxInOld] = undefined;
+            canMove && nodeOps.insertBefore(parentElm, vnodeToMove.elm, oldStartVnode.elm);
+          } else {
+            // same key but different element. treat as new element
+            createElm(newStartVnode, insertedVnodeQueue, parentElm, oldStartVnode.elm, false, newCh, newStartIdx);
+          }
+        }
+        newStartVnode = newCh[++newStartIdx];
+      }
+    }
+    if (oldStartIdx > oldEndIdx) {
+      refElm = isUndef(newCh[newEndIdx + 1]) ? null : newCh[newEndIdx + 1].elm;
+      addVnodes(parentElm, refElm, newCh, newStartIdx, newEndIdx, insertedVnodeQueue);
+    } else if (newStartIdx > newEndIdx) {
+      removeVnodes(parentElm, oldCh, oldStartIdx, oldEndIdx);
+    }
+  }
+
+  function checkDuplicateKeys (children) {
+    var seenKeys = {};
+    for (var i = 0; i < children.length; i++) {
+      var vnode = children[i];
+      var key = vnode.key;
+      if (isDef(key)) {
+        if (seenKeys[key]) {
+          warn(
+            ("Duplicate keys detected: '" + key + "'. This may cause an update error."),
+            vnode.context
+          );
+        } else {
+          seenKeys[key] = true;
+        }
+      }
+    }
+  }
+
+  function findIdxInOld (node, oldCh, start, end) {
+    for (var i = start; i < end; i++) {
+      var c = oldCh[i];
+      if (isDef(c) && sameVnode(node, c)) { return i }
+    }
+  }
+
+  function patchVnode (oldVnode, vnode, insertedVnodeQueue, removeOnly) {
+    if (oldVnode === vnode) {
+      return
+    }
+
+    var elm = vnode.elm = oldVnode.elm;
+
+    if (isTrue(oldVnode.isAsyncPlaceholder)) {
+      if (isDef(vnode.asyncFactory.resolved)) {
+        hydrate(oldVnode.elm, vnode, insertedVnodeQueue);
+      } else {
+        vnode.isAsyncPlaceholder = true;
+      }
+      return
+    }
+
+    // reuse element for static trees.
+    // note we only do this if the vnode is cloned -
+    // if the new node is not cloned it means the render functions have been
+    // reset by the hot-reload-api and we need to do a proper re-render.
+    if (isTrue(vnode.isStatic) &&
+      isTrue(oldVnode.isStatic) &&
+      vnode.key === oldVnode.key &&
+      (isTrue(vnode.isCloned) || isTrue(vnode.isOnce))
+    ) {
+      vnode.componentInstance = oldVnode.componentInstance;
+      return
+    }
+
+    var i;
+    var data = vnode.data;
+    if (isDef(data) && isDef(i = data.hook) && isDef(i = i.prepatch)) {
+      i(oldVnode, vnode);
+    }
+
+    var oldCh = oldVnode.children;
+    var ch = vnode.children;
+    if (isDef(data) && isPatchable(vnode)) {
+      for (i = 0; i < cbs.update.length; ++i) { cbs.update[i](oldVnode, vnode); }
+      if (isDef(i = data.hook) && isDef(i = i.update)) { i(oldVnode, vnode); }
+    }
+    if (isUndef(vnode.text)) {
+      if (isDef(oldCh) && isDef(ch)) {
+        if (oldCh !== ch) { updateChildren(elm, oldCh, ch, insertedVnodeQueue, removeOnly); }
+      } else if (isDef(ch)) {
+        if (isDef(oldVnode.text)) { nodeOps.setTextContent(elm, ''); }
+        addVnodes(elm, null, ch, 0, ch.length - 1, insertedVnodeQueue);
+      } else if (isDef(oldCh)) {
+        removeVnodes(elm, oldCh, 0, oldCh.length - 1);
+      } else if (isDef(oldVnode.text)) {
+        nodeOps.setTextContent(elm, '');
+      }
+    } else if (oldVnode.text !== vnode.text) {
+      nodeOps.setTextContent(elm, vnode.text);
+    }
+    if (isDef(data)) {
+      if (isDef(i = data.hook) && isDef(i = i.postpatch)) { i(oldVnode, vnode); }
+    }
+  }
+
+  function invokeInsertHook (vnode, queue, initial) {
+    // delay insert hooks for component root nodes, invoke them after the
+    // element is really inserted
+    if (isTrue(initial) && isDef(vnode.parent)) {
+      vnode.parent.data.pendingInsert = queue;
+    } else {
+      for (var i = 0; i < queue.length; ++i) {
+        queue[i].data.hook.insert(queue[i]);
+      }
+    }
+  }
+
+  var hydrationBailed = false;
+  // list of modules that can skip create hook during hydration because they
+  // are already rendered on the client or has no need for initialization
+  // Note: style is excluded because it relies on initial clone for future
+  // deep updates (#7063).
+  var isRenderedModule = makeMap('attrs,class,staticClass,staticStyle,key');
+
+  // Note: this is a browser-only function so we can assume elms are DOM nodes.
+  function hydrate (elm, vnode, insertedVnodeQueue, inVPre) {
+    var i;
+    var tag = vnode.tag;
+    var data = vnode.data;
+    var children = vnode.children;
+    inVPre = inVPre || (data && data.pre);
+    vnode.elm = elm;
+
+    if (isTrue(vnode.isComment) && isDef(vnode.asyncFactory)) {
+      vnode.isAsyncPlaceholder = true;
+      return true
+    }
+    // assert node match
+    if (process.env.NODE_ENV !== 'production') {
+      if (!assertNodeMatch(elm, vnode, inVPre)) {
+        return false
+      }
+    }
+    if (isDef(data)) {
+      if (isDef(i = data.hook) && isDef(i = i.init)) { i(vnode, true /* hydrating */); }
+      if (isDef(i = vnode.componentInstance)) {
+        // child component. it should have hydrated its own tree.
+        initComponent(vnode, insertedVnodeQueue);
+        return true
+      }
+    }
+    if (isDef(tag)) {
+      if (isDef(children)) {
+        // empty element, allow client to pick up and populate children
+        if (!elm.hasChildNodes()) {
+          createChildren(vnode, children, insertedVnodeQueue);
+        } else {
+          // v-html and domProps: innerHTML
+          if (isDef(i = data) && isDef(i = i.domProps) && isDef(i = i.innerHTML)) {
+            if (i !== elm.innerHTML) {
+              /* istanbul ignore if */
+              if (process.env.NODE_ENV !== 'production' &&
+                typeof console !== 'undefined' &&
+                !hydrationBailed
+              ) {
+                hydrationBailed = true;
+                console.warn('Parent: ', elm);
+                console.warn('server innerHTML: ', i);
+                console.warn('client innerHTML: ', elm.innerHTML);
+              }
+              return false
+            }
+          } else {
+            // iterate and compare children lists
+            var childrenMatch = true;
+            var childNode = elm.firstChild;
+            for (var i$1 = 0; i$1 < children.length; i$1++) {
+              if (!childNode || !hydrate(childNode, children[i$1], insertedVnodeQueue, inVPre)) {
+                childrenMatch = false;
+                break
+              }
+              childNode = childNode.nextSibling;
+            }
+            // if childNode is not null, it means the actual childNodes list is
+            // longer than the virtual children list.
+            if (!childrenMatch || childNode) {
+              /* istanbul ignore if */
+              if (process.env.NODE_ENV !== 'production' &&
+                typeof console !== 'undefined' &&
+                !hydrationBailed
+              ) {
+                hydrationBailed = true;
+                console.warn('Parent: ', elm);
+                console.warn('Mismatching childNodes vs. VNodes: ', elm.childNodes, children);
+              }
+              return false
+            }
+          }
+        }
+      }
+      if (isDef(data)) {
+        var fullInvoke = false;
+        for (var key in data) {
+          if (!isRenderedModule(key)) {
+            fullInvoke = true;
+            invokeCreateHooks(vnode, insertedVnodeQueue);
+            break
+          }
+        }
+        if (!fullInvoke && data['class']) {
+          // ensure collecting deps for deep class bindings for future updates
+          traverse(data['class']);
+        }
+      }
+    } else if (elm.data !== vnode.text) {
+      elm.data = vnode.text;
+    }
+    return true
+  }
+
+  function assertNodeMatch (node, vnode, inVPre) {
+    if (isDef(vnode.tag)) {
+      return vnode.tag.indexOf('vue-component') === 0 || (
+        !isUnknownElement$$1(vnode, inVPre) &&
+        vnode.tag.toLowerCase() === (node.tagName && node.tagName.toLowerCase())
+      )
+    } else {
+      return node.nodeType === (vnode.isComment ? 8 : 3)
+    }
+  }
+
+  return function patch (oldVnode, vnode, hydrating, removeOnly, parentElm, refElm) {
+    if (isUndef(vnode)) {
+      if (isDef(oldVnode)) { invokeDestroyHook(oldVnode); }
+      return
+    }
+
+    var isInitialPatch = false;
+    var insertedVnodeQueue = [];
+
+    if (isUndef(oldVnode)) {
+      // empty mount (likely as component), create new root element
+      isInitialPatch = true;
+      createElm(vnode, insertedVnodeQueue, parentElm, refElm);
+    } else {
+      var isRealElement = isDef(oldVnode.nodeType);
+      if (!isRealElement && sameVnode(oldVnode, vnode)) {
+        // patch existing root node
+        patchVnode(oldVnode, vnode, insertedVnodeQueue, removeOnly);
+      } else {
+        if (isRealElement) {
+          // mounting to a real element
+          // check if this is server-rendered content and if we can perform
+          // a successful hydration.
+          if (oldVnode.nodeType === 1 && oldVnode.hasAttribute(SSR_ATTR)) {
+            oldVnode.removeAttribute(SSR_ATTR);
+            hydrating = true;
+          }
+          if (isTrue(hydrating)) {
+            if (hydrate(oldVnode, vnode, insertedVnodeQueue)) {
+              invokeInsertHook(vnode, insertedVnodeQueue, true);
+              return oldVnode
+            } else if (process.env.NODE_ENV !== 'production') {
+              warn(
+                'The client-side rendered virtual DOM tree is not matching ' +
+                'server-rendered content. This is likely caused by incorrect ' +
+                'HTML markup, for example nesting block-level elements inside ' +
+                '<p>, or missing <tbody>. Bailing hydration and performing ' +
+                'full client-side render.'
+              );
+            }
+          }
+          // either not server-rendered, or hydration failed.
+          // create an empty node and replace it
+          oldVnode = emptyNodeAt(oldVnode);
+        }
+
+        // replacing existing element
+        var oldElm = oldVnode.elm;
+        var parentElm$1 = nodeOps.parentNode(oldElm);
+
+        // create new node
+        createElm(
+          vnode,
+          insertedVnodeQueue,
+          // extremely rare edge case: do not insert if old element is in a
+          // leaving transition. Only happens when combining transition +
+          // keep-alive + HOCs. (#4590)
+          oldElm._leaveCb ? null : parentElm$1,
+          nodeOps.nextSibling(oldElm)
+        );
+
+        // update parent placeholder node element, recursively
+        if (isDef(vnode.parent)) {
+          var ancestor = vnode.parent;
+          var patchable = isPatchable(vnode);
+          while (ancestor) {
+            for (var i = 0; i < cbs.destroy.length; ++i) {
+              cbs.destroy[i](ancestor);
+            }
+            ancestor.elm = vnode.elm;
+            if (patchable) {
+              for (var i$1 = 0; i$1 < cbs.create.length; ++i$1) {
+                cbs.create[i$1](emptyNode, ancestor);
+              }
+              // #6513
+              // invoke insert hooks that may have been merged by create hooks.
+              // e.g. for directives that uses the "inserted" hook.
+              var insert = ancestor.data.hook.insert;
+              if (insert.merged) {
+                // start at index 1 to avoid re-invoking component mounted hook
+                for (var i$2 = 1; i$2 < insert.fns.length; i$2++) {
+                  insert.fns[i$2]();
+                }
+              }
+            } else {
+              registerRef(ancestor);
+            }
+            ancestor = ancestor.parent;
+          }
+        }
+
+        // destroy old node
+        if (isDef(parentElm$1)) {
+          removeVnodes(parentElm$1, [oldVnode], 0, 0);
+        } else if (isDef(oldVnode.tag)) {
+          invokeDestroyHook(oldVnode);
+        }
+      }
+    }
+
+    invokeInsertHook(vnode, insertedVnodeQueue, isInitialPatch);
+    return vnode.elm
+  }
+}
+
+/*  */
+
+var directives = {
+  create: updateDirectives,
+  update: updateDirectives,
+  destroy: function unbindDirectives (vnode) {
+    updateDirectives(vnode, emptyNode);
+  }
+}
+
+function updateDirectives (oldVnode, vnode) {
+  if (oldVnode.data.directives || vnode.data.directives) {
+    _update(oldVnode, vnode);
+  }
+}
+
+function _update (oldVnode, vnode) {
+  var isCreate = oldVnode === emptyNode;
+  var isDestroy = vnode === emptyNode;
+  var oldDirs = normalizeDirectives$1(oldVnode.data.directives, oldVnode.context);
+  var newDirs = normalizeDirectives$1(vnode.data.directives, vnode.context);
+
+  var dirsWithInsert = [];
+  var dirsWithPostpatch = [];
+
+  var key, oldDir, dir;
+  for (key in newDirs) {
+    oldDir = oldDirs[key];
+    dir = newDirs[key];
+    if (!oldDir) {
+      // new directive, bind
+      callHook$1(dir, 'bind', vnode, oldVnode);
+      if (dir.def && dir.def.inserted) {
+        dirsWithInsert.push(dir);
+      }
+    } else {
+      // existing directive, update
+      dir.oldValue = oldDir.value;
+      callHook$1(dir, 'update', vnode, oldVnode);
+      if (dir.def && dir.def.componentUpdated) {
+        dirsWithPostpatch.push(dir);
+      }
+    }
+  }
+
+  if (dirsWithInsert.length) {
+    var callInsert = function () {
+      for (var i = 0; i < dirsWithInsert.length; i++) {
+        callHook$1(dirsWithInsert[i], 'inserted', vnode, oldVnode);
+      }
+    };
+    if (isCreate) {
+      mergeVNodeHook(vnode, 'insert', callInsert);
+    } else {
+      callInsert();
+    }
+  }
+
+  if (dirsWithPostpatch.length) {
+    mergeVNodeHook(vnode, 'postpatch', function () {
+      for (var i = 0; i < dirsWithPostpatch.length; i++) {
+        callHook$1(dirsWithPostpatch[i], 'componentUpdated', vnode, oldVnode);
+      }
+    });
+  }
+
+  if (!isCreate) {
+    for (key in oldDirs) {
+      if (!newDirs[key]) {
+        // no longer present, unbind
+        callHook$1(oldDirs[key], 'unbind', oldVnode, oldVnode, isDestroy);
+      }
+    }
+  }
+}
+
+var emptyModifiers = Object.create(null);
+
+function normalizeDirectives$1 (
+  dirs,
+  vm
+) {
+  var res = Object.create(null);
+  if (!dirs) {
+    // $flow-disable-line
+    return res
+  }
+  var i, dir;
+  for (i = 0; i < dirs.length; i++) {
+    dir = dirs[i];
+    if (!dir.modifiers) {
+      // $flow-disable-line
+      dir.modifiers = emptyModifiers;
+    }
+    res[getRawDirName(dir)] = dir;
+    dir.def = resolveAsset(vm.$options, 'directives', dir.name, true);
+  }
+  // $flow-disable-line
+  return res
+}
+
+function getRawDirName (dir) {
+  return dir.rawName || ((dir.name) + "." + (Object.keys(dir.modifiers || {}).join('.')))
+}
+
+function callHook$1 (dir, hook, vnode, oldVnode, isDestroy) {
+  var fn = dir.def && dir.def[hook];
+  if (fn) {
+    try {
+      fn(vnode.elm, dir, vnode, oldVnode, isDestroy);
+    } catch (e) {
+      handleError(e, vnode.context, ("directive " + (dir.name) + " " + hook + " hook"));
+    }
+  }
+}
+
+var baseModules = [
+  ref,
+  directives
+]
+
+/*  */
+
+function updateAttrs (oldVnode, vnode) {
+  if (!oldVnode.data.attrs && !vnode.data.attrs) {
+    return
+  }
+  var key, cur, old;
+  var elm = vnode.elm;
+  var oldAttrs = oldVnode.data.attrs || {};
+  var attrs = vnode.data.attrs || {};
+  // clone observed objects, as the user probably wants to mutate it
+  if (attrs.__ob__) {
+    attrs = vnode.data.attrs = extend({}, attrs);
+  }
+
+  var supportBatchUpdate = typeof elm.setAttrs === 'function';
+  var batchedAttrs = {};
+  for (key in attrs) {
+    cur = attrs[key];
+    old = oldAttrs[key];
+    if (old !== cur) {
+      supportBatchUpdate
+        ? (batchedAttrs[key] = cur)
+        : elm.setAttr(key, cur);
+    }
+  }
+  for (key in oldAttrs) {
+    if (attrs[key] == null) {
+      supportBatchUpdate
+        ? (batchedAttrs[key] = undefined)
+        : elm.setAttr(key);
+    }
+  }
+  if (supportBatchUpdate) {
+    elm.setAttrs(batchedAttrs);
+  }
+}
+
+var attrs = {
+  create: updateAttrs,
+  update: updateAttrs
+}
+
+/*  */
+
+function updateClass (oldVnode, vnode) {
+  var el = vnode.elm;
+  var ctx = vnode.context;
+
+  var data = vnode.data;
+  var oldData = oldVnode.data;
+  if (!data.staticClass &&
+    !data.class &&
+    (!oldData || (!oldData.staticClass && !oldData.class))
+  ) {
+    return
+  }
+
+  var oldClassList = [];
+  // unlike web, weex vnode staticClass is an Array
+  var oldStaticClass = oldData.staticClass;
+  if (oldStaticClass) {
+    oldClassList.push.apply(oldClassList, oldStaticClass);
+  }
+  if (oldData.class) {
+    oldClassList.push.apply(oldClassList, oldData.class);
+  }
+
+  var classList = [];
+  // unlike web, weex vnode staticClass is an Array
+  var staticClass = data.staticClass;
+  if (staticClass) {
+    classList.push.apply(classList, staticClass);
+  }
+  if (data.class) {
+    classList.push.apply(classList, data.class);
+  }
+
+  if (typeof el.setClassList === 'function') {
+    el.setClassList(classList);
+  } else {
+    var style = getStyle(oldClassList, classList, ctx);
+    if (typeof el.setStyles === 'function') {
+      el.setStyles(style);
+    } else {
+      for (var key in style) {
+        el.setStyle(key, style[key]);
+      }
+    }
+  }
+}
+
+function getStyle (oldClassList, classList, ctx) {
+  // style is a weex-only injected object
+  // compiled from <style> tags in weex files
+  var stylesheet = ctx.$options.style || {};
+  var result = {};
+  classList.forEach(function (name) {
+    var style = stylesheet[name];
+    extend(result, style);
+  });
+  oldClassList.forEach(function (name) {
+    var style = stylesheet[name];
+    for (var key in style) {
+      if (!result.hasOwnProperty(key)) {
+        result[key] = '';
+      }
+    }
+  });
+  return result
+}
+
+var klass = {
+  create: updateClass,
+  update: updateClass
+}
+
+/*  */
+
+var target$1;
+
+function add$1 (
+  event,
+  handler,
+  once,
+  capture,
+  passive,
+  params
+) {
+  if (capture) {
+    console.log('Weex do not support event in bubble phase.');
+    return
+  }
+  if (once) {
+    var oldHandler = handler;
+    var _target = target$1; // save current target element in closure
+    handler = function (ev) {
+      var res = arguments.length === 1
+        ? oldHandler(ev)
+        : oldHandler.apply(null, arguments);
+      if (res !== null) {
+        remove$2(event, null, null, _target);
+      }
+    };
+  }
+  target$1.addEvent(event, handler, params);
+}
+
+function remove$2 (
+  event,
+  handler,
+  capture,
+  _target
+) {
+  (_target || target$1).removeEvent(event);
+}
+
+function updateDOMListeners (oldVnode, vnode) {
+  if (!oldVnode.data.on && !vnode.data.on) {
+    return
+  }
+  var on = vnode.data.on || {};
+  var oldOn = oldVnode.data.on || {};
+  target$1 = vnode.elm;
+  updateListeners(on, oldOn, add$1, remove$2, vnode.context);
+  target$1 = undefined;
+}
+
+var events = {
+  create: updateDOMListeners,
+  update: updateDOMListeners
+}
+
+/*  */
+
+var normalize = cached(camelize);
+
+function createStyle (oldVnode, vnode) {
+  if (!vnode.data.staticStyle) {
+    updateStyle(oldVnode, vnode);
+    return
+  }
+  var elm = vnode.elm;
+  var staticStyle = vnode.data.staticStyle;
+  var supportBatchUpdate = typeof elm.setStyles === 'function';
+  var batchedStyles = {};
+  for (var name in staticStyle) {
+    if (staticStyle[name]) {
+      supportBatchUpdate
+        ? (batchedStyles[normalize(name)] = staticStyle[name])
+        : elm.setStyle(normalize(name), staticStyle[name]);
+    }
+  }
+  if (supportBatchUpdate) {
+    elm.setStyles(batchedStyles);
+  }
+  updateStyle(oldVnode, vnode);
+}
+
+function updateStyle (oldVnode, vnode) {
+  if (!oldVnode.data.style && !vnode.data.style) {
+    return
+  }
+  var cur, name;
+  var elm = vnode.elm;
+  var oldStyle = oldVnode.data.style || {};
+  var style = vnode.data.style || {};
+
+  var needClone = style.__ob__;
+
+  // handle array syntax
+  if (Array.isArray(style)) {
+    style = vnode.data.style = toObject$1(style);
+  }
+
+  // clone the style for future updates,
+  // in case the user mutates the style object in-place.
+  if (needClone) {
+    style = vnode.data.style = extend({}, style);
+  }
+
+  var supportBatchUpdate = typeof elm.setStyles === 'function';
+  var batchedStyles = {};
+  for (name in oldStyle) {
+    if (!style[name]) {
+      supportBatchUpdate
+        ? (batchedStyles[normalize(name)] = '')
+        : elm.setStyle(normalize(name), '');
+    }
+  }
+  for (name in style) {
+    cur = style[name];
+    supportBatchUpdate
+      ? (batchedStyles[normalize(name)] = cur)
+      : elm.setStyle(normalize(name), cur);
+  }
+  if (supportBatchUpdate) {
+    elm.setStyles(batchedStyles);
+  }
+}
+
+function toObject$1 (arr) {
+  var res = {};
+  for (var i = 0; i < arr.length; i++) {
+    if (arr[i]) {
+      extend(res, arr[i]);
+    }
+  }
+  return res
+}
+
+var style = {
+  create: createStyle,
+  update: updateStyle
+}
+
+/*  */
+
+/**
+ * Add class with compatibility for SVG since classList is not supported on
+ * SVG elements in IE
+ */
+
+
+/**
+ * Remove class with compatibility for SVG since classList is not supported on
+ * SVG elements in IE
+ */
+
+/*  */
+
+function resolveTransition (def) {
+  if (!def) {
+    return
+  }
+  /* istanbul ignore else */
+  if (typeof def === 'object') {
+    var res = {};
+    if (def.css !== false) {
+      extend(res, autoCssTransition(def.name || 'v'));
+    }
+    extend(res, def);
+    return res
+  } else if (typeof def === 'string') {
+    return autoCssTransition(def)
+  }
+}
+
+var autoCssTransition = cached(function (name) {
+  return {
+    enterClass: (name + "-enter"),
+    enterToClass: (name + "-enter-to"),
+    enterActiveClass: (name + "-enter-active"),
+    leaveClass: (name + "-leave"),
+    leaveToClass: (name + "-leave-to"),
+    leaveActiveClass: (name + "-leave-active")
+  }
+});
+
+var hasTransition = inBrowser && !isIE9;
+// Transition property/event sniffing
+
+
+
+
+if (hasTransition) {
+  /* istanbul ignore if */
+  if (window.ontransitionend === undefined &&
+    window.onwebkittransitionend !== undefined
+  ) {
+    
+  }
+  if (window.onanimationend === undefined &&
+    window.onwebkitanimationend !== undefined
+  ) {
+    
+  }
+}
+
+// binding to window is necessary to make hot reload work in IE in strict mode
+var raf = inBrowser
+  ? window.requestAnimationFrame
+    ? window.requestAnimationFrame.bind(window)
+    : setTimeout
+  : /* istanbul ignore next */ function (fn) { return fn(); };
+
+var transition = {
+  create: enter,
+  activate: enter,
+  remove: leave
+}
+
+function enter (_, vnode) {
+  var el = vnode.elm;
+
+  // call leave callback now
+  if (el._leaveCb) {
+    el._leaveCb.cancelled = true;
+    el._leaveCb();
+  }
+
+  var data = resolveTransition(vnode.data.transition);
+  if (!data) {
+    return
+  }
+
+  /* istanbul ignore if */
+  if (el._enterCb) {
+    return
+  }
+
+  var enterClass = data.enterClass;
+  var enterToClass = data.enterToClass;
+  var enterActiveClass = data.enterActiveClass;
+  var appearClass = data.appearClass;
+  var appearToClass = data.appearToClass;
+  var appearActiveClass = data.appearActiveClass;
+  var beforeEnter = data.beforeEnter;
+  var enter = data.enter;
+  var afterEnter = data.afterEnter;
+  var enterCancelled = data.enterCancelled;
+  var beforeAppear = data.beforeAppear;
+  var appear = data.appear;
+  var afterAppear = data.afterAppear;
+  var appearCancelled = data.appearCancelled;
+
+  var context = activeInstance;
+  var transitionNode = activeInstance.$vnode;
+  while (transitionNode && transitionNode.parent) {
+    transitionNode = transitionNode.parent;
+    context = transitionNode.context;
+  }
+
+  var isAppear = !context._isMounted || !vnode.isRootInsert;
+
+  if (isAppear && !appear && appear !== '') {
+    return
+  }
+
+  var startClass = isAppear ? appearClass : enterClass;
+  var toClass = isAppear ? appearToClass : enterToClass;
+  var activeClass = isAppear ? appearActiveClass : enterActiveClass;
+  var beforeEnterHook = isAppear ? (beforeAppear || beforeEnter) : beforeEnter;
+  var enterHook = isAppear ? (typeof appear === 'function' ? appear : enter) : enter;
+  var afterEnterHook = isAppear ? (afterAppear || afterEnter) : afterEnter;
+  var enterCancelledHook = isAppear ? (appearCancelled || enterCancelled) : enterCancelled;
+
+  var userWantsControl =
+    enterHook &&
+    // enterHook may be a bound method which exposes
+    // the length of original fn as _length
+    (enterHook._length || enterHook.length) > 1;
+
+  var stylesheet = vnode.context.$options.style || {};
+  var startState = stylesheet[startClass];
+  var transitionProperties = (stylesheet['@TRANSITION'] && stylesheet['@TRANSITION'][activeClass]) || {};
+  var endState = getEnterTargetState(el, stylesheet, startClass, toClass, activeClass, vnode.context);
+  var needAnimation = Object.keys(endState).length > 0;
+
+  var cb = el._enterCb = once(function () {
+    if (cb.cancelled) {
+      enterCancelledHook && enterCancelledHook(el);
+    } else {
+      afterEnterHook && afterEnterHook(el);
+    }
+    el._enterCb = null;
+  });
+
+  // We need to wait until the native element has been inserted, but currently
+  // there's no API to do that. So we have to wait "one frame" - not entirely
+  // sure if this is guaranteed to be enough (e.g. on slow devices?)
+  setTimeout(function () {
+    var parent = el.parentNode;
+    var pendingNode = parent && parent._pending && parent._pending[vnode.key];
+    if (pendingNode &&
+      pendingNode.context === vnode.context &&
+      pendingNode.tag === vnode.tag &&
+      pendingNode.elm._leaveCb
+    ) {
+      pendingNode.elm._leaveCb();
+    }
+    enterHook && enterHook(el, cb);
+
+    if (needAnimation) {
+      var animation = vnode.context.$requireWeexModule('animation');
+      animation.transition(el.ref, {
+        styles: endState,
+        duration: transitionProperties.duration || 0,
+        delay: transitionProperties.delay || 0,
+        timingFunction: transitionProperties.timingFunction || 'linear'
+      }, userWantsControl ? noop : cb);
+    } else if (!userWantsControl) {
+      cb();
+    }
+  }, 16);
+
+  // start enter transition
+  beforeEnterHook && beforeEnterHook(el);
+
+  if (startState) {
+    if (typeof el.setStyles === 'function') {
+      el.setStyles(startState);
+    } else {
+      for (var key in startState) {
+        el.setStyle(key, startState[key]);
+      }
+    }
+  }
+
+  if (!needAnimation && !userWantsControl) {
+    cb();
+  }
+}
+
+function leave (vnode, rm) {
+  var el = vnode.elm;
+
+  // call enter callback now
+  if (el._enterCb) {
+    el._enterCb.cancelled = true;
+    el._enterCb();
+  }
+
+  var data = resolveTransition(vnode.data.transition);
+  if (!data) {
+    return rm()
+  }
+
+  if (el._leaveCb) {
+    return
+  }
+
+  var leaveClass = data.leaveClass;
+  var leaveToClass = data.leaveToClass;
+  var leaveActiveClass = data.leaveActiveClass;
+  var beforeLeave = data.beforeLeave;
+  var leave = data.leave;
+  var afterLeave = data.afterLeave;
+  var leaveCancelled = data.leaveCancelled;
+  var delayLeave = data.delayLeave;
+
+  var userWantsControl =
+    leave &&
+    // leave hook may be a bound method which exposes
+    // the length of original fn as _length
+    (leave._length || leave.length) > 1;
+
+  var stylesheet = vnode.context.$options.style || {};
+  var startState = stylesheet[leaveClass];
+  var endState = stylesheet[leaveToClass] || stylesheet[leaveActiveClass];
+  var transitionProperties = (stylesheet['@TRANSITION'] && stylesheet['@TRANSITION'][leaveActiveClass]) || {};
+
+  var cb = el._leaveCb = once(function () {
+    if (el.parentNode && el.parentNode._pending) {
+      el.parentNode._pending[vnode.key] = null;
+    }
+    if (cb.cancelled) {
+      leaveCancelled && leaveCancelled(el);
+    } else {
+      rm();
+      afterLeave && afterLeave(el);
+    }
+    el._leaveCb = null;
+  });
+
+  if (delayLeave) {
+    delayLeave(performLeave);
+  } else {
+    performLeave();
+  }
+
+  function performLeave () {
+    var animation = vnode.context.$requireWeexModule('animation');
+    // the delayed leave may have already been cancelled
+    if (cb.cancelled) {
+      return
+    }
+    // record leaving element
+    if (!vnode.data.show) {
+      (el.parentNode._pending || (el.parentNode._pending = {}))[vnode.key] = vnode;
+    }
+    beforeLeave && beforeLeave(el);
+
+    if (startState) {
+      animation.transition(el.ref, {
+        styles: startState
+      }, next);
+    } else {
+      next();
+    }
+
+    function next () {
+      animation.transition(el.ref, {
+        styles: endState,
+        duration: transitionProperties.duration || 0,
+        delay: transitionProperties.delay || 0,
+        timingFunction: transitionProperties.timingFunction || 'linear'
+      }, userWantsControl ? noop : cb);
+    }
+
+    leave && leave(el, cb);
+    if (!endState && !userWantsControl) {
+      cb();
+    }
+  }
+}
+
+// determine the target animation style for an entering transition.
+function getEnterTargetState (el, stylesheet, startClass, endClass, activeClass, vm) {
+  var targetState = {};
+  var startState = stylesheet[startClass];
+  var endState = stylesheet[endClass];
+  var activeState = stylesheet[activeClass];
+  // 1. fallback to element's default styling
+  if (startState) {
+    for (var key in startState) {
+      targetState[key] = el.style[key];
+      if (
+        process.env.NODE_ENV !== 'production' &&
+        targetState[key] == null &&
+        (!activeState || activeState[key] == null) &&
+        (!endState || endState[key] == null)
+      ) {
+        warn(
+          "transition property \"" + key + "\" is declared in enter starting class (." + startClass + "), " +
+          "but not declared anywhere in enter ending class (." + endClass + "), " +
+          "enter active cass (." + activeClass + ") or the element's default styling. " +
+          "Note in Weex, CSS properties need explicit values to be transitionable."
+        );
+      }
+    }
+  }
+  // 2. if state is mixed in active state, extract them while excluding
+  //    transition properties
+  if (activeState) {
+    for (var key$1 in activeState) {
+      if (key$1.indexOf('transition') !== 0) {
+        targetState[key$1] = activeState[key$1];
+      }
+    }
+  }
+  // 3. explicit endState has highest priority
+  if (endState) {
+    extend(targetState, endState);
+  }
+  return targetState
+}
+
+var platformModules = [
+  attrs,
+  klass,
+  events,
+  style,
+  transition
+]
+
+/*  */
+
+// the directive module should be applied last, after all
+// built-in modules have been applied.
+var modules = platformModules.concat(baseModules);
+
+var patch = createPatchFunction({
+  nodeOps: nodeOps,
+  modules: modules,
+  LONG_LIST_THRESHOLD: 10
+});
+
+var platformDirectives = {
+}
+
+/*  */
+
+function getVNodeType (vnode) {
+  if (!vnode.tag) {
+    return ''
+  }
+  return vnode.tag.replace(/vue\-component\-(\d+\-)?/, '')
+}
+
+function isSimpleSpan (vnode) {
+  return vnode.children &&
+    vnode.children.length === 1 &&
+    !vnode.children[0].tag
+}
+
+function parseStyle (vnode) {
+  if (!vnode || !vnode.data) {
+    return
+  }
+  var ref = vnode.data;
+  var staticStyle = ref.staticStyle;
+  var staticClass = ref.staticClass;
+  if (vnode.data.style || vnode.data.class || staticStyle || staticClass) {
+    var styles = Object.assign({}, staticStyle, vnode.data.style);
+    var cssMap = vnode.context.$options.style || {};
+    var classList = [].concat(staticClass, vnode.data.class);
+    classList.forEach(function (name) {
+      if (name && cssMap[name]) {
+        Object.assign(styles, cssMap[name]);
+      }
+    });
+    return styles
+  }
+}
+
+function convertVNodeChildren (children) {
+  if (!children.length) {
+    return
+  }
+
+  return children.map(function (vnode) {
+    var type = getVNodeType(vnode);
+    var props = { type: type };
+
+    // convert raw text node
+    if (!type) {
+      props.type = 'span';
+      props.attr = {
+        value: (vnode.text || '').trim()
+      };
+    } else {
+      props.style = parseStyle(vnode);
+      if (vnode.data) {
+        props.attr = vnode.data.attrs;
+        if (vnode.data.on) {
+          props.events = vnode.data.on;
+        }
+      }
+      if (type === 'span' && isSimpleSpan(vnode)) {
+        props.attr = props.attr || {};
+        props.attr.value = vnode.children[0].text.trim();
+        return props
+      }
+    }
+
+    if (vnode.children && vnode.children.length) {
+      props.children = convertVNodeChildren(vnode.children);
+    }
+
+    return props
+  })
+}
+
+var Richtext = {
+  name: 'richtext',
+  render: function render (h) {
+    return h('weex:richtext', {
+      on: this._events,
+      attrs: {
+        value: convertVNodeChildren(this.$options._renderChildren || [])
+      }
+    })
+  }
+}
+
+/*  */
+
+// Provides transition support for a single element/component.
+// supports transition mode (out-in / in-out)
+
+var transitionProps = {
+  name: String,
+  appear: Boolean,
+  css: Boolean,
+  mode: String,
+  type: String,
+  enterClass: String,
+  leaveClass: String,
+  enterToClass: String,
+  leaveToClass: String,
+  enterActiveClass: String,
+  leaveActiveClass: String,
+  appearClass: String,
+  appearActiveClass: String,
+  appearToClass: String,
+  duration: [Number, String, Object]
+};
+
+// in case the child is also an abstract component, e.g. <keep-alive>
+// we want to recursively retrieve the real component to be rendered
+function getRealChild (vnode) {
+  var compOptions = vnode && vnode.componentOptions;
+  if (compOptions && compOptions.Ctor.options.abstract) {
+    return getRealChild(getFirstComponentChild(compOptions.children))
+  } else {
+    return vnode
+  }
+}
+
+function extractTransitionData (comp) {
+  var data = {};
+  var options = comp.$options;
+  // props
+  for (var key in options.propsData) {
+    data[key] = comp[key];
+  }
+  // events.
+  // extract listeners and pass them directly to the transition methods
+  var listeners = options._parentListeners;
+  for (var key$1 in listeners) {
+    data[camelize(key$1)] = listeners[key$1];
+  }
+  return data
+}
+
+function placeholder (h, rawChild) {
+  if (/\d-keep-alive$/.test(rawChild.tag)) {
+    return h('keep-alive', {
+      props: rawChild.componentOptions.propsData
+    })
+  }
+}
+
+function hasParentTransition (vnode) {
+  while ((vnode = vnode.parent)) {
+    if (vnode.data.transition) {
+      return true
+    }
+  }
+}
+
+function isSameChild (child, oldChild) {
+  return oldChild.key === child.key && oldChild.tag === child.tag
+}
+
+var Transition = {
+  name: 'transition',
+  props: transitionProps,
+  abstract: true,
+
+  render: function render (h) {
+    var this$1 = this;
+
+    var children = this.$slots.default;
+    if (!children) {
+      return
+    }
+
+    // filter out text nodes (possible whitespaces)
+    children = children.filter(function (c) { return c.tag || isAsyncPlaceholder(c); });
+    /* istanbul ignore if */
+    if (!children.length) {
+      return
+    }
+
+    // warn multiple elements
+    if (process.env.NODE_ENV !== 'production' && children.length > 1) {
+      warn(
+        '<transition> can only be used on a single element. Use ' +
+        '<transition-group> for lists.',
+        this.$parent
+      );
+    }
+
+    var mode = this.mode;
+
+    // warn invalid mode
+    if (process.env.NODE_ENV !== 'production' &&
+      mode && mode !== 'in-out' && mode !== 'out-in'
+    ) {
+      warn(
+        'invalid <transition> mode: ' + mode,
+        this.$parent
+      );
+    }
+
+    var rawChild = children[0];
+
+    // if this is a component root node and the component's
+    // parent container node also has transition, skip.
+    if (hasParentTransition(this.$vnode)) {
+      return rawChild
+    }
+
+    // apply transition data to child
+    // use getRealChild() to ignore abstract components e.g. keep-alive
+    var child = getRealChild(rawChild);
+    /* istanbul ignore if */
+    if (!child) {
+      return rawChild
+    }
+
+    if (this._leaving) {
+      return placeholder(h, rawChild)
+    }
+
+    // ensure a key that is unique to the vnode type and to this transition
+    // component instance. This key will be used to remove pending leaving nodes
+    // during entering.
+    var id = "__transition-" + (this._uid) + "-";
+    child.key = child.key == null
+      ? child.isComment
+        ? id + 'comment'
+        : id + child.tag
+      : isPrimitive(child.key)
+        ? (String(child.key).indexOf(id) === 0 ? child.key : id + child.key)
+        : child.key;
+
+    var data = (child.data || (child.data = {})).transition = extractTransitionData(this);
+    var oldRawChild = this._vnode;
+    var oldChild = getRealChild(oldRawChild);
+
+    // mark v-show
+    // so that the transition module can hand over the control to the directive
+    if (child.data.directives && child.data.directives.some(function (d) { return d.name === 'show'; })) {
+      child.data.show = true;
+    }
+
+    if (
+      oldChild &&
+      oldChild.data &&
+      !isSameChild(child, oldChild) &&
+      !isAsyncPlaceholder(oldChild) &&
+      // #6687 component root is a comment node
+      !(oldChild.componentInstance && oldChild.componentInstance._vnode.isComment)
+    ) {
+      // replace old child transition data with fresh one
+      // important for dynamic transitions!
+      var oldData = oldChild.data.transition = extend({}, data);
+      // handle transition mode
+      if (mode === 'out-in') {
+        // return placeholder node and queue update when leave finishes
+        this._leaving = true;
+        mergeVNodeHook(oldData, 'afterLeave', function () {
+          this$1._leaving = false;
+          this$1.$forceUpdate();
+        });
+        return placeholder(h, rawChild)
+      } else if (mode === 'in-out') {
+        if (isAsyncPlaceholder(child)) {
+          return oldRawChild
+        }
+        var delayedLeave;
+        var performLeave = function () { delayedLeave(); };
+        mergeVNodeHook(data, 'afterEnter', performLeave);
+        mergeVNodeHook(data, 'enterCancelled', performLeave);
+        mergeVNodeHook(oldData, 'delayLeave', function (leave) { delayedLeave = leave; });
+      }
+    }
+
+    return rawChild
+  }
+}
+
+// reuse same transition component logic from web
+
+var props = extend({
+  tag: String,
+  moveClass: String
+}, transitionProps);
+
+delete props.mode;
+
+var TransitionGroup = {
+  props: props,
+
+  created: function created () {
+    var dom = this.$requireWeexModule('dom');
+    this.getPosition = function (el) { return new Promise(function (resolve, reject) {
+      dom.getComponentRect(el.ref, function (res) {
+        if (!res.result) {
+          reject(new Error(("failed to get rect for element: " + (el.tag))));
+        } else {
+          resolve(res.size);
+        }
+      });
+    }); };
+
+    var animation = this.$requireWeexModule('animation');
+    this.animate = function (el, options) { return new Promise(function (resolve) {
+      animation.transition(el.ref, options, resolve);
+    }); };
+  },
+
+  render: function render (h) {
+    var tag = this.tag || this.$vnode.data.tag || 'span';
+    var map = Object.create(null);
+    var prevChildren = this.prevChildren = this.children;
+    var rawChildren = this.$slots.default || [];
+    var children = this.children = [];
+    var transitionData = extractTransitionData(this);
+
+    for (var i = 0; i < rawChildren.length; i++) {
+      var c = rawChildren[i];
+      if (c.tag) {
+        if (c.key != null && String(c.key).indexOf('__vlist') !== 0) {
+          children.push(c);
+          map[c.key] = c
+          ;(c.data || (c.data = {})).transition = transitionData;
+        } else if (process.env.NODE_ENV !== 'production') {
+          var opts = c.componentOptions;
+          var name = opts
+            ? (opts.Ctor.options.name || opts.tag)
+            : c.tag;
+          warn(("<transition-group> children must be keyed: <" + name + ">"));
+        }
+      }
+    }
+
+    if (prevChildren) {
+      var kept = [];
+      var removed = [];
+      prevChildren.forEach(function (c) {
+        c.data.transition = transitionData;
+
+        // TODO: record before patch positions
+
+        if (map[c.key]) {
+          kept.push(c);
+        } else {
+          removed.push(c);
+        }
+      });
+      this.kept = h(tag, null, kept);
+      this.removed = removed;
+    }
+
+    return h(tag, null, children)
+  },
+
+  beforeUpdate: function beforeUpdate () {
+    // force removing pass
+    this.__patch__(
+      this._vnode,
+      this.kept,
+      false, // hydrating
+      true // removeOnly (!important, avoids unnecessary moves)
+    );
+    this._vnode = this.kept;
+  },
+
+  updated: function updated () {
+    var children = this.prevChildren;
+    var moveClass = this.moveClass || ((this.name || 'v') + '-move');
+    var moveData = children.length && this.getMoveData(children[0].context, moveClass);
+    if (!moveData) {
+      return
+    }
+
+    // TODO: finish implementing move animations once
+    // we have access to sync getComponentRect()
+
+    // children.forEach(callPendingCbs)
+
+    // Promise.all(children.map(c => {
+    //   const oldPos = c.data.pos
+    //   const newPos = c.data.newPos
+    //   const dx = oldPos.left - newPos.left
+    //   const dy = oldPos.top - newPos.top
+    //   if (dx || dy) {
+    //     c.data.moved = true
+    //     return this.animate(c.elm, {
+    //       styles: {
+    //         transform: `translate(${dx}px,${dy}px)`
+    //       }
+    //     })
+    //   }
+    // })).then(() => {
+    //   children.forEach(c => {
+    //     if (c.data.moved) {
+    //       this.animate(c.elm, {
+    //         styles: {
+    //           transform: ''
+    //         },
+    //         duration: moveData.duration || 0,
+    //         delay: moveData.delay || 0,
+    //         timingFunction: moveData.timingFunction || 'linear'
+    //       })
+    //     }
+    //   })
+    // })
+  },
+
+  methods: {
+    getMoveData: function getMoveData (context, moveClass) {
+      var stylesheet = context.$options.style || {};
+      return stylesheet['@TRANSITION'] && stylesheet['@TRANSITION'][moveClass]
+    }
+  }
+}
+
+// function callPendingCbs (c) {
+//   /* istanbul ignore if */
+//   if (c.elm._moveCb) {
+//     c.elm._moveCb()
+//   }
+//   /* istanbul ignore if */
+//   if (c.elm._enterCb) {
+//     c.elm._enterCb()
+//   }
+// }
+
+var platformComponents = {
+  Richtext: Richtext,
+  Transition: Transition,
+  TransitionGroup: TransitionGroup
+}
+
+/*  */
+
+// These util functions are split into its own file because Rollup cannot drop
+// makeMap() due to potential side effects, so these variables end up
+// bloating the web builds.
+
+var isReservedTag$1 = makeMap(
+  'template,script,style,element,content,slot,link,meta,svg,view,' +
+  'a,div,img,image,text,span,input,switch,textarea,spinner,select,' +
+  'slider,slider-neighbor,indicator,canvas,' +
+  'list,cell,header,loading,loading-indicator,refresh,scrollable,scroller,' +
+  'video,web,embed,tabbar,tabheader,datepicker,timepicker,marquee,countdown',
+  true
+);
+
+// Elements that you can, intentionally, leave open (and which close themselves)
+// more flexible than web
+var canBeLeftOpenTag = makeMap(
+  'web,spinner,switch,video,textarea,canvas,' +
+  'indicator,marquee,countdown',
+  true
+);
+
+var isRuntimeComponent = makeMap(
+  'richtext,transition,transition-group',
+  true
+);
+
+var isUnaryTag = makeMap(
+  'embed,img,image,input,link,meta',
+  true
+);
+
+function mustUseProp (tag, type, name) {
+  return false
+}
+
+
+
+function isUnknownElement$1 (tag) {
+  return false
+}
+
+function query (el, document) {
+  // document is injected by weex factory wrapper
+  var placeholder = document.createComment('root');
+  placeholder.hasAttribute = placeholder.removeAttribute = function () {}; // hack for patch
+  document.documentElement.appendChild(placeholder);
+  return placeholder
+}
+
+/*  */
+
+// install platform specific utils
+Vue.config.mustUseProp = mustUseProp;
+Vue.config.isReservedTag = isReservedTag$1;
+Vue.config.isRuntimeComponent = isRuntimeComponent;
+Vue.config.isUnknownElement = isUnknownElement$1;
+
+// install platform runtime directives and components
+Vue.options.directives = platformDirectives;
+Vue.options.components = platformComponents;
+
+// install platform patch function
+Vue.prototype.__patch__ = patch;
+
+// wrap mount
+Vue.prototype.$mount = function (
+  el,
+  hydrating
+) {
+  return mountComponent(
+    this,
+    el && query(el, this.$document),
+    hydrating
+  )
+};
+
+// this entry is built and wrapped with a factory function
+// used to generate a fresh copy of Vue for every Weex instance.
+
+exports.Vue = Vue;
+
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/packages/weex-vue-framework/index.js b/advancedcontentfilter/vendor/asset/vue/packages/weex-vue-framework/index.js
new file mode 100644 (file)
index 0000000..487c97b
--- /dev/null
@@ -0,0 +1,203 @@
+'use strict';
+
+Object.defineProperty(exports, '__esModule', { value: true });
+
+/*  */
+
+// this will be preserved during build
+// $flow-disable-line
+var VueFactory = require('./factory');
+
+var instanceOptions = {};
+
+/**
+ * Create instance context.
+ */
+function createInstanceContext (
+  instanceId,
+  runtimeContext,
+  data
+) {
+  if ( data === void 0 ) data = {};
+
+  var weex = runtimeContext.weex;
+  var instance = instanceOptions[instanceId] = {
+    instanceId: instanceId,
+    config: weex.config,
+    document: weex.document,
+    data: data
+  };
+
+  // Each instance has a independent `Vue` module instance
+  var Vue = instance.Vue = createVueModuleInstance(instanceId, weex);
+
+  // DEPRECATED
+  var timerAPIs = getInstanceTimer(instanceId, weex.requireModule);
+
+  var instanceContext = Object.assign({ Vue: Vue }, timerAPIs);
+  Object.freeze(instanceContext);
+  return instanceContext
+}
+
+/**
+ * Destroy an instance with id. It will make sure all memory of
+ * this instance released and no more leaks.
+ */
+function destroyInstance (instanceId) {
+  var instance = instanceOptions[instanceId];
+  if (instance && instance.app instanceof instance.Vue) {
+    try {
+      instance.app.$destroy();
+      instance.document.destroy();
+    } catch (e) {}
+    delete instance.document;
+    delete instance.app;
+  }
+  delete instanceOptions[instanceId];
+}
+
+/**
+ * Refresh an instance with id and new top-level component data.
+ * It will use `Vue.set` on all keys of the new data. So it's better
+ * define all possible meaningful keys when instance created.
+ */
+function refreshInstance (
+  instanceId,
+  data
+) {
+  var instance = instanceOptions[instanceId];
+  if (!instance || !(instance.app instanceof instance.Vue)) {
+    return new Error(("refreshInstance: instance " + instanceId + " not found!"))
+  }
+  if (instance.Vue && instance.Vue.set) {
+    for (var key in data) {
+      instance.Vue.set(instance.app, key, data[key]);
+    }
+  }
+  // Finally `refreshFinish` signal needed.
+  instance.document.taskCenter.send('dom', { action: 'refreshFinish' }, []);
+}
+
+/**
+ * Create a fresh instance of Vue for each Weex instance.
+ */
+function createVueModuleInstance (
+  instanceId,
+  weex
+) {
+  var exports = {};
+  VueFactory(exports, weex.document);
+  var Vue = exports.Vue;
+
+  var instance = instanceOptions[instanceId];
+
+  // patch reserved tag detection to account for dynamically registered
+  // components
+  var weexRegex = /^weex:/i;
+  var isReservedTag = Vue.config.isReservedTag || (function () { return false; });
+  var isRuntimeComponent = Vue.config.isRuntimeComponent || (function () { return false; });
+  Vue.config.isReservedTag = function (name) {
+    return (!isRuntimeComponent(name) && weex.supports(("@component/" + name))) ||
+      isReservedTag(name) ||
+      weexRegex.test(name)
+  };
+  Vue.config.parsePlatformTagName = function (name) { return name.replace(weexRegex, ''); };
+
+  // expose weex-specific info
+  Vue.prototype.$instanceId = instanceId;
+  Vue.prototype.$document = instance.document;
+
+  // expose weex native module getter on subVue prototype so that
+  // vdom runtime modules can access native modules via vnode.context
+  Vue.prototype.$requireWeexModule = weex.requireModule;
+
+  // Hack `Vue` behavior to handle instance information and data
+  // before root component created.
+  Vue.mixin({
+    beforeCreate: function beforeCreate () {
+      var options = this.$options;
+      // root component (vm)
+      if (options.el) {
+        // set external data of instance
+        var dataOption = options.data;
+        var internalData = (typeof dataOption === 'function' ? dataOption() : dataOption) || {};
+        options.data = Object.assign(internalData, instance.data);
+        // record instance by id
+        instance.app = this;
+      }
+    },
+    mounted: function mounted () {
+      var options = this.$options;
+      // root component (vm)
+      if (options.el && weex.document && instance.app === this) {
+        try {
+          // Send "createFinish" signal to native.
+          weex.document.taskCenter.send('dom', { action: 'createFinish' }, []);
+        } catch (e) {}
+      }
+    }
+  });
+
+  /**
+   * @deprecated Just instance variable `weex.config`
+   * Get instance config.
+   * @return {object}
+   */
+  Vue.prototype.$getConfig = function () {
+    if (instance.app instanceof Vue) {
+      return instance.config
+    }
+  };
+
+  return Vue
+}
+
+/**
+ * DEPRECATED
+ * Generate HTML5 Timer APIs. An important point is that the callback
+ * will be converted into callback id when sent to native. So the
+ * framework can make sure no side effect of the callback happened after
+ * an instance destroyed.
+ */
+function getInstanceTimer (
+  instanceId,
+  moduleGetter
+) {
+  var instance = instanceOptions[instanceId];
+  var timer = moduleGetter('timer');
+  var timerAPIs = {
+    setTimeout: function () {
+      var args = [], len = arguments.length;
+      while ( len-- ) args[ len ] = arguments[ len ];
+
+      var handler = function () {
+        args[0].apply(args, args.slice(2));
+      };
+
+      timer.setTimeout(handler, args[1]);
+      return instance.document.taskCenter.callbackManager.lastCallbackId.toString()
+    },
+    setInterval: function () {
+      var args = [], len = arguments.length;
+      while ( len-- ) args[ len ] = arguments[ len ];
+
+      var handler = function () {
+        args[0].apply(args, args.slice(2));
+      };
+
+      timer.setInterval(handler, args[1]);
+      return instance.document.taskCenter.callbackManager.lastCallbackId.toString()
+    },
+    clearTimeout: function (n) {
+      timer.clearTimeout(n);
+    },
+    clearInterval: function (n) {
+      timer.clearInterval(n);
+    }
+  };
+  return timerAPIs
+}
+
+exports.createInstanceContext = createInstanceContext;
+exports.destroyInstance = destroyInstance;
+exports.refreshInstance = refreshInstance;
diff --git a/advancedcontentfilter/vendor/asset/vue/packages/weex-vue-framework/package.json b/advancedcontentfilter/vendor/asset/vue/packages/weex-vue-framework/package.json
new file mode 100644 (file)
index 0000000..71bd1d6
--- /dev/null
@@ -0,0 +1,20 @@
+{
+  "name": "weex-vue-framework",
+  "version": "2.4.2-weex.1",
+  "description": "Vue 2.0 Framework for Weex",
+  "main": "index.js",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/vuejs/vue.git"
+  },
+  "keywords": [
+    "vue",
+    "compiler"
+  ],
+  "author": "Evan You",
+  "license": "MIT",
+  "bugs": {
+    "url": "https://github.com/vuejs/vue/issues"
+  },
+  "homepage": "https://github.com/vuejs/vue/tree/dev/packages/weex-vue-framework#readme"
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/scripts/alias.js b/advancedcontentfilter/vendor/asset/vue/scripts/alias.js
new file mode 100644 (file)
index 0000000..30a27b5
--- /dev/null
@@ -0,0 +1,15 @@
+const path = require('path')
+
+const resolve = p => path.resolve(__dirname, '../', p)
+
+module.exports = {
+  vue: resolve('src/platforms/web/entry-runtime-with-compiler'),
+  compiler: resolve('src/compiler'),
+  core: resolve('src/core'),
+  shared: resolve('src/shared'),
+  web: resolve('src/platforms/web'),
+  weex: resolve('src/platforms/weex'),
+  server: resolve('src/server'),
+  entries: resolve('src/entries'),
+  sfc: resolve('src/sfc')
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/scripts/build.js b/advancedcontentfilter/vendor/asset/vue/scripts/build.js
new file mode 100644 (file)
index 0000000..82d4c52
--- /dev/null
@@ -0,0 +1,97 @@
+const fs = require('fs')
+const path = require('path')
+const zlib = require('zlib')
+const rollup = require('rollup')
+const uglify = require('uglify-js')
+
+if (!fs.existsSync('dist')) {
+  fs.mkdirSync('dist')
+}
+
+let builds = require('./config').getAllBuilds()
+
+// filter builds via command line arg
+if (process.argv[2]) {
+  const filters = process.argv[2].split(',')
+  builds = builds.filter(b => {
+    return filters.some(f => b.output.file.indexOf(f) > -1 || b._name.indexOf(f) > -1)
+  })
+} else {
+  // filter out weex builds by default
+  builds = builds.filter(b => {
+    return b.output.file.indexOf('weex') === -1
+  })
+}
+
+build(builds)
+
+function build (builds) {
+  let built = 0
+  const total = builds.length
+  const next = () => {
+    buildEntry(builds[built]).then(() => {
+      built++
+      if (built < total) {
+        next()
+      }
+    }).catch(logError)
+  }
+
+  next()
+}
+
+function buildEntry (config) {
+  const output = config.output
+  const { file, banner } = output
+  const isProd = /min\.js$/.test(file)
+  return rollup.rollup(config)
+    .then(bundle => bundle.generate(output))
+    .then(({ code }) => {
+      if (isProd) {
+        var minified = (banner ? banner + '\n' : '') + uglify.minify(code, {
+          output: {
+            ascii_only: true
+          },
+          compress: {
+            pure_funcs: ['makeMap']
+          }
+        }).code
+        return write(file, minified, true)
+      } else {
+        return write(file, code)
+      }
+    })
+}
+
+function write (dest, code, zip) {
+  return new Promise((resolve, reject) => {
+    function report (extra) {
+      console.log(blue(path.relative(process.cwd(), dest)) + ' ' + getSize(code) + (extra || ''))
+      resolve()
+    }
+
+    fs.writeFile(dest, code, err => {
+      if (err) return reject(err)
+      if (zip) {
+        zlib.gzip(code, (err, zipped) => {
+          if (err) return reject(err)
+          report(' (gzipped: ' + getSize(zipped) + ')')
+        })
+      } else {
+        report()
+      }
+    })
+  })
+}
+
+function getSize (code) {
+  return (code.length / 1024).toFixed(2) + 'kb'
+}
+
+function logError (e) {
+  console.log(e)
+}
+
+function blue (str) {
+  return '\x1b[1m\x1b[34m' + str + '\x1b[39m\x1b[22m'
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/scripts/config.js b/advancedcontentfilter/vendor/asset/vue/scripts/config.js
new file mode 100644 (file)
index 0000000..4fe4055
--- /dev/null
@@ -0,0 +1,213 @@
+const path = require('path')
+const buble = require('rollup-plugin-buble')
+const alias = require('rollup-plugin-alias')
+const cjs = require('rollup-plugin-commonjs')
+const replace = require('rollup-plugin-replace')
+const node = require('rollup-plugin-node-resolve')
+const flow = require('rollup-plugin-flow-no-whitespace')
+const version = process.env.VERSION || require('../package.json').version
+const weexVersion = process.env.WEEX_VERSION || require('../packages/weex-vue-framework/package.json').version
+
+const banner =
+  '/*!\n' +
+  ' * Vue.js v' + version + '\n' +
+  ' * (c) 2014-' + new Date().getFullYear() + ' Evan You\n' +
+  ' * Released under the MIT License.\n' +
+  ' */'
+
+const weexFactoryPlugin = {
+  intro () {
+    return 'module.exports = function weexFactory (exports, document) {'
+  },
+  outro () {
+    return '}'
+  }
+}
+
+const aliases = require('./alias')
+const resolve = p => {
+  const base = p.split('/')[0]
+  if (aliases[base]) {
+    return path.resolve(aliases[base], p.slice(base.length + 1))
+  } else {
+    return path.resolve(__dirname, '../', p)
+  }
+}
+
+const builds = {
+  // Runtime only (CommonJS). Used by bundlers e.g. Webpack & Browserify
+  'web-runtime-cjs': {
+    entry: resolve('web/entry-runtime.js'),
+    dest: resolve('dist/vue.runtime.common.js'),
+    format: 'cjs',
+    banner
+  },
+  // Runtime+compiler CommonJS build (CommonJS)
+  'web-full-cjs': {
+    entry: resolve('web/entry-runtime-with-compiler.js'),
+    dest: resolve('dist/vue.common.js'),
+    format: 'cjs',
+    alias: { he: './entity-decoder' },
+    banner
+  },
+  // Runtime only (ES Modules). Used by bundlers that support ES Modules,
+  // e.g. Rollup & Webpack 2
+  'web-runtime-esm': {
+    entry: resolve('web/entry-runtime.js'),
+    dest: resolve('dist/vue.runtime.esm.js'),
+    format: 'es',
+    banner
+  },
+  // Runtime+compiler CommonJS build (ES Modules)
+  'web-full-esm': {
+    entry: resolve('web/entry-runtime-with-compiler.js'),
+    dest: resolve('dist/vue.esm.js'),
+    format: 'es',
+    alias: { he: './entity-decoder' },
+    banner
+  },
+  // runtime-only build (Browser)
+  'web-runtime-dev': {
+    entry: resolve('web/entry-runtime.js'),
+    dest: resolve('dist/vue.runtime.js'),
+    format: 'umd',
+    env: 'development',
+    banner
+  },
+  // runtime-only production build (Browser)
+  'web-runtime-prod': {
+    entry: resolve('web/entry-runtime.js'),
+    dest: resolve('dist/vue.runtime.min.js'),
+    format: 'umd',
+    env: 'production',
+    banner
+  },
+  // Runtime+compiler development build (Browser)
+  'web-full-dev': {
+    entry: resolve('web/entry-runtime-with-compiler.js'),
+    dest: resolve('dist/vue.js'),
+    format: 'umd',
+    env: 'development',
+    alias: { he: './entity-decoder' },
+    banner
+  },
+  // Runtime+compiler production build  (Browser)
+  'web-full-prod': {
+    entry: resolve('web/entry-runtime-with-compiler.js'),
+    dest: resolve('dist/vue.min.js'),
+    format: 'umd',
+    env: 'production',
+    alias: { he: './entity-decoder' },
+    banner
+  },
+  // Web compiler (CommonJS).
+  'web-compiler': {
+    entry: resolve('web/entry-compiler.js'),
+    dest: resolve('packages/vue-template-compiler/build.js'),
+    format: 'cjs',
+    external: Object.keys(require('../packages/vue-template-compiler/package.json').dependencies)
+  },
+  // Web compiler (UMD for in-browser use).
+  'web-compiler-browser': {
+    entry: resolve('web/entry-compiler.js'),
+    dest: resolve('packages/vue-template-compiler/browser.js'),
+    format: 'umd',
+    env: 'development',
+    moduleName: 'VueTemplateCompiler',
+    plugins: [node(), cjs()]
+  },
+  // Web server renderer (CommonJS).
+  'web-server-renderer': {
+    entry: resolve('web/entry-server-renderer.js'),
+    dest: resolve('packages/vue-server-renderer/build.js'),
+    format: 'cjs',
+    external: Object.keys(require('../packages/vue-server-renderer/package.json').dependencies)
+  },
+  'web-server-renderer-basic': {
+    entry: resolve('web/entry-server-basic-renderer.js'),
+    dest: resolve('packages/vue-server-renderer/basic.js'),
+    format: 'umd',
+    env: 'development',
+    moduleName: 'renderVueComponentToString',
+    plugins: [node(), cjs()]
+  },
+  'web-server-renderer-webpack-server-plugin': {
+    entry: resolve('server/webpack-plugin/server.js'),
+    dest: resolve('packages/vue-server-renderer/server-plugin.js'),
+    format: 'cjs',
+    external: Object.keys(require('../packages/vue-server-renderer/package.json').dependencies)
+  },
+  'web-server-renderer-webpack-client-plugin': {
+    entry: resolve('server/webpack-plugin/client.js'),
+    dest: resolve('packages/vue-server-renderer/client-plugin.js'),
+    format: 'cjs',
+    external: Object.keys(require('../packages/vue-server-renderer/package.json').dependencies)
+  },
+  // Weex runtime factory
+  'weex-factory': {
+    weex: true,
+    entry: resolve('weex/entry-runtime-factory.js'),
+    dest: resolve('packages/weex-vue-framework/factory.js'),
+    format: 'cjs',
+    plugins: [weexFactoryPlugin]
+  },
+  // Weex runtime framework (CommonJS).
+  'weex-framework': {
+    weex: true,
+    entry: resolve('weex/entry-framework.js'),
+    dest: resolve('packages/weex-vue-framework/index.js'),
+    format: 'cjs'
+  },
+  // Weex compiler (CommonJS). Used by Weex's Webpack loader.
+  'weex-compiler': {
+    weex: true,
+    entry: resolve('weex/entry-compiler.js'),
+    dest: resolve('packages/weex-template-compiler/build.js'),
+    format: 'cjs',
+    external: Object.keys(require('../packages/weex-template-compiler/package.json').dependencies)
+  }
+}
+
+function genConfig (name) {
+  const opts = builds[name]
+  const config = {
+    input: opts.entry,
+    external: opts.external,
+    plugins: [
+      replace({
+        __WEEX__: !!opts.weex,
+        __WEEX_VERSION__: weexVersion,
+        __VERSION__: version
+      }),
+      flow(),
+      buble(),
+      alias(Object.assign({}, aliases, opts.alias))
+    ].concat(opts.plugins || []),
+    output: {
+      file: opts.dest,
+      format: opts.format,
+      banner: opts.banner,
+      name: opts.moduleName || 'Vue'
+    }
+  }
+
+  if (opts.env) {
+    config.plugins.push(replace({
+      'process.env.NODE_ENV': JSON.stringify(opts.env)
+    }))
+  }
+
+  Object.defineProperty(config, '_name', {
+    enumerable: false,
+    value: name
+  })
+
+  return config
+}
+
+if (process.env.TARGET) {
+  module.exports = genConfig(process.env.TARGET)
+} else {
+  exports.getBuild = genConfig
+  exports.getAllBuilds = () => Object.keys(builds).map(genConfig)
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/scripts/gen-release-note.js b/advancedcontentfilter/vendor/asset/vue/scripts/gen-release-note.js
new file mode 100644 (file)
index 0000000..4845c31
--- /dev/null
@@ -0,0 +1,16 @@
+const version = process.argv[2] || process.env.VERSION
+const cc = require('conventional-changelog')
+const file = `./RELEASE_NOTE${version ? `_${version}` : ``}.md`
+const fileStream = require('fs').createWriteStream(file)
+
+cc({
+  preset: 'angular',
+  pkg: {
+    transform (pkg) {
+      pkg.version = `v${version}`
+      return pkg
+    }
+  }
+}).pipe(fileStream).on('close', () => {
+  console.log(`Generated release note at ${file}`)
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/scripts/get-weex-version.js b/advancedcontentfilter/vendor/asset/vue/scripts/get-weex-version.js
new file mode 100644 (file)
index 0000000..d701c43
--- /dev/null
@@ -0,0 +1,24 @@
+var coreVersion = require('../package.json').version
+var weexVersion = require('../packages/weex-vue-framework/package.json').version
+var weexBaseVersion = weexVersion.match(/^[\d.]+/)[0]
+var weexSubVersion = Number(weexVersion.match(/-weex\.(\d+)$/)[1])
+
+if (weexBaseVersion === coreVersion) {
+  // same core version, increment sub version
+  weexSubVersion++
+} else {
+  // new core version, reset sub version
+  weexBaseVersion = coreVersion
+  weexSubVersion = 1
+}
+
+if (process.argv[2] === '-c') {
+  console.log(weexVersion)
+} else {
+  console.log(weexBaseVersion + '-weex.' + weexSubVersion)
+}
+
+module.exports = {
+  base: weexBaseVersion,
+  sub: weexSubVersion
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/scripts/git-hooks/commit-msg b/advancedcontentfilter/vendor/asset/vue/scripts/git-hooks/commit-msg
new file mode 100644 (file)
index 0000000..d240e0b
--- /dev/null
@@ -0,0 +1,14 @@
+#!/usr/bin/env bash
+
+# Validate commit log
+commit_regex='^Merge.+|(feat|fix|docs|style|refactor|perf|test|build|ci|chore|revert|types)(\(.+\))?: .{1,50}'
+
+if ! grep -iqE "$commit_regex" "$1"; then
+    echo
+    echo "  Error: proper commit message format is required for automated changelog generation."
+    echo
+    echo "  - Use \`npm run commit\` to interactively generate a commit message."
+    echo "  - See .github/COMMIT_CONVENTION.md for more details."
+    echo
+    exit 1
+fi
diff --git a/advancedcontentfilter/vendor/asset/vue/scripts/git-hooks/pre-commit b/advancedcontentfilter/vendor/asset/vue/scripts/git-hooks/pre-commit
new file mode 100644 (file)
index 0000000..126d2ca
--- /dev/null
@@ -0,0 +1,7 @@
+#!/usr/bin/env bash
+
+files_to_lint=$(git diff --cached --name-only --diff-filter=ACM | grep '\.js$')
+
+if [ -n "$files_to_lint" ]; then
+  NODE_ENV=production eslint --quiet $files_to_lint
+fi
diff --git a/advancedcontentfilter/vendor/asset/vue/scripts/release-weex.sh b/advancedcontentfilter/vendor/asset/vue/scripts/release-weex.sh
new file mode 100644 (file)
index 0000000..3bb5412
--- /dev/null
@@ -0,0 +1,36 @@
+set -e
+CUR_VERSION=`node build/get-weex-version.js -c`
+NEXT_VERSION=`node build/get-weex-version.js`
+
+echo "Current: $CUR_VERSION"
+read -p "Enter new version ($NEXT_VERSION): " -n 1 -r
+if ! [[ -z $REPLY ]]; then
+  NEXT_VERSION=$REPLY
+fi
+
+read -p "Releasing weex-vue-framework@$NEXT_VERSION - are you sure? (y/n) " -n 1 -r
+echo
+if [[ $REPLY =~ ^[Yy]$ ]]; then
+  echo "Releasing weex-vue-framework@$NEXT_VERSION ..."
+  npm run lint
+  npm run flow
+  npm run test:weex
+
+  # build
+  WEEX_VERSION=$NEXT_VERSION npm run build:weex
+
+  # update package
+  cd packages/weex-vue-framework
+  npm version $NEXT_VERSION
+  npm publish
+  cd -
+
+  cd packages/weex-template-compiler
+  npm version $NEXT_VERSION
+  npm publish
+  cd -
+
+  # commit
+  git add packages/weex*
+  git commit -m "[release] weex-vue-framework@$NEXT_VERSION"
+fi
diff --git a/advancedcontentfilter/vendor/asset/vue/scripts/release.sh b/advancedcontentfilter/vendor/asset/vue/scripts/release.sh
new file mode 100644 (file)
index 0000000..6592fd4
--- /dev/null
@@ -0,0 +1,76 @@
+set -e
+
+if [[ -z $1 ]]; then
+  echo "Enter new version: "
+  read VERSION
+else
+  VERSION=$1
+fi
+
+read -p "Releasing $VERSION - are you sure? (y/n) " -n 1 -r
+echo
+if [[ $REPLY =~ ^[Yy]$ ]]; then
+  echo "Releasing $VERSION ..."
+
+  if [[ -z $SKIP_TESTS ]]; then
+    npm run lint
+    npm run flow
+    npm run test:cover
+    npm run test:e2e -- --env phantomjs
+    npm run test:ssr
+  fi
+
+  # Sauce Labs tests has a decent chance of failing
+  # so we usually manually run them before running the release script.
+
+  # if [[ -z $SKIP_SAUCE ]]; then
+  #   export SAUCE_BUILD_ID=$VERSION:`date +"%s"`
+  #   npm run test:sauce
+  # fi
+
+  # build
+  VERSION=$VERSION npm run build
+
+  # update packages
+  cd packages/vue-template-compiler
+  npm version $VERSION
+  if [[ -z $RELEASE_TAG ]]; then
+    npm publish
+  else
+    npm publish --tag $RELEASE_TAG
+  fi
+  cd -
+
+  cd packages/vue-server-renderer
+  npm version $VERSION
+  if [[ -z $RELEASE_TAG ]]; then
+    npm publish
+  else
+    npm publish --tag $RELEASE_TAG
+  fi
+  cd -
+
+  # commit
+  git add -A
+  git add -f \
+    dist/*.js \
+    packages/vue-server-renderer/basic.js \
+    packages/vue-server-renderer/build.js \
+    packages/vue-server-renderer/server-plugin.js \
+    packages/vue-server-renderer/client-plugin.js \
+    packages/vue-template-compiler/build.js
+  git commit -m "build: build $VERSION"
+  # generate release note
+  npm run release:note
+  # tag version
+  npm version $VERSION --message "build: release $VERSION"
+
+  # publish
+  git push origin refs/tags/v$VERSION
+  git push
+  if [[ -z $RELEASE_TAG ]]; then
+    npm publish
+  else
+    npm publish --tag $RELEASE_TAG
+  fi
+fi
diff --git a/advancedcontentfilter/vendor/asset/vue/scripts/verify-commit-msg.js b/advancedcontentfilter/vendor/asset/vue/scripts/verify-commit-msg.js
new file mode 100644 (file)
index 0000000..2a72e49
--- /dev/null
@@ -0,0 +1,18 @@
+const chalk = require('chalk')
+const msgPath = process.env.GIT_PARAMS
+const msg = require('fs').readFileSync(msgPath, 'utf-8').trim()
+
+const commitRE = /^(revert: )?(feat|fix|polish|docs|style|refactor|perf|test|workflow|ci|chore|types|build)(\(.+\))?: .{1,50}/
+
+if (!commitRE.test(msg)) {
+  console.log()
+  console.error(
+    `  ${chalk.bgRed.white(' ERROR ')} ${chalk.red(`invalid commit message format.`)}\n\n` +
+    chalk.red(`  Proper commit message format is required for automated changelog generation. Examples:\n\n`) +
+    `    ${chalk.green(`feat(compiler): add 'comments' option`)}\n` +
+    `    ${chalk.green(`fix(v-model): handle events on blur (close #28)`)}\n\n` +
+    chalk.red(`  See .github/COMMIT_CONVENTION.md for more details.\n`) +
+    chalk.red(`  You can also use ${chalk.cyan(`npm run commit`)} to interactively generate a commit message.\n`)
+  )
+  process.exit(1)
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/compiler/codegen/events.js b/advancedcontentfilter/vendor/asset/vue/src/compiler/codegen/events.js
new file mode 100644 (file)
index 0000000..4f92224
--- /dev/null
@@ -0,0 +1,167 @@
+/* @flow */
+
+const fnExpRE = /^([\w$_]+|\([^)]*?\))\s*=>|^function\s*\(/
+const simplePathRE = /^[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*|\['[^']*?']|\["[^"]*?"]|\[\d+]|\[[A-Za-z_$][\w$]*])*$/
+
+// KeyboardEvent.keyCode aliases
+const keyCodes: { [key: string]: number | Array<number> } = {
+  esc: 27,
+  tab: 9,
+  enter: 13,
+  space: 32,
+  up: 38,
+  left: 37,
+  right: 39,
+  down: 40,
+  'delete': [8, 46]
+}
+
+// KeyboardEvent.key aliases
+const keyNames: { [key: string]: string | Array<string> } = {
+  esc: 'Escape',
+  tab: 'Tab',
+  enter: 'Enter',
+  space: ' ',
+  // #7806: IE11 uses key names without `Arrow` prefix for arrow keys.
+  up: ['Up', 'ArrowUp'],
+  left: ['Left', 'ArrowLeft'],
+  right: ['Right', 'ArrowRight'],
+  down: ['Down', 'ArrowDown'],
+  'delete': ['Backspace', 'Delete']
+}
+
+// #4868: modifiers that prevent the execution of the listener
+// need to explicitly return null so that we can determine whether to remove
+// the listener for .once
+const genGuard = condition => `if(${condition})return null;`
+
+const modifierCode: { [key: string]: string } = {
+  stop: '$event.stopPropagation();',
+  prevent: '$event.preventDefault();',
+  self: genGuard(`$event.target !== $event.currentTarget`),
+  ctrl: genGuard(`!$event.ctrlKey`),
+  shift: genGuard(`!$event.shiftKey`),
+  alt: genGuard(`!$event.altKey`),
+  meta: genGuard(`!$event.metaKey`),
+  left: genGuard(`'button' in $event && $event.button !== 0`),
+  middle: genGuard(`'button' in $event && $event.button !== 1`),
+  right: genGuard(`'button' in $event && $event.button !== 2`)
+}
+
+export function genHandlers (
+  events: ASTElementHandlers,
+  isNative: boolean,
+  warn: Function
+): string {
+  let res = isNative ? 'nativeOn:{' : 'on:{'
+  for (const name in events) {
+    res += `"${name}":${genHandler(name, events[name])},`
+  }
+  return res.slice(0, -1) + '}'
+}
+
+// Generate handler code with binding params on Weex
+/* istanbul ignore next */
+function genWeexHandler (params: Array<any>, handlerCode: string) {
+  let innerHandlerCode = handlerCode
+  const exps = params.filter(exp => simplePathRE.test(exp) && exp !== '$event')
+  const bindings = exps.map(exp => ({ '@binding': exp }))
+  const args = exps.map((exp, i) => {
+    const key = `$_${i + 1}`
+    innerHandlerCode = innerHandlerCode.replace(exp, key)
+    return key
+  })
+  args.push('$event')
+  return '{\n' +
+    `handler:function(${args.join(',')}){${innerHandlerCode}},\n` +
+    `params:${JSON.stringify(bindings)}\n` +
+    '}'
+}
+
+function genHandler (
+  name: string,
+  handler: ASTElementHandler | Array<ASTElementHandler>
+): string {
+  if (!handler) {
+    return 'function(){}'
+  }
+
+  if (Array.isArray(handler)) {
+    return `[${handler.map(handler => genHandler(name, handler)).join(',')}]`
+  }
+
+  const isMethodPath = simplePathRE.test(handler.value)
+  const isFunctionExpression = fnExpRE.test(handler.value)
+
+  if (!handler.modifiers) {
+    if (isMethodPath || isFunctionExpression) {
+      return handler.value
+    }
+    /* istanbul ignore if */
+    if (__WEEX__ && handler.params) {
+      return genWeexHandler(handler.params, handler.value)
+    }
+    return `function($event){${handler.value}}` // inline statement
+  } else {
+    let code = ''
+    let genModifierCode = ''
+    const keys = []
+    for (const key in handler.modifiers) {
+      if (modifierCode[key]) {
+        genModifierCode += modifierCode[key]
+        // left/right
+        if (keyCodes[key]) {
+          keys.push(key)
+        }
+      } else if (key === 'exact') {
+        const modifiers: ASTModifiers = (handler.modifiers: any)
+        genModifierCode += genGuard(
+          ['ctrl', 'shift', 'alt', 'meta']
+            .filter(keyModifier => !modifiers[keyModifier])
+            .map(keyModifier => `$event.${keyModifier}Key`)
+            .join('||')
+        )
+      } else {
+        keys.push(key)
+      }
+    }
+    if (keys.length) {
+      code += genKeyFilter(keys)
+    }
+    // Make sure modifiers like prevent and stop get executed after key filtering
+    if (genModifierCode) {
+      code += genModifierCode
+    }
+    const handlerCode = isMethodPath
+      ? `return ${handler.value}($event)`
+      : isFunctionExpression
+        ? `return (${handler.value})($event)`
+        : handler.value
+    /* istanbul ignore if */
+    if (__WEEX__ && handler.params) {
+      return genWeexHandler(handler.params, code + handlerCode)
+    }
+    return `function($event){${code}${handlerCode}}`
+  }
+}
+
+function genKeyFilter (keys: Array<string>): string {
+  return `if(!('button' in $event)&&${keys.map(genFilterCode).join('&&')})return null;`
+}
+
+function genFilterCode (key: string): string {
+  const keyVal = parseInt(key, 10)
+  if (keyVal) {
+    return `$event.keyCode!==${keyVal}`
+  }
+  const keyCode = keyCodes[key]
+  const keyName = keyNames[key]
+  return (
+    `_k($event.keyCode,` +
+    `${JSON.stringify(key)},` +
+    `${JSON.stringify(keyCode)},` +
+    `$event.key,` +
+    `${JSON.stringify(keyName)}` +
+    `)`
+  )
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/compiler/codegen/index.js b/advancedcontentfilter/vendor/asset/vue/src/compiler/codegen/index.js
new file mode 100644 (file)
index 0000000..1c912c4
--- /dev/null
@@ -0,0 +1,513 @@
+/* @flow */
+
+import { genHandlers } from './events'
+import baseDirectives from '../directives/index'
+import { camelize, no, extend } from 'shared/util'
+import { baseWarn, pluckModuleFunction } from '../helpers'
+
+type TransformFunction = (el: ASTElement, code: string) => string;
+type DataGenFunction = (el: ASTElement) => string;
+type DirectiveFunction = (el: ASTElement, dir: ASTDirective, warn: Function) => boolean;
+
+export class CodegenState {
+  options: CompilerOptions;
+  warn: Function;
+  transforms: Array<TransformFunction>;
+  dataGenFns: Array<DataGenFunction>;
+  directives: { [key: string]: DirectiveFunction };
+  maybeComponent: (el: ASTElement) => boolean;
+  onceId: number;
+  staticRenderFns: Array<string>;
+
+  constructor (options: CompilerOptions) {
+    this.options = options
+    this.warn = options.warn || baseWarn
+    this.transforms = pluckModuleFunction(options.modules, 'transformCode')
+    this.dataGenFns = pluckModuleFunction(options.modules, 'genData')
+    this.directives = extend(extend({}, baseDirectives), options.directives)
+    const isReservedTag = options.isReservedTag || no
+    this.maybeComponent = (el: ASTElement) => !isReservedTag(el.tag)
+    this.onceId = 0
+    this.staticRenderFns = []
+  }
+}
+
+export type CodegenResult = {
+  render: string,
+  staticRenderFns: Array<string>
+};
+
+export function generate (
+  ast: ASTElement | void,
+  options: CompilerOptions
+): CodegenResult {
+  const state = new CodegenState(options)
+  const code = ast ? genElement(ast, state) : '_c("div")'
+  return {
+    render: `with(this){return ${code}}`,
+    staticRenderFns: state.staticRenderFns
+  }
+}
+
+export function genElement (el: ASTElement, state: CodegenState): string {
+  if (el.staticRoot && !el.staticProcessed) {
+    return genStatic(el, state)
+  } else if (el.once && !el.onceProcessed) {
+    return genOnce(el, state)
+  } else if (el.for && !el.forProcessed) {
+    return genFor(el, state)
+  } else if (el.if && !el.ifProcessed) {
+    return genIf(el, state)
+  } else if (el.tag === 'template' && !el.slotTarget) {
+    return genChildren(el, state) || 'void 0'
+  } else if (el.tag === 'slot') {
+    return genSlot(el, state)
+  } else {
+    // component or element
+    let code
+    if (el.component) {
+      code = genComponent(el.component, el, state)
+    } else {
+      const data = el.plain ? undefined : genData(el, state)
+
+      const children = el.inlineTemplate ? null : genChildren(el, state, true)
+      code = `_c('${el.tag}'${
+        data ? `,${data}` : '' // data
+      }${
+        children ? `,${children}` : '' // children
+      })`
+    }
+    // module transforms
+    for (let i = 0; i < state.transforms.length; i++) {
+      code = state.transforms[i](el, code)
+    }
+    return code
+  }
+}
+
+// hoist static sub-trees out
+function genStatic (el: ASTElement, state: CodegenState): string {
+  el.staticProcessed = true
+  state.staticRenderFns.push(`with(this){return ${genElement(el, state)}}`)
+  return `_m(${
+    state.staticRenderFns.length - 1
+  }${
+    el.staticInFor ? ',true' : ''
+  })`
+}
+
+// v-once
+function genOnce (el: ASTElement, state: CodegenState): string {
+  el.onceProcessed = true
+  if (el.if && !el.ifProcessed) {
+    return genIf(el, state)
+  } else if (el.staticInFor) {
+    let key = ''
+    let parent = el.parent
+    while (parent) {
+      if (parent.for) {
+        key = parent.key
+        break
+      }
+      parent = parent.parent
+    }
+    if (!key) {
+      process.env.NODE_ENV !== 'production' && state.warn(
+        `v-once can only be used inside v-for that is keyed. `
+      )
+      return genElement(el, state)
+    }
+    return `_o(${genElement(el, state)},${state.onceId++},${key})`
+  } else {
+    return genStatic(el, state)
+  }
+}
+
+export function genIf (
+  el: any,
+  state: CodegenState,
+  altGen?: Function,
+  altEmpty?: string
+): string {
+  el.ifProcessed = true // avoid recursion
+  return genIfConditions(el.ifConditions.slice(), state, altGen, altEmpty)
+}
+
+function genIfConditions (
+  conditions: ASTIfConditions,
+  state: CodegenState,
+  altGen?: Function,
+  altEmpty?: string
+): string {
+  if (!conditions.length) {
+    return altEmpty || '_e()'
+  }
+
+  const condition = conditions.shift()
+  if (condition.exp) {
+    return `(${condition.exp})?${
+      genTernaryExp(condition.block)
+    }:${
+      genIfConditions(conditions, state, altGen, altEmpty)
+    }`
+  } else {
+    return `${genTernaryExp(condition.block)}`
+  }
+
+  // v-if with v-once should generate code like (a)?_m(0):_m(1)
+  function genTernaryExp (el) {
+    return altGen
+      ? altGen(el, state)
+      : el.once
+        ? genOnce(el, state)
+        : genElement(el, state)
+  }
+}
+
+export function genFor (
+  el: any,
+  state: CodegenState,
+  altGen?: Function,
+  altHelper?: string
+): string {
+  const exp = el.for
+  const alias = el.alias
+  const iterator1 = el.iterator1 ? `,${el.iterator1}` : ''
+  const iterator2 = el.iterator2 ? `,${el.iterator2}` : ''
+
+  if (process.env.NODE_ENV !== 'production' &&
+    state.maybeComponent(el) &&
+    el.tag !== 'slot' &&
+    el.tag !== 'template' &&
+    !el.key
+  ) {
+    state.warn(
+      `<${el.tag} v-for="${alias} in ${exp}">: component lists rendered with ` +
+      `v-for should have explicit keys. ` +
+      `See https://vuejs.org/guide/list.html#key for more info.`,
+      true /* tip */
+    )
+  }
+
+  el.forProcessed = true // avoid recursion
+  return `${altHelper || '_l'}((${exp}),` +
+    `function(${alias}${iterator1}${iterator2}){` +
+      `return ${(altGen || genElement)(el, state)}` +
+    '})'
+}
+
+export function genData (el: ASTElement, state: CodegenState): string {
+  let data = '{'
+
+  // directives first.
+  // directives may mutate the el's other properties before they are generated.
+  const dirs = genDirectives(el, state)
+  if (dirs) data += dirs + ','
+
+  // key
+  if (el.key) {
+    data += `key:${el.key},`
+  }
+  // ref
+  if (el.ref) {
+    data += `ref:${el.ref},`
+  }
+  if (el.refInFor) {
+    data += `refInFor:true,`
+  }
+  // pre
+  if (el.pre) {
+    data += `pre:true,`
+  }
+  // record original tag name for components using "is" attribute
+  if (el.component) {
+    data += `tag:"${el.tag}",`
+  }
+  // module data generation functions
+  for (let i = 0; i < state.dataGenFns.length; i++) {
+    data += state.dataGenFns[i](el)
+  }
+  // attributes
+  if (el.attrs) {
+    data += `attrs:{${genProps(el.attrs)}},`
+  }
+  // DOM props
+  if (el.props) {
+    data += `domProps:{${genProps(el.props)}},`
+  }
+  // event handlers
+  if (el.events) {
+    data += `${genHandlers(el.events, false, state.warn)},`
+  }
+  if (el.nativeEvents) {
+    data += `${genHandlers(el.nativeEvents, true, state.warn)},`
+  }
+  // slot target
+  // only for non-scoped slots
+  if (el.slotTarget && !el.slotScope) {
+    data += `slot:${el.slotTarget},`
+  }
+  // scoped slots
+  if (el.scopedSlots) {
+    data += `${genScopedSlots(el.scopedSlots, state)},`
+  }
+  // component v-model
+  if (el.model) {
+    data += `model:{value:${
+      el.model.value
+    },callback:${
+      el.model.callback
+    },expression:${
+      el.model.expression
+    }},`
+  }
+  // inline-template
+  if (el.inlineTemplate) {
+    const inlineTemplate = genInlineTemplate(el, state)
+    if (inlineTemplate) {
+      data += `${inlineTemplate},`
+    }
+  }
+  data = data.replace(/,$/, '') + '}'
+  // v-bind data wrap
+  if (el.wrapData) {
+    data = el.wrapData(data)
+  }
+  // v-on data wrap
+  if (el.wrapListeners) {
+    data = el.wrapListeners(data)
+  }
+  return data
+}
+
+function genDirectives (el: ASTElement, state: CodegenState): string | void {
+  const dirs = el.directives
+  if (!dirs) return
+  let res = 'directives:['
+  let hasRuntime = false
+  let i, l, dir, needRuntime
+  for (i = 0, l = dirs.length; i < l; i++) {
+    dir = dirs[i]
+    needRuntime = true
+    const gen: DirectiveFunction = state.directives[dir.name]
+    if (gen) {
+      // compile-time directive that manipulates AST.
+      // returns true if it also needs a runtime counterpart.
+      needRuntime = !!gen(el, dir, state.warn)
+    }
+    if (needRuntime) {
+      hasRuntime = true
+      res += `{name:"${dir.name}",rawName:"${dir.rawName}"${
+        dir.value ? `,value:(${dir.value}),expression:${JSON.stringify(dir.value)}` : ''
+      }${
+        dir.arg ? `,arg:"${dir.arg}"` : ''
+      }${
+        dir.modifiers ? `,modifiers:${JSON.stringify(dir.modifiers)}` : ''
+      }},`
+    }
+  }
+  if (hasRuntime) {
+    return res.slice(0, -1) + ']'
+  }
+}
+
+function genInlineTemplate (el: ASTElement, state: CodegenState): ?string {
+  const ast = el.children[0]
+  if (process.env.NODE_ENV !== 'production' && (
+    el.children.length !== 1 || ast.type !== 1
+  )) {
+    state.warn('Inline-template components must have exactly one child element.')
+  }
+  if (ast.type === 1) {
+    const inlineRenderFns = generate(ast, state.options)
+    return `inlineTemplate:{render:function(){${
+      inlineRenderFns.render
+    }},staticRenderFns:[${
+      inlineRenderFns.staticRenderFns.map(code => `function(){${code}}`).join(',')
+    }]}`
+  }
+}
+
+function genScopedSlots (
+  slots: { [key: string]: ASTElement },
+  state: CodegenState
+): string {
+  return `scopedSlots:_u([${
+    Object.keys(slots).map(key => {
+      return genScopedSlot(key, slots[key], state)
+    }).join(',')
+  }])`
+}
+
+function genScopedSlot (
+  key: string,
+  el: ASTElement,
+  state: CodegenState
+): string {
+  if (el.for && !el.forProcessed) {
+    return genForScopedSlot(key, el, state)
+  }
+  const fn = `function(${String(el.slotScope)}){` +
+    `return ${el.tag === 'template'
+      ? el.if
+        ? `${el.if}?${genChildren(el, state) || 'undefined'}:undefined`
+        : genChildren(el, state) || 'undefined'
+      : genElement(el, state)
+    }}`
+  return `{key:${key},fn:${fn}}`
+}
+
+function genForScopedSlot (
+  key: string,
+  el: any,
+  state: CodegenState
+): string {
+  const exp = el.for
+  const alias = el.alias
+  const iterator1 = el.iterator1 ? `,${el.iterator1}` : ''
+  const iterator2 = el.iterator2 ? `,${el.iterator2}` : ''
+  el.forProcessed = true // avoid recursion
+  return `_l((${exp}),` +
+    `function(${alias}${iterator1}${iterator2}){` +
+      `return ${genScopedSlot(key, el, state)}` +
+    '})'
+}
+
+export function genChildren (
+  el: ASTElement,
+  state: CodegenState,
+  checkSkip?: boolean,
+  altGenElement?: Function,
+  altGenNode?: Function
+): string | void {
+  const children = el.children
+  if (children.length) {
+    const el: any = children[0]
+    // optimize single v-for
+    if (children.length === 1 &&
+      el.for &&
+      el.tag !== 'template' &&
+      el.tag !== 'slot'
+    ) {
+      return (altGenElement || genElement)(el, state)
+    }
+    const normalizationType = checkSkip
+      ? getNormalizationType(children, state.maybeComponent)
+      : 0
+    const gen = altGenNode || genNode
+    return `[${children.map(c => gen(c, state)).join(',')}]${
+      normalizationType ? `,${normalizationType}` : ''
+    }`
+  }
+}
+
+// determine the normalization needed for the children array.
+// 0: no normalization needed
+// 1: simple normalization needed (possible 1-level deep nested array)
+// 2: full normalization needed
+function getNormalizationType (
+  children: Array<ASTNode>,
+  maybeComponent: (el: ASTElement) => boolean
+): number {
+  let res = 0
+  for (let i = 0; i < children.length; i++) {
+    const el: ASTNode = children[i]
+    if (el.type !== 1) {
+      continue
+    }
+    if (needsNormalization(el) ||
+        (el.ifConditions && el.ifConditions.some(c => needsNormalization(c.block)))) {
+      res = 2
+      break
+    }
+    if (maybeComponent(el) ||
+        (el.ifConditions && el.ifConditions.some(c => maybeComponent(c.block)))) {
+      res = 1
+    }
+  }
+  return res
+}
+
+function needsNormalization (el: ASTElement): boolean {
+  return el.for !== undefined || el.tag === 'template' || el.tag === 'slot'
+}
+
+function genNode (node: ASTNode, state: CodegenState): string {
+  if (node.type === 1) {
+    return genElement(node, state)
+  } if (node.type === 3 && node.isComment) {
+    return genComment(node)
+  } else {
+    return genText(node)
+  }
+}
+
+export function genText (text: ASTText | ASTExpression): string {
+  return `_v(${text.type === 2
+    ? text.expression // no need for () because already wrapped in _s()
+    : transformSpecialNewlines(JSON.stringify(text.text))
+  })`
+}
+
+export function genComment (comment: ASTText): string {
+  return `_e(${JSON.stringify(comment.text)})`
+}
+
+function genSlot (el: ASTElement, state: CodegenState): string {
+  const slotName = el.slotName || '"default"'
+  const children = genChildren(el, state)
+  let res = `_t(${slotName}${children ? `,${children}` : ''}`
+  const attrs = el.attrs && `{${el.attrs.map(a => `${camelize(a.name)}:${a.value}`).join(',')}}`
+  const bind = el.attrsMap['v-bind']
+  if ((attrs || bind) && !children) {
+    res += `,null`
+  }
+  if (attrs) {
+    res += `,${attrs}`
+  }
+  if (bind) {
+    res += `${attrs ? '' : ',null'},${bind}`
+  }
+  return res + ')'
+}
+
+// componentName is el.component, take it as argument to shun flow's pessimistic refinement
+function genComponent (
+  componentName: string,
+  el: ASTElement,
+  state: CodegenState
+): string {
+  const children = el.inlineTemplate ? null : genChildren(el, state, true)
+  return `_c(${componentName},${genData(el, state)}${
+    children ? `,${children}` : ''
+  })`
+}
+
+function genProps (props: Array<{ name: string, value: any }>): string {
+  let res = ''
+  for (let i = 0; i < props.length; i++) {
+    const prop = props[i]
+    /* istanbul ignore if */
+    if (__WEEX__) {
+      res += `"${prop.name}":${generateValue(prop.value)},`
+    } else {
+      res += `"${prop.name}":${transformSpecialNewlines(prop.value)},`
+    }
+  }
+  return res.slice(0, -1)
+}
+
+/* istanbul ignore next */
+function generateValue (value) {
+  if (typeof value === 'string') {
+    return transformSpecialNewlines(value)
+  }
+  return JSON.stringify(value)
+}
+
+// #3895, #4268
+function transformSpecialNewlines (text: string): string {
+  return text
+    .replace(/\u2028/g, '\\u2028')
+    .replace(/\u2029/g, '\\u2029')
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/compiler/create-compiler.js b/advancedcontentfilter/vendor/asset/vue/src/compiler/create-compiler.js
new file mode 100644 (file)
index 0000000..6671dcf
--- /dev/null
@@ -0,0 +1,55 @@
+/* @flow */
+
+import { extend } from 'shared/util'
+import { detectErrors } from './error-detector'
+import { createCompileToFunctionFn } from './to-function'
+
+export function createCompilerCreator (baseCompile: Function): Function {
+  return function createCompiler (baseOptions: CompilerOptions) {
+    function compile (
+      template: string,
+      options?: CompilerOptions
+    ): CompiledResult {
+      const finalOptions = Object.create(baseOptions)
+      const errors = []
+      const tips = []
+      finalOptions.warn = (msg, tip) => {
+        (tip ? tips : errors).push(msg)
+      }
+
+      if (options) {
+        // merge custom modules
+        if (options.modules) {
+          finalOptions.modules =
+            (baseOptions.modules || []).concat(options.modules)
+        }
+        // merge custom directives
+        if (options.directives) {
+          finalOptions.directives = extend(
+            Object.create(baseOptions.directives || null),
+            options.directives
+          )
+        }
+        // copy other options
+        for (const key in options) {
+          if (key !== 'modules' && key !== 'directives') {
+            finalOptions[key] = options[key]
+          }
+        }
+      }
+
+      const compiled = baseCompile(template, finalOptions)
+      if (process.env.NODE_ENV !== 'production') {
+        errors.push.apply(errors, detectErrors(compiled.ast))
+      }
+      compiled.errors = errors
+      compiled.tips = tips
+      return compiled
+    }
+
+    return {
+      compile,
+      compileToFunctions: createCompileToFunctionFn(compile)
+    }
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/compiler/directives/bind.js b/advancedcontentfilter/vendor/asset/vue/src/compiler/directives/bind.js
new file mode 100644 (file)
index 0000000..e103572
--- /dev/null
@@ -0,0 +1,11 @@
+/* @flow */
+
+export default function bind (el: ASTElement, dir: ASTDirective) {
+  el.wrapData = (code: string) => {
+    return `_b(${code},'${el.tag}',${dir.value},${
+      dir.modifiers && dir.modifiers.prop ? 'true' : 'false'
+    }${
+      dir.modifiers && dir.modifiers.sync ? ',true' : ''
+    })`
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/compiler/directives/index.js b/advancedcontentfilter/vendor/asset/vue/src/compiler/directives/index.js
new file mode 100644 (file)
index 0000000..8f4342c
--- /dev/null
@@ -0,0 +1,11 @@
+/* @flow */
+
+import on from './on'
+import bind from './bind'
+import { noop } from 'shared/util'
+
+export default {
+  on,
+  bind,
+  cloak: noop
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/compiler/directives/model.js b/advancedcontentfilter/vendor/asset/vue/src/compiler/directives/model.js
new file mode 100644 (file)
index 0000000..39bdbfd
--- /dev/null
@@ -0,0 +1,148 @@
+/* @flow */
+
+/**
+ * Cross-platform code generation for component v-model
+ */
+export function genComponentModel (
+  el: ASTElement,
+  value: string,
+  modifiers: ?ASTModifiers
+): ?boolean {
+  const { number, trim } = modifiers || {}
+
+  const baseValueExpression = '$$v'
+  let valueExpression = baseValueExpression
+  if (trim) {
+    valueExpression =
+      `(typeof ${baseValueExpression} === 'string'` +
+      `? ${baseValueExpression}.trim()` +
+      `: ${baseValueExpression})`
+  }
+  if (number) {
+    valueExpression = `_n(${valueExpression})`
+  }
+  const assignment = genAssignmentCode(value, valueExpression)
+
+  el.model = {
+    value: `(${value})`,
+    expression: `"${value}"`,
+    callback: `function (${baseValueExpression}) {${assignment}}`
+  }
+}
+
+/**
+ * Cross-platform codegen helper for generating v-model value assignment code.
+ */
+export function genAssignmentCode (
+  value: string,
+  assignment: string
+): string {
+  const res = parseModel(value)
+  if (res.key === null) {
+    return `${value}=${assignment}`
+  } else {
+    return `$set(${res.exp}, ${res.key}, ${assignment})`
+  }
+}
+
+/**
+ * Parse a v-model expression into a base path and a final key segment.
+ * Handles both dot-path and possible square brackets.
+ *
+ * Possible cases:
+ *
+ * - test
+ * - test[key]
+ * - test[test1[key]]
+ * - test["a"][key]
+ * - xxx.test[a[a].test1[key]]
+ * - test.xxx.a["asa"][test1[key]]
+ *
+ */
+
+let len, str, chr, index, expressionPos, expressionEndPos
+
+type ModelParseResult = {
+  exp: string,
+  key: string | null
+}
+
+export function parseModel (val: string): ModelParseResult {
+  // Fix https://github.com/vuejs/vue/pull/7730
+  // allow v-model="obj.val " (trailing whitespace)
+  val = val.trim()
+  len = val.length
+
+  if (val.indexOf('[') < 0 || val.lastIndexOf(']') < len - 1) {
+    index = val.lastIndexOf('.')
+    if (index > -1) {
+      return {
+        exp: val.slice(0, index),
+        key: '"' + val.slice(index + 1) + '"'
+      }
+    } else {
+      return {
+        exp: val,
+        key: null
+      }
+    }
+  }
+
+  str = val
+  index = expressionPos = expressionEndPos = 0
+
+  while (!eof()) {
+    chr = next()
+    /* istanbul ignore if */
+    if (isStringStart(chr)) {
+      parseString(chr)
+    } else if (chr === 0x5B) {
+      parseBracket(chr)
+    }
+  }
+
+  return {
+    exp: val.slice(0, expressionPos),
+    key: val.slice(expressionPos + 1, expressionEndPos)
+  }
+}
+
+function next (): number {
+  return str.charCodeAt(++index)
+}
+
+function eof (): boolean {
+  return index >= len
+}
+
+function isStringStart (chr: number): boolean {
+  return chr === 0x22 || chr === 0x27
+}
+
+function parseBracket (chr: number): void {
+  let inBracket = 1
+  expressionPos = index
+  while (!eof()) {
+    chr = next()
+    if (isStringStart(chr)) {
+      parseString(chr)
+      continue
+    }
+    if (chr === 0x5B) inBracket++
+    if (chr === 0x5D) inBracket--
+    if (inBracket === 0) {
+      expressionEndPos = index
+      break
+    }
+  }
+}
+
+function parseString (chr: number): void {
+  const stringQuote = chr
+  while (!eof()) {
+    chr = next()
+    if (chr === stringQuote) {
+      break
+    }
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/compiler/directives/on.js b/advancedcontentfilter/vendor/asset/vue/src/compiler/directives/on.js
new file mode 100644 (file)
index 0000000..893a678
--- /dev/null
@@ -0,0 +1,10 @@
+/* @flow */
+
+import { warn } from 'core/util/index'
+
+export default function on (el: ASTElement, dir: ASTDirective) {
+  if (process.env.NODE_ENV !== 'production' && dir.modifiers) {
+    warn(`v-on without argument does not support modifiers.`)
+  }
+  el.wrapListeners = (code: string) => `_g(${code},${dir.value})`
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/compiler/error-detector.js b/advancedcontentfilter/vendor/asset/vue/src/compiler/error-detector.js
new file mode 100644 (file)
index 0000000..e729c49
--- /dev/null
@@ -0,0 +1,108 @@
+/* @flow */
+
+import { dirRE, onRE } from './parser/index'
+
+// these keywords should not appear inside expressions, but operators like
+// typeof, instanceof and in are allowed
+const prohibitedKeywordRE = new RegExp('\\b' + (
+  'do,if,for,let,new,try,var,case,else,with,await,break,catch,class,const,' +
+  'super,throw,while,yield,delete,export,import,return,switch,default,' +
+  'extends,finally,continue,debugger,function,arguments'
+).split(',').join('\\b|\\b') + '\\b')
+
+// these unary operators should not be used as property/method names
+const unaryOperatorsRE = new RegExp('\\b' + (
+  'delete,typeof,void'
+).split(',').join('\\s*\\([^\\)]*\\)|\\b') + '\\s*\\([^\\)]*\\)')
+
+// strip strings in expressions
+const stripStringRE = /'(?:[^'\\]|\\.)*'|"(?:[^"\\]|\\.)*"|`(?:[^`\\]|\\.)*\$\{|\}(?:[^`\\]|\\.)*`|`(?:[^`\\]|\\.)*`/g
+
+// detect problematic expressions in a template
+export function detectErrors (ast: ?ASTNode): Array<string> {
+  const errors: Array<string> = []
+  if (ast) {
+    checkNode(ast, errors)
+  }
+  return errors
+}
+
+function checkNode (node: ASTNode, errors: Array<string>) {
+  if (node.type === 1) {
+    for (const name in node.attrsMap) {
+      if (dirRE.test(name)) {
+        const value = node.attrsMap[name]
+        if (value) {
+          if (name === 'v-for') {
+            checkFor(node, `v-for="${value}"`, errors)
+          } else if (onRE.test(name)) {
+            checkEvent(value, `${name}="${value}"`, errors)
+          } else {
+            checkExpression(value, `${name}="${value}"`, errors)
+          }
+        }
+      }
+    }
+    if (node.children) {
+      for (let i = 0; i < node.children.length; i++) {
+        checkNode(node.children[i], errors)
+      }
+    }
+  } else if (node.type === 2) {
+    checkExpression(node.expression, node.text, errors)
+  }
+}
+
+function checkEvent (exp: string, text: string, errors: Array<string>) {
+  const stipped = exp.replace(stripStringRE, '')
+  const keywordMatch: any = stipped.match(unaryOperatorsRE)
+  if (keywordMatch && stipped.charAt(keywordMatch.index - 1) !== '$') {
+    errors.push(
+      `avoid using JavaScript unary operator as property name: ` +
+      `"${keywordMatch[0]}" in expression ${text.trim()}`
+    )
+  }
+  checkExpression(exp, text, errors)
+}
+
+function checkFor (node: ASTElement, text: string, errors: Array<string>) {
+  checkExpression(node.for || '', text, errors)
+  checkIdentifier(node.alias, 'v-for alias', text, errors)
+  checkIdentifier(node.iterator1, 'v-for iterator', text, errors)
+  checkIdentifier(node.iterator2, 'v-for iterator', text, errors)
+}
+
+function checkIdentifier (
+  ident: ?string,
+  type: string,
+  text: string,
+  errors: Array<string>
+) {
+  if (typeof ident === 'string') {
+    try {
+      new Function(`var ${ident}=_`)
+    } catch (e) {
+      errors.push(`invalid ${type} "${ident}" in expression: ${text.trim()}`)
+    }
+  }
+}
+
+function checkExpression (exp: string, text: string, errors: Array<string>) {
+  try {
+    new Function(`return ${exp}`)
+  } catch (e) {
+    const keywordMatch = exp.replace(stripStringRE, '').match(prohibitedKeywordRE)
+    if (keywordMatch) {
+      errors.push(
+        `avoid using JavaScript keyword as property name: ` +
+        `"${keywordMatch[0]}"\n  Raw expression: ${text.trim()}`
+      )
+    } else {
+      errors.push(
+        `invalid expression: ${e.message} in\n\n` +
+        `    ${exp}\n\n` +
+        `  Raw expression: ${text.trim()}\n`
+      )
+    }
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/compiler/helpers.js b/advancedcontentfilter/vendor/asset/vue/src/compiler/helpers.js
new file mode 100644 (file)
index 0000000..6a7375a
--- /dev/null
@@ -0,0 +1,164 @@
+/* @flow */
+
+import { emptyObject } from 'shared/util'
+import { parseFilters } from './parser/filter-parser'
+
+export function baseWarn (msg: string) {
+  console.error(`[Vue compiler]: ${msg}`)
+}
+
+export function pluckModuleFunction<F: Function> (
+  modules: ?Array<Object>,
+  key: string
+): Array<F> {
+  return modules
+    ? modules.map(m => m[key]).filter(_ => _)
+    : []
+}
+
+export function addProp (el: ASTElement, name: string, value: string) {
+  (el.props || (el.props = [])).push({ name, value })
+  el.plain = false
+}
+
+export function addAttr (el: ASTElement, name: string, value: any) {
+  (el.attrs || (el.attrs = [])).push({ name, value })
+  el.plain = false
+}
+
+// add a raw attr (use this in preTransforms)
+export function addRawAttr (el: ASTElement, name: string, value: any) {
+  el.attrsMap[name] = value
+  el.attrsList.push({ name, value })
+}
+
+export function addDirective (
+  el: ASTElement,
+  name: string,
+  rawName: string,
+  value: string,
+  arg: ?string,
+  modifiers: ?ASTModifiers
+) {
+  (el.directives || (el.directives = [])).push({ name, rawName, value, arg, modifiers })
+  el.plain = false
+}
+
+export function addHandler (
+  el: ASTElement,
+  name: string,
+  value: string,
+  modifiers: ?ASTModifiers,
+  important?: boolean,
+  warn?: Function
+) {
+  modifiers = modifiers || emptyObject
+  // warn prevent and passive modifier
+  /* istanbul ignore if */
+  if (
+    process.env.NODE_ENV !== 'production' && warn &&
+    modifiers.prevent && modifiers.passive
+  ) {
+    warn(
+      'passive and prevent can\'t be used together. ' +
+      'Passive handler can\'t prevent default event.'
+    )
+  }
+
+  // check capture modifier
+  if (modifiers.capture) {
+    delete modifiers.capture
+    name = '!' + name // mark the event as captured
+  }
+  if (modifiers.once) {
+    delete modifiers.once
+    name = '~' + name // mark the event as once
+  }
+  /* istanbul ignore if */
+  if (modifiers.passive) {
+    delete modifiers.passive
+    name = '&' + name // mark the event as passive
+  }
+
+  // normalize click.right and click.middle since they don't actually fire
+  // this is technically browser-specific, but at least for now browsers are
+  // the only target envs that have right/middle clicks.
+  if (name === 'click') {
+    if (modifiers.right) {
+      name = 'contextmenu'
+      delete modifiers.right
+    } else if (modifiers.middle) {
+      name = 'mouseup'
+    }
+  }
+
+  let events
+  if (modifiers.native) {
+    delete modifiers.native
+    events = el.nativeEvents || (el.nativeEvents = {})
+  } else {
+    events = el.events || (el.events = {})
+  }
+
+  const newHandler: any = {
+    value: value.trim()
+  }
+  if (modifiers !== emptyObject) {
+    newHandler.modifiers = modifiers
+  }
+
+  const handlers = events[name]
+  /* istanbul ignore if */
+  if (Array.isArray(handlers)) {
+    important ? handlers.unshift(newHandler) : handlers.push(newHandler)
+  } else if (handlers) {
+    events[name] = important ? [newHandler, handlers] : [handlers, newHandler]
+  } else {
+    events[name] = newHandler
+  }
+
+  el.plain = false
+}
+
+export function getBindingAttr (
+  el: ASTElement,
+  name: string,
+  getStatic?: boolean
+): ?string {
+  const dynamicValue =
+    getAndRemoveAttr(el, ':' + name) ||
+    getAndRemoveAttr(el, 'v-bind:' + name)
+  if (dynamicValue != null) {
+    return parseFilters(dynamicValue)
+  } else if (getStatic !== false) {
+    const staticValue = getAndRemoveAttr(el, name)
+    if (staticValue != null) {
+      return JSON.stringify(staticValue)
+    }
+  }
+}
+
+// note: this only removes the attr from the Array (attrsList) so that it
+// doesn't get processed by processAttrs.
+// By default it does NOT remove it from the map (attrsMap) because the map is
+// needed during codegen.
+export function getAndRemoveAttr (
+  el: ASTElement,
+  name: string,
+  removeFromMap?: boolean
+): ?string {
+  let val
+  if ((val = el.attrsMap[name]) != null) {
+    const list = el.attrsList
+    for (let i = 0, l = list.length; i < l; i++) {
+      if (list[i].name === name) {
+        list.splice(i, 1)
+        break
+      }
+    }
+  }
+  if (removeFromMap) {
+    delete el.attrsMap[name]
+  }
+  return val
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/compiler/index.js b/advancedcontentfilter/vendor/asset/vue/src/compiler/index.js
new file mode 100644 (file)
index 0000000..56b54fd
--- /dev/null
@@ -0,0 +1,25 @@
+/* @flow */
+
+import { parse } from './parser/index'
+import { optimize } from './optimizer'
+import { generate } from './codegen/index'
+import { createCompilerCreator } from './create-compiler'
+
+// `createCompilerCreator` allows creating compilers that use alternative
+// parser/optimizer/codegen, e.g the SSR optimizing compiler.
+// Here we just export a default compiler using the default parts.
+export const createCompiler = createCompilerCreator(function baseCompile (
+  template: string,
+  options: CompilerOptions
+): CompiledResult {
+  const ast = parse(template.trim(), options)
+  if (options.optimize !== false) {
+    optimize(ast, options)
+  }
+  const code = generate(ast, options)
+  return {
+    ast,
+    render: code.render,
+    staticRenderFns: code.staticRenderFns
+  }
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/src/compiler/optimizer.js b/advancedcontentfilter/vendor/asset/vue/src/compiler/optimizer.js
new file mode 100644 (file)
index 0000000..ce43203
--- /dev/null
@@ -0,0 +1,128 @@
+/* @flow */
+
+import { makeMap, isBuiltInTag, cached, no } from 'shared/util'
+
+let isStaticKey
+let isPlatformReservedTag
+
+const genStaticKeysCached = cached(genStaticKeys)
+
+/**
+ * Goal of the optimizer: walk the generated template AST tree
+ * and detect sub-trees that are purely static, i.e. parts of
+ * the DOM that never needs to change.
+ *
+ * Once we detect these sub-trees, we can:
+ *
+ * 1. Hoist them into constants, so that we no longer need to
+ *    create fresh nodes for them on each re-render;
+ * 2. Completely skip them in the patching process.
+ */
+export function optimize (root: ?ASTElement, options: CompilerOptions) {
+  if (!root) return
+  isStaticKey = genStaticKeysCached(options.staticKeys || '')
+  isPlatformReservedTag = options.isReservedTag || no
+  // first pass: mark all non-static nodes.
+  markStatic(root)
+  // second pass: mark static roots.
+  markStaticRoots(root, false)
+}
+
+function genStaticKeys (keys: string): Function {
+  return makeMap(
+    'type,tag,attrsList,attrsMap,plain,parent,children,attrs' +
+    (keys ? ',' + keys : '')
+  )
+}
+
+function markStatic (node: ASTNode) {
+  node.static = isStatic(node)
+  if (node.type === 1) {
+    // do not make component slot content static. this avoids
+    // 1. components not able to mutate slot nodes
+    // 2. static slot content fails for hot-reloading
+    if (
+      !isPlatformReservedTag(node.tag) &&
+      node.tag !== 'slot' &&
+      node.attrsMap['inline-template'] == null
+    ) {
+      return
+    }
+    for (let i = 0, l = node.children.length; i < l; i++) {
+      const child = node.children[i]
+      markStatic(child)
+      if (!child.static) {
+        node.static = false
+      }
+    }
+    if (node.ifConditions) {
+      for (let i = 1, l = node.ifConditions.length; i < l; i++) {
+        const block = node.ifConditions[i].block
+        markStatic(block)
+        if (!block.static) {
+          node.static = false
+        }
+      }
+    }
+  }
+}
+
+function markStaticRoots (node: ASTNode, isInFor: boolean) {
+  if (node.type === 1) {
+    if (node.static || node.once) {
+      node.staticInFor = isInFor
+    }
+    // For a node to qualify as a static root, it should have children that
+    // are not just static text. Otherwise the cost of hoisting out will
+    // outweigh the benefits and it's better off to just always render it fresh.
+    if (node.static && node.children.length && !(
+      node.children.length === 1 &&
+      node.children[0].type === 3
+    )) {
+      node.staticRoot = true
+      return
+    } else {
+      node.staticRoot = false
+    }
+    if (node.children) {
+      for (let i = 0, l = node.children.length; i < l; i++) {
+        markStaticRoots(node.children[i], isInFor || !!node.for)
+      }
+    }
+    if (node.ifConditions) {
+      for (let i = 1, l = node.ifConditions.length; i < l; i++) {
+        markStaticRoots(node.ifConditions[i].block, isInFor)
+      }
+    }
+  }
+}
+
+function isStatic (node: ASTNode): boolean {
+  if (node.type === 2) { // expression
+    return false
+  }
+  if (node.type === 3) { // text
+    return true
+  }
+  return !!(node.pre || (
+    !node.hasBindings && // no dynamic bindings
+    !node.if && !node.for && // not v-if or v-for or v-else
+    !isBuiltInTag(node.tag) && // not a built-in
+    isPlatformReservedTag(node.tag) && // not a component
+    !isDirectChildOfTemplateFor(node) &&
+    Object.keys(node).every(isStaticKey)
+  ))
+}
+
+function isDirectChildOfTemplateFor (node: ASTElement): boolean {
+  while (node.parent) {
+    node = node.parent
+    if (node.tag !== 'template') {
+      return false
+    }
+    if (node.for) {
+      return true
+    }
+  }
+  return false
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/compiler/parser/entity-decoder.js b/advancedcontentfilter/vendor/asset/vue/src/compiler/parser/entity-decoder.js
new file mode 100644 (file)
index 0000000..2836294
--- /dev/null
@@ -0,0 +1,11 @@
+/* @flow */
+
+let decoder
+
+export default {
+  decode (html: string): string {
+    decoder = decoder || document.createElement('div')
+    decoder.innerHTML = html
+    return decoder.textContent
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/compiler/parser/filter-parser.js b/advancedcontentfilter/vendor/asset/vue/src/compiler/parser/filter-parser.js
new file mode 100644 (file)
index 0000000..10939d3
--- /dev/null
@@ -0,0 +1,97 @@
+/* @flow */
+
+const validDivisionCharRE = /[\w).+\-_$\]]/
+
+export function parseFilters (exp: string): string {
+  let inSingle = false
+  let inDouble = false
+  let inTemplateString = false
+  let inRegex = false
+  let curly = 0
+  let square = 0
+  let paren = 0
+  let lastFilterIndex = 0
+  let c, prev, i, expression, filters
+
+  for (i = 0; i < exp.length; i++) {
+    prev = c
+    c = exp.charCodeAt(i)
+    if (inSingle) {
+      if (c === 0x27 && prev !== 0x5C) inSingle = false
+    } else if (inDouble) {
+      if (c === 0x22 && prev !== 0x5C) inDouble = false
+    } else if (inTemplateString) {
+      if (c === 0x60 && prev !== 0x5C) inTemplateString = false
+    } else if (inRegex) {
+      if (c === 0x2f && prev !== 0x5C) inRegex = false
+    } else if (
+      c === 0x7C && // pipe
+      exp.charCodeAt(i + 1) !== 0x7C &&
+      exp.charCodeAt(i - 1) !== 0x7C &&
+      !curly && !square && !paren
+    ) {
+      if (expression === undefined) {
+        // first filter, end of expression
+        lastFilterIndex = i + 1
+        expression = exp.slice(0, i).trim()
+      } else {
+        pushFilter()
+      }
+    } else {
+      switch (c) {
+        case 0x22: inDouble = true; break         // "
+        case 0x27: inSingle = true; break         // '
+        case 0x60: inTemplateString = true; break // `
+        case 0x28: paren++; break                 // (
+        case 0x29: paren--; break                 // )
+        case 0x5B: square++; break                // [
+        case 0x5D: square--; break                // ]
+        case 0x7B: curly++; break                 // {
+        case 0x7D: curly--; break                 // }
+      }
+      if (c === 0x2f) { // /
+        let j = i - 1
+        let p
+        // find first non-whitespace prev char
+        for (; j >= 0; j--) {
+          p = exp.charAt(j)
+          if (p !== ' ') break
+        }
+        if (!p || !validDivisionCharRE.test(p)) {
+          inRegex = true
+        }
+      }
+    }
+  }
+
+  if (expression === undefined) {
+    expression = exp.slice(0, i).trim()
+  } else if (lastFilterIndex !== 0) {
+    pushFilter()
+  }
+
+  function pushFilter () {
+    (filters || (filters = [])).push(exp.slice(lastFilterIndex, i).trim())
+    lastFilterIndex = i + 1
+  }
+
+  if (filters) {
+    for (i = 0; i < filters.length; i++) {
+      expression = wrapFilter(expression, filters[i])
+    }
+  }
+
+  return expression
+}
+
+function wrapFilter (exp: string, filter: string): string {
+  const i = filter.indexOf('(')
+  if (i < 0) {
+    // _f: resolveFilter
+    return `_f("${filter}")(${exp})`
+  } else {
+    const name = filter.slice(0, i)
+    const args = filter.slice(i + 1)
+    return `_f("${name}")(${exp}${args !== ')' ? ',' + args : args}`
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/compiler/parser/html-parser.js b/advancedcontentfilter/vendor/asset/vue/src/compiler/parser/html-parser.js
new file mode 100644 (file)
index 0000000..e220361
--- /dev/null
@@ -0,0 +1,310 @@
+/**
+ * Not type-checking this file because it's mostly vendor code.
+ */
+
+/*!
+ * HTML Parser By John Resig (ejohn.org)
+ * Modified by Juriy "kangax" Zaytsev
+ * Original code by Erik Arvidsson, Mozilla Public License
+ * http://erik.eae.net/simplehtmlparser/simplehtmlparser.js
+ */
+
+import { makeMap, no } from 'shared/util'
+import { isNonPhrasingTag } from 'web/compiler/util'
+
+// Regular Expressions for parsing tags and attributes
+const attribute = /^\s*([^\s"'<>\/=]+)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/
+// could use https://www.w3.org/TR/1999/REC-xml-names-19990114/#NT-QName
+// but for Vue templates we can enforce a simple charset
+const ncname = '[a-zA-Z_][\\w\\-\\.]*'
+const qnameCapture = `((?:${ncname}\\:)?${ncname})`
+const startTagOpen = new RegExp(`^<${qnameCapture}`)
+const startTagClose = /^\s*(\/?)>/
+const endTag = new RegExp(`^<\\/${qnameCapture}[^>]*>`)
+const doctype = /^<!DOCTYPE [^>]+>/i
+// #7298: escape - to avoid being pased as HTML comment when inlined in page
+const comment = /^<!\--/
+const conditionalComment = /^<!\[/
+
+let IS_REGEX_CAPTURING_BROKEN = false
+'x'.replace(/x(.)?/g, function (m, g) {
+  IS_REGEX_CAPTURING_BROKEN = g === ''
+})
+
+// Special Elements (can contain anything)
+export const isPlainTextElement = makeMap('script,style,textarea', true)
+const reCache = {}
+
+const decodingMap = {
+  '&lt;': '<',
+  '&gt;': '>',
+  '&quot;': '"',
+  '&amp;': '&',
+  '&#10;': '\n',
+  '&#9;': '\t'
+}
+const encodedAttr = /&(?:lt|gt|quot|amp);/g
+const encodedAttrWithNewLines = /&(?:lt|gt|quot|amp|#10|#9);/g
+
+// #5992
+const isIgnoreNewlineTag = makeMap('pre,textarea', true)
+const shouldIgnoreFirstNewline = (tag, html) => tag && isIgnoreNewlineTag(tag) && html[0] === '\n'
+
+function decodeAttr (value, shouldDecodeNewlines) {
+  const re = shouldDecodeNewlines ? encodedAttrWithNewLines : encodedAttr
+  return value.replace(re, match => decodingMap[match])
+}
+
+export function parseHTML (html, options) {
+  const stack = []
+  const expectHTML = options.expectHTML
+  const isUnaryTag = options.isUnaryTag || no
+  const canBeLeftOpenTag = options.canBeLeftOpenTag || no
+  let index = 0
+  let last, lastTag
+  while (html) {
+    last = html
+    // Make sure we're not in a plaintext content element like script/style
+    if (!lastTag || !isPlainTextElement(lastTag)) {
+      let textEnd = html.indexOf('<')
+      if (textEnd === 0) {
+        // Comment:
+        if (comment.test(html)) {
+          const commentEnd = html.indexOf('-->')
+
+          if (commentEnd >= 0) {
+            if (options.shouldKeepComment) {
+              options.comment(html.substring(4, commentEnd))
+            }
+            advance(commentEnd + 3)
+            continue
+          }
+        }
+
+        // http://en.wikipedia.org/wiki/Conditional_comment#Downlevel-revealed_conditional_comment
+        if (conditionalComment.test(html)) {
+          const conditionalEnd = html.indexOf(']>')
+
+          if (conditionalEnd >= 0) {
+            advance(conditionalEnd + 2)
+            continue
+          }
+        }
+
+        // Doctype:
+        const doctypeMatch = html.match(doctype)
+        if (doctypeMatch) {
+          advance(doctypeMatch[0].length)
+          continue
+        }
+
+        // End tag:
+        const endTagMatch = html.match(endTag)
+        if (endTagMatch) {
+          const curIndex = index
+          advance(endTagMatch[0].length)
+          parseEndTag(endTagMatch[1], curIndex, index)
+          continue
+        }
+
+        // Start tag:
+        const startTagMatch = parseStartTag()
+        if (startTagMatch) {
+          handleStartTag(startTagMatch)
+          if (shouldIgnoreFirstNewline(lastTag, html)) {
+            advance(1)
+          }
+          continue
+        }
+      }
+
+      let text, rest, next
+      if (textEnd >= 0) {
+        rest = html.slice(textEnd)
+        while (
+          !endTag.test(rest) &&
+          !startTagOpen.test(rest) &&
+          !comment.test(rest) &&
+          !conditionalComment.test(rest)
+        ) {
+          // < in plain text, be forgiving and treat it as text
+          next = rest.indexOf('<', 1)
+          if (next < 0) break
+          textEnd += next
+          rest = html.slice(textEnd)
+        }
+        text = html.substring(0, textEnd)
+        advance(textEnd)
+      }
+
+      if (textEnd < 0) {
+        text = html
+        html = ''
+      }
+
+      if (options.chars && text) {
+        options.chars(text)
+      }
+    } else {
+      let endTagLength = 0
+      const stackedTag = lastTag.toLowerCase()
+      const reStackedTag = reCache[stackedTag] || (reCache[stackedTag] = new RegExp('([\\s\\S]*?)(</' + stackedTag + '[^>]*>)', 'i'))
+      const rest = html.replace(reStackedTag, function (all, text, endTag) {
+        endTagLength = endTag.length
+        if (!isPlainTextElement(stackedTag) && stackedTag !== 'noscript') {
+          text = text
+            .replace(/<!\--([\s\S]*?)-->/g, '$1') // #7298
+            .replace(/<!\[CDATA\[([\s\S]*?)]]>/g, '$1')
+        }
+        if (shouldIgnoreFirstNewline(stackedTag, text)) {
+          text = text.slice(1)
+        }
+        if (options.chars) {
+          options.chars(text)
+        }
+        return ''
+      })
+      index += html.length - rest.length
+      html = rest
+      parseEndTag(stackedTag, index - endTagLength, index)
+    }
+
+    if (html === last) {
+      options.chars && options.chars(html)
+      if (process.env.NODE_ENV !== 'production' && !stack.length && options.warn) {
+        options.warn(`Mal-formatted tag at end of template: "${html}"`)
+      }
+      break
+    }
+  }
+
+  // Clean up any remaining tags
+  parseEndTag()
+
+  function advance (n) {
+    index += n
+    html = html.substring(n)
+  }
+
+  function parseStartTag () {
+    const start = html.match(startTagOpen)
+    if (start) {
+      const match = {
+        tagName: start[1],
+        attrs: [],
+        start: index
+      }
+      advance(start[0].length)
+      let end, attr
+      while (!(end = html.match(startTagClose)) && (attr = html.match(attribute))) {
+        advance(attr[0].length)
+        match.attrs.push(attr)
+      }
+      if (end) {
+        match.unarySlash = end[1]
+        advance(end[0].length)
+        match.end = index
+        return match
+      }
+    }
+  }
+
+  function handleStartTag (match) {
+    const tagName = match.tagName
+    const unarySlash = match.unarySlash
+
+    if (expectHTML) {
+      if (lastTag === 'p' && isNonPhrasingTag(tagName)) {
+        parseEndTag(lastTag)
+      }
+      if (canBeLeftOpenTag(tagName) && lastTag === tagName) {
+        parseEndTag(tagName)
+      }
+    }
+
+    const unary = isUnaryTag(tagName) || !!unarySlash
+
+    const l = match.attrs.length
+    const attrs = new Array(l)
+    for (let i = 0; i < l; i++) {
+      const args = match.attrs[i]
+      // hackish work around FF bug https://bugzilla.mozilla.org/show_bug.cgi?id=369778
+      if (IS_REGEX_CAPTURING_BROKEN && args[0].indexOf('""') === -1) {
+        if (args[3] === '') { delete args[3] }
+        if (args[4] === '') { delete args[4] }
+        if (args[5] === '') { delete args[5] }
+      }
+      const value = args[3] || args[4] || args[5] || ''
+      const shouldDecodeNewlines = tagName === 'a' && args[1] === 'href'
+        ? options.shouldDecodeNewlinesForHref
+        : options.shouldDecodeNewlines
+      attrs[i] = {
+        name: args[1],
+        value: decodeAttr(value, shouldDecodeNewlines)
+      }
+    }
+
+    if (!unary) {
+      stack.push({ tag: tagName, lowerCasedTag: tagName.toLowerCase(), attrs: attrs })
+      lastTag = tagName
+    }
+
+    if (options.start) {
+      options.start(tagName, attrs, unary, match.start, match.end)
+    }
+  }
+
+  function parseEndTag (tagName, start, end) {
+    let pos, lowerCasedTagName
+    if (start == null) start = index
+    if (end == null) end = index
+
+    if (tagName) {
+      lowerCasedTagName = tagName.toLowerCase()
+    }
+
+    // Find the closest opened tag of the same type
+    if (tagName) {
+      for (pos = stack.length - 1; pos >= 0; pos--) {
+        if (stack[pos].lowerCasedTag === lowerCasedTagName) {
+          break
+        }
+      }
+    } else {
+      // If no tag name is provided, clean shop
+      pos = 0
+    }
+
+    if (pos >= 0) {
+      // Close all the open elements, up the stack
+      for (let i = stack.length - 1; i >= pos; i--) {
+        if (process.env.NODE_ENV !== 'production' &&
+          (i > pos || !tagName) &&
+          options.warn
+        ) {
+          options.warn(
+            `tag <${stack[i].tag}> has no matching end tag.`
+          )
+        }
+        if (options.end) {
+          options.end(stack[i].tag, start, end)
+        }
+      }
+
+      // Remove the open elements from the stack
+      stack.length = pos
+      lastTag = pos && stack[pos - 1].tag
+    } else if (lowerCasedTagName === 'br') {
+      if (options.start) {
+        options.start(tagName, [], true, start, end)
+      }
+    } else if (lowerCasedTagName === 'p') {
+      if (options.start) {
+        options.start(tagName, [], false, start, end)
+      }
+      if (options.end) {
+        options.end(tagName, start, end)
+      }
+    }
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/compiler/parser/index.js b/advancedcontentfilter/vendor/asset/vue/src/compiler/parser/index.js
new file mode 100644 (file)
index 0000000..a603b36
--- /dev/null
@@ -0,0 +1,675 @@
+/* @flow */
+
+import he from 'he'
+import { parseHTML } from './html-parser'
+import { parseText } from './text-parser'
+import { parseFilters } from './filter-parser'
+import { genAssignmentCode } from '../directives/model'
+import { extend, cached, no, camelize } from 'shared/util'
+import { isIE, isEdge, isServerRendering } from 'core/util/env'
+
+import {
+  addProp,
+  addAttr,
+  baseWarn,
+  addHandler,
+  addDirective,
+  getBindingAttr,
+  getAndRemoveAttr,
+  pluckModuleFunction
+} from '../helpers'
+
+export const onRE = /^@|^v-on:/
+export const dirRE = /^v-|^@|^:/
+export const forAliasRE = /([^]*?)\s+(?:in|of)\s+([^]*)/
+export const forIteratorRE = /,([^,\}\]]*)(?:,([^,\}\]]*))?$/
+const stripParensRE = /^\(|\)$/g
+
+const argRE = /:(.*)$/
+export const bindRE = /^:|^v-bind:/
+const modifierRE = /\.[^.]+/g
+
+const decodeHTMLCached = cached(he.decode)
+
+// configurable state
+export let warn: any
+let delimiters
+let transforms
+let preTransforms
+let postTransforms
+let platformIsPreTag
+let platformMustUseProp
+let platformGetTagNamespace
+
+type Attr = { name: string; value: string };
+
+export function createASTElement (
+  tag: string,
+  attrs: Array<Attr>,
+  parent: ASTElement | void
+): ASTElement {
+  return {
+    type: 1,
+    tag,
+    attrsList: attrs,
+    attrsMap: makeAttrsMap(attrs),
+    parent,
+    children: []
+  }
+}
+
+/**
+ * Convert HTML string to AST.
+ */
+export function parse (
+  template: string,
+  options: CompilerOptions
+): ASTElement | void {
+  warn = options.warn || baseWarn
+
+  platformIsPreTag = options.isPreTag || no
+  platformMustUseProp = options.mustUseProp || no
+  platformGetTagNamespace = options.getTagNamespace || no
+
+  transforms = pluckModuleFunction(options.modules, 'transformNode')
+  preTransforms = pluckModuleFunction(options.modules, 'preTransformNode')
+  postTransforms = pluckModuleFunction(options.modules, 'postTransformNode')
+
+  delimiters = options.delimiters
+
+  const stack = []
+  const preserveWhitespace = options.preserveWhitespace !== false
+  let root
+  let currentParent
+  let inVPre = false
+  let inPre = false
+  let warned = false
+
+  function warnOnce (msg) {
+    if (!warned) {
+      warned = true
+      warn(msg)
+    }
+  }
+
+  function closeElement (element) {
+    // check pre state
+    if (element.pre) {
+      inVPre = false
+    }
+    if (platformIsPreTag(element.tag)) {
+      inPre = false
+    }
+    // apply post-transforms
+    for (let i = 0; i < postTransforms.length; i++) {
+      postTransforms[i](element, options)
+    }
+  }
+
+  parseHTML(template, {
+    warn,
+    expectHTML: options.expectHTML,
+    isUnaryTag: options.isUnaryTag,
+    canBeLeftOpenTag: options.canBeLeftOpenTag,
+    shouldDecodeNewlines: options.shouldDecodeNewlines,
+    shouldDecodeNewlinesForHref: options.shouldDecodeNewlinesForHref,
+    shouldKeepComment: options.comments,
+    start (tag, attrs, unary) {
+      // check namespace.
+      // inherit parent ns if there is one
+      const ns = (currentParent && currentParent.ns) || platformGetTagNamespace(tag)
+
+      // handle IE svg bug
+      /* istanbul ignore if */
+      if (isIE && ns === 'svg') {
+        attrs = guardIESVGBug(attrs)
+      }
+
+      let element: ASTElement = createASTElement(tag, attrs, currentParent)
+      if (ns) {
+        element.ns = ns
+      }
+
+      if (isForbiddenTag(element) && !isServerRendering()) {
+        element.forbidden = true
+        process.env.NODE_ENV !== 'production' && warn(
+          'Templates should only be responsible for mapping the state to the ' +
+          'UI. Avoid placing tags with side-effects in your templates, such as ' +
+          `<${tag}>` + ', as they will not be parsed.'
+        )
+      }
+
+      // apply pre-transforms
+      for (let i = 0; i < preTransforms.length; i++) {
+        element = preTransforms[i](element, options) || element
+      }
+
+      if (!inVPre) {
+        processPre(element)
+        if (element.pre) {
+          inVPre = true
+        }
+      }
+      if (platformIsPreTag(element.tag)) {
+        inPre = true
+      }
+      if (inVPre) {
+        processRawAttrs(element)
+      } else if (!element.processed) {
+        // structural directives
+        processFor(element)
+        processIf(element)
+        processOnce(element)
+        // element-scope stuff
+        processElement(element, options)
+      }
+
+      function checkRootConstraints (el) {
+        if (process.env.NODE_ENV !== 'production') {
+          if (el.tag === 'slot' || el.tag === 'template') {
+            warnOnce(
+              `Cannot use <${el.tag}> as component root element because it may ` +
+              'contain multiple nodes.'
+            )
+          }
+          if (el.attrsMap.hasOwnProperty('v-for')) {
+            warnOnce(
+              'Cannot use v-for on stateful component root element because ' +
+              'it renders multiple elements.'
+            )
+          }
+        }
+      }
+
+      // tree management
+      if (!root) {
+        root = element
+        checkRootConstraints(root)
+      } else if (!stack.length) {
+        // allow root elements with v-if, v-else-if and v-else
+        if (root.if && (element.elseif || element.else)) {
+          checkRootConstraints(element)
+          addIfCondition(root, {
+            exp: element.elseif,
+            block: element
+          })
+        } else if (process.env.NODE_ENV !== 'production') {
+          warnOnce(
+            `Component template should contain exactly one root element. ` +
+            `If you are using v-if on multiple elements, ` +
+            `use v-else-if to chain them instead.`
+          )
+        }
+      }
+      if (currentParent && !element.forbidden) {
+        if (element.elseif || element.else) {
+          processIfConditions(element, currentParent)
+        } else if (element.slotScope) { // scoped slot
+          currentParent.plain = false
+          const name = element.slotTarget || '"default"'
+          ;(currentParent.scopedSlots || (currentParent.scopedSlots = {}))[name] = element
+        } else {
+          currentParent.children.push(element)
+          element.parent = currentParent
+        }
+      }
+      if (!unary) {
+        currentParent = element
+        stack.push(element)
+      } else {
+        closeElement(element)
+      }
+    },
+
+    end () {
+      // remove trailing whitespace
+      const element = stack[stack.length - 1]
+      const lastNode = element.children[element.children.length - 1]
+      if (lastNode && lastNode.type === 3 && lastNode.text === ' ' && !inPre) {
+        element.children.pop()
+      }
+      // pop stack
+      stack.length -= 1
+      currentParent = stack[stack.length - 1]
+      closeElement(element)
+    },
+
+    chars (text: string) {
+      if (!currentParent) {
+        if (process.env.NODE_ENV !== 'production') {
+          if (text === template) {
+            warnOnce(
+              'Component template requires a root element, rather than just text.'
+            )
+          } else if ((text = text.trim())) {
+            warnOnce(
+              `text "${text}" outside root element will be ignored.`
+            )
+          }
+        }
+        return
+      }
+      // IE textarea placeholder bug
+      /* istanbul ignore if */
+      if (isIE &&
+        currentParent.tag === 'textarea' &&
+        currentParent.attrsMap.placeholder === text
+      ) {
+        return
+      }
+      const children = currentParent.children
+      text = inPre || text.trim()
+        ? isTextTag(currentParent) ? text : decodeHTMLCached(text)
+        // only preserve whitespace if its not right after a starting tag
+        : preserveWhitespace && children.length ? ' ' : ''
+      if (text) {
+        let res
+        if (!inVPre && text !== ' ' && (res = parseText(text, delimiters))) {
+          children.push({
+            type: 2,
+            expression: res.expression,
+            tokens: res.tokens,
+            text
+          })
+        } else if (text !== ' ' || !children.length || children[children.length - 1].text !== ' ') {
+          children.push({
+            type: 3,
+            text
+          })
+        }
+      }
+    },
+    comment (text: string) {
+      currentParent.children.push({
+        type: 3,
+        text,
+        isComment: true
+      })
+    }
+  })
+  return root
+}
+
+function processPre (el) {
+  if (getAndRemoveAttr(el, 'v-pre') != null) {
+    el.pre = true
+  }
+}
+
+function processRawAttrs (el) {
+  const l = el.attrsList.length
+  if (l) {
+    const attrs = el.attrs = new Array(l)
+    for (let i = 0; i < l; i++) {
+      attrs[i] = {
+        name: el.attrsList[i].name,
+        value: JSON.stringify(el.attrsList[i].value)
+      }
+    }
+  } else if (!el.pre) {
+    // non root node in pre blocks with no attributes
+    el.plain = true
+  }
+}
+
+export function processElement (element: ASTElement, options: CompilerOptions) {
+  processKey(element)
+
+  // determine whether this is a plain element after
+  // removing structural attributes
+  element.plain = !element.key && !element.attrsList.length
+
+  processRef(element)
+  processSlot(element)
+  processComponent(element)
+  for (let i = 0; i < transforms.length; i++) {
+    element = transforms[i](element, options) || element
+  }
+  processAttrs(element)
+}
+
+function processKey (el) {
+  const exp = getBindingAttr(el, 'key')
+  if (exp) {
+    if (process.env.NODE_ENV !== 'production' && el.tag === 'template') {
+      warn(`<template> cannot be keyed. Place the key on real elements instead.`)
+    }
+    el.key = exp
+  }
+}
+
+function processRef (el) {
+  const ref = getBindingAttr(el, 'ref')
+  if (ref) {
+    el.ref = ref
+    el.refInFor = checkInFor(el)
+  }
+}
+
+export function processFor (el: ASTElement) {
+  let exp
+  if ((exp = getAndRemoveAttr(el, 'v-for'))) {
+    const res = parseFor(exp)
+    if (res) {
+      extend(el, res)
+    } else if (process.env.NODE_ENV !== 'production') {
+      warn(
+        `Invalid v-for expression: ${exp}`
+      )
+    }
+  }
+}
+
+type ForParseResult = {
+  for: string;
+  alias: string;
+  iterator1?: string;
+  iterator2?: string;
+};
+
+export function parseFor (exp: string): ?ForParseResult {
+  const inMatch = exp.match(forAliasRE)
+  if (!inMatch) return
+  const res = {}
+  res.for = inMatch[2].trim()
+  const alias = inMatch[1].trim().replace(stripParensRE, '')
+  const iteratorMatch = alias.match(forIteratorRE)
+  if (iteratorMatch) {
+    res.alias = alias.replace(forIteratorRE, '')
+    res.iterator1 = iteratorMatch[1].trim()
+    if (iteratorMatch[2]) {
+      res.iterator2 = iteratorMatch[2].trim()
+    }
+  } else {
+    res.alias = alias
+  }
+  return res
+}
+
+function processIf (el) {
+  const exp = getAndRemoveAttr(el, 'v-if')
+  if (exp) {
+    el.if = exp
+    addIfCondition(el, {
+      exp: exp,
+      block: el
+    })
+  } else {
+    if (getAndRemoveAttr(el, 'v-else') != null) {
+      el.else = true
+    }
+    const elseif = getAndRemoveAttr(el, 'v-else-if')
+    if (elseif) {
+      el.elseif = elseif
+    }
+  }
+}
+
+function processIfConditions (el, parent) {
+  const prev = findPrevElement(parent.children)
+  if (prev && prev.if) {
+    addIfCondition(prev, {
+      exp: el.elseif,
+      block: el
+    })
+  } else if (process.env.NODE_ENV !== 'production') {
+    warn(
+      `v-${el.elseif ? ('else-if="' + el.elseif + '"') : 'else'} ` +
+      `used on element <${el.tag}> without corresponding v-if.`
+    )
+  }
+}
+
+function findPrevElement (children: Array<any>): ASTElement | void {
+  let i = children.length
+  while (i--) {
+    if (children[i].type === 1) {
+      return children[i]
+    } else {
+      if (process.env.NODE_ENV !== 'production' && children[i].text !== ' ') {
+        warn(
+          `text "${children[i].text.trim()}" between v-if and v-else(-if) ` +
+          `will be ignored.`
+        )
+      }
+      children.pop()
+    }
+  }
+}
+
+export function addIfCondition (el: ASTElement, condition: ASTIfCondition) {
+  if (!el.ifConditions) {
+    el.ifConditions = []
+  }
+  el.ifConditions.push(condition)
+}
+
+function processOnce (el) {
+  const once = getAndRemoveAttr(el, 'v-once')
+  if (once != null) {
+    el.once = true
+  }
+}
+
+function processSlot (el) {
+  if (el.tag === 'slot') {
+    el.slotName = getBindingAttr(el, 'name')
+    if (process.env.NODE_ENV !== 'production' && el.key) {
+      warn(
+        `\`key\` does not work on <slot> because slots are abstract outlets ` +
+        `and can possibly expand into multiple elements. ` +
+        `Use the key on a wrapping element instead.`
+      )
+    }
+  } else {
+    let slotScope
+    if (el.tag === 'template') {
+      slotScope = getAndRemoveAttr(el, 'scope')
+      /* istanbul ignore if */
+      if (process.env.NODE_ENV !== 'production' && slotScope) {
+        warn(
+          `the "scope" attribute for scoped slots have been deprecated and ` +
+          `replaced by "slot-scope" since 2.5. The new "slot-scope" attribute ` +
+          `can also be used on plain elements in addition to <template> to ` +
+          `denote scoped slots.`,
+          true
+        )
+      }
+      el.slotScope = slotScope || getAndRemoveAttr(el, 'slot-scope')
+    } else if ((slotScope = getAndRemoveAttr(el, 'slot-scope'))) {
+      /* istanbul ignore if */
+      if (process.env.NODE_ENV !== 'production' && el.attrsMap['v-for']) {
+        warn(
+          `Ambiguous combined usage of slot-scope and v-for on <${el.tag}> ` +
+          `(v-for takes higher priority). Use a wrapper <template> for the ` +
+          `scoped slot to make it clearer.`,
+          true
+        )
+      }
+      el.slotScope = slotScope
+    }
+    const slotTarget = getBindingAttr(el, 'slot')
+    if (slotTarget) {
+      el.slotTarget = slotTarget === '""' ? '"default"' : slotTarget
+      // preserve slot as an attribute for native shadow DOM compat
+      // only for non-scoped slots.
+      if (el.tag !== 'template' && !el.slotScope) {
+        addAttr(el, 'slot', slotTarget)
+      }
+    }
+  }
+}
+
+function processComponent (el) {
+  let binding
+  if ((binding = getBindingAttr(el, 'is'))) {
+    el.component = binding
+  }
+  if (getAndRemoveAttr(el, 'inline-template') != null) {
+    el.inlineTemplate = true
+  }
+}
+
+function processAttrs (el) {
+  const list = el.attrsList
+  let i, l, name, rawName, value, modifiers, isProp
+  for (i = 0, l = list.length; i < l; i++) {
+    name = rawName = list[i].name
+    value = list[i].value
+    if (dirRE.test(name)) {
+      // mark element as dynamic
+      el.hasBindings = true
+      // modifiers
+      modifiers = parseModifiers(name)
+      if (modifiers) {
+        name = name.replace(modifierRE, '')
+      }
+      if (bindRE.test(name)) { // v-bind
+        name = name.replace(bindRE, '')
+        value = parseFilters(value)
+        isProp = false
+        if (modifiers) {
+          if (modifiers.prop) {
+            isProp = true
+            name = camelize(name)
+            if (name === 'innerHtml') name = 'innerHTML'
+          }
+          if (modifiers.camel) {
+            name = camelize(name)
+          }
+          if (modifiers.sync) {
+            addHandler(
+              el,
+              `update:${camelize(name)}`,
+              genAssignmentCode(value, `$event`)
+            )
+          }
+        }
+        if (isProp || (
+          !el.component && platformMustUseProp(el.tag, el.attrsMap.type, name)
+        )) {
+          addProp(el, name, value)
+        } else {
+          addAttr(el, name, value)
+        }
+      } else if (onRE.test(name)) { // v-on
+        name = name.replace(onRE, '')
+        addHandler(el, name, value, modifiers, false, warn)
+      } else { // normal directives
+        name = name.replace(dirRE, '')
+        // parse arg
+        const argMatch = name.match(argRE)
+        const arg = argMatch && argMatch[1]
+        if (arg) {
+          name = name.slice(0, -(arg.length + 1))
+        }
+        addDirective(el, name, rawName, value, arg, modifiers)
+        if (process.env.NODE_ENV !== 'production' && name === 'model') {
+          checkForAliasModel(el, value)
+        }
+      }
+    } else {
+      // literal attribute
+      if (process.env.NODE_ENV !== 'production') {
+        const res = parseText(value, delimiters)
+        if (res) {
+          warn(
+            `${name}="${value}": ` +
+            'Interpolation inside attributes has been removed. ' +
+            'Use v-bind or the colon shorthand instead. For example, ' +
+            'instead of <div id="{{ val }}">, use <div :id="val">.'
+          )
+        }
+      }
+      addAttr(el, name, JSON.stringify(value))
+      // #6887 firefox doesn't update muted state if set via attribute
+      // even immediately after element creation
+      if (!el.component &&
+          name === 'muted' &&
+          platformMustUseProp(el.tag, el.attrsMap.type, name)) {
+        addProp(el, name, 'true')
+      }
+    }
+  }
+}
+
+function checkInFor (el: ASTElement): boolean {
+  let parent = el
+  while (parent) {
+    if (parent.for !== undefined) {
+      return true
+    }
+    parent = parent.parent
+  }
+  return false
+}
+
+function parseModifiers (name: string): Object | void {
+  const match = name.match(modifierRE)
+  if (match) {
+    const ret = {}
+    match.forEach(m => { ret[m.slice(1)] = true })
+    return ret
+  }
+}
+
+function makeAttrsMap (attrs: Array<Object>): Object {
+  const map = {}
+  for (let i = 0, l = attrs.length; i < l; i++) {
+    if (
+      process.env.NODE_ENV !== 'production' &&
+      map[attrs[i].name] && !isIE && !isEdge
+    ) {
+      warn('duplicate attribute: ' + attrs[i].name)
+    }
+    map[attrs[i].name] = attrs[i].value
+  }
+  return map
+}
+
+// for script (e.g. type="x/template") or style, do not decode content
+function isTextTag (el): boolean {
+  return el.tag === 'script' || el.tag === 'style'
+}
+
+function isForbiddenTag (el): boolean {
+  return (
+    el.tag === 'style' ||
+    (el.tag === 'script' && (
+      !el.attrsMap.type ||
+      el.attrsMap.type === 'text/javascript'
+    ))
+  )
+}
+
+const ieNSBug = /^xmlns:NS\d+/
+const ieNSPrefix = /^NS\d+:/
+
+/* istanbul ignore next */
+function guardIESVGBug (attrs) {
+  const res = []
+  for (let i = 0; i < attrs.length; i++) {
+    const attr = attrs[i]
+    if (!ieNSBug.test(attr.name)) {
+      attr.name = attr.name.replace(ieNSPrefix, '')
+      res.push(attr)
+    }
+  }
+  return res
+}
+
+function checkForAliasModel (el, value) {
+  let _el = el
+  while (_el) {
+    if (_el.for && _el.alias === value) {
+      warn(
+        `<${el.tag} v-model="${value}">: ` +
+        `You are binding v-model directly to a v-for iteration alias. ` +
+        `This will not be able to modify the v-for source array because ` +
+        `writing to the alias is like modifying a function local variable. ` +
+        `Consider using an array of objects and use v-model on an object property instead.`
+      )
+    }
+    _el = _el.parent
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/compiler/parser/text-parser.js b/advancedcontentfilter/vendor/asset/vue/src/compiler/parser/text-parser.js
new file mode 100644 (file)
index 0000000..284fca3
--- /dev/null
@@ -0,0 +1,53 @@
+/* @flow */
+
+import { cached } from 'shared/util'
+import { parseFilters } from './filter-parser'
+
+const defaultTagRE = /\{\{((?:.|\n)+?)\}\}/g
+const regexEscapeRE = /[-.*+?^${}()|[\]\/\\]/g
+
+const buildRegex = cached(delimiters => {
+  const open = delimiters[0].replace(regexEscapeRE, '\\$&')
+  const close = delimiters[1].replace(regexEscapeRE, '\\$&')
+  return new RegExp(open + '((?:.|\\n)+?)' + close, 'g')
+})
+
+type TextParseResult = {
+  expression: string,
+  tokens: Array<string | { '@binding': string }>
+}
+
+export function parseText (
+  text: string,
+  delimiters?: [string, string]
+): TextParseResult | void {
+  const tagRE = delimiters ? buildRegex(delimiters) : defaultTagRE
+  if (!tagRE.test(text)) {
+    return
+  }
+  const tokens = []
+  const rawTokens = []
+  let lastIndex = tagRE.lastIndex = 0
+  let match, index, tokenValue
+  while ((match = tagRE.exec(text))) {
+    index = match.index
+    // push text token
+    if (index > lastIndex) {
+      rawTokens.push(tokenValue = text.slice(lastIndex, index))
+      tokens.push(JSON.stringify(tokenValue))
+    }
+    // tag token
+    const exp = parseFilters(match[1].trim())
+    tokens.push(`_s(${exp})`)
+    rawTokens.push({ '@binding': exp })
+    lastIndex = index + match[0].length
+  }
+  if (lastIndex < text.length) {
+    rawTokens.push(tokenValue = text.slice(lastIndex))
+    tokens.push(JSON.stringify(tokenValue))
+  }
+  return {
+    expression: tokens.join('+'),
+    tokens: rawTokens
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/compiler/to-function.js b/advancedcontentfilter/vendor/asset/vue/src/compiler/to-function.js
new file mode 100644 (file)
index 0000000..7fe0f13
--- /dev/null
@@ -0,0 +1,99 @@
+/* @flow */
+
+import { noop, extend } from 'shared/util'
+import { warn as baseWarn, tip } from 'core/util/debug'
+
+type CompiledFunctionResult = {
+  render: Function;
+  staticRenderFns: Array<Function>;
+};
+
+function createFunction (code, errors) {
+  try {
+    return new Function(code)
+  } catch (err) {
+    errors.push({ err, code })
+    return noop
+  }
+}
+
+export function createCompileToFunctionFn (compile: Function): Function {
+  const cache = Object.create(null)
+
+  return function compileToFunctions (
+    template: string,
+    options?: CompilerOptions,
+    vm?: Component
+  ): CompiledFunctionResult {
+    options = extend({}, options)
+    const warn = options.warn || baseWarn
+    delete options.warn
+
+    /* istanbul ignore if */
+    if (process.env.NODE_ENV !== 'production') {
+      // detect possible CSP restriction
+      try {
+        new Function('return 1')
+      } catch (e) {
+        if (e.toString().match(/unsafe-eval|CSP/)) {
+          warn(
+            'It seems you are using the standalone build of Vue.js in an ' +
+            'environment with Content Security Policy that prohibits unsafe-eval. ' +
+            'The template compiler cannot work in this environment. Consider ' +
+            'relaxing the policy to allow unsafe-eval or pre-compiling your ' +
+            'templates into render functions.'
+          )
+        }
+      }
+    }
+
+    // check cache
+    const key = options.delimiters
+      ? String(options.delimiters) + template
+      : template
+    if (cache[key]) {
+      return cache[key]
+    }
+
+    // compile
+    const compiled = compile(template, options)
+
+    // check compilation errors/tips
+    if (process.env.NODE_ENV !== 'production') {
+      if (compiled.errors && compiled.errors.length) {
+        warn(
+          `Error compiling template:\n\n${template}\n\n` +
+          compiled.errors.map(e => `- ${e}`).join('\n') + '\n',
+          vm
+        )
+      }
+      if (compiled.tips && compiled.tips.length) {
+        compiled.tips.forEach(msg => tip(msg, vm))
+      }
+    }
+
+    // turn code into functions
+    const res = {}
+    const fnGenErrors = []
+    res.render = createFunction(compiled.render, fnGenErrors)
+    res.staticRenderFns = compiled.staticRenderFns.map(code => {
+      return createFunction(code, fnGenErrors)
+    })
+
+    // check function generation errors.
+    // this should only happen if there is a bug in the compiler itself.
+    // mostly for codegen development use
+    /* istanbul ignore if */
+    if (process.env.NODE_ENV !== 'production') {
+      if ((!compiled.errors || !compiled.errors.length) && fnGenErrors.length) {
+        warn(
+          `Failed to generate render function:\n\n` +
+          fnGenErrors.map(({ err, code }) => `${err.toString()} in\n\n${code}\n`).join('\n'),
+          vm
+        )
+      }
+    }
+
+    return (cache[key] = res)
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/core/components/index.js b/advancedcontentfilter/vendor/asset/vue/src/core/components/index.js
new file mode 100644 (file)
index 0000000..5461c76
--- /dev/null
@@ -0,0 +1,5 @@
+import KeepAlive from './keep-alive'
+
+export default {
+  KeepAlive
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/core/components/keep-alive.js b/advancedcontentfilter/vendor/asset/vue/src/core/components/keep-alive.js
new file mode 100644 (file)
index 0000000..fb4cf1e
--- /dev/null
@@ -0,0 +1,124 @@
+/* @flow */
+
+import { isRegExp, remove } from 'shared/util'
+import { getFirstComponentChild } from 'core/vdom/helpers/index'
+
+type VNodeCache = { [key: string]: ?VNode };
+
+function getComponentName (opts: ?VNodeComponentOptions): ?string {
+  return opts && (opts.Ctor.options.name || opts.tag)
+}
+
+function matches (pattern: string | RegExp | Array<string>, name: string): boolean {
+  if (Array.isArray(pattern)) {
+    return pattern.indexOf(name) > -1
+  } else if (typeof pattern === 'string') {
+    return pattern.split(',').indexOf(name) > -1
+  } else if (isRegExp(pattern)) {
+    return pattern.test(name)
+  }
+  /* istanbul ignore next */
+  return false
+}
+
+function pruneCache (keepAliveInstance: any, filter: Function) {
+  const { cache, keys, _vnode } = keepAliveInstance
+  for (const key in cache) {
+    const cachedNode: ?VNode = cache[key]
+    if (cachedNode) {
+      const name: ?string = getComponentName(cachedNode.componentOptions)
+      if (name && !filter(name)) {
+        pruneCacheEntry(cache, key, keys, _vnode)
+      }
+    }
+  }
+}
+
+function pruneCacheEntry (
+  cache: VNodeCache,
+  key: string,
+  keys: Array<string>,
+  current?: VNode
+) {
+  const cached = cache[key]
+  if (cached && (!current || cached.tag !== current.tag)) {
+    cached.componentInstance.$destroy()
+  }
+  cache[key] = null
+  remove(keys, key)
+}
+
+const patternTypes: Array<Function> = [String, RegExp, Array]
+
+export default {
+  name: 'keep-alive',
+  abstract: true,
+
+  props: {
+    include: patternTypes,
+    exclude: patternTypes,
+    max: [String, Number]
+  },
+
+  created () {
+    this.cache = Object.create(null)
+    this.keys = []
+  },
+
+  destroyed () {
+    for (const key in this.cache) {
+      pruneCacheEntry(this.cache, key, this.keys)
+    }
+  },
+
+  mounted () {
+    this.$watch('include', val => {
+      pruneCache(this, name => matches(val, name))
+    })
+    this.$watch('exclude', val => {
+      pruneCache(this, name => !matches(val, name))
+    })
+  },
+
+  render () {
+    const slot = this.$slots.default
+    const vnode: VNode = getFirstComponentChild(slot)
+    const componentOptions: ?VNodeComponentOptions = vnode && vnode.componentOptions
+    if (componentOptions) {
+      // check pattern
+      const name: ?string = getComponentName(componentOptions)
+      const { include, exclude } = this
+      if (
+        // not included
+        (include && (!name || !matches(include, name))) ||
+        // excluded
+        (exclude && name && matches(exclude, name))
+      ) {
+        return vnode
+      }
+
+      const { cache, keys } = this
+      const key: ?string = vnode.key == null
+        // same constructor may get registered as different local components
+        // so cid alone is not enough (#3269)
+        ? componentOptions.Ctor.cid + (componentOptions.tag ? `::${componentOptions.tag}` : '')
+        : vnode.key
+      if (cache[key]) {
+        vnode.componentInstance = cache[key].componentInstance
+        // make current key freshest
+        remove(keys, key)
+        keys.push(key)
+      } else {
+        cache[key] = vnode
+        keys.push(key)
+        // prune oldest entry
+        if (this.max && keys.length > parseInt(this.max)) {
+          pruneCacheEntry(cache, keys[0], keys, this._vnode)
+        }
+      }
+
+      vnode.data.keepAlive = true
+    }
+    return vnode || (slot && slot[0])
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/core/config.js b/advancedcontentfilter/vendor/asset/vue/src/core/config.js
new file mode 100644 (file)
index 0000000..f25f09d
--- /dev/null
@@ -0,0 +1,121 @@
+/* @flow */
+
+import {
+  no,
+  noop,
+  identity
+} from 'shared/util'
+
+import { LIFECYCLE_HOOKS } from 'shared/constants'
+
+export type Config = {
+  // user
+  optionMergeStrategies: { [key: string]: Function };
+  silent: boolean;
+  productionTip: boolean;
+  performance: boolean;
+  devtools: boolean;
+  errorHandler: ?(err: Error, vm: Component, info: string) => void;
+  warnHandler: ?(msg: string, vm: Component, trace: string) => void;
+  ignoredElements: Array<string | RegExp>;
+  keyCodes: { [key: string]: number | Array<number> };
+
+  // platform
+  isReservedTag: (x?: string) => boolean;
+  isReservedAttr: (x?: string) => boolean;
+  parsePlatformTagName: (x: string) => string;
+  isUnknownElement: (x?: string) => boolean;
+  getTagNamespace: (x?: string) => string | void;
+  mustUseProp: (tag: string, type: ?string, name: string) => boolean;
+
+  // legacy
+  _lifecycleHooks: Array<string>;
+};
+
+export default ({
+  /**
+   * Option merge strategies (used in core/util/options)
+   */
+  // $flow-disable-line
+  optionMergeStrategies: Object.create(null),
+
+  /**
+   * Whether to suppress warnings.
+   */
+  silent: false,
+
+  /**
+   * Show production mode tip message on boot?
+   */
+  productionTip: process.env.NODE_ENV !== 'production',
+
+  /**
+   * Whether to enable devtools
+   */
+  devtools: process.env.NODE_ENV !== 'production',
+
+  /**
+   * Whether to record perf
+   */
+  performance: false,
+
+  /**
+   * Error handler for watcher errors
+   */
+  errorHandler: null,
+
+  /**
+   * Warn handler for watcher warns
+   */
+  warnHandler: null,
+
+  /**
+   * Ignore certain custom elements
+   */
+  ignoredElements: [],
+
+  /**
+   * Custom user key aliases for v-on
+   */
+  // $flow-disable-line
+  keyCodes: Object.create(null),
+
+  /**
+   * Check if a tag is reserved so that it cannot be registered as a
+   * component. This is platform-dependent and may be overwritten.
+   */
+  isReservedTag: no,
+
+  /**
+   * Check if an attribute is reserved so that it cannot be used as a component
+   * prop. This is platform-dependent and may be overwritten.
+   */
+  isReservedAttr: no,
+
+  /**
+   * Check if a tag is an unknown element.
+   * Platform-dependent.
+   */
+  isUnknownElement: no,
+
+  /**
+   * Get the namespace of an element
+   */
+  getTagNamespace: noop,
+
+  /**
+   * Parse the real tag name for the specific platform.
+   */
+  parsePlatformTagName: identity,
+
+  /**
+   * Check if an attribute must be bound using property, e.g. value
+   * Platform-dependent.
+   */
+  mustUseProp: no,
+
+  /**
+   * Exposed for legacy reasons
+   */
+  _lifecycleHooks: LIFECYCLE_HOOKS
+}: Config)
diff --git a/advancedcontentfilter/vendor/asset/vue/src/core/global-api/assets.js b/advancedcontentfilter/vendor/asset/vue/src/core/global-api/assets.js
new file mode 100644 (file)
index 0000000..d975a6a
--- /dev/null
@@ -0,0 +1,34 @@
+/* @flow */
+
+import { ASSET_TYPES } from 'shared/constants'
+import { isPlainObject, validateComponentName } from '../util/index'
+
+export function initAssetRegisters (Vue: GlobalAPI) {
+  /**
+   * Create asset registration methods.
+   */
+  ASSET_TYPES.forEach(type => {
+    Vue[type] = function (
+      id: string,
+      definition: Function | Object
+    ): Function | Object | void {
+      if (!definition) {
+        return this.options[type + 's'][id]
+      } else {
+        /* istanbul ignore if */
+        if (process.env.NODE_ENV !== 'production' && type === 'component') {
+          validateComponentName(id)
+        }
+        if (type === 'component' && isPlainObject(definition)) {
+          definition.name = definition.name || id
+          definition = this.options._base.extend(definition)
+        }
+        if (type === 'directive' && typeof definition === 'function') {
+          definition = { bind: definition, update: definition }
+        }
+        this.options[type + 's'][id] = definition
+        return definition
+      }
+    }
+  })
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/core/global-api/extend.js b/advancedcontentfilter/vendor/asset/vue/src/core/global-api/extend.js
new file mode 100644 (file)
index 0000000..c1bbda3
--- /dev/null
@@ -0,0 +1,95 @@
+/* @flow */
+
+import { ASSET_TYPES } from 'shared/constants'
+import { defineComputed, proxy } from '../instance/state'
+import { extend, mergeOptions, validateComponentName } from '../util/index'
+
+export function initExtend (Vue: GlobalAPI) {
+  /**
+   * Each instance constructor, including Vue, has a unique
+   * cid. This enables us to create wrapped "child
+   * constructors" for prototypal inheritance and cache them.
+   */
+  Vue.cid = 0
+  let cid = 1
+
+  /**
+   * Class inheritance
+   */
+  Vue.extend = function (extendOptions: Object): Function {
+    extendOptions = extendOptions || {}
+    const Super = this
+    const SuperId = Super.cid
+    const cachedCtors = extendOptions._Ctor || (extendOptions._Ctor = {})
+    if (cachedCtors[SuperId]) {
+      return cachedCtors[SuperId]
+    }
+
+    const name = extendOptions.name || Super.options.name
+    if (process.env.NODE_ENV !== 'production' && name) {
+      validateComponentName(name)
+    }
+
+    const Sub = function VueComponent (options) {
+      this._init(options)
+    }
+    Sub.prototype = Object.create(Super.prototype)
+    Sub.prototype.constructor = Sub
+    Sub.cid = cid++
+    Sub.options = mergeOptions(
+      Super.options,
+      extendOptions
+    )
+    Sub['super'] = Super
+
+    // For props and computed properties, we define the proxy getters on
+    // the Vue instances at extension time, on the extended prototype. This
+    // avoids Object.defineProperty calls for each instance created.
+    if (Sub.options.props) {
+      initProps(Sub)
+    }
+    if (Sub.options.computed) {
+      initComputed(Sub)
+    }
+
+    // allow further extension/mixin/plugin usage
+    Sub.extend = Super.extend
+    Sub.mixin = Super.mixin
+    Sub.use = Super.use
+
+    // create asset registers, so extended classes
+    // can have their private assets too.
+    ASSET_TYPES.forEach(function (type) {
+      Sub[type] = Super[type]
+    })
+    // enable recursive self-lookup
+    if (name) {
+      Sub.options.components[name] = Sub
+    }
+
+    // keep a reference to the super options at extension time.
+    // later at instantiation we can check if Super's options have
+    // been updated.
+    Sub.superOptions = Super.options
+    Sub.extendOptions = extendOptions
+    Sub.sealedOptions = extend({}, Sub.options)
+
+    // cache constructor
+    cachedCtors[SuperId] = Sub
+    return Sub
+  }
+}
+
+function initProps (Comp) {
+  const props = Comp.options.props
+  for (const key in props) {
+    proxy(Comp.prototype, `_props`, key)
+  }
+}
+
+function initComputed (Comp) {
+  const computed = Comp.options.computed
+  for (const key in computed) {
+    defineComputed(Comp.prototype, key, computed[key])
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/core/global-api/index.js b/advancedcontentfilter/vendor/asset/vue/src/core/global-api/index.js
new file mode 100644 (file)
index 0000000..03ffa0f
--- /dev/null
@@ -0,0 +1,62 @@
+/* @flow */
+
+import config from '../config'
+import { initUse } from './use'
+import { initMixin } from './mixin'
+import { initExtend } from './extend'
+import { initAssetRegisters } from './assets'
+import { set, del } from '../observer/index'
+import { ASSET_TYPES } from 'shared/constants'
+import builtInComponents from '../components/index'
+
+import {
+  warn,
+  extend,
+  nextTick,
+  mergeOptions,
+  defineReactive
+} from '../util/index'
+
+export function initGlobalAPI (Vue: GlobalAPI) {
+  // config
+  const configDef = {}
+  configDef.get = () => config
+  if (process.env.NODE_ENV !== 'production') {
+    configDef.set = () => {
+      warn(
+        'Do not replace the Vue.config object, set individual fields instead.'
+      )
+    }
+  }
+  Object.defineProperty(Vue, 'config', configDef)
+
+  // exposed util methods.
+  // NOTE: these are not considered part of the public API - avoid relying on
+  // them unless you are aware of the risk.
+  Vue.util = {
+    warn,
+    extend,
+    mergeOptions,
+    defineReactive
+  }
+
+  Vue.set = set
+  Vue.delete = del
+  Vue.nextTick = nextTick
+
+  Vue.options = Object.create(null)
+  ASSET_TYPES.forEach(type => {
+    Vue.options[type + 's'] = Object.create(null)
+  })
+
+  // this is used to identify the "base" constructor to extend all plain-object
+  // components with in Weex's multi-instance scenarios.
+  Vue.options._base = Vue
+
+  extend(Vue.options.components, builtInComponents)
+
+  initUse(Vue)
+  initMixin(Vue)
+  initExtend(Vue)
+  initAssetRegisters(Vue)
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/core/global-api/mixin.js b/advancedcontentfilter/vendor/asset/vue/src/core/global-api/mixin.js
new file mode 100644 (file)
index 0000000..36017a3
--- /dev/null
@@ -0,0 +1,10 @@
+/* @flow */
+
+import { mergeOptions } from '../util/index'
+
+export function initMixin (Vue: GlobalAPI) {
+  Vue.mixin = function (mixin: Object) {
+    this.options = mergeOptions(this.options, mixin)
+    return this
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/core/global-api/use.js b/advancedcontentfilter/vendor/asset/vue/src/core/global-api/use.js
new file mode 100644 (file)
index 0000000..a5b6998
--- /dev/null
@@ -0,0 +1,23 @@
+/* @flow */
+
+import { toArray } from '../util/index'
+
+export function initUse (Vue: GlobalAPI) {
+  Vue.use = function (plugin: Function | Object) {
+    const installedPlugins = (this._installedPlugins || (this._installedPlugins = []))
+    if (installedPlugins.indexOf(plugin) > -1) {
+      return this
+    }
+
+    // additional parameters
+    const args = toArray(arguments, 1)
+    args.unshift(this)
+    if (typeof plugin.install === 'function') {
+      plugin.install.apply(plugin, args)
+    } else if (typeof plugin === 'function') {
+      plugin.apply(null, args)
+    }
+    installedPlugins.push(plugin)
+    return this
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/core/index.js b/advancedcontentfilter/vendor/asset/vue/src/core/index.js
new file mode 100644 (file)
index 0000000..daf6203
--- /dev/null
@@ -0,0 +1,26 @@
+import Vue from './instance/index'
+import { initGlobalAPI } from './global-api/index'
+import { isServerRendering } from 'core/util/env'
+import { FunctionalRenderContext } from 'core/vdom/create-functional-component'
+
+initGlobalAPI(Vue)
+
+Object.defineProperty(Vue.prototype, '$isServer', {
+  get: isServerRendering
+})
+
+Object.defineProperty(Vue.prototype, '$ssrContext', {
+  get () {
+    /* istanbul ignore next */
+    return this.$vnode && this.$vnode.ssrContext
+  }
+})
+
+// expose FunctionalRenderContext for ssr runtime helper installation
+Object.defineProperty(Vue, 'FunctionalRenderContext', {
+  value: FunctionalRenderContext
+})
+
+Vue.version = '__VERSION__'
+
+export default Vue
diff --git a/advancedcontentfilter/vendor/asset/vue/src/core/instance/events.js b/advancedcontentfilter/vendor/asset/vue/src/core/instance/events.js
new file mode 100644 (file)
index 0000000..5877999
--- /dev/null
@@ -0,0 +1,142 @@
+/* @flow */
+
+import {
+  tip,
+  toArray,
+  hyphenate,
+  handleError,
+  formatComponentName
+} from '../util/index'
+import { updateListeners } from '../vdom/helpers/index'
+
+export function initEvents (vm: Component) {
+  vm._events = Object.create(null)
+  vm._hasHookEvent = false
+  // init parent attached events
+  const listeners = vm.$options._parentListeners
+  if (listeners) {
+    updateComponentListeners(vm, listeners)
+  }
+}
+
+let target: any
+
+function add (event, fn, once) {
+  if (once) {
+    target.$once(event, fn)
+  } else {
+    target.$on(event, fn)
+  }
+}
+
+function remove (event, fn) {
+  target.$off(event, fn)
+}
+
+export function updateComponentListeners (
+  vm: Component,
+  listeners: Object,
+  oldListeners: ?Object
+) {
+  target = vm
+  updateListeners(listeners, oldListeners || {}, add, remove, vm)
+  target = undefined
+}
+
+export function eventsMixin (Vue: Class<Component>) {
+  const hookRE = /^hook:/
+  Vue.prototype.$on = function (event: string | Array<string>, fn: Function): Component {
+    const vm: Component = this
+    if (Array.isArray(event)) {
+      for (let i = 0, l = event.length; i < l; i++) {
+        this.$on(event[i], fn)
+      }
+    } else {
+      (vm._events[event] || (vm._events[event] = [])).push(fn)
+      // optimize hook:event cost by using a boolean flag marked at registration
+      // instead of a hash lookup
+      if (hookRE.test(event)) {
+        vm._hasHookEvent = true
+      }
+    }
+    return vm
+  }
+
+  Vue.prototype.$once = function (event: string, fn: Function): Component {
+    const vm: Component = this
+    function on () {
+      vm.$off(event, on)
+      fn.apply(vm, arguments)
+    }
+    on.fn = fn
+    vm.$on(event, on)
+    return vm
+  }
+
+  Vue.prototype.$off = function (event?: string | Array<string>, fn?: Function): Component {
+    const vm: Component = this
+    // all
+    if (!arguments.length) {
+      vm._events = Object.create(null)
+      return vm
+    }
+    // array of events
+    if (Array.isArray(event)) {
+      for (let i = 0, l = event.length; i < l; i++) {
+        this.$off(event[i], fn)
+      }
+      return vm
+    }
+    // specific event
+    const cbs = vm._events[event]
+    if (!cbs) {
+      return vm
+    }
+    if (!fn) {
+      vm._events[event] = null
+      return vm
+    }
+    if (fn) {
+      // specific handler
+      let cb
+      let i = cbs.length
+      while (i--) {
+        cb = cbs[i]
+        if (cb === fn || cb.fn === fn) {
+          cbs.splice(i, 1)
+          break
+        }
+      }
+    }
+    return vm
+  }
+
+  Vue.prototype.$emit = function (event: string): Component {
+    const vm: Component = this
+    if (process.env.NODE_ENV !== 'production') {
+      const lowerCaseEvent = event.toLowerCase()
+      if (lowerCaseEvent !== event && vm._events[lowerCaseEvent]) {
+        tip(
+          `Event "${lowerCaseEvent}" is emitted in component ` +
+          `${formatComponentName(vm)} but the handler is registered for "${event}". ` +
+          `Note that HTML attributes are case-insensitive and you cannot use ` +
+          `v-on to listen to camelCase events when using in-DOM templates. ` +
+          `You should probably use "${hyphenate(event)}" instead of "${event}".`
+        )
+      }
+    }
+    let cbs = vm._events[event]
+    if (cbs) {
+      cbs = cbs.length > 1 ? toArray(cbs) : cbs
+      const args = toArray(arguments, 1)
+      for (let i = 0, l = cbs.length; i < l; i++) {
+        try {
+          cbs[i].apply(vm, args)
+        } catch (e) {
+          handleError(e, vm, `event handler for "${event}"`)
+        }
+      }
+    }
+    return vm
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/core/instance/index.js b/advancedcontentfilter/vendor/asset/vue/src/core/instance/index.js
new file mode 100644 (file)
index 0000000..8a44023
--- /dev/null
@@ -0,0 +1,23 @@
+import { initMixin } from './init'
+import { stateMixin } from './state'
+import { renderMixin } from './render'
+import { eventsMixin } from './events'
+import { lifecycleMixin } from './lifecycle'
+import { warn } from '../util/index'
+
+function Vue (options) {
+  if (process.env.NODE_ENV !== 'production' &&
+    !(this instanceof Vue)
+  ) {
+    warn('Vue is a constructor and should be called with the `new` keyword')
+  }
+  this._init(options)
+}
+
+initMixin(Vue)
+stateMixin(Vue)
+eventsMixin(Vue)
+lifecycleMixin(Vue)
+renderMixin(Vue)
+
+export default Vue
diff --git a/advancedcontentfilter/vendor/asset/vue/src/core/instance/init.js b/advancedcontentfilter/vendor/asset/vue/src/core/instance/init.js
new file mode 100644 (file)
index 0000000..ed2550d
--- /dev/null
@@ -0,0 +1,150 @@
+/* @flow */
+
+import config from '../config'
+import { initProxy } from './proxy'
+import { initState } from './state'
+import { initRender } from './render'
+import { initEvents } from './events'
+import { mark, measure } from '../util/perf'
+import { initLifecycle, callHook } from './lifecycle'
+import { initProvide, initInjections } from './inject'
+import { extend, mergeOptions, formatComponentName } from '../util/index'
+
+let uid = 0
+
+export function initMixin (Vue: Class<Component>) {
+  Vue.prototype._init = function (options?: Object) {
+    const vm: Component = this
+    // a uid
+    vm._uid = uid++
+
+    let startTag, endTag
+    /* istanbul ignore if */
+    if (process.env.NODE_ENV !== 'production' && config.performance && mark) {
+      startTag = `vue-perf-start:${vm._uid}`
+      endTag = `vue-perf-end:${vm._uid}`
+      mark(startTag)
+    }
+
+    // a flag to avoid this being observed
+    vm._isVue = true
+    // merge options
+    if (options && options._isComponent) {
+      // optimize internal component instantiation
+      // since dynamic options merging is pretty slow, and none of the
+      // internal component options needs special treatment.
+      initInternalComponent(vm, options)
+    } else {
+      vm.$options = mergeOptions(
+        resolveConstructorOptions(vm.constructor),
+        options || {},
+        vm
+      )
+    }
+    /* istanbul ignore else */
+    if (process.env.NODE_ENV !== 'production') {
+      initProxy(vm)
+    } else {
+      vm._renderProxy = vm
+    }
+    // expose real self
+    vm._self = vm
+    initLifecycle(vm)
+    initEvents(vm)
+    initRender(vm)
+    callHook(vm, 'beforeCreate')
+    initInjections(vm) // resolve injections before data/props
+    initState(vm)
+    initProvide(vm) // resolve provide after data/props
+    callHook(vm, 'created')
+
+    /* istanbul ignore if */
+    if (process.env.NODE_ENV !== 'production' && config.performance && mark) {
+      vm._name = formatComponentName(vm, false)
+      mark(endTag)
+      measure(`vue ${vm._name} init`, startTag, endTag)
+    }
+
+    if (vm.$options.el) {
+      vm.$mount(vm.$options.el)
+    }
+  }
+}
+
+export function initInternalComponent (vm: Component, options: InternalComponentOptions) {
+  const opts = vm.$options = Object.create(vm.constructor.options)
+  // doing this because it's faster than dynamic enumeration.
+  const parentVnode = options._parentVnode
+  opts.parent = options.parent
+  opts._parentVnode = parentVnode
+  opts._parentElm = options._parentElm
+  opts._refElm = options._refElm
+
+  const vnodeComponentOptions = parentVnode.componentOptions
+  opts.propsData = vnodeComponentOptions.propsData
+  opts._parentListeners = vnodeComponentOptions.listeners
+  opts._renderChildren = vnodeComponentOptions.children
+  opts._componentTag = vnodeComponentOptions.tag
+
+  if (options.render) {
+    opts.render = options.render
+    opts.staticRenderFns = options.staticRenderFns
+  }
+}
+
+export function resolveConstructorOptions (Ctor: Class<Component>) {
+  let options = Ctor.options
+  if (Ctor.super) {
+    const superOptions = resolveConstructorOptions(Ctor.super)
+    const cachedSuperOptions = Ctor.superOptions
+    if (superOptions !== cachedSuperOptions) {
+      // super option changed,
+      // need to resolve new options.
+      Ctor.superOptions = superOptions
+      // check if there are any late-modified/attached options (#4976)
+      const modifiedOptions = resolveModifiedOptions(Ctor)
+      // update base extend options
+      if (modifiedOptions) {
+        extend(Ctor.extendOptions, modifiedOptions)
+      }
+      options = Ctor.options = mergeOptions(superOptions, Ctor.extendOptions)
+      if (options.name) {
+        options.components[options.name] = Ctor
+      }
+    }
+  }
+  return options
+}
+
+function resolveModifiedOptions (Ctor: Class<Component>): ?Object {
+  let modified
+  const latest = Ctor.options
+  const extended = Ctor.extendOptions
+  const sealed = Ctor.sealedOptions
+  for (const key in latest) {
+    if (latest[key] !== sealed[key]) {
+      if (!modified) modified = {}
+      modified[key] = dedupe(latest[key], extended[key], sealed[key])
+    }
+  }
+  return modified
+}
+
+function dedupe (latest, extended, sealed) {
+  // compare latest and sealed to ensure lifecycle hooks won't be duplicated
+  // between merges
+  if (Array.isArray(latest)) {
+    const res = []
+    sealed = Array.isArray(sealed) ? sealed : [sealed]
+    extended = Array.isArray(extended) ? extended : [extended]
+    for (let i = 0; i < latest.length; i++) {
+      // push original options and not sealed options to exclude duplicated options
+      if (extended.indexOf(latest[i]) >= 0 || sealed.indexOf(latest[i]) < 0) {
+        res.push(latest[i])
+      }
+    }
+    return res
+  } else {
+    return latest
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/core/instance/inject.js b/advancedcontentfilter/vendor/asset/vue/src/core/instance/inject.js
new file mode 100644 (file)
index 0000000..e464e12
--- /dev/null
@@ -0,0 +1,74 @@
+/* @flow */
+
+import { hasOwn } from 'shared/util'
+import { warn, hasSymbol } from '../util/index'
+import { defineReactive, toggleObserving } from '../observer/index'
+
+export function initProvide (vm: Component) {
+  const provide = vm.$options.provide
+  if (provide) {
+    vm._provided = typeof provide === 'function'
+      ? provide.call(vm)
+      : provide
+  }
+}
+
+export function initInjections (vm: Component) {
+  const result = resolveInject(vm.$options.inject, vm)
+  if (result) {
+    toggleObserving(false)
+    Object.keys(result).forEach(key => {
+      /* istanbul ignore else */
+      if (process.env.NODE_ENV !== 'production') {
+        defineReactive(vm, key, result[key], () => {
+          warn(
+            `Avoid mutating an injected value directly since the changes will be ` +
+            `overwritten whenever the provided component re-renders. ` +
+            `injection being mutated: "${key}"`,
+            vm
+          )
+        })
+      } else {
+        defineReactive(vm, key, result[key])
+      }
+    })
+    toggleObserving(true)
+  }
+}
+
+export function resolveInject (inject: any, vm: Component): ?Object {
+  if (inject) {
+    // inject is :any because flow is not smart enough to figure out cached
+    const result = Object.create(null)
+    const keys = hasSymbol
+      ? Reflect.ownKeys(inject).filter(key => {
+        /* istanbul ignore next */
+        return Object.getOwnPropertyDescriptor(inject, key).enumerable
+      })
+      : Object.keys(inject)
+
+    for (let i = 0; i < keys.length; i++) {
+      const key = keys[i]
+      const provideKey = inject[key].from
+      let source = vm
+      while (source) {
+        if (source._provided && hasOwn(source._provided, provideKey)) {
+          result[key] = source._provided[provideKey]
+          break
+        }
+        source = source.$parent
+      }
+      if (!source) {
+        if ('default' in inject[key]) {
+          const provideDefault = inject[key].default
+          result[key] = typeof provideDefault === 'function'
+            ? provideDefault.call(vm)
+            : provideDefault
+        } else if (process.env.NODE_ENV !== 'production') {
+          warn(`Injection "${key}" not found`, vm)
+        }
+      }
+    }
+    return result
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/core/instance/lifecycle.js b/advancedcontentfilter/vendor/asset/vue/src/core/instance/lifecycle.js
new file mode 100644 (file)
index 0000000..169a54a
--- /dev/null
@@ -0,0 +1,336 @@
+/* @flow */
+
+import config from '../config'
+import Watcher from '../observer/watcher'
+import { mark, measure } from '../util/perf'
+import { createEmptyVNode } from '../vdom/vnode'
+import { updateComponentListeners } from './events'
+import { resolveSlots } from './render-helpers/resolve-slots'
+import { toggleObserving } from '../observer/index'
+import { pushTarget, popTarget } from '../observer/dep'
+
+import {
+  warn,
+  noop,
+  remove,
+  handleError,
+  emptyObject,
+  validateProp
+} from '../util/index'
+
+export let activeInstance: any = null
+export let isUpdatingChildComponent: boolean = false
+
+export function initLifecycle (vm: Component) {
+  const options = vm.$options
+
+  // locate first non-abstract parent
+  let parent = options.parent
+  if (parent && !options.abstract) {
+    while (parent.$options.abstract && parent.$parent) {
+      parent = parent.$parent
+    }
+    parent.$children.push(vm)
+  }
+
+  vm.$parent = parent
+  vm.$root = parent ? parent.$root : vm
+
+  vm.$children = []
+  vm.$refs = {}
+
+  vm._watcher = null
+  vm._inactive = null
+  vm._directInactive = false
+  vm._isMounted = false
+  vm._isDestroyed = false
+  vm._isBeingDestroyed = false
+}
+
+export function lifecycleMixin (Vue: Class<Component>) {
+  Vue.prototype._update = function (vnode: VNode, hydrating?: boolean) {
+    const vm: Component = this
+    if (vm._isMounted) {
+      callHook(vm, 'beforeUpdate')
+    }
+    const prevEl = vm.$el
+    const prevVnode = vm._vnode
+    const prevActiveInstance = activeInstance
+    activeInstance = vm
+    vm._vnode = vnode
+    // Vue.prototype.__patch__ is injected in entry points
+    // based on the rendering backend used.
+    if (!prevVnode) {
+      // initial render
+      vm.$el = vm.__patch__(
+        vm.$el, vnode, hydrating, false /* removeOnly */,
+        vm.$options._parentElm,
+        vm.$options._refElm
+      )
+      // no need for the ref nodes after initial patch
+      // this prevents keeping a detached DOM tree in memory (#5851)
+      vm.$options._parentElm = vm.$options._refElm = null
+    } else {
+      // updates
+      vm.$el = vm.__patch__(prevVnode, vnode)
+    }
+    activeInstance = prevActiveInstance
+    // update __vue__ reference
+    if (prevEl) {
+      prevEl.__vue__ = null
+    }
+    if (vm.$el) {
+      vm.$el.__vue__ = vm
+    }
+    // if parent is an HOC, update its $el as well
+    if (vm.$vnode && vm.$parent && vm.$vnode === vm.$parent._vnode) {
+      vm.$parent.$el = vm.$el
+    }
+    // updated hook is called by the scheduler to ensure that children are
+    // updated in a parent's updated hook.
+  }
+
+  Vue.prototype.$forceUpdate = function () {
+    const vm: Component = this
+    if (vm._watcher) {
+      vm._watcher.update()
+    }
+  }
+
+  Vue.prototype.$destroy = function () {
+    const vm: Component = this
+    if (vm._isBeingDestroyed) {
+      return
+    }
+    callHook(vm, 'beforeDestroy')
+    vm._isBeingDestroyed = true
+    // remove self from parent
+    const parent = vm.$parent
+    if (parent && !parent._isBeingDestroyed && !vm.$options.abstract) {
+      remove(parent.$children, vm)
+    }
+    // teardown watchers
+    if (vm._watcher) {
+      vm._watcher.teardown()
+    }
+    let i = vm._watchers.length
+    while (i--) {
+      vm._watchers[i].teardown()
+    }
+    // remove reference from data ob
+    // frozen object may not have observer.
+    if (vm._data.__ob__) {
+      vm._data.__ob__.vmCount--
+    }
+    // call the last hook...
+    vm._isDestroyed = true
+    // invoke destroy hooks on current rendered tree
+    vm.__patch__(vm._vnode, null)
+    // fire destroyed hook
+    callHook(vm, 'destroyed')
+    // turn off all instance listeners.
+    vm.$off()
+    // remove __vue__ reference
+    if (vm.$el) {
+      vm.$el.__vue__ = null
+    }
+    // release circular reference (#6759)
+    if (vm.$vnode) {
+      vm.$vnode.parent = null
+    }
+  }
+}
+
+export function mountComponent (
+  vm: Component,
+  el: ?Element,
+  hydrating?: boolean
+): Component {
+  vm.$el = el
+  if (!vm.$options.render) {
+    vm.$options.render = createEmptyVNode
+    if (process.env.NODE_ENV !== 'production') {
+      /* istanbul ignore if */
+      if ((vm.$options.template && vm.$options.template.charAt(0) !== '#') ||
+        vm.$options.el || el) {
+        warn(
+          'You are using the runtime-only build of Vue where the template ' +
+          'compiler is not available. Either pre-compile the templates into ' +
+          'render functions, or use the compiler-included build.',
+          vm
+        )
+      } else {
+        warn(
+          'Failed to mount component: template or render function not defined.',
+          vm
+        )
+      }
+    }
+  }
+  callHook(vm, 'beforeMount')
+
+  let updateComponent
+  /* istanbul ignore if */
+  if (process.env.NODE_ENV !== 'production' && config.performance && mark) {
+    updateComponent = () => {
+      const name = vm._name
+      const id = vm._uid
+      const startTag = `vue-perf-start:${id}`
+      const endTag = `vue-perf-end:${id}`
+
+      mark(startTag)
+      const vnode = vm._render()
+      mark(endTag)
+      measure(`vue ${name} render`, startTag, endTag)
+
+      mark(startTag)
+      vm._update(vnode, hydrating)
+      mark(endTag)
+      measure(`vue ${name} patch`, startTag, endTag)
+    }
+  } else {
+    updateComponent = () => {
+      vm._update(vm._render(), hydrating)
+    }
+  }
+
+  // we set this to vm._watcher inside the watcher's constructor
+  // since the watcher's initial patch may call $forceUpdate (e.g. inside child
+  // component's mounted hook), which relies on vm._watcher being already defined
+  new Watcher(vm, updateComponent, noop, null, true /* isRenderWatcher */)
+  hydrating = false
+
+  // manually mounted instance, call mounted on self
+  // mounted is called for render-created child components in its inserted hook
+  if (vm.$vnode == null) {
+    vm._isMounted = true
+    callHook(vm, 'mounted')
+  }
+  return vm
+}
+
+export function updateChildComponent (
+  vm: Component,
+  propsData: ?Object,
+  listeners: ?Object,
+  parentVnode: MountedComponentVNode,
+  renderChildren: ?Array<VNode>
+) {
+  if (process.env.NODE_ENV !== 'production') {
+    isUpdatingChildComponent = true
+  }
+
+  // determine whether component has slot children
+  // we need to do this before overwriting $options._renderChildren
+  const hasChildren = !!(
+    renderChildren ||               // has new static slots
+    vm.$options._renderChildren ||  // has old static slots
+    parentVnode.data.scopedSlots || // has new scoped slots
+    vm.$scopedSlots !== emptyObject // has old scoped slots
+  )
+
+  vm.$options._parentVnode = parentVnode
+  vm.$vnode = parentVnode // update vm's placeholder node without re-render
+
+  if (vm._vnode) { // update child tree's parent
+    vm._vnode.parent = parentVnode
+  }
+  vm.$options._renderChildren = renderChildren
+
+  // update $attrs and $listeners hash
+  // these are also reactive so they may trigger child update if the child
+  // used them during render
+  vm.$attrs = parentVnode.data.attrs || emptyObject
+  vm.$listeners = listeners || emptyObject
+
+  // update props
+  if (propsData && vm.$options.props) {
+    toggleObserving(false)
+    const props = vm._props
+    const propKeys = vm.$options._propKeys || []
+    for (let i = 0; i < propKeys.length; i++) {
+      const key = propKeys[i]
+      const propOptions: any = vm.$options.props // wtf flow?
+      props[key] = validateProp(key, propOptions, propsData, vm)
+    }
+    toggleObserving(true)
+    // keep a copy of raw propsData
+    vm.$options.propsData = propsData
+  }
+
+  // update listeners
+  listeners = listeners || emptyObject
+  const oldListeners = vm.$options._parentListeners
+  vm.$options._parentListeners = listeners
+  updateComponentListeners(vm, listeners, oldListeners)
+
+  // resolve slots + force update if has children
+  if (hasChildren) {
+    vm.$slots = resolveSlots(renderChildren, parentVnode.context)
+    vm.$forceUpdate()
+  }
+
+  if (process.env.NODE_ENV !== 'production') {
+    isUpdatingChildComponent = false
+  }
+}
+
+function isInInactiveTree (vm) {
+  while (vm && (vm = vm.$parent)) {
+    if (vm._inactive) return true
+  }
+  return false
+}
+
+export function activateChildComponent (vm: Component, direct?: boolean) {
+  if (direct) {
+    vm._directInactive = false
+    if (isInInactiveTree(vm)) {
+      return
+    }
+  } else if (vm._directInactive) {
+    return
+  }
+  if (vm._inactive || vm._inactive === null) {
+    vm._inactive = false
+    for (let i = 0; i < vm.$children.length; i++) {
+      activateChildComponent(vm.$children[i])
+    }
+    callHook(vm, 'activated')
+  }
+}
+
+export function deactivateChildComponent (vm: Component, direct?: boolean) {
+  if (direct) {
+    vm._directInactive = true
+    if (isInInactiveTree(vm)) {
+      return
+    }
+  }
+  if (!vm._inactive) {
+    vm._inactive = true
+    for (let i = 0; i < vm.$children.length; i++) {
+      deactivateChildComponent(vm.$children[i])
+    }
+    callHook(vm, 'deactivated')
+  }
+}
+
+export function callHook (vm: Component, hook: string) {
+  // #7573 disable dep collection when invoking lifecycle hooks
+  pushTarget()
+  const handlers = vm.$options[hook]
+  if (handlers) {
+    for (let i = 0, j = handlers.length; i < j; i++) {
+      try {
+        handlers[i].call(vm)
+      } catch (e) {
+        handleError(e, vm, `${hook} hook`)
+      }
+    }
+  }
+  if (vm._hasHookEvent) {
+    vm.$emit('hook:' + hook)
+  }
+  popTarget()
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/core/instance/proxy.js b/advancedcontentfilter/vendor/asset/vue/src/core/instance/proxy.js
new file mode 100644 (file)
index 0000000..0d6dcf8
--- /dev/null
@@ -0,0 +1,79 @@
+/* not type checking this file because flow doesn't play well with Proxy */
+
+import config from 'core/config'
+import { warn, makeMap, isNative } from '../util/index'
+
+let initProxy
+
+if (process.env.NODE_ENV !== 'production') {
+  const allowedGlobals = makeMap(
+    'Infinity,undefined,NaN,isFinite,isNaN,' +
+    'parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,' +
+    'Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,' +
+    'require' // for Webpack/Browserify
+  )
+
+  const warnNonPresent = (target, key) => {
+    warn(
+      `Property or method "${key}" is not defined on the instance but ` +
+      'referenced during render. Make sure that this property is reactive, ' +
+      'either in the data option, or for class-based components, by ' +
+      'initializing the property. ' +
+      'See: https://vuejs.org/v2/guide/reactivity.html#Declaring-Reactive-Properties.',
+      target
+    )
+  }
+
+  const hasProxy =
+    typeof Proxy !== 'undefined' && isNative(Proxy)
+
+  if (hasProxy) {
+    const isBuiltInModifier = makeMap('stop,prevent,self,ctrl,shift,alt,meta,exact')
+    config.keyCodes = new Proxy(config.keyCodes, {
+      set (target, key, value) {
+        if (isBuiltInModifier(key)) {
+          warn(`Avoid overwriting built-in modifier in config.keyCodes: .${key}`)
+          return false
+        } else {
+          target[key] = value
+          return true
+        }
+      }
+    })
+  }
+
+  const hasHandler = {
+    has (target, key) {
+      const has = key in target
+      const isAllowed = allowedGlobals(key) || key.charAt(0) === '_'
+      if (!has && !isAllowed) {
+        warnNonPresent(target, key)
+      }
+      return has || !isAllowed
+    }
+  }
+
+  const getHandler = {
+    get (target, key) {
+      if (typeof key === 'string' && !(key in target)) {
+        warnNonPresent(target, key)
+      }
+      return target[key]
+    }
+  }
+
+  initProxy = function initProxy (vm) {
+    if (hasProxy) {
+      // determine which proxy handler to use
+      const options = vm.$options
+      const handlers = options.render && options.render._withStripped
+        ? getHandler
+        : hasHandler
+      vm._renderProxy = new Proxy(vm, handlers)
+    } else {
+      vm._renderProxy = vm
+    }
+  }
+}
+
+export { initProxy }
diff --git a/advancedcontentfilter/vendor/asset/vue/src/core/instance/render-helpers/bind-object-listeners.js b/advancedcontentfilter/vendor/asset/vue/src/core/instance/render-helpers/bind-object-listeners.js
new file mode 100644 (file)
index 0000000..5bfc751
--- /dev/null
@@ -0,0 +1,22 @@
+/* @flow */
+
+import { warn, extend, isPlainObject } from 'core/util/index'
+
+export function bindObjectListeners (data: any, value: any): VNodeData {
+  if (value) {
+    if (!isPlainObject(value)) {
+      process.env.NODE_ENV !== 'production' && warn(
+        'v-on without argument expects an Object value',
+        this
+      )
+    } else {
+      const on = data.on = data.on ? extend({}, data.on) : {}
+      for (const key in value) {
+        const existing = on[key]
+        const ours = value[key]
+        on[key] = existing ? [].concat(existing, ours) : ours
+      }
+    }
+  }
+  return data
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/core/instance/render-helpers/bind-object-props.js b/advancedcontentfilter/vendor/asset/vue/src/core/instance/render-helpers/bind-object-props.js
new file mode 100644 (file)
index 0000000..c71dce5
--- /dev/null
@@ -0,0 +1,60 @@
+/* @flow */
+
+import config from 'core/config'
+
+import {
+  warn,
+  isObject,
+  toObject,
+  isReservedAttribute
+} from 'core/util/index'
+
+/**
+ * Runtime helper for merging v-bind="object" into a VNode's data.
+ */
+export function bindObjectProps (
+  data: any,
+  tag: string,
+  value: any,
+  asProp: boolean,
+  isSync?: boolean
+): VNodeData {
+  if (value) {
+    if (!isObject(value)) {
+      process.env.NODE_ENV !== 'production' && warn(
+        'v-bind without argument expects an Object or Array value',
+        this
+      )
+    } else {
+      if (Array.isArray(value)) {
+        value = toObject(value)
+      }
+      let hash
+      for (const key in value) {
+        if (
+          key === 'class' ||
+          key === 'style' ||
+          isReservedAttribute(key)
+        ) {
+          hash = data
+        } else {
+          const type = data.attrs && data.attrs.type
+          hash = asProp || config.mustUseProp(tag, type, key)
+            ? data.domProps || (data.domProps = {})
+            : data.attrs || (data.attrs = {})
+        }
+        if (!(key in hash)) {
+          hash[key] = value[key]
+
+          if (isSync) {
+            const on = data.on || (data.on = {})
+            on[`update:${key}`] = function ($event) {
+              value[key] = $event
+            }
+          }
+        }
+      }
+    }
+  }
+  return data
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/core/instance/render-helpers/check-keycodes.js b/advancedcontentfilter/vendor/asset/vue/src/core/instance/render-helpers/check-keycodes.js
new file mode 100644 (file)
index 0000000..c12402b
--- /dev/null
@@ -0,0 +1,34 @@
+/* @flow */
+
+import config from 'core/config'
+import { hyphenate } from 'shared/util'
+
+function isKeyNotMatch<T> (expect: T | Array<T>, actual: T): boolean {
+  if (Array.isArray(expect)) {
+    return expect.indexOf(actual) === -1
+  } else {
+    return expect !== actual
+  }
+}
+
+/**
+ * Runtime helper for checking keyCodes from config.
+ * exposed as Vue.prototype._k
+ * passing in eventKeyName as last argument separately for backwards compat
+ */
+export function checkKeyCodes (
+  eventKeyCode: number,
+  key: string,
+  builtInKeyCode?: number | Array<number>,
+  eventKeyName?: string,
+  builtInKeyName?: string | Array<string>
+): ?boolean {
+  const mappedKeyCode = config.keyCodes[key] || builtInKeyCode
+  if (builtInKeyName && eventKeyName && !config.keyCodes[key]) {
+    return isKeyNotMatch(builtInKeyName, eventKeyName)
+  } else if (mappedKeyCode) {
+    return isKeyNotMatch(mappedKeyCode, eventKeyCode)
+  } else if (eventKeyName) {
+    return hyphenate(eventKeyName) !== key
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/core/instance/render-helpers/index.js b/advancedcontentfilter/vendor/asset/vue/src/core/instance/render-helpers/index.js
new file mode 100644 (file)
index 0000000..38414a9
--- /dev/null
@@ -0,0 +1,30 @@
+/* @flow */
+
+import { toNumber, toString, looseEqual, looseIndexOf } from 'shared/util'
+import { createTextVNode, createEmptyVNode } from 'core/vdom/vnode'
+import { renderList } from './render-list'
+import { renderSlot } from './render-slot'
+import { resolveFilter } from './resolve-filter'
+import { checkKeyCodes } from './check-keycodes'
+import { bindObjectProps } from './bind-object-props'
+import { renderStatic, markOnce } from './render-static'
+import { bindObjectListeners } from './bind-object-listeners'
+import { resolveScopedSlots } from './resolve-slots'
+
+export function installRenderHelpers (target: any) {
+  target._o = markOnce
+  target._n = toNumber
+  target._s = toString
+  target._l = renderList
+  target._t = renderSlot
+  target._q = looseEqual
+  target._i = looseIndexOf
+  target._m = renderStatic
+  target._f = resolveFilter
+  target._k = checkKeyCodes
+  target._b = bindObjectProps
+  target._v = createTextVNode
+  target._e = createEmptyVNode
+  target._u = resolveScopedSlots
+  target._g = bindObjectListeners
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/core/instance/render-helpers/render-list.js b/advancedcontentfilter/vendor/asset/vue/src/core/instance/render-helpers/render-list.js
new file mode 100644 (file)
index 0000000..abe99db
--- /dev/null
@@ -0,0 +1,39 @@
+/* @flow */
+
+import { isObject, isDef } from 'core/util/index'
+
+/**
+ * Runtime helper for rendering v-for lists.
+ */
+export function renderList (
+  val: any,
+  render: (
+    val: any,
+    keyOrIndex: string | number,
+    index?: number
+  ) => VNode
+): ?Array<VNode> {
+  let ret: ?Array<VNode>, i, l, keys, key
+  if (Array.isArray(val) || typeof val === 'string') {
+    ret = new Array(val.length)
+    for (i = 0, l = val.length; i < l; i++) {
+      ret[i] = render(val[i], i)
+    }
+  } else if (typeof val === 'number') {
+    ret = new Array(val)
+    for (i = 0; i < val; i++) {
+      ret[i] = render(i + 1, i)
+    }
+  } else if (isObject(val)) {
+    keys = Object.keys(val)
+    ret = new Array(keys.length)
+    for (i = 0, l = keys.length; i < l; i++) {
+      key = keys[i]
+      ret[i] = render(val[key], key, i)
+    }
+  }
+  if (isDef(ret)) {
+    (ret: any)._isVList = true
+  }
+  return ret
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/core/instance/render-helpers/render-slot.js b/advancedcontentfilter/vendor/asset/vue/src/core/instance/render-helpers/render-slot.js
new file mode 100644 (file)
index 0000000..a58daa7
--- /dev/null
@@ -0,0 +1,50 @@
+/* @flow */
+
+import { extend, warn, isObject } from 'core/util/index'
+
+/**
+ * Runtime helper for rendering <slot>
+ */
+export function renderSlot (
+  name: string,
+  fallback: ?Array<VNode>,
+  props: ?Object,
+  bindObject: ?Object
+): ?Array<VNode> {
+  const scopedSlotFn = this.$scopedSlots[name]
+  let nodes
+  if (scopedSlotFn) { // scoped slot
+    props = props || {}
+    if (bindObject) {
+      if (process.env.NODE_ENV !== 'production' && !isObject(bindObject)) {
+        warn(
+          'slot v-bind without argument expects an Object',
+          this
+        )
+      }
+      props = extend(extend({}, bindObject), props)
+    }
+    nodes = scopedSlotFn(props) || fallback
+  } else {
+    const slotNodes = this.$slots[name]
+    // warn duplicate slot usage
+    if (slotNodes) {
+      if (process.env.NODE_ENV !== 'production' && slotNodes._rendered) {
+        warn(
+          `Duplicate presence of slot "${name}" found in the same render tree ` +
+          `- this will likely cause render errors.`,
+          this
+        )
+      }
+      slotNodes._rendered = true
+    }
+    nodes = slotNodes || fallback
+  }
+
+  const target = props && props.slot
+  if (target) {
+    return this.$createElement('template', { slot: target }, nodes)
+  } else {
+    return nodes
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/core/instance/render-helpers/render-static.js b/advancedcontentfilter/vendor/asset/vue/src/core/instance/render-helpers/render-static.js
new file mode 100644 (file)
index 0000000..f56510b
--- /dev/null
@@ -0,0 +1,60 @@
+/* @flow */
+
+/**
+ * Runtime helper for rendering static trees.
+ */
+export function renderStatic (
+  index: number,
+  isInFor: boolean
+): VNode | Array<VNode> {
+  const cached = this._staticTrees || (this._staticTrees = [])
+  let tree = cached[index]
+  // if has already-rendered static tree and not inside v-for,
+  // we can reuse the same tree.
+  if (tree && !isInFor) {
+    return tree
+  }
+  // otherwise, render a fresh tree.
+  tree = cached[index] = this.$options.staticRenderFns[index].call(
+    this._renderProxy,
+    null,
+    this // for render fns generated for functional component templates
+  )
+  markStatic(tree, `__static__${index}`, false)
+  return tree
+}
+
+/**
+ * Runtime helper for v-once.
+ * Effectively it means marking the node as static with a unique key.
+ */
+export function markOnce (
+  tree: VNode | Array<VNode>,
+  index: number,
+  key: string
+) {
+  markStatic(tree, `__once__${index}${key ? `_${key}` : ``}`, true)
+  return tree
+}
+
+function markStatic (
+  tree: VNode | Array<VNode>,
+  key: string,
+  isOnce: boolean
+) {
+  if (Array.isArray(tree)) {
+    for (let i = 0; i < tree.length; i++) {
+      if (tree[i] && typeof tree[i] !== 'string') {
+        markStaticNode(tree[i], `${key}_${i}`, isOnce)
+      }
+    }
+  } else {
+    markStaticNode(tree, key, isOnce)
+  }
+}
+
+function markStaticNode (node, key, isOnce) {
+  node.isStatic = true
+  node.key = key
+  node.isOnce = isOnce
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/core/instance/render-helpers/resolve-filter.js b/advancedcontentfilter/vendor/asset/vue/src/core/instance/render-helpers/resolve-filter.js
new file mode 100644 (file)
index 0000000..08a81e1
--- /dev/null
@@ -0,0 +1,10 @@
+/* @flow */
+
+import { identity, resolveAsset } from 'core/util/index'
+
+/**
+ * Runtime helper for resolving filters
+ */
+export function resolveFilter (id: string): Function {
+  return resolveAsset(this.$options, 'filters', id, true) || identity
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/core/instance/render-helpers/resolve-slots.js b/advancedcontentfilter/vendor/asset/vue/src/core/instance/render-helpers/resolve-slots.js
new file mode 100644 (file)
index 0000000..02f007c
--- /dev/null
@@ -0,0 +1,65 @@
+/* @flow */
+
+import type VNode from 'core/vdom/vnode'
+
+/**
+ * Runtime helper for resolving raw children VNodes into a slot object.
+ */
+export function resolveSlots (
+  children: ?Array<VNode>,
+  context: ?Component
+): { [key: string]: Array<VNode> } {
+  const slots = {}
+  if (!children) {
+    return slots
+  }
+  for (let i = 0, l = children.length; i < l; i++) {
+    const child = children[i]
+    const data = child.data
+    // remove slot attribute if the node is resolved as a Vue slot node
+    if (data && data.attrs && data.attrs.slot) {
+      delete data.attrs.slot
+    }
+    // named slots should only be respected if the vnode was rendered in the
+    // same context.
+    if ((child.context === context || child.fnContext === context) &&
+      data && data.slot != null
+    ) {
+      const name = data.slot
+      const slot = (slots[name] || (slots[name] = []))
+      if (child.tag === 'template') {
+        slot.push.apply(slot, child.children || [])
+      } else {
+        slot.push(child)
+      }
+    } else {
+      (slots.default || (slots.default = [])).push(child)
+    }
+  }
+  // ignore slots that contains only whitespace
+  for (const name in slots) {
+    if (slots[name].every(isWhitespace)) {
+      delete slots[name]
+    }
+  }
+  return slots
+}
+
+function isWhitespace (node: VNode): boolean {
+  return (node.isComment && !node.asyncFactory) || node.text === ' '
+}
+
+export function resolveScopedSlots (
+  fns: ScopedSlotsData, // see flow/vnode
+  res?: Object
+): { [key: string]: Function } {
+  res = res || {}
+  for (let i = 0; i < fns.length; i++) {
+    if (Array.isArray(fns[i])) {
+      resolveScopedSlots(fns[i], res)
+    } else {
+      res[fns[i].key] = fns[i].fn
+    }
+  }
+  return res
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/core/instance/render.js b/advancedcontentfilter/vendor/asset/vue/src/core/instance/render.js
new file mode 100644 (file)
index 0000000..70fb2c0
--- /dev/null
@@ -0,0 +1,119 @@
+/* @flow */
+
+import {
+  warn,
+  nextTick,
+  emptyObject,
+  handleError,
+  defineReactive
+} from '../util/index'
+
+import { createElement } from '../vdom/create-element'
+import { installRenderHelpers } from './render-helpers/index'
+import { resolveSlots } from './render-helpers/resolve-slots'
+import VNode, { createEmptyVNode } from '../vdom/vnode'
+
+import { isUpdatingChildComponent } from './lifecycle'
+
+export function initRender (vm: Component) {
+  vm._vnode = null // the root of the child tree
+  vm._staticTrees = null // v-once cached trees
+  const options = vm.$options
+  const parentVnode = vm.$vnode = options._parentVnode // the placeholder node in parent tree
+  const renderContext = parentVnode && parentVnode.context
+  vm.$slots = resolveSlots(options._renderChildren, renderContext)
+  vm.$scopedSlots = emptyObject
+  // bind the createElement fn to this instance
+  // so that we get proper render context inside it.
+  // args order: tag, data, children, normalizationType, alwaysNormalize
+  // internal version is used by render functions compiled from templates
+  vm._c = (a, b, c, d) => createElement(vm, a, b, c, d, false)
+  // normalization is always applied for the public version, used in
+  // user-written render functions.
+  vm.$createElement = (a, b, c, d) => createElement(vm, a, b, c, d, true)
+
+  // $attrs & $listeners are exposed for easier HOC creation.
+  // they need to be reactive so that HOCs using them are always updated
+  const parentData = parentVnode && parentVnode.data
+
+  /* istanbul ignore else */
+  if (process.env.NODE_ENV !== 'production') {
+    defineReactive(vm, '$attrs', parentData && parentData.attrs || emptyObject, () => {
+      !isUpdatingChildComponent && warn(`$attrs is readonly.`, vm)
+    }, true)
+    defineReactive(vm, '$listeners', options._parentListeners || emptyObject, () => {
+      !isUpdatingChildComponent && warn(`$listeners is readonly.`, vm)
+    }, true)
+  } else {
+    defineReactive(vm, '$attrs', parentData && parentData.attrs || emptyObject, null, true)
+    defineReactive(vm, '$listeners', options._parentListeners || emptyObject, null, true)
+  }
+}
+
+export function renderMixin (Vue: Class<Component>) {
+  // install runtime convenience helpers
+  installRenderHelpers(Vue.prototype)
+
+  Vue.prototype.$nextTick = function (fn: Function) {
+    return nextTick(fn, this)
+  }
+
+  Vue.prototype._render = function (): VNode {
+    const vm: Component = this
+    const { render, _parentVnode } = vm.$options
+
+    // reset _rendered flag on slots for duplicate slot check
+    if (process.env.NODE_ENV !== 'production') {
+      for (const key in vm.$slots) {
+        // $flow-disable-line
+        vm.$slots[key]._rendered = false
+      }
+    }
+
+    if (_parentVnode) {
+      vm.$scopedSlots = _parentVnode.data.scopedSlots || emptyObject
+    }
+
+    // set parent vnode. this allows render functions to have access
+    // to the data on the placeholder node.
+    vm.$vnode = _parentVnode
+    // render self
+    let vnode
+    try {
+      vnode = render.call(vm._renderProxy, vm.$createElement)
+    } catch (e) {
+      handleError(e, vm, `render`)
+      // return error render result,
+      // or previous vnode to prevent render error causing blank component
+      /* istanbul ignore else */
+      if (process.env.NODE_ENV !== 'production') {
+        if (vm.$options.renderError) {
+          try {
+            vnode = vm.$options.renderError.call(vm._renderProxy, vm.$createElement, e)
+          } catch (e) {
+            handleError(e, vm, `renderError`)
+            vnode = vm._vnode
+          }
+        } else {
+          vnode = vm._vnode
+        }
+      } else {
+        vnode = vm._vnode
+      }
+    }
+    // return empty vnode in case the render function errored out
+    if (!(vnode instanceof VNode)) {
+      if (process.env.NODE_ENV !== 'production' && Array.isArray(vnode)) {
+        warn(
+          'Multiple root nodes returned from render function. Render function ' +
+          'should return a single root node.',
+          vm
+        )
+      }
+      vnode = createEmptyVNode()
+    }
+    // set parent
+    vnode.parent = _parentVnode
+    return vnode
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/core/instance/state.js b/advancedcontentfilter/vendor/asset/vue/src/core/instance/state.js
new file mode 100644 (file)
index 0000000..b1549b0
--- /dev/null
@@ -0,0 +1,360 @@
+/* @flow */
+
+import config from '../config'
+import Watcher from '../observer/watcher'
+import Dep, { pushTarget, popTarget } from '../observer/dep'
+import { isUpdatingChildComponent } from './lifecycle'
+
+import {
+  set,
+  del,
+  observe,
+  defineReactive,
+  toggleObserving
+} from '../observer/index'
+
+import {
+  warn,
+  bind,
+  noop,
+  hasOwn,
+  hyphenate,
+  isReserved,
+  handleError,
+  nativeWatch,
+  validateProp,
+  isPlainObject,
+  isServerRendering,
+  isReservedAttribute
+} from '../util/index'
+
+const sharedPropertyDefinition = {
+  enumerable: true,
+  configurable: true,
+  get: noop,
+  set: noop
+}
+
+export function proxy (target: Object, sourceKey: string, key: string) {
+  sharedPropertyDefinition.get = function proxyGetter () {
+    return this[sourceKey][key]
+  }
+  sharedPropertyDefinition.set = function proxySetter (val) {
+    this[sourceKey][key] = val
+  }
+  Object.defineProperty(target, key, sharedPropertyDefinition)
+}
+
+export function initState (vm: Component) {
+  vm._watchers = []
+  const opts = vm.$options
+  if (opts.props) initProps(vm, opts.props)
+  if (opts.methods) initMethods(vm, opts.methods)
+  if (opts.data) {
+    initData(vm)
+  } else {
+    observe(vm._data = {}, true /* asRootData */)
+  }
+  if (opts.computed) initComputed(vm, opts.computed)
+  if (opts.watch && opts.watch !== nativeWatch) {
+    initWatch(vm, opts.watch)
+  }
+}
+
+function initProps (vm: Component, propsOptions: Object) {
+  const propsData = vm.$options.propsData || {}
+  const props = vm._props = {}
+  // cache prop keys so that future props updates can iterate using Array
+  // instead of dynamic object key enumeration.
+  const keys = vm.$options._propKeys = []
+  const isRoot = !vm.$parent
+  // root instance props should be converted
+  if (!isRoot) {
+    toggleObserving(false)
+  }
+  for (const key in propsOptions) {
+    keys.push(key)
+    const value = validateProp(key, propsOptions, propsData, vm)
+    /* istanbul ignore else */
+    if (process.env.NODE_ENV !== 'production') {
+      const hyphenatedKey = hyphenate(key)
+      if (isReservedAttribute(hyphenatedKey) ||
+          config.isReservedAttr(hyphenatedKey)) {
+        warn(
+          `"${hyphenatedKey}" is a reserved attribute and cannot be used as component prop.`,
+          vm
+        )
+      }
+      defineReactive(props, key, value, () => {
+        if (vm.$parent && !isUpdatingChildComponent) {
+          warn(
+            `Avoid mutating a prop directly since the value will be ` +
+            `overwritten whenever the parent component re-renders. ` +
+            `Instead, use a data or computed property based on the prop's ` +
+            `value. Prop being mutated: "${key}"`,
+            vm
+          )
+        }
+      })
+    } else {
+      defineReactive(props, key, value)
+    }
+    // static props are already proxied on the component's prototype
+    // during Vue.extend(). We only need to proxy props defined at
+    // instantiation here.
+    if (!(key in vm)) {
+      proxy(vm, `_props`, key)
+    }
+  }
+  toggleObserving(true)
+}
+
+function initData (vm: Component) {
+  let data = vm.$options.data
+  data = vm._data = typeof data === 'function'
+    ? getData(data, vm)
+    : data || {}
+  if (!isPlainObject(data)) {
+    data = {}
+    process.env.NODE_ENV !== 'production' && warn(
+      'data functions should return an object:\n' +
+      'https://vuejs.org/v2/guide/components.html#data-Must-Be-a-Function',
+      vm
+    )
+  }
+  // proxy data on instance
+  const keys = Object.keys(data)
+  const props = vm.$options.props
+  const methods = vm.$options.methods
+  let i = keys.length
+  while (i--) {
+    const key = keys[i]
+    if (process.env.NODE_ENV !== 'production') {
+      if (methods && hasOwn(methods, key)) {
+        warn(
+          `Method "${key}" has already been defined as a data property.`,
+          vm
+        )
+      }
+    }
+    if (props && hasOwn(props, key)) {
+      process.env.NODE_ENV !== 'production' && warn(
+        `The data property "${key}" is already declared as a prop. ` +
+        `Use prop default value instead.`,
+        vm
+      )
+    } else if (!isReserved(key)) {
+      proxy(vm, `_data`, key)
+    }
+  }
+  // observe data
+  observe(data, true /* asRootData */)
+}
+
+export function getData (data: Function, vm: Component): any {
+  // #7573 disable dep collection when invoking data getters
+  pushTarget()
+  try {
+    return data.call(vm, vm)
+  } catch (e) {
+    handleError(e, vm, `data()`)
+    return {}
+  } finally {
+    popTarget()
+  }
+}
+
+const computedWatcherOptions = { lazy: true }
+
+function initComputed (vm: Component, computed: Object) {
+  // $flow-disable-line
+  const watchers = vm._computedWatchers = Object.create(null)
+  // computed properties are just getters during SSR
+  const isSSR = isServerRendering()
+
+  for (const key in computed) {
+    const userDef = computed[key]
+    const getter = typeof userDef === 'function' ? userDef : userDef.get
+    if (process.env.NODE_ENV !== 'production' && getter == null) {
+      warn(
+        `Getter is missing for computed property "${key}".`,
+        vm
+      )
+    }
+
+    if (!isSSR) {
+      // create internal watcher for the computed property.
+      watchers[key] = new Watcher(
+        vm,
+        getter || noop,
+        noop,
+        computedWatcherOptions
+      )
+    }
+
+    // component-defined computed properties are already defined on the
+    // component prototype. We only need to define computed properties defined
+    // at instantiation here.
+    if (!(key in vm)) {
+      defineComputed(vm, key, userDef)
+    } else if (process.env.NODE_ENV !== 'production') {
+      if (key in vm.$data) {
+        warn(`The computed property "${key}" is already defined in data.`, vm)
+      } else if (vm.$options.props && key in vm.$options.props) {
+        warn(`The computed property "${key}" is already defined as a prop.`, vm)
+      }
+    }
+  }
+}
+
+export function defineComputed (
+  target: any,
+  key: string,
+  userDef: Object | Function
+) {
+  const shouldCache = !isServerRendering()
+  if (typeof userDef === 'function') {
+    sharedPropertyDefinition.get = shouldCache
+      ? createComputedGetter(key)
+      : userDef
+    sharedPropertyDefinition.set = noop
+  } else {
+    sharedPropertyDefinition.get = userDef.get
+      ? shouldCache && userDef.cache !== false
+        ? createComputedGetter(key)
+        : userDef.get
+      : noop
+    sharedPropertyDefinition.set = userDef.set
+      ? userDef.set
+      : noop
+  }
+  if (process.env.NODE_ENV !== 'production' &&
+      sharedPropertyDefinition.set === noop) {
+    sharedPropertyDefinition.set = function () {
+      warn(
+        `Computed property "${key}" was assigned to but it has no setter.`,
+        this
+      )
+    }
+  }
+  Object.defineProperty(target, key, sharedPropertyDefinition)
+}
+
+function createComputedGetter (key) {
+  return function computedGetter () {
+    const watcher = this._computedWatchers && this._computedWatchers[key]
+    if (watcher) {
+      if (watcher.dirty) {
+        watcher.evaluate()
+      }
+      if (Dep.target) {
+        watcher.depend()
+      }
+      return watcher.value
+    }
+  }
+}
+
+function initMethods (vm: Component, methods: Object) {
+  const props = vm.$options.props
+  for (const key in methods) {
+    if (process.env.NODE_ENV !== 'production') {
+      if (methods[key] == null) {
+        warn(
+          `Method "${key}" has an undefined value in the component definition. ` +
+          `Did you reference the function correctly?`,
+          vm
+        )
+      }
+      if (props && hasOwn(props, key)) {
+        warn(
+          `Method "${key}" has already been defined as a prop.`,
+          vm
+        )
+      }
+      if ((key in vm) && isReserved(key)) {
+        warn(
+          `Method "${key}" conflicts with an existing Vue instance method. ` +
+          `Avoid defining component methods that start with _ or $.`
+        )
+      }
+    }
+    vm[key] = methods[key] == null ? noop : bind(methods[key], vm)
+  }
+}
+
+function initWatch (vm: Component, watch: Object) {
+  for (const key in watch) {
+    const handler = watch[key]
+    if (Array.isArray(handler)) {
+      for (let i = 0; i < handler.length; i++) {
+        createWatcher(vm, key, handler[i])
+      }
+    } else {
+      createWatcher(vm, key, handler)
+    }
+  }
+}
+
+function createWatcher (
+  vm: Component,
+  expOrFn: string | Function,
+  handler: any,
+  options?: Object
+) {
+  if (isPlainObject(handler)) {
+    options = handler
+    handler = handler.handler
+  }
+  if (typeof handler === 'string') {
+    handler = vm[handler]
+  }
+  return vm.$watch(expOrFn, handler, options)
+}
+
+export function stateMixin (Vue: Class<Component>) {
+  // flow somehow has problems with directly declared definition object
+  // when using Object.defineProperty, so we have to procedurally build up
+  // the object here.
+  const dataDef = {}
+  dataDef.get = function () { return this._data }
+  const propsDef = {}
+  propsDef.get = function () { return this._props }
+  if (process.env.NODE_ENV !== 'production') {
+    dataDef.set = function (newData: Object) {
+      warn(
+        'Avoid replacing instance root $data. ' +
+        'Use nested data properties instead.',
+        this
+      )
+    }
+    propsDef.set = function () {
+      warn(`$props is readonly.`, this)
+    }
+  }
+  Object.defineProperty(Vue.prototype, '$data', dataDef)
+  Object.defineProperty(Vue.prototype, '$props', propsDef)
+
+  Vue.prototype.$set = set
+  Vue.prototype.$delete = del
+
+  Vue.prototype.$watch = function (
+    expOrFn: string | Function,
+    cb: any,
+    options?: Object
+  ): Function {
+    const vm: Component = this
+    if (isPlainObject(cb)) {
+      return createWatcher(vm, expOrFn, cb, options)
+    }
+    options = options || {}
+    options.user = true
+    const watcher = new Watcher(vm, expOrFn, cb, options)
+    if (options.immediate) {
+      cb.call(vm, watcher.value)
+    }
+    return function unwatchFn () {
+      watcher.teardown()
+    }
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/core/observer/array.js b/advancedcontentfilter/vendor/asset/vue/src/core/observer/array.js
new file mode 100644 (file)
index 0000000..684e37e
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+ * not type checking this file because flow doesn't play well with
+ * dynamically accessing methods on Array prototype
+ */
+
+import { def } from '../util/index'
+
+const arrayProto = Array.prototype
+export const arrayMethods = Object.create(arrayProto)
+
+const methodsToPatch = [
+  'push',
+  'pop',
+  'shift',
+  'unshift',
+  'splice',
+  'sort',
+  'reverse'
+]
+
+/**
+ * Intercept mutating methods and emit events
+ */
+methodsToPatch.forEach(function (method) {
+  // cache original method
+  const original = arrayProto[method]
+  def(arrayMethods, method, function mutator (...args) {
+    const result = original.apply(this, args)
+    const ob = this.__ob__
+    let inserted
+    switch (method) {
+      case 'push':
+      case 'unshift':
+        inserted = args
+        break
+      case 'splice':
+        inserted = args.slice(2)
+        break
+    }
+    if (inserted) ob.observeArray(inserted)
+    // notify change
+    ob.dep.notify()
+    return result
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/src/core/observer/dep.js b/advancedcontentfilter/vendor/asset/vue/src/core/observer/dep.js
new file mode 100644 (file)
index 0000000..abf3b27
--- /dev/null
@@ -0,0 +1,58 @@
+/* @flow */
+
+import type Watcher from './watcher'
+import { remove } from '../util/index'
+
+let uid = 0
+
+/**
+ * A dep is an observable that can have multiple
+ * directives subscribing to it.
+ */
+export default class Dep {
+  static target: ?Watcher;
+  id: number;
+  subs: Array<Watcher>;
+
+  constructor () {
+    this.id = uid++
+    this.subs = []
+  }
+
+  addSub (sub: Watcher) {
+    this.subs.push(sub)
+  }
+
+  removeSub (sub: Watcher) {
+    remove(this.subs, sub)
+  }
+
+  depend () {
+    if (Dep.target) {
+      Dep.target.addDep(this)
+    }
+  }
+
+  notify () {
+    // stabilize the subscriber list first
+    const subs = this.subs.slice()
+    for (let i = 0, l = subs.length; i < l; i++) {
+      subs[i].update()
+    }
+  }
+}
+
+// the current target watcher being evaluated.
+// this is globally unique because there could be only one
+// watcher being evaluated at any time.
+Dep.target = null
+const targetStack = []
+
+export function pushTarget (_target: ?Watcher) {
+  if (Dep.target) targetStack.push(Dep.target)
+  Dep.target = _target
+}
+
+export function popTarget () {
+  Dep.target = targetStack.pop()
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/core/observer/index.js b/advancedcontentfilter/vendor/asset/vue/src/core/observer/index.js
new file mode 100644 (file)
index 0000000..4a030ed
--- /dev/null
@@ -0,0 +1,273 @@
+/* @flow */
+
+import Dep from './dep'
+import VNode from '../vdom/vnode'
+import { arrayMethods } from './array'
+import {
+  def,
+  warn,
+  hasOwn,
+  hasProto,
+  isObject,
+  isPlainObject,
+  isPrimitive,
+  isUndef,
+  isValidArrayIndex,
+  isServerRendering
+} from '../util/index'
+
+const arrayKeys = Object.getOwnPropertyNames(arrayMethods)
+
+/**
+ * In some cases we may want to disable observation inside a component's
+ * update computation.
+ */
+export let shouldObserve: boolean = true
+
+export function toggleObserving (value: boolean) {
+  shouldObserve = value
+}
+
+/**
+ * Observer class that is attached to each observed
+ * object. Once attached, the observer converts the target
+ * object's property keys into getter/setters that
+ * collect dependencies and dispatch updates.
+ */
+export class Observer {
+  value: any;
+  dep: Dep;
+  vmCount: number; // number of vms that has this object as root $data
+
+  constructor (value: any) {
+    this.value = value
+    this.dep = new Dep()
+    this.vmCount = 0
+    def(value, '__ob__', this)
+    if (Array.isArray(value)) {
+      const augment = hasProto
+        ? protoAugment
+        : copyAugment
+      augment(value, arrayMethods, arrayKeys)
+      this.observeArray(value)
+    } else {
+      this.walk(value)
+    }
+  }
+
+  /**
+   * Walk through each property and convert them into
+   * getter/setters. This method should only be called when
+   * value type is Object.
+   */
+  walk (obj: Object) {
+    const keys = Object.keys(obj)
+    for (let i = 0; i < keys.length; i++) {
+      defineReactive(obj, keys[i])
+    }
+  }
+
+  /**
+   * Observe a list of Array items.
+   */
+  observeArray (items: Array<any>) {
+    for (let i = 0, l = items.length; i < l; i++) {
+      observe(items[i])
+    }
+  }
+}
+
+// helpers
+
+/**
+ * Augment an target Object or Array by intercepting
+ * the prototype chain using __proto__
+ */
+function protoAugment (target, src: Object, keys: any) {
+  /* eslint-disable no-proto */
+  target.__proto__ = src
+  /* eslint-enable no-proto */
+}
+
+/**
+ * Augment an target Object or Array by defining
+ * hidden properties.
+ */
+/* istanbul ignore next */
+function copyAugment (target: Object, src: Object, keys: Array<string>) {
+  for (let i = 0, l = keys.length; i < l; i++) {
+    const key = keys[i]
+    def(target, key, src[key])
+  }
+}
+
+/**
+ * Attempt to create an observer instance for a value,
+ * returns the new observer if successfully observed,
+ * or the existing observer if the value already has one.
+ */
+export function observe (value: any, asRootData: ?boolean): Observer | void {
+  if (!isObject(value) || value instanceof VNode) {
+    return
+  }
+  let ob: Observer | void
+  if (hasOwn(value, '__ob__') && value.__ob__ instanceof Observer) {
+    ob = value.__ob__
+  } else if (
+    shouldObserve &&
+    !isServerRendering() &&
+    (Array.isArray(value) || isPlainObject(value)) &&
+    Object.isExtensible(value) &&
+    !value._isVue
+  ) {
+    ob = new Observer(value)
+  }
+  if (asRootData && ob) {
+    ob.vmCount++
+  }
+  return ob
+}
+
+/**
+ * Define a reactive property on an Object.
+ */
+export function defineReactive (
+  obj: Object,
+  key: string,
+  val: any,
+  customSetter?: ?Function,
+  shallow?: boolean
+) {
+  const dep = new Dep()
+
+  const property = Object.getOwnPropertyDescriptor(obj, key)
+  if (property && property.configurable === false) {
+    return
+  }
+
+  // cater for pre-defined getter/setters
+  const getter = property && property.get
+  if (!getter && arguments.length === 2) {
+    val = obj[key]
+  }
+  const setter = property && property.set
+
+  let childOb = !shallow && observe(val)
+  Object.defineProperty(obj, key, {
+    enumerable: true,
+    configurable: true,
+    get: function reactiveGetter () {
+      const value = getter ? getter.call(obj) : val
+      if (Dep.target) {
+        dep.depend()
+        if (childOb) {
+          childOb.dep.depend()
+          if (Array.isArray(value)) {
+            dependArray(value)
+          }
+        }
+      }
+      return value
+    },
+    set: function reactiveSetter (newVal) {
+      const value = getter ? getter.call(obj) : val
+      /* eslint-disable no-self-compare */
+      if (newVal === value || (newVal !== newVal && value !== value)) {
+        return
+      }
+      /* eslint-enable no-self-compare */
+      if (process.env.NODE_ENV !== 'production' && customSetter) {
+        customSetter()
+      }
+      if (setter) {
+        setter.call(obj, newVal)
+      } else {
+        val = newVal
+      }
+      childOb = !shallow && observe(newVal)
+      dep.notify()
+    }
+  })
+}
+
+/**
+ * Set a property on an object. Adds the new property and
+ * triggers change notification if the property doesn't
+ * already exist.
+ */
+export function set (target: Array<any> | Object, key: any, val: any): any {
+  if (process.env.NODE_ENV !== 'production' &&
+    (isUndef(target) || isPrimitive(target))
+  ) {
+    warn(`Cannot set reactive property on undefined, null, or primitive value: ${(target: any)}`)
+  }
+  if (Array.isArray(target) && isValidArrayIndex(key)) {
+    target.length = Math.max(target.length, key)
+    target.splice(key, 1, val)
+    return val
+  }
+  if (key in target && !(key in Object.prototype)) {
+    target[key] = val
+    return val
+  }
+  const ob = (target: any).__ob__
+  if (target._isVue || (ob && ob.vmCount)) {
+    process.env.NODE_ENV !== 'production' && warn(
+      'Avoid adding reactive properties to a Vue instance or its root $data ' +
+      'at runtime - declare it upfront in the data option.'
+    )
+    return val
+  }
+  if (!ob) {
+    target[key] = val
+    return val
+  }
+  defineReactive(ob.value, key, val)
+  ob.dep.notify()
+  return val
+}
+
+/**
+ * Delete a property and trigger change if necessary.
+ */
+export function del (target: Array<any> | Object, key: any) {
+  if (process.env.NODE_ENV !== 'production' &&
+    (isUndef(target) || isPrimitive(target))
+  ) {
+    warn(`Cannot delete reactive property on undefined, null, or primitive value: ${(target: any)}`)
+  }
+  if (Array.isArray(target) && isValidArrayIndex(key)) {
+    target.splice(key, 1)
+    return
+  }
+  const ob = (target: any).__ob__
+  if (target._isVue || (ob && ob.vmCount)) {
+    process.env.NODE_ENV !== 'production' && warn(
+      'Avoid deleting properties on a Vue instance or its root $data ' +
+      '- just set it to null.'
+    )
+    return
+  }
+  if (!hasOwn(target, key)) {
+    return
+  }
+  delete target[key]
+  if (!ob) {
+    return
+  }
+  ob.dep.notify()
+}
+
+/**
+ * Collect dependencies on array elements when the array is touched, since
+ * we cannot intercept array element access like property getters.
+ */
+function dependArray (value: Array<any>) {
+  for (let e, i = 0, l = value.length; i < l; i++) {
+    e = value[i]
+    e && e.__ob__ && e.__ob__.dep.depend()
+    if (Array.isArray(e)) {
+      dependArray(e)
+    }
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/core/observer/scheduler.js b/advancedcontentfilter/vendor/asset/vue/src/core/observer/scheduler.js
new file mode 100644 (file)
index 0000000..fce86e5
--- /dev/null
@@ -0,0 +1,148 @@
+/* @flow */
+
+import type Watcher from './watcher'
+import config from '../config'
+import { callHook, activateChildComponent } from '../instance/lifecycle'
+
+import {
+  warn,
+  nextTick,
+  devtools
+} from '../util/index'
+
+export const MAX_UPDATE_COUNT = 100
+
+const queue: Array<Watcher> = []
+const activatedChildren: Array<Component> = []
+let has: { [key: number]: ?true } = {}
+let circular: { [key: number]: number } = {}
+let waiting = false
+let flushing = false
+let index = 0
+
+/**
+ * Reset the scheduler's state.
+ */
+function resetSchedulerState () {
+  index = queue.length = activatedChildren.length = 0
+  has = {}
+  if (process.env.NODE_ENV !== 'production') {
+    circular = {}
+  }
+  waiting = flushing = false
+}
+
+/**
+ * Flush both queues and run the watchers.
+ */
+function flushSchedulerQueue () {
+  flushing = true
+  let watcher, id
+
+  // Sort queue before flush.
+  // This ensures that:
+  // 1. Components are updated from parent to child. (because parent is always
+  //    created before the child)
+  // 2. A component's user watchers are run before its render watcher (because
+  //    user watchers are created before the render watcher)
+  // 3. If a component is destroyed during a parent component's watcher run,
+  //    its watchers can be skipped.
+  queue.sort((a, b) => a.id - b.id)
+
+  // do not cache length because more watchers might be pushed
+  // as we run existing watchers
+  for (index = 0; index < queue.length; index++) {
+    watcher = queue[index]
+    id = watcher.id
+    has[id] = null
+    watcher.run()
+    // in dev build, check and stop circular updates.
+    if (process.env.NODE_ENV !== 'production' && has[id] != null) {
+      circular[id] = (circular[id] || 0) + 1
+      if (circular[id] > MAX_UPDATE_COUNT) {
+        warn(
+          'You may have an infinite update loop ' + (
+            watcher.user
+              ? `in watcher with expression "${watcher.expression}"`
+              : `in a component render function.`
+          ),
+          watcher.vm
+        )
+        break
+      }
+    }
+  }
+
+  // keep copies of post queues before resetting state
+  const activatedQueue = activatedChildren.slice()
+  const updatedQueue = queue.slice()
+
+  resetSchedulerState()
+
+  // call component updated and activated hooks
+  callActivatedHooks(activatedQueue)
+  callUpdatedHooks(updatedQueue)
+
+  // devtool hook
+  /* istanbul ignore if */
+  if (devtools && config.devtools) {
+    devtools.emit('flush')
+  }
+}
+
+function callUpdatedHooks (queue) {
+  let i = queue.length
+  while (i--) {
+    const watcher = queue[i]
+    const vm = watcher.vm
+    if (vm._watcher === watcher && vm._isMounted) {
+      callHook(vm, 'updated')
+    }
+  }
+}
+
+/**
+ * Queue a kept-alive component that was activated during patch.
+ * The queue will be processed after the entire tree has been patched.
+ */
+export function queueActivatedComponent (vm: Component) {
+  // setting _inactive to false here so that a render function can
+  // rely on checking whether it's in an inactive tree (e.g. router-view)
+  vm._inactive = false
+  activatedChildren.push(vm)
+}
+
+function callActivatedHooks (queue) {
+  for (let i = 0; i < queue.length; i++) {
+    queue[i]._inactive = true
+    activateChildComponent(queue[i], true /* true */)
+  }
+}
+
+/**
+ * Push a watcher into the watcher queue.
+ * Jobs with duplicate IDs will be skipped unless it's
+ * pushed when the queue is being flushed.
+ */
+export function queueWatcher (watcher: Watcher) {
+  const id = watcher.id
+  if (has[id] == null) {
+    has[id] = true
+    if (!flushing) {
+      queue.push(watcher)
+    } else {
+      // if already flushing, splice the watcher based on its id
+      // if already past its id, it will be run next immediately.
+      let i = queue.length - 1
+      while (i > index && queue[i].id > watcher.id) {
+        i--
+      }
+      queue.splice(i + 1, 0, watcher)
+    }
+    // queue the flush
+    if (!waiting) {
+      waiting = true
+      nextTick(flushSchedulerQueue)
+    }
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/core/observer/traverse.js b/advancedcontentfilter/vendor/asset/vue/src/core/observer/traverse.js
new file mode 100644 (file)
index 0000000..6b26524
--- /dev/null
@@ -0,0 +1,40 @@
+/* @flow */
+
+import { _Set as Set, isObject } from '../util/index'
+import type { SimpleSet } from '../util/index'
+import VNode from '../vdom/vnode'
+
+const seenObjects = new Set()
+
+/**
+ * Recursively traverse an object to evoke all converted
+ * getters, so that every nested property inside the object
+ * is collected as a "deep" dependency.
+ */
+export function traverse (val: any) {
+  _traverse(val, seenObjects)
+  seenObjects.clear()
+}
+
+function _traverse (val: any, seen: SimpleSet) {
+  let i, keys
+  const isA = Array.isArray(val)
+  if ((!isA && !isObject(val)) || Object.isFrozen(val) || val instanceof VNode) {
+    return
+  }
+  if (val.__ob__) {
+    const depId = val.__ob__.dep.id
+    if (seen.has(depId)) {
+      return
+    }
+    seen.add(depId)
+  }
+  if (isA) {
+    i = val.length
+    while (i--) _traverse(val[i], seen)
+  } else {
+    keys = Object.keys(val)
+    i = keys.length
+    while (i--) _traverse(val[keys[i]], seen)
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/core/observer/watcher.js b/advancedcontentfilter/vendor/asset/vue/src/core/observer/watcher.js
new file mode 100644 (file)
index 0000000..48a2e61
--- /dev/null
@@ -0,0 +1,240 @@
+/* @flow */
+
+import {
+  warn,
+  remove,
+  isObject,
+  parsePath,
+  _Set as Set,
+  handleError
+} from '../util/index'
+
+import { traverse } from './traverse'
+import { queueWatcher } from './scheduler'
+import Dep, { pushTarget, popTarget } from './dep'
+
+import type { SimpleSet } from '../util/index'
+
+let uid = 0
+
+/**
+ * A watcher parses an expression, collects dependencies,
+ * and fires callback when the expression value changes.
+ * This is used for both the $watch() api and directives.
+ */
+export default class Watcher {
+  vm: Component;
+  expression: string;
+  cb: Function;
+  id: number;
+  deep: boolean;
+  user: boolean;
+  lazy: boolean;
+  sync: boolean;
+  dirty: boolean;
+  active: boolean;
+  deps: Array<Dep>;
+  newDeps: Array<Dep>;
+  depIds: SimpleSet;
+  newDepIds: SimpleSet;
+  getter: Function;
+  value: any;
+
+  constructor (
+    vm: Component,
+    expOrFn: string | Function,
+    cb: Function,
+    options?: ?Object,
+    isRenderWatcher?: boolean
+  ) {
+    this.vm = vm
+    if (isRenderWatcher) {
+      vm._watcher = this
+    }
+    vm._watchers.push(this)
+    // options
+    if (options) {
+      this.deep = !!options.deep
+      this.user = !!options.user
+      this.lazy = !!options.lazy
+      this.sync = !!options.sync
+    } else {
+      this.deep = this.user = this.lazy = this.sync = false
+    }
+    this.cb = cb
+    this.id = ++uid // uid for batching
+    this.active = true
+    this.dirty = this.lazy // for lazy watchers
+    this.deps = []
+    this.newDeps = []
+    this.depIds = new Set()
+    this.newDepIds = new Set()
+    this.expression = process.env.NODE_ENV !== 'production'
+      ? expOrFn.toString()
+      : ''
+    // parse expression for getter
+    if (typeof expOrFn === 'function') {
+      this.getter = expOrFn
+    } else {
+      this.getter = parsePath(expOrFn)
+      if (!this.getter) {
+        this.getter = function () {}
+        process.env.NODE_ENV !== 'production' && warn(
+          `Failed watching path: "${expOrFn}" ` +
+          'Watcher only accepts simple dot-delimited paths. ' +
+          'For full control, use a function instead.',
+          vm
+        )
+      }
+    }
+    this.value = this.lazy
+      ? undefined
+      : this.get()
+  }
+
+  /**
+   * Evaluate the getter, and re-collect dependencies.
+   */
+  get () {
+    pushTarget(this)
+    let value
+    const vm = this.vm
+    try {
+      value = this.getter.call(vm, vm)
+    } catch (e) {
+      if (this.user) {
+        handleError(e, vm, `getter for watcher "${this.expression}"`)
+      } else {
+        throw e
+      }
+    } finally {
+      // "touch" every property so they are all tracked as
+      // dependencies for deep watching
+      if (this.deep) {
+        traverse(value)
+      }
+      popTarget()
+      this.cleanupDeps()
+    }
+    return value
+  }
+
+  /**
+   * Add a dependency to this directive.
+   */
+  addDep (dep: Dep) {
+    const id = dep.id
+    if (!this.newDepIds.has(id)) {
+      this.newDepIds.add(id)
+      this.newDeps.push(dep)
+      if (!this.depIds.has(id)) {
+        dep.addSub(this)
+      }
+    }
+  }
+
+  /**
+   * Clean up for dependency collection.
+   */
+  cleanupDeps () {
+    let i = this.deps.length
+    while (i--) {
+      const dep = this.deps[i]
+      if (!this.newDepIds.has(dep.id)) {
+        dep.removeSub(this)
+      }
+    }
+    let tmp = this.depIds
+    this.depIds = this.newDepIds
+    this.newDepIds = tmp
+    this.newDepIds.clear()
+    tmp = this.deps
+    this.deps = this.newDeps
+    this.newDeps = tmp
+    this.newDeps.length = 0
+  }
+
+  /**
+   * Subscriber interface.
+   * Will be called when a dependency changes.
+   */
+  update () {
+    /* istanbul ignore else */
+    if (this.lazy) {
+      this.dirty = true
+    } else if (this.sync) {
+      this.run()
+    } else {
+      queueWatcher(this)
+    }
+  }
+
+  /**
+   * Scheduler job interface.
+   * Will be called by the scheduler.
+   */
+  run () {
+    if (this.active) {
+      const value = this.get()
+      if (
+        value !== this.value ||
+        // Deep watchers and watchers on Object/Arrays should fire even
+        // when the value is the same, because the value may
+        // have mutated.
+        isObject(value) ||
+        this.deep
+      ) {
+        // set new value
+        const oldValue = this.value
+        this.value = value
+        if (this.user) {
+          try {
+            this.cb.call(this.vm, value, oldValue)
+          } catch (e) {
+            handleError(e, this.vm, `callback for watcher "${this.expression}"`)
+          }
+        } else {
+          this.cb.call(this.vm, value, oldValue)
+        }
+      }
+    }
+  }
+
+  /**
+   * Evaluate the value of the watcher.
+   * This only gets called for lazy watchers.
+   */
+  evaluate () {
+    this.value = this.get()
+    this.dirty = false
+  }
+
+  /**
+   * Depend on all deps collected by this watcher.
+   */
+  depend () {
+    let i = this.deps.length
+    while (i--) {
+      this.deps[i].depend()
+    }
+  }
+
+  /**
+   * Remove self from all dependencies' subscriber list.
+   */
+  teardown () {
+    if (this.active) {
+      // remove self from vm's watcher list
+      // this is a somewhat expensive operation so we skip it
+      // if the vm is being destroyed.
+      if (!this.vm._isBeingDestroyed) {
+        remove(this.vm._watchers, this)
+      }
+      let i = this.deps.length
+      while (i--) {
+        this.deps[i].removeSub(this)
+      }
+      this.active = false
+    }
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/core/util/debug.js b/advancedcontentfilter/vendor/asset/vue/src/core/util/debug.js
new file mode 100644 (file)
index 0000000..6b7315f
--- /dev/null
@@ -0,0 +1,100 @@
+/* @flow */
+
+import config from '../config'
+import { noop } from 'shared/util'
+
+export let warn = noop
+export let tip = noop
+export let generateComponentTrace = (noop: any) // work around flow check
+export let formatComponentName = (noop: any)
+
+if (process.env.NODE_ENV !== 'production') {
+  const hasConsole = typeof console !== 'undefined'
+  const classifyRE = /(?:^|[-_])(\w)/g
+  const classify = str => str
+    .replace(classifyRE, c => c.toUpperCase())
+    .replace(/[-_]/g, '')
+
+  warn = (msg, vm) => {
+    const trace = vm ? generateComponentTrace(vm) : ''
+
+    if (config.warnHandler) {
+      config.warnHandler.call(null, msg, vm, trace)
+    } else if (hasConsole && (!config.silent)) {
+      console.error(`[Vue warn]: ${msg}${trace}`)
+    }
+  }
+
+  tip = (msg, vm) => {
+    if (hasConsole && (!config.silent)) {
+      console.warn(`[Vue tip]: ${msg}` + (
+        vm ? generateComponentTrace(vm) : ''
+      ))
+    }
+  }
+
+  formatComponentName = (vm, includeFile) => {
+    if (vm.$root === vm) {
+      return '<Root>'
+    }
+    const options = typeof vm === 'function' && vm.cid != null
+      ? vm.options
+      : vm._isVue
+        ? vm.$options || vm.constructor.options
+        : vm || {}
+    let name = options.name || options._componentTag
+    const file = options.__file
+    if (!name && file) {
+      const match = file.match(/([^/\\]+)\.vue$/)
+      name = match && match[1]
+    }
+
+    return (
+      (name ? `<${classify(name)}>` : `<Anonymous>`) +
+      (file && includeFile !== false ? ` at ${file}` : '')
+    )
+  }
+
+  const repeat = (str, n) => {
+    let res = ''
+    while (n) {
+      if (n % 2 === 1) res += str
+      if (n > 1) str += str
+      n >>= 1
+    }
+    return res
+  }
+
+  generateComponentTrace = vm => {
+    if (vm._isVue && vm.$parent) {
+      const tree = []
+      let currentRecursiveSequence = 0
+      while (vm) {
+        if (tree.length > 0) {
+          const last = tree[tree.length - 1]
+          if (last.constructor === vm.constructor) {
+            currentRecursiveSequence++
+            vm = vm.$parent
+            continue
+          } else if (currentRecursiveSequence > 0) {
+            tree[tree.length - 1] = [last, currentRecursiveSequence]
+            currentRecursiveSequence = 0
+          }
+        }
+        tree.push(vm)
+        vm = vm.$parent
+      }
+      return '\n\nfound in\n\n' + tree
+        .map((vm, i) => `${
+          i === 0 ? '---> ' : repeat(' ', 5 + i * 2)
+        }${
+          Array.isArray(vm)
+            ? `${formatComponentName(vm[0])}... (${vm[1]} recursive calls)`
+            : formatComponentName(vm)
+        }`)
+        .join('\n')
+    } else {
+      return `\n\n(found in ${formatComponentName(vm)})`
+    }
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/core/util/env.js b/advancedcontentfilter/vendor/asset/vue/src/core/util/env.js
new file mode 100644 (file)
index 0000000..07cadd9
--- /dev/null
@@ -0,0 +1,95 @@
+/* @flow */
+
+// can we use __proto__?
+export const hasProto = '__proto__' in {}
+
+// Browser environment sniffing
+export const inBrowser = typeof window !== 'undefined'
+export const inWeex = typeof WXEnvironment !== 'undefined' && !!WXEnvironment.platform
+export const weexPlatform = inWeex && WXEnvironment.platform.toLowerCase()
+export const UA = inBrowser && window.navigator.userAgent.toLowerCase()
+export const isIE = UA && /msie|trident/.test(UA)
+export const isIE9 = UA && UA.indexOf('msie 9.0') > 0
+export const isEdge = UA && UA.indexOf('edge/') > 0
+export const isAndroid = (UA && UA.indexOf('android') > 0) || (weexPlatform === 'android')
+export const isIOS = (UA && /iphone|ipad|ipod|ios/.test(UA)) || (weexPlatform === 'ios')
+export const isChrome = UA && /chrome\/\d+/.test(UA) && !isEdge
+
+// Firefox has a "watch" function on Object.prototype...
+export const nativeWatch = ({}).watch
+
+export let supportsPassive = false
+if (inBrowser) {
+  try {
+    const opts = {}
+    Object.defineProperty(opts, 'passive', ({
+      get () {
+        /* istanbul ignore next */
+        supportsPassive = true
+      }
+    }: Object)) // https://github.com/facebook/flow/issues/285
+    window.addEventListener('test-passive', null, opts)
+  } catch (e) {}
+}
+
+// this needs to be lazy-evaled because vue may be required before
+// vue-server-renderer can set VUE_ENV
+let _isServer
+export const isServerRendering = () => {
+  if (_isServer === undefined) {
+    /* istanbul ignore if */
+    if (!inBrowser && !inWeex && typeof global !== 'undefined') {
+      // detect presence of vue-server-renderer and avoid
+      // Webpack shimming the process
+      _isServer = global['process'].env.VUE_ENV === 'server'
+    } else {
+      _isServer = false
+    }
+  }
+  return _isServer
+}
+
+// detect devtools
+export const devtools = inBrowser && window.__VUE_DEVTOOLS_GLOBAL_HOOK__
+
+/* istanbul ignore next */
+export function isNative (Ctor: any): boolean {
+  return typeof Ctor === 'function' && /native code/.test(Ctor.toString())
+}
+
+export const hasSymbol =
+  typeof Symbol !== 'undefined' && isNative(Symbol) &&
+  typeof Reflect !== 'undefined' && isNative(Reflect.ownKeys)
+
+let _Set
+/* istanbul ignore if */ // $flow-disable-line
+if (typeof Set !== 'undefined' && isNative(Set)) {
+  // use native Set when available.
+  _Set = Set
+} else {
+  // a non-standard Set polyfill that only works with primitive keys.
+  _Set = class Set implements SimpleSet {
+    set: Object;
+    constructor () {
+      this.set = Object.create(null)
+    }
+    has (key: string | number) {
+      return this.set[key] === true
+    }
+    add (key: string | number) {
+      this.set[key] = true
+    }
+    clear () {
+      this.set = Object.create(null)
+    }
+  }
+}
+
+interface SimpleSet {
+  has(key: string | number): boolean;
+  add(key: string | number): mixed;
+  clear(): void;
+}
+
+export { _Set }
+export type { SimpleSet }
diff --git a/advancedcontentfilter/vendor/asset/vue/src/core/util/error.js b/advancedcontentfilter/vendor/asset/vue/src/core/util/error.js
new file mode 100644 (file)
index 0000000..b7d05a6
--- /dev/null
@@ -0,0 +1,48 @@
+/* @flow */
+
+import config from '../config'
+import { warn } from './debug'
+import { inBrowser, inWeex } from './env'
+
+export function handleError (err: Error, vm: any, info: string) {
+  if (vm) {
+    let cur = vm
+    while ((cur = cur.$parent)) {
+      const hooks = cur.$options.errorCaptured
+      if (hooks) {
+        for (let i = 0; i < hooks.length; i++) {
+          try {
+            const capture = hooks[i].call(cur, err, vm, info) === false
+            if (capture) return
+          } catch (e) {
+            globalHandleError(e, cur, 'errorCaptured hook')
+          }
+        }
+      }
+    }
+  }
+  globalHandleError(err, vm, info)
+}
+
+function globalHandleError (err, vm, info) {
+  if (config.errorHandler) {
+    try {
+      return config.errorHandler.call(null, err, vm, info)
+    } catch (e) {
+      logError(e, null, 'config.errorHandler')
+    }
+  }
+  logError(err, vm, info)
+}
+
+function logError (err, vm, info) {
+  if (process.env.NODE_ENV !== 'production') {
+    warn(`Error in ${info}: "${err.toString()}"`, vm)
+  }
+  /* istanbul ignore else */
+  if ((inBrowser || inWeex) && typeof console !== 'undefined') {
+    console.error(err)
+  } else {
+    throw err
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/core/util/index.js b/advancedcontentfilter/vendor/asset/vue/src/core/util/index.js
new file mode 100644 (file)
index 0000000..115d77c
--- /dev/null
@@ -0,0 +1,11 @@
+/* @flow */
+
+export * from 'shared/util'
+export * from './lang'
+export * from './env'
+export * from './options'
+export * from './debug'
+export * from './props'
+export * from './error'
+export * from './next-tick'
+export { defineReactive } from '../observer/index'
diff --git a/advancedcontentfilter/vendor/asset/vue/src/core/util/lang.js b/advancedcontentfilter/vendor/asset/vue/src/core/util/lang.js
new file mode 100644 (file)
index 0000000..96b8219
--- /dev/null
@@ -0,0 +1,39 @@
+/* @flow */
+
+/**
+ * Check if a string starts with $ or _
+ */
+export function isReserved (str: string): boolean {
+  const c = (str + '').charCodeAt(0)
+  return c === 0x24 || c === 0x5F
+}
+
+/**
+ * Define a property.
+ */
+export function def (obj: Object, key: string, val: any, enumerable?: boolean) {
+  Object.defineProperty(obj, key, {
+    value: val,
+    enumerable: !!enumerable,
+    writable: true,
+    configurable: true
+  })
+}
+
+/**
+ * Parse simple path.
+ */
+const bailRE = /[^\w.$]/
+export function parsePath (path: string): any {
+  if (bailRE.test(path)) {
+    return
+  }
+  const segments = path.split('.')
+  return function (obj) {
+    for (let i = 0; i < segments.length; i++) {
+      if (!obj) return
+      obj = obj[segments[i]]
+    }
+    return obj
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/core/util/next-tick.js b/advancedcontentfilter/vendor/asset/vue/src/core/util/next-tick.js
new file mode 100644 (file)
index 0000000..07a9e84
--- /dev/null
@@ -0,0 +1,117 @@
+/* @flow */
+/* globals MessageChannel */
+
+import { noop } from 'shared/util'
+import { handleError } from './error'
+import { isIOS, isNative } from './env'
+
+const callbacks = []
+let pending = false
+
+function flushCallbacks () {
+  pending = false
+  const copies = callbacks.slice(0)
+  callbacks.length = 0
+  for (let i = 0; i < copies.length; i++) {
+    copies[i]()
+  }
+}
+
+// Here we have async deferring wrappers using both microtasks and (macro) tasks.
+// In < 2.4 we used microtasks everywhere, but there are some scenarios where
+// microtasks have too high a priority and fire in between supposedly
+// sequential events (e.g. #4521, #6690) or even between bubbling of the same
+// event (#6566). However, using (macro) tasks everywhere also has subtle problems
+// when state is changed right before repaint (e.g. #6813, out-in transitions).
+// Here we use microtask by default, but expose a way to force (macro) task when
+// needed (e.g. in event handlers attached by v-on).
+let microTimerFunc
+let macroTimerFunc
+let useMacroTask = false
+
+// Determine (macro) task defer implementation.
+// Technically setImmediate should be the ideal choice, but it's only available
+// in IE. The only polyfill that consistently queues the callback after all DOM
+// events triggered in the same loop is by using MessageChannel.
+/* istanbul ignore if */
+if (typeof setImmediate !== 'undefined' && isNative(setImmediate)) {
+  macroTimerFunc = () => {
+    setImmediate(flushCallbacks)
+  }
+} else if (typeof MessageChannel !== 'undefined' && (
+  isNative(MessageChannel) ||
+  // PhantomJS
+  MessageChannel.toString() === '[object MessageChannelConstructor]'
+)) {
+  const channel = new MessageChannel()
+  const port = channel.port2
+  channel.port1.onmessage = flushCallbacks
+  macroTimerFunc = () => {
+    port.postMessage(1)
+  }
+} else {
+  /* istanbul ignore next */
+  macroTimerFunc = () => {
+    setTimeout(flushCallbacks, 0)
+  }
+}
+
+// Determine microtask defer implementation.
+/* istanbul ignore next, $flow-disable-line */
+if (typeof Promise !== 'undefined' && isNative(Promise)) {
+  const p = Promise.resolve()
+  microTimerFunc = () => {
+    p.then(flushCallbacks)
+    // in problematic UIWebViews, Promise.then doesn't completely break, but
+    // it can get stuck in a weird state where callbacks are pushed into the
+    // microtask queue but the queue isn't being flushed, until the browser
+    // needs to do some other work, e.g. handle a timer. Therefore we can
+    // "force" the microtask queue to be flushed by adding an empty timer.
+    if (isIOS) setTimeout(noop)
+  }
+} else {
+  // fallback to macro
+  microTimerFunc = macroTimerFunc
+}
+
+/**
+ * Wrap a function so that if any code inside triggers state change,
+ * the changes are queued using a (macro) task instead of a microtask.
+ */
+export function withMacroTask (fn: Function): Function {
+  return fn._withTask || (fn._withTask = function () {
+    useMacroTask = true
+    const res = fn.apply(null, arguments)
+    useMacroTask = false
+    return res
+  })
+}
+
+export function nextTick (cb?: Function, ctx?: Object) {
+  let _resolve
+  callbacks.push(() => {
+    if (cb) {
+      try {
+        cb.call(ctx)
+      } catch (e) {
+        handleError(e, ctx, 'nextTick')
+      }
+    } else if (_resolve) {
+      _resolve(ctx)
+    }
+  })
+  if (!pending) {
+    pending = true
+    if (useMacroTask) {
+      macroTimerFunc()
+    } else {
+      microTimerFunc()
+    }
+  }
+  // $flow-disable-line
+  if (!cb && typeof Promise !== 'undefined') {
+    return new Promise(resolve => {
+      _resolve = resolve
+    })
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/core/util/options.js b/advancedcontentfilter/vendor/asset/vue/src/core/util/options.js
new file mode 100644 (file)
index 0000000..5f0d10d
--- /dev/null
@@ -0,0 +1,438 @@
+/* @flow */
+
+import config from '../config'
+import { warn } from './debug'
+import { nativeWatch } from './env'
+import { set } from '../observer/index'
+
+import {
+  ASSET_TYPES,
+  LIFECYCLE_HOOKS
+} from 'shared/constants'
+
+import {
+  extend,
+  hasOwn,
+  camelize,
+  toRawType,
+  capitalize,
+  isBuiltInTag,
+  isPlainObject
+} from 'shared/util'
+
+/**
+ * Option overwriting strategies are functions that handle
+ * how to merge a parent option value and a child option
+ * value into the final value.
+ */
+const strats = config.optionMergeStrategies
+
+/**
+ * Options with restrictions
+ */
+if (process.env.NODE_ENV !== 'production') {
+  strats.el = strats.propsData = function (parent, child, vm, key) {
+    if (!vm) {
+      warn(
+        `option "${key}" can only be used during instance ` +
+        'creation with the `new` keyword.'
+      )
+    }
+    return defaultStrat(parent, child)
+  }
+}
+
+/**
+ * Helper that recursively merges two data objects together.
+ */
+function mergeData (to: Object, from: ?Object): Object {
+  if (!from) return to
+  let key, toVal, fromVal
+  const keys = Object.keys(from)
+  for (let i = 0; i < keys.length; i++) {
+    key = keys[i]
+    toVal = to[key]
+    fromVal = from[key]
+    if (!hasOwn(to, key)) {
+      set(to, key, fromVal)
+    } else if (isPlainObject(toVal) && isPlainObject(fromVal)) {
+      mergeData(toVal, fromVal)
+    }
+  }
+  return to
+}
+
+/**
+ * Data
+ */
+export function mergeDataOrFn (
+  parentVal: any,
+  childVal: any,
+  vm?: Component
+): ?Function {
+  if (!vm) {
+    // in a Vue.extend merge, both should be functions
+    if (!childVal) {
+      return parentVal
+    }
+    if (!parentVal) {
+      return childVal
+    }
+    // when parentVal & childVal are both present,
+    // we need to return a function that returns the
+    // merged result of both functions... no need to
+    // check if parentVal is a function here because
+    // it has to be a function to pass previous merges.
+    return function mergedDataFn () {
+      return mergeData(
+        typeof childVal === 'function' ? childVal.call(this, this) : childVal,
+        typeof parentVal === 'function' ? parentVal.call(this, this) : parentVal
+      )
+    }
+  } else {
+    return function mergedInstanceDataFn () {
+      // instance merge
+      const instanceData = typeof childVal === 'function'
+        ? childVal.call(vm, vm)
+        : childVal
+      const defaultData = typeof parentVal === 'function'
+        ? parentVal.call(vm, vm)
+        : parentVal
+      if (instanceData) {
+        return mergeData(instanceData, defaultData)
+      } else {
+        return defaultData
+      }
+    }
+  }
+}
+
+strats.data = function (
+  parentVal: any,
+  childVal: any,
+  vm?: Component
+): ?Function {
+  if (!vm) {
+    if (childVal && typeof childVal !== 'function') {
+      process.env.NODE_ENV !== 'production' && warn(
+        'The "data" option should be a function ' +
+        'that returns a per-instance value in component ' +
+        'definitions.',
+        vm
+      )
+
+      return parentVal
+    }
+    return mergeDataOrFn(parentVal, childVal)
+  }
+
+  return mergeDataOrFn(parentVal, childVal, vm)
+}
+
+/**
+ * Hooks and props are merged as arrays.
+ */
+function mergeHook (
+  parentVal: ?Array<Function>,
+  childVal: ?Function | ?Array<Function>
+): ?Array<Function> {
+  return childVal
+    ? parentVal
+      ? parentVal.concat(childVal)
+      : Array.isArray(childVal)
+        ? childVal
+        : [childVal]
+    : parentVal
+}
+
+LIFECYCLE_HOOKS.forEach(hook => {
+  strats[hook] = mergeHook
+})
+
+/**
+ * Assets
+ *
+ * When a vm is present (instance creation), we need to do
+ * a three-way merge between constructor options, instance
+ * options and parent options.
+ */
+function mergeAssets (
+  parentVal: ?Object,
+  childVal: ?Object,
+  vm?: Component,
+  key: string
+): Object {
+  const res = Object.create(parentVal || null)
+  if (childVal) {
+    process.env.NODE_ENV !== 'production' && assertObjectType(key, childVal, vm)
+    return extend(res, childVal)
+  } else {
+    return res
+  }
+}
+
+ASSET_TYPES.forEach(function (type) {
+  strats[type + 's'] = mergeAssets
+})
+
+/**
+ * Watchers.
+ *
+ * Watchers hashes should not overwrite one
+ * another, so we merge them as arrays.
+ */
+strats.watch = function (
+  parentVal: ?Object,
+  childVal: ?Object,
+  vm?: Component,
+  key: string
+): ?Object {
+  // work around Firefox's Object.prototype.watch...
+  if (parentVal === nativeWatch) parentVal = undefined
+  if (childVal === nativeWatch) childVal = undefined
+  /* istanbul ignore if */
+  if (!childVal) return Object.create(parentVal || null)
+  if (process.env.NODE_ENV !== 'production') {
+    assertObjectType(key, childVal, vm)
+  }
+  if (!parentVal) return childVal
+  const ret = {}
+  extend(ret, parentVal)
+  for (const key in childVal) {
+    let parent = ret[key]
+    const child = childVal[key]
+    if (parent && !Array.isArray(parent)) {
+      parent = [parent]
+    }
+    ret[key] = parent
+      ? parent.concat(child)
+      : Array.isArray(child) ? child : [child]
+  }
+  return ret
+}
+
+/**
+ * Other object hashes.
+ */
+strats.props =
+strats.methods =
+strats.inject =
+strats.computed = function (
+  parentVal: ?Object,
+  childVal: ?Object,
+  vm?: Component,
+  key: string
+): ?Object {
+  if (childVal && process.env.NODE_ENV !== 'production') {
+    assertObjectType(key, childVal, vm)
+  }
+  if (!parentVal) return childVal
+  const ret = Object.create(null)
+  extend(ret, parentVal)
+  if (childVal) extend(ret, childVal)
+  return ret
+}
+strats.provide = mergeDataOrFn
+
+/**
+ * Default strategy.
+ */
+const defaultStrat = function (parentVal: any, childVal: any): any {
+  return childVal === undefined
+    ? parentVal
+    : childVal
+}
+
+/**
+ * Validate component names
+ */
+function checkComponents (options: Object) {
+  for (const key in options.components) {
+    validateComponentName(key)
+  }
+}
+
+export function validateComponentName (name: string) {
+  if (!/^[a-zA-Z][\w-]*$/.test(name)) {
+    warn(
+      'Invalid component name: "' + name + '". Component names ' +
+      'can only contain alphanumeric characters and the hyphen, ' +
+      'and must start with a letter.'
+    )
+  }
+  if (isBuiltInTag(name) || config.isReservedTag(name)) {
+    warn(
+      'Do not use built-in or reserved HTML elements as component ' +
+      'id: ' + name
+    )
+  }
+}
+
+/**
+ * Ensure all props option syntax are normalized into the
+ * Object-based format.
+ */
+function normalizeProps (options: Object, vm: ?Component) {
+  const props = options.props
+  if (!props) return
+  const res = {}
+  let i, val, name
+  if (Array.isArray(props)) {
+    i = props.length
+    while (i--) {
+      val = props[i]
+      if (typeof val === 'string') {
+        name = camelize(val)
+        res[name] = { type: null }
+      } else if (process.env.NODE_ENV !== 'production') {
+        warn('props must be strings when using array syntax.')
+      }
+    }
+  } else if (isPlainObject(props)) {
+    for (const key in props) {
+      val = props[key]
+      name = camelize(key)
+      res[name] = isPlainObject(val)
+        ? val
+        : { type: val }
+    }
+  } else if (process.env.NODE_ENV !== 'production') {
+    warn(
+      `Invalid value for option "props": expected an Array or an Object, ` +
+      `but got ${toRawType(props)}.`,
+      vm
+    )
+  }
+  options.props = res
+}
+
+/**
+ * Normalize all injections into Object-based format
+ */
+function normalizeInject (options: Object, vm: ?Component) {
+  const inject = options.inject
+  if (!inject) return
+  const normalized = options.inject = {}
+  if (Array.isArray(inject)) {
+    for (let i = 0; i < inject.length; i++) {
+      normalized[inject[i]] = { from: inject[i] }
+    }
+  } else if (isPlainObject(inject)) {
+    for (const key in inject) {
+      const val = inject[key]
+      normalized[key] = isPlainObject(val)
+        ? extend({ from: key }, val)
+        : { from: val }
+    }
+  } else if (process.env.NODE_ENV !== 'production') {
+    warn(
+      `Invalid value for option "inject": expected an Array or an Object, ` +
+      `but got ${toRawType(inject)}.`,
+      vm
+    )
+  }
+}
+
+/**
+ * Normalize raw function directives into object format.
+ */
+function normalizeDirectives (options: Object) {
+  const dirs = options.directives
+  if (dirs) {
+    for (const key in dirs) {
+      const def = dirs[key]
+      if (typeof def === 'function') {
+        dirs[key] = { bind: def, update: def }
+      }
+    }
+  }
+}
+
+function assertObjectType (name: string, value: any, vm: ?Component) {
+  if (!isPlainObject(value)) {
+    warn(
+      `Invalid value for option "${name}": expected an Object, ` +
+      `but got ${toRawType(value)}.`,
+      vm
+    )
+  }
+}
+
+/**
+ * Merge two option objects into a new one.
+ * Core utility used in both instantiation and inheritance.
+ */
+export function mergeOptions (
+  parent: Object,
+  child: Object,
+  vm?: Component
+): Object {
+  if (process.env.NODE_ENV !== 'production') {
+    checkComponents(child)
+  }
+
+  if (typeof child === 'function') {
+    child = child.options
+  }
+
+  normalizeProps(child, vm)
+  normalizeInject(child, vm)
+  normalizeDirectives(child)
+  const extendsFrom = child.extends
+  if (extendsFrom) {
+    parent = mergeOptions(parent, extendsFrom, vm)
+  }
+  if (child.mixins) {
+    for (let i = 0, l = child.mixins.length; i < l; i++) {
+      parent = mergeOptions(parent, child.mixins[i], vm)
+    }
+  }
+  const options = {}
+  let key
+  for (key in parent) {
+    mergeField(key)
+  }
+  for (key in child) {
+    if (!hasOwn(parent, key)) {
+      mergeField(key)
+    }
+  }
+  function mergeField (key) {
+    const strat = strats[key] || defaultStrat
+    options[key] = strat(parent[key], child[key], vm, key)
+  }
+  return options
+}
+
+/**
+ * Resolve an asset.
+ * This function is used because child instances need access
+ * to assets defined in its ancestor chain.
+ */
+export function resolveAsset (
+  options: Object,
+  type: string,
+  id: string,
+  warnMissing?: boolean
+): any {
+  /* istanbul ignore if */
+  if (typeof id !== 'string') {
+    return
+  }
+  const assets = options[type]
+  // check local registration variations first
+  if (hasOwn(assets, id)) return assets[id]
+  const camelizedId = camelize(id)
+  if (hasOwn(assets, camelizedId)) return assets[camelizedId]
+  const PascalCaseId = capitalize(camelizedId)
+  if (hasOwn(assets, PascalCaseId)) return assets[PascalCaseId]
+  // fallback to prototype chain
+  const res = assets[id] || assets[camelizedId] || assets[PascalCaseId]
+  if (process.env.NODE_ENV !== 'production' && warnMissing && !res) {
+    warn(
+      'Failed to resolve ' + type.slice(0, -1) + ': ' + id,
+      options
+    )
+  }
+  return res
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/core/util/perf.js b/advancedcontentfilter/vendor/asset/vue/src/core/util/perf.js
new file mode 100644 (file)
index 0000000..4a537b2
--- /dev/null
@@ -0,0 +1,24 @@
+import { inBrowser } from './env'
+
+export let mark
+export let measure
+
+if (process.env.NODE_ENV !== 'production') {
+  const perf = inBrowser && window.performance
+  /* istanbul ignore if */
+  if (
+    perf &&
+    perf.mark &&
+    perf.measure &&
+    perf.clearMarks &&
+    perf.clearMeasures
+  ) {
+    mark = tag => perf.mark(tag)
+    measure = (name, startTag, endTag) => {
+      perf.measure(name, startTag, endTag)
+      perf.clearMarks(startTag)
+      perf.clearMarks(endTag)
+      perf.clearMeasures(name)
+    }
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/core/util/props.js b/advancedcontentfilter/vendor/asset/vue/src/core/util/props.js
new file mode 100644 (file)
index 0000000..a92643f
--- /dev/null
@@ -0,0 +1,202 @@
+/* @flow */
+
+import { warn } from './debug'
+import { observe, toggleObserving, shouldObserve } from '../observer/index'
+import {
+  hasOwn,
+  isObject,
+  toRawType,
+  hyphenate,
+  capitalize,
+  isPlainObject
+} from 'shared/util'
+
+type PropOptions = {
+  type: Function | Array<Function> | null,
+  default: any,
+  required: ?boolean,
+  validator: ?Function
+};
+
+export function validateProp (
+  key: string,
+  propOptions: Object,
+  propsData: Object,
+  vm?: Component
+): any {
+  const prop = propOptions[key]
+  const absent = !hasOwn(propsData, key)
+  let value = propsData[key]
+  // boolean casting
+  const booleanIndex = getTypeIndex(Boolean, prop.type)
+  if (booleanIndex > -1) {
+    if (absent && !hasOwn(prop, 'default')) {
+      value = false
+    } else if (value === '' || value === hyphenate(key)) {
+      // only cast empty string / same name to boolean if
+      // boolean has higher priority
+      const stringIndex = getTypeIndex(String, prop.type)
+      if (stringIndex < 0 || booleanIndex < stringIndex) {
+        value = true
+      }
+    }
+  }
+  // check default value
+  if (value === undefined) {
+    value = getPropDefaultValue(vm, prop, key)
+    // since the default value is a fresh copy,
+    // make sure to observe it.
+    const prevShouldObserve = shouldObserve
+    toggleObserving(true)
+    observe(value)
+    toggleObserving(prevShouldObserve)
+  }
+  if (
+    process.env.NODE_ENV !== 'production' &&
+    // skip validation for weex recycle-list child component props
+    !(__WEEX__ && isObject(value) && ('@binding' in value))
+  ) {
+    assertProp(prop, key, value, vm, absent)
+  }
+  return value
+}
+
+/**
+ * Get the default value of a prop.
+ */
+function getPropDefaultValue (vm: ?Component, prop: PropOptions, key: string): any {
+  // no default, return undefined
+  if (!hasOwn(prop, 'default')) {
+    return undefined
+  }
+  const def = prop.default
+  // warn against non-factory defaults for Object & Array
+  if (process.env.NODE_ENV !== 'production' && isObject(def)) {
+    warn(
+      'Invalid default value for prop "' + key + '": ' +
+      'Props with type Object/Array must use a factory function ' +
+      'to return the default value.',
+      vm
+    )
+  }
+  // the raw prop value was also undefined from previous render,
+  // return previous default value to avoid unnecessary watcher trigger
+  if (vm && vm.$options.propsData &&
+    vm.$options.propsData[key] === undefined &&
+    vm._props[key] !== undefined
+  ) {
+    return vm._props[key]
+  }
+  // call factory function for non-Function types
+  // a value is Function if its prototype is function even across different execution context
+  return typeof def === 'function' && getType(prop.type) !== 'Function'
+    ? def.call(vm)
+    : def
+}
+
+/**
+ * Assert whether a prop is valid.
+ */
+function assertProp (
+  prop: PropOptions,
+  name: string,
+  value: any,
+  vm: ?Component,
+  absent: boolean
+) {
+  if (prop.required && absent) {
+    warn(
+      'Missing required prop: "' + name + '"',
+      vm
+    )
+    return
+  }
+  if (value == null && !prop.required) {
+    return
+  }
+  let type = prop.type
+  let valid = !type || type === true
+  const expectedTypes = []
+  if (type) {
+    if (!Array.isArray(type)) {
+      type = [type]
+    }
+    for (let i = 0; i < type.length && !valid; i++) {
+      const assertedType = assertType(value, type[i])
+      expectedTypes.push(assertedType.expectedType || '')
+      valid = assertedType.valid
+    }
+  }
+  if (!valid) {
+    warn(
+      `Invalid prop: type check failed for prop "${name}".` +
+      ` Expected ${expectedTypes.map(capitalize).join(', ')}` +
+      `, got ${toRawType(value)}.`,
+      vm
+    )
+    return
+  }
+  const validator = prop.validator
+  if (validator) {
+    if (!validator(value)) {
+      warn(
+        'Invalid prop: custom validator check failed for prop "' + name + '".',
+        vm
+      )
+    }
+  }
+}
+
+const simpleCheckRE = /^(String|Number|Boolean|Function|Symbol)$/
+
+function assertType (value: any, type: Function): {
+  valid: boolean;
+  expectedType: string;
+} {
+  let valid
+  const expectedType = getType(type)
+  if (simpleCheckRE.test(expectedType)) {
+    const t = typeof value
+    valid = t === expectedType.toLowerCase()
+    // for primitive wrapper objects
+    if (!valid && t === 'object') {
+      valid = value instanceof type
+    }
+  } else if (expectedType === 'Object') {
+    valid = isPlainObject(value)
+  } else if (expectedType === 'Array') {
+    valid = Array.isArray(value)
+  } else {
+    valid = value instanceof type
+  }
+  return {
+    valid,
+    expectedType
+  }
+}
+
+/**
+ * Use function string name to check built-in types,
+ * because a simple equality check will fail when running
+ * across different vms / iframes.
+ */
+function getType (fn) {
+  const match = fn && fn.toString().match(/^\s*function (\w+)/)
+  return match ? match[1] : ''
+}
+
+function isSameType (a, b) {
+  return getType(a) === getType(b)
+}
+
+function getTypeIndex (type, expectedTypes): number {
+  if (!Array.isArray(expectedTypes)) {
+    return isSameType(expectedTypes, type) ? 0 : -1
+  }
+  for (let i = 0, len = expectedTypes.length; i < len; i++) {
+    if (isSameType(expectedTypes[i], type)) {
+      return i
+    }
+  }
+  return -1
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/core/vdom/create-component.js b/advancedcontentfilter/vendor/asset/vue/src/core/vdom/create-component.js
new file mode 100644 (file)
index 0000000..8957822
--- /dev/null
@@ -0,0 +1,257 @@
+/* @flow */
+
+import VNode from './vnode'
+import { resolveConstructorOptions } from 'core/instance/init'
+import { queueActivatedComponent } from 'core/observer/scheduler'
+import { createFunctionalComponent } from './create-functional-component'
+
+import {
+  warn,
+  isDef,
+  isUndef,
+  isTrue,
+  isObject
+} from '../util/index'
+
+import {
+  resolveAsyncComponent,
+  createAsyncPlaceholder,
+  extractPropsFromVNodeData
+} from './helpers/index'
+
+import {
+  callHook,
+  activeInstance,
+  updateChildComponent,
+  activateChildComponent,
+  deactivateChildComponent
+} from '../instance/lifecycle'
+
+import {
+  isRecyclableComponent,
+  renderRecyclableComponentTemplate
+} from 'weex/runtime/recycle-list/render-component-template'
+
+// inline hooks to be invoked on component VNodes during patch
+const componentVNodeHooks = {
+  init (
+    vnode: VNodeWithData,
+    hydrating: boolean,
+    parentElm: ?Node,
+    refElm: ?Node
+  ): ?boolean {
+    if (
+      vnode.componentInstance &&
+      !vnode.componentInstance._isDestroyed &&
+      vnode.data.keepAlive
+    ) {
+      // kept-alive components, treat as a patch
+      const mountedNode: any = vnode // work around flow
+      componentVNodeHooks.prepatch(mountedNode, mountedNode)
+    } else {
+      const child = vnode.componentInstance = createComponentInstanceForVnode(
+        vnode,
+        activeInstance,
+        parentElm,
+        refElm
+      )
+      child.$mount(hydrating ? vnode.elm : undefined, hydrating)
+    }
+  },
+
+  prepatch (oldVnode: MountedComponentVNode, vnode: MountedComponentVNode) {
+    const options = vnode.componentOptions
+    const child = vnode.componentInstance = oldVnode.componentInstance
+    updateChildComponent(
+      child,
+      options.propsData, // updated props
+      options.listeners, // updated listeners
+      vnode, // new parent vnode
+      options.children // new children
+    )
+  },
+
+  insert (vnode: MountedComponentVNode) {
+    const { context, componentInstance } = vnode
+    if (!componentInstance._isMounted) {
+      componentInstance._isMounted = true
+      callHook(componentInstance, 'mounted')
+    }
+    if (vnode.data.keepAlive) {
+      if (context._isMounted) {
+        // vue-router#1212
+        // During updates, a kept-alive component's child components may
+        // change, so directly walking the tree here may call activated hooks
+        // on incorrect children. Instead we push them into a queue which will
+        // be processed after the whole patch process ended.
+        queueActivatedComponent(componentInstance)
+      } else {
+        activateChildComponent(componentInstance, true /* direct */)
+      }
+    }
+  },
+
+  destroy (vnode: MountedComponentVNode) {
+    const { componentInstance } = vnode
+    if (!componentInstance._isDestroyed) {
+      if (!vnode.data.keepAlive) {
+        componentInstance.$destroy()
+      } else {
+        deactivateChildComponent(componentInstance, true /* direct */)
+      }
+    }
+  }
+}
+
+const hooksToMerge = Object.keys(componentVNodeHooks)
+
+export function createComponent (
+  Ctor: Class<Component> | Function | Object | void,
+  data: ?VNodeData,
+  context: Component,
+  children: ?Array<VNode>,
+  tag?: string
+): VNode | Array<VNode> | void {
+  if (isUndef(Ctor)) {
+    return
+  }
+
+  const baseCtor = context.$options._base
+
+  // plain options object: turn it into a constructor
+  if (isObject(Ctor)) {
+    Ctor = baseCtor.extend(Ctor)
+  }
+
+  // if at this stage it's not a constructor or an async component factory,
+  // reject.
+  if (typeof Ctor !== 'function') {
+    if (process.env.NODE_ENV !== 'production') {
+      warn(`Invalid Component definition: ${String(Ctor)}`, context)
+    }
+    return
+  }
+
+  // async component
+  let asyncFactory
+  if (isUndef(Ctor.cid)) {
+    asyncFactory = Ctor
+    Ctor = resolveAsyncComponent(asyncFactory, baseCtor, context)
+    if (Ctor === undefined) {
+      // return a placeholder node for async component, which is rendered
+      // as a comment node but preserves all the raw information for the node.
+      // the information will be used for async server-rendering and hydration.
+      return createAsyncPlaceholder(
+        asyncFactory,
+        data,
+        context,
+        children,
+        tag
+      )
+    }
+  }
+
+  data = data || {}
+
+  // resolve constructor options in case global mixins are applied after
+  // component constructor creation
+  resolveConstructorOptions(Ctor)
+
+  // transform component v-model data into props & events
+  if (isDef(data.model)) {
+    transformModel(Ctor.options, data)
+  }
+
+  // extract props
+  const propsData = extractPropsFromVNodeData(data, Ctor, tag)
+
+  // functional component
+  if (isTrue(Ctor.options.functional)) {
+    return createFunctionalComponent(Ctor, propsData, data, context, children)
+  }
+
+  // extract listeners, since these needs to be treated as
+  // child component listeners instead of DOM listeners
+  const listeners = data.on
+  // replace with listeners with .native modifier
+  // so it gets processed during parent component patch.
+  data.on = data.nativeOn
+
+  if (isTrue(Ctor.options.abstract)) {
+    // abstract components do not keep anything
+    // other than props & listeners & slot
+
+    // work around flow
+    const slot = data.slot
+    data = {}
+    if (slot) {
+      data.slot = slot
+    }
+  }
+
+  // install component management hooks onto the placeholder node
+  installComponentHooks(data)
+
+  // return a placeholder vnode
+  const name = Ctor.options.name || tag
+  const vnode = new VNode(
+    `vue-component-${Ctor.cid}${name ? `-${name}` : ''}`,
+    data, undefined, undefined, undefined, context,
+    { Ctor, propsData, listeners, tag, children },
+    asyncFactory
+  )
+
+  // Weex specific: invoke recycle-list optimized @render function for
+  // extracting cell-slot template.
+  // https://github.com/Hanks10100/weex-native-directive/tree/master/component
+  /* istanbul ignore if */
+  if (__WEEX__ && isRecyclableComponent(vnode)) {
+    return renderRecyclableComponentTemplate(vnode)
+  }
+
+  return vnode
+}
+
+export function createComponentInstanceForVnode (
+  vnode: any, // we know it's MountedComponentVNode but flow doesn't
+  parent: any, // activeInstance in lifecycle state
+  parentElm?: ?Node,
+  refElm?: ?Node
+): Component {
+  const options: InternalComponentOptions = {
+    _isComponent: true,
+    parent,
+    _parentVnode: vnode,
+    _parentElm: parentElm || null,
+    _refElm: refElm || null
+  }
+  // check inline-template render functions
+  const inlineTemplate = vnode.data.inlineTemplate
+  if (isDef(inlineTemplate)) {
+    options.render = inlineTemplate.render
+    options.staticRenderFns = inlineTemplate.staticRenderFns
+  }
+  return new vnode.componentOptions.Ctor(options)
+}
+
+function installComponentHooks (data: VNodeData) {
+  const hooks = data.hook || (data.hook = {})
+  for (let i = 0; i < hooksToMerge.length; i++) {
+    const key = hooksToMerge[i]
+    hooks[key] = componentVNodeHooks[key]
+  }
+}
+
+// transform component v-model info (value and callback) into
+// prop and event handler respectively.
+function transformModel (options, data: any) {
+  const prop = (options.model && options.model.prop) || 'value'
+  const event = (options.model && options.model.event) || 'input'
+  ;(data.props || (data.props = {}))[prop] = data.model.value
+  const on = data.on || (data.on = {})
+  if (isDef(on[event])) {
+    on[event] = [data.model.callback].concat(on[event])
+  } else {
+    on[event] = data.model.callback
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/core/vdom/create-element.js b/advancedcontentfilter/vendor/asset/vue/src/core/vdom/create-element.js
new file mode 100644 (file)
index 0000000..c5cde2c
--- /dev/null
@@ -0,0 +1,160 @@
+/* @flow */
+
+import config from '../config'
+import VNode, { createEmptyVNode } from './vnode'
+import { createComponent } from './create-component'
+import { traverse } from '../observer/traverse'
+
+import {
+  warn,
+  isDef,
+  isUndef,
+  isTrue,
+  isObject,
+  isPrimitive,
+  resolveAsset
+} from '../util/index'
+
+import {
+  normalizeChildren,
+  simpleNormalizeChildren
+} from './helpers/index'
+
+const SIMPLE_NORMALIZE = 1
+const ALWAYS_NORMALIZE = 2
+
+// wrapper function for providing a more flexible interface
+// without getting yelled at by flow
+export function createElement (
+  context: Component,
+  tag: any,
+  data: any,
+  children: any,
+  normalizationType: any,
+  alwaysNormalize: boolean
+): VNode | Array<VNode> {
+  if (Array.isArray(data) || isPrimitive(data)) {
+    normalizationType = children
+    children = data
+    data = undefined
+  }
+  if (isTrue(alwaysNormalize)) {
+    normalizationType = ALWAYS_NORMALIZE
+  }
+  return _createElement(context, tag, data, children, normalizationType)
+}
+
+export function _createElement (
+  context: Component,
+  tag?: string | Class<Component> | Function | Object,
+  data?: VNodeData,
+  children?: any,
+  normalizationType?: number
+): VNode | Array<VNode> {
+  if (isDef(data) && isDef((data: any).__ob__)) {
+    process.env.NODE_ENV !== 'production' && warn(
+      `Avoid using observed data object as vnode data: ${JSON.stringify(data)}\n` +
+      'Always create fresh vnode data objects in each render!',
+      context
+    )
+    return createEmptyVNode()
+  }
+  // object syntax in v-bind
+  if (isDef(data) && isDef(data.is)) {
+    tag = data.is
+  }
+  if (!tag) {
+    // in case of component :is set to falsy value
+    return createEmptyVNode()
+  }
+  // warn against non-primitive key
+  if (process.env.NODE_ENV !== 'production' &&
+    isDef(data) && isDef(data.key) && !isPrimitive(data.key)
+  ) {
+    if (!__WEEX__ || !('@binding' in data.key)) {
+      warn(
+        'Avoid using non-primitive value as key, ' +
+        'use string/number value instead.',
+        context
+      )
+    }
+  }
+  // support single function children as default scoped slot
+  if (Array.isArray(children) &&
+    typeof children[0] === 'function'
+  ) {
+    data = data || {}
+    data.scopedSlots = { default: children[0] }
+    children.length = 0
+  }
+  if (normalizationType === ALWAYS_NORMALIZE) {
+    children = normalizeChildren(children)
+  } else if (normalizationType === SIMPLE_NORMALIZE) {
+    children = simpleNormalizeChildren(children)
+  }
+  let vnode, ns
+  if (typeof tag === 'string') {
+    let Ctor
+    ns = (context.$vnode && context.$vnode.ns) || config.getTagNamespace(tag)
+    if (config.isReservedTag(tag)) {
+      // platform built-in elements
+      vnode = new VNode(
+        config.parsePlatformTagName(tag), data, children,
+        undefined, undefined, context
+      )
+    } else if (isDef(Ctor = resolveAsset(context.$options, 'components', tag))) {
+      // component
+      vnode = createComponent(Ctor, data, context, children, tag)
+    } else {
+      // unknown or unlisted namespaced elements
+      // check at runtime because it may get assigned a namespace when its
+      // parent normalizes children
+      vnode = new VNode(
+        tag, data, children,
+        undefined, undefined, context
+      )
+    }
+  } else {
+    // direct component options / constructor
+    vnode = createComponent(tag, data, context, children)
+  }
+  if (Array.isArray(vnode)) {
+    return vnode
+  } else if (isDef(vnode)) {
+    if (isDef(ns)) applyNS(vnode, ns)
+    if (isDef(data)) registerDeepBindings(data)
+    return vnode
+  } else {
+    return createEmptyVNode()
+  }
+}
+
+function applyNS (vnode, ns, force) {
+  vnode.ns = ns
+  if (vnode.tag === 'foreignObject') {
+    // use default namespace inside foreignObject
+    ns = undefined
+    force = true
+  }
+  if (isDef(vnode.children)) {
+    for (let i = 0, l = vnode.children.length; i < l; i++) {
+      const child = vnode.children[i]
+      if (isDef(child.tag) && (
+        isUndef(child.ns) || (isTrue(force) && child.tag !== 'svg'))) {
+        applyNS(child, ns, force)
+      }
+    }
+  }
+}
+
+// ref #5318
+// necessary to ensure parent re-render when deep bindings like :style and
+// :class are used on slot nodes
+function registerDeepBindings (data) {
+  if (isObject(data.style)) {
+    traverse(data.style)
+  }
+  if (isObject(data.class)) {
+    traverse(data.class)
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/core/vdom/create-functional-component.js b/advancedcontentfilter/vendor/asset/vue/src/core/vdom/create-functional-component.js
new file mode 100644 (file)
index 0000000..efed801
--- /dev/null
@@ -0,0 +1,136 @@
+/* @flow */
+
+import VNode, { cloneVNode } from './vnode'
+import { createElement } from './create-element'
+import { resolveInject } from '../instance/inject'
+import { normalizeChildren } from '../vdom/helpers/normalize-children'
+import { resolveSlots } from '../instance/render-helpers/resolve-slots'
+import { installRenderHelpers } from '../instance/render-helpers/index'
+
+import {
+  isDef,
+  isTrue,
+  hasOwn,
+  camelize,
+  emptyObject,
+  validateProp
+} from '../util/index'
+
+export function FunctionalRenderContext (
+  data: VNodeData,
+  props: Object,
+  children: ?Array<VNode>,
+  parent: Component,
+  Ctor: Class<Component>
+) {
+  const options = Ctor.options
+  // ensure the createElement function in functional components
+  // gets a unique context - this is necessary for correct named slot check
+  let contextVm
+  if (hasOwn(parent, '_uid')) {
+    contextVm = Object.create(parent)
+    // $flow-disable-line
+    contextVm._original = parent
+  } else {
+    // the context vm passed in is a functional context as well.
+    // in this case we want to make sure we are able to get a hold to the
+    // real context instance.
+    contextVm = parent
+    // $flow-disable-line
+    parent = parent._original
+  }
+  const isCompiled = isTrue(options._compiled)
+  const needNormalization = !isCompiled
+
+  this.data = data
+  this.props = props
+  this.children = children
+  this.parent = parent
+  this.listeners = data.on || emptyObject
+  this.injections = resolveInject(options.inject, parent)
+  this.slots = () => resolveSlots(children, parent)
+
+  // support for compiled functional template
+  if (isCompiled) {
+    // exposing $options for renderStatic()
+    this.$options = options
+    // pre-resolve slots for renderSlot()
+    this.$slots = this.slots()
+    this.$scopedSlots = data.scopedSlots || emptyObject
+  }
+
+  if (options._scopeId) {
+    this._c = (a, b, c, d) => {
+      const vnode = createElement(contextVm, a, b, c, d, needNormalization)
+      if (vnode && !Array.isArray(vnode)) {
+        vnode.fnScopeId = options._scopeId
+        vnode.fnContext = parent
+      }
+      return vnode
+    }
+  } else {
+    this._c = (a, b, c, d) => createElement(contextVm, a, b, c, d, needNormalization)
+  }
+}
+
+installRenderHelpers(FunctionalRenderContext.prototype)
+
+export function createFunctionalComponent (
+  Ctor: Class<Component>,
+  propsData: ?Object,
+  data: VNodeData,
+  contextVm: Component,
+  children: ?Array<VNode>
+): VNode | Array<VNode> | void {
+  const options = Ctor.options
+  const props = {}
+  const propOptions = options.props
+  if (isDef(propOptions)) {
+    for (const key in propOptions) {
+      props[key] = validateProp(key, propOptions, propsData || emptyObject)
+    }
+  } else {
+    if (isDef(data.attrs)) mergeProps(props, data.attrs)
+    if (isDef(data.props)) mergeProps(props, data.props)
+  }
+
+  const renderContext = new FunctionalRenderContext(
+    data,
+    props,
+    children,
+    contextVm,
+    Ctor
+  )
+
+  const vnode = options.render.call(null, renderContext._c, renderContext)
+
+  if (vnode instanceof VNode) {
+    return cloneAndMarkFunctionalResult(vnode, data, renderContext.parent, options)
+  } else if (Array.isArray(vnode)) {
+    const vnodes = normalizeChildren(vnode) || []
+    const res = new Array(vnodes.length)
+    for (let i = 0; i < vnodes.length; i++) {
+      res[i] = cloneAndMarkFunctionalResult(vnodes[i], data, renderContext.parent, options)
+    }
+    return res
+  }
+}
+
+function cloneAndMarkFunctionalResult (vnode, data, contextVm, options) {
+  // #7817 clone node before setting fnContext, otherwise if the node is reused
+  // (e.g. it was from a cached normal slot) the fnContext causes named slots
+  // that should not be matched to match.
+  const clone = cloneVNode(vnode)
+  clone.fnContext = contextVm
+  clone.fnOptions = options
+  if (data.slot) {
+    (clone.data || (clone.data = {})).slot = data.slot
+  }
+  return clone
+}
+
+function mergeProps (to, from) {
+  for (const key in from) {
+    to[camelize(key)] = from[key]
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/core/vdom/helpers/extract-props.js b/advancedcontentfilter/vendor/asset/vue/src/core/vdom/helpers/extract-props.js
new file mode 100644 (file)
index 0000000..f2a4166
--- /dev/null
@@ -0,0 +1,75 @@
+/* @flow */
+
+import {
+  tip,
+  hasOwn,
+  isDef,
+  isUndef,
+  hyphenate,
+  formatComponentName
+} from 'core/util/index'
+
+export function extractPropsFromVNodeData (
+  data: VNodeData,
+  Ctor: Class<Component>,
+  tag?: string
+): ?Object {
+  // we are only extracting raw values here.
+  // validation and default values are handled in the child
+  // component itself.
+  const propOptions = Ctor.options.props
+  if (isUndef(propOptions)) {
+    return
+  }
+  const res = {}
+  const { attrs, props } = data
+  if (isDef(attrs) || isDef(props)) {
+    for (const key in propOptions) {
+      const altKey = hyphenate(key)
+      if (process.env.NODE_ENV !== 'production') {
+        const keyInLowerCase = key.toLowerCase()
+        if (
+          key !== keyInLowerCase &&
+          attrs && hasOwn(attrs, keyInLowerCase)
+        ) {
+          tip(
+            `Prop "${keyInLowerCase}" is passed to component ` +
+            `${formatComponentName(tag || Ctor)}, but the declared prop name is` +
+            ` "${key}". ` +
+            `Note that HTML attributes are case-insensitive and camelCased ` +
+            `props need to use their kebab-case equivalents when using in-DOM ` +
+            `templates. You should probably use "${altKey}" instead of "${key}".`
+          )
+        }
+      }
+      checkProp(res, props, key, altKey, true) ||
+      checkProp(res, attrs, key, altKey, false)
+    }
+  }
+  return res
+}
+
+function checkProp (
+  res: Object,
+  hash: ?Object,
+  key: string,
+  altKey: string,
+  preserve: boolean
+): boolean {
+  if (isDef(hash)) {
+    if (hasOwn(hash, key)) {
+      res[key] = hash[key]
+      if (!preserve) {
+        delete hash[key]
+      }
+      return true
+    } else if (hasOwn(hash, altKey)) {
+      res[key] = hash[altKey]
+      if (!preserve) {
+        delete hash[altKey]
+      }
+      return true
+    }
+  }
+  return false
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/core/vdom/helpers/get-first-component-child.js b/advancedcontentfilter/vendor/asset/vue/src/core/vdom/helpers/get-first-component-child.js
new file mode 100644 (file)
index 0000000..f8649dd
--- /dev/null
@@ -0,0 +1,15 @@
+/* @flow */
+
+import { isDef } from 'shared/util'
+import { isAsyncPlaceholder } from './is-async-placeholder'
+
+export function getFirstComponentChild (children: ?Array<VNode>): ?VNode {
+  if (Array.isArray(children)) {
+    for (let i = 0; i < children.length; i++) {
+      const c = children[i]
+      if (isDef(c) && (isDef(c.componentOptions) || isAsyncPlaceholder(c))) {
+        return c
+      }
+    }
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/core/vdom/helpers/index.js b/advancedcontentfilter/vendor/asset/vue/src/core/vdom/helpers/index.js
new file mode 100644 (file)
index 0000000..320cf4c
--- /dev/null
@@ -0,0 +1,9 @@
+/* @flow */
+
+export * from './merge-hook'
+export * from './extract-props'
+export * from './update-listeners'
+export * from './normalize-children'
+export * from './resolve-async-component'
+export * from './get-first-component-child'
+export * from './is-async-placeholder'
diff --git a/advancedcontentfilter/vendor/asset/vue/src/core/vdom/helpers/is-async-placeholder.js b/advancedcontentfilter/vendor/asset/vue/src/core/vdom/helpers/is-async-placeholder.js
new file mode 100644 (file)
index 0000000..6c4a659
--- /dev/null
@@ -0,0 +1,5 @@
+/* @flow */
+
+export function isAsyncPlaceholder (node: VNode): boolean {
+  return node.isComment && node.asyncFactory
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/core/vdom/helpers/merge-hook.js b/advancedcontentfilter/vendor/asset/vue/src/core/vdom/helpers/merge-hook.js
new file mode 100644 (file)
index 0000000..0bb96e8
--- /dev/null
@@ -0,0 +1,38 @@
+/* @flow */
+
+import VNode from '../vnode'
+import { createFnInvoker } from './update-listeners'
+import { remove, isDef, isUndef, isTrue } from 'shared/util'
+
+export function mergeVNodeHook (def: Object, hookKey: string, hook: Function) {
+  if (def instanceof VNode) {
+    def = def.data.hook || (def.data.hook = {})
+  }
+  let invoker
+  const oldHook = def[hookKey]
+
+  function wrappedHook () {
+    hook.apply(this, arguments)
+    // important: remove merged hook to ensure it's called only once
+    // and prevent memory leak
+    remove(invoker.fns, wrappedHook)
+  }
+
+  if (isUndef(oldHook)) {
+    // no existing hook
+    invoker = createFnInvoker([wrappedHook])
+  } else {
+    /* istanbul ignore if */
+    if (isDef(oldHook.fns) && isTrue(oldHook.merged)) {
+      // already a merged invoker
+      invoker = oldHook
+      invoker.fns.push(wrappedHook)
+    } else {
+      // existing plain hook
+      invoker = createFnInvoker([oldHook, wrappedHook])
+    }
+  }
+
+  invoker.merged = true
+  def[hookKey] = invoker
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/core/vdom/helpers/normalize-children.js b/advancedcontentfilter/vendor/asset/vue/src/core/vdom/helpers/normalize-children.js
new file mode 100644 (file)
index 0000000..a4622ef
--- /dev/null
@@ -0,0 +1,89 @@
+/* @flow */
+
+import VNode, { createTextVNode } from 'core/vdom/vnode'
+import { isFalse, isTrue, isDef, isUndef, isPrimitive } from 'shared/util'
+
+// The template compiler attempts to minimize the need for normalization by
+// statically analyzing the template at compile time.
+//
+// For plain HTML markup, normalization can be completely skipped because the
+// generated render function is guaranteed to return Array<VNode>. There are
+// two cases where extra normalization is needed:
+
+// 1. When the children contains components - because a functional component
+// may return an Array instead of a single root. In this case, just a simple
+// normalization is needed - if any child is an Array, we flatten the whole
+// thing with Array.prototype.concat. It is guaranteed to be only 1-level deep
+// because functional components already normalize their own children.
+export function simpleNormalizeChildren (children: any) {
+  for (let i = 0; i < children.length; i++) {
+    if (Array.isArray(children[i])) {
+      return Array.prototype.concat.apply([], children)
+    }
+  }
+  return children
+}
+
+// 2. When the children contains constructs that always generated nested Arrays,
+// e.g. <template>, <slot>, v-for, or when the children is provided by user
+// with hand-written render functions / JSX. In such cases a full normalization
+// is needed to cater to all possible types of children values.
+export function normalizeChildren (children: any): ?Array<VNode> {
+  return isPrimitive(children)
+    ? [createTextVNode(children)]
+    : Array.isArray(children)
+      ? normalizeArrayChildren(children)
+      : undefined
+}
+
+function isTextNode (node): boolean {
+  return isDef(node) && isDef(node.text) && isFalse(node.isComment)
+}
+
+function normalizeArrayChildren (children: any, nestedIndex?: string): Array<VNode> {
+  const res = []
+  let i, c, lastIndex, last
+  for (i = 0; i < children.length; i++) {
+    c = children[i]
+    if (isUndef(c) || typeof c === 'boolean') continue
+    lastIndex = res.length - 1
+    last = res[lastIndex]
+    //  nested
+    if (Array.isArray(c)) {
+      if (c.length > 0) {
+        c = normalizeArrayChildren(c, `${nestedIndex || ''}_${i}`)
+        // merge adjacent text nodes
+        if (isTextNode(c[0]) && isTextNode(last)) {
+          res[lastIndex] = createTextVNode(last.text + (c[0]: any).text)
+          c.shift()
+        }
+        res.push.apply(res, c)
+      }
+    } else if (isPrimitive(c)) {
+      if (isTextNode(last)) {
+        // merge adjacent text nodes
+        // this is necessary for SSR hydration because text nodes are
+        // essentially merged when rendered to HTML strings
+        res[lastIndex] = createTextVNode(last.text + c)
+      } else if (c !== '') {
+        // convert primitive to vnode
+        res.push(createTextVNode(c))
+      }
+    } else {
+      if (isTextNode(c) && isTextNode(last)) {
+        // merge adjacent text nodes
+        res[lastIndex] = createTextVNode(last.text + c.text)
+      } else {
+        // default key for nested array children (likely generated by v-for)
+        if (isTrue(children._isVList) &&
+          isDef(c.tag) &&
+          isUndef(c.key) &&
+          isDef(nestedIndex)) {
+          c.key = `__vlist${nestedIndex}_${i}__`
+        }
+        res.push(c)
+      }
+    }
+  }
+  return res
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/core/vdom/helpers/resolve-async-component.js b/advancedcontentfilter/vendor/asset/vue/src/core/vdom/helpers/resolve-async-component.js
new file mode 100644 (file)
index 0000000..99ce5ce
--- /dev/null
@@ -0,0 +1,140 @@
+/* @flow */
+
+import {
+  warn,
+  once,
+  isDef,
+  isUndef,
+  isTrue,
+  isObject,
+  hasSymbol
+} from 'core/util/index'
+
+import { createEmptyVNode } from 'core/vdom/vnode'
+
+function ensureCtor (comp: any, base) {
+  if (
+    comp.__esModule ||
+    (hasSymbol && comp[Symbol.toStringTag] === 'Module')
+  ) {
+    comp = comp.default
+  }
+  return isObject(comp)
+    ? base.extend(comp)
+    : comp
+}
+
+export function createAsyncPlaceholder (
+  factory: Function,
+  data: ?VNodeData,
+  context: Component,
+  children: ?Array<VNode>,
+  tag: ?string
+): VNode {
+  const node = createEmptyVNode()
+  node.asyncFactory = factory
+  node.asyncMeta = { data, context, children, tag }
+  return node
+}
+
+export function resolveAsyncComponent (
+  factory: Function,
+  baseCtor: Class<Component>,
+  context: Component
+): Class<Component> | void {
+  if (isTrue(factory.error) && isDef(factory.errorComp)) {
+    return factory.errorComp
+  }
+
+  if (isDef(factory.resolved)) {
+    return factory.resolved
+  }
+
+  if (isTrue(factory.loading) && isDef(factory.loadingComp)) {
+    return factory.loadingComp
+  }
+
+  if (isDef(factory.contexts)) {
+    // already pending
+    factory.contexts.push(context)
+  } else {
+    const contexts = factory.contexts = [context]
+    let sync = true
+
+    const forceRender = () => {
+      for (let i = 0, l = contexts.length; i < l; i++) {
+        contexts[i].$forceUpdate()
+      }
+    }
+
+    const resolve = once((res: Object | Class<Component>) => {
+      // cache resolved
+      factory.resolved = ensureCtor(res, baseCtor)
+      // invoke callbacks only if this is not a synchronous resolve
+      // (async resolves are shimmed as synchronous during SSR)
+      if (!sync) {
+        forceRender()
+      }
+    })
+
+    const reject = once(reason => {
+      process.env.NODE_ENV !== 'production' && warn(
+        `Failed to resolve async component: ${String(factory)}` +
+        (reason ? `\nReason: ${reason}` : '')
+      )
+      if (isDef(factory.errorComp)) {
+        factory.error = true
+        forceRender()
+      }
+    })
+
+    const res = factory(resolve, reject)
+
+    if (isObject(res)) {
+      if (typeof res.then === 'function') {
+        // () => Promise
+        if (isUndef(factory.resolved)) {
+          res.then(resolve, reject)
+        }
+      } else if (isDef(res.component) && typeof res.component.then === 'function') {
+        res.component.then(resolve, reject)
+
+        if (isDef(res.error)) {
+          factory.errorComp = ensureCtor(res.error, baseCtor)
+        }
+
+        if (isDef(res.loading)) {
+          factory.loadingComp = ensureCtor(res.loading, baseCtor)
+          if (res.delay === 0) {
+            factory.loading = true
+          } else {
+            setTimeout(() => {
+              if (isUndef(factory.resolved) && isUndef(factory.error)) {
+                factory.loading = true
+                forceRender()
+              }
+            }, res.delay || 200)
+          }
+        }
+
+        if (isDef(res.timeout)) {
+          setTimeout(() => {
+            if (isUndef(factory.resolved)) {
+              reject(
+                process.env.NODE_ENV !== 'production'
+                  ? `timeout (${res.timeout}ms)`
+                  : null
+              )
+            }
+          }, res.timeout)
+        }
+      }
+    }
+
+    sync = false
+    // return in case resolved synchronously
+    return factory.loading
+      ? factory.loadingComp
+      : factory.resolved
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/core/vdom/helpers/update-listeners.js b/advancedcontentfilter/vendor/asset/vue/src/core/vdom/helpers/update-listeners.js
new file mode 100644 (file)
index 0000000..11c5a2c
--- /dev/null
@@ -0,0 +1,83 @@
+/* @flow */
+
+import { warn } from 'core/util/index'
+import { cached, isUndef, isPlainObject } from 'shared/util'
+
+const normalizeEvent = cached((name: string): {
+  name: string,
+  once: boolean,
+  capture: boolean,
+  passive: boolean,
+  handler?: Function,
+  params?: Array<any>
+} => {
+  const passive = name.charAt(0) === '&'
+  name = passive ? name.slice(1) : name
+  const once = name.charAt(0) === '~' // Prefixed last, checked first
+  name = once ? name.slice(1) : name
+  const capture = name.charAt(0) === '!'
+  name = capture ? name.slice(1) : name
+  return {
+    name,
+    once,
+    capture,
+    passive
+  }
+})
+
+export function createFnInvoker (fns: Function | Array<Function>): Function {
+  function invoker () {
+    const fns = invoker.fns
+    if (Array.isArray(fns)) {
+      const cloned = fns.slice()
+      for (let i = 0; i < cloned.length; i++) {
+        cloned[i].apply(null, arguments)
+      }
+    } else {
+      // return handler return value for single handlers
+      return fns.apply(null, arguments)
+    }
+  }
+  invoker.fns = fns
+  return invoker
+}
+
+export function updateListeners (
+  on: Object,
+  oldOn: Object,
+  add: Function,
+  remove: Function,
+  vm: Component
+) {
+  let name, def, cur, old, event
+  for (name in on) {
+    def = cur = on[name]
+    old = oldOn[name]
+    event = normalizeEvent(name)
+    /* istanbul ignore if */
+    if (__WEEX__ && isPlainObject(def)) {
+      cur = def.handler
+      event.params = def.params
+    }
+    if (isUndef(cur)) {
+      process.env.NODE_ENV !== 'production' && warn(
+        `Invalid handler for event "${event.name}": got ` + String(cur),
+        vm
+      )
+    } else if (isUndef(old)) {
+      if (isUndef(cur.fns)) {
+        cur = on[name] = createFnInvoker(cur)
+      }
+      add(event.name, cur, event.once, event.capture, event.passive, event.params)
+    } else if (cur !== old) {
+      old.fns = cur
+      on[name] = old
+    }
+  }
+  for (name in oldOn) {
+    if (isUndef(on[name])) {
+      event = normalizeEvent(name)
+      remove(event.name, oldOn[name], event.capture)
+    }
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/core/vdom/modules/directives.js b/advancedcontentfilter/vendor/asset/vue/src/core/vdom/modules/directives.js
new file mode 100644 (file)
index 0000000..639982f
--- /dev/null
@@ -0,0 +1,119 @@
+/* @flow */
+
+import { emptyNode } from 'core/vdom/patch'
+import { resolveAsset, handleError } from 'core/util/index'
+import { mergeVNodeHook } from 'core/vdom/helpers/index'
+
+export default {
+  create: updateDirectives,
+  update: updateDirectives,
+  destroy: function unbindDirectives (vnode: VNodeWithData) {
+    updateDirectives(vnode, emptyNode)
+  }
+}
+
+function updateDirectives (oldVnode: VNodeWithData, vnode: VNodeWithData) {
+  if (oldVnode.data.directives || vnode.data.directives) {
+    _update(oldVnode, vnode)
+  }
+}
+
+function _update (oldVnode, vnode) {
+  const isCreate = oldVnode === emptyNode
+  const isDestroy = vnode === emptyNode
+  const oldDirs = normalizeDirectives(oldVnode.data.directives, oldVnode.context)
+  const newDirs = normalizeDirectives(vnode.data.directives, vnode.context)
+
+  const dirsWithInsert = []
+  const dirsWithPostpatch = []
+
+  let key, oldDir, dir
+  for (key in newDirs) {
+    oldDir = oldDirs[key]
+    dir = newDirs[key]
+    if (!oldDir) {
+      // new directive, bind
+      callHook(dir, 'bind', vnode, oldVnode)
+      if (dir.def && dir.def.inserted) {
+        dirsWithInsert.push(dir)
+      }
+    } else {
+      // existing directive, update
+      dir.oldValue = oldDir.value
+      callHook(dir, 'update', vnode, oldVnode)
+      if (dir.def && dir.def.componentUpdated) {
+        dirsWithPostpatch.push(dir)
+      }
+    }
+  }
+
+  if (dirsWithInsert.length) {
+    const callInsert = () => {
+      for (let i = 0; i < dirsWithInsert.length; i++) {
+        callHook(dirsWithInsert[i], 'inserted', vnode, oldVnode)
+      }
+    }
+    if (isCreate) {
+      mergeVNodeHook(vnode, 'insert', callInsert)
+    } else {
+      callInsert()
+    }
+  }
+
+  if (dirsWithPostpatch.length) {
+    mergeVNodeHook(vnode, 'postpatch', () => {
+      for (let i = 0; i < dirsWithPostpatch.length; i++) {
+        callHook(dirsWithPostpatch[i], 'componentUpdated', vnode, oldVnode)
+      }
+    })
+  }
+
+  if (!isCreate) {
+    for (key in oldDirs) {
+      if (!newDirs[key]) {
+        // no longer present, unbind
+        callHook(oldDirs[key], 'unbind', oldVnode, oldVnode, isDestroy)
+      }
+    }
+  }
+}
+
+const emptyModifiers = Object.create(null)
+
+function normalizeDirectives (
+  dirs: ?Array<VNodeDirective>,
+  vm: Component
+): { [key: string]: VNodeDirective } {
+  const res = Object.create(null)
+  if (!dirs) {
+    // $flow-disable-line
+    return res
+  }
+  let i, dir
+  for (i = 0; i < dirs.length; i++) {
+    dir = dirs[i]
+    if (!dir.modifiers) {
+      // $flow-disable-line
+      dir.modifiers = emptyModifiers
+    }
+    res[getRawDirName(dir)] = dir
+    dir.def = resolveAsset(vm.$options, 'directives', dir.name, true)
+  }
+  // $flow-disable-line
+  return res
+}
+
+function getRawDirName (dir: VNodeDirective): string {
+  return dir.rawName || `${dir.name}.${Object.keys(dir.modifiers || {}).join('.')}`
+}
+
+function callHook (dir, hook, vnode, oldVnode, isDestroy) {
+  const fn = dir.def && dir.def[hook]
+  if (fn) {
+    try {
+      fn(vnode.elm, dir, vnode, oldVnode, isDestroy)
+    } catch (e) {
+      handleError(e, vnode.context, `directive ${dir.name} ${hook} hook`)
+    }
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/core/vdom/modules/index.js b/advancedcontentfilter/vendor/asset/vue/src/core/vdom/modules/index.js
new file mode 100644 (file)
index 0000000..727c864
--- /dev/null
@@ -0,0 +1,7 @@
+import directives from './directives'
+import ref from './ref'
+
+export default [
+  ref,
+  directives
+]
diff --git a/advancedcontentfilter/vendor/asset/vue/src/core/vdom/modules/ref.js b/advancedcontentfilter/vendor/asset/vue/src/core/vdom/modules/ref.js
new file mode 100644 (file)
index 0000000..aa9bdcf
--- /dev/null
@@ -0,0 +1,45 @@
+/* @flow */
+
+import { remove, isDef } from 'shared/util'
+
+export default {
+  create (_: any, vnode: VNodeWithData) {
+    registerRef(vnode)
+  },
+  update (oldVnode: VNodeWithData, vnode: VNodeWithData) {
+    if (oldVnode.data.ref !== vnode.data.ref) {
+      registerRef(oldVnode, true)
+      registerRef(vnode)
+    }
+  },
+  destroy (vnode: VNodeWithData) {
+    registerRef(vnode, true)
+  }
+}
+
+export function registerRef (vnode: VNodeWithData, isRemoval: ?boolean) {
+  const key = vnode.data.ref
+  if (!isDef(key)) return
+
+  const vm = vnode.context
+  const ref = vnode.componentInstance || vnode.elm
+  const refs = vm.$refs
+  if (isRemoval) {
+    if (Array.isArray(refs[key])) {
+      remove(refs[key], ref)
+    } else if (refs[key] === ref) {
+      refs[key] = undefined
+    }
+  } else {
+    if (vnode.data.refInFor) {
+      if (!Array.isArray(refs[key])) {
+        refs[key] = [ref]
+      } else if (refs[key].indexOf(ref) < 0) {
+        // $flow-disable-line
+        refs[key].push(ref)
+      }
+    } else {
+      refs[key] = ref
+    }
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/core/vdom/patch.js b/advancedcontentfilter/vendor/asset/vue/src/core/vdom/patch.js
new file mode 100644 (file)
index 0000000..9f3bcc6
--- /dev/null
@@ -0,0 +1,787 @@
+/**
+ * Virtual DOM patching algorithm based on Snabbdom by
+ * Simon Friis Vindum (@paldepind)
+ * Licensed under the MIT License
+ * https://github.com/paldepind/snabbdom/blob/master/LICENSE
+ *
+ * modified by Evan You (@yyx990803)
+ *
+ * Not type-checking this because this file is perf-critical and the cost
+ * of making flow understand it is not worth it.
+ */
+
+import VNode, { cloneVNode } from './vnode'
+import config from '../config'
+import { SSR_ATTR } from 'shared/constants'
+import { registerRef } from './modules/ref'
+import { traverse } from '../observer/traverse'
+import { activeInstance } from '../instance/lifecycle'
+import { isTextInputType } from 'web/util/element'
+
+import {
+  warn,
+  isDef,
+  isUndef,
+  isTrue,
+  makeMap,
+  isRegExp,
+  isPrimitive
+} from '../util/index'
+
+export const emptyNode = new VNode('', {}, [])
+
+const hooks = ['create', 'activate', 'update', 'remove', 'destroy']
+
+function sameVnode (a, b) {
+  return (
+    a.key === b.key && (
+      (
+        a.tag === b.tag &&
+        a.isComment === b.isComment &&
+        isDef(a.data) === isDef(b.data) &&
+        sameInputType(a, b)
+      ) || (
+        isTrue(a.isAsyncPlaceholder) &&
+        a.asyncFactory === b.asyncFactory &&
+        isUndef(b.asyncFactory.error)
+      )
+    )
+  )
+}
+
+function sameInputType (a, b) {
+  if (a.tag !== 'input') return true
+  let i
+  const typeA = isDef(i = a.data) && isDef(i = i.attrs) && i.type
+  const typeB = isDef(i = b.data) && isDef(i = i.attrs) && i.type
+  return typeA === typeB || isTextInputType(typeA) && isTextInputType(typeB)
+}
+
+function createKeyToOldIdx (children, beginIdx, endIdx) {
+  let i, key
+  const map = {}
+  for (i = beginIdx; i <= endIdx; ++i) {
+    key = children[i].key
+    if (isDef(key)) map[key] = i
+  }
+  return map
+}
+
+export function createPatchFunction (backend) {
+  let i, j
+  const cbs = {}
+
+  const { modules, nodeOps } = backend
+
+  for (i = 0; i < hooks.length; ++i) {
+    cbs[hooks[i]] = []
+    for (j = 0; j < modules.length; ++j) {
+      if (isDef(modules[j][hooks[i]])) {
+        cbs[hooks[i]].push(modules[j][hooks[i]])
+      }
+    }
+  }
+
+  function emptyNodeAt (elm) {
+    return new VNode(nodeOps.tagName(elm).toLowerCase(), {}, [], undefined, elm)
+  }
+
+  function createRmCb (childElm, listeners) {
+    function remove () {
+      if (--remove.listeners === 0) {
+        removeNode(childElm)
+      }
+    }
+    remove.listeners = listeners
+    return remove
+  }
+
+  function removeNode (el) {
+    const parent = nodeOps.parentNode(el)
+    // element may have already been removed due to v-html / v-text
+    if (isDef(parent)) {
+      nodeOps.removeChild(parent, el)
+    }
+  }
+
+  function isUnknownElement (vnode, inVPre) {
+    return (
+      !inVPre &&
+      !vnode.ns &&
+      !(
+        config.ignoredElements.length &&
+        config.ignoredElements.some(ignore => {
+          return isRegExp(ignore)
+            ? ignore.test(vnode.tag)
+            : ignore === vnode.tag
+        })
+      ) &&
+      config.isUnknownElement(vnode.tag)
+    )
+  }
+
+  let creatingElmInVPre = 0
+
+  function createElm (
+    vnode,
+    insertedVnodeQueue,
+    parentElm,
+    refElm,
+    nested,
+    ownerArray,
+    index
+  ) {
+    if (isDef(vnode.elm) && isDef(ownerArray)) {
+      // This vnode was used in a previous render!
+      // now it's used as a new node, overwriting its elm would cause
+      // potential patch errors down the road when it's used as an insertion
+      // reference node. Instead, we clone the node on-demand before creating
+      // associated DOM element for it.
+      vnode = ownerArray[index] = cloneVNode(vnode)
+    }
+
+    vnode.isRootInsert = !nested // for transition enter check
+    if (createComponent(vnode, insertedVnodeQueue, parentElm, refElm)) {
+      return
+    }
+
+    const data = vnode.data
+    const children = vnode.children
+    const tag = vnode.tag
+    if (isDef(tag)) {
+      if (process.env.NODE_ENV !== 'production') {
+        if (data && data.pre) {
+          creatingElmInVPre++
+        }
+        if (isUnknownElement(vnode, creatingElmInVPre)) {
+          warn(
+            'Unknown custom element: <' + tag + '> - did you ' +
+            'register the component correctly? For recursive components, ' +
+            'make sure to provide the "name" option.',
+            vnode.context
+          )
+        }
+      }
+
+      vnode.elm = vnode.ns
+        ? nodeOps.createElementNS(vnode.ns, tag)
+        : nodeOps.createElement(tag, vnode)
+      setScope(vnode)
+
+      /* istanbul ignore if */
+      if (__WEEX__) {
+        // in Weex, the default insertion order is parent-first.
+        // List items can be optimized to use children-first insertion
+        // with append="tree".
+        const appendAsTree = isDef(data) && isTrue(data.appendAsTree)
+        if (!appendAsTree) {
+          if (isDef(data)) {
+            invokeCreateHooks(vnode, insertedVnodeQueue)
+          }
+          insert(parentElm, vnode.elm, refElm)
+        }
+        createChildren(vnode, children, insertedVnodeQueue)
+        if (appendAsTree) {
+          if (isDef(data)) {
+            invokeCreateHooks(vnode, insertedVnodeQueue)
+          }
+          insert(parentElm, vnode.elm, refElm)
+        }
+      } else {
+        createChildren(vnode, children, insertedVnodeQueue)
+        if (isDef(data)) {
+          invokeCreateHooks(vnode, insertedVnodeQueue)
+        }
+        insert(parentElm, vnode.elm, refElm)
+      }
+
+      if (process.env.NODE_ENV !== 'production' && data && data.pre) {
+        creatingElmInVPre--
+      }
+    } else if (isTrue(vnode.isComment)) {
+      vnode.elm = nodeOps.createComment(vnode.text)
+      insert(parentElm, vnode.elm, refElm)
+    } else {
+      vnode.elm = nodeOps.createTextNode(vnode.text)
+      insert(parentElm, vnode.elm, refElm)
+    }
+  }
+
+  function createComponent (vnode, insertedVnodeQueue, parentElm, refElm) {
+    let i = vnode.data
+    if (isDef(i)) {
+      const isReactivated = isDef(vnode.componentInstance) && i.keepAlive
+      if (isDef(i = i.hook) && isDef(i = i.init)) {
+        i(vnode, false /* hydrating */, parentElm, refElm)
+      }
+      // after calling the init hook, if the vnode is a child component
+      // it should've created a child instance and mounted it. the child
+      // component also has set the placeholder vnode's elm.
+      // in that case we can just return the element and be done.
+      if (isDef(vnode.componentInstance)) {
+        initComponent(vnode, insertedVnodeQueue)
+        if (isTrue(isReactivated)) {
+          reactivateComponent(vnode, insertedVnodeQueue, parentElm, refElm)
+        }
+        return true
+      }
+    }
+  }
+
+  function initComponent (vnode, insertedVnodeQueue) {
+    if (isDef(vnode.data.pendingInsert)) {
+      insertedVnodeQueue.push.apply(insertedVnodeQueue, vnode.data.pendingInsert)
+      vnode.data.pendingInsert = null
+    }
+    vnode.elm = vnode.componentInstance.$el
+    if (isPatchable(vnode)) {
+      invokeCreateHooks(vnode, insertedVnodeQueue)
+      setScope(vnode)
+    } else {
+      // empty component root.
+      // skip all element-related modules except for ref (#3455)
+      registerRef(vnode)
+      // make sure to invoke the insert hook
+      insertedVnodeQueue.push(vnode)
+    }
+  }
+
+  function reactivateComponent (vnode, insertedVnodeQueue, parentElm, refElm) {
+    let i
+    // hack for #4339: a reactivated component with inner transition
+    // does not trigger because the inner node's created hooks are not called
+    // again. It's not ideal to involve module-specific logic in here but
+    // there doesn't seem to be a better way to do it.
+    let innerNode = vnode
+    while (innerNode.componentInstance) {
+      innerNode = innerNode.componentInstance._vnode
+      if (isDef(i = innerNode.data) && isDef(i = i.transition)) {
+        for (i = 0; i < cbs.activate.length; ++i) {
+          cbs.activate[i](emptyNode, innerNode)
+        }
+        insertedVnodeQueue.push(innerNode)
+        break
+      }
+    }
+    // unlike a newly created component,
+    // a reactivated keep-alive component doesn't insert itself
+    insert(parentElm, vnode.elm, refElm)
+  }
+
+  function insert (parent, elm, ref) {
+    if (isDef(parent)) {
+      if (isDef(ref)) {
+        if (ref.parentNode === parent) {
+          nodeOps.insertBefore(parent, elm, ref)
+        }
+      } else {
+        nodeOps.appendChild(parent, elm)
+      }
+    }
+  }
+
+  function createChildren (vnode, children, insertedVnodeQueue) {
+    if (Array.isArray(children)) {
+      if (process.env.NODE_ENV !== 'production') {
+        checkDuplicateKeys(children)
+      }
+      for (let i = 0; i < children.length; ++i) {
+        createElm(children[i], insertedVnodeQueue, vnode.elm, null, true, children, i)
+      }
+    } else if (isPrimitive(vnode.text)) {
+      nodeOps.appendChild(vnode.elm, nodeOps.createTextNode(String(vnode.text)))
+    }
+  }
+
+  function isPatchable (vnode) {
+    while (vnode.componentInstance) {
+      vnode = vnode.componentInstance._vnode
+    }
+    return isDef(vnode.tag)
+  }
+
+  function invokeCreateHooks (vnode, insertedVnodeQueue) {
+    for (let i = 0; i < cbs.create.length; ++i) {
+      cbs.create[i](emptyNode, vnode)
+    }
+    i = vnode.data.hook // Reuse variable
+    if (isDef(i)) {
+      if (isDef(i.create)) i.create(emptyNode, vnode)
+      if (isDef(i.insert)) insertedVnodeQueue.push(vnode)
+    }
+  }
+
+  // set scope id attribute for scoped CSS.
+  // this is implemented as a special case to avoid the overhead
+  // of going through the normal attribute patching process.
+  function setScope (vnode) {
+    let i
+    if (isDef(i = vnode.fnScopeId)) {
+      nodeOps.setStyleScope(vnode.elm, i)
+    } else {
+      let ancestor = vnode
+      while (ancestor) {
+        if (isDef(i = ancestor.context) && isDef(i = i.$options._scopeId)) {
+          nodeOps.setStyleScope(vnode.elm, i)
+        }
+        ancestor = ancestor.parent
+      }
+    }
+    // for slot content they should also get the scopeId from the host instance.
+    if (isDef(i = activeInstance) &&
+      i !== vnode.context &&
+      i !== vnode.fnContext &&
+      isDef(i = i.$options._scopeId)
+    ) {
+      nodeOps.setStyleScope(vnode.elm, i)
+    }
+  }
+
+  function addVnodes (parentElm, refElm, vnodes, startIdx, endIdx, insertedVnodeQueue) {
+    for (; startIdx <= endIdx; ++startIdx) {
+      createElm(vnodes[startIdx], insertedVnodeQueue, parentElm, refElm, false, vnodes, startIdx)
+    }
+  }
+
+  function invokeDestroyHook (vnode) {
+    let i, j
+    const data = vnode.data
+    if (isDef(data)) {
+      if (isDef(i = data.hook) && isDef(i = i.destroy)) i(vnode)
+      for (i = 0; i < cbs.destroy.length; ++i) cbs.destroy[i](vnode)
+    }
+    if (isDef(i = vnode.children)) {
+      for (j = 0; j < vnode.children.length; ++j) {
+        invokeDestroyHook(vnode.children[j])
+      }
+    }
+  }
+
+  function removeVnodes (parentElm, vnodes, startIdx, endIdx) {
+    for (; startIdx <= endIdx; ++startIdx) {
+      const ch = vnodes[startIdx]
+      if (isDef(ch)) {
+        if (isDef(ch.tag)) {
+          removeAndInvokeRemoveHook(ch)
+          invokeDestroyHook(ch)
+        } else { // Text node
+          removeNode(ch.elm)
+        }
+      }
+    }
+  }
+
+  function removeAndInvokeRemoveHook (vnode, rm) {
+    if (isDef(rm) || isDef(vnode.data)) {
+      let i
+      const listeners = cbs.remove.length + 1
+      if (isDef(rm)) {
+        // we have a recursively passed down rm callback
+        // increase the listeners count
+        rm.listeners += listeners
+      } else {
+        // directly removing
+        rm = createRmCb(vnode.elm, listeners)
+      }
+      // recursively invoke hooks on child component root node
+      if (isDef(i = vnode.componentInstance) && isDef(i = i._vnode) && isDef(i.data)) {
+        removeAndInvokeRemoveHook(i, rm)
+      }
+      for (i = 0; i < cbs.remove.length; ++i) {
+        cbs.remove[i](vnode, rm)
+      }
+      if (isDef(i = vnode.data.hook) && isDef(i = i.remove)) {
+        i(vnode, rm)
+      } else {
+        rm()
+      }
+    } else {
+      removeNode(vnode.elm)
+    }
+  }
+
+  function updateChildren (parentElm, oldCh, newCh, insertedVnodeQueue, removeOnly) {
+    let oldStartIdx = 0
+    let newStartIdx = 0
+    let oldEndIdx = oldCh.length - 1
+    let oldStartVnode = oldCh[0]
+    let oldEndVnode = oldCh[oldEndIdx]
+    let newEndIdx = newCh.length - 1
+    let newStartVnode = newCh[0]
+    let newEndVnode = newCh[newEndIdx]
+    let oldKeyToIdx, idxInOld, vnodeToMove, refElm
+
+    // removeOnly is a special flag used only by <transition-group>
+    // to ensure removed elements stay in correct relative positions
+    // during leaving transitions
+    const canMove = !removeOnly
+
+    if (process.env.NODE_ENV !== 'production') {
+      checkDuplicateKeys(newCh)
+    }
+
+    while (oldStartIdx <= oldEndIdx && newStartIdx <= newEndIdx) {
+      if (isUndef(oldStartVnode)) {
+        oldStartVnode = oldCh[++oldStartIdx] // Vnode has been moved left
+      } else if (isUndef(oldEndVnode)) {
+        oldEndVnode = oldCh[--oldEndIdx]
+      } else if (sameVnode(oldStartVnode, newStartVnode)) {
+        patchVnode(oldStartVnode, newStartVnode, insertedVnodeQueue)
+        oldStartVnode = oldCh[++oldStartIdx]
+        newStartVnode = newCh[++newStartIdx]
+      } else if (sameVnode(oldEndVnode, newEndVnode)) {
+        patchVnode(oldEndVnode, newEndVnode, insertedVnodeQueue)
+        oldEndVnode = oldCh[--oldEndIdx]
+        newEndVnode = newCh[--newEndIdx]
+      } else if (sameVnode(oldStartVnode, newEndVnode)) { // Vnode moved right
+        patchVnode(oldStartVnode, newEndVnode, insertedVnodeQueue)
+        canMove && nodeOps.insertBefore(parentElm, oldStartVnode.elm, nodeOps.nextSibling(oldEndVnode.elm))
+        oldStartVnode = oldCh[++oldStartIdx]
+        newEndVnode = newCh[--newEndIdx]
+      } else if (sameVnode(oldEndVnode, newStartVnode)) { // Vnode moved left
+        patchVnode(oldEndVnode, newStartVnode, insertedVnodeQueue)
+        canMove && nodeOps.insertBefore(parentElm, oldEndVnode.elm, oldStartVnode.elm)
+        oldEndVnode = oldCh[--oldEndIdx]
+        newStartVnode = newCh[++newStartIdx]
+      } else {
+        if (isUndef(oldKeyToIdx)) oldKeyToIdx = createKeyToOldIdx(oldCh, oldStartIdx, oldEndIdx)
+        idxInOld = isDef(newStartVnode.key)
+          ? oldKeyToIdx[newStartVnode.key]
+          : findIdxInOld(newStartVnode, oldCh, oldStartIdx, oldEndIdx)
+        if (isUndef(idxInOld)) { // New element
+          createElm(newStartVnode, insertedVnodeQueue, parentElm, oldStartVnode.elm, false, newCh, newStartIdx)
+        } else {
+          vnodeToMove = oldCh[idxInOld]
+          if (sameVnode(vnodeToMove, newStartVnode)) {
+            patchVnode(vnodeToMove, newStartVnode, insertedVnodeQueue)
+            oldCh[idxInOld] = undefined
+            canMove && nodeOps.insertBefore(parentElm, vnodeToMove.elm, oldStartVnode.elm)
+          } else {
+            // same key but different element. treat as new element
+            createElm(newStartVnode, insertedVnodeQueue, parentElm, oldStartVnode.elm, false, newCh, newStartIdx)
+          }
+        }
+        newStartVnode = newCh[++newStartIdx]
+      }
+    }
+    if (oldStartIdx > oldEndIdx) {
+      refElm = isUndef(newCh[newEndIdx + 1]) ? null : newCh[newEndIdx + 1].elm
+      addVnodes(parentElm, refElm, newCh, newStartIdx, newEndIdx, insertedVnodeQueue)
+    } else if (newStartIdx > newEndIdx) {
+      removeVnodes(parentElm, oldCh, oldStartIdx, oldEndIdx)
+    }
+  }
+
+  function checkDuplicateKeys (children) {
+    const seenKeys = {}
+    for (let i = 0; i < children.length; i++) {
+      const vnode = children[i]
+      const key = vnode.key
+      if (isDef(key)) {
+        if (seenKeys[key]) {
+          warn(
+            `Duplicate keys detected: '${key}'. This may cause an update error.`,
+            vnode.context
+          )
+        } else {
+          seenKeys[key] = true
+        }
+      }
+    }
+  }
+
+  function findIdxInOld (node, oldCh, start, end) {
+    for (let i = start; i < end; i++) {
+      const c = oldCh[i]
+      if (isDef(c) && sameVnode(node, c)) return i
+    }
+  }
+
+  function patchVnode (oldVnode, vnode, insertedVnodeQueue, removeOnly) {
+    if (oldVnode === vnode) {
+      return
+    }
+
+    const elm = vnode.elm = oldVnode.elm
+
+    if (isTrue(oldVnode.isAsyncPlaceholder)) {
+      if (isDef(vnode.asyncFactory.resolved)) {
+        hydrate(oldVnode.elm, vnode, insertedVnodeQueue)
+      } else {
+        vnode.isAsyncPlaceholder = true
+      }
+      return
+    }
+
+    // reuse element for static trees.
+    // note we only do this if the vnode is cloned -
+    // if the new node is not cloned it means the render functions have been
+    // reset by the hot-reload-api and we need to do a proper re-render.
+    if (isTrue(vnode.isStatic) &&
+      isTrue(oldVnode.isStatic) &&
+      vnode.key === oldVnode.key &&
+      (isTrue(vnode.isCloned) || isTrue(vnode.isOnce))
+    ) {
+      vnode.componentInstance = oldVnode.componentInstance
+      return
+    }
+
+    let i
+    const data = vnode.data
+    if (isDef(data) && isDef(i = data.hook) && isDef(i = i.prepatch)) {
+      i(oldVnode, vnode)
+    }
+
+    const oldCh = oldVnode.children
+    const ch = vnode.children
+    if (isDef(data) && isPatchable(vnode)) {
+      for (i = 0; i < cbs.update.length; ++i) cbs.update[i](oldVnode, vnode)
+      if (isDef(i = data.hook) && isDef(i = i.update)) i(oldVnode, vnode)
+    }
+    if (isUndef(vnode.text)) {
+      if (isDef(oldCh) && isDef(ch)) {
+        if (oldCh !== ch) updateChildren(elm, oldCh, ch, insertedVnodeQueue, removeOnly)
+      } else if (isDef(ch)) {
+        if (isDef(oldVnode.text)) nodeOps.setTextContent(elm, '')
+        addVnodes(elm, null, ch, 0, ch.length - 1, insertedVnodeQueue)
+      } else if (isDef(oldCh)) {
+        removeVnodes(elm, oldCh, 0, oldCh.length - 1)
+      } else if (isDef(oldVnode.text)) {
+        nodeOps.setTextContent(elm, '')
+      }
+    } else if (oldVnode.text !== vnode.text) {
+      nodeOps.setTextContent(elm, vnode.text)
+    }
+    if (isDef(data)) {
+      if (isDef(i = data.hook) && isDef(i = i.postpatch)) i(oldVnode, vnode)
+    }
+  }
+
+  function invokeInsertHook (vnode, queue, initial) {
+    // delay insert hooks for component root nodes, invoke them after the
+    // element is really inserted
+    if (isTrue(initial) && isDef(vnode.parent)) {
+      vnode.parent.data.pendingInsert = queue
+    } else {
+      for (let i = 0; i < queue.length; ++i) {
+        queue[i].data.hook.insert(queue[i])
+      }
+    }
+  }
+
+  let hydrationBailed = false
+  // list of modules that can skip create hook during hydration because they
+  // are already rendered on the client or has no need for initialization
+  // Note: style is excluded because it relies on initial clone for future
+  // deep updates (#7063).
+  const isRenderedModule = makeMap('attrs,class,staticClass,staticStyle,key')
+
+  // Note: this is a browser-only function so we can assume elms are DOM nodes.
+  function hydrate (elm, vnode, insertedVnodeQueue, inVPre) {
+    let i
+    const { tag, data, children } = vnode
+    inVPre = inVPre || (data && data.pre)
+    vnode.elm = elm
+
+    if (isTrue(vnode.isComment) && isDef(vnode.asyncFactory)) {
+      vnode.isAsyncPlaceholder = true
+      return true
+    }
+    // assert node match
+    if (process.env.NODE_ENV !== 'production') {
+      if (!assertNodeMatch(elm, vnode, inVPre)) {
+        return false
+      }
+    }
+    if (isDef(data)) {
+      if (isDef(i = data.hook) && isDef(i = i.init)) i(vnode, true /* hydrating */)
+      if (isDef(i = vnode.componentInstance)) {
+        // child component. it should have hydrated its own tree.
+        initComponent(vnode, insertedVnodeQueue)
+        return true
+      }
+    }
+    if (isDef(tag)) {
+      if (isDef(children)) {
+        // empty element, allow client to pick up and populate children
+        if (!elm.hasChildNodes()) {
+          createChildren(vnode, children, insertedVnodeQueue)
+        } else {
+          // v-html and domProps: innerHTML
+          if (isDef(i = data) && isDef(i = i.domProps) && isDef(i = i.innerHTML)) {
+            if (i !== elm.innerHTML) {
+              /* istanbul ignore if */
+              if (process.env.NODE_ENV !== 'production' &&
+                typeof console !== 'undefined' &&
+                !hydrationBailed
+              ) {
+                hydrationBailed = true
+                console.warn('Parent: ', elm)
+                console.warn('server innerHTML: ', i)
+                console.warn('client innerHTML: ', elm.innerHTML)
+              }
+              return false
+            }
+          } else {
+            // iterate and compare children lists
+            let childrenMatch = true
+            let childNode = elm.firstChild
+            for (let i = 0; i < children.length; i++) {
+              if (!childNode || !hydrate(childNode, children[i], insertedVnodeQueue, inVPre)) {
+                childrenMatch = false
+                break
+              }
+              childNode = childNode.nextSibling
+            }
+            // if childNode is not null, it means the actual childNodes list is
+            // longer than the virtual children list.
+            if (!childrenMatch || childNode) {
+              /* istanbul ignore if */
+              if (process.env.NODE_ENV !== 'production' &&
+                typeof console !== 'undefined' &&
+                !hydrationBailed
+              ) {
+                hydrationBailed = true
+                console.warn('Parent: ', elm)
+                console.warn('Mismatching childNodes vs. VNodes: ', elm.childNodes, children)
+              }
+              return false
+            }
+          }
+        }
+      }
+      if (isDef(data)) {
+        let fullInvoke = false
+        for (const key in data) {
+          if (!isRenderedModule(key)) {
+            fullInvoke = true
+            invokeCreateHooks(vnode, insertedVnodeQueue)
+            break
+          }
+        }
+        if (!fullInvoke && data['class']) {
+          // ensure collecting deps for deep class bindings for future updates
+          traverse(data['class'])
+        }
+      }
+    } else if (elm.data !== vnode.text) {
+      elm.data = vnode.text
+    }
+    return true
+  }
+
+  function assertNodeMatch (node, vnode, inVPre) {
+    if (isDef(vnode.tag)) {
+      return vnode.tag.indexOf('vue-component') === 0 || (
+        !isUnknownElement(vnode, inVPre) &&
+        vnode.tag.toLowerCase() === (node.tagName && node.tagName.toLowerCase())
+      )
+    } else {
+      return node.nodeType === (vnode.isComment ? 8 : 3)
+    }
+  }
+
+  return function patch (oldVnode, vnode, hydrating, removeOnly, parentElm, refElm) {
+    if (isUndef(vnode)) {
+      if (isDef(oldVnode)) invokeDestroyHook(oldVnode)
+      return
+    }
+
+    let isInitialPatch = false
+    const insertedVnodeQueue = []
+
+    if (isUndef(oldVnode)) {
+      // empty mount (likely as component), create new root element
+      isInitialPatch = true
+      createElm(vnode, insertedVnodeQueue, parentElm, refElm)
+    } else {
+      const isRealElement = isDef(oldVnode.nodeType)
+      if (!isRealElement && sameVnode(oldVnode, vnode)) {
+        // patch existing root node
+        patchVnode(oldVnode, vnode, insertedVnodeQueue, removeOnly)
+      } else {
+        if (isRealElement) {
+          // mounting to a real element
+          // check if this is server-rendered content and if we can perform
+          // a successful hydration.
+          if (oldVnode.nodeType === 1 && oldVnode.hasAttribute(SSR_ATTR)) {
+            oldVnode.removeAttribute(SSR_ATTR)
+            hydrating = true
+          }
+          if (isTrue(hydrating)) {
+            if (hydrate(oldVnode, vnode, insertedVnodeQueue)) {
+              invokeInsertHook(vnode, insertedVnodeQueue, true)
+              return oldVnode
+            } else if (process.env.NODE_ENV !== 'production') {
+              warn(
+                'The client-side rendered virtual DOM tree is not matching ' +
+                'server-rendered content. This is likely caused by incorrect ' +
+                'HTML markup, for example nesting block-level elements inside ' +
+                '<p>, or missing <tbody>. Bailing hydration and performing ' +
+                'full client-side render.'
+              )
+            }
+          }
+          // either not server-rendered, or hydration failed.
+          // create an empty node and replace it
+          oldVnode = emptyNodeAt(oldVnode)
+        }
+
+        // replacing existing element
+        const oldElm = oldVnode.elm
+        const parentElm = nodeOps.parentNode(oldElm)
+
+        // create new node
+        createElm(
+          vnode,
+          insertedVnodeQueue,
+          // extremely rare edge case: do not insert if old element is in a
+          // leaving transition. Only happens when combining transition +
+          // keep-alive + HOCs. (#4590)
+          oldElm._leaveCb ? null : parentElm,
+          nodeOps.nextSibling(oldElm)
+        )
+
+        // update parent placeholder node element, recursively
+        if (isDef(vnode.parent)) {
+          let ancestor = vnode.parent
+          const patchable = isPatchable(vnode)
+          while (ancestor) {
+            for (let i = 0; i < cbs.destroy.length; ++i) {
+              cbs.destroy[i](ancestor)
+            }
+            ancestor.elm = vnode.elm
+            if (patchable) {
+              for (let i = 0; i < cbs.create.length; ++i) {
+                cbs.create[i](emptyNode, ancestor)
+              }
+              // #6513
+              // invoke insert hooks that may have been merged by create hooks.
+              // e.g. for directives that uses the "inserted" hook.
+              const insert = ancestor.data.hook.insert
+              if (insert.merged) {
+                // start at index 1 to avoid re-invoking component mounted hook
+                for (let i = 1; i < insert.fns.length; i++) {
+                  insert.fns[i]()
+                }
+              }
+            } else {
+              registerRef(ancestor)
+            }
+            ancestor = ancestor.parent
+          }
+        }
+
+        // destroy old node
+        if (isDef(parentElm)) {
+          removeVnodes(parentElm, [oldVnode], 0, 0)
+        } else if (isDef(oldVnode.tag)) {
+          invokeDestroyHook(oldVnode)
+        }
+      }
+    }
+
+    invokeInsertHook(vnode, insertedVnodeQueue, isInitialPatch)
+    return vnode.elm
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/core/vdom/vnode.js b/advancedcontentfilter/vendor/asset/vue/src/core/vdom/vnode.js
new file mode 100644 (file)
index 0000000..88e80ce
--- /dev/null
@@ -0,0 +1,108 @@
+/* @flow */
+
+export default class VNode {
+  tag: string | void;
+  data: VNodeData | void;
+  children: ?Array<VNode>;
+  text: string | void;
+  elm: Node | void;
+  ns: string | void;
+  context: Component | void; // rendered in this component's scope
+  key: string | number | void;
+  componentOptions: VNodeComponentOptions | void;
+  componentInstance: Component | void; // component instance
+  parent: VNode | void; // component placeholder node
+
+  // strictly internal
+  raw: boolean; // contains raw HTML? (server only)
+  isStatic: boolean; // hoisted static node
+  isRootInsert: boolean; // necessary for enter transition check
+  isComment: boolean; // empty comment placeholder?
+  isCloned: boolean; // is a cloned node?
+  isOnce: boolean; // is a v-once node?
+  asyncFactory: Function | void; // async component factory function
+  asyncMeta: Object | void;
+  isAsyncPlaceholder: boolean;
+  ssrContext: Object | void;
+  fnContext: Component | void; // real context vm for functional nodes
+  fnOptions: ?ComponentOptions; // for SSR caching
+  fnScopeId: ?string; // functional scope id support
+
+  constructor (
+    tag?: string,
+    data?: VNodeData,
+    children?: ?Array<VNode>,
+    text?: string,
+    elm?: Node,
+    context?: Component,
+    componentOptions?: VNodeComponentOptions,
+    asyncFactory?: Function
+  ) {
+    this.tag = tag
+    this.data = data
+    this.children = children
+    this.text = text
+    this.elm = elm
+    this.ns = undefined
+    this.context = context
+    this.fnContext = undefined
+    this.fnOptions = undefined
+    this.fnScopeId = undefined
+    this.key = data && data.key
+    this.componentOptions = componentOptions
+    this.componentInstance = undefined
+    this.parent = undefined
+    this.raw = false
+    this.isStatic = false
+    this.isRootInsert = true
+    this.isComment = false
+    this.isCloned = false
+    this.isOnce = false
+    this.asyncFactory = asyncFactory
+    this.asyncMeta = undefined
+    this.isAsyncPlaceholder = false
+  }
+
+  // DEPRECATED: alias for componentInstance for backwards compat.
+  /* istanbul ignore next */
+  get child (): Component | void {
+    return this.componentInstance
+  }
+}
+
+export const createEmptyVNode = (text: string = '') => {
+  const node = new VNode()
+  node.text = text
+  node.isComment = true
+  return node
+}
+
+export function createTextVNode (val: string | number) {
+  return new VNode(undefined, undefined, undefined, String(val))
+}
+
+// optimized shallow clone
+// used for static nodes and slot nodes because they may be reused across
+// multiple renders, cloning them avoids errors when DOM manipulations rely
+// on their elm reference.
+export function cloneVNode (vnode: VNode): VNode {
+  const cloned = new VNode(
+    vnode.tag,
+    vnode.data,
+    vnode.children,
+    vnode.text,
+    vnode.elm,
+    vnode.context,
+    vnode.componentOptions,
+    vnode.asyncFactory
+  )
+  cloned.ns = vnode.ns
+  cloned.isStatic = vnode.isStatic
+  cloned.key = vnode.key
+  cloned.isComment = vnode.isComment
+  cloned.fnContext = vnode.fnContext
+  cloned.fnOptions = vnode.fnOptions
+  cloned.fnScopeId = vnode.fnScopeId
+  cloned.isCloned = true
+  return cloned
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/web/compiler/directives/html.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/web/compiler/directives/html.js
new file mode 100644 (file)
index 0000000..58569d8
--- /dev/null
@@ -0,0 +1,9 @@
+/* @flow */
+
+import { addProp } from 'compiler/helpers'
+
+export default function html (el: ASTElement, dir: ASTDirective) {
+  if (dir.value) {
+    addProp(el, 'innerHTML', `_s(${dir.value})`)
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/web/compiler/directives/index.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/web/compiler/directives/index.js
new file mode 100644 (file)
index 0000000..0955b51
--- /dev/null
@@ -0,0 +1,9 @@
+import model from './model'
+import text from './text'
+import html from './html'
+
+export default {
+  model,
+  text,
+  html
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/web/compiler/directives/model.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/web/compiler/directives/model.js
new file mode 100644 (file)
index 0000000..126f0c7
--- /dev/null
@@ -0,0 +1,172 @@
+/* @flow */
+
+import config from 'core/config'
+import { addHandler, addProp, getBindingAttr } from 'compiler/helpers'
+import { genComponentModel, genAssignmentCode } from 'compiler/directives/model'
+
+let warn
+
+// in some cases, the event used has to be determined at runtime
+// so we used some reserved tokens during compile.
+export const RANGE_TOKEN = '__r'
+export const CHECKBOX_RADIO_TOKEN = '__c'
+
+export default function model (
+  el: ASTElement,
+  dir: ASTDirective,
+  _warn: Function
+): ?boolean {
+  warn = _warn
+  const value = dir.value
+  const modifiers = dir.modifiers
+  const tag = el.tag
+  const type = el.attrsMap.type
+
+  if (process.env.NODE_ENV !== 'production') {
+    // inputs with type="file" are read only and setting the input's
+    // value will throw an error.
+    if (tag === 'input' && type === 'file') {
+      warn(
+        `<${el.tag} v-model="${value}" type="file">:\n` +
+        `File inputs are read only. Use a v-on:change listener instead.`
+      )
+    }
+  }
+
+  if (el.component) {
+    genComponentModel(el, value, modifiers)
+    // component v-model doesn't need extra runtime
+    return false
+  } else if (tag === 'select') {
+    genSelect(el, value, modifiers)
+  } else if (tag === 'input' && type === 'checkbox') {
+    genCheckboxModel(el, value, modifiers)
+  } else if (tag === 'input' && type === 'radio') {
+    genRadioModel(el, value, modifiers)
+  } else if (tag === 'input' || tag === 'textarea') {
+    genDefaultModel(el, value, modifiers)
+  } else if (!config.isReservedTag(tag)) {
+    genComponentModel(el, value, modifiers)
+    // component v-model doesn't need extra runtime
+    return false
+  } else if (process.env.NODE_ENV !== 'production') {
+    warn(
+      `<${el.tag} v-model="${value}">: ` +
+      `v-model is not supported on this element type. ` +
+      'If you are working with contenteditable, it\'s recommended to ' +
+      'wrap a library dedicated for that purpose inside a custom component.'
+    )
+  }
+
+  // ensure runtime directive metadata
+  return true
+}
+
+function genCheckboxModel (
+  el: ASTElement,
+  value: string,
+  modifiers: ?ASTModifiers
+) {
+  const number = modifiers && modifiers.number
+  const valueBinding = getBindingAttr(el, 'value') || 'null'
+  const trueValueBinding = getBindingAttr(el, 'true-value') || 'true'
+  const falseValueBinding = getBindingAttr(el, 'false-value') || 'false'
+  addProp(el, 'checked',
+    `Array.isArray(${value})` +
+    `?_i(${value},${valueBinding})>-1` + (
+      trueValueBinding === 'true'
+        ? `:(${value})`
+        : `:_q(${value},${trueValueBinding})`
+    )
+  )
+  addHandler(el, 'change',
+    `var $$a=${value},` +
+        '$$el=$event.target,' +
+        `$$c=$$el.checked?(${trueValueBinding}):(${falseValueBinding});` +
+    'if(Array.isArray($$a)){' +
+      `var $$v=${number ? '_n(' + valueBinding + ')' : valueBinding},` +
+          '$$i=_i($$a,$$v);' +
+      `if($$el.checked){$$i<0&&(${genAssignmentCode(value, '$$a.concat([$$v])')})}` +
+      `else{$$i>-1&&(${genAssignmentCode(value, '$$a.slice(0,$$i).concat($$a.slice($$i+1))')})}` +
+    `}else{${genAssignmentCode(value, '$$c')}}`,
+    null, true
+  )
+}
+
+function genRadioModel (
+  el: ASTElement,
+  value: string,
+  modifiers: ?ASTModifiers
+) {
+  const number = modifiers && modifiers.number
+  let valueBinding = getBindingAttr(el, 'value') || 'null'
+  valueBinding = number ? `_n(${valueBinding})` : valueBinding
+  addProp(el, 'checked', `_q(${value},${valueBinding})`)
+  addHandler(el, 'change', genAssignmentCode(value, valueBinding), null, true)
+}
+
+function genSelect (
+  el: ASTElement,
+  value: string,
+  modifiers: ?ASTModifiers
+) {
+  const number = modifiers && modifiers.number
+  const selectedVal = `Array.prototype.filter` +
+    `.call($event.target.options,function(o){return o.selected})` +
+    `.map(function(o){var val = "_value" in o ? o._value : o.value;` +
+    `return ${number ? '_n(val)' : 'val'}})`
+
+  const assignment = '$event.target.multiple ? $$selectedVal : $$selectedVal[0]'
+  let code = `var $$selectedVal = ${selectedVal};`
+  code = `${code} ${genAssignmentCode(value, assignment)}`
+  addHandler(el, 'change', code, null, true)
+}
+
+function genDefaultModel (
+  el: ASTElement,
+  value: string,
+  modifiers: ?ASTModifiers
+): ?boolean {
+  const type = el.attrsMap.type
+
+  // warn if v-bind:value conflicts with v-model
+  // except for inputs with v-bind:type
+  if (process.env.NODE_ENV !== 'production') {
+    const value = el.attrsMap['v-bind:value'] || el.attrsMap[':value']
+    const typeBinding = el.attrsMap['v-bind:type'] || el.attrsMap[':type']
+    if (value && !typeBinding) {
+      const binding = el.attrsMap['v-bind:value'] ? 'v-bind:value' : ':value'
+      warn(
+        `${binding}="${value}" conflicts with v-model on the same element ` +
+        'because the latter already expands to a value binding internally'
+      )
+    }
+  }
+
+  const { lazy, number, trim } = modifiers || {}
+  const needCompositionGuard = !lazy && type !== 'range'
+  const event = lazy
+    ? 'change'
+    : type === 'range'
+      ? RANGE_TOKEN
+      : 'input'
+
+  let valueExpression = '$event.target.value'
+  if (trim) {
+    valueExpression = `$event.target.value.trim()`
+  }
+  if (number) {
+    valueExpression = `_n(${valueExpression})`
+  }
+
+  let code = genAssignmentCode(value, valueExpression)
+  if (needCompositionGuard) {
+    code = `if($event.target.composing)return;${code}`
+  }
+
+  addProp(el, 'value', `(${value})`)
+  addHandler(el, event, code, null, true)
+  if (trim || number) {
+    addHandler(el, 'blur', '$forceUpdate()')
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/web/compiler/directives/text.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/web/compiler/directives/text.js
new file mode 100644 (file)
index 0000000..1af914f
--- /dev/null
@@ -0,0 +1,9 @@
+/* @flow */
+
+import { addProp } from 'compiler/helpers'
+
+export default function text (el: ASTElement, dir: ASTDirective) {
+  if (dir.value) {
+    addProp(el, 'textContent', `_s(${dir.value})`)
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/web/compiler/index.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/web/compiler/index.js
new file mode 100644 (file)
index 0000000..7ace093
--- /dev/null
@@ -0,0 +1,8 @@
+/* @flow */
+
+import { baseOptions } from './options'
+import { createCompiler } from 'compiler/index'
+
+const { compile, compileToFunctions } = createCompiler(baseOptions)
+
+export { compile, compileToFunctions }
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/web/compiler/modules/class.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/web/compiler/modules/class.js
new file mode 100644 (file)
index 0000000..ffdca25
--- /dev/null
@@ -0,0 +1,48 @@
+/* @flow */
+
+import { parseText } from 'compiler/parser/text-parser'
+import {
+  getAndRemoveAttr,
+  getBindingAttr,
+  baseWarn
+} from 'compiler/helpers'
+
+function transformNode (el: ASTElement, options: CompilerOptions) {
+  const warn = options.warn || baseWarn
+  const staticClass = getAndRemoveAttr(el, 'class')
+  if (process.env.NODE_ENV !== 'production' && staticClass) {
+    const res = parseText(staticClass, options.delimiters)
+    if (res) {
+      warn(
+        `class="${staticClass}": ` +
+        'Interpolation inside attributes has been removed. ' +
+        'Use v-bind or the colon shorthand instead. For example, ' +
+        'instead of <div class="{{ val }}">, use <div :class="val">.'
+      )
+    }
+  }
+  if (staticClass) {
+    el.staticClass = JSON.stringify(staticClass)
+  }
+  const classBinding = getBindingAttr(el, 'class', false /* getStatic */)
+  if (classBinding) {
+    el.classBinding = classBinding
+  }
+}
+
+function genData (el: ASTElement): string {
+  let data = ''
+  if (el.staticClass) {
+    data += `staticClass:${el.staticClass},`
+  }
+  if (el.classBinding) {
+    data += `class:${el.classBinding},`
+  }
+  return data
+}
+
+export default {
+  staticKeys: ['staticClass'],
+  transformNode,
+  genData
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/web/compiler/modules/index.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/web/compiler/modules/index.js
new file mode 100644 (file)
index 0000000..29114a5
--- /dev/null
@@ -0,0 +1,9 @@
+import klass from './class'
+import style from './style'
+import model from './model'
+
+export default [
+  klass,
+  style,
+  model
+]
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/web/compiler/modules/model.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/web/compiler/modules/model.js
new file mode 100644 (file)
index 0000000..8d784fe
--- /dev/null
@@ -0,0 +1,94 @@
+/* @flow */
+
+/**
+ * Expand input[v-model] with dyanmic type bindings into v-if-else chains
+ * Turn this:
+ *   <input v-model="data[type]" :type="type">
+ * into this:
+ *   <input v-if="type === 'checkbox'" type="checkbox" v-model="data[type]">
+ *   <input v-else-if="type === 'radio'" type="radio" v-model="data[type]">
+ *   <input v-else :type="type" v-model="data[type]">
+ */
+
+import {
+  addRawAttr,
+  getBindingAttr,
+  getAndRemoveAttr
+} from 'compiler/helpers'
+
+import {
+  processFor,
+  processElement,
+  addIfCondition,
+  createASTElement
+} from 'compiler/parser/index'
+
+function preTransformNode (el: ASTElement, options: CompilerOptions) {
+  if (el.tag === 'input') {
+    const map = el.attrsMap
+    if (!map['v-model']) {
+      return
+    }
+
+    let typeBinding
+    if (map[':type'] || map['v-bind:type']) {
+      typeBinding = getBindingAttr(el, 'type')
+    }
+    if (!map.type && !typeBinding && map['v-bind']) {
+      typeBinding = `(${map['v-bind']}).type`
+    }
+
+    if (typeBinding) {
+      const ifCondition = getAndRemoveAttr(el, 'v-if', true)
+      const ifConditionExtra = ifCondition ? `&&(${ifCondition})` : ``
+      const hasElse = getAndRemoveAttr(el, 'v-else', true) != null
+      const elseIfCondition = getAndRemoveAttr(el, 'v-else-if', true)
+      // 1. checkbox
+      const branch0 = cloneASTElement(el)
+      // process for on the main node
+      processFor(branch0)
+      addRawAttr(branch0, 'type', 'checkbox')
+      processElement(branch0, options)
+      branch0.processed = true // prevent it from double-processed
+      branch0.if = `(${typeBinding})==='checkbox'` + ifConditionExtra
+      addIfCondition(branch0, {
+        exp: branch0.if,
+        block: branch0
+      })
+      // 2. add radio else-if condition
+      const branch1 = cloneASTElement(el)
+      getAndRemoveAttr(branch1, 'v-for', true)
+      addRawAttr(branch1, 'type', 'radio')
+      processElement(branch1, options)
+      addIfCondition(branch0, {
+        exp: `(${typeBinding})==='radio'` + ifConditionExtra,
+        block: branch1
+      })
+      // 3. other
+      const branch2 = cloneASTElement(el)
+      getAndRemoveAttr(branch2, 'v-for', true)
+      addRawAttr(branch2, ':type', typeBinding)
+      processElement(branch2, options)
+      addIfCondition(branch0, {
+        exp: ifCondition,
+        block: branch2
+      })
+
+      if (hasElse) {
+        branch0.else = true
+      } else if (elseIfCondition) {
+        branch0.elseif = elseIfCondition
+      }
+
+      return branch0
+    }
+  }
+}
+
+function cloneASTElement (el) {
+  return createASTElement(el.tag, el.attrsList.slice(), el.parent)
+}
+
+export default {
+  preTransformNode
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/web/compiler/modules/style.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/web/compiler/modules/style.js
new file mode 100644 (file)
index 0000000..2722b92
--- /dev/null
@@ -0,0 +1,51 @@
+/* @flow */
+
+import { parseText } from 'compiler/parser/text-parser'
+import { parseStyleText } from 'web/util/style'
+import {
+  getAndRemoveAttr,
+  getBindingAttr,
+  baseWarn
+} from 'compiler/helpers'
+
+function transformNode (el: ASTElement, options: CompilerOptions) {
+  const warn = options.warn || baseWarn
+  const staticStyle = getAndRemoveAttr(el, 'style')
+  if (staticStyle) {
+    /* istanbul ignore if */
+    if (process.env.NODE_ENV !== 'production') {
+      const res = parseText(staticStyle, options.delimiters)
+      if (res) {
+        warn(
+          `style="${staticStyle}": ` +
+          'Interpolation inside attributes has been removed. ' +
+          'Use v-bind or the colon shorthand instead. For example, ' +
+          'instead of <div style="{{ val }}">, use <div :style="val">.'
+        )
+      }
+    }
+    el.staticStyle = JSON.stringify(parseStyleText(staticStyle))
+  }
+
+  const styleBinding = getBindingAttr(el, 'style', false /* getStatic */)
+  if (styleBinding) {
+    el.styleBinding = styleBinding
+  }
+}
+
+function genData (el: ASTElement): string {
+  let data = ''
+  if (el.staticStyle) {
+    data += `staticStyle:${el.staticStyle},`
+  }
+  if (el.styleBinding) {
+    data += `style:(${el.styleBinding}),`
+  }
+  return data
+}
+
+export default {
+  staticKeys: ['staticStyle'],
+  transformNode,
+  genData
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/web/compiler/options.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/web/compiler/options.js
new file mode 100644 (file)
index 0000000..70c0c48
--- /dev/null
@@ -0,0 +1,26 @@
+/* @flow */
+
+import {
+  isPreTag,
+  mustUseProp,
+  isReservedTag,
+  getTagNamespace
+} from '../util/index'
+
+import modules from './modules/index'
+import directives from './directives/index'
+import { genStaticKeys } from 'shared/util'
+import { isUnaryTag, canBeLeftOpenTag } from './util'
+
+export const baseOptions: CompilerOptions = {
+  expectHTML: true,
+  modules,
+  directives,
+  isPreTag,
+  isUnaryTag,
+  mustUseProp,
+  canBeLeftOpenTag,
+  isReservedTag,
+  getTagNamespace,
+  staticKeys: genStaticKeys(modules)
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/web/compiler/util.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/web/compiler/util.js
new file mode 100644 (file)
index 0000000..7d9394d
--- /dev/null
@@ -0,0 +1,24 @@
+/* @flow */
+
+import { makeMap } from 'shared/util'
+
+export const isUnaryTag = makeMap(
+  'area,base,br,col,embed,frame,hr,img,input,isindex,keygen,' +
+  'link,meta,param,source,track,wbr'
+)
+
+// Elements that you can, intentionally, leave open
+// (and which close themselves)
+export const canBeLeftOpenTag = makeMap(
+  'colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr,source'
+)
+
+// HTML5 tags https://html.spec.whatwg.org/multipage/indices.html#elements-3
+// Phrasing Content https://html.spec.whatwg.org/multipage/dom.html#phrasing-content
+export const isNonPhrasingTag = makeMap(
+  'address,article,aside,base,blockquote,body,caption,col,colgroup,dd,' +
+  'details,dialog,div,dl,dt,fieldset,figcaption,figure,footer,form,' +
+  'h1,h2,h3,h4,h5,h6,head,header,hgroup,hr,html,legend,li,menuitem,meta,' +
+  'optgroup,option,param,rp,rt,source,style,summary,tbody,td,tfoot,th,thead,' +
+  'title,tr,track'
+)
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/web/entry-compiler.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/web/entry-compiler.js
new file mode 100644 (file)
index 0000000..ee63476
--- /dev/null
@@ -0,0 +1,5 @@
+/* @flow */
+
+export { parseComponent } from 'sfc/parser'
+export { compile, compileToFunctions } from './compiler/index'
+export { ssrCompile, ssrCompileToFunctions } from './server/compiler'
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/web/entry-runtime-with-compiler.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/web/entry-runtime-with-compiler.js
new file mode 100644 (file)
index 0000000..1ebc102
--- /dev/null
@@ -0,0 +1,100 @@
+/* @flow */
+
+import config from 'core/config'
+import { warn, cached } from 'core/util/index'
+import { mark, measure } from 'core/util/perf'
+
+import Vue from './runtime/index'
+import { query } from './util/index'
+import { compileToFunctions } from './compiler/index'
+import { shouldDecodeNewlines, shouldDecodeNewlinesForHref } from './util/compat'
+
+const idToTemplate = cached(id => {
+  const el = query(id)
+  return el && el.innerHTML
+})
+
+const mount = Vue.prototype.$mount
+Vue.prototype.$mount = function (
+  el?: string | Element,
+  hydrating?: boolean
+): Component {
+  el = el && query(el)
+
+  /* istanbul ignore if */
+  if (el === document.body || el === document.documentElement) {
+    process.env.NODE_ENV !== 'production' && warn(
+      `Do not mount Vue to <html> or <body> - mount to normal elements instead.`
+    )
+    return this
+  }
+
+  const options = this.$options
+  // resolve template/el and convert to render function
+  if (!options.render) {
+    let template = options.template
+    if (template) {
+      if (typeof template === 'string') {
+        if (template.charAt(0) === '#') {
+          template = idToTemplate(template)
+          /* istanbul ignore if */
+          if (process.env.NODE_ENV !== 'production' && !template) {
+            warn(
+              `Template element not found or is empty: ${options.template}`,
+              this
+            )
+          }
+        }
+      } else if (template.nodeType) {
+        template = template.innerHTML
+      } else {
+        if (process.env.NODE_ENV !== 'production') {
+          warn('invalid template option:' + template, this)
+        }
+        return this
+      }
+    } else if (el) {
+      template = getOuterHTML(el)
+    }
+    if (template) {
+      /* istanbul ignore if */
+      if (process.env.NODE_ENV !== 'production' && config.performance && mark) {
+        mark('compile')
+      }
+
+      const { render, staticRenderFns } = compileToFunctions(template, {
+        shouldDecodeNewlines,
+        shouldDecodeNewlinesForHref,
+        delimiters: options.delimiters,
+        comments: options.comments
+      }, this)
+      options.render = render
+      options.staticRenderFns = staticRenderFns
+
+      /* istanbul ignore if */
+      if (process.env.NODE_ENV !== 'production' && config.performance && mark) {
+        mark('compile end')
+        measure(`vue ${this._name} compile`, 'compile', 'compile end')
+      }
+    }
+  }
+  return mount.call(this, el, hydrating)
+}
+
+/**
+ * Get outerHTML of elements, taking care
+ * of SVG elements in IE as well.
+ */
+function getOuterHTML (el: Element): string {
+  if (el.outerHTML) {
+    return el.outerHTML
+  } else {
+    const container = document.createElement('div')
+    container.appendChild(el.cloneNode(true))
+    return container.innerHTML
+  }
+}
+
+Vue.compile = compileToFunctions
+
+export default Vue
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/web/entry-runtime.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/web/entry-runtime.js
new file mode 100644 (file)
index 0000000..27c97ff
--- /dev/null
@@ -0,0 +1,5 @@
+/* @flow */
+
+import Vue from './runtime/index'
+
+export default Vue
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/web/entry-server-basic-renderer.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/web/entry-server-basic-renderer.js
new file mode 100644 (file)
index 0000000..c4b973b
--- /dev/null
@@ -0,0 +1,13 @@
+/* @flow */
+
+import modules from './server/modules/index'
+import directives from './server/directives/index'
+import { isUnaryTag, canBeLeftOpenTag } from './compiler/util'
+import { createBasicRenderer } from 'server/create-basic-renderer'
+
+export default createBasicRenderer({
+  modules,
+  directives,
+  isUnaryTag,
+  canBeLeftOpenTag
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/web/entry-server-renderer.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/web/entry-server-renderer.js
new file mode 100644 (file)
index 0000000..f61f601
--- /dev/null
@@ -0,0 +1,27 @@
+/* @flow */
+
+process.env.VUE_ENV = 'server'
+
+import { extend } from 'shared/util'
+import modules from './server/modules/index'
+import baseDirectives from './server/directives/index'
+import { isUnaryTag, canBeLeftOpenTag } from './compiler/util'
+
+import { createRenderer as _createRenderer } from 'server/create-renderer'
+import { createBundleRendererCreator } from 'server/bundle-renderer/create-bundle-renderer'
+
+export function createRenderer (options?: Object = {}): {
+  renderToString: Function,
+  renderToStream: Function
+} {
+  return _createRenderer(extend(extend({}, options), {
+    isUnaryTag,
+    canBeLeftOpenTag,
+    modules,
+    // user can provide server-side implementations for custom directives
+    // when creating the renderer.
+    directives: extend(baseDirectives, options.directives)
+  }))
+}
+
+export const createBundleRenderer = createBundleRendererCreator(createRenderer)
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/web/runtime/class-util.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/web/runtime/class-util.js
new file mode 100644 (file)
index 0000000..709526c
--- /dev/null
@@ -0,0 +1,61 @@
+/* @flow */
+
+/**
+ * Add class with compatibility for SVG since classList is not supported on
+ * SVG elements in IE
+ */
+export function addClass (el: HTMLElement, cls: ?string) {
+  /* istanbul ignore if */
+  if (!cls || !(cls = cls.trim())) {
+    return
+  }
+
+  /* istanbul ignore else */
+  if (el.classList) {
+    if (cls.indexOf(' ') > -1) {
+      cls.split(/\s+/).forEach(c => el.classList.add(c))
+    } else {
+      el.classList.add(cls)
+    }
+  } else {
+    const cur = ` ${el.getAttribute('class') || ''} `
+    if (cur.indexOf(' ' + cls + ' ') < 0) {
+      el.setAttribute('class', (cur + cls).trim())
+    }
+  }
+}
+
+/**
+ * Remove class with compatibility for SVG since classList is not supported on
+ * SVG elements in IE
+ */
+export function removeClass (el: HTMLElement, cls: ?string) {
+  /* istanbul ignore if */
+  if (!cls || !(cls = cls.trim())) {
+    return
+  }
+
+  /* istanbul ignore else */
+  if (el.classList) {
+    if (cls.indexOf(' ') > -1) {
+      cls.split(/\s+/).forEach(c => el.classList.remove(c))
+    } else {
+      el.classList.remove(cls)
+    }
+    if (!el.classList.length) {
+      el.removeAttribute('class')
+    }
+  } else {
+    let cur = ` ${el.getAttribute('class') || ''} `
+    const tar = ' ' + cls + ' '
+    while (cur.indexOf(tar) >= 0) {
+      cur = cur.replace(tar, ' ')
+    }
+    cur = cur.trim()
+    if (cur) {
+      el.setAttribute('class', cur)
+    } else {
+      el.removeAttribute('class')
+    }
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/web/runtime/components/index.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/web/runtime/components/index.js
new file mode 100644 (file)
index 0000000..6bfe578
--- /dev/null
@@ -0,0 +1,7 @@
+import Transition from './transition'
+import TransitionGroup from './transition-group'
+
+export default {
+  Transition,
+  TransitionGroup
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/web/runtime/components/transition-group.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/web/runtime/components/transition-group.js
new file mode 100644 (file)
index 0000000..219ff01
--- /dev/null
@@ -0,0 +1,180 @@
+/* @flow */
+
+// Provides transition support for list items.
+// supports move transitions using the FLIP technique.
+
+// Because the vdom's children update algorithm is "unstable" - i.e.
+// it doesn't guarantee the relative positioning of removed elements,
+// we force transition-group to update its children into two passes:
+// in the first pass, we remove all nodes that need to be removed,
+// triggering their leaving transition; in the second pass, we insert/move
+// into the final desired state. This way in the second pass removed
+// nodes will remain where they should be.
+
+import { warn, extend } from 'core/util/index'
+import { addClass, removeClass } from '../class-util'
+import { transitionProps, extractTransitionData } from './transition'
+
+import {
+  hasTransition,
+  getTransitionInfo,
+  transitionEndEvent,
+  addTransitionClass,
+  removeTransitionClass
+} from '../transition-util'
+
+const props = extend({
+  tag: String,
+  moveClass: String
+}, transitionProps)
+
+delete props.mode
+
+export default {
+  props,
+
+  render (h: Function) {
+    const tag: string = this.tag || this.$vnode.data.tag || 'span'
+    const map: Object = Object.create(null)
+    const prevChildren: Array<VNode> = this.prevChildren = this.children
+    const rawChildren: Array<VNode> = this.$slots.default || []
+    const children: Array<VNode> = this.children = []
+    const transitionData: Object = extractTransitionData(this)
+
+    for (let i = 0; i < rawChildren.length; i++) {
+      const c: VNode = rawChildren[i]
+      if (c.tag) {
+        if (c.key != null && String(c.key).indexOf('__vlist') !== 0) {
+          children.push(c)
+          map[c.key] = c
+          ;(c.data || (c.data = {})).transition = transitionData
+        } else if (process.env.NODE_ENV !== 'production') {
+          const opts: ?VNodeComponentOptions = c.componentOptions
+          const name: string = opts ? (opts.Ctor.options.name || opts.tag || '') : c.tag
+          warn(`<transition-group> children must be keyed: <${name}>`)
+        }
+      }
+    }
+
+    if (prevChildren) {
+      const kept: Array<VNode> = []
+      const removed: Array<VNode> = []
+      for (let i = 0; i < prevChildren.length; i++) {
+        const c: VNode = prevChildren[i]
+        c.data.transition = transitionData
+        c.data.pos = c.elm.getBoundingClientRect()
+        if (map[c.key]) {
+          kept.push(c)
+        } else {
+          removed.push(c)
+        }
+      }
+      this.kept = h(tag, null, kept)
+      this.removed = removed
+    }
+
+    return h(tag, null, children)
+  },
+
+  beforeUpdate () {
+    // force removing pass
+    this.__patch__(
+      this._vnode,
+      this.kept,
+      false, // hydrating
+      true // removeOnly (!important, avoids unnecessary moves)
+    )
+    this._vnode = this.kept
+  },
+
+  updated () {
+    const children: Array<VNode> = this.prevChildren
+    const moveClass: string = this.moveClass || ((this.name || 'v') + '-move')
+    if (!children.length || !this.hasMove(children[0].elm, moveClass)) {
+      return
+    }
+
+    // we divide the work into three loops to avoid mixing DOM reads and writes
+    // in each iteration - which helps prevent layout thrashing.
+    children.forEach(callPendingCbs)
+    children.forEach(recordPosition)
+    children.forEach(applyTranslation)
+
+    // force reflow to put everything in position
+    // assign to this to avoid being removed in tree-shaking
+    // $flow-disable-line
+    this._reflow = document.body.offsetHeight
+
+    children.forEach((c: VNode) => {
+      if (c.data.moved) {
+        var el: any = c.elm
+        var s: any = el.style
+        addTransitionClass(el, moveClass)
+        s.transform = s.WebkitTransform = s.transitionDuration = ''
+        el.addEventListener(transitionEndEvent, el._moveCb = function cb (e) {
+          if (!e || /transform$/.test(e.propertyName)) {
+            el.removeEventListener(transitionEndEvent, cb)
+            el._moveCb = null
+            removeTransitionClass(el, moveClass)
+          }
+        })
+      }
+    })
+  },
+
+  methods: {
+    hasMove (el: any, moveClass: string): boolean {
+      /* istanbul ignore if */
+      if (!hasTransition) {
+        return false
+      }
+      /* istanbul ignore if */
+      if (this._hasMove) {
+        return this._hasMove
+      }
+      // Detect whether an element with the move class applied has
+      // CSS transitions. Since the element may be inside an entering
+      // transition at this very moment, we make a clone of it and remove
+      // all other transition classes applied to ensure only the move class
+      // is applied.
+      const clone: HTMLElement = el.cloneNode()
+      if (el._transitionClasses) {
+        el._transitionClasses.forEach((cls: string) => { removeClass(clone, cls) })
+      }
+      addClass(clone, moveClass)
+      clone.style.display = 'none'
+      this.$el.appendChild(clone)
+      const info: Object = getTransitionInfo(clone)
+      this.$el.removeChild(clone)
+      return (this._hasMove = info.hasTransform)
+    }
+  }
+}
+
+function callPendingCbs (c: VNode) {
+  /* istanbul ignore if */
+  if (c.elm._moveCb) {
+    c.elm._moveCb()
+  }
+  /* istanbul ignore if */
+  if (c.elm._enterCb) {
+    c.elm._enterCb()
+  }
+}
+
+function recordPosition (c: VNode) {
+  c.data.newPos = c.elm.getBoundingClientRect()
+}
+
+function applyTranslation (c: VNode) {
+  const oldPos = c.data.pos
+  const newPos = c.data.newPos
+  const dx = oldPos.left - newPos.left
+  const dy = oldPos.top - newPos.top
+  if (dx || dy) {
+    c.data.moved = true
+    const s = c.elm.style
+    s.transform = s.WebkitTransform = `translate(${dx}px,${dy}px)`
+    s.transitionDuration = '0s'
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/web/runtime/components/transition.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/web/runtime/components/transition.js
new file mode 100644 (file)
index 0000000..6111d8c
--- /dev/null
@@ -0,0 +1,194 @@
+/* @flow */
+
+// Provides transition support for a single element/component.
+// supports transition mode (out-in / in-out)
+
+import { warn } from 'core/util/index'
+import { camelize, extend, isPrimitive } from 'shared/util'
+import {
+  mergeVNodeHook,
+  isAsyncPlaceholder,
+  getFirstComponentChild
+} from 'core/vdom/helpers/index'
+
+export const transitionProps = {
+  name: String,
+  appear: Boolean,
+  css: Boolean,
+  mode: String,
+  type: String,
+  enterClass: String,
+  leaveClass: String,
+  enterToClass: String,
+  leaveToClass: String,
+  enterActiveClass: String,
+  leaveActiveClass: String,
+  appearClass: String,
+  appearActiveClass: String,
+  appearToClass: String,
+  duration: [Number, String, Object]
+}
+
+// in case the child is also an abstract component, e.g. <keep-alive>
+// we want to recursively retrieve the real component to be rendered
+function getRealChild (vnode: ?VNode): ?VNode {
+  const compOptions: ?VNodeComponentOptions = vnode && vnode.componentOptions
+  if (compOptions && compOptions.Ctor.options.abstract) {
+    return getRealChild(getFirstComponentChild(compOptions.children))
+  } else {
+    return vnode
+  }
+}
+
+export function extractTransitionData (comp: Component): Object {
+  const data = {}
+  const options: ComponentOptions = comp.$options
+  // props
+  for (const key in options.propsData) {
+    data[key] = comp[key]
+  }
+  // events.
+  // extract listeners and pass them directly to the transition methods
+  const listeners: ?Object = options._parentListeners
+  for (const key in listeners) {
+    data[camelize(key)] = listeners[key]
+  }
+  return data
+}
+
+function placeholder (h: Function, rawChild: VNode): ?VNode {
+  if (/\d-keep-alive$/.test(rawChild.tag)) {
+    return h('keep-alive', {
+      props: rawChild.componentOptions.propsData
+    })
+  }
+}
+
+function hasParentTransition (vnode: VNode): ?boolean {
+  while ((vnode = vnode.parent)) {
+    if (vnode.data.transition) {
+      return true
+    }
+  }
+}
+
+function isSameChild (child: VNode, oldChild: VNode): boolean {
+  return oldChild.key === child.key && oldChild.tag === child.tag
+}
+
+export default {
+  name: 'transition',
+  props: transitionProps,
+  abstract: true,
+
+  render (h: Function) {
+    let children: any = this.$slots.default
+    if (!children) {
+      return
+    }
+
+    // filter out text nodes (possible whitespaces)
+    children = children.filter((c: VNode) => c.tag || isAsyncPlaceholder(c))
+    /* istanbul ignore if */
+    if (!children.length) {
+      return
+    }
+
+    // warn multiple elements
+    if (process.env.NODE_ENV !== 'production' && children.length > 1) {
+      warn(
+        '<transition> can only be used on a single element. Use ' +
+        '<transition-group> for lists.',
+        this.$parent
+      )
+    }
+
+    const mode: string = this.mode
+
+    // warn invalid mode
+    if (process.env.NODE_ENV !== 'production' &&
+      mode && mode !== 'in-out' && mode !== 'out-in'
+    ) {
+      warn(
+        'invalid <transition> mode: ' + mode,
+        this.$parent
+      )
+    }
+
+    const rawChild: VNode = children[0]
+
+    // if this is a component root node and the component's
+    // parent container node also has transition, skip.
+    if (hasParentTransition(this.$vnode)) {
+      return rawChild
+    }
+
+    // apply transition data to child
+    // use getRealChild() to ignore abstract components e.g. keep-alive
+    const child: ?VNode = getRealChild(rawChild)
+    /* istanbul ignore if */
+    if (!child) {
+      return rawChild
+    }
+
+    if (this._leaving) {
+      return placeholder(h, rawChild)
+    }
+
+    // ensure a key that is unique to the vnode type and to this transition
+    // component instance. This key will be used to remove pending leaving nodes
+    // during entering.
+    const id: string = `__transition-${this._uid}-`
+    child.key = child.key == null
+      ? child.isComment
+        ? id + 'comment'
+        : id + child.tag
+      : isPrimitive(child.key)
+        ? (String(child.key).indexOf(id) === 0 ? child.key : id + child.key)
+        : child.key
+
+    const data: Object = (child.data || (child.data = {})).transition = extractTransitionData(this)
+    const oldRawChild: VNode = this._vnode
+    const oldChild: VNode = getRealChild(oldRawChild)
+
+    // mark v-show
+    // so that the transition module can hand over the control to the directive
+    if (child.data.directives && child.data.directives.some(d => d.name === 'show')) {
+      child.data.show = true
+    }
+
+    if (
+      oldChild &&
+      oldChild.data &&
+      !isSameChild(child, oldChild) &&
+      !isAsyncPlaceholder(oldChild) &&
+      // #6687 component root is a comment node
+      !(oldChild.componentInstance && oldChild.componentInstance._vnode.isComment)
+    ) {
+      // replace old child transition data with fresh one
+      // important for dynamic transitions!
+      const oldData: Object = oldChild.data.transition = extend({}, data)
+      // handle transition mode
+      if (mode === 'out-in') {
+        // return placeholder node and queue update when leave finishes
+        this._leaving = true
+        mergeVNodeHook(oldData, 'afterLeave', () => {
+          this._leaving = false
+          this.$forceUpdate()
+        })
+        return placeholder(h, rawChild)
+      } else if (mode === 'in-out') {
+        if (isAsyncPlaceholder(child)) {
+          return oldRawChild
+        }
+        let delayedLeave
+        const performLeave = () => { delayedLeave() }
+        mergeVNodeHook(data, 'afterEnter', performLeave)
+        mergeVNodeHook(data, 'enterCancelled', performLeave)
+        mergeVNodeHook(oldData, 'delayLeave', leave => { delayedLeave = leave })
+      }
+    }
+
+    return rawChild
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/web/runtime/directives/index.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/web/runtime/directives/index.js
new file mode 100644 (file)
index 0000000..b673f11
--- /dev/null
@@ -0,0 +1,7 @@
+import model from './model'
+import show from './show'
+
+export default {
+  model,
+  show
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/web/runtime/directives/model.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/web/runtime/directives/model.js
new file mode 100644 (file)
index 0000000..cba8ded
--- /dev/null
@@ -0,0 +1,147 @@
+/**
+ * Not type checking this file because flow doesn't like attaching
+ * properties to Elements.
+ */
+
+import { isTextInputType } from 'web/util/element'
+import { looseEqual, looseIndexOf } from 'shared/util'
+import { mergeVNodeHook } from 'core/vdom/helpers/index'
+import { warn, isIE9, isIE, isEdge } from 'core/util/index'
+
+/* istanbul ignore if */
+if (isIE9) {
+  // http://www.matts411.com/post/internet-explorer-9-oninput/
+  document.addEventListener('selectionchange', () => {
+    const el = document.activeElement
+    if (el && el.vmodel) {
+      trigger(el, 'input')
+    }
+  })
+}
+
+const directive = {
+  inserted (el, binding, vnode, oldVnode) {
+    if (vnode.tag === 'select') {
+      // #6903
+      if (oldVnode.elm && !oldVnode.elm._vOptions) {
+        mergeVNodeHook(vnode, 'postpatch', () => {
+          directive.componentUpdated(el, binding, vnode)
+        })
+      } else {
+        setSelected(el, binding, vnode.context)
+      }
+      el._vOptions = [].map.call(el.options, getValue)
+    } else if (vnode.tag === 'textarea' || isTextInputType(el.type)) {
+      el._vModifiers = binding.modifiers
+      if (!binding.modifiers.lazy) {
+        el.addEventListener('compositionstart', onCompositionStart)
+        el.addEventListener('compositionend', onCompositionEnd)
+        // Safari < 10.2 & UIWebView doesn't fire compositionend when
+        // switching focus before confirming composition choice
+        // this also fixes the issue where some browsers e.g. iOS Chrome
+        // fires "change" instead of "input" on autocomplete.
+        el.addEventListener('change', onCompositionEnd)
+        /* istanbul ignore if */
+        if (isIE9) {
+          el.vmodel = true
+        }
+      }
+    }
+  },
+
+  componentUpdated (el, binding, vnode) {
+    if (vnode.tag === 'select') {
+      setSelected(el, binding, vnode.context)
+      // in case the options rendered by v-for have changed,
+      // it's possible that the value is out-of-sync with the rendered options.
+      // detect such cases and filter out values that no longer has a matching
+      // option in the DOM.
+      const prevOptions = el._vOptions
+      const curOptions = el._vOptions = [].map.call(el.options, getValue)
+      if (curOptions.some((o, i) => !looseEqual(o, prevOptions[i]))) {
+        // trigger change event if
+        // no matching option found for at least one value
+        const needReset = el.multiple
+          ? binding.value.some(v => hasNoMatchingOption(v, curOptions))
+          : binding.value !== binding.oldValue && hasNoMatchingOption(binding.value, curOptions)
+        if (needReset) {
+          trigger(el, 'change')
+        }
+      }
+    }
+  }
+}
+
+function setSelected (el, binding, vm) {
+  actuallySetSelected(el, binding, vm)
+  /* istanbul ignore if */
+  if (isIE || isEdge) {
+    setTimeout(() => {
+      actuallySetSelected(el, binding, vm)
+    }, 0)
+  }
+}
+
+function actuallySetSelected (el, binding, vm) {
+  const value = binding.value
+  const isMultiple = el.multiple
+  if (isMultiple && !Array.isArray(value)) {
+    process.env.NODE_ENV !== 'production' && warn(
+      `<select multiple v-model="${binding.expression}"> ` +
+      `expects an Array value for its binding, but got ${
+        Object.prototype.toString.call(value).slice(8, -1)
+      }`,
+      vm
+    )
+    return
+  }
+  let selected, option
+  for (let i = 0, l = el.options.length; i < l; i++) {
+    option = el.options[i]
+    if (isMultiple) {
+      selected = looseIndexOf(value, getValue(option)) > -1
+      if (option.selected !== selected) {
+        option.selected = selected
+      }
+    } else {
+      if (looseEqual(getValue(option), value)) {
+        if (el.selectedIndex !== i) {
+          el.selectedIndex = i
+        }
+        return
+      }
+    }
+  }
+  if (!isMultiple) {
+    el.selectedIndex = -1
+  }
+}
+
+function hasNoMatchingOption (value, options) {
+  return options.every(o => !looseEqual(o, value))
+}
+
+function getValue (option) {
+  return '_value' in option
+    ? option._value
+    : option.value
+}
+
+function onCompositionStart (e) {
+  e.target.composing = true
+}
+
+function onCompositionEnd (e) {
+  // prevent triggering an input event for no reason
+  if (!e.target.composing) return
+  e.target.composing = false
+  trigger(e.target, 'input')
+}
+
+function trigger (el, type) {
+  const e = document.createEvent('HTMLEvents')
+  e.initEvent(type, true, true)
+  el.dispatchEvent(e)
+}
+
+export default directive
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/web/runtime/directives/show.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/web/runtime/directives/show.js
new file mode 100644 (file)
index 0000000..17fb5de
--- /dev/null
@@ -0,0 +1,60 @@
+/* @flow */
+
+import { enter, leave } from '../modules/transition'
+
+// recursively search for possible transition defined inside the component root
+function locateNode (vnode: VNode): VNodeWithData {
+  return vnode.componentInstance && (!vnode.data || !vnode.data.transition)
+    ? locateNode(vnode.componentInstance._vnode)
+    : vnode
+}
+
+export default {
+  bind (el: any, { value }: VNodeDirective, vnode: VNodeWithData) {
+    vnode = locateNode(vnode)
+    const transition = vnode.data && vnode.data.transition
+    const originalDisplay = el.__vOriginalDisplay =
+      el.style.display === 'none' ? '' : el.style.display
+    if (value && transition) {
+      vnode.data.show = true
+      enter(vnode, () => {
+        el.style.display = originalDisplay
+      })
+    } else {
+      el.style.display = value ? originalDisplay : 'none'
+    }
+  },
+
+  update (el: any, { value, oldValue }: VNodeDirective, vnode: VNodeWithData) {
+    /* istanbul ignore if */
+    if (!value === !oldValue) return
+    vnode = locateNode(vnode)
+    const transition = vnode.data && vnode.data.transition
+    if (transition) {
+      vnode.data.show = true
+      if (value) {
+        enter(vnode, () => {
+          el.style.display = el.__vOriginalDisplay
+        })
+      } else {
+        leave(vnode, () => {
+          el.style.display = 'none'
+        })
+      }
+    } else {
+      el.style.display = value ? el.__vOriginalDisplay : 'none'
+    }
+  },
+
+  unbind (
+    el: any,
+    binding: VNodeDirective,
+    vnode: VNodeWithData,
+    oldVnode: VNodeWithData,
+    isDestroy: boolean
+  ) {
+    if (!isDestroy) {
+      el.style.display = el.__vOriginalDisplay
+    }
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/web/runtime/index.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/web/runtime/index.js
new file mode 100644 (file)
index 0000000..1283f52
--- /dev/null
@@ -0,0 +1,77 @@
+/* @flow */
+
+import Vue from 'core/index'
+import config from 'core/config'
+import { extend, noop } from 'shared/util'
+import { mountComponent } from 'core/instance/lifecycle'
+import { devtools, inBrowser, isChrome } from 'core/util/index'
+
+import {
+  query,
+  mustUseProp,
+  isReservedTag,
+  isReservedAttr,
+  getTagNamespace,
+  isUnknownElement
+} from 'web/util/index'
+
+import { patch } from './patch'
+import platformDirectives from './directives/index'
+import platformComponents from './components/index'
+
+// install platform specific utils
+Vue.config.mustUseProp = mustUseProp
+Vue.config.isReservedTag = isReservedTag
+Vue.config.isReservedAttr = isReservedAttr
+Vue.config.getTagNamespace = getTagNamespace
+Vue.config.isUnknownElement = isUnknownElement
+
+// install platform runtime directives & components
+extend(Vue.options.directives, platformDirectives)
+extend(Vue.options.components, platformComponents)
+
+// install platform patch function
+Vue.prototype.__patch__ = inBrowser ? patch : noop
+
+// public mount method
+Vue.prototype.$mount = function (
+  el?: string | Element,
+  hydrating?: boolean
+): Component {
+  el = el && inBrowser ? query(el) : undefined
+  return mountComponent(this, el, hydrating)
+}
+
+// devtools global hook
+/* istanbul ignore next */
+if (inBrowser) {
+  setTimeout(() => {
+    if (config.devtools) {
+      if (devtools) {
+        devtools.emit('init', Vue)
+      } else if (
+        process.env.NODE_ENV !== 'production' &&
+        process.env.NODE_ENV !== 'test' &&
+        isChrome
+      ) {
+        console[console.info ? 'info' : 'log'](
+          'Download the Vue Devtools extension for a better development experience:\n' +
+          'https://github.com/vuejs/vue-devtools'
+        )
+      }
+    }
+    if (process.env.NODE_ENV !== 'production' &&
+      process.env.NODE_ENV !== 'test' &&
+      config.productionTip !== false &&
+      typeof console !== 'undefined'
+    ) {
+      console[console.info ? 'info' : 'log'](
+        `You are running Vue in development mode.\n` +
+        `Make sure to turn on production mode when deploying for production.\n` +
+        `See more tips at https://vuejs.org/guide/deployment.html`
+      )
+    }
+  }, 0)
+}
+
+export default Vue
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/web/runtime/modules/attrs.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/web/runtime/modules/attrs.js
new file mode 100644 (file)
index 0000000..78ef28a
--- /dev/null
@@ -0,0 +1,118 @@
+/* @flow */
+
+import { isIE, isIE9, isEdge } from 'core/util/env'
+
+import {
+  extend,
+  isDef,
+  isUndef
+} from 'shared/util'
+
+import {
+  isXlink,
+  xlinkNS,
+  getXlinkProp,
+  isBooleanAttr,
+  isEnumeratedAttr,
+  isFalsyAttrValue
+} from 'web/util/index'
+
+function updateAttrs (oldVnode: VNodeWithData, vnode: VNodeWithData) {
+  const opts = vnode.componentOptions
+  if (isDef(opts) && opts.Ctor.options.inheritAttrs === false) {
+    return
+  }
+  if (isUndef(oldVnode.data.attrs) && isUndef(vnode.data.attrs)) {
+    return
+  }
+  let key, cur, old
+  const elm = vnode.elm
+  const oldAttrs = oldVnode.data.attrs || {}
+  let attrs: any = vnode.data.attrs || {}
+  // clone observed objects, as the user probably wants to mutate it
+  if (isDef(attrs.__ob__)) {
+    attrs = vnode.data.attrs = extend({}, attrs)
+  }
+
+  for (key in attrs) {
+    cur = attrs[key]
+    old = oldAttrs[key]
+    if (old !== cur) {
+      setAttr(elm, key, cur)
+    }
+  }
+  // #4391: in IE9, setting type can reset value for input[type=radio]
+  // #6666: IE/Edge forces progress value down to 1 before setting a max
+  /* istanbul ignore if */
+  if ((isIE || isEdge) && attrs.value !== oldAttrs.value) {
+    setAttr(elm, 'value', attrs.value)
+  }
+  for (key in oldAttrs) {
+    if (isUndef(attrs[key])) {
+      if (isXlink(key)) {
+        elm.removeAttributeNS(xlinkNS, getXlinkProp(key))
+      } else if (!isEnumeratedAttr(key)) {
+        elm.removeAttribute(key)
+      }
+    }
+  }
+}
+
+function setAttr (el: Element, key: string, value: any) {
+  if (el.tagName.indexOf('-') > -1) {
+    baseSetAttr(el, key, value)
+  } else if (isBooleanAttr(key)) {
+    // set attribute for blank value
+    // e.g. <option disabled>Select one</option>
+    if (isFalsyAttrValue(value)) {
+      el.removeAttribute(key)
+    } else {
+      // technically allowfullscreen is a boolean attribute for <iframe>,
+      // but Flash expects a value of "true" when used on <embed> tag
+      value = key === 'allowfullscreen' && el.tagName === 'EMBED'
+        ? 'true'
+        : key
+      el.setAttribute(key, value)
+    }
+  } else if (isEnumeratedAttr(key)) {
+    el.setAttribute(key, isFalsyAttrValue(value) || value === 'false' ? 'false' : 'true')
+  } else if (isXlink(key)) {
+    if (isFalsyAttrValue(value)) {
+      el.removeAttributeNS(xlinkNS, getXlinkProp(key))
+    } else {
+      el.setAttributeNS(xlinkNS, key, value)
+    }
+  } else {
+    baseSetAttr(el, key, value)
+  }
+}
+
+function baseSetAttr (el, key, value) {
+  if (isFalsyAttrValue(value)) {
+    el.removeAttribute(key)
+  } else {
+    // #7138: IE10 & 11 fires input event when setting placeholder on
+    // <textarea>... block the first input event and remove the blocker
+    // immediately.
+    /* istanbul ignore if */
+    if (
+      isIE && !isIE9 &&
+      el.tagName === 'TEXTAREA' &&
+      key === 'placeholder' && !el.__ieph
+    ) {
+      const blocker = e => {
+        e.stopImmediatePropagation()
+        el.removeEventListener('input', blocker)
+      }
+      el.addEventListener('input', blocker)
+      // $flow-disable-line
+      el.__ieph = true /* IE placeholder patched */
+    }
+    el.setAttribute(key, value)
+  }
+}
+
+export default {
+  create: updateAttrs,
+  update: updateAttrs
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/web/runtime/modules/class.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/web/runtime/modules/class.js
new file mode 100644 (file)
index 0000000..29fd2c1
--- /dev/null
@@ -0,0 +1,48 @@
+/* @flow */
+
+import {
+  isDef,
+  isUndef
+} from 'shared/util'
+
+import {
+  concat,
+  stringifyClass,
+  genClassForVnode
+} from 'web/util/index'
+
+function updateClass (oldVnode: any, vnode: any) {
+  const el = vnode.elm
+  const data: VNodeData = vnode.data
+  const oldData: VNodeData = oldVnode.data
+  if (
+    isUndef(data.staticClass) &&
+    isUndef(data.class) && (
+      isUndef(oldData) || (
+        isUndef(oldData.staticClass) &&
+        isUndef(oldData.class)
+      )
+    )
+  ) {
+    return
+  }
+
+  let cls = genClassForVnode(vnode)
+
+  // handle transition classes
+  const transitionClass = el._transitionClasses
+  if (isDef(transitionClass)) {
+    cls = concat(cls, stringifyClass(transitionClass))
+  }
+
+  // set the class
+  if (cls !== el._prevClass) {
+    el.setAttribute('class', cls)
+    el._prevClass = cls
+  }
+}
+
+export default {
+  create: updateClass,
+  update: updateClass
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/web/runtime/modules/dom-props.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/web/runtime/modules/dom-props.js
new file mode 100644 (file)
index 0000000..f3888ae
--- /dev/null
@@ -0,0 +1,95 @@
+/* @flow */
+
+import { isDef, isUndef, extend, toNumber } from 'shared/util'
+
+function updateDOMProps (oldVnode: VNodeWithData, vnode: VNodeWithData) {
+  if (isUndef(oldVnode.data.domProps) && isUndef(vnode.data.domProps)) {
+    return
+  }
+  let key, cur
+  const elm: any = vnode.elm
+  const oldProps = oldVnode.data.domProps || {}
+  let props = vnode.data.domProps || {}
+  // clone observed objects, as the user probably wants to mutate it
+  if (isDef(props.__ob__)) {
+    props = vnode.data.domProps = extend({}, props)
+  }
+
+  for (key in oldProps) {
+    if (isUndef(props[key])) {
+      elm[key] = ''
+    }
+  }
+  for (key in props) {
+    cur = props[key]
+    // ignore children if the node has textContent or innerHTML,
+    // as these will throw away existing DOM nodes and cause removal errors
+    // on subsequent patches (#3360)
+    if (key === 'textContent' || key === 'innerHTML') {
+      if (vnode.children) vnode.children.length = 0
+      if (cur === oldProps[key]) continue
+      // #6601 work around Chrome version <= 55 bug where single textNode
+      // replaced by innerHTML/textContent retains its parentNode property
+      if (elm.childNodes.length === 1) {
+        elm.removeChild(elm.childNodes[0])
+      }
+    }
+
+    if (key === 'value') {
+      // store value as _value as well since
+      // non-string values will be stringified
+      elm._value = cur
+      // avoid resetting cursor position when value is the same
+      const strCur = isUndef(cur) ? '' : String(cur)
+      if (shouldUpdateValue(elm, strCur)) {
+        elm.value = strCur
+      }
+    } else {
+      elm[key] = cur
+    }
+  }
+}
+
+// check platforms/web/util/attrs.js acceptValue
+type acceptValueElm = HTMLInputElement | HTMLSelectElement | HTMLOptionElement;
+
+function shouldUpdateValue (elm: acceptValueElm, checkVal: string): boolean {
+  return (!elm.composing && (
+    elm.tagName === 'OPTION' ||
+    isNotInFocusAndDirty(elm, checkVal) ||
+    isDirtyWithModifiers(elm, checkVal)
+  ))
+}
+
+function isNotInFocusAndDirty (elm: acceptValueElm, checkVal: string): boolean {
+  // return true when textbox (.number and .trim) loses focus and its value is
+  // not equal to the updated value
+  let notInFocus = true
+  // #6157
+  // work around IE bug when accessing document.activeElement in an iframe
+  try { notInFocus = document.activeElement !== elm } catch (e) {}
+  return notInFocus && elm.value !== checkVal
+}
+
+function isDirtyWithModifiers (elm: any, newVal: string): boolean {
+  const value = elm.value
+  const modifiers = elm._vModifiers // injected by v-model runtime
+  if (isDef(modifiers)) {
+    if (modifiers.lazy) {
+      // inputs with lazy should only be updated when not in focus
+      return false
+    }
+    if (modifiers.number) {
+      return toNumber(value) !== toNumber(newVal)
+    }
+    if (modifiers.trim) {
+      return value.trim() !== newVal.trim()
+    }
+  }
+  return value !== newVal
+}
+
+export default {
+  create: updateDOMProps,
+  update: updateDOMProps
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/web/runtime/modules/events.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/web/runtime/modules/events.js
new file mode 100644 (file)
index 0000000..1e71b66
--- /dev/null
@@ -0,0 +1,87 @@
+/* @flow */
+
+import { isDef, isUndef } from 'shared/util'
+import { updateListeners } from 'core/vdom/helpers/index'
+import { withMacroTask, isIE, supportsPassive } from 'core/util/index'
+import { RANGE_TOKEN, CHECKBOX_RADIO_TOKEN } from 'web/compiler/directives/model'
+
+// normalize v-model event tokens that can only be determined at runtime.
+// it's important to place the event as the first in the array because
+// the whole point is ensuring the v-model callback gets called before
+// user-attached handlers.
+function normalizeEvents (on) {
+  /* istanbul ignore if */
+  if (isDef(on[RANGE_TOKEN])) {
+    // IE input[type=range] only supports `change` event
+    const event = isIE ? 'change' : 'input'
+    on[event] = [].concat(on[RANGE_TOKEN], on[event] || [])
+    delete on[RANGE_TOKEN]
+  }
+  // This was originally intended to fix #4521 but no longer necessary
+  // after 2.5. Keeping it for backwards compat with generated code from < 2.4
+  /* istanbul ignore if */
+  if (isDef(on[CHECKBOX_RADIO_TOKEN])) {
+    on.change = [].concat(on[CHECKBOX_RADIO_TOKEN], on.change || [])
+    delete on[CHECKBOX_RADIO_TOKEN]
+  }
+}
+
+let target: any
+
+function createOnceHandler (handler, event, capture) {
+  const _target = target // save current target element in closure
+  return function onceHandler () {
+    const res = handler.apply(null, arguments)
+    if (res !== null) {
+      remove(event, onceHandler, capture, _target)
+    }
+  }
+}
+
+function add (
+  event: string,
+  handler: Function,
+  once: boolean,
+  capture: boolean,
+  passive: boolean
+) {
+  handler = withMacroTask(handler)
+  if (once) handler = createOnceHandler(handler, event, capture)
+  target.addEventListener(
+    event,
+    handler,
+    supportsPassive
+      ? { capture, passive }
+      : capture
+  )
+}
+
+function remove (
+  event: string,
+  handler: Function,
+  capture: boolean,
+  _target?: HTMLElement
+) {
+  (_target || target).removeEventListener(
+    event,
+    handler._withTask || handler,
+    capture
+  )
+}
+
+function updateDOMListeners (oldVnode: VNodeWithData, vnode: VNodeWithData) {
+  if (isUndef(oldVnode.data.on) && isUndef(vnode.data.on)) {
+    return
+  }
+  const on = vnode.data.on || {}
+  const oldOn = oldVnode.data.on || {}
+  target = vnode.elm
+  normalizeEvents(on)
+  updateListeners(on, oldOn, add, remove, vnode.context)
+  target = undefined
+}
+
+export default {
+  create: updateDOMListeners,
+  update: updateDOMListeners
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/web/runtime/modules/index.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/web/runtime/modules/index.js
new file mode 100644 (file)
index 0000000..9f6ad8f
--- /dev/null
@@ -0,0 +1,15 @@
+import attrs from './attrs'
+import klass from './class'
+import events from './events'
+import domProps from './dom-props'
+import style from './style'
+import transition from './transition'
+
+export default [
+  attrs,
+  klass,
+  events,
+  domProps,
+  style,
+  transition
+]
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/web/runtime/modules/style.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/web/runtime/modules/style.js
new file mode 100644 (file)
index 0000000..29e1c3c
--- /dev/null
@@ -0,0 +1,93 @@
+/* @flow */
+
+import { getStyle, normalizeStyleBinding } from 'web/util/style'
+import { cached, camelize, extend, isDef, isUndef } from 'shared/util'
+
+const cssVarRE = /^--/
+const importantRE = /\s*!important$/
+const setProp = (el, name, val) => {
+  /* istanbul ignore if */
+  if (cssVarRE.test(name)) {
+    el.style.setProperty(name, val)
+  } else if (importantRE.test(val)) {
+    el.style.setProperty(name, val.replace(importantRE, ''), 'important')
+  } else {
+    const normalizedName = normalize(name)
+    if (Array.isArray(val)) {
+      // Support values array created by autoprefixer, e.g.
+      // {display: ["-webkit-box", "-ms-flexbox", "flex"]}
+      // Set them one by one, and the browser will only set those it can recognize
+      for (let i = 0, len = val.length; i < len; i++) {
+        el.style[normalizedName] = val[i]
+      }
+    } else {
+      el.style[normalizedName] = val
+    }
+  }
+}
+
+const vendorNames = ['Webkit', 'Moz', 'ms']
+
+let emptyStyle
+const normalize = cached(function (prop) {
+  emptyStyle = emptyStyle || document.createElement('div').style
+  prop = camelize(prop)
+  if (prop !== 'filter' && (prop in emptyStyle)) {
+    return prop
+  }
+  const capName = prop.charAt(0).toUpperCase() + prop.slice(1)
+  for (let i = 0; i < vendorNames.length; i++) {
+    const name = vendorNames[i] + capName
+    if (name in emptyStyle) {
+      return name
+    }
+  }
+})
+
+function updateStyle (oldVnode: VNodeWithData, vnode: VNodeWithData) {
+  const data = vnode.data
+  const oldData = oldVnode.data
+
+  if (isUndef(data.staticStyle) && isUndef(data.style) &&
+    isUndef(oldData.staticStyle) && isUndef(oldData.style)
+  ) {
+    return
+  }
+
+  let cur, name
+  const el: any = vnode.elm
+  const oldStaticStyle: any = oldData.staticStyle
+  const oldStyleBinding: any = oldData.normalizedStyle || oldData.style || {}
+
+  // if static style exists, stylebinding already merged into it when doing normalizeStyleData
+  const oldStyle = oldStaticStyle || oldStyleBinding
+
+  const style = normalizeStyleBinding(vnode.data.style) || {}
+
+  // store normalized style under a different key for next diff
+  // make sure to clone it if it's reactive, since the user likely wants
+  // to mutate it.
+  vnode.data.normalizedStyle = isDef(style.__ob__)
+    ? extend({}, style)
+    : style
+
+  const newStyle = getStyle(vnode, true)
+
+  for (name in oldStyle) {
+    if (isUndef(newStyle[name])) {
+      setProp(el, name, '')
+    }
+  }
+  for (name in newStyle) {
+    cur = newStyle[name]
+    if (cur !== oldStyle[name]) {
+      // ie9 setting to null has no effect, must use empty string
+      setProp(el, name, cur == null ? '' : cur)
+    }
+  }
+}
+
+export default {
+  create: updateStyle,
+  update: updateStyle
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/web/runtime/modules/transition.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/web/runtime/modules/transition.js
new file mode 100644 (file)
index 0000000..0796b5d
--- /dev/null
@@ -0,0 +1,343 @@
+/* @flow */
+
+import { inBrowser, isIE9, warn } from 'core/util/index'
+import { mergeVNodeHook } from 'core/vdom/helpers/index'
+import { activeInstance } from 'core/instance/lifecycle'
+
+import {
+  once,
+  isDef,
+  isUndef,
+  isObject,
+  toNumber
+} from 'shared/util'
+
+import {
+  nextFrame,
+  resolveTransition,
+  whenTransitionEnds,
+  addTransitionClass,
+  removeTransitionClass
+} from '../transition-util'
+
+export function enter (vnode: VNodeWithData, toggleDisplay: ?() => void) {
+  const el: any = vnode.elm
+
+  // call leave callback now
+  if (isDef(el._leaveCb)) {
+    el._leaveCb.cancelled = true
+    el._leaveCb()
+  }
+
+  const data = resolveTransition(vnode.data.transition)
+  if (isUndef(data)) {
+    return
+  }
+
+  /* istanbul ignore if */
+  if (isDef(el._enterCb) || el.nodeType !== 1) {
+    return
+  }
+
+  const {
+    css,
+    type,
+    enterClass,
+    enterToClass,
+    enterActiveClass,
+    appearClass,
+    appearToClass,
+    appearActiveClass,
+    beforeEnter,
+    enter,
+    afterEnter,
+    enterCancelled,
+    beforeAppear,
+    appear,
+    afterAppear,
+    appearCancelled,
+    duration
+  } = data
+
+  // activeInstance will always be the <transition> component managing this
+  // transition. One edge case to check is when the <transition> is placed
+  // as the root node of a child component. In that case we need to check
+  // <transition>'s parent for appear check.
+  let context = activeInstance
+  let transitionNode = activeInstance.$vnode
+  while (transitionNode && transitionNode.parent) {
+    transitionNode = transitionNode.parent
+    context = transitionNode.context
+  }
+
+  const isAppear = !context._isMounted || !vnode.isRootInsert
+
+  if (isAppear && !appear && appear !== '') {
+    return
+  }
+
+  const startClass = isAppear && appearClass
+    ? appearClass
+    : enterClass
+  const activeClass = isAppear && appearActiveClass
+    ? appearActiveClass
+    : enterActiveClass
+  const toClass = isAppear && appearToClass
+    ? appearToClass
+    : enterToClass
+
+  const beforeEnterHook = isAppear
+    ? (beforeAppear || beforeEnter)
+    : beforeEnter
+  const enterHook = isAppear
+    ? (typeof appear === 'function' ? appear : enter)
+    : enter
+  const afterEnterHook = isAppear
+    ? (afterAppear || afterEnter)
+    : afterEnter
+  const enterCancelledHook = isAppear
+    ? (appearCancelled || enterCancelled)
+    : enterCancelled
+
+  const explicitEnterDuration: any = toNumber(
+    isObject(duration)
+      ? duration.enter
+      : duration
+  )
+
+  if (process.env.NODE_ENV !== 'production' && explicitEnterDuration != null) {
+    checkDuration(explicitEnterDuration, 'enter', vnode)
+  }
+
+  const expectsCSS = css !== false && !isIE9
+  const userWantsControl = getHookArgumentsLength(enterHook)
+
+  const cb = el._enterCb = once(() => {
+    if (expectsCSS) {
+      removeTransitionClass(el, toClass)
+      removeTransitionClass(el, activeClass)
+    }
+    if (cb.cancelled) {
+      if (expectsCSS) {
+        removeTransitionClass(el, startClass)
+      }
+      enterCancelledHook && enterCancelledHook(el)
+    } else {
+      afterEnterHook && afterEnterHook(el)
+    }
+    el._enterCb = null
+  })
+
+  if (!vnode.data.show) {
+    // remove pending leave element on enter by injecting an insert hook
+    mergeVNodeHook(vnode, 'insert', () => {
+      const parent = el.parentNode
+      const pendingNode = parent && parent._pending && parent._pending[vnode.key]
+      if (pendingNode &&
+        pendingNode.tag === vnode.tag &&
+        pendingNode.elm._leaveCb
+      ) {
+        pendingNode.elm._leaveCb()
+      }
+      enterHook && enterHook(el, cb)
+    })
+  }
+
+  // start enter transition
+  beforeEnterHook && beforeEnterHook(el)
+  if (expectsCSS) {
+    addTransitionClass(el, startClass)
+    addTransitionClass(el, activeClass)
+    nextFrame(() => {
+      removeTransitionClass(el, startClass)
+      if (!cb.cancelled) {
+        addTransitionClass(el, toClass)
+        if (!userWantsControl) {
+          if (isValidDuration(explicitEnterDuration)) {
+            setTimeout(cb, explicitEnterDuration)
+          } else {
+            whenTransitionEnds(el, type, cb)
+          }
+        }
+      }
+    })
+  }
+
+  if (vnode.data.show) {
+    toggleDisplay && toggleDisplay()
+    enterHook && enterHook(el, cb)
+  }
+
+  if (!expectsCSS && !userWantsControl) {
+    cb()
+  }
+}
+
+export function leave (vnode: VNodeWithData, rm: Function) {
+  const el: any = vnode.elm
+
+  // call enter callback now
+  if (isDef(el._enterCb)) {
+    el._enterCb.cancelled = true
+    el._enterCb()
+  }
+
+  const data = resolveTransition(vnode.data.transition)
+  if (isUndef(data) || el.nodeType !== 1) {
+    return rm()
+  }
+
+  /* istanbul ignore if */
+  if (isDef(el._leaveCb)) {
+    return
+  }
+
+  const {
+    css,
+    type,
+    leaveClass,
+    leaveToClass,
+    leaveActiveClass,
+    beforeLeave,
+    leave,
+    afterLeave,
+    leaveCancelled,
+    delayLeave,
+    duration
+  } = data
+
+  const expectsCSS = css !== false && !isIE9
+  const userWantsControl = getHookArgumentsLength(leave)
+
+  const explicitLeaveDuration: any = toNumber(
+    isObject(duration)
+      ? duration.leave
+      : duration
+  )
+
+  if (process.env.NODE_ENV !== 'production' && isDef(explicitLeaveDuration)) {
+    checkDuration(explicitLeaveDuration, 'leave', vnode)
+  }
+
+  const cb = el._leaveCb = once(() => {
+    if (el.parentNode && el.parentNode._pending) {
+      el.parentNode._pending[vnode.key] = null
+    }
+    if (expectsCSS) {
+      removeTransitionClass(el, leaveToClass)
+      removeTransitionClass(el, leaveActiveClass)
+    }
+    if (cb.cancelled) {
+      if (expectsCSS) {
+        removeTransitionClass(el, leaveClass)
+      }
+      leaveCancelled && leaveCancelled(el)
+    } else {
+      rm()
+      afterLeave && afterLeave(el)
+    }
+    el._leaveCb = null
+  })
+
+  if (delayLeave) {
+    delayLeave(performLeave)
+  } else {
+    performLeave()
+  }
+
+  function performLeave () {
+    // the delayed leave may have already been cancelled
+    if (cb.cancelled) {
+      return
+    }
+    // record leaving element
+    if (!vnode.data.show) {
+      (el.parentNode._pending || (el.parentNode._pending = {}))[(vnode.key: any)] = vnode
+    }
+    beforeLeave && beforeLeave(el)
+    if (expectsCSS) {
+      addTransitionClass(el, leaveClass)
+      addTransitionClass(el, leaveActiveClass)
+      nextFrame(() => {
+        removeTransitionClass(el, leaveClass)
+        if (!cb.cancelled) {
+          addTransitionClass(el, leaveToClass)
+          if (!userWantsControl) {
+            if (isValidDuration(explicitLeaveDuration)) {
+              setTimeout(cb, explicitLeaveDuration)
+            } else {
+              whenTransitionEnds(el, type, cb)
+            }
+          }
+        }
+      })
+    }
+    leave && leave(el, cb)
+    if (!expectsCSS && !userWantsControl) {
+      cb()
+    }
+  }
+}
+
+// only used in dev mode
+function checkDuration (val, name, vnode) {
+  if (typeof val !== 'number') {
+    warn(
+      `<transition> explicit ${name} duration is not a valid number - ` +
+      `got ${JSON.stringify(val)}.`,
+      vnode.context
+    )
+  } else if (isNaN(val)) {
+    warn(
+      `<transition> explicit ${name} duration is NaN - ` +
+      'the duration expression might be incorrect.',
+      vnode.context
+    )
+  }
+}
+
+function isValidDuration (val) {
+  return typeof val === 'number' && !isNaN(val)
+}
+
+/**
+ * Normalize a transition hook's argument length. The hook may be:
+ * - a merged hook (invoker) with the original in .fns
+ * - a wrapped component method (check ._length)
+ * - a plain function (.length)
+ */
+function getHookArgumentsLength (fn: Function): boolean {
+  if (isUndef(fn)) {
+    return false
+  }
+  const invokerFns = fn.fns
+  if (isDef(invokerFns)) {
+    // invoker
+    return getHookArgumentsLength(
+      Array.isArray(invokerFns)
+        ? invokerFns[0]
+        : invokerFns
+    )
+  } else {
+    return (fn._length || fn.length) > 1
+  }
+}
+
+function _enter (_: any, vnode: VNodeWithData) {
+  if (vnode.data.show !== true) {
+    enter(vnode)
+  }
+}
+
+export default inBrowser ? {
+  create: _enter,
+  activate: _enter,
+  remove (vnode: VNode, rm: Function) {
+    /* istanbul ignore else */
+    if (vnode.data.show !== true) {
+      leave(vnode, rm)
+    } else {
+      rm()
+    }
+  }
+} : {}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/web/runtime/node-ops.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/web/runtime/node-ops.js
new file mode 100644 (file)
index 0000000..3a2978a
--- /dev/null
@@ -0,0 +1,59 @@
+/* @flow */
+
+import { namespaceMap } from 'web/util/index'
+
+export function createElement (tagName: string, vnode: VNode): Element {
+  const elm = document.createElement(tagName)
+  if (tagName !== 'select') {
+    return elm
+  }
+  // false or null will remove the attribute but undefined will not
+  if (vnode.data && vnode.data.attrs && vnode.data.attrs.multiple !== undefined) {
+    elm.setAttribute('multiple', 'multiple')
+  }
+  return elm
+}
+
+export function createElementNS (namespace: string, tagName: string): Element {
+  return document.createElementNS(namespaceMap[namespace], tagName)
+}
+
+export function createTextNode (text: string): Text {
+  return document.createTextNode(text)
+}
+
+export function createComment (text: string): Comment {
+  return document.createComment(text)
+}
+
+export function insertBefore (parentNode: Node, newNode: Node, referenceNode: Node) {
+  parentNode.insertBefore(newNode, referenceNode)
+}
+
+export function removeChild (node: Node, child: Node) {
+  node.removeChild(child)
+}
+
+export function appendChild (node: Node, child: Node) {
+  node.appendChild(child)
+}
+
+export function parentNode (node: Node): ?Node {
+  return node.parentNode
+}
+
+export function nextSibling (node: Node): ?Node {
+  return node.nextSibling
+}
+
+export function tagName (node: Element): string {
+  return node.tagName
+}
+
+export function setTextContent (node: Node, text: string) {
+  node.textContent = text
+}
+
+export function setStyleScope (node: Element, scopeId: string) {
+  node.setAttribute(scopeId, '')
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/web/runtime/patch.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/web/runtime/patch.js
new file mode 100644 (file)
index 0000000..d982afe
--- /dev/null
@@ -0,0 +1,12 @@
+/* @flow */
+
+import * as nodeOps from 'web/runtime/node-ops'
+import { createPatchFunction } from 'core/vdom/patch'
+import baseModules from 'core/vdom/modules/index'
+import platformModules from 'web/runtime/modules/index'
+
+// the directive module should be applied last, after all
+// built-in modules have been applied.
+const modules = platformModules.concat(baseModules)
+
+export const patch: Function = createPatchFunction({ nodeOps, modules })
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/web/runtime/transition-util.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/web/runtime/transition-util.js
new file mode 100644 (file)
index 0000000..47668f0
--- /dev/null
@@ -0,0 +1,185 @@
+/* @flow */
+
+import { inBrowser, isIE9 } from 'core/util/index'
+import { addClass, removeClass } from './class-util'
+import { remove, extend, cached } from 'shared/util'
+
+export function resolveTransition (def?: string | Object): ?Object {
+  if (!def) {
+    return
+  }
+  /* istanbul ignore else */
+  if (typeof def === 'object') {
+    const res = {}
+    if (def.css !== false) {
+      extend(res, autoCssTransition(def.name || 'v'))
+    }
+    extend(res, def)
+    return res
+  } else if (typeof def === 'string') {
+    return autoCssTransition(def)
+  }
+}
+
+const autoCssTransition: (name: string) => Object = cached(name => {
+  return {
+    enterClass: `${name}-enter`,
+    enterToClass: `${name}-enter-to`,
+    enterActiveClass: `${name}-enter-active`,
+    leaveClass: `${name}-leave`,
+    leaveToClass: `${name}-leave-to`,
+    leaveActiveClass: `${name}-leave-active`
+  }
+})
+
+export const hasTransition = inBrowser && !isIE9
+const TRANSITION = 'transition'
+const ANIMATION = 'animation'
+
+// Transition property/event sniffing
+export let transitionProp = 'transition'
+export let transitionEndEvent = 'transitionend'
+export let animationProp = 'animation'
+export let animationEndEvent = 'animationend'
+if (hasTransition) {
+  /* istanbul ignore if */
+  if (window.ontransitionend === undefined &&
+    window.onwebkittransitionend !== undefined
+  ) {
+    transitionProp = 'WebkitTransition'
+    transitionEndEvent = 'webkitTransitionEnd'
+  }
+  if (window.onanimationend === undefined &&
+    window.onwebkitanimationend !== undefined
+  ) {
+    animationProp = 'WebkitAnimation'
+    animationEndEvent = 'webkitAnimationEnd'
+  }
+}
+
+// binding to window is necessary to make hot reload work in IE in strict mode
+const raf = inBrowser
+  ? window.requestAnimationFrame
+    ? window.requestAnimationFrame.bind(window)
+    : setTimeout
+  : /* istanbul ignore next */ fn => fn()
+
+export function nextFrame (fn: Function) {
+  raf(() => {
+    raf(fn)
+  })
+}
+
+export function addTransitionClass (el: any, cls: string) {
+  const transitionClasses = el._transitionClasses || (el._transitionClasses = [])
+  if (transitionClasses.indexOf(cls) < 0) {
+    transitionClasses.push(cls)
+    addClass(el, cls)
+  }
+}
+
+export function removeTransitionClass (el: any, cls: string) {
+  if (el._transitionClasses) {
+    remove(el._transitionClasses, cls)
+  }
+  removeClass(el, cls)
+}
+
+export function whenTransitionEnds (
+  el: Element,
+  expectedType: ?string,
+  cb: Function
+) {
+  const { type, timeout, propCount } = getTransitionInfo(el, expectedType)
+  if (!type) return cb()
+  const event: string = type === TRANSITION ? transitionEndEvent : animationEndEvent
+  let ended = 0
+  const end = () => {
+    el.removeEventListener(event, onEnd)
+    cb()
+  }
+  const onEnd = e => {
+    if (e.target === el) {
+      if (++ended >= propCount) {
+        end()
+      }
+    }
+  }
+  setTimeout(() => {
+    if (ended < propCount) {
+      end()
+    }
+  }, timeout + 1)
+  el.addEventListener(event, onEnd)
+}
+
+const transformRE = /\b(transform|all)(,|$)/
+
+export function getTransitionInfo (el: Element, expectedType?: ?string): {
+  type: ?string;
+  propCount: number;
+  timeout: number;
+  hasTransform: boolean;
+} {
+  const styles: any = window.getComputedStyle(el)
+  const transitionDelays: Array<string> = styles[transitionProp + 'Delay'].split(', ')
+  const transitionDurations: Array<string> = styles[transitionProp + 'Duration'].split(', ')
+  const transitionTimeout: number = getTimeout(transitionDelays, transitionDurations)
+  const animationDelays: Array<string> = styles[animationProp + 'Delay'].split(', ')
+  const animationDurations: Array<string> = styles[animationProp + 'Duration'].split(', ')
+  const animationTimeout: number = getTimeout(animationDelays, animationDurations)
+
+  let type: ?string
+  let timeout = 0
+  let propCount = 0
+  /* istanbul ignore if */
+  if (expectedType === TRANSITION) {
+    if (transitionTimeout > 0) {
+      type = TRANSITION
+      timeout = transitionTimeout
+      propCount = transitionDurations.length
+    }
+  } else if (expectedType === ANIMATION) {
+    if (animationTimeout > 0) {
+      type = ANIMATION
+      timeout = animationTimeout
+      propCount = animationDurations.length
+    }
+  } else {
+    timeout = Math.max(transitionTimeout, animationTimeout)
+    type = timeout > 0
+      ? transitionTimeout > animationTimeout
+        ? TRANSITION
+        : ANIMATION
+      : null
+    propCount = type
+      ? type === TRANSITION
+        ? transitionDurations.length
+        : animationDurations.length
+      : 0
+  }
+  const hasTransform: boolean =
+    type === TRANSITION &&
+    transformRE.test(styles[transitionProp + 'Property'])
+  return {
+    type,
+    timeout,
+    propCount,
+    hasTransform
+  }
+}
+
+function getTimeout (delays: Array<string>, durations: Array<string>): number {
+  /* istanbul ignore next */
+  while (delays.length < durations.length) {
+    delays = delays.concat(delays)
+  }
+
+  return Math.max.apply(null, durations.map((d, i) => {
+    return toMs(d) + toMs(delays[i])
+  }))
+}
+
+function toMs (s: string): number {
+  return Number(s.slice(0, -1)) * 1000
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/web/server/compiler.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/web/server/compiler.js
new file mode 100644 (file)
index 0000000..20e5736
--- /dev/null
@@ -0,0 +1,11 @@
+/* @flow */
+
+import { baseOptions } from '../compiler/options'
+import { createCompiler } from 'server/optimizing-compiler/index'
+
+const { compile, compileToFunctions } = createCompiler(baseOptions)
+
+export {
+  compile as ssrCompile,
+  compileToFunctions as ssrCompileToFunctions
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/web/server/directives/index.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/web/server/directives/index.js
new file mode 100644 (file)
index 0000000..fd7fce0
--- /dev/null
@@ -0,0 +1,7 @@
+import show from './show'
+import model from './model'
+
+export default {
+  show,
+  model
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/web/server/directives/model.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/web/server/directives/model.js
new file mode 100644 (file)
index 0000000..7962d6c
--- /dev/null
@@ -0,0 +1,44 @@
+/* @flow */
+
+import { looseEqual, looseIndexOf } from 'shared/util'
+
+// this is only applied for <select v-model> because it is the only edge case
+// that must be done at runtime instead of compile time.
+export default function model (node: VNodeWithData, dir: VNodeDirective) {
+  if (!node.children) return
+  const value = dir.value
+  const isMultiple = node.data.attrs && node.data.attrs.multiple
+  for (let i = 0, l = node.children.length; i < l; i++) {
+    const option = node.children[i]
+    if (option.tag === 'option') {
+      if (isMultiple) {
+        const selected =
+          Array.isArray(value) &&
+          (looseIndexOf(value, getValue(option)) > -1)
+        if (selected) {
+          setSelected(option)
+        }
+      } else {
+        if (looseEqual(value, getValue(option))) {
+          setSelected(option)
+          return
+        }
+      }
+    }
+  }
+}
+
+function getValue (option) {
+  const data = option.data || {}
+  return (
+    (data.attrs && data.attrs.value) ||
+    (data.domProps && data.domProps.value) ||
+    (option.children && option.children[0] && option.children[0].text)
+  )
+}
+
+function setSelected (option) {
+  const data = option.data || (option.data = {})
+  const attrs = data.attrs || (data.attrs = {})
+  attrs.selected = ''
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/web/server/directives/show.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/web/server/directives/show.js
new file mode 100644 (file)
index 0000000..7493b27
--- /dev/null
@@ -0,0 +1,12 @@
+/* @flow */
+
+export default function show (node: VNodeWithData, dir: VNodeDirective) {
+  if (!dir.value) {
+    const style: any = node.data.style || (node.data.style = {})
+    if (Array.isArray(style)) {
+      style.push({ display: 'none' })
+    } else {
+      style.display = 'none'
+    }
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/web/server/modules/attrs.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/web/server/modules/attrs.js
new file mode 100644 (file)
index 0000000..9e7cc06
--- /dev/null
@@ -0,0 +1,57 @@
+/* @flow */
+
+import { escape } from '../util'
+
+import {
+  isDef,
+  isUndef,
+  extend
+} from 'shared/util'
+
+import {
+  isBooleanAttr,
+  isEnumeratedAttr,
+  isFalsyAttrValue
+} from 'web/util/attrs'
+
+export default function renderAttrs (node: VNodeWithData): string {
+  let attrs = node.data.attrs
+  let res = ''
+
+  const opts = node.parent && node.parent.componentOptions
+  if (isUndef(opts) || opts.Ctor.options.inheritAttrs !== false) {
+    let parent = node.parent
+    while (isDef(parent)) {
+      if (isDef(parent.data) && isDef(parent.data.attrs)) {
+        attrs = extend(extend({}, attrs), parent.data.attrs)
+      }
+      parent = parent.parent
+    }
+  }
+
+  if (isUndef(attrs)) {
+    return res
+  }
+
+  for (const key in attrs) {
+    if (key === 'style') {
+      // leave it to the style module
+      continue
+    }
+    res += renderAttr(key, attrs[key])
+  }
+  return res
+}
+
+export function renderAttr (key: string, value: string): string {
+  if (isBooleanAttr(key)) {
+    if (!isFalsyAttrValue(value)) {
+      return ` ${key}="${key}"`
+    }
+  } else if (isEnumeratedAttr(key)) {
+    return ` ${key}="${isFalsyAttrValue(value) || value === 'false' ? 'false' : 'true'}"`
+  } else if (!isFalsyAttrValue(value)) {
+    return ` ${key}="${escape(String(value))}"`
+  }
+  return ''
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/web/server/modules/class.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/web/server/modules/class.js
new file mode 100644 (file)
index 0000000..c19040e
--- /dev/null
@@ -0,0 +1,11 @@
+/* @flow */
+
+import { escape } from '../util'
+import { genClassForVnode } from 'web/util/index'
+
+export default function renderClass (node: VNodeWithData): ?string {
+  const classList = genClassForVnode(node)
+  if (classList !== '') {
+    return ` class="${escape(classList)}"`
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/web/server/modules/dom-props.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/web/server/modules/dom-props.js
new file mode 100644 (file)
index 0000000..57c18ee
--- /dev/null
@@ -0,0 +1,50 @@
+/* @flow */
+
+import VNode from 'core/vdom/vnode'
+import { renderAttr } from './attrs'
+import { isDef, isUndef, extend } from 'shared/util'
+import { propsToAttrMap, isRenderableAttr } from '../util'
+
+export default function renderDOMProps (node: VNodeWithData): string {
+  let props = node.data.domProps
+  let res = ''
+
+  let parent = node.parent
+  while (isDef(parent)) {
+    if (parent.data && parent.data.domProps) {
+      props = extend(extend({}, props), parent.data.domProps)
+    }
+    parent = parent.parent
+  }
+
+  if (isUndef(props)) {
+    return res
+  }
+
+  const attrs = node.data.attrs
+  for (const key in props) {
+    if (key === 'innerHTML') {
+      setText(node, props[key], true)
+    } else if (key === 'textContent') {
+      setText(node, props[key], false)
+    } else if (key === 'value' && node.tag === 'textarea') {
+      setText(node, props[key], false)
+    } else {
+      // $flow-disable-line (WTF?)
+      const attr = propsToAttrMap[key] || key.toLowerCase()
+      if (isRenderableAttr(attr) &&
+        // avoid rendering double-bound props/attrs twice
+        !(isDef(attrs) && isDef(attrs[attr]))
+      ) {
+        res += renderAttr(attr, props[key])
+      }
+    }
+  }
+  return res
+}
+
+function setText (node, text, raw) {
+  const child = new VNode(undefined, undefined, undefined, text)
+  child.raw = raw
+  node.children = [child]
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/web/server/modules/index.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/web/server/modules/index.js
new file mode 100644 (file)
index 0000000..3d15bc5
--- /dev/null
@@ -0,0 +1,11 @@
+import attrs from './attrs'
+import domProps from './dom-props'
+import klass from './class'
+import style from './style'
+
+export default [
+  attrs,
+  domProps,
+  klass,
+  style
+]
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/web/server/modules/style.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/web/server/modules/style.js
new file mode 100644 (file)
index 0000000..fc043ef
--- /dev/null
@@ -0,0 +1,28 @@
+/* @flow */
+
+import { escape } from '../util'
+import { hyphenate } from 'shared/util'
+import { getStyle } from 'web/util/style'
+
+export function genStyle (style: Object): string {
+  let styleText = ''
+  for (const key in style) {
+    const value = style[key]
+    const hyphenatedKey = hyphenate(key)
+    if (Array.isArray(value)) {
+      for (let i = 0, len = value.length; i < len; i++) {
+        styleText += `${hyphenatedKey}:${value[i]};`
+      }
+    } else {
+      styleText += `${hyphenatedKey}:${value};`
+    }
+  }
+  return styleText
+}
+
+export default function renderStyle (vnode: VNodeWithData): ?string {
+  const styleText = genStyle(getStyle(vnode, false))
+  if (styleText !== '') {
+    return ` style=${JSON.stringify(escape(styleText))}`
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/web/server/util.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/web/server/util.js
new file mode 100644 (file)
index 0000000..774686d
--- /dev/null
@@ -0,0 +1,51 @@
+/* @flow */
+
+import { makeMap } from 'shared/util'
+
+const isAttr = makeMap(
+  'accept,accept-charset,accesskey,action,align,alt,async,autocomplete,' +
+  'autofocus,autoplay,autosave,bgcolor,border,buffered,challenge,charset,' +
+  'checked,cite,class,code,codebase,color,cols,colspan,content,http-equiv,' +
+  'name,contenteditable,contextmenu,controls,coords,data,datetime,default,' +
+  'defer,dir,dirname,disabled,download,draggable,dropzone,enctype,method,for,' +
+  'form,formaction,headers,height,hidden,high,href,hreflang,http-equiv,' +
+  'icon,id,ismap,itemprop,keytype,kind,label,lang,language,list,loop,low,' +
+  'manifest,max,maxlength,media,method,GET,POST,min,multiple,email,file,' +
+  'muted,name,novalidate,open,optimum,pattern,ping,placeholder,poster,' +
+  'preload,radiogroup,readonly,rel,required,reversed,rows,rowspan,sandbox,' +
+  'scope,scoped,seamless,selected,shape,size,type,text,password,sizes,span,' +
+  'spellcheck,src,srcdoc,srclang,srcset,start,step,style,summary,tabindex,' +
+  'target,title,type,usemap,value,width,wrap'
+)
+
+/* istanbul ignore next */
+const isRenderableAttr = (name: string): boolean => {
+  return (
+    isAttr(name) ||
+    name.indexOf('data-') === 0 ||
+    name.indexOf('aria-') === 0
+  )
+}
+export { isRenderableAttr }
+
+export const propsToAttrMap = {
+  acceptCharset: 'accept-charset',
+  className: 'class',
+  htmlFor: 'for',
+  httpEquiv: 'http-equiv'
+}
+
+const ESC = {
+  '<': '&lt;',
+  '>': '&gt;',
+  '"': '&quot;',
+  '&': '&amp;'
+}
+
+export function escape (s: string) {
+  return s.replace(/[<>"&]/g, escapeChar)
+}
+
+function escapeChar (a) {
+  return ESC[a] || a
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/web/util/attrs.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/web/util/attrs.js
new file mode 100644 (file)
index 0000000..59517da
--- /dev/null
@@ -0,0 +1,43 @@
+/* @flow */
+
+import { makeMap } from 'shared/util'
+
+// these are reserved for web because they are directly compiled away
+// during template compilation
+export const isReservedAttr = makeMap('style,class')
+
+// attributes that should be using props for binding
+const acceptValue = makeMap('input,textarea,option,select,progress')
+export const mustUseProp = (tag: string, type: ?string, attr: string): boolean => {
+  return (
+    (attr === 'value' && acceptValue(tag)) && type !== 'button' ||
+    (attr === 'selected' && tag === 'option') ||
+    (attr === 'checked' && tag === 'input') ||
+    (attr === 'muted' && tag === 'video')
+  )
+}
+
+export const isEnumeratedAttr = makeMap('contenteditable,draggable,spellcheck')
+
+export const isBooleanAttr = makeMap(
+  'allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,' +
+  'default,defaultchecked,defaultmuted,defaultselected,defer,disabled,' +
+  'enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,' +
+  'muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,' +
+  'required,reversed,scoped,seamless,selected,sortable,translate,' +
+  'truespeed,typemustmatch,visible'
+)
+
+export const xlinkNS = 'http://www.w3.org/1999/xlink'
+
+export const isXlink = (name: string): boolean => {
+  return name.charAt(5) === ':' && name.slice(0, 5) === 'xlink'
+}
+
+export const getXlinkProp = (name: string): string => {
+  return isXlink(name) ? name.slice(6, name.length) : ''
+}
+
+export const isFalsyAttrValue = (val: any): boolean => {
+  return val == null || val === false
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/web/util/class.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/web/util/class.js
new file mode 100644 (file)
index 0000000..542dcbc
--- /dev/null
@@ -0,0 +1,85 @@
+/* @flow */
+
+import { isDef, isObject } from 'shared/util'
+
+export function genClassForVnode (vnode: VNodeWithData): string {
+  let data = vnode.data
+  let parentNode = vnode
+  let childNode = vnode
+  while (isDef(childNode.componentInstance)) {
+    childNode = childNode.componentInstance._vnode
+    if (childNode && childNode.data) {
+      data = mergeClassData(childNode.data, data)
+    }
+  }
+  while (isDef(parentNode = parentNode.parent)) {
+    if (parentNode && parentNode.data) {
+      data = mergeClassData(data, parentNode.data)
+    }
+  }
+  return renderClass(data.staticClass, data.class)
+}
+
+function mergeClassData (child: VNodeData, parent: VNodeData): {
+  staticClass: string,
+  class: any
+} {
+  return {
+    staticClass: concat(child.staticClass, parent.staticClass),
+    class: isDef(child.class)
+      ? [child.class, parent.class]
+      : parent.class
+  }
+}
+
+export function renderClass (
+  staticClass: ?string,
+  dynamicClass: any
+): string {
+  if (isDef(staticClass) || isDef(dynamicClass)) {
+    return concat(staticClass, stringifyClass(dynamicClass))
+  }
+  /* istanbul ignore next */
+  return ''
+}
+
+export function concat (a: ?string, b: ?string): string {
+  return a ? b ? (a + ' ' + b) : a : (b || '')
+}
+
+export function stringifyClass (value: any): string {
+  if (Array.isArray(value)) {
+    return stringifyArray(value)
+  }
+  if (isObject(value)) {
+    return stringifyObject(value)
+  }
+  if (typeof value === 'string') {
+    return value
+  }
+  /* istanbul ignore next */
+  return ''
+}
+
+function stringifyArray (value: Array<any>): string {
+  let res = ''
+  let stringified
+  for (let i = 0, l = value.length; i < l; i++) {
+    if (isDef(stringified = stringifyClass(value[i])) && stringified !== '') {
+      if (res) res += ' '
+      res += stringified
+    }
+  }
+  return res
+}
+
+function stringifyObject (value: Object): string {
+  let res = ''
+  for (const key in value) {
+    if (value[key]) {
+      if (res) res += ' '
+      res += key
+    }
+  }
+  return res
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/web/util/compat.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/web/util/compat.js
new file mode 100644 (file)
index 0000000..d95759c
--- /dev/null
@@ -0,0 +1,16 @@
+/* @flow */
+
+import { inBrowser } from 'core/util/index'
+
+// check whether current browser encodes a char inside attribute values
+let div
+function getShouldDecode (href: boolean): boolean {
+  div = div || document.createElement('div')
+  div.innerHTML = href ? `<a href="\n"/>` : `<div a="\n"/>`
+  return div.innerHTML.indexOf('&#10;') > 0
+}
+
+// #3663: IE encodes newlines inside attribute values while other browsers don't
+export const shouldDecodeNewlines = inBrowser ? getShouldDecode(false) : false
+// #6828: chrome encodes content in a[href]
+export const shouldDecodeNewlinesForHref = inBrowser ? getShouldDecode(true) : false
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/web/util/element.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/web/util/element.js
new file mode 100644 (file)
index 0000000..65f1aaf
--- /dev/null
@@ -0,0 +1,77 @@
+/* @flow */
+
+import { inBrowser } from 'core/util/env'
+import { makeMap } from 'shared/util'
+
+export const namespaceMap = {
+  svg: 'http://www.w3.org/2000/svg',
+  math: 'http://www.w3.org/1998/Math/MathML'
+}
+
+export const isHTMLTag = makeMap(
+  'html,body,base,head,link,meta,style,title,' +
+  'address,article,aside,footer,header,h1,h2,h3,h4,h5,h6,hgroup,nav,section,' +
+  'div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,' +
+  'a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,rtc,ruby,' +
+  's,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,' +
+  'embed,object,param,source,canvas,script,noscript,del,ins,' +
+  'caption,col,colgroup,table,thead,tbody,td,th,tr,' +
+  'button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,' +
+  'output,progress,select,textarea,' +
+  'details,dialog,menu,menuitem,summary,' +
+  'content,element,shadow,template,blockquote,iframe,tfoot'
+)
+
+// this map is intentionally selective, only covering SVG elements that may
+// contain child elements.
+export const isSVG = makeMap(
+  'svg,animate,circle,clippath,cursor,defs,desc,ellipse,filter,font-face,' +
+  'foreignObject,g,glyph,image,line,marker,mask,missing-glyph,path,pattern,' +
+  'polygon,polyline,rect,switch,symbol,text,textpath,tspan,use,view',
+  true
+)
+
+export const isPreTag = (tag: ?string): boolean => tag === 'pre'
+
+export const isReservedTag = (tag: string): ?boolean => {
+  return isHTMLTag(tag) || isSVG(tag)
+}
+
+export function getTagNamespace (tag: string): ?string {
+  if (isSVG(tag)) {
+    return 'svg'
+  }
+  // basic support for MathML
+  // note it doesn't support other MathML elements being component roots
+  if (tag === 'math') {
+    return 'math'
+  }
+}
+
+const unknownElementCache = Object.create(null)
+export function isUnknownElement (tag: string): boolean {
+  /* istanbul ignore if */
+  if (!inBrowser) {
+    return true
+  }
+  if (isReservedTag(tag)) {
+    return false
+  }
+  tag = tag.toLowerCase()
+  /* istanbul ignore if */
+  if (unknownElementCache[tag] != null) {
+    return unknownElementCache[tag]
+  }
+  const el = document.createElement(tag)
+  if (tag.indexOf('-') > -1) {
+    // http://stackoverflow.com/a/28210364/1070244
+    return (unknownElementCache[tag] = (
+      el.constructor === window.HTMLUnknownElement ||
+      el.constructor === window.HTMLElement
+    ))
+  } else {
+    return (unknownElementCache[tag] = /HTMLUnknownElement/.test(el.toString()))
+  }
+}
+
+export const isTextInputType = makeMap('text,number,password,search,email,tel,url')
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/web/util/index.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/web/util/index.js
new file mode 100644 (file)
index 0000000..da5e46e
--- /dev/null
@@ -0,0 +1,25 @@
+/* @flow */
+
+import { warn } from 'core/util/index'
+
+export * from './attrs'
+export * from './class'
+export * from './element'
+
+/**
+ * Query an element selector if it's not an element already.
+ */
+export function query (el: string | Element): Element {
+  if (typeof el === 'string') {
+    const selected = document.querySelector(el)
+    if (!selected) {
+      process.env.NODE_ENV !== 'production' && warn(
+        'Cannot find element: ' + el
+      )
+      return document.createElement('div')
+    }
+    return selected
+  } else {
+    return el
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/web/util/style.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/web/util/style.js
new file mode 100644 (file)
index 0000000..fc11904
--- /dev/null
@@ -0,0 +1,72 @@
+/* @flow */
+
+import { cached, extend, toObject } from 'shared/util'
+
+export const parseStyleText = cached(function (cssText) {
+  const res = {}
+  const listDelimiter = /;(?![^(]*\))/g
+  const propertyDelimiter = /:(.+)/
+  cssText.split(listDelimiter).forEach(function (item) {
+    if (item) {
+      var tmp = item.split(propertyDelimiter)
+      tmp.length > 1 && (res[tmp[0].trim()] = tmp[1].trim())
+    }
+  })
+  return res
+})
+
+// merge static and dynamic style data on the same vnode
+function normalizeStyleData (data: VNodeData): ?Object {
+  const style = normalizeStyleBinding(data.style)
+  // static style is pre-processed into an object during compilation
+  // and is always a fresh object, so it's safe to merge into it
+  return data.staticStyle
+    ? extend(data.staticStyle, style)
+    : style
+}
+
+// normalize possible array / string values into Object
+export function normalizeStyleBinding (bindingStyle: any): ?Object {
+  if (Array.isArray(bindingStyle)) {
+    return toObject(bindingStyle)
+  }
+  if (typeof bindingStyle === 'string') {
+    return parseStyleText(bindingStyle)
+  }
+  return bindingStyle
+}
+
+/**
+ * parent component style should be after child's
+ * so that parent component's style could override it
+ */
+export function getStyle (vnode: VNodeWithData, checkChild: boolean): Object {
+  const res = {}
+  let styleData
+
+  if (checkChild) {
+    let childNode = vnode
+    while (childNode.componentInstance) {
+      childNode = childNode.componentInstance._vnode
+      if (
+        childNode && childNode.data &&
+        (styleData = normalizeStyleData(childNode.data))
+      ) {
+        extend(res, styleData)
+      }
+    }
+  }
+
+  if ((styleData = normalizeStyleData(vnode.data))) {
+    extend(res, styleData)
+  }
+
+  let parentNode = vnode
+  while ((parentNode = parentNode.parent)) {
+    if (parentNode.data && (styleData = normalizeStyleData(parentNode.data))) {
+      extend(res, styleData)
+    }
+  }
+  return res
+}
+
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/compiler/directives/index.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/compiler/directives/index.js
new file mode 100644 (file)
index 0000000..12ced22
--- /dev/null
@@ -0,0 +1,5 @@
+import model from './model'
+
+export default {
+  model
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/compiler/directives/model.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/compiler/directives/model.js
new file mode 100644 (file)
index 0000000..6c9b768
--- /dev/null
@@ -0,0 +1,34 @@
+/* @flow */
+
+import { addHandler, addAttr } from 'compiler/helpers'
+import { genComponentModel, genAssignmentCode } from 'compiler/directives/model'
+
+export default function model (
+  el: ASTElement,
+  dir: ASTDirective,
+  _warn: Function
+): ?boolean {
+  if (el.tag === 'input' || el.tag === 'textarea') {
+    genDefaultModel(el, dir.value, dir.modifiers)
+  } else {
+    genComponentModel(el, dir.value, dir.modifiers)
+  }
+}
+
+function genDefaultModel (
+  el: ASTElement,
+  value: string,
+  modifiers: ?ASTModifiers
+): ?boolean {
+  const { lazy, trim, number } = modifiers || {}
+  const event = lazy ? 'change' : 'input'
+
+  let valueExpression = `$event.target.attr.value${trim ? '.trim()' : ''}`
+  if (number) {
+    valueExpression = `_n(${valueExpression})`
+  }
+
+  const code = genAssignmentCode(value, valueExpression)
+  addAttr(el, 'value', `(${value})`)
+  addHandler(el, event, code, null, true)
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/compiler/index.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/compiler/index.js
new file mode 100644 (file)
index 0000000..94f350b
--- /dev/null
@@ -0,0 +1,52 @@
+/* @flow */
+
+import { genStaticKeys } from 'shared/util'
+import { createCompiler } from 'compiler/index'
+
+import modules from './modules/index'
+import directives from './directives/index'
+
+import {
+  isUnaryTag,
+  mustUseProp,
+  isReservedTag,
+  canBeLeftOpenTag,
+  getTagNamespace
+} from '../util/element'
+
+export const baseOptions: WeexCompilerOptions = {
+  modules,
+  directives,
+  isUnaryTag,
+  mustUseProp,
+  canBeLeftOpenTag,
+  isReservedTag,
+  getTagNamespace,
+  preserveWhitespace: false,
+  recyclable: false,
+  staticKeys: genStaticKeys(modules)
+}
+
+const compiler = createCompiler(baseOptions)
+
+export function compile (
+  template: string,
+  options?: WeexCompilerOptions
+): WeexCompiledResult {
+  let generateAltRender = false
+  if (options && options.recyclable === true) {
+    generateAltRender = true
+    options.recyclable = false
+  }
+  const result = compiler.compile(template, options)
+
+  // generate @render function for <recycle-list>
+  if (options && generateAltRender) {
+    options.recyclable = true
+    // disable static optimizations
+    options.optimize = false
+    const { render } = compiler.compile(template, options)
+    result['@render'] = render
+  }
+  return result
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/compiler/modules/append.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/compiler/modules/append.js
new file mode 100644 (file)
index 0000000..6e7be26
--- /dev/null
@@ -0,0 +1,27 @@
+/* @flow */
+
+import { makeMap } from 'shared/util'
+
+// The "unitary tag" means that the tag node and its children
+// must be sent to the native together.
+const isUnitaryTag = makeMap('cell,header,cell-slot,recycle-list', true)
+
+function preTransformNode (el: ASTElement, options: CompilerOptions) {
+  if (isUnitaryTag(el.tag) && !el.attrsList.some(item => item.name === 'append')) {
+    el.attrsMap.append = 'tree'
+    el.attrsList.push({ name: 'append', value: 'tree' })
+  }
+  if (el.attrsMap.append === 'tree') {
+    el.appendAsTree = true
+  }
+}
+
+function genData (el: ASTElement): string {
+  return el.appendAsTree ? `appendAsTree:true,` : ''
+}
+
+export default {
+  staticKeys: ['appendAsTree'],
+  preTransformNode,
+  genData
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/compiler/modules/class.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/compiler/modules/class.js
new file mode 100644 (file)
index 0000000..371a08e
--- /dev/null
@@ -0,0 +1,73 @@
+/* @flow */
+
+import { parseText } from 'compiler/parser/text-parser'
+import {
+  getAndRemoveAttr,
+  getBindingAttr,
+  baseWarn
+} from 'compiler/helpers'
+
+type StaticClassResult = {
+  dynamic: boolean,
+  classResult: string
+};
+
+function transformNode (el: ASTElement, options: CompilerOptions) {
+  const warn = options.warn || baseWarn
+  const staticClass = getAndRemoveAttr(el, 'class')
+  const { dynamic, classResult } = parseStaticClass(staticClass, options)
+  if (process.env.NODE_ENV !== 'production' && dynamic && staticClass) {
+    warn(
+      `class="${staticClass}": ` +
+      'Interpolation inside attributes has been deprecated. ' +
+      'Use v-bind or the colon shorthand instead.'
+    )
+  }
+  if (!dynamic && classResult) {
+    el.staticClass = classResult
+  }
+  const classBinding = getBindingAttr(el, 'class', false /* getStatic */)
+  if (classBinding) {
+    el.classBinding = classBinding
+  } else if (dynamic) {
+    el.classBinding = classResult
+  }
+}
+
+function genData (el: ASTElement): string {
+  let data = ''
+  if (el.staticClass) {
+    data += `staticClass:${el.staticClass},`
+  }
+  if (el.classBinding) {
+    data += `class:${el.classBinding},`
+  }
+  return data
+}
+
+function parseStaticClass (staticClass: ?string, options: CompilerOptions): StaticClassResult {
+  // "a b c" -> ["a", "b", "c"] => staticClass: ["a", "b", "c"]
+  // "a {{x}} c" -> ["a", x, "c"] => classBinding: '["a", x, "c"]'
+  let dynamic = false
+  let classResult = ''
+  if (staticClass) {
+    const classList = staticClass.trim().split(' ').map(name => {
+      const result = parseText(name, options.delimiters)
+      if (result) {
+        dynamic = true
+        return result.expression
+      }
+      return JSON.stringify(name)
+    })
+    if (classList.length) {
+      classResult = '[' + classList.join(',') + ']'
+    }
+  }
+  return { dynamic, classResult }
+}
+
+export default {
+  staticKeys: ['staticClass'],
+  transformNode,
+  genData
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/compiler/modules/index.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/compiler/modules/index.js
new file mode 100644 (file)
index 0000000..ac17809
--- /dev/null
@@ -0,0 +1,13 @@
+import klass from './class'
+import style from './style'
+import props from './props'
+import append from './append'
+import recycleList from './recycle-list/index'
+
+export default [
+  recycleList,
+  klass,
+  style,
+  props,
+  append
+]
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/compiler/modules/props.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/compiler/modules/props.js
new file mode 100644 (file)
index 0000000..8b0bb5f
--- /dev/null
@@ -0,0 +1,32 @@
+/* @flow */
+
+import { cached, camelize } from 'shared/util'
+
+const normalize = cached(camelize)
+
+function normalizeKeyName (str: string): string {
+  if (str.match(/^v\-/)) {
+    return str.replace(/(v-[a-z\-]+\:)([a-z\-]+)$/i, ($, directive, prop) => {
+      return directive + normalize(prop)
+    })
+  }
+  return normalize(str)
+}
+
+function transformNode (el: ASTElement, options: CompilerOptions) {
+  if (Array.isArray(el.attrsList)) {
+    el.attrsList.forEach(attr => {
+      if (attr.name && attr.name.match(/\-/)) {
+        const realName = normalizeKeyName(attr.name)
+        if (el.attrsMap) {
+          el.attrsMap[realName] = el.attrsMap[attr.name]
+          delete el.attrsMap[attr.name]
+        }
+        attr.name = realName
+      }
+    })
+  }
+}
+export default {
+  transformNode
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/compiler/modules/recycle-list/component-root.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/compiler/modules/recycle-list/component-root.js
new file mode 100644 (file)
index 0000000..7d9fede
--- /dev/null
@@ -0,0 +1,16 @@
+/* @flow */
+
+import { addAttr } from 'compiler/helpers'
+
+// mark component root nodes as
+export function postTransformComponentRoot (
+  el: ASTElement,
+  options: WeexCompilerOptions
+) {
+  if (!el.parent) {
+    // component root
+    addAttr(el, '@isComponentRoot', 'true')
+    addAttr(el, '@templateId', '_uid')
+    addAttr(el, '@componentProps', '$props || {}')
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/compiler/modules/recycle-list/component.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/compiler/modules/recycle-list/component.js
new file mode 100644 (file)
index 0000000..36d7dfd
--- /dev/null
@@ -0,0 +1,16 @@
+/* @flow */
+
+import { addAttr } from 'compiler/helpers'
+import { RECYCLE_LIST_MARKER } from 'weex/util/index'
+
+// mark components as inside recycle-list so that we know we need to invoke
+// their special @render function instead of render in create-component.js
+export function postTransformComponent (
+  el: ASTElement,
+  options: WeexCompilerOptions
+) {
+  // $flow-disable-line (we know isReservedTag is there)
+  if (!options.isReservedTag(el.tag) && el.tag !== 'cell-slot') {
+    addAttr(el, RECYCLE_LIST_MARKER, 'true')
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/compiler/modules/recycle-list/index.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/compiler/modules/recycle-list/index.js
new file mode 100644 (file)
index 0000000..502cc78
--- /dev/null
@@ -0,0 +1,60 @@
+/* @flow */
+
+import { preTransformRecycleList } from './recycle-list'
+import { postTransformComponent } from './component'
+import { postTransformComponentRoot } from './component-root'
+import { postTransformText } from './text'
+import { preTransformVBind } from './v-bind'
+import { preTransformVIf } from './v-if'
+import { preTransformVFor } from './v-for'
+import { postTransformVOn } from './v-on'
+import { preTransformVOnce } from './v-once'
+
+let currentRecycleList = null
+
+function shouldCompile (el: ASTElement, options: WeexCompilerOptions) {
+  return options.recyclable ||
+    (currentRecycleList && el !== currentRecycleList)
+}
+
+function preTransformNode (el: ASTElement, options: WeexCompilerOptions) {
+  if (el.tag === 'recycle-list') {
+    preTransformRecycleList(el, options)
+    currentRecycleList = el
+  }
+  if (shouldCompile(el, options)) {
+    preTransformVBind(el, options)
+    preTransformVIf(el, options) // also v-else-if and v-else
+    preTransformVFor(el, options)
+    preTransformVOnce(el, options)
+  }
+}
+
+function transformNode (el: ASTElement, options: WeexCompilerOptions) {
+  if (shouldCompile(el, options)) {
+    // do nothing yet
+  }
+}
+
+function postTransformNode (el: ASTElement, options: WeexCompilerOptions) {
+  if (shouldCompile(el, options)) {
+    // mark child component in parent template
+    postTransformComponent(el, options)
+    // mark root in child component template
+    postTransformComponentRoot(el, options)
+    // <text>: transform children text into value attr
+    if (el.tag === 'text') {
+      postTransformText(el, options)
+    }
+    postTransformVOn(el, options)
+  }
+  if (el === currentRecycleList) {
+    currentRecycleList = null
+  }
+}
+
+export default {
+  preTransformNode,
+  transformNode,
+  postTransformNode
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/compiler/modules/recycle-list/recycle-list.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/compiler/modules/recycle-list/recycle-list.js
new file mode 100644 (file)
index 0000000..7fb6516
--- /dev/null
@@ -0,0 +1,50 @@
+/* @flow */
+
+import { parseFor } from 'compiler/parser/index'
+import { getAndRemoveAttr, addRawAttr } from 'compiler/helpers'
+
+/**
+ * Map the following syntax to corresponding attrs:
+ *
+ * <recycle-list for="(item, i) in longList" switch="cellType">
+ *   <cell-slot case="A"> ... </cell-slot>
+ *   <cell-slot case="B"> ... </cell-slot>
+ * </recycle-list>
+ */
+
+export function preTransformRecycleList (
+  el: ASTElement,
+  options: WeexCompilerOptions
+) {
+  const exp = getAndRemoveAttr(el, 'for')
+  if (!exp) {
+    if (options.warn) {
+      options.warn(`Invalid <recycle-list> syntax: missing "for" expression.`)
+    }
+    return
+  }
+
+  const res = parseFor(exp)
+  if (!res) {
+    if (options.warn) {
+      options.warn(`Invalid <recycle-list> syntax: ${exp}.`)
+    }
+    return
+  }
+
+  addRawAttr(el, ':list-data', res.for)
+  addRawAttr(el, 'binding-expression', res.for)
+  addRawAttr(el, 'alias', res.alias)
+  if (res.iterator2) {
+    // (item, key, index) for object iteration
+    // is this even supported?
+    addRawAttr(el, 'index', res.iterator2)
+  } else if (res.iterator1) {
+    addRawAttr(el, 'index', res.iterator1)
+  }
+
+  const switchKey = getAndRemoveAttr(el, 'switch')
+  if (switchKey) {
+    addRawAttr(el, 'switch', switchKey)
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/compiler/modules/recycle-list/text.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/compiler/modules/recycle-list/text.js
new file mode 100644 (file)
index 0000000..575ec7f
--- /dev/null
@@ -0,0 +1,23 @@
+/* @flow */
+
+import { addAttr } from 'compiler/helpers'
+
+function genText (node: ASTNode) {
+  const value = node.type === 3
+    ? node.text
+    : node.type === 2
+      ? node.tokens.length === 1
+        ? node.tokens[0]
+        : node.tokens
+      : ''
+  return JSON.stringify(value)
+}
+
+export function postTransformText (el: ASTElement, options: WeexCompilerOptions) {
+  // weex <text> can only contain text, so the parser
+  // always generates a single child.
+  if (el.children.length) {
+    addAttr(el, 'value', genText(el.children[0]))
+    el.children = []
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/compiler/modules/recycle-list/v-bind.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/compiler/modules/recycle-list/v-bind.js
new file mode 100644 (file)
index 0000000..effdf35
--- /dev/null
@@ -0,0 +1,21 @@
+/* @flow */
+
+import { camelize } from 'shared/util'
+import { generateBinding } from 'weex/util/parser'
+import { bindRE } from 'compiler/parser/index'
+import { getAndRemoveAttr, addRawAttr } from 'compiler/helpers'
+
+function parseAttrName (name: string): string {
+  return camelize(name.replace(bindRE, ''))
+}
+
+export function preTransformVBind (el: ASTElement, options: WeexCompilerOptions) {
+  for (const attr in el.attrsMap) {
+    if (bindRE.test(attr)) {
+      const name: string = parseAttrName(attr)
+      const value = generateBinding(getAndRemoveAttr(el, attr))
+      delete el.attrsMap[attr]
+      addRawAttr(el, name, value)
+    }
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/compiler/modules/recycle-list/v-for.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/compiler/modules/recycle-list/v-for.js
new file mode 100644 (file)
index 0000000..9f09e4b
--- /dev/null
@@ -0,0 +1,33 @@
+/* @flow */
+
+import { parseFor } from 'compiler/parser/index'
+import { getAndRemoveAttr, addRawAttr } from 'compiler/helpers'
+
+export function preTransformVFor (el: ASTElement, options: WeexCompilerOptions) {
+  const exp = getAndRemoveAttr(el, 'v-for')
+  if (!exp) {
+    return
+  }
+
+  const res = parseFor(exp)
+  if (!res) {
+    if (process.env.NODE_ENV !== 'production' && options.warn) {
+      options.warn(`Invalid v-for expression: ${exp}`)
+    }
+    return
+  }
+
+  const desc: Object = {
+    '@expression': res.for,
+    '@alias': res.alias
+  }
+  if (res.iterator2) {
+    desc['@key'] = res.iterator1
+    desc['@index'] = res.iterator2
+  } else {
+    desc['@index'] = res.iterator1
+  }
+
+  delete el.attrsMap['v-for']
+  addRawAttr(el, '[[repeat]]', desc)
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/compiler/modules/recycle-list/v-if.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/compiler/modules/recycle-list/v-if.js
new file mode 100644 (file)
index 0000000..d82ba63
--- /dev/null
@@ -0,0 +1,63 @@
+/* @flow */
+
+import { addIfCondition } from 'compiler/parser/index'
+import { getAndRemoveAttr, addRawAttr } from 'compiler/helpers'
+
+function hasConditionDirective (el: ASTElement): boolean {
+  for (const attr in el.attrsMap) {
+    if (/^v\-if|v\-else|v\-else\-if$/.test(attr)) {
+      return true
+    }
+  }
+  return false
+}
+
+function getPreviousConditions (el: ASTElement): Array<string> {
+  const conditions = []
+  if (el.parent && el.parent.children) {
+    for (let c = 0, n = el.parent.children.length; c < n; ++c) {
+      // $flow-disable-line
+      const ifConditions = el.parent.children[c].ifConditions
+      if (ifConditions) {
+        for (let i = 0, l = ifConditions.length; i < l; ++i) {
+          const condition = ifConditions[i]
+          if (condition && condition.exp) {
+            conditions.push(condition.exp)
+          }
+        }
+      }
+    }
+  }
+  return conditions
+}
+
+export function preTransformVIf (el: ASTElement, options: WeexCompilerOptions) {
+  if (hasConditionDirective(el)) {
+    let exp
+    const ifExp = getAndRemoveAttr(el, 'v-if', true /* remove from attrsMap */)
+    const elseifExp = getAndRemoveAttr(el, 'v-else-if', true)
+    // don't need the value, but remove it to avoid being generated as a
+    // custom directive
+    getAndRemoveAttr(el, 'v-else', true)
+    if (ifExp) {
+      exp = ifExp
+      addIfCondition(el, { exp: ifExp, block: el })
+    } else {
+      elseifExp && addIfCondition(el, { exp: elseifExp, block: el })
+      const prevConditions = getPreviousConditions(el)
+      if (prevConditions.length) {
+        const prevMatch = prevConditions.join(' || ')
+        exp = elseifExp
+          ? `!(${prevMatch}) && (${elseifExp})` // v-else-if
+          : `!(${prevMatch})` // v-else
+      } else if (process.env.NODE_ENV !== 'production' && options.warn) {
+        options.warn(
+          `v-${elseifExp ? ('else-if="' + elseifExp + '"') : 'else'} ` +
+          `used on element <${el.tag}> without corresponding v-if.`
+        )
+        return
+      }
+    }
+    addRawAttr(el, '[[match]]', exp)
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/compiler/modules/recycle-list/v-on.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/compiler/modules/recycle-list/v-on.js
new file mode 100644 (file)
index 0000000..b1ba262
--- /dev/null
@@ -0,0 +1,25 @@
+/* @flow */
+
+const inlineStatementRE = /^\s*([A-Za-z_$0-9\['\."\]]+)*\s*\(\s*(([A-Za-z_$0-9\['\."\]]+)?(\s*,\s*([A-Za-z_$0-9\['\."\]]+))*)\s*\)$/
+
+function parseHandlerParams (handler: ASTElementHandler) {
+  const res = inlineStatementRE.exec(handler.value)
+  if (res && res[2]) {
+    handler.params = res[2].split(/\s*,\s*/)
+  }
+}
+
+export function postTransformVOn (el: ASTElement, options: WeexCompilerOptions) {
+  const events: ASTElementHandlers | void = el.events
+  if (!events) {
+    return
+  }
+  for (const name in events) {
+    const handler: ASTElementHandler | Array<ASTElementHandler> = events[name]
+    if (Array.isArray(handler)) {
+      handler.map(fn => parseHandlerParams(fn))
+    } else {
+      parseHandlerParams(handler)
+    }
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/compiler/modules/recycle-list/v-once.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/compiler/modules/recycle-list/v-once.js
new file mode 100644 (file)
index 0000000..baff838
--- /dev/null
@@ -0,0 +1,19 @@
+/* @flow */
+
+import { getAndRemoveAttr, addRawAttr } from 'compiler/helpers'
+
+function containVOnce (el: ASTElement): boolean {
+  for (const attr in el.attrsMap) {
+    if (/^v\-once$/i.test(attr)) {
+      return true
+    }
+  }
+  return false
+}
+
+export function preTransformVOnce (el: ASTElement, options: WeexCompilerOptions) {
+  if (containVOnce(el)) {
+    getAndRemoveAttr(el, 'v-once', true)
+    addRawAttr(el, '[[once]]', true)
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/compiler/modules/style.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/compiler/modules/style.js
new file mode 100644 (file)
index 0000000..7bf5027
--- /dev/null
@@ -0,0 +1,86 @@
+/* @flow */
+
+import { cached, camelize, isPlainObject } from 'shared/util'
+import { parseText } from 'compiler/parser/text-parser'
+import {
+  getAndRemoveAttr,
+  getBindingAttr,
+  baseWarn
+} from 'compiler/helpers'
+
+type StaticStyleResult = {
+  dynamic: boolean,
+  styleResult: string | Object | void
+};
+
+const normalize = cached(camelize)
+
+function transformNode (el: ASTElement, options: CompilerOptions) {
+  const warn = options.warn || baseWarn
+  const staticStyle = getAndRemoveAttr(el, 'style')
+  const { dynamic, styleResult } = parseStaticStyle(staticStyle, options)
+  if (process.env.NODE_ENV !== 'production' && dynamic) {
+    warn(
+      `style="${String(staticStyle)}": ` +
+      'Interpolation inside attributes has been deprecated. ' +
+      'Use v-bind or the colon shorthand instead.'
+    )
+  }
+  if (!dynamic && styleResult) {
+    // $flow-disable-line
+    el.staticStyle = styleResult
+  }
+  const styleBinding = getBindingAttr(el, 'style', false /* getStatic */)
+  if (styleBinding) {
+    el.styleBinding = styleBinding
+  } else if (dynamic) {
+    // $flow-disable-line
+    el.styleBinding = styleResult
+  }
+}
+
+function genData (el: ASTElement): string {
+  let data = ''
+  if (el.staticStyle) {
+    data += `staticStyle:${el.staticStyle},`
+  }
+  if (el.styleBinding) {
+    data += `style:${el.styleBinding},`
+  }
+  return data
+}
+
+function parseStaticStyle (staticStyle: ?string, options: CompilerOptions): StaticStyleResult {
+  // "width: 200px; height: 200px;" -> {width: 200, height: 200}
+  // "width: 200px; height: {{y}}" -> {width: 200, height: y}
+  let dynamic = false
+  let styleResult = ''
+  if (typeof staticStyle === 'string') {
+    const styleList = staticStyle.trim().split(';').map(style => {
+      const result = style.trim().split(':')
+      if (result.length !== 2) {
+        return
+      }
+      const key = normalize(result[0].trim())
+      const value = result[1].trim()
+      const dynamicValue = parseText(value, options.delimiters)
+      if (dynamicValue) {
+        dynamic = true
+        return key + ':' + dynamicValue.expression
+      }
+      return key + ':' + JSON.stringify(value)
+    }).filter(result => result)
+    if (styleList.length) {
+      styleResult = '{' + styleList.join(',') + '}'
+    }
+  } else if (isPlainObject(staticStyle)) {
+    styleResult = JSON.stringify(staticStyle) || ''
+  }
+  return { dynamic, styleResult }
+}
+
+export default {
+  staticKeys: ['staticStyle'],
+  transformNode,
+  genData
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/entry-compiler.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/entry-compiler.js
new file mode 100644 (file)
index 0000000..18d79ab
--- /dev/null
@@ -0,0 +1 @@
+export { compile } from 'weex/compiler/index'
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/entry-framework.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/entry-framework.js
new file mode 100644 (file)
index 0000000..a23775d
--- /dev/null
@@ -0,0 +1,187 @@
+/* @flow */
+
+// this will be preserved during build
+// $flow-disable-line
+const VueFactory = require('./factory')
+
+const instanceOptions: { [key: string]: WeexInstanceOption } = {}
+
+/**
+ * Create instance context.
+ */
+export function createInstanceContext (
+  instanceId: string,
+  runtimeContext: WeexRuntimeContext,
+  data: Object = {}
+): WeexInstanceContext {
+  const weex: Weex = runtimeContext.weex
+  const instance: WeexInstanceOption = instanceOptions[instanceId] = {
+    instanceId,
+    config: weex.config,
+    document: weex.document,
+    data
+  }
+
+  // Each instance has a independent `Vue` module instance
+  const Vue = instance.Vue = createVueModuleInstance(instanceId, weex)
+
+  // DEPRECATED
+  const timerAPIs = getInstanceTimer(instanceId, weex.requireModule)
+
+  const instanceContext = Object.assign({ Vue }, timerAPIs)
+  Object.freeze(instanceContext)
+  return instanceContext
+}
+
+/**
+ * Destroy an instance with id. It will make sure all memory of
+ * this instance released and no more leaks.
+ */
+export function destroyInstance (instanceId: string): void {
+  const instance = instanceOptions[instanceId]
+  if (instance && instance.app instanceof instance.Vue) {
+    try {
+      instance.app.$destroy()
+      instance.document.destroy()
+    } catch (e) {}
+    delete instance.document
+    delete instance.app
+  }
+  delete instanceOptions[instanceId]
+}
+
+/**
+ * Refresh an instance with id and new top-level component data.
+ * It will use `Vue.set` on all keys of the new data. So it's better
+ * define all possible meaningful keys when instance created.
+ */
+export function refreshInstance (
+  instanceId: string,
+  data: Object
+): Error | void {
+  const instance = instanceOptions[instanceId]
+  if (!instance || !(instance.app instanceof instance.Vue)) {
+    return new Error(`refreshInstance: instance ${instanceId} not found!`)
+  }
+  if (instance.Vue && instance.Vue.set) {
+    for (const key in data) {
+      instance.Vue.set(instance.app, key, data[key])
+    }
+  }
+  // Finally `refreshFinish` signal needed.
+  instance.document.taskCenter.send('dom', { action: 'refreshFinish' }, [])
+}
+
+/**
+ * Create a fresh instance of Vue for each Weex instance.
+ */
+function createVueModuleInstance (
+  instanceId: string,
+  weex: Weex
+): GlobalAPI {
+  const exports = {}
+  VueFactory(exports, weex.document)
+  const Vue = exports.Vue
+
+  const instance = instanceOptions[instanceId]
+
+  // patch reserved tag detection to account for dynamically registered
+  // components
+  const weexRegex = /^weex:/i
+  const isReservedTag = Vue.config.isReservedTag || (() => false)
+  const isRuntimeComponent = Vue.config.isRuntimeComponent || (() => false)
+  Vue.config.isReservedTag = name => {
+    return (!isRuntimeComponent(name) && weex.supports(`@component/${name}`)) ||
+      isReservedTag(name) ||
+      weexRegex.test(name)
+  }
+  Vue.config.parsePlatformTagName = name => name.replace(weexRegex, '')
+
+  // expose weex-specific info
+  Vue.prototype.$instanceId = instanceId
+  Vue.prototype.$document = instance.document
+
+  // expose weex native module getter on subVue prototype so that
+  // vdom runtime modules can access native modules via vnode.context
+  Vue.prototype.$requireWeexModule = weex.requireModule
+
+  // Hack `Vue` behavior to handle instance information and data
+  // before root component created.
+  Vue.mixin({
+    beforeCreate () {
+      const options = this.$options
+      // root component (vm)
+      if (options.el) {
+        // set external data of instance
+        const dataOption = options.data
+        const internalData = (typeof dataOption === 'function' ? dataOption() : dataOption) || {}
+        options.data = Object.assign(internalData, instance.data)
+        // record instance by id
+        instance.app = this
+      }
+    },
+    mounted () {
+      const options = this.$options
+      // root component (vm)
+      if (options.el && weex.document && instance.app === this) {
+        try {
+          // Send "createFinish" signal to native.
+          weex.document.taskCenter.send('dom', { action: 'createFinish' }, [])
+        } catch (e) {}
+      }
+    }
+  })
+
+  /**
+   * @deprecated Just instance variable `weex.config`
+   * Get instance config.
+   * @return {object}
+   */
+  Vue.prototype.$getConfig = function () {
+    if (instance.app instanceof Vue) {
+      return instance.config
+    }
+  }
+
+  return Vue
+}
+
+/**
+ * DEPRECATED
+ * Generate HTML5 Timer APIs. An important point is that the callback
+ * will be converted into callback id when sent to native. So the
+ * framework can make sure no side effect of the callback happened after
+ * an instance destroyed.
+ */
+function getInstanceTimer (
+  instanceId: string,
+  moduleGetter: Function
+): Object {
+  const instance = instanceOptions[instanceId]
+  const timer = moduleGetter('timer')
+  const timerAPIs = {
+    setTimeout: (...args) => {
+      const handler = function () {
+        args[0](...args.slice(2))
+      }
+
+      timer.setTimeout(handler, args[1])
+      return instance.document.taskCenter.callbackManager.lastCallbackId.toString()
+    },
+    setInterval: (...args) => {
+      const handler = function () {
+        args[0](...args.slice(2))
+      }
+
+      timer.setInterval(handler, args[1])
+      return instance.document.taskCenter.callbackManager.lastCallbackId.toString()
+    },
+    clearTimeout: (n) => {
+      timer.clearTimeout(n)
+    },
+    clearInterval: (n) => {
+      timer.clearInterval(n)
+    }
+  }
+  return timerAPIs
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/entry-runtime-factory.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/entry-runtime-factory.js
new file mode 100644 (file)
index 0000000..166ddf2
--- /dev/null
@@ -0,0 +1,6 @@
+// this entry is built and wrapped with a factory function
+// used to generate a fresh copy of Vue for every Weex instance.
+
+import Vue from './runtime/index'
+
+exports.Vue = Vue
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/runtime/components/index.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/runtime/components/index.js
new file mode 100644 (file)
index 0000000..449db1a
--- /dev/null
@@ -0,0 +1,9 @@
+import Richtext from './richtext'
+import Transition from './transition'
+import TransitionGroup from './transition-group'
+
+export default {
+  Richtext,
+  Transition,
+  TransitionGroup
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/runtime/components/richtext.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/runtime/components/richtext.js
new file mode 100644 (file)
index 0000000..a9164c7
--- /dev/null
@@ -0,0 +1,82 @@
+/* @flow */
+
+function getVNodeType (vnode: VNode): string {
+  if (!vnode.tag) {
+    return ''
+  }
+  return vnode.tag.replace(/vue\-component\-(\d+\-)?/, '')
+}
+
+function isSimpleSpan (vnode: VNode): boolean {
+  return vnode.children &&
+    vnode.children.length === 1 &&
+    !vnode.children[0].tag
+}
+
+function parseStyle (vnode: VNode): Object | void {
+  if (!vnode || !vnode.data) {
+    return
+  }
+  const { staticStyle, staticClass } = vnode.data
+  if (vnode.data.style || vnode.data.class || staticStyle || staticClass) {
+    const styles = Object.assign({}, staticStyle, vnode.data.style)
+    const cssMap = vnode.context.$options.style || {}
+    const classList = [].concat(staticClass, vnode.data.class)
+    classList.forEach(name => {
+      if (name && cssMap[name]) {
+        Object.assign(styles, cssMap[name])
+      }
+    })
+    return styles
+  }
+}
+
+function convertVNodeChildren (children: Array<VNode>): Array<VNode> | void {
+  if (!children.length) {
+    return
+  }
+
+  return children.map(vnode => {
+    const type: string = getVNodeType(vnode)
+    const props: Object = { type }
+
+    // convert raw text node
+    if (!type) {
+      props.type = 'span'
+      props.attr = {
+        value: (vnode.text || '').trim()
+      }
+    } else {
+      props.style = parseStyle(vnode)
+      if (vnode.data) {
+        props.attr = vnode.data.attrs
+        if (vnode.data.on) {
+          props.events = vnode.data.on
+        }
+      }
+      if (type === 'span' && isSimpleSpan(vnode)) {
+        props.attr = props.attr || {}
+        props.attr.value = vnode.children[0].text.trim()
+        return props
+      }
+    }
+
+    if (vnode.children && vnode.children.length) {
+      props.children = convertVNodeChildren(vnode.children)
+    }
+
+    return props
+  })
+}
+
+export default {
+  name: 'richtext',
+  render (h: Function) {
+    return h('weex:richtext', {
+      on: this._events,
+      attrs: {
+        value: convertVNodeChildren(this.$options._renderChildren || [])
+      }
+    })
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/runtime/components/transition-group.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/runtime/components/transition-group.js
new file mode 100644 (file)
index 0000000..4a65965
--- /dev/null
@@ -0,0 +1,148 @@
+import { warn, extend } from 'core/util/index'
+import { transitionProps, extractTransitionData } from './transition'
+
+const props = extend({
+  tag: String,
+  moveClass: String
+}, transitionProps)
+
+delete props.mode
+
+export default {
+  props,
+
+  created () {
+    const dom = this.$requireWeexModule('dom')
+    this.getPosition = el => new Promise((resolve, reject) => {
+      dom.getComponentRect(el.ref, res => {
+        if (!res.result) {
+          reject(new Error(`failed to get rect for element: ${el.tag}`))
+        } else {
+          resolve(res.size)
+        }
+      })
+    })
+
+    const animation = this.$requireWeexModule('animation')
+    this.animate = (el, options) => new Promise(resolve => {
+      animation.transition(el.ref, options, resolve)
+    })
+  },
+
+  render (h) {
+    const tag = this.tag || this.$vnode.data.tag || 'span'
+    const map = Object.create(null)
+    const prevChildren = this.prevChildren = this.children
+    const rawChildren = this.$slots.default || []
+    const children = this.children = []
+    const transitionData = extractTransitionData(this)
+
+    for (let i = 0; i < rawChildren.length; i++) {
+      const c = rawChildren[i]
+      if (c.tag) {
+        if (c.key != null && String(c.key).indexOf('__vlist') !== 0) {
+          children.push(c)
+          map[c.key] = c
+          ;(c.data || (c.data = {})).transition = transitionData
+        } else if (process.env.NODE_ENV !== 'production') {
+          const opts = c.componentOptions
+          const name = opts
+            ? (opts.Ctor.options.name || opts.tag)
+            : c.tag
+          warn(`<transition-group> children must be keyed: <${name}>`)
+        }
+      }
+    }
+
+    if (prevChildren) {
+      const kept = []
+      const removed = []
+      prevChildren.forEach(c => {
+        c.data.transition = transitionData
+
+        // TODO: record before patch positions
+
+        if (map[c.key]) {
+          kept.push(c)
+        } else {
+          removed.push(c)
+        }
+      })
+      this.kept = h(tag, null, kept)
+      this.removed = removed
+    }
+
+    return h(tag, null, children)
+  },
+
+  beforeUpdate () {
+    // force removing pass
+    this.__patch__(
+      this._vnode,
+      this.kept,
+      false, // hydrating
+      true // removeOnly (!important, avoids unnecessary moves)
+    )
+    this._vnode = this.kept
+  },
+
+  updated () {
+    const children = this.prevChildren
+    const moveClass = this.moveClass || ((this.name || 'v') + '-move')
+    const moveData = children.length && this.getMoveData(children[0].context, moveClass)
+    if (!moveData) {
+      return
+    }
+
+    // TODO: finish implementing move animations once
+    // we have access to sync getComponentRect()
+
+    // children.forEach(callPendingCbs)
+
+    // Promise.all(children.map(c => {
+    //   const oldPos = c.data.pos
+    //   const newPos = c.data.newPos
+    //   const dx = oldPos.left - newPos.left
+    //   const dy = oldPos.top - newPos.top
+    //   if (dx || dy) {
+    //     c.data.moved = true
+    //     return this.animate(c.elm, {
+    //       styles: {
+    //         transform: `translate(${dx}px,${dy}px)`
+    //       }
+    //     })
+    //   }
+    // })).then(() => {
+    //   children.forEach(c => {
+    //     if (c.data.moved) {
+    //       this.animate(c.elm, {
+    //         styles: {
+    //           transform: ''
+    //         },
+    //         duration: moveData.duration || 0,
+    //         delay: moveData.delay || 0,
+    //         timingFunction: moveData.timingFunction || 'linear'
+    //       })
+    //     }
+    //   })
+    // })
+  },
+
+  methods: {
+    getMoveData (context, moveClass) {
+      const stylesheet = context.$options.style || {}
+      return stylesheet['@TRANSITION'] && stylesheet['@TRANSITION'][moveClass]
+    }
+  }
+}
+
+// function callPendingCbs (c) {
+//   /* istanbul ignore if */
+//   if (c.elm._moveCb) {
+//     c.elm._moveCb()
+//   }
+//   /* istanbul ignore if */
+//   if (c.elm._enterCb) {
+//     c.elm._enterCb()
+//   }
+// }
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/runtime/components/transition.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/runtime/components/transition.js
new file mode 100644 (file)
index 0000000..20ba632
--- /dev/null
@@ -0,0 +1,9 @@
+// reuse same transition component logic from web
+export {
+  transitionProps,
+  extractTransitionData
+} from 'web/runtime/components/transition'
+
+import Transition from 'web/runtime/components/transition'
+
+export default Transition
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/runtime/directives/index.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/runtime/directives/index.js
new file mode 100644 (file)
index 0000000..efba7fa
--- /dev/null
@@ -0,0 +1,2 @@
+export default {
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/runtime/index.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/runtime/index.js
new file mode 100644 (file)
index 0000000..b8e0930
--- /dev/null
@@ -0,0 +1,42 @@
+/* @flow */
+
+import Vue from 'core/index'
+import { patch } from 'weex/runtime/patch'
+import { mountComponent } from 'core/instance/lifecycle'
+import platformDirectives from 'weex/runtime/directives/index'
+import platformComponents from 'weex/runtime/components/index'
+
+import {
+  query,
+  mustUseProp,
+  isReservedTag,
+  isRuntimeComponent,
+  isUnknownElement
+} from 'weex/util/element'
+
+// install platform specific utils
+Vue.config.mustUseProp = mustUseProp
+Vue.config.isReservedTag = isReservedTag
+Vue.config.isRuntimeComponent = isRuntimeComponent
+Vue.config.isUnknownElement = isUnknownElement
+
+// install platform runtime directives and components
+Vue.options.directives = platformDirectives
+Vue.options.components = platformComponents
+
+// install platform patch function
+Vue.prototype.__patch__ = patch
+
+// wrap mount
+Vue.prototype.$mount = function (
+  el?: any,
+  hydrating?: boolean
+): Component {
+  return mountComponent(
+    this,
+    el && query(el, this.$document),
+    hydrating
+  )
+}
+
+export default Vue
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/runtime/modules/attrs.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/runtime/modules/attrs.js
new file mode 100644 (file)
index 0000000..1b6185c
--- /dev/null
@@ -0,0 +1,44 @@
+/* @flow */
+
+import { extend } from 'shared/util'
+
+function updateAttrs (oldVnode: VNodeWithData, vnode: VNodeWithData) {
+  if (!oldVnode.data.attrs && !vnode.data.attrs) {
+    return
+  }
+  let key, cur, old
+  const elm = vnode.elm
+  const oldAttrs = oldVnode.data.attrs || {}
+  let attrs = vnode.data.attrs || {}
+  // clone observed objects, as the user probably wants to mutate it
+  if (attrs.__ob__) {
+    attrs = vnode.data.attrs = extend({}, attrs)
+  }
+
+  const supportBatchUpdate = typeof elm.setAttrs === 'function'
+  const batchedAttrs = {}
+  for (key in attrs) {
+    cur = attrs[key]
+    old = oldAttrs[key]
+    if (old !== cur) {
+      supportBatchUpdate
+        ? (batchedAttrs[key] = cur)
+        : elm.setAttr(key, cur)
+    }
+  }
+  for (key in oldAttrs) {
+    if (attrs[key] == null) {
+      supportBatchUpdate
+        ? (batchedAttrs[key] = undefined)
+        : elm.setAttr(key)
+    }
+  }
+  if (supportBatchUpdate) {
+    elm.setAttrs(batchedAttrs)
+  }
+}
+
+export default {
+  create: updateAttrs,
+  update: updateAttrs
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/runtime/modules/class.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/runtime/modules/class.js
new file mode 100644 (file)
index 0000000..029b9e9
--- /dev/null
@@ -0,0 +1,75 @@
+/* @flow */
+
+import { extend } from 'shared/util'
+
+function updateClass (oldVnode: VNodeWithData, vnode: VNodeWithData) {
+  const el = vnode.elm
+  const ctx = vnode.context
+
+  const data: VNodeData = vnode.data
+  const oldData: VNodeData = oldVnode.data
+  if (!data.staticClass &&
+    !data.class &&
+    (!oldData || (!oldData.staticClass && !oldData.class))
+  ) {
+    return
+  }
+
+  const oldClassList = []
+  // unlike web, weex vnode staticClass is an Array
+  const oldStaticClass: any = oldData.staticClass
+  if (oldStaticClass) {
+    oldClassList.push.apply(oldClassList, oldStaticClass)
+  }
+  if (oldData.class) {
+    oldClassList.push.apply(oldClassList, oldData.class)
+  }
+
+  const classList = []
+  // unlike web, weex vnode staticClass is an Array
+  const staticClass: any = data.staticClass
+  if (staticClass) {
+    classList.push.apply(classList, staticClass)
+  }
+  if (data.class) {
+    classList.push.apply(classList, data.class)
+  }
+
+  if (typeof el.setClassList === 'function') {
+    el.setClassList(classList)
+  } else {
+    const style = getStyle(oldClassList, classList, ctx)
+    if (typeof el.setStyles === 'function') {
+      el.setStyles(style)
+    } else {
+      for (const key in style) {
+        el.setStyle(key, style[key])
+      }
+    }
+  }
+}
+
+function getStyle (oldClassList: Array<string>, classList: Array<string>, ctx: Component): Object {
+  // style is a weex-only injected object
+  // compiled from <style> tags in weex files
+  const stylesheet: any = ctx.$options.style || {}
+  const result = {}
+  classList.forEach(name => {
+    const style = stylesheet[name]
+    extend(result, style)
+  })
+  oldClassList.forEach(name => {
+    const style = stylesheet[name]
+    for (const key in style) {
+      if (!result.hasOwnProperty(key)) {
+        result[key] = ''
+      }
+    }
+  })
+  return result
+}
+
+export default {
+  create: updateClass,
+  update: updateClass
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/runtime/modules/events.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/runtime/modules/events.js
new file mode 100644 (file)
index 0000000..a3f9e25
--- /dev/null
@@ -0,0 +1,57 @@
+/* @flow */
+
+import { updateListeners } from 'core/vdom/helpers/update-listeners'
+
+let target: any
+
+function add (
+  event: string,
+  handler: Function,
+  once: boolean,
+  capture: boolean,
+  passive?: boolean,
+  params?: Array<any>
+) {
+  if (capture) {
+    console.log('Weex do not support event in bubble phase.')
+    return
+  }
+  if (once) {
+    const oldHandler = handler
+    const _target = target // save current target element in closure
+    handler = function (ev) {
+      const res = arguments.length === 1
+        ? oldHandler(ev)
+        : oldHandler.apply(null, arguments)
+      if (res !== null) {
+        remove(event, null, null, _target)
+      }
+    }
+  }
+  target.addEvent(event, handler, params)
+}
+
+function remove (
+  event: string,
+  handler: any,
+  capture: any,
+  _target?: any
+) {
+  (_target || target).removeEvent(event)
+}
+
+function updateDOMListeners (oldVnode: VNodeWithData, vnode: VNodeWithData) {
+  if (!oldVnode.data.on && !vnode.data.on) {
+    return
+  }
+  const on = vnode.data.on || {}
+  const oldOn = oldVnode.data.on || {}
+  target = vnode.elm
+  updateListeners(on, oldOn, add, remove, vnode.context)
+  target = undefined
+}
+
+export default {
+  create: updateDOMListeners,
+  update: updateDOMListeners
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/runtime/modules/index.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/runtime/modules/index.js
new file mode 100644 (file)
index 0000000..dd38448
--- /dev/null
@@ -0,0 +1,13 @@
+import attrs from './attrs'
+import klass from './class'
+import events from './events'
+import style from './style'
+import transition from './transition'
+
+export default [
+  attrs,
+  klass,
+  events,
+  style,
+  transition
+]
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/runtime/modules/style.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/runtime/modules/style.js
new file mode 100644 (file)
index 0000000..bdabd17
--- /dev/null
@@ -0,0 +1,84 @@
+/* @flow */
+
+import { extend, cached, camelize } from 'shared/util'
+
+const normalize = cached(camelize)
+
+function createStyle (oldVnode: VNodeWithData, vnode: VNodeWithData) {
+  if (!vnode.data.staticStyle) {
+    updateStyle(oldVnode, vnode)
+    return
+  }
+  const elm = vnode.elm
+  const staticStyle = vnode.data.staticStyle
+  const supportBatchUpdate = typeof elm.setStyles === 'function'
+  const batchedStyles = {}
+  for (const name in staticStyle) {
+    if (staticStyle[name]) {
+      supportBatchUpdate
+        ? (batchedStyles[normalize(name)] = staticStyle[name])
+        : elm.setStyle(normalize(name), staticStyle[name])
+    }
+  }
+  if (supportBatchUpdate) {
+    elm.setStyles(batchedStyles)
+  }
+  updateStyle(oldVnode, vnode)
+}
+
+function updateStyle (oldVnode: VNodeWithData, vnode: VNodeWithData) {
+  if (!oldVnode.data.style && !vnode.data.style) {
+    return
+  }
+  let cur, name
+  const elm = vnode.elm
+  const oldStyle: any = oldVnode.data.style || {}
+  let style: any = vnode.data.style || {}
+
+  const needClone = style.__ob__
+
+  // handle array syntax
+  if (Array.isArray(style)) {
+    style = vnode.data.style = toObject(style)
+  }
+
+  // clone the style for future updates,
+  // in case the user mutates the style object in-place.
+  if (needClone) {
+    style = vnode.data.style = extend({}, style)
+  }
+
+  const supportBatchUpdate = typeof elm.setStyles === 'function'
+  const batchedStyles = {}
+  for (name in oldStyle) {
+    if (!style[name]) {
+      supportBatchUpdate
+        ? (batchedStyles[normalize(name)] = '')
+        : elm.setStyle(normalize(name), '')
+    }
+  }
+  for (name in style) {
+    cur = style[name]
+    supportBatchUpdate
+      ? (batchedStyles[normalize(name)] = cur)
+      : elm.setStyle(normalize(name), cur)
+  }
+  if (supportBatchUpdate) {
+    elm.setStyles(batchedStyles)
+  }
+}
+
+function toObject (arr) {
+  const res = {}
+  for (var i = 0; i < arr.length; i++) {
+    if (arr[i]) {
+      extend(res, arr[i])
+    }
+  }
+  return res
+}
+
+export default {
+  create: createStyle,
+  update: updateStyle
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/runtime/modules/transition.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/runtime/modules/transition.js
new file mode 100644 (file)
index 0000000..e474c2b
--- /dev/null
@@ -0,0 +1,270 @@
+import { warn } from 'core/util/debug'
+import { extend, once, noop } from 'shared/util'
+import { activeInstance } from 'core/instance/lifecycle'
+import { resolveTransition } from 'web/runtime/transition-util'
+
+export default {
+  create: enter,
+  activate: enter,
+  remove: leave
+}
+
+function enter (_, vnode) {
+  const el = vnode.elm
+
+  // call leave callback now
+  if (el._leaveCb) {
+    el._leaveCb.cancelled = true
+    el._leaveCb()
+  }
+
+  const data = resolveTransition(vnode.data.transition)
+  if (!data) {
+    return
+  }
+
+  /* istanbul ignore if */
+  if (el._enterCb) {
+    return
+  }
+
+  const {
+    enterClass,
+    enterToClass,
+    enterActiveClass,
+    appearClass,
+    appearToClass,
+    appearActiveClass,
+    beforeEnter,
+    enter,
+    afterEnter,
+    enterCancelled,
+    beforeAppear,
+    appear,
+    afterAppear,
+    appearCancelled
+  } = data
+
+  let context = activeInstance
+  let transitionNode = activeInstance.$vnode
+  while (transitionNode && transitionNode.parent) {
+    transitionNode = transitionNode.parent
+    context = transitionNode.context
+  }
+
+  const isAppear = !context._isMounted || !vnode.isRootInsert
+
+  if (isAppear && !appear && appear !== '') {
+    return
+  }
+
+  const startClass = isAppear ? appearClass : enterClass
+  const toClass = isAppear ? appearToClass : enterToClass
+  const activeClass = isAppear ? appearActiveClass : enterActiveClass
+  const beforeEnterHook = isAppear ? (beforeAppear || beforeEnter) : beforeEnter
+  const enterHook = isAppear ? (typeof appear === 'function' ? appear : enter) : enter
+  const afterEnterHook = isAppear ? (afterAppear || afterEnter) : afterEnter
+  const enterCancelledHook = isAppear ? (appearCancelled || enterCancelled) : enterCancelled
+
+  const userWantsControl =
+    enterHook &&
+    // enterHook may be a bound method which exposes
+    // the length of original fn as _length
+    (enterHook._length || enterHook.length) > 1
+
+  const stylesheet = vnode.context.$options.style || {}
+  const startState = stylesheet[startClass]
+  const transitionProperties = (stylesheet['@TRANSITION'] && stylesheet['@TRANSITION'][activeClass]) || {}
+  const endState = getEnterTargetState(el, stylesheet, startClass, toClass, activeClass, vnode.context)
+  const needAnimation = Object.keys(endState).length > 0
+
+  const cb = el._enterCb = once(() => {
+    if (cb.cancelled) {
+      enterCancelledHook && enterCancelledHook(el)
+    } else {
+      afterEnterHook && afterEnterHook(el)
+    }
+    el._enterCb = null
+  })
+
+  // We need to wait until the native element has been inserted, but currently
+  // there's no API to do that. So we have to wait "one frame" - not entirely
+  // sure if this is guaranteed to be enough (e.g. on slow devices?)
+  setTimeout(() => {
+    const parent = el.parentNode
+    const pendingNode = parent && parent._pending && parent._pending[vnode.key]
+    if (pendingNode &&
+      pendingNode.context === vnode.context &&
+      pendingNode.tag === vnode.tag &&
+      pendingNode.elm._leaveCb
+    ) {
+      pendingNode.elm._leaveCb()
+    }
+    enterHook && enterHook(el, cb)
+
+    if (needAnimation) {
+      const animation = vnode.context.$requireWeexModule('animation')
+      animation.transition(el.ref, {
+        styles: endState,
+        duration: transitionProperties.duration || 0,
+        delay: transitionProperties.delay || 0,
+        timingFunction: transitionProperties.timingFunction || 'linear'
+      }, userWantsControl ? noop : cb)
+    } else if (!userWantsControl) {
+      cb()
+    }
+  }, 16)
+
+  // start enter transition
+  beforeEnterHook && beforeEnterHook(el)
+
+  if (startState) {
+    if (typeof el.setStyles === 'function') {
+      el.setStyles(startState)
+    } else {
+      for (const key in startState) {
+        el.setStyle(key, startState[key])
+      }
+    }
+  }
+
+  if (!needAnimation && !userWantsControl) {
+    cb()
+  }
+}
+
+function leave (vnode, rm) {
+  const el = vnode.elm
+
+  // call enter callback now
+  if (el._enterCb) {
+    el._enterCb.cancelled = true
+    el._enterCb()
+  }
+
+  const data = resolveTransition(vnode.data.transition)
+  if (!data) {
+    return rm()
+  }
+
+  if (el._leaveCb) {
+    return
+  }
+
+  const {
+    leaveClass,
+    leaveToClass,
+    leaveActiveClass,
+    beforeLeave,
+    leave,
+    afterLeave,
+    leaveCancelled,
+    delayLeave
+  } = data
+
+  const userWantsControl =
+    leave &&
+    // leave hook may be a bound method which exposes
+    // the length of original fn as _length
+    (leave._length || leave.length) > 1
+
+  const stylesheet = vnode.context.$options.style || {}
+  const startState = stylesheet[leaveClass]
+  const endState = stylesheet[leaveToClass] || stylesheet[leaveActiveClass]
+  const transitionProperties = (stylesheet['@TRANSITION'] && stylesheet['@TRANSITION'][leaveActiveClass]) || {}
+
+  const cb = el._leaveCb = once(() => {
+    if (el.parentNode && el.parentNode._pending) {
+      el.parentNode._pending[vnode.key] = null
+    }
+    if (cb.cancelled) {
+      leaveCancelled && leaveCancelled(el)
+    } else {
+      rm()
+      afterLeave && afterLeave(el)
+    }
+    el._leaveCb = null
+  })
+
+  if (delayLeave) {
+    delayLeave(performLeave)
+  } else {
+    performLeave()
+  }
+
+  function performLeave () {
+    const animation = vnode.context.$requireWeexModule('animation')
+    // the delayed leave may have already been cancelled
+    if (cb.cancelled) {
+      return
+    }
+    // record leaving element
+    if (!vnode.data.show) {
+      (el.parentNode._pending || (el.parentNode._pending = {}))[vnode.key] = vnode
+    }
+    beforeLeave && beforeLeave(el)
+
+    if (startState) {
+      animation.transition(el.ref, {
+        styles: startState
+      }, next)
+    } else {
+      next()
+    }
+
+    function next () {
+      animation.transition(el.ref, {
+        styles: endState,
+        duration: transitionProperties.duration || 0,
+        delay: transitionProperties.delay || 0,
+        timingFunction: transitionProperties.timingFunction || 'linear'
+      }, userWantsControl ? noop : cb)
+    }
+
+    leave && leave(el, cb)
+    if (!endState && !userWantsControl) {
+      cb()
+    }
+  }
+}
+
+// determine the target animation style for an entering transition.
+function getEnterTargetState (el, stylesheet, startClass, endClass, activeClass, vm) {
+  const targetState = {}
+  const startState = stylesheet[startClass]
+  const endState = stylesheet[endClass]
+  const activeState = stylesheet[activeClass]
+  // 1. fallback to element's default styling
+  if (startState) {
+    for (const key in startState) {
+      targetState[key] = el.style[key]
+      if (
+        process.env.NODE_ENV !== 'production' &&
+        targetState[key] == null &&
+        (!activeState || activeState[key] == null) &&
+        (!endState || endState[key] == null)
+      ) {
+        warn(
+          `transition property "${key}" is declared in enter starting class (.${startClass}), ` +
+          `but not declared anywhere in enter ending class (.${endClass}), ` +
+          `enter active cass (.${activeClass}) or the element's default styling. ` +
+          `Note in Weex, CSS properties need explicit values to be transitionable.`
+        )
+      }
+    }
+  }
+  // 2. if state is mixed in active state, extract them while excluding
+  //    transition properties
+  if (activeState) {
+    for (const key in activeState) {
+      if (key.indexOf('transition') !== 0) {
+        targetState[key] = activeState[key]
+      }
+    }
+  }
+  // 3. explicit endState has highest priority
+  if (endState) {
+    extend(targetState, endState)
+  }
+  return targetState
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/runtime/node-ops.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/runtime/node-ops.js
new file mode 100644 (file)
index 0000000..0438ec5
--- /dev/null
@@ -0,0 +1,91 @@
+/* @flow */
+declare var document: WeexDocument;
+
+import TextNode from 'weex/runtime/text-node'
+
+export const namespaceMap = {}
+
+export function createElement (tagName: string): WeexElement {
+  return document.createElement(tagName)
+}
+
+export function createElementNS (namespace: string, tagName: string): WeexElement {
+  return document.createElement(namespace + ':' + tagName)
+}
+
+export function createTextNode (text: string) {
+  return new TextNode(text)
+}
+
+export function createComment (text: string) {
+  return document.createComment(text)
+}
+
+export function insertBefore (
+  node: WeexElement,
+  target: WeexElement,
+  before: WeexElement
+) {
+  if (target.nodeType === 3) {
+    if (node.type === 'text') {
+      node.setAttr('value', target.text)
+      target.parentNode = node
+    } else {
+      const text = createElement('text')
+      text.setAttr('value', target.text)
+      node.insertBefore(text, before)
+    }
+    return
+  }
+  node.insertBefore(target, before)
+}
+
+export function removeChild (node: WeexElement, child: WeexElement) {
+  if (child.nodeType === 3) {
+    node.setAttr('value', '')
+    return
+  }
+  node.removeChild(child)
+}
+
+export function appendChild (node: WeexElement, child: WeexElement) {
+  if (child.nodeType === 3) {
+    if (node.type === 'text') {
+      node.setAttr('value', child.text)
+      child.parentNode = node
+    } else {
+      const text = createElement('text')
+      text.setAttr('value', child.text)
+      node.appendChild(text)
+    }
+    return
+  }
+
+  node.appendChild(child)
+}
+
+export function parentNode (node: WeexElement): WeexElement | void {
+  return node.parentNode
+}
+
+export function nextSibling (node: WeexElement): WeexElement | void {
+  return node.nextSibling
+}
+
+export function tagName (node: WeexElement): string {
+  return node.type
+}
+
+export function setTextContent (node: WeexElement, text: string) {
+  if (node.parentNode) {
+    node.parentNode.setAttr('value', text)
+  }
+}
+
+export function setAttribute (node: WeexElement, key: string, val: any) {
+  node.setAttr(key, val)
+}
+
+export function setStyleScope (node: WeexElement, scopeId: string) {
+  node.setAttr('@styleScope', scopeId)
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/runtime/patch.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/runtime/patch.js
new file mode 100644 (file)
index 0000000..5e70d14
--- /dev/null
@@ -0,0 +1,16 @@
+/* @flow */
+
+import * as nodeOps from 'weex/runtime/node-ops'
+import { createPatchFunction } from 'core/vdom/patch'
+import baseModules from 'core/vdom/modules/index'
+import platformModules from 'weex/runtime/modules/index'
+
+// the directive module should be applied last, after all
+// built-in modules have been applied.
+const modules = platformModules.concat(baseModules)
+
+export const patch: Function = createPatchFunction({
+  nodeOps,
+  modules,
+  LONG_LIST_THRESHOLD: 10
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/runtime/recycle-list/render-component-template.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/runtime/recycle-list/render-component-template.js
new file mode 100644 (file)
index 0000000..17e8c01
--- /dev/null
@@ -0,0 +1,34 @@
+/* @flow */
+
+import { warn } from 'core/util/debug'
+import { handleError } from 'core/util/error'
+import { RECYCLE_LIST_MARKER } from 'weex/util/index'
+import { createComponentInstanceForVnode } from 'core/vdom/create-component'
+import { resolveVirtualComponent } from './virtual-component'
+
+export function isRecyclableComponent (vnode: VNodeWithData): boolean {
+  return vnode.data.attrs
+    ? (RECYCLE_LIST_MARKER in vnode.data.attrs)
+    : false
+}
+
+export function renderRecyclableComponentTemplate (vnode: MountedComponentVNode): VNode {
+  // $flow-disable-line
+  delete vnode.data.attrs[RECYCLE_LIST_MARKER]
+  resolveVirtualComponent(vnode)
+  const vm = createComponentInstanceForVnode(vnode)
+  const render = (vm.$options: any)['@render']
+  if (render) {
+    try {
+      return render.call(vm)
+    } catch (err) {
+      handleError(err, vm, `@render`)
+    }
+  } else {
+    warn(
+      `@render function not defined on component used in <recycle-list>. ` +
+      `Make sure to declare \`recyclable="true"\` on the component's template.`,
+      vm
+    )
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/runtime/recycle-list/virtual-component.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/runtime/recycle-list/virtual-component.js
new file mode 100644 (file)
index 0000000..e5498d2
--- /dev/null
@@ -0,0 +1,136 @@
+/* @flow */
+
+// https://github.com/Hanks10100/weex-native-directive/tree/master/component
+
+import { mergeOptions, isPlainObject, noop } from 'core/util/index'
+import Watcher from 'core/observer/watcher'
+import { initProxy } from 'core/instance/proxy'
+import { initState, getData } from 'core/instance/state'
+import { initRender } from 'core/instance/render'
+import { initEvents } from 'core/instance/events'
+import { initProvide, initInjections } from 'core/instance/inject'
+import { initLifecycle, callHook } from 'core/instance/lifecycle'
+import { initInternalComponent, resolveConstructorOptions } from 'core/instance/init'
+import { registerComponentHook, updateComponentData } from '../../util/index'
+
+let uid = 0
+
+// override Vue.prototype._init
+function initVirtualComponent (options: Object = {}) {
+  const vm: Component = this
+  const componentId = options.componentId
+
+  // virtual component uid
+  vm._uid = `virtual-component-${uid++}`
+
+  // a flag to avoid this being observed
+  vm._isVue = true
+  // merge options
+  if (options && options._isComponent) {
+    // optimize internal component instantiation
+    // since dynamic options merging is pretty slow, and none of the
+    // internal component options needs special treatment.
+    initInternalComponent(vm, options)
+  } else {
+    vm.$options = mergeOptions(
+      resolveConstructorOptions(vm.constructor),
+      options || {},
+      vm
+    )
+  }
+
+  /* istanbul ignore else */
+  if (process.env.NODE_ENV !== 'production') {
+    initProxy(vm)
+  } else {
+    vm._renderProxy = vm
+  }
+
+  vm._self = vm
+  initLifecycle(vm)
+  initEvents(vm)
+  initRender(vm)
+  callHook(vm, 'beforeCreate')
+  initInjections(vm) // resolve injections before data/props
+  initState(vm)
+  initProvide(vm) // resolve provide after data/props
+  callHook(vm, 'created')
+
+  // send initial data to native
+  const data = vm.$options.data
+  const params = typeof data === 'function'
+    ? getData(data, vm)
+    : data || {}
+  if (isPlainObject(params)) {
+    updateComponentData(componentId, params)
+  }
+
+  registerComponentHook(componentId, 'lifecycle', 'attach', () => {
+    callHook(vm, 'beforeMount')
+
+    const updateComponent = () => {
+      vm._update(vm._vnode, false)
+    }
+    new Watcher(vm, updateComponent, noop, null, true)
+
+    vm._isMounted = true
+    callHook(vm, 'mounted')
+  })
+
+  registerComponentHook(componentId, 'lifecycle', 'detach', () => {
+    vm.$destroy()
+  })
+}
+
+// override Vue.prototype._update
+function updateVirtualComponent (vnode?: VNode) {
+  const vm: Component = this
+  const componentId = vm.$options.componentId
+  if (vm._isMounted) {
+    callHook(vm, 'beforeUpdate')
+  }
+  vm._vnode = vnode
+  if (vm._isMounted && componentId) {
+    // TODO: data should be filtered and without bindings
+    const data = Object.assign({}, vm._data)
+    updateComponentData(componentId, data, () => {
+      callHook(vm, 'updated')
+    })
+  }
+}
+
+// listening on native callback
+export function resolveVirtualComponent (vnode: MountedComponentVNode): VNode {
+  const BaseCtor = vnode.componentOptions.Ctor
+  const VirtualComponent = BaseCtor.extend({})
+  const cid = VirtualComponent.cid
+  VirtualComponent.prototype._init = initVirtualComponent
+  VirtualComponent.prototype._update = updateVirtualComponent
+
+  vnode.componentOptions.Ctor = BaseCtor.extend({
+    beforeCreate () {
+      // const vm: Component = this
+
+      // TODO: listen on all events and dispatch them to the
+      // corresponding virtual components according to the componentId.
+      // vm._virtualComponents = {}
+      const createVirtualComponent = (componentId, propsData) => {
+        // create virtual component
+        // const subVm =
+        new VirtualComponent({
+          componentId,
+          propsData
+        })
+        // if (vm._virtualComponents) {
+        //   vm._virtualComponents[componentId] = subVm
+        // }
+      }
+
+      registerComponentHook(cid, 'lifecycle', 'create', createVirtualComponent)
+    },
+    beforeDestroy () {
+      delete this._virtualComponents
+    }
+  })
+}
+
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/runtime/text-node.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/runtime/text-node.js
new file mode 100644 (file)
index 0000000..0720a05
--- /dev/null
@@ -0,0 +1,9 @@
+let latestNodeId = 1
+
+export default function TextNode (text) {
+  this.instanceId = ''
+  this.nodeId = latestNodeId++
+  this.parentNode = null
+  this.nodeType = 3
+  this.text = text
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/util/element.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/util/element.js
new file mode 100644 (file)
index 0000000..97e97fe
--- /dev/null
@@ -0,0 +1,52 @@
+/* @flow */
+
+// These util functions are split into its own file because Rollup cannot drop
+// makeMap() due to potential side effects, so these variables end up
+// bloating the web builds.
+
+import { makeMap } from 'shared/util'
+
+export const isReservedTag = makeMap(
+  'template,script,style,element,content,slot,link,meta,svg,view,' +
+  'a,div,img,image,text,span,input,switch,textarea,spinner,select,' +
+  'slider,slider-neighbor,indicator,canvas,' +
+  'list,cell,header,loading,loading-indicator,refresh,scrollable,scroller,' +
+  'video,web,embed,tabbar,tabheader,datepicker,timepicker,marquee,countdown',
+  true
+)
+
+// Elements that you can, intentionally, leave open (and which close themselves)
+// more flexible than web
+export const canBeLeftOpenTag = makeMap(
+  'web,spinner,switch,video,textarea,canvas,' +
+  'indicator,marquee,countdown',
+  true
+)
+
+export const isRuntimeComponent = makeMap(
+  'richtext,transition,transition-group',
+  true
+)
+
+export const isUnaryTag = makeMap(
+  'embed,img,image,input,link,meta',
+  true
+)
+
+export function mustUseProp (tag: string, type: ?string, name: string): boolean {
+  return false
+}
+
+export function getTagNamespace (tag?: string): string | void { }
+
+export function isUnknownElement (tag?: string): boolean {
+  return false
+}
+
+export function query (el: string | Element, document: Object) {
+  // document is injected by weex factory wrapper
+  const placeholder = document.createComment('root')
+  placeholder.hasAttribute = placeholder.removeAttribute = function () {} // hack for patch
+  document.documentElement.appendChild(placeholder)
+  return placeholder
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/util/index.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/util/index.js
new file mode 100644 (file)
index 0000000..8181d70
--- /dev/null
@@ -0,0 +1,40 @@
+/* @flow */
+declare var document: WeexDocument;
+
+import { warn } from 'core/util/index'
+
+export const RECYCLE_LIST_MARKER = '@inRecycleList'
+
+// Register the component hook to weex native render engine.
+// The hook will be triggered by native, not javascript.
+export function registerComponentHook (
+  componentId: string,
+  type: string, // hook type, could be "lifecycle" or "instance"
+  hook: string, // hook name
+  fn: Function
+) {
+  if (!document || !document.taskCenter) {
+    warn(`Can't find available "document" or "taskCenter".`)
+    return
+  }
+  if (typeof document.taskCenter.registerHook === 'function') {
+    return document.taskCenter.registerHook(componentId, type, hook, fn)
+  }
+  warn(`Failed to register component hook "${type}@${hook}#${componentId}".`)
+}
+
+// Updates the state of the component to weex native render engine.
+export function updateComponentData (
+  componentId: string,
+  newData: Object | void,
+  callback?: Function
+) {
+  if (!document || !document.taskCenter) {
+    warn(`Can't find available "document" or "taskCenter".`)
+    return
+  }
+  if (typeof document.taskCenter.updateData === 'function') {
+    return document.taskCenter.updateData(componentId, newData, callback)
+  }
+  warn(`Failed to update component data (${componentId}).`)
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/util/parser.js b/advancedcontentfilter/vendor/asset/vue/src/platforms/weex/util/parser.js
new file mode 100644 (file)
index 0000000..081908e
--- /dev/null
@@ -0,0 +1,60 @@
+/* @flow */
+
+// import { warn } from 'core/util/index'
+
+// this will be preserved during build
+// $flow-disable-line
+const acorn = require('acorn') // $flow-disable-line
+const walk = require('acorn/dist/walk') // $flow-disable-line
+const escodegen = require('escodegen')
+
+export function nodeToBinding (node: Object): any {
+  switch (node.type) {
+    case 'Literal': return node.value
+    case 'Identifier':
+    case 'UnaryExpression':
+    case 'BinaryExpression':
+    case 'LogicalExpression':
+    case 'ConditionalExpression':
+    case 'MemberExpression': return { '@binding': escodegen.generate(node) }
+    case 'ArrayExpression': return node.elements.map(_ => nodeToBinding(_))
+    case 'ObjectExpression': {
+      const object = {}
+      node.properties.forEach(prop => {
+        if (!prop.key || prop.key.type !== 'Identifier') {
+          return
+        }
+        const key = escodegen.generate(prop.key)
+        const value = nodeToBinding(prop.value)
+        if (key && value) {
+          object[key] = value
+        }
+      })
+      return object
+    }
+    default: {
+      // warn(`Not support ${node.type}: "${escodegen.generate(node)}"`)
+      return ''
+    }
+  }
+}
+
+export function generateBinding (exp: ?string): any {
+  if (exp && typeof exp === 'string') {
+    let ast = null
+    try {
+      ast = acorn.parse(`(${exp})`)
+    } catch (e) {
+      // warn(`Failed to parse the expression: "${exp}"`)
+      return ''
+    }
+
+    let output = ''
+    walk.simple(ast, {
+      Expression (node) {
+        output = nodeToBinding(node)
+      }
+    })
+    return output
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/server/bundle-renderer/create-bundle-renderer.js b/advancedcontentfilter/vendor/asset/vue/src/server/bundle-renderer/create-bundle-renderer.js
new file mode 100644 (file)
index 0000000..05c60c3
--- /dev/null
@@ -0,0 +1,151 @@
+/* @flow */
+
+import { createPromiseCallback } from '../util'
+import { createBundleRunner } from './create-bundle-runner'
+import type { Renderer, RenderOptions } from '../create-renderer'
+import { createSourceMapConsumers, rewriteErrorTrace } from './source-map-support'
+
+const fs = require('fs')
+const path = require('path')
+const PassThrough = require('stream').PassThrough
+
+const INVALID_MSG =
+  'Invalid server-rendering bundle format. Should be a string ' +
+  'or a bundle Object of type:\n\n' +
+`{
+  entry: string;
+  files: { [filename: string]: string; };
+  maps: { [filename: string]: string; };
+}\n`
+
+// The render bundle can either be a string (single bundled file)
+// or a bundle manifest object generated by vue-ssr-webpack-plugin.
+type RenderBundle = {
+  basedir?: string;
+  entry: string;
+  files: { [filename: string]: string; };
+  maps: { [filename: string]: string; };
+  modules?: { [filename: string]: Array<string> };
+};
+
+export function createBundleRendererCreator (
+  createRenderer: (options?: RenderOptions) => Renderer
+) {
+  return function createBundleRenderer (
+    bundle: string | RenderBundle,
+    rendererOptions?: RenderOptions = {}
+  ) {
+    let files, entry, maps
+    let basedir = rendererOptions.basedir
+
+    // load bundle if given filepath
+    if (
+      typeof bundle === 'string' &&
+      /\.js(on)?$/.test(bundle) &&
+      path.isAbsolute(bundle)
+    ) {
+      if (fs.existsSync(bundle)) {
+        const isJSON = /\.json$/.test(bundle)
+        basedir = basedir || path.dirname(bundle)
+        bundle = fs.readFileSync(bundle, 'utf-8')
+        if (isJSON) {
+          try {
+            bundle = JSON.parse(bundle)
+          } catch (e) {
+            throw new Error(`Invalid JSON bundle file: ${bundle}`)
+          }
+        }
+      } else {
+        throw new Error(`Cannot locate bundle file: ${bundle}`)
+      }
+    }
+
+    if (typeof bundle === 'object') {
+      entry = bundle.entry
+      files = bundle.files
+      basedir = basedir || bundle.basedir
+      maps = createSourceMapConsumers(bundle.maps)
+      if (typeof entry !== 'string' || typeof files !== 'object') {
+        throw new Error(INVALID_MSG)
+      }
+    } else if (typeof bundle === 'string') {
+      entry = '__vue_ssr_bundle__'
+      files = { '__vue_ssr_bundle__': bundle }
+      maps = {}
+    } else {
+      throw new Error(INVALID_MSG)
+    }
+
+    const renderer = createRenderer(rendererOptions)
+
+    const run = createBundleRunner(
+      entry,
+      files,
+      basedir,
+      rendererOptions.runInNewContext
+    )
+
+    return {
+      renderToString: (context?: Object, cb: any) => {
+        if (typeof context === 'function') {
+          cb = context
+          context = {}
+        }
+
+        let promise
+        if (!cb) {
+          ({ promise, cb } = createPromiseCallback())
+        }
+
+        run(context).catch(err => {
+          rewriteErrorTrace(err, maps)
+          cb(err)
+        }).then(app => {
+          if (app) {
+            renderer.renderToString(app, context, (err, res) => {
+              rewriteErrorTrace(err, maps)
+              cb(err, res)
+            })
+          }
+        })
+
+        return promise
+      },
+
+      renderToStream: (context?: Object) => {
+        const res = new PassThrough()
+        run(context).catch(err => {
+          rewriteErrorTrace(err, maps)
+          // avoid emitting synchronously before user can
+          // attach error listener
+          process.nextTick(() => {
+            res.emit('error', err)
+          })
+        }).then(app => {
+          if (app) {
+            const renderStream = renderer.renderToStream(app, context)
+
+            renderStream.on('error', err => {
+              rewriteErrorTrace(err, maps)
+              res.emit('error', err)
+            })
+
+            // relay HTMLStream special events
+            if (rendererOptions && rendererOptions.template) {
+              renderStream.on('beforeStart', () => {
+                res.emit('beforeStart')
+              })
+              renderStream.on('beforeEnd', () => {
+                res.emit('beforeEnd')
+              })
+            }
+
+            renderStream.pipe(res)
+          }
+        })
+
+        return res
+      }
+    }
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/server/bundle-renderer/create-bundle-runner.js b/advancedcontentfilter/vendor/asset/vue/src/server/bundle-renderer/create-bundle-runner.js
new file mode 100644 (file)
index 0000000..16c33c4
--- /dev/null
@@ -0,0 +1,150 @@
+import { isPlainObject } from 'shared/util'
+
+const vm = require('vm')
+const path = require('path')
+const resolve = require('resolve')
+const NativeModule = require('module')
+
+function createSandbox (context) {
+  const sandbox = {
+    Buffer,
+    console,
+    process,
+    setTimeout,
+    setInterval,
+    setImmediate,
+    clearTimeout,
+    clearInterval,
+    clearImmediate,
+    __VUE_SSR_CONTEXT__: context
+  }
+  sandbox.global = sandbox
+  return sandbox
+}
+
+function compileModule (files, basedir, runInNewContext) {
+  const compiledScripts = {}
+  const resolvedModules = {}
+
+  function getCompiledScript (filename) {
+    if (compiledScripts[filename]) {
+      return compiledScripts[filename]
+    }
+    const code = files[filename]
+    const wrapper = NativeModule.wrap(code)
+    const script = new vm.Script(wrapper, {
+      filename,
+      displayErrors: true
+    })
+    compiledScripts[filename] = script
+    return script
+  }
+
+  function evaluateModule (filename, sandbox, evaluatedFiles = {}) {
+    if (evaluatedFiles[filename]) {
+      return evaluatedFiles[filename]
+    }
+
+    const script = getCompiledScript(filename)
+    const compiledWrapper = runInNewContext === false
+      ? script.runInThisContext()
+      : script.runInNewContext(sandbox)
+    const m = { exports: {}}
+    const r = file => {
+      file = path.posix.join('.', file)
+      if (files[file]) {
+        return evaluateModule(file, sandbox, evaluatedFiles)
+      } else if (basedir) {
+        return require(
+          resolvedModules[file] ||
+          (resolvedModules[file] = resolve.sync(file, { basedir }))
+        )
+      } else {
+        return require(file)
+      }
+    }
+    compiledWrapper.call(m.exports, m.exports, r, m)
+
+    const res = Object.prototype.hasOwnProperty.call(m.exports, 'default')
+      ? m.exports.default
+      : m.exports
+    evaluatedFiles[filename] = res
+    return res
+  }
+  return evaluateModule
+}
+
+function deepClone (val) {
+  if (isPlainObject(val)) {
+    const res = {}
+    for (const key in val) {
+      res[key] = deepClone(val[key])
+    }
+    return res
+  } else if (Array.isArray(val)) {
+    return val.slice()
+  } else {
+    return val
+  }
+}
+
+export function createBundleRunner (entry, files, basedir, runInNewContext) {
+  const evaluate = compileModule(files, basedir, runInNewContext)
+  if (runInNewContext !== false && runInNewContext !== 'once') {
+    // new context mode: creates a fresh context and re-evaluate the bundle
+    // on each render. Ensures entire application state is fresh for each
+    // render, but incurs extra evaluation cost.
+    return (userContext = {}) => new Promise(resolve => {
+      userContext._registeredComponents = new Set()
+      const res = evaluate(entry, createSandbox(userContext))
+      resolve(typeof res === 'function' ? res(userContext) : res)
+    })
+  } else {
+    // direct mode: instead of re-evaluating the whole bundle on
+    // each render, it simply calls the exported function. This avoids the
+    // module evaluation costs but requires the source code to be structured
+    // slightly differently.
+    let runner // lazy creation so that errors can be caught by user
+    let initialContext
+    return (userContext = {}) => new Promise(resolve => {
+      if (!runner) {
+        const sandbox = runInNewContext === 'once'
+          ? createSandbox()
+          : global
+        // the initial context is only used for collecting possible non-component
+        // styles injected by vue-style-loader.
+        initialContext = sandbox.__VUE_SSR_CONTEXT__ = {}
+        runner = evaluate(entry, sandbox)
+        // On subsequent renders, __VUE_SSR_CONTEXT__ will not be available
+        // to prevent cross-request pollution.
+        delete sandbox.__VUE_SSR_CONTEXT__
+        if (typeof runner !== 'function') {
+          throw new Error(
+            'bundle export should be a function when using ' +
+            '{ runInNewContext: false }.'
+          )
+        }
+      }
+      userContext._registeredComponents = new Set()
+
+      // vue-style-loader styles imported outside of component lifecycle hooks
+      if (initialContext._styles) {
+        userContext._styles = deepClone(initialContext._styles)
+        // #6353 ensure "styles" is exposed even if no styles are injected
+        // in component lifecycles.
+        // the renderStyles fn is exposed by vue-style-loader >= 3.0.3
+        const renderStyles = initialContext._renderStyles
+        if (renderStyles) {
+          Object.defineProperty(userContext, 'styles', {
+            enumerable: true,
+            get () {
+              return renderStyles(userContext._styles)
+            }
+          })
+        }
+      }
+
+      resolve(runner(userContext))
+    })
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/server/bundle-renderer/source-map-support.js b/advancedcontentfilter/vendor/asset/vue/src/server/bundle-renderer/source-map-support.js
new file mode 100644 (file)
index 0000000..1010532
--- /dev/null
@@ -0,0 +1,45 @@
+/* @flow */
+
+const SourceMapConsumer = require('source-map').SourceMapConsumer
+
+const filenameRE = /\(([^)]+\.js):(\d+):(\d+)\)$/
+
+export function createSourceMapConsumers (rawMaps: Object) {
+  const maps = {}
+  Object.keys(rawMaps).forEach(file => {
+    maps[file] = new SourceMapConsumer(rawMaps[file])
+  })
+  return maps
+}
+
+export function rewriteErrorTrace (e: any, mapConsumers: {
+  [key: string]: SourceMapConsumer
+}) {
+  if (e && typeof e.stack === 'string') {
+    e.stack = e.stack.split('\n').map(line => {
+      return rewriteTraceLine(line, mapConsumers)
+    }).join('\n')
+  }
+}
+
+function rewriteTraceLine (trace: string, mapConsumers: {
+  [key: string]: SourceMapConsumer
+}) {
+  const m = trace.match(filenameRE)
+  const map = m && mapConsumers[m[1]]
+  if (m != null && map) {
+    const originalPosition = map.originalPositionFor({
+      line: Number(m[2]),
+      column: Number(m[3])
+    })
+    if (originalPosition.source != null) {
+      const { source, line, column } = originalPosition
+      const mappedPosition = `(${source.replace(/^webpack:\/\/\//, '')}:${String(line)}:${String(column)})`
+      return trace.replace(filenameRE, mappedPosition)
+    } else {
+      return trace
+    }
+  } else {
+    return trace
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/server/create-basic-renderer.js b/advancedcontentfilter/vendor/asset/vue/src/server/create-basic-renderer.js
new file mode 100644 (file)
index 0000000..2d53976
--- /dev/null
@@ -0,0 +1,37 @@
+/* @flow */
+
+import { createWriteFunction } from './write'
+import { createRenderFunction } from './render'
+import type { RenderOptions } from './create-renderer'
+
+export function createBasicRenderer ({
+  modules = [],
+  directives = {},
+  isUnaryTag = (() => false),
+  cache
+}: RenderOptions = {}) {
+  const render = createRenderFunction(modules, directives, isUnaryTag, cache)
+
+  return function renderToString (
+    component: Component,
+    context: any,
+    done: any
+  ): void {
+    if (typeof context === 'function') {
+      done = context
+      context = {}
+    }
+    let result = ''
+    const write = createWriteFunction(text => {
+      result += text
+      return false
+    }, done)
+    try {
+      render(component, write, context, () => {
+        done(null, result)
+      })
+    } catch (e) {
+      done(e)
+    }
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/server/create-renderer.js b/advancedcontentfilter/vendor/asset/vue/src/server/create-renderer.js
new file mode 100644 (file)
index 0000000..c045a42
--- /dev/null
@@ -0,0 +1,120 @@
+/* @flow */
+
+import RenderStream from './render-stream'
+import { createWriteFunction } from './write'
+import { createRenderFunction } from './render'
+import { createPromiseCallback } from './util'
+import TemplateRenderer from './template-renderer/index'
+import type { ClientManifest } from './template-renderer/index'
+
+export type Renderer = {
+  renderToString: (component: Component, context: any, cb: any) => ?Promise<string>;
+  renderToStream: (component: Component, context?: Object) => stream$Readable;
+};
+
+type RenderCache = {
+  get: (key: string, cb?: Function) => string | void;
+  set: (key: string, val: string) => void;
+  has?: (key: string, cb?: Function) => boolean | void;
+};
+
+export type RenderOptions = {
+  modules?: Array<(vnode: VNode) => ?string>;
+  directives?: Object;
+  isUnaryTag?: Function;
+  cache?: RenderCache;
+  template?: string;
+  inject?: boolean;
+  basedir?: string;
+  shouldPreload?: Function;
+  shouldPrefetch?: Function;
+  clientManifest?: ClientManifest;
+  runInNewContext?: boolean | 'once';
+};
+
+export function createRenderer ({
+  modules = [],
+  directives = {},
+  isUnaryTag = (() => false),
+  template,
+  inject,
+  cache,
+  shouldPreload,
+  shouldPrefetch,
+  clientManifest
+}: RenderOptions = {}): Renderer {
+  const render = createRenderFunction(modules, directives, isUnaryTag, cache)
+  const templateRenderer = new TemplateRenderer({
+    template,
+    inject,
+    shouldPreload,
+    shouldPrefetch,
+    clientManifest
+  })
+
+  return {
+    renderToString (
+      component: Component,
+      context: any,
+      cb: any
+    ): ?Promise<string> {
+      if (typeof context === 'function') {
+        cb = context
+        context = {}
+      }
+      if (context) {
+        templateRenderer.bindRenderFns(context)
+      }
+
+      // no callback, return Promise
+      let promise
+      if (!cb) {
+        ({ promise, cb } = createPromiseCallback())
+      }
+
+      let result = ''
+      const write = createWriteFunction(text => {
+        result += text
+        return false
+      }, cb)
+      try {
+        render(component, write, context, err => {
+          if (template) {
+            result = templateRenderer.renderSync(result, context)
+          }
+          if (err) {
+            cb(err)
+          } else {
+            cb(null, result)
+          }
+        })
+      } catch (e) {
+        cb(e)
+      }
+
+      return promise
+    },
+
+    renderToStream (
+      component: Component,
+      context?: Object
+    ): stream$Readable {
+      if (context) {
+        templateRenderer.bindRenderFns(context)
+      }
+      const renderStream = new RenderStream((write, done) => {
+        render(component, write, context, done)
+      })
+      if (!template) {
+        return renderStream
+      } else {
+        const templateStream = templateRenderer.createStream(context)
+        renderStream.on('error', err => {
+          templateStream.emit('error', err)
+        })
+        renderStream.pipe(templateStream)
+        return templateStream
+      }
+    }
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/server/optimizing-compiler/codegen.js b/advancedcontentfilter/vendor/asset/vue/src/server/optimizing-compiler/codegen.js
new file mode 100644 (file)
index 0000000..26097c0
--- /dev/null
@@ -0,0 +1,260 @@
+/* @flow */
+
+// The SSR codegen is essentially extending the default codegen to handle
+// SSR-optimizable nodes and turn them into string render fns. In cases where
+// a node is not optimizable it simply falls back to the default codegen.
+
+import {
+  genIf,
+  genFor,
+  genData,
+  genText,
+  genElement,
+  genChildren,
+  CodegenState
+} from 'compiler/codegen/index'
+
+import {
+  genAttrSegments,
+  genDOMPropSegments,
+  genClassSegments,
+  genStyleSegments,
+  applyModelTransform
+} from './modules'
+
+import { escape } from 'web/server/util'
+import { optimizability } from './optimizer'
+import type { CodegenResult } from 'compiler/codegen/index'
+
+export type StringSegment = {
+  type: number;
+  value: string;
+};
+
+// segment types
+export const RAW = 0
+export const INTERPOLATION = 1
+export const EXPRESSION = 2
+
+export function generate (
+  ast: ASTElement | void,
+  options: CompilerOptions
+): CodegenResult {
+  const state = new CodegenState(options)
+  const code = ast ? genSSRElement(ast, state) : '_c("div")'
+  return {
+    render: `with(this){return ${code}}`,
+    staticRenderFns: state.staticRenderFns
+  }
+}
+
+function genSSRElement (el: ASTElement, state: CodegenState): string {
+  if (el.for && !el.forProcessed) {
+    return genFor(el, state, genSSRElement)
+  } else if (el.if && !el.ifProcessed) {
+    return genIf(el, state, genSSRElement)
+  } else if (el.tag === 'template' && !el.slotTarget) {
+    return el.ssrOptimizability === optimizability.FULL
+      ? genChildrenAsStringNode(el, state)
+      : genSSRChildren(el, state) || 'void 0'
+  }
+
+  switch (el.ssrOptimizability) {
+    case optimizability.FULL:
+      // stringify whole tree
+      return genStringElement(el, state)
+    case optimizability.SELF:
+      // stringify self and check children
+      return genStringElementWithChildren(el, state)
+    case optimizability.CHILDREN:
+      // generate self as VNode and stringify children
+      return genNormalElement(el, state, true)
+    case optimizability.PARTIAL:
+      // generate self as VNode and check children
+      return genNormalElement(el, state, false)
+    default:
+      // bail whole tree
+      return genElement(el, state)
+  }
+}
+
+function genNormalElement (el, state, stringifyChildren) {
+  const data = el.plain ? undefined : genData(el, state)
+  const children = stringifyChildren
+    ? `[${genChildrenAsStringNode(el, state)}]`
+    : genSSRChildren(el, state, true)
+  return `_c('${el.tag}'${
+    data ? `,${data}` : ''
+  }${
+    children ? `,${children}` : ''
+  })`
+}
+
+function genSSRChildren (el, state, checkSkip) {
+  return genChildren(el, state, checkSkip, genSSRElement, genSSRNode)
+}
+
+function genSSRNode (el, state) {
+  return el.type === 1
+    ? genSSRElement(el, state)
+    : genText(el)
+}
+
+function genChildrenAsStringNode (el, state) {
+  return el.children.length
+    ? `_ssrNode(${flattenSegments(childrenToSegments(el, state))})`
+    : ''
+}
+
+function genStringElement (el, state) {
+  return `_ssrNode(${elementToString(el, state)})`
+}
+
+function genStringElementWithChildren (el, state) {
+  const children = genSSRChildren(el, state, true)
+  return `_ssrNode(${
+    flattenSegments(elementToOpenTagSegments(el, state))
+  },"</${el.tag}>"${
+    children ? `,${children}` : ''
+  })`
+}
+
+function elementToString (el, state) {
+  return `(${flattenSegments(elementToSegments(el, state))})`
+}
+
+function elementToSegments (el, state): Array<StringSegment> {
+  // v-for / v-if
+  if (el.for && !el.forProcessed) {
+    el.forProcessed = true
+    return [{
+      type: EXPRESSION,
+      value: genFor(el, state, elementToString, '_ssrList')
+    }]
+  } else if (el.if && !el.ifProcessed) {
+    el.ifProcessed = true
+    return [{
+      type: EXPRESSION,
+      value: genIf(el, state, elementToString, '"<!---->"')
+    }]
+  } else if (el.tag === 'template') {
+    return childrenToSegments(el, state)
+  }
+
+  const openSegments = elementToOpenTagSegments(el, state)
+  const childrenSegments = childrenToSegments(el, state)
+  const { isUnaryTag } = state.options
+  const close = (isUnaryTag && isUnaryTag(el.tag))
+    ? []
+    : [{ type: RAW, value: `</${el.tag}>` }]
+  return openSegments.concat(childrenSegments, close)
+}
+
+function elementToOpenTagSegments (el, state): Array<StringSegment> {
+  applyModelTransform(el, state)
+  let binding
+  const segments = [{ type: RAW, value: `<${el.tag}` }]
+  // attrs
+  if (el.attrs) {
+    segments.push.apply(segments, genAttrSegments(el.attrs))
+  }
+  // domProps
+  if (el.props) {
+    segments.push.apply(segments, genDOMPropSegments(el.props, el.attrs))
+  }
+  // v-bind="object"
+  if ((binding = el.attrsMap['v-bind'])) {
+    segments.push({ type: EXPRESSION, value: `_ssrAttrs(${binding})` })
+  }
+  // v-bind.prop="object"
+  if ((binding = el.attrsMap['v-bind.prop'])) {
+    segments.push({ type: EXPRESSION, value: `_ssrDOMProps(${binding})` })
+  }
+  // class
+  if (el.staticClass || el.classBinding) {
+    segments.push.apply(
+      segments,
+      genClassSegments(el.staticClass, el.classBinding)
+    )
+  }
+  // style & v-show
+  if (el.staticStyle || el.styleBinding || el.attrsMap['v-show']) {
+    segments.push.apply(
+      segments,
+      genStyleSegments(
+        el.attrsMap.style,
+        el.staticStyle,
+        el.styleBinding,
+        el.attrsMap['v-show']
+      )
+    )
+  }
+  // _scopedId
+  if (state.options.scopeId) {
+    segments.push({ type: RAW, value: ` ${state.options.scopeId}` })
+  }
+  segments.push({ type: RAW, value: `>` })
+  return segments
+}
+
+function childrenToSegments (el, state): Array<StringSegment> {
+  let binding
+  if ((binding = el.attrsMap['v-html'])) {
+    return [{ type: EXPRESSION, value: `_s(${binding})` }]
+  }
+  if ((binding = el.attrsMap['v-text'])) {
+    return [{ type: INTERPOLATION, value: `_s(${binding})` }]
+  }
+  if (el.tag === 'textarea' && (binding = el.attrsMap['v-model'])) {
+    return [{ type: INTERPOLATION, value: `_s(${binding})` }]
+  }
+  return el.children
+    ? nodesToSegments(el.children, state)
+    : []
+}
+
+function nodesToSegments (
+  children: Array<ASTNode>,
+  state: CodegenState
+): Array<StringSegment> {
+  const segments = []
+  for (let i = 0; i < children.length; i++) {
+    const c = children[i]
+    if (c.type === 1) {
+      segments.push.apply(segments, elementToSegments(c, state))
+    } else if (c.type === 2) {
+      segments.push({ type: INTERPOLATION, value: c.expression })
+    } else if (c.type === 3) {
+      segments.push({ type: RAW, value: escape(c.text) })
+    }
+  }
+  return segments
+}
+
+function flattenSegments (segments: Array<StringSegment>): string {
+  const mergedSegments = []
+  let textBuffer = ''
+
+  const pushBuffer = () => {
+    if (textBuffer) {
+      mergedSegments.push(JSON.stringify(textBuffer))
+      textBuffer = ''
+    }
+  }
+
+  for (let i = 0; i < segments.length; i++) {
+    const s = segments[i]
+    if (s.type === RAW) {
+      textBuffer += s.value
+    } else if (s.type === INTERPOLATION) {
+      pushBuffer()
+      mergedSegments.push(`_ssrEscape(${s.value})`)
+    } else if (s.type === EXPRESSION) {
+      pushBuffer()
+      mergedSegments.push(`(${s.value})`)
+    }
+  }
+  pushBuffer()
+
+  return mergedSegments.join('+')
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/server/optimizing-compiler/index.js b/advancedcontentfilter/vendor/asset/vue/src/server/optimizing-compiler/index.js
new file mode 100644 (file)
index 0000000..893630d
--- /dev/null
@@ -0,0 +1,20 @@
+/* @flow */
+
+import { parse } from 'compiler/parser/index'
+import { generate } from './codegen'
+import { optimize } from './optimizer'
+import { createCompilerCreator } from 'compiler/create-compiler'
+
+export const createCompiler = createCompilerCreator(function baseCompile (
+  template: string,
+  options: CompilerOptions
+): CompiledResult {
+  const ast = parse(template.trim(), options)
+  optimize(ast, options)
+  const code = generate(ast, options)
+  return {
+    ast,
+    render: code.render,
+    staticRenderFns: code.staticRenderFns
+  }
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/src/server/optimizing-compiler/modules.js b/advancedcontentfilter/vendor/asset/vue/src/server/optimizing-compiler/modules.js
new file mode 100644 (file)
index 0000000..69a7be8
--- /dev/null
@@ -0,0 +1,126 @@
+/* @flow */
+
+import {
+  RAW,
+  // INTERPOLATION,
+  EXPRESSION
+} from './codegen'
+
+import {
+  propsToAttrMap,
+  isRenderableAttr
+} from 'web/server/util'
+
+import {
+  isBooleanAttr,
+  isEnumeratedAttr
+} from 'web/util/attrs'
+
+import type { StringSegment } from './codegen'
+import type { CodegenState } from 'compiler/codegen/index'
+
+type Attr = { name: string; value: string };
+
+const plainStringRE = /^"(?:[^"\\]|\\.)*"$|^'(?:[^'\\]|\\.)*'$/
+
+// let the model AST transform translate v-model into appropriate
+// props bindings
+export function applyModelTransform (el: ASTElement, state: CodegenState) {
+  if (el.directives) {
+    for (let i = 0; i < el.directives.length; i++) {
+      const dir = el.directives[i]
+      if (dir.name === 'model') {
+        state.directives.model(el, dir, state.warn)
+        // remove value for textarea as its converted to text
+        if (el.tag === 'textarea' && el.props) {
+          el.props = el.props.filter(p => p.name !== 'value')
+        }
+        break
+      }
+    }
+  }
+}
+
+export function genAttrSegments (
+  attrs: Array<Attr>
+): Array<StringSegment> {
+  return attrs.map(({ name, value }) => genAttrSegment(name, value))
+}
+
+export function genDOMPropSegments (
+  props: Array<Attr>,
+  attrs: ?Array<Attr>
+): Array<StringSegment> {
+  const segments = []
+  props.forEach(({ name, value }) => {
+    name = propsToAttrMap[name] || name.toLowerCase()
+    if (isRenderableAttr(name) &&
+      !(attrs && attrs.some(a => a.name === name))
+    ) {
+      segments.push(genAttrSegment(name, value))
+    }
+  })
+  return segments
+}
+
+function genAttrSegment (name: string, value: string): StringSegment {
+  if (plainStringRE.test(value)) {
+    // force double quote
+    value = value.replace(/^'|'$/g, '"')
+    // force enumerated attr to "true"
+    if (isEnumeratedAttr(name) && value !== `"false"`) {
+      value = `"true"`
+    }
+    return {
+      type: RAW,
+      value: isBooleanAttr(name)
+        ? ` ${name}="${name}"`
+        : value === '""'
+          ? ` ${name}`
+          : ` ${name}="${JSON.parse(value)}"`
+    }
+  } else {
+    return {
+      type: EXPRESSION,
+      value: `_ssrAttr(${JSON.stringify(name)},${value})`
+    }
+  }
+}
+
+export function genClassSegments (
+  staticClass: ?string,
+  classBinding: ?string
+): Array<StringSegment> {
+  if (staticClass && !classBinding) {
+    return [{ type: RAW, value: ` class=${staticClass}` }]
+  } else {
+    return [{
+      type: EXPRESSION,
+      value: `_ssrClass(${staticClass || 'null'},${classBinding || 'null'})`
+    }]
+  }
+}
+
+export function genStyleSegments (
+  staticStyle: ?string,
+  parsedStaticStyle: ?string,
+  styleBinding: ?string,
+  vShowExpression: ?string
+): Array<StringSegment> {
+  if (staticStyle && !styleBinding && !vShowExpression) {
+    return [{ type: RAW, value: ` style=${JSON.stringify(staticStyle)}` }]
+  } else {
+    return [{
+      type: EXPRESSION,
+      value: `_ssrStyle(${
+        parsedStaticStyle || 'null'
+      },${
+        styleBinding || 'null'
+      }, ${
+        vShowExpression
+          ? `{ display: (${vShowExpression}) ? '' : 'none' }`
+          : 'null'
+      })`
+    }]
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/server/optimizing-compiler/optimizer.js b/advancedcontentfilter/vendor/asset/vue/src/server/optimizing-compiler/optimizer.js
new file mode 100644 (file)
index 0000000..d24acc5
--- /dev/null
@@ -0,0 +1,140 @@
+/* @flow */
+
+/**
+ * In SSR, the vdom tree is generated only once and never patched, so
+ * we can optimize most element / trees into plain string render functions.
+ * The SSR optimizer walks the AST tree to detect optimizable elements and trees.
+ *
+ * The criteria for SSR optimizability is quite a bit looser than static tree
+ * detection (which is designed for client re-render). In SSR we bail only for
+ * components/slots/custom directives.
+ */
+
+import { no, makeMap, isBuiltInTag } from 'shared/util'
+
+// optimizability constants
+export const optimizability = {
+  FALSE: 0,    // whole sub tree un-optimizable
+  FULL: 1,     // whole sub tree optimizable
+  SELF: 2,     // self optimizable but has some un-optimizable children
+  CHILDREN: 3, // self un-optimizable but have fully optimizable children
+  PARTIAL: 4   // self un-optimizable with some un-optimizable children
+}
+
+let isPlatformReservedTag
+
+export function optimize (root: ?ASTElement, options: CompilerOptions) {
+  if (!root) return
+  isPlatformReservedTag = options.isReservedTag || no
+  walk(root, true)
+}
+
+function walk (node: ASTNode, isRoot?: boolean) {
+  if (isUnOptimizableTree(node)) {
+    node.ssrOptimizability = optimizability.FALSE
+    return
+  }
+  // root node or nodes with custom directives should always be a VNode
+  const selfUnoptimizable = isRoot || hasCustomDirective(node)
+  const check = child => {
+    if (child.ssrOptimizability !== optimizability.FULL) {
+      node.ssrOptimizability = selfUnoptimizable
+        ? optimizability.PARTIAL
+        : optimizability.SELF
+    }
+  }
+  if (selfUnoptimizable) {
+    node.ssrOptimizability = optimizability.CHILDREN
+  }
+  if (node.type === 1) {
+    for (let i = 0, l = node.children.length; i < l; i++) {
+      const child = node.children[i]
+      walk(child)
+      check(child)
+    }
+    if (node.ifConditions) {
+      for (let i = 1, l = node.ifConditions.length; i < l; i++) {
+        const block = node.ifConditions[i].block
+        walk(block, isRoot)
+        check(block)
+      }
+    }
+    if (node.ssrOptimizability == null ||
+      (!isRoot && (node.attrsMap['v-html'] || node.attrsMap['v-text']))
+    ) {
+      node.ssrOptimizability = optimizability.FULL
+    } else {
+      node.children = optimizeSiblings(node)
+    }
+  } else {
+    node.ssrOptimizability = optimizability.FULL
+  }
+}
+
+function optimizeSiblings (el) {
+  const children = el.children
+  const optimizedChildren = []
+
+  let currentOptimizableGroup = []
+  const pushGroup = () => {
+    if (currentOptimizableGroup.length) {
+      optimizedChildren.push({
+        type: 1,
+        parent: el,
+        tag: 'template',
+        attrsList: [],
+        attrsMap: {},
+        children: currentOptimizableGroup,
+        ssrOptimizability: optimizability.FULL
+      })
+    }
+    currentOptimizableGroup = []
+  }
+
+  for (let i = 0; i < children.length; i++) {
+    const c = children[i]
+    if (c.ssrOptimizability === optimizability.FULL) {
+      currentOptimizableGroup.push(c)
+    } else {
+      // wrap fully-optimizable adjacent siblings inside a template tag
+      // so that they can be optimized into a single ssrNode by codegen
+      pushGroup()
+      optimizedChildren.push(c)
+    }
+  }
+  pushGroup()
+  return optimizedChildren
+}
+
+function isUnOptimizableTree (node: ASTNode): boolean {
+  if (node.type === 2 || node.type === 3) { // text or expression
+    return false
+  }
+  return (
+    isBuiltInTag(node.tag) || // built-in (slot, component)
+    !isPlatformReservedTag(node.tag) || // custom component
+    !!node.component || // "is" component
+    isSelectWithModel(node) // <select v-model> requires runtime inspection
+  )
+}
+
+const isBuiltInDir = makeMap('text,html,show,on,bind,model,pre,cloak,once')
+
+function hasCustomDirective (node: ASTNode): ?boolean {
+  return (
+    node.type === 1 &&
+    node.directives &&
+    node.directives.some(d => !isBuiltInDir(d.name))
+  )
+}
+
+// <select v-model> cannot be optimized because it requires a runtime check
+// to determine proper selected option
+function isSelectWithModel (node: ASTNode): boolean {
+  return (
+    node.type === 1 &&
+    node.tag === 'select' &&
+    node.directives != null &&
+    node.directives.some(d => d.name === 'model')
+  )
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/server/optimizing-compiler/runtime-helpers.js b/advancedcontentfilter/vendor/asset/vue/src/server/optimizing-compiler/runtime-helpers.js
new file mode 100644 (file)
index 0000000..9abfe19
--- /dev/null
@@ -0,0 +1,147 @@
+/* @flow */
+
+import { escape } from 'web/server/util'
+import { isObject, extend } from 'shared/util'
+import { renderAttr } from 'web/server/modules/attrs'
+import { renderClass } from 'web/util/class'
+import { genStyle } from 'web/server/modules/style'
+import { normalizeStyleBinding } from 'web/util/style'
+
+import {
+  normalizeChildren,
+  simpleNormalizeChildren
+} from 'core/vdom/helpers/normalize-children'
+
+import {
+  propsToAttrMap,
+  isRenderableAttr
+} from 'web/server/util'
+
+const ssrHelpers = {
+  _ssrEscape: escape,
+  _ssrNode: renderStringNode,
+  _ssrList: renderStringList,
+  _ssrAttr: renderAttr,
+  _ssrAttrs: renderAttrs,
+  _ssrDOMProps: renderDOMProps,
+  _ssrClass: renderSSRClass,
+  _ssrStyle: renderSSRStyle
+}
+
+export function installSSRHelpers (vm: Component) {
+  if (vm._ssrNode) {
+    return
+  }
+  let Vue = vm.constructor
+  while (Vue.super) {
+    Vue = Vue.super
+  }
+  extend(Vue.prototype, ssrHelpers)
+  if (Vue.FunctionalRenderContext) {
+    extend(Vue.FunctionalRenderContext.prototype, ssrHelpers)
+  }
+}
+
+class StringNode {
+  isString: boolean;
+  open: string;
+  close: ?string;
+  children: ?Array<any>;
+
+  constructor (
+    open: string,
+    close?: string,
+    children?: Array<any>,
+    normalizationType?: number
+  ) {
+    this.isString = true
+    this.open = open
+    this.close = close
+    if (children) {
+      this.children = normalizationType === 1
+        ? simpleNormalizeChildren(children)
+        : normalizationType === 2
+          ? normalizeChildren(children)
+          : children
+    } else {
+      this.children = void 0
+    }
+  }
+}
+
+function renderStringNode (
+  open: string,
+  close?: string,
+  children?: Array<any>,
+  normalizationType?: number
+): StringNode {
+  return new StringNode(open, close, children, normalizationType)
+}
+
+function renderStringList (
+  val: any,
+  render: (
+    val: any,
+    keyOrIndex: string | number,
+    index?: number
+  ) => string
+): string {
+  let ret = ''
+  let i, l, keys, key
+  if (Array.isArray(val) || typeof val === 'string') {
+    for (i = 0, l = val.length; i < l; i++) {
+      ret += render(val[i], i)
+    }
+  } else if (typeof val === 'number') {
+    for (i = 0; i < val; i++) {
+      ret += render(i + 1, i)
+    }
+  } else if (isObject(val)) {
+    keys = Object.keys(val)
+    for (i = 0, l = keys.length; i < l; i++) {
+      key = keys[i]
+      ret += render(val[key], key, i)
+    }
+  }
+  return ret
+}
+
+function renderAttrs (obj: Object): string {
+  let res = ''
+  for (const key in obj) {
+    res += renderAttr(key, obj[key])
+  }
+  return res
+}
+
+function renderDOMProps (obj: Object): string {
+  let res = ''
+  for (const key in obj) {
+    const attr = propsToAttrMap[key] || key.toLowerCase()
+    if (isRenderableAttr(attr)) {
+      res += renderAttr(attr, obj[key])
+    }
+  }
+  return res
+}
+
+function renderSSRClass (
+  staticClass: ?string,
+  dynamic: any
+): string {
+  const res = renderClass(staticClass, dynamic)
+  return res === '' ? res : ` class="${escape(res)}"`
+}
+
+function renderSSRStyle (
+  staticStyle: ?Object,
+  dynamic: any,
+  extra: ?Object
+): string {
+  const style = {}
+  if (staticStyle) extend(style, staticStyle)
+  if (dynamic) extend(style, normalizeStyleBinding(dynamic))
+  if (extra) extend(style, extra)
+  const res = genStyle(style)
+  return res === '' ? res : ` style=${JSON.stringify(escape(res))}`
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/server/render-context.js b/advancedcontentfilter/vendor/asset/vue/src/server/render-context.js
new file mode 100644 (file)
index 0000000..178140c
--- /dev/null
@@ -0,0 +1,130 @@
+/* @flow */
+
+import { isUndef } from 'shared/util'
+
+type RenderState = {
+  type: 'Element';
+  rendered: number;
+  total: number;
+  children: Array<VNode>;
+  endTag: string;
+} | {
+  type: 'Fragment';
+  rendered: number;
+  total: number;
+  children: Array<VNode>;
+} | {
+  type: 'Component';
+  prevActive: Component;
+} | {
+  type: 'ComponentWithCache';
+  buffer: Array<string>;
+  bufferIndex: number;
+  componentBuffer: Array<Set<Class<Component>>>;
+  key: string;
+};
+
+export class RenderContext {
+  userContext: ?Object;
+  activeInstance: Component;
+  renderStates: Array<RenderState>;
+  write: (text: string, next: Function) => void;
+  renderNode: (node: VNode, isRoot: boolean, context: RenderContext) => void;
+  next: () => void;
+  done: (err: ?Error) => void;
+
+  modules: Array<(node: VNode) => ?string>;
+  directives: Object;
+  isUnaryTag: (tag: string) => boolean;
+
+  cache: any;
+  get: ?(key: string, cb: Function) => void;
+  has: ?(key: string, cb: Function) => void;
+
+  constructor (options: Object) {
+    this.userContext = options.userContext
+    this.activeInstance = options.activeInstance
+    this.renderStates = []
+
+    this.write = options.write
+    this.done = options.done
+    this.renderNode = options.renderNode
+
+    this.isUnaryTag = options.isUnaryTag
+    this.modules = options.modules
+    this.directives = options.directives
+
+    const cache = options.cache
+    if (cache && (!cache.get || !cache.set)) {
+      throw new Error('renderer cache must implement at least get & set.')
+    }
+    this.cache = cache
+    this.get = cache && normalizeAsync(cache, 'get')
+    this.has = cache && normalizeAsync(cache, 'has')
+
+    this.next = this.next.bind(this)
+  }
+
+  next () {
+    const lastState = this.renderStates[this.renderStates.length - 1]
+    if (isUndef(lastState)) {
+      return this.done()
+    }
+    switch (lastState.type) {
+      case 'Element':
+      case 'Fragment':
+        const { children, total } = lastState
+        const rendered = lastState.rendered++
+        if (rendered < total) {
+          this.renderNode(children[rendered], false, this)
+        } else {
+          this.renderStates.pop()
+          if (lastState.type === 'Element') {
+            this.write(lastState.endTag, this.next)
+          } else {
+            this.next()
+          }
+        }
+        break
+      case 'Component':
+        this.renderStates.pop()
+        this.activeInstance = lastState.prevActive
+        this.next()
+        break
+      case 'ComponentWithCache':
+        this.renderStates.pop()
+        const { buffer, bufferIndex, componentBuffer, key } = lastState
+        const result = {
+          html: buffer[bufferIndex],
+          components: componentBuffer[bufferIndex]
+        }
+        this.cache.set(key, result)
+        if (bufferIndex === 0) {
+          // this is a top-level cached component,
+          // exit caching mode.
+          this.write.caching = false
+        } else {
+          // parent component is also being cached,
+          // merge self into parent's result
+          buffer[bufferIndex - 1] += result.html
+          const prev = componentBuffer[bufferIndex - 1]
+          result.components.forEach(c => prev.add(c))
+        }
+        buffer.length = bufferIndex
+        componentBuffer.length = bufferIndex
+        this.next()
+        break
+    }
+  }
+}
+
+function normalizeAsync (cache, method) {
+  const fn = cache[method]
+  if (isUndef(fn)) {
+    return
+  } else if (fn.length > 1) {
+    return (key, cb) => fn.call(cache, key, cb)
+  } else {
+    return (key, cb) => cb(fn.call(cache, key))
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/server/render-stream.js b/advancedcontentfilter/vendor/asset/vue/src/server/render-stream.js
new file mode 100644 (file)
index 0000000..d76012a
--- /dev/null
@@ -0,0 +1,94 @@
+/* @flow */
+
+/**
+ * Original RenderStream implementation by Sasha Aickin (@aickin)
+ * Licensed under the Apache License, Version 2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Modified by Evan You (@yyx990803)
+ */
+
+const stream = require('stream')
+
+import { isTrue, isUndef } from 'shared/util'
+import { createWriteFunction } from './write'
+
+export default class RenderStream extends stream.Readable {
+  buffer: string;
+  render: (write: Function, done: Function) => void;
+  expectedSize: number;
+  write: Function;
+  next: Function;
+  end: Function;
+  done: boolean;
+
+  constructor (render: Function) {
+    super()
+    this.buffer = ''
+    this.render = render
+    this.expectedSize = 0
+
+    this.write = createWriteFunction((text, next) => {
+      const n = this.expectedSize
+      this.buffer += text
+      if (this.buffer.length >= n) {
+        this.next = next
+        this.pushBySize(n)
+        return true // we will decide when to call next
+      }
+      return false
+    }, err => {
+      this.emit('error', err)
+    })
+
+    this.end = () => {
+      // the rendering is finished; we should push out the last of the buffer.
+      this.done = true
+      this.push(this.buffer)
+    }
+  }
+
+  pushBySize (n: number) {
+    const bufferToPush = this.buffer.substring(0, n)
+    this.buffer = this.buffer.substring(n)
+    this.push(bufferToPush)
+  }
+
+  tryRender () {
+    try {
+      this.render(this.write, this.end)
+    } catch (e) {
+      this.emit('error', e)
+    }
+  }
+
+  tryNext () {
+    try {
+      this.next()
+    } catch (e) {
+      this.emit('error', e)
+    }
+  }
+
+  _read (n: number) {
+    this.expectedSize = n
+    // it's possible that the last chunk added bumped the buffer up to > 2 * n,
+    // which means we will need to go through multiple read calls to drain it
+    // down to < n.
+    if (isTrue(this.done)) {
+      this.push(null)
+      return
+    }
+    if (this.buffer.length >= n) {
+      this.pushBySize(n)
+      return
+    }
+    if (isUndef(this.next)) {
+      // start the rendering chain.
+      this.tryRender()
+    } else {
+      // continue with the rendering.
+      this.tryNext()
+    }
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/server/render.js b/advancedcontentfilter/vendor/asset/vue/src/server/render.js
new file mode 100644 (file)
index 0000000..592a617
--- /dev/null
@@ -0,0 +1,396 @@
+/* @flow */
+
+import { escape } from 'web/server/util'
+import { SSR_ATTR } from 'shared/constants'
+import { RenderContext } from './render-context'
+import { generateComponentTrace } from 'core/util/debug'
+import { ssrCompileToFunctions } from 'web/server/compiler'
+import { installSSRHelpers } from './optimizing-compiler/runtime-helpers'
+
+import { isDef, isUndef, isTrue } from 'shared/util'
+
+import {
+  createComponent,
+  createComponentInstanceForVnode
+} from 'core/vdom/create-component'
+
+let warned = Object.create(null)
+const warnOnce = msg => {
+  if (!warned[msg]) {
+    warned[msg] = true
+    console.warn(`\n\u001b[31m${msg}\u001b[39m\n`)
+  }
+}
+
+const onCompilationError = (err, vm) => {
+  const trace = vm ? generateComponentTrace(vm) : ''
+  throw new Error(`\n\u001b[31m${err}${trace}\u001b[39m\n`)
+}
+
+const normalizeRender = vm => {
+  const { render, template, _scopeId } = vm.$options
+  if (isUndef(render)) {
+    if (template) {
+      const compiled = ssrCompileToFunctions(template, {
+        scopeId: _scopeId,
+        warn: onCompilationError
+      }, vm)
+
+      vm.$options.render = compiled.render
+      vm.$options.staticRenderFns = compiled.staticRenderFns
+    } else {
+      throw new Error(
+        `render function or template not defined in component: ${
+          vm.$options.name || vm.$options._componentTag || 'anonymous'
+        }`
+      )
+    }
+  }
+}
+
+function renderNode (node, isRoot, context) {
+  if (node.isString) {
+    renderStringNode(node, context)
+  } else if (isDef(node.componentOptions)) {
+    renderComponent(node, isRoot, context)
+  } else if (isDef(node.tag)) {
+    renderElement(node, isRoot, context)
+  } else if (isTrue(node.isComment)) {
+    if (isDef(node.asyncFactory)) {
+      // async component
+      renderAsyncComponent(node, isRoot, context)
+    } else {
+      context.write(`<!--${node.text}-->`, context.next)
+    }
+  } else {
+    context.write(
+      node.raw ? node.text : escape(String(node.text)),
+      context.next
+    )
+  }
+}
+
+function registerComponentForCache (options, write) {
+  // exposed by vue-loader, need to call this if cache hit because
+  // component lifecycle hooks will not be called.
+  const register = options._ssrRegister
+  if (write.caching && isDef(register)) {
+    write.componentBuffer[write.componentBuffer.length - 1].add(register)
+  }
+  return register
+}
+
+function renderComponent (node, isRoot, context) {
+  const { write, next, userContext } = context
+
+  // check cache hit
+  const Ctor = node.componentOptions.Ctor
+  const getKey = Ctor.options.serverCacheKey
+  const name = Ctor.options.name
+  const cache = context.cache
+  const registerComponent = registerComponentForCache(Ctor.options, write)
+
+  if (isDef(getKey) && isDef(cache) && isDef(name)) {
+    const key = name + '::' + getKey(node.componentOptions.propsData)
+    const { has, get } = context
+    if (isDef(has)) {
+      has(key, hit => {
+        if (hit === true && isDef(get)) {
+          get(key, res => {
+            if (isDef(registerComponent)) {
+              registerComponent(userContext)
+            }
+            res.components.forEach(register => register(userContext))
+            write(res.html, next)
+          })
+        } else {
+          renderComponentWithCache(node, isRoot, key, context)
+        }
+      })
+    } else if (isDef(get)) {
+      get(key, res => {
+        if (isDef(res)) {
+          if (isDef(registerComponent)) {
+            registerComponent(userContext)
+          }
+          res.components.forEach(register => register(userContext))
+          write(res.html, next)
+        } else {
+          renderComponentWithCache(node, isRoot, key, context)
+        }
+      })
+    }
+  } else {
+    if (isDef(getKey) && isUndef(cache)) {
+      warnOnce(
+        `[vue-server-renderer] Component ${
+          Ctor.options.name || '(anonymous)'
+        } implemented serverCacheKey, ` +
+        'but no cache was provided to the renderer.'
+      )
+    }
+    if (isDef(getKey) && isUndef(name)) {
+      warnOnce(
+        `[vue-server-renderer] Components that implement "serverCacheKey" ` +
+        `must also define a unique "name" option.`
+      )
+    }
+    renderComponentInner(node, isRoot, context)
+  }
+}
+
+function renderComponentWithCache (node, isRoot, key, context) {
+  const write = context.write
+  write.caching = true
+  const buffer = write.cacheBuffer
+  const bufferIndex = buffer.push('') - 1
+  const componentBuffer = write.componentBuffer
+  componentBuffer.push(new Set())
+  context.renderStates.push({
+    type: 'ComponentWithCache',
+    key,
+    buffer,
+    bufferIndex,
+    componentBuffer
+  })
+  renderComponentInner(node, isRoot, context)
+}
+
+function renderComponentInner (node, isRoot, context) {
+  const prevActive = context.activeInstance
+  // expose userContext on vnode
+  node.ssrContext = context.userContext
+  const child = context.activeInstance = createComponentInstanceForVnode(
+    node,
+    context.activeInstance
+  )
+  normalizeRender(child)
+  const childNode = child._render()
+  childNode.parent = node
+  context.renderStates.push({
+    type: 'Component',
+    prevActive
+  })
+  renderNode(childNode, isRoot, context)
+}
+
+function renderAsyncComponent (node, isRoot, context) {
+  const factory = node.asyncFactory
+
+  const resolve = comp => {
+    if (comp.__esModule && comp.default) {
+      comp = comp.default
+    }
+    const { data, children, tag } = node.asyncMeta
+    const nodeContext = node.asyncMeta.context
+    const resolvedNode: any = createComponent(
+      comp,
+      data,
+      nodeContext,
+      children,
+      tag
+    )
+    if (resolvedNode) {
+      if (resolvedNode.componentOptions) {
+        // normal component
+        renderComponent(resolvedNode, isRoot, context)
+      } else if (!Array.isArray(resolvedNode)) {
+        // single return node from functional component
+        renderNode(resolvedNode, isRoot, context)
+      } else {
+        // multiple return nodes from functional component
+        context.renderStates.push({
+          type: 'Fragment',
+          children: resolvedNode,
+          rendered: 0,
+          total: resolvedNode.length
+        })
+        context.next()
+      }
+    } else {
+      // invalid component, but this does not throw on the client
+      // so render empty comment node
+      context.write(`<!---->`, context.next)
+    }
+  }
+
+  if (factory.resolved) {
+    resolve(factory.resolved)
+    return
+  }
+
+  const reject = context.done
+  let res
+  try {
+    res = factory(resolve, reject)
+  } catch (e) {
+    reject(e)
+  }
+  if (res) {
+    if (typeof res.then === 'function') {
+      res.then(resolve, reject).catch(reject)
+    } else {
+      // new syntax in 2.3
+      const comp = res.component
+      if (comp && typeof comp.then === 'function') {
+        comp.then(resolve, reject).catch(reject)
+      }
+    }
+  }
+}
+
+function renderStringNode (el, context) {
+  const { write, next } = context
+  if (isUndef(el.children) || el.children.length === 0) {
+    write(el.open + (el.close || ''), next)
+  } else {
+    const children: Array<VNode> = el.children
+    context.renderStates.push({
+      type: 'Element',
+      children,
+      rendered: 0,
+      total: children.length,
+      endTag: el.close
+    })
+    write(el.open, next)
+  }
+}
+
+function renderElement (el, isRoot, context) {
+  const { write, next } = context
+
+  if (isTrue(isRoot)) {
+    if (!el.data) el.data = {}
+    if (!el.data.attrs) el.data.attrs = {}
+    el.data.attrs[SSR_ATTR] = 'true'
+  }
+
+  if (el.fnOptions) {
+    registerComponentForCache(el.fnOptions, write)
+  }
+
+  const startTag = renderStartingTag(el, context)
+  const endTag = `</${el.tag}>`
+  if (context.isUnaryTag(el.tag)) {
+    write(startTag, next)
+  } else if (isUndef(el.children) || el.children.length === 0) {
+    write(startTag + endTag, next)
+  } else {
+    const children: Array<VNode> = el.children
+    context.renderStates.push({
+      type: 'Element',
+      children,
+      rendered: 0,
+      total: children.length,
+      endTag
+    })
+    write(startTag, next)
+  }
+}
+
+function hasAncestorData (node: VNode) {
+  const parentNode = node.parent
+  return isDef(parentNode) && (isDef(parentNode.data) || hasAncestorData(parentNode))
+}
+
+function getVShowDirectiveInfo (node: VNode): ?VNodeDirective {
+  let dir: VNodeDirective
+  let tmp
+
+  while (isDef(node)) {
+    if (node.data && node.data.directives) {
+      tmp = node.data.directives.find(dir => dir.name === 'show')
+      if (tmp) {
+        dir = tmp
+      }
+    }
+    node = node.parent
+  }
+  return dir
+}
+
+function renderStartingTag (node: VNode, context) {
+  let markup = `<${node.tag}`
+  const { directives, modules } = context
+
+  // construct synthetic data for module processing
+  // because modules like style also produce code by parent VNode data
+  if (isUndef(node.data) && hasAncestorData(node)) {
+    node.data = {}
+  }
+  if (isDef(node.data)) {
+    // check directives
+    const dirs = node.data.directives
+    if (dirs) {
+      for (let i = 0; i < dirs.length; i++) {
+        const name = dirs[i].name
+        const dirRenderer = directives[name]
+        if (dirRenderer && name !== 'show') {
+          // directives mutate the node's data
+          // which then gets rendered by modules
+          dirRenderer(node, dirs[i])
+        }
+      }
+    }
+
+    // v-show directive needs to be merged from parent to child
+    const vshowDirectiveInfo = getVShowDirectiveInfo(node)
+    if (vshowDirectiveInfo) {
+      directives.show(node, vshowDirectiveInfo)
+    }
+
+    // apply other modules
+    for (let i = 0; i < modules.length; i++) {
+      const res = modules[i](node)
+      if (res) {
+        markup += res
+      }
+    }
+  }
+  // attach scoped CSS ID
+  let scopeId
+  const activeInstance = context.activeInstance
+  if (isDef(activeInstance) &&
+    activeInstance !== node.context &&
+    isDef(scopeId = activeInstance.$options._scopeId)
+  ) {
+    markup += ` ${(scopeId: any)}`
+  }
+  if (isDef(node.fnScopeId)) {
+    markup += ` ${node.fnScopeId}`
+  } else {
+    while (isDef(node)) {
+      if (isDef(scopeId = node.context.$options._scopeId)) {
+        markup += ` ${scopeId}`
+      }
+      node = node.parent
+    }
+  }
+  return markup + '>'
+}
+
+export function createRenderFunction (
+  modules: Array<(node: VNode) => ?string>,
+  directives: Object,
+  isUnaryTag: Function,
+  cache: any
+) {
+  return function render (
+    component: Component,
+    write: (text: string, next: Function) => void,
+    userContext: ?Object,
+    done: Function
+  ) {
+    warned = Object.create(null)
+    const context = new RenderContext({
+      activeInstance: component,
+      userContext,
+      write, done, renderNode,
+      isUnaryTag, modules, directives,
+      cache
+    })
+    installSSRHelpers(component)
+    normalizeRender(component)
+    renderNode(component._render(), true, context)
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/server/template-renderer/create-async-file-mapper.js b/advancedcontentfilter/vendor/asset/vue/src/server/template-renderer/create-async-file-mapper.js
new file mode 100644 (file)
index 0000000..64c0647
--- /dev/null
@@ -0,0 +1,53 @@
+/* @flow */
+
+/**
+ * Creates a mapper that maps components used during a server-side render
+ * to async chunk files in the client-side build, so that we can inline them
+ * directly in the rendered HTML to avoid waterfall requests.
+ */
+
+import type { ClientManifest } from './index'
+
+export type AsyncFileMapper = (files: Array<string>) => Array<string>;
+
+export function createMapper (
+  clientManifest: ClientManifest
+): AsyncFileMapper {
+  const map = createMap(clientManifest)
+  // map server-side moduleIds to client-side files
+  return function mapper (moduleIds: Array<string>): Array<string> {
+    const res = new Set()
+    for (let i = 0; i < moduleIds.length; i++) {
+      const mapped = map.get(moduleIds[i])
+      if (mapped) {
+        for (let j = 0; j < mapped.length; j++) {
+          res.add(mapped[j])
+        }
+      }
+    }
+    return Array.from(res)
+  }
+}
+
+function createMap (clientManifest) {
+  const map = new Map()
+  Object.keys(clientManifest.modules).forEach(id => {
+    map.set(id, mapIdToFile(id, clientManifest))
+  })
+  return map
+}
+
+function mapIdToFile (id, clientManifest) {
+  const files = []
+  const fileIndices = clientManifest.modules[id]
+  if (fileIndices) {
+    fileIndices.forEach(index => {
+      const file = clientManifest.all[index]
+      // only include async files or non-js assets
+      if (clientManifest.async.indexOf(file) > -1 || !(/\.js($|\?)/.test(file))) {
+        files.push(file)
+      }
+    })
+  }
+  return files
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/server/template-renderer/index.js b/advancedcontentfilter/vendor/asset/vue/src/server/template-renderer/index.js
new file mode 100644 (file)
index 0000000..dabc08a
--- /dev/null
@@ -0,0 +1,257 @@
+/* @flow */
+
+const path = require('path')
+const serialize = require('serialize-javascript')
+
+import { isJS, isCSS } from '../util'
+import TemplateStream from './template-stream'
+import { parseTemplate } from './parse-template'
+import { createMapper } from './create-async-file-mapper'
+import type { ParsedTemplate } from './parse-template'
+import type { AsyncFileMapper } from './create-async-file-mapper'
+
+type TemplateRendererOptions = {
+  template: ?string;
+  inject?: boolean;
+  clientManifest?: ClientManifest;
+  shouldPreload?: (file: string, type: string) => boolean;
+  shouldPrefetch?: (file: string, type: string) => boolean;
+};
+
+export type ClientManifest = {
+  publicPath: string;
+  all: Array<string>;
+  initial: Array<string>;
+  async: Array<string>;
+  modules: {
+    [id: string]: Array<number>;
+  },
+  hasNoCssVersion?: {
+    [file: string]: boolean;
+  }
+};
+
+type Resource = {
+  file: string;
+  extension: string;
+  fileWithoutQuery: string;
+  asType: string;
+};
+
+export default class TemplateRenderer {
+  options: TemplateRendererOptions;
+  inject: boolean;
+  parsedTemplate: ParsedTemplate | null;
+  publicPath: string;
+  clientManifest: ClientManifest;
+  preloadFiles: Array<Resource>;
+  prefetchFiles: Array<Resource>;
+  mapFiles: AsyncFileMapper;
+
+  constructor (options: TemplateRendererOptions) {
+    this.options = options
+    this.inject = options.inject !== false
+    // if no template option is provided, the renderer is created
+    // as a utility object for rendering assets like preload links and scripts.
+    this.parsedTemplate = options.template
+      ? parseTemplate(options.template)
+      : null
+
+    // extra functionality with client manifest
+    if (options.clientManifest) {
+      const clientManifest = this.clientManifest = options.clientManifest
+      this.publicPath = clientManifest.publicPath.replace(/\/$/, '')
+      // preload/prefetch directives
+      this.preloadFiles = (clientManifest.initial || []).map(normalizeFile)
+      this.prefetchFiles = (clientManifest.async || []).map(normalizeFile)
+      // initial async chunk mapping
+      this.mapFiles = createMapper(clientManifest)
+    }
+  }
+
+  bindRenderFns (context: Object) {
+    const renderer: any = this
+    ;['ResourceHints', 'State', 'Scripts', 'Styles'].forEach(type => {
+      context[`render${type}`] = renderer[`render${type}`].bind(renderer, context)
+    })
+    // also expose getPreloadFiles, useful for HTTP/2 push
+    context.getPreloadFiles = renderer.getPreloadFiles.bind(renderer, context)
+  }
+
+  // render synchronously given rendered app content and render context
+  renderSync (content: string, context: ?Object) {
+    const template = this.parsedTemplate
+    if (!template) {
+      throw new Error('renderSync cannot be called without a template.')
+    }
+    context = context || {}
+    if (this.inject) {
+      return (
+        template.head(context) +
+        (context.head || '') +
+        this.renderResourceHints(context) +
+        this.renderStyles(context) +
+        template.neck(context) +
+        content +
+        this.renderState(context) +
+        this.renderScripts(context) +
+        template.tail(context)
+      )
+    } else {
+      return (
+        template.head(context) +
+        template.neck(context) +
+        content +
+        template.tail(context)
+      )
+    }
+  }
+
+  renderStyles (context: Object): string {
+    const cssFiles = this.clientManifest
+      ? this.clientManifest.all.filter(isCSS)
+      : []
+    return (
+      // render links for css files
+      (cssFiles.length
+        ? cssFiles.map(file => `<link rel="stylesheet" href="${this.publicPath}/${file}">`).join('')
+        : '') +
+      // context.styles is a getter exposed by vue-style-loader which contains
+      // the inline component styles collected during SSR
+      (context.styles || '')
+    )
+  }
+
+  renderResourceHints (context: Object): string {
+    return this.renderPreloadLinks(context) + this.renderPrefetchLinks(context)
+  }
+
+  getPreloadFiles (context: Object): Array<Resource> {
+    const usedAsyncFiles = this.getUsedAsyncFiles(context)
+    if (this.preloadFiles || usedAsyncFiles) {
+      return (this.preloadFiles || []).concat(usedAsyncFiles || [])
+    } else {
+      return []
+    }
+  }
+
+  renderPreloadLinks (context: Object): string {
+    const files = this.getPreloadFiles(context)
+    const shouldPreload = this.options.shouldPreload
+    if (files.length) {
+      return files.map(({ file, extension, fileWithoutQuery, asType }) => {
+        let extra = ''
+        // by default, we only preload scripts or css
+        if (!shouldPreload && asType !== 'script' && asType !== 'style') {
+          return ''
+        }
+        // user wants to explicitly control what to preload
+        if (shouldPreload && !shouldPreload(fileWithoutQuery, asType)) {
+          return ''
+        }
+        if (asType === 'font') {
+          extra = ` type="font/${extension}" crossorigin`
+        }
+        return `<link rel="preload" href="${
+          this.publicPath}/${file
+        }"${
+          asType !== '' ? ` as="${asType}"` : ''
+        }${
+          extra
+        }>`
+      }).join('')
+    } else {
+      return ''
+    }
+  }
+
+  renderPrefetchLinks (context: Object): string {
+    const shouldPrefetch = this.options.shouldPrefetch
+    if (this.prefetchFiles) {
+      const usedAsyncFiles = this.getUsedAsyncFiles(context)
+      const alreadyRendered = file => {
+        return usedAsyncFiles && usedAsyncFiles.some(f => f.file === file)
+      }
+      return this.prefetchFiles.map(({ file, fileWithoutQuery, asType }) => {
+        if (shouldPrefetch && !shouldPrefetch(fileWithoutQuery, asType)) {
+          return ''
+        }
+        if (alreadyRendered(file)) {
+          return ''
+        }
+        return `<link rel="prefetch" href="${this.publicPath}/${file}">`
+      }).join('')
+    } else {
+      return ''
+    }
+  }
+
+  renderState (context: Object, options?: Object): string {
+    const {
+      contextKey = 'state',
+      windowKey = '__INITIAL_STATE__'
+    } = options || {}
+    const state = serialize(context[contextKey], { isJSON: true })
+    const autoRemove = process.env.NODE_ENV === 'production'
+      ? ';(function(){var s;(s=document.currentScript||document.scripts[document.scripts.length-1]).parentNode.removeChild(s);}());'
+      : ''
+    return context[contextKey]
+      ? `<script>window.${windowKey}=${state}${autoRemove}</script>`
+      : ''
+  }
+
+  renderScripts (context: Object): string {
+    if (this.clientManifest) {
+      const initial = this.preloadFiles
+      const async = this.getUsedAsyncFiles(context)
+      const needed = [initial[0]].concat(async || [], initial.slice(1))
+      return needed.filter(({ file }) => isJS(file)).map(({ file }) => {
+        return `<script src="${this.publicPath}/${file}" defer></script>`
+      }).join('')
+    } else {
+      return ''
+    }
+  }
+
+  getUsedAsyncFiles (context: Object): ?Array<Resource> {
+    if (!context._mappedFiles && context._registeredComponents && this.mapFiles) {
+      const registered = Array.from(context._registeredComponents)
+      context._mappedFiles = this.mapFiles(registered).map(normalizeFile)
+    }
+    return context._mappedFiles
+  }
+
+  // create a transform stream
+  createStream (context: ?Object): TemplateStream {
+    if (!this.parsedTemplate) {
+      throw new Error('createStream cannot be called without a template.')
+    }
+    return new TemplateStream(this, this.parsedTemplate, context || {})
+  }
+}
+
+function normalizeFile (file: string): Resource {
+  const withoutQuery = file.replace(/\?.*/, '')
+  const extension = path.extname(withoutQuery).slice(1)
+  return {
+    file,
+    extension,
+    fileWithoutQuery: withoutQuery,
+    asType: getPreloadType(extension)
+  }
+}
+
+function getPreloadType (ext: string): string {
+  if (ext === 'js') {
+    return 'script'
+  } else if (ext === 'css') {
+    return 'style'
+  } else if (/jpe?g|png|svg|gif|webp|ico/.test(ext)) {
+    return 'image'
+  } else if (/woff2?|ttf|otf|eot/.test(ext)) {
+    return 'font'
+  } else {
+    // not exhausting all possibilities here, but above covers common cases
+    return ''
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/server/template-renderer/parse-template.js b/advancedcontentfilter/vendor/asset/vue/src/server/template-renderer/parse-template.js
new file mode 100644 (file)
index 0000000..1ccfe89
--- /dev/null
@@ -0,0 +1,42 @@
+/* @flow */
+
+const compile = require('lodash.template')
+const compileOptions = {
+  escape: /{{([^{][\s\S]+?[^}])}}/g,
+  interpolate: /{{{([\s\S]+?)}}}/g
+}
+
+export type ParsedTemplate = {
+  head: (data: any) => string;
+  neck: (data: any) => string;
+  tail: (data: any) => string;
+};
+
+export function parseTemplate (
+  template: string,
+  contentPlaceholder?: string = '<!--vue-ssr-outlet-->'
+): ParsedTemplate {
+  if (typeof template === 'object') {
+    return template
+  }
+
+  let i = template.indexOf('</head>')
+  const j = template.indexOf(contentPlaceholder)
+
+  if (j < 0) {
+    throw new Error(`Content placeholder not found in template.`)
+  }
+
+  if (i < 0) {
+    i = template.indexOf('<body>')
+    if (i < 0) {
+      i = j
+    }
+  }
+
+  return {
+    head: compile(template.slice(0, i), compileOptions),
+    neck: compile(template.slice(i, j), compileOptions),
+    tail: compile(template.slice(j + contentPlaceholder.length), compileOptions)
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/server/template-renderer/template-stream.js b/advancedcontentfilter/vendor/asset/vue/src/server/template-renderer/template-stream.js
new file mode 100644 (file)
index 0000000..ed4db78
--- /dev/null
@@ -0,0 +1,82 @@
+/* @flow */
+
+const Transform = require('stream').Transform
+import type TemplateRenderer from './index'
+import type { ParsedTemplate } from './parse-template'
+
+export default class TemplateStream extends Transform {
+  started: boolean;
+  renderer: TemplateRenderer;
+  template: ParsedTemplate;
+  context: Object;
+  inject: boolean;
+
+  constructor (
+    renderer: TemplateRenderer,
+    template: ParsedTemplate,
+    context: Object
+  ) {
+    super()
+    this.started = false
+    this.renderer = renderer
+    this.template = template
+    this.context = context || {}
+    this.inject = renderer.inject
+  }
+
+  _transform (data: Buffer | string, encoding: string, done: Function) {
+    if (!this.started) {
+      this.emit('beforeStart')
+      this.start()
+    }
+    this.push(data)
+    done()
+  }
+
+  start () {
+    this.started = true
+    this.push(this.template.head(this.context))
+
+    if (this.inject) {
+      // inline server-rendered head meta information
+      if (this.context.head) {
+        this.push(this.context.head)
+      }
+
+      // inline preload/prefetch directives for initial/async chunks
+      const links = this.renderer.renderResourceHints(this.context)
+      if (links) {
+        this.push(links)
+      }
+
+      // CSS files and inline server-rendered CSS collected by vue-style-loader
+      const styles = this.renderer.renderStyles(this.context)
+      if (styles) {
+        this.push(styles)
+      }
+    }
+
+    this.push(this.template.neck(this.context))
+  }
+
+  _flush (done: Function) {
+    this.emit('beforeEnd')
+
+    if (this.inject) {
+      // inline initial store state
+      const state = this.renderer.renderState(this.context)
+      if (state) {
+        this.push(state)
+      }
+
+      // embed scripts needed
+      const scripts = this.renderer.renderScripts(this.context)
+      if (scripts) {
+        this.push(scripts)
+      }
+    }
+
+    this.push(this.template.tail(this.context))
+    done()
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/server/util.js b/advancedcontentfilter/vendor/asset/vue/src/server/util.js
new file mode 100644 (file)
index 0000000..908f8c9
--- /dev/null
@@ -0,0 +1,18 @@
+/* @flow */
+
+export const isJS = (file: string): boolean => /\.js(\?[^.]+)?$/.test(file)
+
+export const isCSS = (file: string): boolean => /\.css(\?[^.]+)?$/.test(file)
+
+export function createPromiseCallback () {
+  let resolve, reject
+  const promise: Promise<string> = new Promise((_resolve, _reject) => {
+    resolve = _resolve
+    reject = _reject
+  })
+  const cb = (err: Error, res?: string) => {
+    if (err) return reject(err)
+    resolve(res || '')
+  }
+  return { promise, cb }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/server/webpack-plugin/client.js b/advancedcontentfilter/vendor/asset/vue/src/server/webpack-plugin/client.js
new file mode 100644 (file)
index 0000000..5f2cd4b
--- /dev/null
@@ -0,0 +1,70 @@
+const hash = require('hash-sum')
+const uniq = require('lodash.uniq')
+import { isJS } from './util'
+
+export default class VueSSRClientPlugin {
+  constructor (options = {}) {
+    this.options = Object.assign({
+      filename: 'vue-ssr-client-manifest.json'
+    }, options)
+  }
+
+  apply (compiler) {
+    compiler.plugin('emit', (compilation, cb) => {
+      const stats = compilation.getStats().toJson()
+
+      const allFiles = uniq(stats.assets
+        .map(a => a.name))
+
+      const initialFiles = uniq(Object.keys(stats.entrypoints)
+        .map(name => stats.entrypoints[name].assets)
+        .reduce((assets, all) => all.concat(assets), [])
+        .filter(isJS))
+
+      const asyncFiles = allFiles
+        .filter(isJS)
+        .filter(file => initialFiles.indexOf(file) < 0)
+
+      const manifest = {
+        publicPath: stats.publicPath,
+        all: allFiles,
+        initial: initialFiles,
+        async: asyncFiles,
+        modules: { /* [identifier: string]: Array<index: number> */ }
+      }
+
+      const assetModules = stats.modules.filter(m => m.assets.length)
+      const fileToIndex = file => manifest.all.indexOf(file)
+      stats.modules.forEach(m => {
+        // ignore modules duplicated in multiple chunks
+        if (m.chunks.length === 1) {
+          const cid = m.chunks[0]
+          const chunk = stats.chunks.find(c => c.id === cid)
+          if (!chunk || !chunk.files) {
+            return
+          }
+          const files = manifest.modules[hash(m.identifier)] = chunk.files.map(fileToIndex)
+          // find all asset modules associated with the same chunk
+          assetModules.forEach(m => {
+            if (m.chunks.some(id => id === cid)) {
+              files.push.apply(files, m.assets.map(fileToIndex))
+            }
+          })
+        }
+      })
+
+      // const debug = (file, obj) => {
+      //   require('fs').writeFileSync(__dirname + '/' + file, JSON.stringify(obj, null, 2))
+      // }
+      // debug('stats.json', stats)
+      // debug('client-manifest.json', manifest)
+
+      const json = JSON.stringify(manifest, null, 2)
+      compilation.assets[this.options.filename] = {
+        source: () => json,
+        size: () => json.length
+      }
+      cb()
+    })
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/server/webpack-plugin/server.js b/advancedcontentfilter/vendor/asset/vue/src/server/webpack-plugin/server.js
new file mode 100644 (file)
index 0000000..8ffa58b
--- /dev/null
@@ -0,0 +1,66 @@
+import { validate, isJS } from './util'
+
+export default class VueSSRServerPlugin {
+  constructor (options = {}) {
+    this.options = Object.assign({
+      filename: 'vue-ssr-server-bundle.json'
+    }, options)
+  }
+
+  apply (compiler) {
+    validate(compiler)
+
+    compiler.plugin('emit', (compilation, cb) => {
+      const stats = compilation.getStats().toJson()
+      const entryName = Object.keys(stats.entrypoints)[0]
+      const entryInfo = stats.entrypoints[entryName]
+
+      if (!entryInfo) {
+        // #5553
+        return cb()
+      }
+
+      const entryAssets = entryInfo.assets.filter(isJS)
+
+      if (entryAssets.length > 1) {
+        throw new Error(
+          `Server-side bundle should have one single entry file. ` +
+          `Avoid using CommonsChunkPlugin in the server config.`
+        )
+      }
+
+      const entry = entryAssets[0]
+      if (!entry || typeof entry !== 'string') {
+        throw new Error(
+          `Entry "${entryName}" not found. Did you specify the correct entry option?`
+        )
+      }
+
+      const bundle = {
+        entry,
+        files: {},
+        maps: {}
+      }
+
+      stats.assets.forEach(asset => {
+        if (asset.name.match(/\.js$/)) {
+          bundle.files[asset.name] = compilation.assets[asset.name].source()
+        } else if (asset.name.match(/\.js\.map$/)) {
+          bundle.maps[asset.name.replace(/\.map$/, '')] = JSON.parse(compilation.assets[asset.name].source())
+        }
+        // do not emit anything else for server
+        delete compilation.assets[asset.name]
+      })
+
+      const json = JSON.stringify(bundle, null, 2)
+      const filename = this.options.filename
+
+      compilation.assets[filename] = {
+        source: () => json,
+        size: () => json.length
+      }
+
+      cb()
+    })
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/server/webpack-plugin/util.js b/advancedcontentfilter/vendor/asset/vue/src/server/webpack-plugin/util.js
new file mode 100644 (file)
index 0000000..d22e4b2
--- /dev/null
@@ -0,0 +1,24 @@
+const { red, yellow } = require('chalk')
+
+const prefix = `[vue-server-renderer-webpack-plugin]`
+const warn = exports.warn = msg => console.error(red(`${prefix} ${msg}\n`))
+const tip = exports.tip = msg => console.log(yellow(`${prefix} ${msg}\n`))
+
+export const validate = compiler => {
+  if (compiler.options.target !== 'node') {
+    warn('webpack config `target` should be "node".')
+  }
+
+  if (compiler.options.output && compiler.options.output.libraryTarget !== 'commonjs2') {
+    warn('webpack config `output.libraryTarget` should be "commonjs2".')
+  }
+
+  if (!compiler.options.externals) {
+    tip(
+      'It is recommended to externalize dependencies in the server build for ' +
+      'better build performance.'
+    )
+  }
+}
+
+export { isJS, isCSS } from '../util'
diff --git a/advancedcontentfilter/vendor/asset/vue/src/server/write.js b/advancedcontentfilter/vendor/asset/vue/src/server/write.js
new file mode 100644 (file)
index 0000000..e642081
--- /dev/null
@@ -0,0 +1,50 @@
+/* @flow */
+
+const MAX_STACK_DEPTH = 1000
+const noop = _ => _
+
+const defer = typeof process !== 'undefined' && process.nextTick
+  ? process.nextTick
+  : typeof Promise !== 'undefined'
+    ? fn => Promise.resolve().then(fn)
+    : typeof setTimeout !== 'undefined'
+      ? setTimeout
+      : noop
+
+if (defer === noop) {
+  throw new Error(
+    'Your JavaScript runtime does not support any asynchronous primitives ' +
+    'that are required by vue-server-renderer. Please use a polyfill for ' +
+    'either Promise or setTimeout.'
+  )
+}
+
+export function createWriteFunction (
+  write: (text: string, next: Function) => boolean,
+  onError: Function
+): Function {
+  let stackDepth = 0
+  const cachedWrite = (text, next) => {
+    if (text && cachedWrite.caching) {
+      cachedWrite.cacheBuffer[cachedWrite.cacheBuffer.length - 1] += text
+    }
+    const waitForNext = write(text, next)
+    if (waitForNext !== true) {
+      if (stackDepth >= MAX_STACK_DEPTH) {
+        defer(() => {
+          try { next() } catch (e) {
+            onError(e)
+          }
+        })
+      } else {
+        stackDepth++
+        next()
+        stackDepth--
+      }
+    }
+  }
+  cachedWrite.caching = false
+  cachedWrite.cacheBuffer = []
+  cachedWrite.componentBuffer = []
+  return cachedWrite
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/sfc/parser.js b/advancedcontentfilter/vendor/asset/vue/src/sfc/parser.js
new file mode 100644 (file)
index 0000000..868a43c
--- /dev/null
@@ -0,0 +1,116 @@
+/* @flow */
+
+import deindent from 'de-indent'
+import { parseHTML } from 'compiler/parser/html-parser'
+import { makeMap } from 'shared/util'
+
+const splitRE = /\r?\n/g
+const replaceRE = /./g
+const isSpecialTag = makeMap('script,style,template', true)
+
+type Attribute = {
+  name: string,
+  value: string
+};
+
+/**
+ * Parse a single-file component (*.vue) file into an SFC Descriptor Object.
+ */
+export function parseComponent (
+  content: string,
+  options?: Object = {}
+): SFCDescriptor {
+  const sfc: SFCDescriptor = {
+    template: null,
+    script: null,
+    styles: [],
+    customBlocks: []
+  }
+  let depth = 0
+  let currentBlock: ?SFCBlock = null
+
+  function start (
+    tag: string,
+    attrs: Array<Attribute>,
+    unary: boolean,
+    start: number,
+    end: number
+  ) {
+    if (depth === 0) {
+      currentBlock = {
+        type: tag,
+        content: '',
+        start: end,
+        attrs: attrs.reduce((cumulated, { name, value }) => {
+          cumulated[name] = value || true
+          return cumulated
+        }, {})
+      }
+      if (isSpecialTag(tag)) {
+        checkAttrs(currentBlock, attrs)
+        if (tag === 'style') {
+          sfc.styles.push(currentBlock)
+        } else {
+          sfc[tag] = currentBlock
+        }
+      } else { // custom blocks
+        sfc.customBlocks.push(currentBlock)
+      }
+    }
+    if (!unary) {
+      depth++
+    }
+  }
+
+  function checkAttrs (block: SFCBlock, attrs: Array<Attribute>) {
+    for (let i = 0; i < attrs.length; i++) {
+      const attr = attrs[i]
+      if (attr.name === 'lang') {
+        block.lang = attr.value
+      }
+      if (attr.name === 'scoped') {
+        block.scoped = true
+      }
+      if (attr.name === 'module') {
+        block.module = attr.value || true
+      }
+      if (attr.name === 'src') {
+        block.src = attr.value
+      }
+    }
+  }
+
+  function end (tag: string, start: number, end: number) {
+    if (depth === 1 && currentBlock) {
+      currentBlock.end = start
+      let text = deindent(content.slice(currentBlock.start, currentBlock.end))
+      // pad content so that linters and pre-processors can output correct
+      // line numbers in errors and warnings
+      if (currentBlock.type !== 'template' && options.pad) {
+        text = padContent(currentBlock, options.pad) + text
+      }
+      currentBlock.content = text
+      currentBlock = null
+    }
+    depth--
+  }
+
+  function padContent (block: SFCBlock, pad: true | "line" | "space") {
+    if (pad === 'space') {
+      return content.slice(0, block.start).replace(replaceRE, ' ')
+    } else {
+      const offset = content.slice(0, block.start).split(splitRE).length
+      const padChar = block.type === 'script' && !block.lang
+        ? '//\n'
+        : '\n'
+      return Array(offset).join(padChar)
+    }
+  }
+
+  parseHTML(content, {
+    start,
+    end
+  })
+
+  return sfc
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/src/shared/constants.js b/advancedcontentfilter/vendor/asset/vue/src/shared/constants.js
new file mode 100644 (file)
index 0000000..84d019f
--- /dev/null
@@ -0,0 +1,21 @@
+export const SSR_ATTR = 'data-server-rendered'
+
+export const ASSET_TYPES = [
+  'component',
+  'directive',
+  'filter'
+]
+
+export const LIFECYCLE_HOOKS = [
+  'beforeCreate',
+  'created',
+  'beforeMount',
+  'mounted',
+  'beforeUpdate',
+  'updated',
+  'beforeDestroy',
+  'destroyed',
+  'activated',
+  'deactivated',
+  'errorCaptured'
+]
diff --git a/advancedcontentfilter/vendor/asset/vue/src/shared/util.js b/advancedcontentfilter/vendor/asset/vue/src/shared/util.js
new file mode 100644 (file)
index 0000000..e488473
--- /dev/null
@@ -0,0 +1,324 @@
+/* @flow */
+
+export const emptyObject = Object.freeze({})
+
+// these helpers produces better vm code in JS engines due to their
+// explicitness and function inlining
+export function isUndef (v: any): boolean %checks {
+  return v === undefined || v === null
+}
+
+export function isDef (v: any): boolean %checks {
+  return v !== undefined && v !== null
+}
+
+export function isTrue (v: any): boolean %checks {
+  return v === true
+}
+
+export function isFalse (v: any): boolean %checks {
+  return v === false
+}
+
+/**
+ * Check if value is primitive
+ */
+export function isPrimitive (value: any): boolean %checks {
+  return (
+    typeof value === 'string' ||
+    typeof value === 'number' ||
+    // $flow-disable-line
+    typeof value === 'symbol' ||
+    typeof value === 'boolean'
+  )
+}
+
+/**
+ * Quick object check - this is primarily used to tell
+ * Objects from primitive values when we know the value
+ * is a JSON-compliant type.
+ */
+export function isObject (obj: mixed): boolean %checks {
+  return obj !== null && typeof obj === 'object'
+}
+
+/**
+ * Get the raw type string of a value e.g. [object Object]
+ */
+const _toString = Object.prototype.toString
+
+export function toRawType (value: any): string {
+  return _toString.call(value).slice(8, -1)
+}
+
+/**
+ * Strict object type check. Only returns true
+ * for plain JavaScript objects.
+ */
+export function isPlainObject (obj: any): boolean {
+  return _toString.call(obj) === '[object Object]'
+}
+
+export function isRegExp (v: any): boolean {
+  return _toString.call(v) === '[object RegExp]'
+}
+
+/**
+ * Check if val is a valid array index.
+ */
+export function isValidArrayIndex (val: any): boolean {
+  const n = parseFloat(String(val))
+  return n >= 0 && Math.floor(n) === n && isFinite(val)
+}
+
+/**
+ * Convert a value to a string that is actually rendered.
+ */
+export function toString (val: any): string {
+  return val == null
+    ? ''
+    : typeof val === 'object'
+      ? JSON.stringify(val, null, 2)
+      : String(val)
+}
+
+/**
+ * Convert a input value to a number for persistence.
+ * If the conversion fails, return original string.
+ */
+export function toNumber (val: string): number | string {
+  const n = parseFloat(val)
+  return isNaN(n) ? val : n
+}
+
+/**
+ * Make a map and return a function for checking if a key
+ * is in that map.
+ */
+export function makeMap (
+  str: string,
+  expectsLowerCase?: boolean
+): (key: string) => true | void {
+  const map = Object.create(null)
+  const list: Array<string> = str.split(',')
+  for (let i = 0; i < list.length; i++) {
+    map[list[i]] = true
+  }
+  return expectsLowerCase
+    ? val => map[val.toLowerCase()]
+    : val => map[val]
+}
+
+/**
+ * Check if a tag is a built-in tag.
+ */
+export const isBuiltInTag = makeMap('slot,component', true)
+
+/**
+ * Check if a attribute is a reserved attribute.
+ */
+export const isReservedAttribute = makeMap('key,ref,slot,slot-scope,is')
+
+/**
+ * Remove an item from an array
+ */
+export function remove (arr: Array<any>, item: any): Array<any> | void {
+  if (arr.length) {
+    const index = arr.indexOf(item)
+    if (index > -1) {
+      return arr.splice(index, 1)
+    }
+  }
+}
+
+/**
+ * Check whether the object has the property.
+ */
+const hasOwnProperty = Object.prototype.hasOwnProperty
+export function hasOwn (obj: Object | Array<*>, key: string): boolean {
+  return hasOwnProperty.call(obj, key)
+}
+
+/**
+ * Create a cached version of a pure function.
+ */
+export function cached<F: Function> (fn: F): F {
+  const cache = Object.create(null)
+  return (function cachedFn (str: string) {
+    const hit = cache[str]
+    return hit || (cache[str] = fn(str))
+  }: any)
+}
+
+/**
+ * Camelize a hyphen-delimited string.
+ */
+const camelizeRE = /-(\w)/g
+export const camelize = cached((str: string): string => {
+  return str.replace(camelizeRE, (_, c) => c ? c.toUpperCase() : '')
+})
+
+/**
+ * Capitalize a string.
+ */
+export const capitalize = cached((str: string): string => {
+  return str.charAt(0).toUpperCase() + str.slice(1)
+})
+
+/**
+ * Hyphenate a camelCase string.
+ */
+const hyphenateRE = /\B([A-Z])/g
+export const hyphenate = cached((str: string): string => {
+  return str.replace(hyphenateRE, '-$1').toLowerCase()
+})
+
+/**
+ * Simple bind polyfill for environments that do not support it... e.g.
+ * PhantomJS 1.x. Technically we don't need this anymore since native bind is
+ * now more performant in most browsers, but removing it would be breaking for
+ * code that was able to run in PhantomJS 1.x, so this must be kept for
+ * backwards compatibility.
+ */
+
+/* istanbul ignore next */
+function polyfillBind (fn: Function, ctx: Object): Function {
+  function boundFn (a) {
+    const l = arguments.length
+    return l
+      ? l > 1
+        ? fn.apply(ctx, arguments)
+        : fn.call(ctx, a)
+      : fn.call(ctx)
+  }
+
+  boundFn._length = fn.length
+  return boundFn
+}
+
+function nativeBind (fn: Function, ctx: Object): Function {
+  return fn.bind(ctx)
+}
+
+export const bind = Function.prototype.bind
+  ? nativeBind
+  : polyfillBind
+
+/**
+ * Convert an Array-like object to a real Array.
+ */
+export function toArray (list: any, start?: number): Array<any> {
+  start = start || 0
+  let i = list.length - start
+  const ret: Array<any> = new Array(i)
+  while (i--) {
+    ret[i] = list[i + start]
+  }
+  return ret
+}
+
+/**
+ * Mix properties into target object.
+ */
+export function extend (to: Object, _from: ?Object): Object {
+  for (const key in _from) {
+    to[key] = _from[key]
+  }
+  return to
+}
+
+/**
+ * Merge an Array of Objects into a single Object.
+ */
+export function toObject (arr: Array<any>): Object {
+  const res = {}
+  for (let i = 0; i < arr.length; i++) {
+    if (arr[i]) {
+      extend(res, arr[i])
+    }
+  }
+  return res
+}
+
+/**
+ * Perform no operation.
+ * Stubbing args to make Flow happy without leaving useless transpiled code
+ * with ...rest (https://flow.org/blog/2017/05/07/Strict-Function-Call-Arity/)
+ */
+export function noop (a?: any, b?: any, c?: any) {}
+
+/**
+ * Always return false.
+ */
+export const no = (a?: any, b?: any, c?: any) => false
+
+/**
+ * Return same value
+ */
+export const identity = (_: any) => _
+
+/**
+ * Generate a static keys string from compiler modules.
+ */
+export function genStaticKeys (modules: Array<ModuleOptions>): string {
+  return modules.reduce((keys, m) => {
+    return keys.concat(m.staticKeys || [])
+  }, []).join(',')
+}
+
+/**
+ * Check if two values are loosely equal - that is,
+ * if they are plain objects, do they have the same shape?
+ */
+export function looseEqual (a: any, b: any): boolean {
+  if (a === b) return true
+  const isObjectA = isObject(a)
+  const isObjectB = isObject(b)
+  if (isObjectA && isObjectB) {
+    try {
+      const isArrayA = Array.isArray(a)
+      const isArrayB = Array.isArray(b)
+      if (isArrayA && isArrayB) {
+        return a.length === b.length && a.every((e, i) => {
+          return looseEqual(e, b[i])
+        })
+      } else if (!isArrayA && !isArrayB) {
+        const keysA = Object.keys(a)
+        const keysB = Object.keys(b)
+        return keysA.length === keysB.length && keysA.every(key => {
+          return looseEqual(a[key], b[key])
+        })
+      } else {
+        /* istanbul ignore next */
+        return false
+      }
+    } catch (e) {
+      /* istanbul ignore next */
+      return false
+    }
+  } else if (!isObjectA && !isObjectB) {
+    return String(a) === String(b)
+  } else {
+    return false
+  }
+}
+
+export function looseIndexOf (arr: Array<mixed>, val: mixed): number {
+  for (let i = 0; i < arr.length; i++) {
+    if (looseEqual(arr[i], val)) return i
+  }
+  return -1
+}
+
+/**
+ * Ensure a function is called only once.
+ */
+export function once (fn: Function): Function {
+  let called = false
+  return function () {
+    if (!called) {
+      called = true
+      fn.apply(this, arguments)
+    }
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/test/e2e/.eslintrc b/advancedcontentfilter/vendor/asset/vue/test/e2e/.eslintrc
new file mode 100644 (file)
index 0000000..e866525
--- /dev/null
@@ -0,0 +1,5 @@
+{
+  "rules": {
+    "indent": 0
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/test/e2e/nightwatch.config.js b/advancedcontentfilter/vendor/asset/vue/test/e2e/nightwatch.config.js
new file mode 100644 (file)
index 0000000..2004f92
--- /dev/null
@@ -0,0 +1,57 @@
+// http://nightwatchjs.org/guide#settings-file
+module.exports = {
+  'src_folders': ['test/e2e/specs'],
+  'output_folder': 'test/e2e/reports',
+  'custom_commands_path': ['node_modules/nightwatch-helpers/commands'],
+  'custom_assertions_path': ['node_modules/nightwatch-helpers/assertions'],
+
+  'selenium': {
+    'start_process': true,
+    'server_path': require('selenium-server').path,
+    'host': '127.0.0.1',
+    'port': 4444,
+    'cli_args': {
+      'webdriver.chrome.driver': require('chromedriver').path
+      // , 'webdriver.gecko.driver': require('geckodriver').path
+    }
+  },
+
+  'test_settings': {
+    'default': {
+      'selenium_port': 4444,
+      'selenium_host': 'localhost',
+      'silent': true,
+      'screenshots': {
+        'enabled': true,
+        'on_failure': true,
+        'on_error': false,
+        'path': 'test/e2e/screenshots'
+      }
+    },
+
+    'chrome': {
+      'desiredCapabilities': {
+        'browserName': 'chrome',
+        'javascriptEnabled': true,
+        'acceptSslCerts': true
+      }
+    },
+
+    'firefox': {
+      'desiredCapabilities': {
+        'browserName': 'firefox',
+        'javascriptEnabled': true,
+        'acceptSslCerts': true,
+        'marionette': true
+      }
+    },
+
+    'phantomjs': {
+      'desiredCapabilities': {
+        'browserName': 'phantomjs',
+        'javascriptEnabled': true,
+        'acceptSslCerts': true
+      }
+    }
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/test/e2e/runner.js b/advancedcontentfilter/vendor/asset/vue/test/e2e/runner.js
new file mode 100644 (file)
index 0000000..d59506d
--- /dev/null
@@ -0,0 +1,34 @@
+var path = require('path')
+var spawn = require('cross-spawn')
+var httpServer = require('http-server')
+var server = httpServer.createServer({
+  root: path.resolve(__dirname, '../../')
+})
+
+server.listen(8080)
+
+var args = process.argv.slice(2)
+if (args.indexOf('--config') === -1) {
+  args = args.concat(['--config', 'test/e2e/nightwatch.config.js'])
+}
+if (args.indexOf('--env') === -1) {
+  args = args.concat(['--env', 'chrome,phantomjs'])
+}
+var i = args.indexOf('--test')
+if (i > -1) {
+  args[i + 1] = 'test/e2e/specs/' + args[i + 1] + '.js'
+}
+
+var runner = spawn('./node_modules/.bin/nightwatch', args, {
+  stdio: 'inherit'
+})
+
+runner.on('exit', function (code) {
+  server.close()
+  process.exit(code)
+})
+
+runner.on('error', function (err) {
+  server.close()
+  throw err
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/e2e/specs/async-edge-cases.html b/advancedcontentfilter/vendor/asset/vue/test/e2e/specs/async-edge-cases.html
new file mode 100644 (file)
index 0000000..4c7411b
--- /dev/null
@@ -0,0 +1,54 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <title></title>
+    <script src="../../../dist/vue.min.js"></script>
+  </head>
+  <body>
+
+    <!-- #4510 click and change event on checkbox -->
+    <div id="case-1">
+      <div @click="num++">
+        {{ num }}
+        <input type="checkbox" v-model="checked">
+      </div>
+    </div>
+    <script>
+    var vm1 = new Vue({
+      el: '#case-1',
+      data: {
+        num: 1,
+        checked: false
+      }
+    })
+    </script>
+
+    <!-- #6566 click event bubbling -->
+    <div id="case-2">
+      <div class="panel" v-if="expand">
+        <button @click="expand = false, countA++">Expand is True</button>
+      </div>
+      <div class="header" v-if="!expand" @click="expand = true, countB++">
+        <button>Expand is False</button>
+      </div>
+      <div class="count-a">
+        countA: {{countA}}
+      </div>
+      <div class="count-b">
+        countB: {{countB}}
+      </div>
+    </div>
+    <script>
+    var vm2 = new Vue({
+      el: '#case-2',
+      data: {
+        expand: true,
+        countA: 0,
+        countB: 0,
+      }
+    })
+    </script>
+
+  </body>
+</html>
diff --git a/advancedcontentfilter/vendor/asset/vue/test/e2e/specs/async-edge-cases.js b/advancedcontentfilter/vendor/asset/vue/test/e2e/specs/async-edge-cases.js
new file mode 100644 (file)
index 0000000..2873409
--- /dev/null
@@ -0,0 +1,34 @@
+module.exports = {
+  'async edge cases': function (browser) {
+    browser
+    .url('http://localhost:8080/test/e2e/specs/async-edge-cases.html')
+      // #4510
+      .assert.containsText('#case-1', '1')
+      .assert.checked('#case-1 input', false)
+
+      .click('#case-1 input')
+      .assert.containsText('#case-1', '2')
+      .assert.checked('#case-1 input', true)
+
+      .click('#case-1 input')
+      .assert.containsText('#case-1', '3')
+      .assert.checked('#case-1 input', false)
+
+      // #6566
+      .assert.containsText('#case-2 button', 'Expand is True')
+      .assert.containsText('.count-a', 'countA: 0')
+      .assert.containsText('.count-b', 'countB: 0')
+
+      .click('#case-2 button')
+      .assert.containsText('#case-2 button', 'Expand is False')
+      .assert.containsText('.count-a', 'countA: 1')
+      .assert.containsText('.count-b', 'countB: 0')
+
+      .click('#case-2 button')
+      .assert.containsText('#case-2 button', 'Expand is True')
+      .assert.containsText('.count-a', 'countA: 1')
+      .assert.containsText('.count-b', 'countB: 1')
+
+      .end()
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/test/e2e/specs/basic-ssr.html b/advancedcontentfilter/vendor/asset/vue/test/e2e/specs/basic-ssr.html
new file mode 100644 (file)
index 0000000..67f0dac
--- /dev/null
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <title></title>
+  </head>
+  <body>
+    <script src="../../../dist/vue.min.js"></script>
+    <script src="../../../packages/vue-server-renderer/basic.js"></script>
+
+    <div id="result">wtf</div>
+
+    <script>
+    var vm = new Vue({
+      data: { msg: 'foo' },
+      template: '<div>{{ msg }}</div>'
+    })
+
+    renderVueComponentToString(vm, function (err, result) {
+      document.getElementById('result').textContent = err && err.toString() || result
+    })
+    </script>
+  </body>
+</html>
diff --git a/advancedcontentfilter/vendor/asset/vue/test/e2e/specs/basic-ssr.js b/advancedcontentfilter/vendor/asset/vue/test/e2e/specs/basic-ssr.js
new file mode 100644 (file)
index 0000000..b1ea240
--- /dev/null
@@ -0,0 +1,8 @@
+module.exports = {
+  'basic SSR': function (browser) {
+    browser
+    .url('http://localhost:8080/test/e2e/specs/basic-ssr.html')
+      .assert.containsText('#result', '<div data-server-rendered="true">foo</div>')
+      .end()
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/test/e2e/specs/commits.js b/advancedcontentfilter/vendor/asset/vue/test/e2e/specs/commits.js
new file mode 100644 (file)
index 0000000..cf81527
--- /dev/null
@@ -0,0 +1,23 @@
+module.exports = {
+  'commits': function (browser) {
+    browser
+    .url('http://localhost:8080/examples/commits/')
+      .waitForElementVisible('li', 5000)
+      .assert.count('input', 2)
+      .assert.count('label', 2)
+      .assert.containsText('label[for="master"]', 'master')
+      .assert.containsText('label[for="dev"]', 'dev')
+      .assert.checked('#master')
+      .assert.checked('#dev', false)
+      .assert.containsText('p', 'vuejs/vue@master')
+      .assert.count('li', 3)
+      .assert.count('li .commit', 3)
+      .assert.count('li .message', 3)
+      .click('#dev')
+      .assert.containsText('p', 'vuejs/vue@dev')
+      .assert.count('li', 3)
+      .assert.count('li .commit', 3)
+      .assert.count('li .message', 3)
+      .end()
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/test/e2e/specs/grid.js b/advancedcontentfilter/vendor/asset/vue/test/e2e/specs/grid.js
new file mode 100644 (file)
index 0000000..7c27335
--- /dev/null
@@ -0,0 +1,105 @@
+module.exports = {
+  'grid': function (browser) {
+    var columns = ['name', 'power']
+
+    browser
+    .url('http://localhost:8080/examples/grid/')
+      .waitForElementVisible('table', 1000)
+      .assert.count('th', 2)
+      .assert.count('th.active', 0)
+      .assert.containsText('th:nth-child(1)', 'Name')
+      .assert.containsText('th:nth-child(2)', 'Power')
+      assertTable([
+        { name: 'Chuck Norris', power: Infinity },
+        { name: 'Bruce Lee', power: 9000 },
+        { name: 'Jackie Chan', power: 7000 },
+        { name: 'Jet Li', power: 8000 }
+      ])
+
+    browser
+      .click('th:nth-child(1)')
+      .assert.count('th.active:nth-child(1)', 1)
+      .assert.count('th.active:nth-child(2)', 0)
+      .assert.count('th:nth-child(1) .arrow.dsc', 1)
+      .assert.count('th:nth-child(2) .arrow.dsc', 0)
+      assertTable([
+        { name: 'Jet Li', power: 8000 },
+        { name: 'Jackie Chan', power: 7000 },
+        { name: 'Chuck Norris', power: Infinity },
+        { name: 'Bruce Lee', power: 9000 }
+      ])
+
+    browser
+      .click('th:nth-child(2)')
+      .assert.count('th.active:nth-child(1)', 0)
+      .assert.count('th.active:nth-child(2)', 1)
+      .assert.count('th:nth-child(1) .arrow.dsc', 1)
+      .assert.count('th:nth-child(2) .arrow.dsc', 1)
+      assertTable([
+        { name: 'Chuck Norris', power: Infinity },
+        { name: 'Bruce Lee', power: 9000 },
+        { name: 'Jet Li', power: 8000 },
+        { name: 'Jackie Chan', power: 7000 }
+      ])
+
+    browser
+      .click('th:nth-child(2)')
+      .assert.count('th.active:nth-child(1)', 0)
+      .assert.count('th.active:nth-child(2)', 1)
+      .assert.count('th:nth-child(1) .arrow.dsc', 1)
+      .assert.count('th:nth-child(2) .arrow.asc', 1)
+      assertTable([
+        { name: 'Jackie Chan', power: 7000 },
+        { name: 'Jet Li', power: 8000 },
+        { name: 'Bruce Lee', power: 9000 },
+        { name: 'Chuck Norris', power: Infinity }
+      ])
+
+    browser
+      .click('th:nth-child(1)')
+      .assert.count('th.active:nth-child(1)', 1)
+      .assert.count('th.active:nth-child(2)', 0)
+      .assert.count('th:nth-child(1) .arrow.asc', 1)
+      .assert.count('th:nth-child(2) .arrow.asc', 1)
+      assertTable([
+        { name: 'Bruce Lee', power: 9000 },
+        { name: 'Chuck Norris', power: Infinity },
+        { name: 'Jackie Chan', power: 7000 },
+        { name: 'Jet Li', power: 8000 }
+      ])
+
+    browser
+      .setValue('input[name="query"]', 'j')
+      assertTable([
+        { name: 'Jackie Chan', power: 7000 },
+        { name: 'Jet Li', power: 8000 }
+      ])
+
+    browser
+      .clearValue('input[name="query"]')
+      .setValue('input[name="query"]', 'infinity')
+      assertTable([
+        { name: 'Chuck Norris', power: Infinity }
+      ])
+
+    browser
+      .clearValue('input[name="query"]')
+      .assert.count('p', 0)
+      .setValue('input[name="query"]', 'stringthatdoesnotexistanywhere')
+      .assert.count('p', 1)
+
+    browser.end()
+
+    function assertTable (data) {
+      browser.assert.count('td', data.length * columns.length)
+      for (var i = 0; i < data.length; i++) {
+        for (var j = 0; j < columns.length; j++) {
+          browser.assert.containsText(
+            'tr:nth-child(' + (i + 1) + ') td:nth-child(' + (j + 1) + ')',
+            data[i][columns[j]]
+          )
+        }
+      }
+    }
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/test/e2e/specs/markdown.js b/advancedcontentfilter/vendor/asset/vue/test/e2e/specs/markdown.js
new file mode 100644 (file)
index 0000000..84be2b4
--- /dev/null
@@ -0,0 +1,19 @@
+module.exports = {
+  'markdown': function (browser) {
+    browser
+    .url('http://localhost:8080/examples/markdown/')
+      .waitForElementVisible('#editor', 1000)
+      .assert.value('textarea', '# hello')
+      .assert.hasHTML('#editor div', '<h1 id="hello">hello</h1>')
+      .setValue('textarea', '\n## foo\n\n- bar\n- baz')
+      // assert the output is not updated yet because of debounce
+      .assert.hasHTML('#editor div', '<h1 id="hello">hello</h1>')
+      .waitFor(500)
+      .assert.hasHTML('#editor div',
+        '<h1 id="hello">hello</h1>\n' +
+        '<h2 id="foo">foo</h2>\n' +
+        '<ul>\n<li>bar</li>\n<li>baz</li>\n</ul>'
+      )
+      .end()
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/test/e2e/specs/modal.js b/advancedcontentfilter/vendor/asset/vue/test/e2e/specs/modal.js
new file mode 100644 (file)
index 0000000..947bab1
--- /dev/null
@@ -0,0 +1,27 @@
+module.exports = {
+  'modal': function (browser) {
+    browser
+    .url('http://localhost:8080/examples/modal/')
+      .waitForElementVisible('#app', 1000)
+      .assert.elementNotPresent('.modal-mask')
+      .click('#show-modal')
+      .assert.elementPresent('.modal-mask')
+      .assert.elementPresent('.modal-wrapper')
+      .assert.elementPresent('.modal-container')
+      .waitFor(50)
+      .assert.cssClassPresent('.modal-mask', 'modal-enter-active')
+      .waitFor(300)
+      .assert.cssClassNotPresent('.modal-mask', 'modal-enter-active')
+      .assert.containsText('.modal-header h3', 'custom header')
+      .assert.containsText('.modal-body', 'default body')
+      .assert.containsText('.modal-footer', 'default footer')
+      .click('.modal-default-button')
+      // should have transition
+      .assert.elementPresent('.modal-mask')
+      .waitFor(50)
+      .assert.cssClassPresent('.modal-mask', 'modal-leave-active')
+      .waitFor(300)
+      .assert.elementNotPresent('.modal-mask')
+      .end()
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/test/e2e/specs/select2.js b/advancedcontentfilter/vendor/asset/vue/test/e2e/specs/select2.js
new file mode 100644 (file)
index 0000000..ada225d
--- /dev/null
@@ -0,0 +1,46 @@
+/* globals vm */
+module.exports = {
+  'select2': function (browser) {
+    browser
+    .url('http://localhost:8080/examples/select2/')
+      .waitForElementVisible('.select2', 1000)
+      .assert.elementPresent('select')
+      .assert.containsText('p', 'Selected: 0')
+      .assert.containsText('span.select2', 'Select one')
+
+      .click('.select2-selection__rendered')
+      .assert.count('.select2-results__option', 3)
+      .assert.containsText('.select2-results__option:nth-child(1)', 'Select one')
+      .assert.containsText('.select2-results__option:nth-child(2)', 'Hello')
+      .assert.containsText('.select2-results__option:nth-child(3)', 'World')
+      .assert.attributePresent('.select2-results__option:nth-child(1)', 'aria-disabled')
+
+      .click('.select2-results__option:nth-child(2)')
+      .assert.count('.select2-results__option', 0)
+      .assert.containsText('p', 'Selected: 1')
+      .assert.containsText('span.select2', 'Hello')
+
+      // test dynamic options
+      .execute(function () {
+        vm.options.push({ id: 3, text: 'Vue' })
+      })
+      .click('.select2-selection__rendered')
+      .assert.count('.select2-results__option', 4)
+      .assert.containsText('.select2-results__option:nth-child(1)', 'Select one')
+      .assert.containsText('.select2-results__option:nth-child(2)', 'Hello')
+      .assert.containsText('.select2-results__option:nth-child(3)', 'World')
+      .assert.containsText('.select2-results__option:nth-child(4)', 'Vue')
+
+      .click('.select2-results__option:nth-child(4)')
+      .assert.count('.select2-results__option', 0)
+      .assert.containsText('p', 'Selected: 3')
+      .assert.containsText('span.select2', 'Vue')
+
+      .execute(function () {
+        vm.selected = 2
+      })
+      .assert.containsText('p', 'Selected: 2')
+      .assert.containsText('span.select2', 'World')
+      .end()
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/test/e2e/specs/svg.js b/advancedcontentfilter/vendor/asset/vue/test/e2e/specs/svg.js
new file mode 100644 (file)
index 0000000..7726bff
--- /dev/null
@@ -0,0 +1,48 @@
+/* globals stats, valueToPoint */
+module.exports = {
+  'svg': function (browser) {
+    browser
+    .url('http://localhost:8080/examples/svg/')
+      .waitForElementVisible('svg', 1000)
+      .assert.count('g', 1)
+      .assert.count('polygon', 1)
+      .assert.count('circle', 1)
+      .assert.count('text', 6)
+      .assert.count('label', 6)
+      .assert.count('button', 7)
+      .assert.count('input[type="range"]', 6)
+      .assert.evaluate(function () {
+        var points = stats.map(function (stat, i) {
+        var point = valueToPoint(stat.value, i, 6)
+          return point.x + ',' + point.y
+        }).join(' ')
+        return document.querySelector('polygon').attributes[0].value === points
+      })
+      .click('button.remove')
+      .assert.count('text', 5)
+      .assert.count('label', 5)
+      .assert.count('button', 6)
+      .assert.count('input[type="range"]', 5)
+      .assert.evaluate(function () {
+        var points = stats.map(function (stat, i) {
+        var point = valueToPoint(stat.value, i, 5)
+          return point.x + ',' + point.y
+        }).join(' ')
+        return document.querySelector('polygon').attributes[0].value === points
+      })
+      .setValue('input[name="newlabel"]', 'foo')
+      .click('#add > button')
+      .assert.count('text', 6)
+      .assert.count('label', 6)
+      .assert.count('button', 7)
+      .assert.count('input[type="range"]', 6)
+      .assert.evaluate(function () {
+        var points = stats.map(function (stat, i) {
+        var point = valueToPoint(stat.value, i, 6)
+          return point.x + ',' + point.y
+        }).join(' ')
+        return document.querySelector('polygon').attributes[0].value === points
+      })
+      .end()
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/test/e2e/specs/todomvc.js b/advancedcontentfilter/vendor/asset/vue/test/e2e/specs/todomvc.js
new file mode 100644 (file)
index 0000000..7f3c42f
--- /dev/null
@@ -0,0 +1,166 @@
+module.exports = {
+  'todomvc': function (browser) {
+    browser
+    .url('http://localhost:8080/examples/todomvc/#test')
+      .waitForElementVisible('.todoapp', 1000)
+      .assert.notVisible('.main')
+      .assert.notVisible('.footer')
+      .assert.count('.filters .selected', 1)
+      .assert.evaluate(function () {
+        return document.querySelector('.filters .selected').textContent === 'All'
+      })
+
+    createNewItem('test')
+      .assert.count('.todo', 1)
+      .assert.notVisible('.todo .edit')
+      .assert.containsText('.todo label', 'test')
+      .assert.containsText('.todo-count strong', '1')
+      .assert.checked('.todo .toggle', false)
+      .assert.visible('.main')
+      .assert.visible('.footer')
+      .assert.notVisible('.clear-completed')
+      .assert.value('.new-todo', '')
+
+    createNewItem('test2')
+      .assert.count('.todo', 2)
+      .assert.containsText('.todo:nth-child(2) label', 'test2')
+      .assert.containsText('.todo-count strong', '2')
+
+    // toggle
+    browser
+      .click('.todo .toggle')
+      .assert.count('.todo.completed', 1)
+      .assert.cssClassPresent('.todo:nth-child(1)', 'completed')
+      .assert.containsText('.todo-count strong', '1')
+      .assert.visible('.clear-completed')
+
+    createNewItem('test3')
+      .assert.count('.todo', 3)
+      .assert.containsText('.todo:nth-child(3) label', 'test3')
+      .assert.containsText('.todo-count strong', '2')
+
+    createNewItem('test4')
+    createNewItem('test5')
+      .assert.count('.todo', 5)
+      .assert.containsText('.todo-count strong', '4')
+
+    // toggle more
+    browser
+      .click('.todo:nth-child(4) .toggle')
+      .click('.todo:nth-child(5) .toggle')
+      .assert.count('.todo.completed', 3)
+      .assert.containsText('.todo-count strong', '2')
+
+    // remove
+    removeItemAt(1)
+      .assert.count('.todo', 4)
+      .assert.count('.todo.completed', 2)
+      .assert.containsText('.todo-count strong', '2')
+    removeItemAt(2)
+      .assert.count('.todo', 3)
+      .assert.count('.todo.completed', 2)
+      .assert.containsText('.todo-count strong', '1')
+
+    // remove all
+    browser
+      .click('.clear-completed')
+      .assert.count('.todo', 1)
+      .assert.containsText('.todo label', 'test2')
+      .assert.count('.todo.completed', 0)
+      .assert.containsText('.todo-count strong', '1')
+      .assert.notVisible('.clear-completed')
+
+    // prepare to test filters
+    createNewItem('test')
+    createNewItem('test')
+      .click('.todo:nth-child(2) .toggle')
+      .click('.todo:nth-child(3) .toggle')
+
+    // active filter
+    browser
+      .click('.filters li:nth-child(2) a')
+      .assert.count('.todo', 1)
+      .assert.count('.todo.completed', 0)
+      // add item with filter active
+      createNewItem('test')
+      .assert.count('.todo', 2)
+
+    // completed filter
+    browser.click('.filters li:nth-child(3) a')
+      .assert.count('.todo', 2)
+      .assert.count('.todo.completed', 2)
+
+    // filter on page load
+    browser.url('http://localhost:8080/examples/todomvc/#active')
+      .assert.count('.todo', 2)
+      .assert.count('.todo.completed', 0)
+      .assert.containsText('.todo-count strong', '2')
+
+    // completed on page load
+    browser.url('http://localhost:8080/examples/todomvc/#completed')
+      .assert.count('.todo', 2)
+      .assert.count('.todo.completed', 2)
+      .assert.containsText('.todo-count strong', '2')
+
+    // toggling with filter active
+    browser
+      .click('.todo .toggle')
+      .assert.count('.todo', 1)
+      .click('.filters li:nth-child(2) a')
+      .assert.count('.todo', 3)
+      .click('.todo .toggle')
+      .assert.count('.todo', 2)
+
+    // editing triggered by blur
+    browser
+      .click('.filters li:nth-child(1) a')
+      .dblClick('.todo:nth-child(1) label')
+      .assert.count('.todo.editing', 1)
+      .assert.focused('.todo:nth-child(1) .edit')
+      .clearValue('.todo:nth-child(1) .edit')
+      .setValue('.todo:nth-child(1) .edit', 'edited!')
+      .click('footer') // blur
+      .assert.count('.todo.editing', 0)
+      .assert.containsText('.todo:nth-child(1) label', 'edited!')
+
+    // editing triggered by enter
+    browser
+      .dblClick('.todo label')
+      .enterValue('.todo:nth-child(1) .edit', 'edited again!')
+      .assert.count('.todo.editing', 0)
+      .assert.containsText('.todo:nth-child(1) label', 'edited again!')
+
+    // cancel
+    browser
+      .dblClick('.todo label')
+      .clearValue('.todo:nth-child(1) .edit')
+      .setValue('.todo:nth-child(1) .edit', 'edited!')
+      .trigger('.todo:nth-child(1) .edit', 'keyup', 27)
+      .assert.count('.todo.editing', 0)
+      .assert.containsText('.todo:nth-child(1) label', 'edited again!')
+
+    // empty value should remove
+    browser
+      .dblClick('.todo label')
+      .enterValue('.todo:nth-child(1) .edit', ' ')
+      .assert.count('.todo', 3)
+
+    // toggle all
+    browser
+      .click('.toggle-all')
+      .assert.count('.todo.completed', 3)
+      .click('.toggle-all')
+      .assert.count('.todo:not(.completed)', 3)
+      .end()
+
+    function createNewItem (text) {
+      return browser.enterValue('.new-todo', text)
+    }
+
+    function removeItemAt (n) {
+      return browser
+        .moveToElement('.todo:nth-child(' + n + ')', 10, 10)
+        .click('.todo:nth-child(' + n + ') .destroy')
+    }
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/test/e2e/specs/tree.js b/advancedcontentfilter/vendor/asset/vue/test/e2e/specs/tree.js
new file mode 100644 (file)
index 0000000..92ae25d
--- /dev/null
@@ -0,0 +1,72 @@
+module.exports = {
+  'tree': function (browser) {
+    browser
+    .url('http://localhost:8080/examples/tree/')
+      .waitForElementVisible('li', 1000)
+      .assert.count('.item', 12)
+      .assert.count('.add', 4)
+      .assert.count('.item > ul', 4)
+      .assert.notVisible('#demo li ul')
+      .assert.containsText('#demo li div span', '[+]')
+
+      // expand root
+      .click('.bold')
+      .assert.visible('#demo ul')
+      .assert.evaluate(function () {
+        return document.querySelector('#demo li ul').children.length === 4
+      })
+      .assert.containsText('#demo li div span', '[-]')
+      .assert.containsText('#demo > .item > ul > .item:nth-child(1)', 'hello')
+      .assert.containsText('#demo > .item > ul > .item:nth-child(2)', 'wat')
+      .assert.containsText('#demo > .item > ul > .item:nth-child(3)', 'child folder')
+      .assert.containsText('#demo > .item > ul > .item:nth-child(3)', '[+]')
+
+      // add items to root
+      .click('#demo > .item > ul > .add')
+      .assert.evaluate(function () {
+        return document.querySelector('#demo li ul').children.length === 5
+      })
+      .assert.containsText('#demo > .item > ul > .item:nth-child(1)', 'hello')
+      .assert.containsText('#demo > .item > ul > .item:nth-child(2)', 'wat')
+      .assert.containsText('#demo > .item > ul > .item:nth-child(3)', 'child folder')
+      .assert.containsText('#demo > .item > ul > .item:nth-child(3)', '[+]')
+      .assert.containsText('#demo > .item > ul > .item:nth-child(4)', 'new stuff')
+
+      // add another item
+      .click('#demo > .item > ul > .add')
+      .assert.evaluate(function () {
+        return document.querySelector('#demo li ul').children.length === 6
+      })
+      .assert.containsText('#demo > .item > ul > .item:nth-child(1)', 'hello')
+      .assert.containsText('#demo > .item > ul > .item:nth-child(2)', 'wat')
+      .assert.containsText('#demo > .item > ul > .item:nth-child(3)', 'child folder')
+      .assert.containsText('#demo > .item > ul > .item:nth-child(3)', '[+]')
+      .assert.containsText('#demo > .item > ul > .item:nth-child(4)', 'new stuff')
+      .assert.containsText('#demo > .item > ul > .item:nth-child(5)', 'new stuff')
+
+      .click('#demo ul .bold')
+      .assert.visible('#demo ul ul')
+      .assert.containsText('#demo ul > .item:nth-child(3)', '[-]')
+      .assert.evaluate(function () {
+        return document.querySelector('#demo ul ul').children.length === 5
+      })
+
+      .click('.bold')
+      .assert.notVisible('#demo ul')
+      .assert.containsText('#demo li div span', '[+]')
+      .click('.bold')
+      .assert.visible('#demo ul')
+      .assert.containsText('#demo li div span', '[-]')
+
+      .dblClick('#demo ul > .item div')
+      .assert.count('.item', 15)
+      .assert.count('.item > ul', 5)
+      .assert.containsText('#demo ul > .item:nth-child(1)', '[-]')
+      .assert.evaluate(function () {
+        var firstItem = document.querySelector('#demo ul > .item:nth-child(1)')
+        var ul = firstItem.querySelector('ul')
+        return ul.children.length === 2
+      })
+      .end()
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/test/helpers/.eslintrc b/advancedcontentfilter/vendor/asset/vue/test/helpers/.eslintrc
new file mode 100644 (file)
index 0000000..de3ffc6
--- /dev/null
@@ -0,0 +1,8 @@
+{
+  "env": {
+    "jasmine": true
+  },
+  "globals": {
+    "waitForUpdate": true
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/test/helpers/classlist.js b/advancedcontentfilter/vendor/asset/vue/test/helpers/classlist.js
new file mode 100644 (file)
index 0000000..29e04b8
--- /dev/null
@@ -0,0 +1,18 @@
+beforeEach(() => {
+  jasmine.addMatchers({
+    // since classList may not be supported in all browsers
+    toHaveClass: () => {
+      return {
+        compare: (el, cls) => {
+          const pass = el.classList
+            ? el.classList.contains(cls)
+            : el.getAttribute('class').split(/\s+/g).indexOf(cls) > -1
+          return {
+            pass,
+            message: `Expected element${pass ? ' ' : ' not '}to have class ${cls}`
+          }
+        }
+      }
+    }
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/helpers/test-object-option.js b/advancedcontentfilter/vendor/asset/vue/test/helpers/test-object-option.js
new file mode 100644 (file)
index 0000000..0589292
--- /dev/null
@@ -0,0 +1,17 @@
+import Vue from 'vue'
+
+export default function testObjectOption (name) {
+  it(`Options ${name}: should warn non object value`, () => {
+    const options = {}
+    options[name] = () => {}
+    new Vue(options)
+    expect(`Invalid value for option "${name}"`).toHaveBeenWarned()
+  })
+
+  it(`Options ${name}: should not warn valid object value`, () => {
+    const options = {}
+    options[name] = {}
+    new Vue(options)
+    expect(`Invalid value for option "${name}"`).not.toHaveBeenWarned()
+  })
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/test/helpers/to-equal.js b/advancedcontentfilter/vendor/asset/vue/test/helpers/to-equal.js
new file mode 100644 (file)
index 0000000..33308bd
--- /dev/null
@@ -0,0 +1,19 @@
+import { isEqual } from 'lodash'
+
+beforeEach(() => {
+  jasmine.addMatchers({
+    // override built-in toEqual because it behaves incorrectly
+    // on Vue-observed arrays in Safari
+    toEqual: () => {
+      return {
+        compare: (a, b) => {
+          const pass = isEqual(a, b)
+          return {
+            pass,
+            message: `Expected ${a} to equal ${b}`
+          }
+        }
+      }
+    }
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/helpers/to-have-been-warned.js b/advancedcontentfilter/vendor/asset/vue/test/helpers/to-have-been-warned.js
new file mode 100644 (file)
index 0000000..097b0e6
--- /dev/null
@@ -0,0 +1,70 @@
+function noop () {}
+
+if (typeof console === 'undefined') {
+  window.console = {
+    warn: noop,
+    error: noop
+  }
+}
+
+// avoid info messages during test
+console.info = noop
+
+let asserted
+
+function createCompareFn (spy) {
+  const hasWarned = msg => {
+    var count = spy.calls.count()
+    var args
+    while (count--) {
+      args = spy.calls.argsFor(count)
+      if (args.some(containsMsg)) {
+        return true
+      }
+    }
+
+    function containsMsg (arg) {
+      return arg.toString().indexOf(msg) > -1
+    }
+  }
+
+  return {
+    compare: msg => {
+      asserted = asserted.concat(msg)
+      var warned = Array.isArray(msg)
+        ? msg.some(hasWarned)
+        : hasWarned(msg)
+      return {
+        pass: warned,
+        message: warned
+          ? 'Expected message "' + msg + '" not to have been warned'
+          : 'Expected message "' + msg + '" to have been warned'
+      }
+    }
+  }
+}
+
+// define custom matcher for warnings
+beforeEach(() => {
+  asserted = []
+  spyOn(console, 'warn')
+  spyOn(console, 'error')
+  jasmine.addMatchers({
+    toHaveBeenWarned: () => createCompareFn(console.error),
+    toHaveBeenTipped: () => createCompareFn(console.warn)
+  })
+})
+
+afterEach(done => {
+  const warned = msg => asserted.some(assertedMsg => msg.toString().indexOf(assertedMsg) > -1)
+  let count = console.error.calls.count()
+  let args
+  while (count--) {
+    args = console.error.calls.argsFor(count)
+    if (!warned(args[0])) {
+      done.fail(`Unexpected console.error message: ${args[0]}`)
+      return
+    }
+  }
+  done()
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/helpers/trigger-event.js b/advancedcontentfilter/vendor/asset/vue/test/helpers/trigger-event.js
new file mode 100644 (file)
index 0000000..12ea7e2
--- /dev/null
@@ -0,0 +1,6 @@
+window.triggerEvent = function triggerEvent (target, event, process) {
+  var e = document.createEvent('HTMLEvents')
+  e.initEvent(event, true, true)
+  if (process) process(e)
+  target.dispatchEvent(e)
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/test/helpers/vdom.js b/advancedcontentfilter/vendor/asset/vue/test/helpers/vdom.js
new file mode 100644 (file)
index 0000000..abfb189
--- /dev/null
@@ -0,0 +1,5 @@
+import VNode from 'core/vdom/vnode'
+
+window.createTextVNode = function (text) {
+  return new VNode(undefined, undefined, undefined, text)
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/test/helpers/wait-for-update.js b/advancedcontentfilter/vendor/asset/vue/test/helpers/wait-for-update.js
new file mode 100644 (file)
index 0000000..37f87db
--- /dev/null
@@ -0,0 +1,73 @@
+import Vue from 'vue'
+
+// helper for async assertions.
+// Use like this:
+//
+// vm.a = 123
+// waitForUpdate(() => {
+//   expect(vm.$el.textContent).toBe('123')
+//   vm.a = 234
+// })
+// .then(() => {
+//   // more assertions...
+// })
+// .then(done)
+window.waitForUpdate = initialCb => {
+  let end
+  const queue = initialCb ? [initialCb] : []
+
+  function shift () {
+    const job = queue.shift()
+    if (queue.length) {
+      let hasError = false
+      try {
+        job.wait ? job(shift) : job()
+      } catch (e) {
+        hasError = true
+        const done = queue[queue.length - 1]
+        if (done && done.fail) {
+          done.fail(e)
+        }
+      }
+      if (!hasError && !job.wait) {
+        if (queue.length) {
+          Vue.nextTick(shift)
+        }
+      }
+    } else if (job && (job.fail || job === end)) {
+      job() // done
+    }
+  }
+
+  Vue.nextTick(() => {
+    if (!queue.length || (!end && !queue[queue.length - 1].fail)) {
+      throw new Error('waitForUpdate chain is missing .then(done)')
+    }
+    shift()
+  })
+
+  const chainer = {
+    then: nextCb => {
+      queue.push(nextCb)
+      return chainer
+    },
+    thenWaitFor: (wait) => {
+      if (typeof wait === 'number') {
+        wait = timeout(wait)
+      }
+      wait.wait = true
+      queue.push(wait)
+      return chainer
+    },
+    end: endFn => {
+      queue.push(endFn)
+      end = endFn
+    }
+  }
+
+  return chainer
+}
+
+function timeout (n) {
+  return next => setTimeout(next, n)
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/test/ssr/.eslintrc b/advancedcontentfilter/vendor/asset/vue/test/ssr/.eslintrc
new file mode 100644 (file)
index 0000000..dab5d0e
--- /dev/null
@@ -0,0 +1,9 @@
+{
+  "env": {
+    "jasmine": true
+  },
+  "plugins": ["jasmine"],
+  "rules": {
+    "jasmine/no-focused-tests": 2
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/test/ssr/async-loader.js b/advancedcontentfilter/vendor/asset/vue/test/ssr/async-loader.js
new file mode 100644 (file)
index 0000000..41b4a98
--- /dev/null
@@ -0,0 +1,6 @@
+const hash = require('hash-sum')
+
+module.exports = function (code) {
+  const id = hash(this.request) // simulating vue-loader module id injection
+  return code.replace('__MODULE_ID__', id)
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/test/ssr/compile-with-webpack.js b/advancedcontentfilter/vendor/asset/vue/test/ssr/compile-with-webpack.js
new file mode 100644 (file)
index 0000000..765898e
--- /dev/null
@@ -0,0 +1,38 @@
+import path from 'path'
+import webpack from 'webpack'
+import MemoryFS from 'memory-fs'
+
+export function compileWithWebpack (file, extraConfig, cb) {
+  const config = Object.assign({
+    entry: path.resolve(__dirname, 'fixtures', file),
+    module: {
+      rules: [
+        {
+          test: /\.js$/,
+          loader: 'babel-loader'
+        },
+        {
+          test: /async-.*\.js$/,
+          loader: require.resolve('./async-loader')
+        },
+        {
+          test: /\.(png|woff2|css)$/,
+          loader: 'file-loader',
+          options: {
+            name: '[name].[ext]'
+          }
+        }
+      ]
+    }
+  }, extraConfig)
+
+  const compiler = webpack(config)
+  const fs = new MemoryFS()
+  compiler.outputFileSystem = fs
+
+  compiler.run((err, stats) => {
+    expect(err).toBeFalsy()
+    expect(stats.errors).toBeFalsy()
+    cb(fs)
+  })
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/test/ssr/fixtures/app.js b/advancedcontentfilter/vendor/asset/vue/test/ssr/fixtures/app.js
new file mode 100644 (file)
index 0000000..85bb288
--- /dev/null
@@ -0,0 +1,12 @@
+import Vue from '../../../dist/vue.runtime.common.js'
+
+export default context => {
+  return new Promise(resolve => {
+    context.msg = 'hello'
+    resolve(new Vue({
+      render (h) {
+        return h('div', context.url)
+      }
+    }))
+  })
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/test/ssr/fixtures/async-bar.js b/advancedcontentfilter/vendor/asset/vue/test/ssr/fixtures/async-bar.js
new file mode 100644 (file)
index 0000000..5eb93c1
--- /dev/null
@@ -0,0 +1,8 @@
+module.exports = {
+  beforeCreate () {
+    this.$vnode.ssrContext._registeredComponents.add('__MODULE_ID__')
+  },
+  render (h) {
+    return h('div', 'async bar')
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/test/ssr/fixtures/async-foo.js b/advancedcontentfilter/vendor/asset/vue/test/ssr/fixtures/async-foo.js
new file mode 100644 (file)
index 0000000..929d73f
--- /dev/null
@@ -0,0 +1,13 @@
+// import image and font
+import './test.css'
+import font from './test.woff2'
+import image from './test.png'
+
+module.exports = {
+  beforeCreate () {
+    this.$vnode.ssrContext._registeredComponents.add('__MODULE_ID__')
+  },
+  render (h) {
+    return h('div', `async ${font} ${image}`)
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/test/ssr/fixtures/cache.js b/advancedcontentfilter/vendor/asset/vue/test/ssr/fixtures/cache.js
new file mode 100644 (file)
index 0000000..2901677
--- /dev/null
@@ -0,0 +1,16 @@
+import Vue from '../../../dist/vue.runtime.common.js'
+
+const app = {
+  name: 'app',
+  props: ['id'],
+  serverCacheKey: props => props.id,
+  render (h) {
+    return h('div', '/test')
+  }
+}
+
+export default () => {
+  return Promise.resolve(new Vue({
+    render: h => h(app, { props: { id: 1 }})
+  }))
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/test/ssr/fixtures/error.js b/advancedcontentfilter/vendor/asset/vue/test/ssr/fixtures/error.js
new file mode 100644 (file)
index 0000000..a4548e3
--- /dev/null
@@ -0,0 +1 @@
+throw new Error('foo')
diff --git a/advancedcontentfilter/vendor/asset/vue/test/ssr/fixtures/nested-cache.js b/advancedcontentfilter/vendor/asset/vue/test/ssr/fixtures/nested-cache.js
new file mode 100644 (file)
index 0000000..9f26568
--- /dev/null
@@ -0,0 +1,49 @@
+import Vue from '../../../dist/vue.runtime.common.js'
+
+function createRegisterFn (id) {
+  return function (context) {
+    context = context || this.$vnode.ssrContext
+    context.registered.push(id)
+  }
+}
+
+function addHooks (comp) {
+  const hook = createRegisterFn(comp.name)
+  return Object.assign(comp, {
+    _ssrRegister: hook,
+    beforeCreate: hook
+  })
+}
+
+const grandchild = addHooks({
+  name: 'grandchild',
+  props: ['id'],
+  serverCacheKey: props => props.id,
+  render (h) {
+    return h('div', '/test')
+  }
+})
+
+const child = addHooks({
+  name: 'child',
+  props: ['id'],
+  serverCacheKey: props => props.id,
+  render (h) {
+    return h(grandchild, { props: { id: this.id }})
+  }
+})
+
+const app = addHooks({
+  name: 'app',
+  props: ['id'],
+  serverCacheKey: props => props.id,
+  render (h) {
+    return h(child, { props: { id: this.id }})
+  }
+})
+
+export default () => {
+  return Promise.resolve(new Vue({
+    render: h => h(app, { props: { id: 1 }})
+  }))
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/test/ssr/fixtures/promise-rejection.js b/advancedcontentfilter/vendor/asset/vue/test/ssr/fixtures/promise-rejection.js
new file mode 100644 (file)
index 0000000..40dcccf
--- /dev/null
@@ -0,0 +1,3 @@
+export default () => {
+  return Promise.reject(new Error('foo'))
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/test/ssr/fixtures/split.js b/advancedcontentfilter/vendor/asset/vue/test/ssr/fixtures/split.js
new file mode 100644 (file)
index 0000000..5cd3850
--- /dev/null
@@ -0,0 +1,26 @@
+import Vue from '../../../dist/vue.runtime.common.js'
+
+// async component!
+const Foo = () => import('./async-foo')
+const Bar = () => import('./async-bar') // eslint-disable-line
+
+export default context => {
+  return new Promise(resolve => {
+    context.msg = 'hello'
+    const vm = new Vue({
+      render (h) {
+        return h('div', [
+          context.url,
+          h(Foo)
+        ])
+      }
+    })
+
+    // simulate router.onReady
+    Foo().then(comp => {
+      // resolve now to make the render sync
+      Foo.resolved = Vue.extend(comp)
+      resolve(vm)
+    })
+  })
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/test/ssr/fixtures/test.css b/advancedcontentfilter/vendor/asset/vue/test/ssr/fixtures/test.css
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/advancedcontentfilter/vendor/asset/vue/test/ssr/fixtures/test.png b/advancedcontentfilter/vendor/asset/vue/test/ssr/fixtures/test.png
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/advancedcontentfilter/vendor/asset/vue/test/ssr/fixtures/test.woff2 b/advancedcontentfilter/vendor/asset/vue/test/ssr/fixtures/test.woff2
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/advancedcontentfilter/vendor/asset/vue/test/ssr/jasmine.json b/advancedcontentfilter/vendor/asset/vue/test/ssr/jasmine.json
new file mode 100644 (file)
index 0000000..345ed14
--- /dev/null
@@ -0,0 +1,9 @@
+{
+  "spec_dir": "test/ssr",
+  "spec_files": [
+    "*.spec.js"
+  ],
+  "helpers": [
+    "../../node_modules/babel-register/lib/node.js"
+  ]
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/test/ssr/ssr-basic-renderer.spec.js b/advancedcontentfilter/vendor/asset/vue/test/ssr/ssr-basic-renderer.spec.js
new file mode 100644 (file)
index 0000000..7cbacbe
--- /dev/null
@@ -0,0 +1,70 @@
+import Vue from '../../dist/vue.runtime.common.js'
+import renderToString from '../../packages/vue-server-renderer/basic'
+
+describe('SSR: basicRenderer', () => {
+  it('should work', done => {
+    renderToString(new Vue({
+      template: `
+        <div>
+          <p class="hi">yoyo</p>
+          <div id="ho" :class="{ red: isRed }"></div>
+          <span>{{ test }}</span>
+          <input :value="test">
+          <img :src="imageUrl">
+          <test></test>
+          <test-async></test-async>
+        </div>
+      `,
+      data: {
+        test: 'hi',
+        isRed: true,
+        imageUrl: 'https://vuejs.org/images/logo.png'
+      },
+      components: {
+        test: {
+          render () {
+            return this.$createElement('div', { class: ['a'] }, 'test')
+          }
+        },
+        testAsync (resolve) {
+          resolve({
+            render () {
+              return this.$createElement('span', { class: ['b'] }, 'testAsync')
+            }
+          })
+        }
+      }
+    }), (err, result) => {
+      expect(err).toBeNull()
+      expect(result).toContain(
+        '<div data-server-rendered="true">' +
+          '<p class="hi">yoyo</p> ' +
+          '<div id="ho" class="red"></div> ' +
+          '<span>hi</span> ' +
+          '<input value="hi"> ' +
+          '<img src="https://vuejs.org/images/logo.png"> ' +
+          '<div class="a">test</div> ' +
+          '<span class="b">testAsync</span>' +
+        '</div>'
+      )
+      done()
+    })
+  })
+
+  // #5941
+  it('should work peoperly when accessing $ssrContext in root component', done => {
+    let ssrContext
+    renderToString(new Vue({
+      template: `
+        <div></div>
+      `,
+      created () {
+        ssrContext = this.$ssrContext
+      }
+    }), (err, result) => {
+      expect(err).toBeNull()
+      expect(ssrContext).toBeUndefined()
+      done()
+    })
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/ssr/ssr-bundle-render.spec.js b/advancedcontentfilter/vendor/asset/vue/test/ssr/ssr-bundle-render.spec.js
new file mode 100644 (file)
index 0000000..8ea05b3
--- /dev/null
@@ -0,0 +1,309 @@
+import LRU from 'lru-cache'
+import { compileWithWebpack } from './compile-with-webpack'
+import { createBundleRenderer } from '../../packages/vue-server-renderer'
+import VueSSRServerPlugin from '../../packages/vue-server-renderer/server-plugin'
+
+export function createRenderer (file, options, cb) {
+  if (typeof options === 'function') {
+    cb = options
+    options = undefined
+  }
+  const asBundle = !!(options && options.asBundle)
+  if (options) delete options.asBundle
+
+  compileWithWebpack(file, {
+    target: 'node',
+    devtool: asBundle ? '#source-map' : false,
+    output: {
+      path: '/',
+      filename: 'bundle.js',
+      libraryTarget: 'commonjs2'
+    },
+    externals: [require.resolve('../../dist/vue.runtime.common.js')],
+    plugins: asBundle
+      ? [new VueSSRServerPlugin()]
+      : []
+  }, fs => {
+    const bundle = asBundle
+      ? JSON.parse(fs.readFileSync('/vue-ssr-server-bundle.json', 'utf-8'))
+      : fs.readFileSync('/bundle.js', 'utf-8')
+    const renderer = createBundleRenderer(bundle, options)
+    cb(renderer)
+  })
+}
+
+describe('SSR: bundle renderer', () => {
+  createAssertions(true)
+  createAssertions(false)
+})
+
+function createAssertions (runInNewContext) {
+  it('renderToString', done => {
+    createRenderer('app.js', { runInNewContext }, renderer => {
+      const context = { url: '/test' }
+      renderer.renderToString(context, (err, res) => {
+        expect(err).toBeNull()
+        expect(res).toBe('<div data-server-rendered="true">/test</div>')
+        expect(context.msg).toBe('hello')
+        done()
+      })
+    })
+  })
+
+  it('renderToStream', done => {
+    createRenderer('app.js', { runInNewContext }, renderer => {
+      const context = { url: '/test' }
+      const stream = renderer.renderToStream(context)
+      let res = ''
+      stream.on('data', chunk => {
+        res += chunk.toString()
+      })
+      stream.on('end', () => {
+        expect(res).toBe('<div data-server-rendered="true">/test</div>')
+        expect(context.msg).toBe('hello')
+        done()
+      })
+    })
+  })
+
+  it('renderToString catch error', done => {
+    createRenderer('error.js', { runInNewContext }, renderer => {
+      renderer.renderToString(err => {
+        expect(err.message).toBe('foo')
+        done()
+      })
+    })
+  })
+
+  it('renderToString catch Promise rejection', done => {
+    createRenderer('promise-rejection.js', { runInNewContext }, renderer => {
+      renderer.renderToString(err => {
+        expect(err.message).toBe('foo')
+        done()
+      })
+    })
+  })
+
+  it('renderToStream catch error', done => {
+    createRenderer('error.js', { runInNewContext }, renderer => {
+      const stream = renderer.renderToStream()
+      stream.on('error', err => {
+        expect(err.message).toBe('foo')
+        done()
+      })
+    })
+  })
+
+  it('renderToStream catch Promise rejection', done => {
+    createRenderer('promise-rejection.js', { runInNewContext }, renderer => {
+      const stream = renderer.renderToStream()
+      stream.on('error', err => {
+        expect(err.message).toBe('foo')
+        done()
+      })
+    })
+  })
+
+  it('render with cache (get/set)', done => {
+    const cache = {}
+    const get = jasmine.createSpy('get')
+    const set = jasmine.createSpy('set')
+    const options = {
+      runInNewContext,
+      cache: {
+        // async
+        get: (key, cb) => {
+          setTimeout(() => {
+            get(key)
+            cb(cache[key])
+          }, 0)
+        },
+        set: (key, val) => {
+          set(key, val)
+          cache[key] = val
+        }
+      }
+    }
+    createRenderer('cache.js', options, renderer => {
+      const expected = '<div data-server-rendered="true">/test</div>'
+      const key = 'app::1'
+      renderer.renderToString((err, res) => {
+        expect(err).toBeNull()
+        expect(res).toBe(expected)
+        expect(get).toHaveBeenCalledWith(key)
+        const setArgs = set.calls.argsFor(0)
+        expect(setArgs[0]).toBe(key)
+        expect(setArgs[1].html).toBe(expected)
+        expect(cache[key].html).toBe(expected)
+        renderer.renderToString((err, res) => {
+          expect(err).toBeNull()
+          expect(res).toBe(expected)
+          expect(get.calls.count()).toBe(2)
+          expect(set.calls.count()).toBe(1)
+          done()
+        })
+      })
+    })
+  })
+
+  it('render with cache (get/set/has)', done => {
+    const cache = {}
+    const has = jasmine.createSpy('has')
+    const get = jasmine.createSpy('get')
+    const set = jasmine.createSpy('set')
+    const options = {
+      runInNewContext,
+      cache: {
+        // async
+        has: (key, cb) => {
+          has(key)
+          cb(!!cache[key])
+        },
+        // sync
+        get: key => {
+          get(key)
+          return cache[key]
+        },
+        set: (key, val) => {
+          set(key, val)
+          cache[key] = val
+        }
+      }
+    }
+    createRenderer('cache.js', options, renderer => {
+      const expected = '<div data-server-rendered="true">/test</div>'
+      const key = 'app::1'
+      renderer.renderToString((err, res) => {
+        expect(err).toBeNull()
+        expect(res).toBe(expected)
+        expect(has).toHaveBeenCalledWith(key)
+        expect(get).not.toHaveBeenCalled()
+        const setArgs = set.calls.argsFor(0)
+        expect(setArgs[0]).toBe(key)
+        expect(setArgs[1].html).toBe(expected)
+        expect(cache[key].html).toBe(expected)
+        renderer.renderToString((err, res) => {
+          expect(err).toBeNull()
+          expect(res).toBe(expected)
+          expect(has.calls.count()).toBe(2)
+          expect(get.calls.count()).toBe(1)
+          expect(set.calls.count()).toBe(1)
+          done()
+        })
+      })
+    })
+  })
+
+  it('render with cache (nested)', done => {
+    const cache = LRU({ maxAge: Infinity })
+    spyOn(cache, 'get').and.callThrough()
+    spyOn(cache, 'set').and.callThrough()
+    const options = {
+      cache,
+      runInNewContext
+    }
+    createRenderer('nested-cache.js', options, renderer => {
+      const expected = '<div data-server-rendered="true">/test</div>'
+      const key = 'app::1'
+      const context1 = { registered: [] }
+      const context2 = { registered: [] }
+      renderer.renderToString(context1, (err, res) => {
+        expect(err).toBeNull()
+        expect(res).toBe(expected)
+        expect(cache.set.calls.count()).toBe(3) // 3 nested components cached
+        const cached = cache.get(key)
+        expect(cached.html).toBe(expected)
+        expect(cache.get.calls.count()).toBe(1)
+
+        // assert component usage registration for nested children
+        expect(context1.registered).toEqual(['app', 'child', 'grandchild'])
+
+        renderer.renderToString(context2, (err, res) => {
+          expect(err).toBeNull()
+          expect(res).toBe(expected)
+          expect(cache.set.calls.count()).toBe(3) // no new cache sets
+          expect(cache.get.calls.count()).toBe(2) // 1 get for root
+
+          expect(context2.registered).toEqual(['app', 'child', 'grandchild'])
+          done()
+        })
+      })
+    })
+  })
+
+  it('renderToString (bundle format with code split)', done => {
+    createRenderer('split.js', { runInNewContext, asBundle: true }, renderer => {
+      const context = { url: '/test' }
+      renderer.renderToString(context, (err, res) => {
+        expect(err).toBeNull()
+        expect(res).toBe('<div data-server-rendered="true">/test<div>async test.woff2 test.png</div></div>')
+        done()
+      })
+    })
+  })
+
+  it('renderToStream (bundle format with code split)', done => {
+    createRenderer('split.js', { runInNewContext, asBundle: true }, renderer => {
+      const context = { url: '/test' }
+      const stream = renderer.renderToStream(context)
+      let res = ''
+      stream.on('data', chunk => {
+        res += chunk.toString()
+      })
+      stream.on('end', () => {
+        expect(res).toBe('<div data-server-rendered="true">/test<div>async test.woff2 test.png</div></div>')
+        done()
+      })
+    })
+  })
+
+  it('renderToString catch error (bundle format with source map)', done => {
+    createRenderer('error.js', { runInNewContext, asBundle: true }, renderer => {
+      renderer.renderToString(err => {
+        expect(err.stack).toContain('test/ssr/fixtures/error.js:1:6')
+        expect(err.message).toBe('foo')
+        done()
+      })
+    })
+  })
+
+  it('renderToString catch error (bundle format with source map)', done => {
+    createRenderer('error.js', { runInNewContext, asBundle: true }, renderer => {
+      const stream = renderer.renderToStream()
+      stream.on('error', err => {
+        expect(err.stack).toContain('test/ssr/fixtures/error.js:1:6')
+        expect(err.message).toBe('foo')
+        done()
+      })
+    })
+  })
+
+  it('renderToString return Promise', done => {
+    createRenderer('app.js', { runInNewContext }, renderer => {
+      const context = { url: '/test' }
+      renderer.renderToString(context).then(res => {
+        expect(res).toBe('<div data-server-rendered="true">/test</div>')
+        expect(context.msg).toBe('hello')
+        done()
+      })
+    })
+  })
+
+  it('renderToString return Promise (error)', done => {
+    createRenderer('error.js', { runInNewContext }, renderer => {
+      renderer.renderToString().catch(err => {
+        expect(err.message).toBe('foo')
+        done()
+      })
+    })
+  })
+
+  it('renderToString return Promise (Promise rejection)', done => {
+    createRenderer('promise-rejection.js', { runInNewContext }, renderer => {
+      renderer.renderToString().catch(err => {
+        expect(err.message).toBe('foo')
+        done()
+      })
+    })
+  })
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/test/ssr/ssr-stream.spec.js b/advancedcontentfilter/vendor/asset/vue/test/ssr/ssr-stream.spec.js
new file mode 100644 (file)
index 0000000..b18707a
--- /dev/null
@@ -0,0 +1,105 @@
+import Vue from '../../dist/vue.runtime.common.js'
+import { createRenderer } from '../../packages/vue-server-renderer'
+const { renderToStream } = createRenderer()
+
+describe('SSR: renderToStream', () => {
+  it('should render to a stream', done => {
+    const stream = renderToStream(new Vue({
+      template: `
+        <div>
+          <p class="hi">yoyo</p>
+          <div id="ho" :class="[testClass, { red: isRed }]"></div>
+          <span>{{ test }}</span>
+          <input :value="test">
+          <b-comp></b-comp>
+          <c-comp></c-comp>
+        </div>
+      `,
+      data: {
+        test: 'hi',
+        isRed: true,
+        testClass: 'a'
+      },
+      components: {
+        bComp (resolve) {
+          return resolve({
+            render (h) {
+              return h('test-async-2')
+            },
+            components: {
+              testAsync2 (resolve) {
+                return resolve({
+                  created () { this.$parent.$parent.testClass = 'b' },
+                  render (h) {
+                    return h('div', { class: [this.$parent.$parent.testClass] }, 'test')
+                  }
+                })
+              }
+            }
+          })
+        },
+        cComp: {
+          render (h) {
+            return h('div', { class: [this.$parent.testClass] }, 'test')
+          }
+        }
+      }
+    }))
+    let res = ''
+    stream.on('data', chunk => {
+      res += chunk
+    })
+    stream.on('end', () => {
+      expect(res).toContain(
+        '<div data-server-rendered="true">' +
+          '<p class="hi">yoyo</p> ' +
+          '<div id="ho" class="a red"></div> ' +
+          '<span>hi</span> ' +
+          '<input value="hi"> ' +
+          '<div class="b">test</div> ' +
+          '<div class="b">test</div>' +
+        '</div>'
+      )
+      done()
+    })
+  })
+
+  it('should catch error', done => {
+    Vue.config.silent = true
+    const stream = renderToStream(new Vue({
+      render () {
+        throw new Error('oops')
+      }
+    }))
+    stream.on('error', err => {
+      expect(err.toString()).toMatch(/oops/)
+      Vue.config.silent = false
+      done()
+    })
+    stream.on('data', _ => _)
+  })
+
+  it('should not mingle two components', done => {
+    const padding = (new Array(20000)).join('x')
+    const component1 = new Vue({
+      template: `<div>${padding}<div></div></div>`,
+      _scopeId: '_component1'
+    })
+    const component2 = new Vue({
+      template: `<div></div>`,
+      _scopeId: '_component2'
+    })
+    var stream1 = renderToStream(component1)
+    var stream2 = renderToStream(component2)
+    var res = ''
+    stream1.on('data', (text) => {
+      res += text.toString('utf-8').replace(/x/g, '')
+    })
+    stream1.on('end', () => {
+      expect(res).not.toContain('_component2')
+      done()
+    })
+    stream1.read(1)
+    stream2.read(1)
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/ssr/ssr-string.spec.js b/advancedcontentfilter/vendor/asset/vue/test/ssr/ssr-string.spec.js
new file mode 100644 (file)
index 0000000..5300bbf
--- /dev/null
@@ -0,0 +1,1239 @@
+import Vue from '../../dist/vue.runtime.common.js'
+import VM from 'vm'
+import { createRenderer } from '../../packages/vue-server-renderer'
+const { renderToString } = createRenderer()
+
+describe('SSR: renderToString', () => {
+  it('static attributes', done => {
+    renderVmWithOptions({
+      template: '<div id="foo" bar="123"></div>'
+    }, result => {
+      expect(result).toContain('<div id="foo" bar="123" data-server-rendered="true"></div>')
+      done()
+    })
+  })
+
+  it('unary tags', done => {
+    renderVmWithOptions({
+      template: '<input value="123">'
+    }, result => {
+      expect(result).toContain('<input value="123" data-server-rendered="true">')
+      done()
+    })
+  })
+
+  it('dynamic attributes', done => {
+    renderVmWithOptions({
+      template: '<div qux="quux" :id="foo" :bar="baz"></div>',
+      data: {
+        foo: 'hi',
+        baz: 123
+      }
+    }, result => {
+      expect(result).toContain('<div qux="quux" id="hi" bar="123" data-server-rendered="true"></div>')
+      done()
+    })
+  })
+
+  it('static class', done => {
+    renderVmWithOptions({
+      template: '<div class="foo bar"></div>'
+    }, result => {
+      expect(result).toContain('<div data-server-rendered="true" class="foo bar"></div>')
+      done()
+    })
+  })
+
+  it('dynamic class', done => {
+    renderVmWithOptions({
+      template: '<div class="foo bar" :class="[a, { qux: hasQux, quux: hasQuux }]"></div>',
+      data: {
+        a: 'baz',
+        hasQux: true,
+        hasQuux: false
+      }
+    }, result => {
+      expect(result).toContain('<div data-server-rendered="true" class="foo bar baz qux"></div>')
+      done()
+    })
+  })
+
+  it('custom component class', done => {
+    renderVmWithOptions({
+      template: '<div><cmp class="cmp"></cmp></div>',
+      components: {
+        cmp: {
+          render: h => h('div', 'test')
+        }
+      }
+    }, result => {
+      expect(result).toContain('<div data-server-rendered="true"><div class="cmp">test</div></div>')
+      done()
+    })
+  })
+
+  it('nested component class', done => {
+    renderVmWithOptions({
+      template: '<cmp class="outer" :class="cls"></cmp>',
+      data: { cls: { 'success': 1 }},
+      components: {
+        cmp: {
+          render: h => h('div', [h('nested', { staticClass: 'nested', 'class': { 'error': 1 }})]),
+          components: {
+            nested: {
+              render: h => h('div', { staticClass: 'inner' }, 'test')
+            }
+          }
+        }
+      }
+    }, result => {
+      expect(result).toContain('<div data-server-rendered="true" class="outer success">' +
+          '<div class="inner nested error">test</div>' +
+        '</div>')
+      done()
+    })
+  })
+
+  it('dynamic style', done => {
+    renderVmWithOptions({
+      template: '<div style="background-color:black" :style="{ fontSize: fontSize + \'px\', color: color }"></div>',
+      data: {
+        fontSize: 14,
+        color: 'red'
+      }
+    }, result => {
+      expect(result).toContain(
+        '<div data-server-rendered="true" style="background-color:black;font-size:14px;color:red;"></div>'
+      )
+      done()
+    })
+  })
+
+  it('dynamic string style', done => {
+    renderVmWithOptions({
+      template: '<div :style="style"></div>',
+      data: {
+        style: 'color:red'
+      }
+    }, result => {
+      expect(result).toContain(
+        '<div data-server-rendered="true" style="color:red;"></div>'
+      )
+      done()
+    })
+  })
+
+  it('auto-prefixed style value as array', done => {
+    renderVmWithOptions({
+      template: '<div :style="style"></div>',
+      data: {
+        style: {
+          display: ['-webkit-box', '-ms-flexbox', 'flex']
+        }
+      }
+    }, result => {
+      expect(result).toContain(
+        '<div data-server-rendered="true" style="display:-webkit-box;display:-ms-flexbox;display:flex;"></div>'
+      )
+      done()
+    })
+  })
+
+  it('custom component style', done => {
+    renderVmWithOptions({
+      template: '<section><comp :style="style"></comp></section>',
+      data: {
+        style: 'color:red'
+      },
+      components: {
+        comp: {
+          template: '<div></div>'
+        }
+      }
+    }, result => {
+      expect(result).toContain(
+        '<section data-server-rendered="true"><div style="color:red;"></div></section>'
+      )
+      done()
+    })
+  })
+
+  it('nested custom component style', done => {
+    renderVmWithOptions({
+      template: '<comp style="color: blue" :style="style"></comp>',
+      data: {
+        style: 'color:red'
+      },
+      components: {
+        comp: {
+          template: '<nested style="text-align: left;" :style="{fontSize:\'520rem\'}"></nested>',
+          components: {
+            nested: {
+              template: '<div></div>'
+            }
+          }
+        }
+      }
+    }, result => {
+      expect(result).toContain(
+        '<div data-server-rendered="true" style="text-align:left;font-size:520rem;color:red;"></div>'
+      )
+      done()
+    })
+  })
+
+  it('component style not passed to child', done => {
+    renderVmWithOptions({
+      template: '<comp :style="style"></comp>',
+      data: {
+        style: 'color:red'
+      },
+      components: {
+        comp: {
+          template: '<div><div></div></div>'
+        }
+      }
+    }, result => {
+      expect(result).toContain(
+        '<div data-server-rendered="true" style="color:red;"><div></div></div>'
+      )
+      done()
+    })
+  })
+
+  it('component style not passed to slot', done => {
+    renderVmWithOptions({
+      template: '<comp :style="style"><span style="color:black"></span></comp>',
+      data: {
+        style: 'color:red'
+      },
+      components: {
+        comp: {
+          template: '<div><slot></slot></div>'
+        }
+      }
+    }, result => {
+      expect(result).toContain(
+        '<div data-server-rendered="true" style="color:red;"><span style="color:black;"></span></div>'
+      )
+      done()
+    })
+  })
+
+  it('attrs merging on components', done => {
+    const Test = {
+      render: h => h('div', {
+        attrs: { id: 'a' }
+      })
+    }
+    renderVmWithOptions({
+      render: h => h(Test, {
+        attrs: { id: 'b', name: 'c' }
+      })
+    }, res => {
+      expect(res).toContain(
+        '<div id="b" data-server-rendered="true" name="c"></div>'
+      )
+      done()
+    })
+  })
+
+  it('domProps merging on components', done => {
+    const Test = {
+      render: h => h('div', {
+        domProps: { innerHTML: 'a' }
+      })
+    }
+    renderVmWithOptions({
+      render: h => h(Test, {
+        domProps: { innerHTML: 'b', value: 'c' }
+      })
+    }, res => {
+      expect(res).toContain(
+        '<div data-server-rendered="true" value="c">b</div>'
+      )
+      done()
+    })
+  })
+
+  it('v-show directive render', done => {
+    renderVmWithOptions({
+      template: '<div v-show="false"><span>inner</span></div>'
+    }, res => {
+      expect(res).toContain(
+        '<div data-server-rendered="true" style="display:none;"><span>inner</span></div>'
+      )
+      done()
+    })
+  })
+
+  it('v-show directive merge with style', done => {
+    renderVmWithOptions({
+      template: '<div :style="[{lineHeight: 1}]" v-show="false"><span>inner</span></div>'
+    }, res => {
+      expect(res).toContain(
+        '<div data-server-rendered="true" style="line-height:1;display:none;"><span>inner</span></div>'
+      )
+      done()
+    })
+  })
+
+  it('v-show directive not passed to child', done => {
+    renderVmWithOptions({
+      template: '<foo v-show="false"></foo>',
+      components: {
+        foo: {
+          template: '<div><span>inner</span></div>'
+        }
+      }
+    }, res => {
+      expect(res).toContain(
+        '<div data-server-rendered="true" style="display:none;"><span>inner</span></div>'
+      )
+      done()
+    })
+  })
+
+  it('v-show directive not passed to slot', done => {
+    renderVmWithOptions({
+      template: '<foo v-show="false"><span>inner</span></foo>',
+      components: {
+        foo: {
+          template: '<div><slot></slot></div>'
+        }
+      }
+    }, res => {
+      expect(res).toContain(
+        '<div data-server-rendered="true" style="display:none;"><span>inner</span></div>'
+      )
+      done()
+    })
+  })
+
+  it('v-show directive merging on components', done => {
+    renderVmWithOptions({
+      template: '<foo v-show="false"></foo>',
+      components: {
+        foo: {
+          render: h => h('bar', {
+            directives: [{
+              name: 'show',
+              value: true
+            }]
+          }),
+          components: {
+            bar: {
+              render: h => h('div', 'inner')
+            }
+          }
+        }
+      }
+    }, res => {
+      expect(res).toContain(
+        '<div data-server-rendered="true" style="display:none;">inner</div>'
+      )
+      done()
+    })
+  })
+
+  it('text interpolation', done => {
+    renderVmWithOptions({
+      template: '<div>{{ foo }} side {{ bar }}</div>',
+      data: {
+        foo: 'server',
+        bar: '<span>rendering</span>'
+      }
+    }, result => {
+      expect(result).toContain('<div data-server-rendered="true">server side &lt;span&gt;rendering&lt;/span&gt;</div>')
+      done()
+    })
+  })
+
+  it('v-html on root', done => {
+    renderVmWithOptions({
+      template: '<div v-html="text"></div>',
+      data: {
+        text: '<span>foo</span>'
+      }
+    }, result => {
+      expect(result).toContain('<div data-server-rendered="true"><span>foo</span></div>')
+      done()
+    })
+  })
+
+  it('v-text on root', done => {
+    renderVmWithOptions({
+      template: '<div v-text="text"></div>',
+      data: {
+        text: '<span>foo</span>'
+      }
+    }, result => {
+      expect(result).toContain('<div data-server-rendered="true">&lt;span&gt;foo&lt;/span&gt;</div>')
+      done()
+    })
+  })
+
+  it('v-html', done => {
+    renderVmWithOptions({
+      template: '<div><div v-html="text"></div></div>',
+      data: {
+        text: '<span>foo</span>'
+      }
+    }, result => {
+      expect(result).toContain('<div data-server-rendered="true"><div><span>foo</span></div></div>')
+      done()
+    })
+  })
+
+  it('v-html with null value', done => {
+    renderVmWithOptions({
+      template: '<div><div v-html="text"></div></div>',
+      data: {
+        text: null
+      }
+    }, result => {
+      expect(result).toContain('<div data-server-rendered="true"><div></div></div>')
+      done()
+    })
+  })
+
+  it('v-text', done => {
+    renderVmWithOptions({
+      template: '<div><div v-text="text"></div></div>',
+      data: {
+        text: '<span>foo</span>'
+      }
+    }, result => {
+      expect(result).toContain('<div data-server-rendered="true"><div>&lt;span&gt;foo&lt;/span&gt;</div></div>')
+      done()
+    })
+  })
+
+  it('v-text with null value', done => {
+    renderVmWithOptions({
+      template: '<div><div v-text="text"></div></div>',
+      data: {
+        text: null
+      }
+    }, result => {
+      expect(result).toContain('<div data-server-rendered="true"><div></div></div>')
+      done()
+    })
+  })
+
+  it('child component (hoc)', done => {
+    renderVmWithOptions({
+      template: '<child class="foo" :msg="msg"></child>',
+      data: {
+        msg: 'hello'
+      },
+      components: {
+        child: {
+          props: ['msg'],
+          data () {
+            return { name: 'bar' }
+          },
+          render () {
+            const h = this.$createElement
+            return h('div', { class: ['bar'] }, [`${this.msg} ${this.name}`])
+          }
+        }
+      }
+    }, result => {
+      expect(result).toContain('<div data-server-rendered="true" class="foo bar">hello bar</div>')
+      done()
+    })
+  })
+
+  it('has correct lifecycle during render', done => {
+    let lifecycleCount = 1
+    renderVmWithOptions({
+      template: '<div><span>{{ val }}</span><test></test></div>',
+      data: {
+        val: 'hi'
+      },
+      beforeCreate () {
+        expect(lifecycleCount++).toBe(1)
+      },
+      created () {
+        this.val = 'hello'
+        expect(this.val).toBe('hello')
+        expect(lifecycleCount++).toBe(2)
+      },
+      components: {
+        test: {
+          beforeCreate () {
+            expect(lifecycleCount++).toBe(3)
+          },
+          created () {
+            expect(lifecycleCount++).toBe(4)
+          },
+          render () {
+            expect(lifecycleCount++).toBeGreaterThan(4)
+            return this.$createElement('span', { class: ['b'] }, 'testAsync')
+          }
+        }
+      }
+    }, result => {
+      expect(result).toContain(
+        '<div data-server-rendered="true">' +
+          '<span>hello</span>' +
+          '<span class="b">testAsync</span>' +
+        '</div>'
+      )
+      done()
+    })
+  })
+
+  it('computed properties', done => {
+    renderVmWithOptions({
+      template: '<div>{{ b }}</div>',
+      data: {
+        a: {
+          b: 1
+        }
+      },
+      computed: {
+        b () {
+          return this.a.b + 1
+        }
+      },
+      created () {
+        this.a.b = 2
+        expect(this.b).toBe(3)
+      }
+    }, result => {
+      expect(result).toContain('<div data-server-rendered="true">3</div>')
+      done()
+    })
+  })
+
+  it('renders async component', done => {
+    renderVmWithOptions({
+      template: `
+        <div>
+          <test-async></test-async>
+        </div>
+      `,
+      components: {
+        testAsync (resolve) {
+          setTimeout(() => resolve({
+            render () {
+              return this.$createElement('span', { class: ['b'] }, 'testAsync')
+            }
+          }), 1)
+        }
+      }
+    }, result => {
+      expect(result).toContain('<div data-server-rendered="true"><span class="b">testAsync</span></div>')
+      done()
+    })
+  })
+
+  it('renders async component (Promise, nested)', done => {
+    const Foo = () => Promise.resolve({
+      render: h => h('div', [h('span', 'foo'), h(Bar)])
+    })
+    const Bar = () => ({
+      component: Promise.resolve({
+        render: h => h('span', 'bar')
+      })
+    })
+    renderVmWithOptions({
+      render: h => h(Foo)
+    }, res => {
+      expect(res).toContain(`<div data-server-rendered="true"><span>foo</span><span>bar</span></div>`)
+      done()
+    })
+  })
+
+  it('renders async component (ES module)', done => {
+    const Foo = () => Promise.resolve({
+      __esModule: true,
+      default: {
+        render: h => h('div', [h('span', 'foo'), h(Bar)])
+      }
+    })
+    const Bar = () => ({
+      component: Promise.resolve({
+        __esModule: true,
+        default: {
+          render: h => h('span', 'bar')
+        }
+      })
+    })
+    renderVmWithOptions({
+      render: h => h(Foo)
+    }, res => {
+      expect(res).toContain(`<div data-server-rendered="true"><span>foo</span><span>bar</span></div>`)
+      done()
+    })
+  })
+
+  it('renders async component (hoc)', done => {
+    renderVmWithOptions({
+      template: '<test-async></test-async>',
+      components: {
+        testAsync: () => Promise.resolve({
+          render () {
+            return this.$createElement('span', { class: ['b'] }, 'testAsync')
+          }
+        })
+      }
+    }, result => {
+      expect(result).toContain('<span data-server-rendered="true" class="b">testAsync</span>')
+      done()
+    })
+  })
+
+  it('renders async component (functional, single node)', done => {
+    renderVmWithOptions({
+      template: `
+        <div>
+          <test-async></test-async>
+        </div>
+      `,
+      components: {
+        testAsync (resolve) {
+          setTimeout(() => resolve({
+            functional: true,
+            render (h) {
+              return h('span', { class: ['b'] }, 'testAsync')
+            }
+          }), 1)
+        }
+      }
+    }, result => {
+      expect(result).toContain('<div data-server-rendered="true"><span class="b">testAsync</span></div>')
+      done()
+    })
+  })
+
+  it('renders async component (functional, multiple nodes)', done => {
+    renderVmWithOptions({
+      template: `
+        <div>
+          <test-async></test-async>
+        </div>
+      `,
+      components: {
+        testAsync (resolve) {
+          setTimeout(() => resolve({
+            functional: true,
+            render (h) {
+              return [
+                h('span', { class: ['a'] }, 'foo'),
+                h('span', { class: ['b'] }, 'bar')
+              ]
+            }
+          }), 1)
+        }
+      }
+    }, result => {
+      expect(result).toContain(
+        '<div data-server-rendered="true">' +
+          '<span class="a">foo</span>' +
+          '<span class="b">bar</span>' +
+        '</div>'
+      )
+      done()
+    })
+  })
+
+  it('should catch async component error', done => {
+    Vue.config.silent = true
+    renderToString(new Vue({
+      template: '<test-async></test-async>',
+      components: {
+        testAsync: () => Promise.resolve({
+          render () {
+            throw new Error('foo')
+          }
+        })
+      }
+    }), (err, result) => {
+      Vue.config.silent = false
+      expect(err).toBeTruthy()
+      expect(result).toBeUndefined()
+      done()
+    })
+  })
+
+  it('everything together', done => {
+    renderVmWithOptions({
+      template: `
+        <div>
+          <p class="hi">yoyo</p>
+          <div id="ho" :class="{ red: isRed }"></div>
+          <span>{{ test }}</span>
+          <input :value="test">
+          <img :src="imageUrl">
+          <test></test>
+          <test-async></test-async>
+        </div>
+      `,
+      data: {
+        test: 'hi',
+        isRed: true,
+        imageUrl: 'https://vuejs.org/images/logo.png'
+      },
+      components: {
+        test: {
+          render () {
+            return this.$createElement('div', { class: ['a'] }, 'test')
+          }
+        },
+        testAsync (resolve) {
+          resolve({
+            render () {
+              return this.$createElement('span', { class: ['b'] }, 'testAsync')
+            }
+          })
+        }
+      }
+    }, result => {
+      expect(result).toContain(
+        '<div data-server-rendered="true">' +
+          '<p class="hi">yoyo</p> ' +
+          '<div id="ho" class="red"></div> ' +
+          '<span>hi</span> ' +
+          '<input value="hi"> ' +
+          '<img src="https://vuejs.org/images/logo.png"> ' +
+          '<div class="a">test</div> ' +
+          '<span class="b">testAsync</span>' +
+        '</div>'
+      )
+      done()
+    })
+  })
+
+  it('normal attr', done => {
+    renderVmWithOptions({
+      template: `
+        <div>
+          <span :test="'ok'">hello</span>
+          <span :test="null">hello</span>
+          <span :test="false">hello</span>
+          <span :test="true">hello</span>
+          <span :test="0">hello</span>
+        </div>
+      `
+    }, result => {
+      expect(result).toContain(
+        '<div data-server-rendered="true">' +
+          '<span test="ok">hello</span> ' +
+          '<span>hello</span> ' +
+          '<span>hello</span> ' +
+          '<span test="true">hello</span> ' +
+          '<span test="0">hello</span>' +
+        '</div>'
+      )
+      done()
+    })
+  })
+
+  it('enumerated attr', done => {
+    renderVmWithOptions({
+      template: `
+        <div>
+          <span :draggable="true">hello</span>
+          <span :draggable="'ok'">hello</span>
+          <span :draggable="null">hello</span>
+          <span :draggable="false">hello</span>
+          <span :draggable="''">hello</span>
+          <span :draggable="'false'">hello</span>
+        </div>
+      `
+    }, result => {
+      expect(result).toContain(
+        '<div data-server-rendered="true">' +
+          '<span draggable="true">hello</span> ' +
+          '<span draggable="true">hello</span> ' +
+          '<span draggable="false">hello</span> ' +
+          '<span draggable="false">hello</span> ' +
+          '<span draggable="true">hello</span> ' +
+          '<span draggable="false">hello</span>' +
+        '</div>'
+      )
+      done()
+    })
+  })
+
+  it('boolean attr', done => {
+    renderVmWithOptions({
+      template: `
+        <div>
+          <span :disabled="true">hello</span>
+          <span :disabled="'ok'">hello</span>
+          <span :disabled="null">hello</span>
+          <span :disabled="''">hello</span>
+        </div>
+      `
+    }, result => {
+      expect(result).toContain(
+        '<div data-server-rendered="true">' +
+          '<span disabled="disabled">hello</span> ' +
+          '<span disabled="disabled">hello</span> ' +
+          '<span>hello</span> ' +
+          '<span disabled="disabled">hello</span>' +
+        '</div>'
+      )
+      done()
+    })
+  })
+
+  it('v-bind object', done => {
+    renderVmWithOptions({
+      data: {
+        test: { id: 'a', class: ['a', 'b'], value: 'c' }
+      },
+      template: '<input v-bind="test">'
+    }, result => {
+      expect(result).toContain('<input id="a" data-server-rendered="true" value="c" class="a b">')
+      done()
+    })
+  })
+
+  it('custom directives', done => {
+    const renderer = createRenderer({
+      directives: {
+        'class-prefixer': (node, dir) => {
+          if (node.data.class) {
+            node.data.class = `${dir.value}-${node.data.class}`
+          }
+          if (node.data.staticClass) {
+            node.data.staticClass = `${dir.value}-${node.data.staticClass}`
+          }
+        }
+      }
+    })
+    renderer.renderToString(new Vue({
+      render () {
+        const h = this.$createElement
+        return h('p', {
+          class: 'class1',
+          staticClass: 'class2',
+          directives: [{
+            name: 'class-prefixer',
+            value: 'my'
+          }]
+        }, ['hello world'])
+      }
+    }), (err, result) => {
+      expect(err).toBeNull()
+      expect(result).toContain('<p data-server-rendered="true" class="my-class2 my-class1">hello world</p>')
+      done()
+    })
+  })
+
+  it('_scopeId', done => {
+    renderVmWithOptions({
+      _scopeId: '_v-parent',
+      template: '<div id="foo"><p><child></child></p></div>',
+      components: {
+        child: {
+          _scopeId: '_v-child',
+          render () {
+            const h = this.$createElement
+            return h('div', null, [h('span', null, ['foo'])])
+          }
+        }
+      }
+    }, result => {
+      expect(result).toContain(
+        '<div id="foo" data-server-rendered="true" _v-parent>' +
+          '<p _v-parent>' +
+            '<div _v-child _v-parent><span _v-child>foo</span></div>' +
+          '</p>' +
+        '</div>'
+      )
+      done()
+    })
+  })
+
+  it('_scopeId on slot content', done => {
+    renderVmWithOptions({
+      _scopeId: '_v-parent',
+      template: '<div><child><p>foo</p></child></div>',
+      components: {
+        child: {
+          _scopeId: '_v-child',
+          render () {
+            const h = this.$createElement
+            return h('div', null, this.$slots.default)
+          }
+        }
+      }
+    }, result => {
+      expect(result).toContain(
+        '<div data-server-rendered="true" _v-parent>' +
+          '<div _v-child _v-parent><p _v-child _v-parent>foo</p></div>' +
+        '</div>'
+      )
+      done()
+    })
+  })
+
+  it('comment nodes', done => {
+    renderVmWithOptions({
+      template: '<div><transition><div v-if="false"></div></transition></div>'
+    }, result => {
+      expect(result).toContain(`<div data-server-rendered="true"><!----></div>`)
+      done()
+    })
+  })
+
+  it('should catch error', done => {
+    Vue.config.silent = true
+    renderToString(new Vue({
+      render () {
+        throw new Error('oops')
+      }
+    }), err => {
+      expect(err instanceof Error).toBe(true)
+      Vue.config.silent = false
+      done()
+    })
+  })
+
+  it('default value Foreign Function', () => {
+    const FunctionConstructor = VM.runInNewContext('Function')
+    const func = () => 123
+    const vm = new Vue({
+      props: {
+        a: {
+          type: FunctionConstructor,
+          default: func
+        }
+      },
+      propsData: {
+        a: undefined
+      }
+    })
+    expect(vm.a).toBe(func)
+  })
+
+  it('should prevent xss in attributes', done => {
+    renderVmWithOptions({
+      data: {
+        xss: '"><script>alert(1)</script>'
+      },
+      template: `
+        <div>
+          <a :title="xss" :style="{ color: xss }" :class="[xss]">foo</a>
+        </div>
+      `
+    }, res => {
+      expect(res).not.toContain(`<script>alert(1)</script>`)
+      done()
+    })
+  })
+
+  it('should prevent script xss with v-bind object syntax + array value', done => {
+    renderVmWithOptions({
+      data: {
+        test: ['"><script>alert(1)</script><!--"']
+      },
+      template: `<div v-bind="{ test }"></div>`
+    }, res => {
+      expect(res).not.toContain(`<script>alert(1)</script>`)
+      done()
+    })
+  })
+
+  it('v-if', done => {
+    renderVmWithOptions({
+      template: `
+        <div>
+          <span v-if="true">foo</span>
+          <span v-if="false">bar</span>
+        </div>
+      `
+    }, res => {
+      expect(res).toContain(`<div data-server-rendered="true"><span>foo</span> <!----></div>`)
+      done()
+    })
+  })
+
+  it('v-for', done => {
+    renderVmWithOptions({
+      template: `
+        <div>
+          <span>foo</span>
+          <span v-for="i in 2">{{ i }}</span>
+        </div>
+      `
+    }, res => {
+      expect(res).toContain(`<div data-server-rendered="true"><span>foo</span> <span>1</span><span>2</span></div>`)
+      done()
+    })
+  })
+
+  it('template v-if', done => {
+    renderVmWithOptions({
+      template: `
+        <div>
+          <span>foo</span>
+          <template v-if="true">
+            <span>foo</span> bar <span>baz</span>
+          </template>
+        </div>
+      `
+    }, res => {
+      expect(res).toContain(`<div data-server-rendered="true"><span>foo</span> <span>foo</span> bar <span>baz</span></div>`)
+      done()
+    })
+  })
+
+  it('template v-for', done => {
+    renderVmWithOptions({
+      template: `
+        <div>
+          <span>foo</span>
+          <template v-for="i in 2">
+            <span>{{ i }}</span><span>bar</span>
+          </template>
+        </div>
+      `
+    }, res => {
+      expect(res).toContain(`<div data-server-rendered="true"><span>foo</span> <span>1</span><span>bar</span><span>2</span><span>bar</span></div>`)
+      done()
+    })
+  })
+
+  it('with inheritAttrs: false + $attrs', done => {
+    renderVmWithOptions({
+      template: `<foo id="a"/>`,
+      components: {
+        foo: {
+          inheritAttrs: false,
+          template: `<div><div v-bind="$attrs"></div></div>`
+        }
+      }
+    }, res => {
+      expect(res).toBe(`<div data-server-rendered="true"><div id="a"></div></div>`)
+      done()
+    })
+  })
+
+  it('should escape static strings', done => {
+    renderVmWithOptions({
+      template: `<div>&lt;foo&gt;</div>`
+    }, res => {
+      expect(res).toBe(`<div data-server-rendered="true">&lt;foo&gt;</div>`)
+      done()
+    })
+  })
+
+  it('should not cache computed properties', done => {
+    renderVmWithOptions({
+      template: `<div>{{ foo }}</div>`,
+      data: () => ({ bar: 1 }),
+      computed: {
+        foo () { return this.bar + 1 }
+      },
+      created () {
+        this.foo // access
+        this.bar++ // trigger change
+      }
+    }, res => {
+      expect(res).toBe(`<div data-server-rendered="true">3</div>`)
+      done()
+    })
+  })
+
+  it('return Promise', done => {
+    renderToString(new Vue({
+      template: `<div>{{ foo }}</div>`,
+      data: { foo: 'bar' }
+    })).then(res => {
+      expect(res).toBe(`<div data-server-rendered="true">bar</div>`)
+      done()
+    })
+  })
+
+  it('return Promise (error)', done => {
+    Vue.config.silent = true
+    renderToString(new Vue({
+      render () {
+        throw new Error('foobar')
+      }
+    })).catch(err => {
+      expect(err.toString()).toContain(`foobar`)
+      Vue.config.silent = false
+      done()
+    })
+  })
+
+  it('should catch template compilation error', done => {
+    renderToString(new Vue({
+      template: `<div></div><div></div>`
+    }), (err, res) => {
+      expect(err.toString()).toContain('Component template should contain exactly one root element')
+      done()
+    })
+  })
+
+  // #6907
+  it('should not optimize root if conditions', done => {
+    renderVmWithOptions({
+      data: { foo: 123 },
+      template: `<input :type="'text'" v-model="foo">`
+    }, res => {
+      expect(res).toBe(`<input type="text" data-server-rendered="true" value="123">`)
+      done()
+    })
+  })
+
+  it('render muted properly', done => {
+    renderVmWithOptions({
+      template: '<video muted></video>'
+    }, result => {
+      expect(result).toContain('<video muted="muted" data-server-rendered="true"></video>')
+      done()
+    })
+  })
+
+  it('render v-model with textarea', done => {
+    renderVmWithOptions({
+      data: { foo: 'bar' },
+      template: '<div><textarea v-model="foo"></textarea></div>'
+    }, result => {
+      expect(result).toContain('<textarea>bar</textarea>')
+      done()
+    })
+  })
+
+  it('render v-model with textarea (non-optimized)', done => {
+    renderVmWithOptions({
+      render (h) {
+        return h('textarea', {
+          domProps: {
+            value: 'foo'
+          }
+        })
+      }
+    }, result => {
+      expect(result).toContain('<textarea data-server-rendered="true">foo</textarea>')
+      done()
+    })
+  })
+
+  it('render v-model with <select> (value binding)', done => {
+    renderVmWithOptions({
+      data: {
+        selected: 2,
+        options: [
+          { id: 1, label: 'one' },
+          { id: 2, label: 'two' }
+        ]
+      },
+      template: `
+      <div>
+        <select v-model="selected">
+          <option v-for="o in options" :value="o.id">{{ o.label }}</option>
+        </select>
+      </div>
+      `
+    }, result => {
+      expect(result).toContain(
+        '<select>' +
+          '<option value="1">one</option>' +
+          '<option selected="selected" value="2">two</option>' +
+        '</select>'
+      )
+      done()
+    })
+  })
+
+  it('render v-model with <select> (static value)', done => {
+    renderVmWithOptions({
+      data: {
+        selected: 2
+      },
+      template: `
+      <div>
+        <select v-model="selected">
+          <option value="1">one</option>
+          <option value="2">two</option>
+        </select>
+      </div>
+      `
+    }, result => {
+      expect(result).toContain(
+        '<select>' +
+          '<option value="1">one</option> ' +
+          '<option value="2" selected="selected">two</option>' +
+        '</select>'
+      )
+      done()
+    })
+  })
+
+  it('render v-model with <select> (text as value)', done => {
+    renderVmWithOptions({
+      data: {
+        selected: 2,
+        options: [
+          { id: 1, label: 'one' },
+          { id: 2, label: 'two' }
+        ]
+      },
+      template: `
+      <div>
+        <select v-model="selected">
+          <option v-for="o in options">{{ o.id }}</option>
+        </select>
+      </div>
+      `
+    }, result => {
+      expect(result).toContain(
+        '<select>' +
+          '<option>1</option>' +
+          '<option selected="selected">2</option>' +
+        '</select>'
+      )
+      done()
+    })
+  })
+
+  // #7223
+  it('should not double escape attribute values', done => {
+    renderVmWithOptions({
+      template: `
+      <div>
+        <div id="a\nb"></div>
+      </div>
+      `
+    }, result => {
+      expect(result).toContain(`<div id="a\nb"></div>`)
+      done()
+    })
+  })
+
+  it('should expose ssr helpers on functional context', done => {
+    let called = false
+    renderVmWithOptions({
+      template: `<div><foo/></div>`,
+      components: {
+        foo: {
+          functional: true,
+          render (h, ctx) {
+            expect(ctx._ssrNode).toBeTruthy()
+            called = true
+          }
+        }
+      }
+    }, () => {
+      expect(called).toBe(true)
+      done()
+    })
+  })
+})
+
+function renderVmWithOptions (options, cb) {
+  renderToString(new Vue(options), (err, res) => {
+    expect(err).toBeNull()
+    cb(res)
+  })
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/test/ssr/ssr-template.spec.js b/advancedcontentfilter/vendor/asset/vue/test/ssr/ssr-template.spec.js
new file mode 100644 (file)
index 0000000..d935284
--- /dev/null
@@ -0,0 +1,390 @@
+import webpack from 'webpack'
+import Vue from '../../dist/vue.runtime.common.js'
+import { compileWithWebpack } from './compile-with-webpack'
+import { createRenderer } from '../../packages/vue-server-renderer'
+import VueSSRClientPlugin from '../../packages/vue-server-renderer/client-plugin'
+import { createRenderer as createBundleRenderer } from './ssr-bundle-render.spec.js'
+
+const defaultTemplate = `<html><head></head><body><!--vue-ssr-outlet--></body></html>`
+const interpolateTemplate = `<html><head><title>{{ title }}</title></head><body><!--vue-ssr-outlet-->{{{ snippet }}}</body></html>`
+
+function generateClientManifest (file, cb) {
+  compileWithWebpack(file, {
+    output: {
+      path: '/',
+      filename: '[name].js'
+    },
+    plugins: [
+      new webpack.optimize.CommonsChunkPlugin({
+        name: 'manifest',
+        minChunks: Infinity
+      }),
+      new VueSSRClientPlugin()
+    ]
+  }, fs => {
+    cb(JSON.parse(fs.readFileSync('/vue-ssr-client-manifest.json', 'utf-8')))
+  })
+}
+
+function createRendererWithManifest (file, options, cb) {
+  if (typeof options === 'function') {
+    cb = options
+    options = null
+  }
+  generateClientManifest(file, clientManifest => {
+    createBundleRenderer(file, Object.assign({
+      asBundle: true,
+      template: defaultTemplate,
+      clientManifest
+    }, options), cb)
+  })
+}
+
+describe('SSR: template option', () => {
+  it('renderToString', done => {
+    const renderer = createRenderer({
+      template: defaultTemplate
+    })
+
+    const context = {
+      head: '<meta name="viewport" content="width=device-width">',
+      styles: '<style>h1 { color: red }</style>',
+      state: { a: 1 }
+    }
+
+    renderer.renderToString(new Vue({
+      template: '<div>hi</div>'
+    }), context, (err, res) => {
+      expect(err).toBeNull()
+      expect(res).toContain(
+        `<html><head>${context.head}${context.styles}</head><body>` +
+        `<div data-server-rendered="true">hi</div>` +
+        `<script>window.__INITIAL_STATE__={"a":1}</script>` +
+        `</body></html>`
+      )
+      done()
+    })
+  })
+
+  it('renderToString with interpolation', done => {
+    const renderer = createRenderer({
+      template: interpolateTemplate
+    })
+
+    const context = {
+      title: '<script>hacks</script>',
+      snippet: '<div>foo</div>',
+      head: '<meta name="viewport" content="width=device-width">',
+      styles: '<style>h1 { color: red }</style>',
+      state: { a: 1 }
+    }
+
+    renderer.renderToString(new Vue({
+      template: '<div>hi</div>'
+    }), context, (err, res) => {
+      expect(err).toBeNull()
+      expect(res).toContain(
+        `<html><head>` +
+        // double mustache should be escaped
+        `<title>&lt;script&gt;hacks&lt;/script&gt;</title>` +
+        `${context.head}${context.styles}</head><body>` +
+        `<div data-server-rendered="true">hi</div>` +
+        `<script>window.__INITIAL_STATE__={"a":1}</script>` +
+        // triple should be raw
+        `<div>foo</div>` +
+        `</body></html>`
+      )
+      done()
+    })
+  })
+
+  it('renderToStream', done => {
+    const renderer = createRenderer({
+      template: defaultTemplate
+    })
+
+    const context = {
+      head: '<meta name="viewport" content="width=device-width">',
+      styles: '<style>h1 { color: red }</style>',
+      state: { a: 1 }
+    }
+
+    const stream = renderer.renderToStream(new Vue({
+      template: '<div>hi</div>'
+    }), context)
+
+    let res = ''
+    stream.on('data', chunk => {
+      res += chunk
+    })
+    stream.on('end', () => {
+      expect(res).toContain(
+        `<html><head>${context.head}${context.styles}</head><body>` +
+        `<div data-server-rendered="true">hi</div>` +
+        `<script>window.__INITIAL_STATE__={"a":1}</script>` +
+        `</body></html>`
+      )
+      done()
+    })
+  })
+
+  it('renderToStream with interpolation', done => {
+    const renderer = createRenderer({
+      template: interpolateTemplate
+    })
+
+    const context = {
+      title: '<script>hacks</script>',
+      snippet: '<div>foo</div>',
+      head: '<meta name="viewport" content="width=device-width">',
+      styles: '<style>h1 { color: red }</style>',
+      state: { a: 1 }
+    }
+
+    const stream = renderer.renderToStream(new Vue({
+      template: '<div>hi</div>'
+    }), context)
+
+    let res = ''
+    stream.on('data', chunk => {
+      res += chunk
+    })
+    stream.on('end', () => {
+      expect(res).toContain(
+        `<html><head>` +
+        // double mustache should be escaped
+        `<title>&lt;script&gt;hacks&lt;/script&gt;</title>` +
+        `${context.head}${context.styles}</head><body>` +
+        `<div data-server-rendered="true">hi</div>` +
+        `<script>window.__INITIAL_STATE__={"a":1}</script>` +
+        // triple should be raw
+        `<div>foo</div>` +
+        `</body></html>`
+      )
+      done()
+    })
+  })
+
+  it('bundleRenderer + renderToString', done => {
+    createBundleRenderer('app.js', {
+      asBundle: true,
+      template: defaultTemplate
+    }, renderer => {
+      const context = {
+        head: '<meta name="viewport" content="width=device-width">',
+        styles: '<style>h1 { color: red }</style>',
+        state: { a: 1 },
+        url: '/test'
+      }
+      renderer.renderToString(context, (err, res) => {
+        expect(err).toBeNull()
+        expect(res).toContain(
+          `<html><head>${context.head}${context.styles}</head><body>` +
+          `<div data-server-rendered="true">/test</div>` +
+          `<script>window.__INITIAL_STATE__={"a":1}</script>` +
+          `</body></html>`
+        )
+        expect(context.msg).toBe('hello')
+        done()
+      })
+    })
+  })
+
+  it('bundleRenderer + renderToStream', done => {
+    createBundleRenderer('app.js', {
+      asBundle: true,
+      template: defaultTemplate
+    }, renderer => {
+      const context = {
+        head: '<meta name="viewport" content="width=device-width">',
+        styles: '<style>h1 { color: red }</style>',
+        state: { a: 1 },
+        url: '/test'
+      }
+      const stream = renderer.renderToStream(context)
+      let res = ''
+      stream.on('data', chunk => {
+        res += chunk.toString()
+      })
+      stream.on('end', () => {
+        expect(res).toContain(
+          `<html><head>${context.head}${context.styles}</head><body>` +
+          `<div data-server-rendered="true">/test</div>` +
+          `<script>window.__INITIAL_STATE__={"a":1}</script>` +
+          `</body></html>`
+        )
+        expect(context.msg).toBe('hello')
+        done()
+      })
+    })
+  })
+
+  const expectedHTMLWithManifest = (options = {}) =>
+    `<html><head>` +
+      // used chunks should have preload
+      `<link rel="preload" href="/manifest.js" as="script">` +
+      `<link rel="preload" href="/main.js" as="script">` +
+      `<link rel="preload" href="/0.js" as="script">` +
+      `<link rel="preload" href="/test.css" as="style">` +
+      // images and fonts are only preloaded when explicitly asked for
+      (options.preloadOtherAssets ? `<link rel="preload" href="/test.woff2" as="font" type="font/woff2" crossorigin>` : ``) +
+      (options.preloadOtherAssets ? `<link rel="preload" href="/test.png" as="image">` : ``) +
+      // unused chunks should have prefetch
+      (options.noPrefetch ? `` : `<link rel="prefetch" href="/1.js">`) +
+      // css assets should be loaded
+      `<link rel="stylesheet" href="/test.css">` +
+    `</head><body>` +
+      `<div data-server-rendered="true"><div>async test.woff2 test.png</div></div>` +
+      // state should be inlined before scripts
+      `<script>window.${options.stateKey || '__INITIAL_STATE__'}={"a":1}</script>` +
+      // manifest chunk should be first
+      `<script src="/manifest.js" defer></script>` +
+      // async chunks should be before main chunk
+      `<script src="/0.js" defer></script>` +
+      `<script src="/main.js" defer></script>` +
+    `</body></html>`
+
+  createClientManifestAssertions(true)
+  createClientManifestAssertions(false)
+
+  function createClientManifestAssertions (runInNewContext) {
+    it('bundleRenderer + renderToString + clientManifest ()', done => {
+      createRendererWithManifest('split.js', { runInNewContext }, renderer => {
+        renderer.renderToString({ state: { a: 1 }}, (err, res) => {
+          expect(err).toBeNull()
+          expect(res).toContain(expectedHTMLWithManifest())
+          done()
+        })
+      })
+    })
+
+    it('bundleRenderer + renderToStream + clientManifest + shouldPreload', done => {
+      createRendererWithManifest('split.js', {
+        runInNewContext,
+        shouldPreload: (file, type) => {
+          if (type === 'image' || type === 'script' || type === 'font' || type === 'style') {
+            return true
+          }
+        }
+      }, renderer => {
+        const stream = renderer.renderToStream({ state: { a: 1 }})
+        let res = ''
+        stream.on('data', chunk => {
+          res += chunk.toString()
+        })
+        stream.on('end', () => {
+          expect(res).toContain(expectedHTMLWithManifest({
+            preloadOtherAssets: true
+          }))
+          done()
+        })
+      })
+    })
+
+    it('bundleRenderer + renderToStream + clientManifest + shouldPrefetch', done => {
+      createRendererWithManifest('split.js', {
+        runInNewContext,
+        shouldPrefetch: (file, type) => {
+          if (type === 'script') {
+            return false
+          }
+        }
+      }, renderer => {
+        const stream = renderer.renderToStream({ state: { a: 1 }})
+        let res = ''
+        stream.on('data', chunk => {
+          res += chunk.toString()
+        })
+        stream.on('end', () => {
+          expect(res).toContain(expectedHTMLWithManifest({
+            noPrefetch: true
+          }))
+          done()
+        })
+      })
+    })
+
+    it('bundleRenderer + renderToString + clientManifest + inject: false', done => {
+      createRendererWithManifest('split.js', {
+        runInNewContext,
+        template: `<html>` +
+          `<head>{{{ renderResourceHints() }}}{{{ renderStyles() }}}</head>` +
+          `<body><!--vue-ssr-outlet-->{{{ renderState({ windowKey: '__FOO__', contextKey: 'foo' }) }}}{{{ renderScripts() }}}</body>` +
+        `</html>`,
+        inject: false
+      }, renderer => {
+        const context = { foo: { a: 1 }}
+        renderer.renderToString(context, (err, res) => {
+          expect(err).toBeNull()
+          expect(res).toContain(expectedHTMLWithManifest({
+            stateKey: '__FOO__'
+          }))
+          done()
+        })
+      })
+    })
+
+    it('bundleRenderer + renderToString + clientManifest + no template', done => {
+      createRendererWithManifest('split.js', {
+        runInNewContext,
+        template: null
+      }, renderer => {
+        const context = { foo: { a: 1 }}
+        renderer.renderToString(context, (err, res) => {
+          expect(err).toBeNull()
+
+          const customOutput =
+            `<html><head>${
+              context.renderResourceHints() +
+              context.renderStyles()
+            }</head><body>${
+              res +
+              context.renderState({
+                windowKey: '__FOO__',
+                contextKey: 'foo'
+              }) +
+              context.renderScripts()
+            }</body></html>`
+
+          expect(customOutput).toContain(expectedHTMLWithManifest({
+            stateKey: '__FOO__'
+          }))
+          done()
+        })
+      })
+    })
+
+    it('whitespace insensitive interpolation', done => {
+      const interpolateTemplate = `<html><head><title>{{title}}</title></head><body><!--vue-ssr-outlet-->{{{snippet}}}</body></html>`
+      const renderer = createRenderer({
+        template: interpolateTemplate
+      })
+
+      const context = {
+        title: '<script>hacks</script>',
+        snippet: '<div>foo</div>',
+        head: '<meta name="viewport" content="width=device-width">',
+        styles: '<style>h1 { color: red }</style>',
+        state: { a: 1 }
+      }
+
+      renderer.renderToString(new Vue({
+        template: '<div>hi</div>'
+      }), context, (err, res) => {
+        expect(err).toBeNull()
+        expect(res).toContain(
+          `<html><head>` +
+          // double mustache should be escaped
+          `<title>&lt;script&gt;hacks&lt;/script&gt;</title>` +
+          `${context.head}${context.styles}</head><body>` +
+          `<div data-server-rendered="true">hi</div>` +
+          `<script>window.__INITIAL_STATE__={"a":1}</script>` +
+          // triple should be raw
+          `<div>foo</div>` +
+          `</body></html>`
+        )
+        done()
+      })
+    })
+  }
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/.eslintrc b/advancedcontentfilter/vendor/asset/vue/test/unit/.eslintrc
new file mode 100644 (file)
index 0000000..8334c32
--- /dev/null
@@ -0,0 +1,14 @@
+{
+  "env": {
+    "jasmine": true
+  },
+  "globals": {
+    "waitForUpdate": true,
+    "triggerEvent": true,
+    "createTextVNode": true
+  },
+  "plugins": ["jasmine"],
+  "rules": {
+    "jasmine/no-focused-tests": 2
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/features/component/component-async.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/features/component/component-async.spec.js
new file mode 100644 (file)
index 0000000..889cb71
--- /dev/null
@@ -0,0 +1,375 @@
+import Vue from 'vue'
+import { Promise } from 'es6-promise'
+
+describe('Component async', () => {
+  it('normal', done => {
+    const vm = new Vue({
+      template: '<div><test></test></div>',
+      components: {
+        test: (resolve) => {
+          setTimeout(() => {
+            resolve({
+              template: '<div>hi</div>'
+            })
+            // wait for parent update
+            Vue.nextTick(next)
+          }, 0)
+        }
+      }
+    }).$mount()
+    expect(vm.$el.innerHTML).toBe('<!---->')
+    expect(vm.$children.length).toBe(0)
+    function next () {
+      expect(vm.$el.innerHTML).toBe('<div>hi</div>')
+      expect(vm.$children.length).toBe(1)
+      done()
+    }
+  })
+
+  it('resolve ES module default', done => {
+    const vm = new Vue({
+      template: '<div><test></test></div>',
+      components: {
+        test: (resolve) => {
+          setTimeout(() => {
+            resolve({
+              __esModule: true,
+              default: {
+                template: '<div>hi</div>'
+              }
+            })
+            // wait for parent update
+            Vue.nextTick(next)
+          }, 0)
+        }
+      }
+    }).$mount()
+    expect(vm.$el.innerHTML).toBe('<!---->')
+    expect(vm.$children.length).toBe(0)
+    function next () {
+      expect(vm.$el.innerHTML).toBe('<div>hi</div>')
+      expect(vm.$children.length).toBe(1)
+      done()
+    }
+  })
+
+  it('as root', done => {
+    const vm = new Vue({
+      template: '<test></test>',
+      components: {
+        test: resolve => {
+          setTimeout(() => {
+            resolve({
+              template: '<div>hi</div>'
+            })
+            // wait for parent update
+            Vue.nextTick(next)
+          }, 0)
+        }
+      }
+    }).$mount()
+    expect(vm.$el.nodeType).toBe(8)
+    expect(vm.$children.length).toBe(0)
+    function next () {
+      expect(vm.$el.nodeType).toBe(1)
+      expect(vm.$el.outerHTML).toBe('<div>hi</div>')
+      expect(vm.$children.length).toBe(1)
+      done()
+    }
+  })
+
+  it('dynamic', done => {
+    var vm = new Vue({
+      template: '<component :is="view"></component>',
+      data: {
+        view: 'view-a'
+      },
+      components: {
+        'view-a': resolve => {
+          setTimeout(() => {
+            resolve({
+              template: '<div>A</div>'
+            })
+            Vue.nextTick(step1)
+          }, 0)
+        },
+        'view-b': resolve => {
+          setTimeout(() => {
+            resolve({
+              template: '<p>B</p>'
+            })
+            Vue.nextTick(step2)
+          }, 0)
+        }
+      }
+    }).$mount()
+    var aCalled = false
+    function step1 () {
+      // ensure A is resolved only once
+      expect(aCalled).toBe(false)
+      aCalled = true
+      expect(vm.$el.tagName).toBe('DIV')
+      expect(vm.$el.textContent).toBe('A')
+      vm.view = 'view-b'
+    }
+    function step2 () {
+      expect(vm.$el.tagName).toBe('P')
+      expect(vm.$el.textContent).toBe('B')
+      vm.view = 'view-a'
+      waitForUpdate(function () {
+        expect(vm.$el.tagName).toBe('DIV')
+        expect(vm.$el.textContent).toBe('A')
+      }).then(done)
+    }
+  })
+
+  it('warn reject', () => {
+    new Vue({
+      template: '<test></test>',
+      components: {
+        test: (resolve, reject) => {
+          reject('nooooo')
+        }
+      }
+    }).$mount()
+    expect('Reason: nooooo').toHaveBeenWarned()
+  })
+
+  it('with v-for', done => {
+    const vm = new Vue({
+      template: '<div><test v-for="n in list" :key="n" :n="n"></test></div>',
+      data: {
+        list: [1, 2, 3]
+      },
+      components: {
+        test: resolve => {
+          setTimeout(() => {
+            resolve({
+              props: ['n'],
+              template: '<div>{{n}}</div>'
+            })
+            Vue.nextTick(next)
+          }, 0)
+        }
+      }
+    }).$mount()
+    function next () {
+      expect(vm.$el.innerHTML).toBe('<div>1</div><div>2</div><div>3</div>')
+      done()
+    }
+  })
+
+  it('returning Promise', done => {
+    const vm = new Vue({
+      template: '<div><test></test></div>',
+      components: {
+        test: () => {
+          return new Promise(resolve => {
+            setTimeout(() => {
+              resolve({
+                template: '<div>hi</div>'
+              })
+              // wait for promise resolve and then parent update
+              Promise.resolve().then(() => {
+                Vue.nextTick(next)
+              })
+            }, 0)
+          })
+        }
+      }
+    }).$mount()
+    expect(vm.$el.innerHTML).toBe('<!---->')
+    expect(vm.$children.length).toBe(0)
+    function next () {
+      expect(vm.$el.innerHTML).toBe('<div>hi</div>')
+      expect(vm.$children.length).toBe(1)
+      done()
+    }
+  })
+
+  describe('loading/error/timeout', () => {
+    it('with loading component', done => {
+      const vm = new Vue({
+        template: `<div><test/></div>`,
+        components: {
+          test: () => ({
+            component: new Promise(resolve => {
+              setTimeout(() => {
+                resolve({ template: '<div>hi</div>' })
+                // wait for promise resolve and then parent update
+                Promise.resolve().then(() => {
+                  Vue.nextTick(next)
+                })
+              }, 50)
+            }),
+            loading: { template: `<div>loading</div>` },
+            delay: 1
+          })
+        }
+      }).$mount()
+
+      expect(vm.$el.innerHTML).toBe('<!---->')
+
+      let loadingAsserted = false
+      setTimeout(() => {
+        Vue.nextTick(() => {
+          loadingAsserted = true
+          expect(vm.$el.textContent).toBe('loading')
+        })
+      }, 1)
+
+      function next () {
+        expect(loadingAsserted).toBe(true)
+        expect(vm.$el.textContent).toBe('hi')
+        done()
+      }
+    })
+
+    it('with loading component (0 delay)', done => {
+      const vm = new Vue({
+        template: `<div><test/></div>`,
+        components: {
+          test: () => ({
+            component: new Promise(resolve => {
+              setTimeout(() => {
+                resolve({ template: '<div>hi</div>' })
+                // wait for promise resolve and then parent update
+                Promise.resolve().then(() => {
+                  Vue.nextTick(next)
+                })
+              }, 50)
+            }),
+            loading: { template: `<div>loading</div>` },
+            delay: 0
+          })
+        }
+      }).$mount()
+
+      expect(vm.$el.textContent).toBe('loading')
+
+      function next () {
+        expect(vm.$el.textContent).toBe('hi')
+        done()
+      }
+    })
+
+    it('with error component', done => {
+      const vm = new Vue({
+        template: `<div><test/></div>`,
+        components: {
+          test: () => ({
+            component: new Promise((resolve, reject) => {
+              setTimeout(() => {
+                reject()
+                // wait for promise resolve and then parent update
+                Promise.resolve().then(() => {
+                  Vue.nextTick(next)
+                })
+              }, 50)
+            }),
+            loading: { template: `<div>loading</div>` },
+            error: { template: `<div>error</div>` },
+            delay: 0
+          })
+        }
+      }).$mount()
+
+      expect(vm.$el.textContent).toBe('loading')
+
+      function next () {
+        expect(`Failed to resolve async component`).toHaveBeenWarned()
+        expect(vm.$el.textContent).toBe('error')
+        done()
+      }
+    })
+
+    it('with error component + timeout', done => {
+      const vm = new Vue({
+        template: `<div><test/></div>`,
+        components: {
+          test: () => ({
+            component: new Promise((resolve, reject) => {
+              setTimeout(() => {
+                resolve({ template: '<div>hi</div>' })
+                // wait for promise resolve and then parent update
+                Promise.resolve().then(() => {
+                  Vue.nextTick(next)
+                })
+              }, 50)
+            }),
+            loading: { template: `<div>loading</div>` },
+            error: { template: `<div>error</div>` },
+            delay: 0,
+            timeout: 1
+          })
+        }
+      }).$mount()
+
+      expect(vm.$el.textContent).toBe('loading')
+
+      setTimeout(() => {
+        Vue.nextTick(() => {
+          expect(`Failed to resolve async component`).toHaveBeenWarned()
+          expect(vm.$el.textContent).toBe('error')
+        })
+      }, 1)
+
+      function next () {
+        expect(vm.$el.textContent).toBe('error') // late resolve ignored
+        done()
+      }
+    })
+
+    it('should not trigger timeout if resolved', done => {
+      const vm = new Vue({
+        template: `<div><test/></div>`,
+        components: {
+          test: () => ({
+            component: new Promise((resolve, reject) => {
+              setTimeout(() => {
+                resolve({ template: '<div>hi</div>' })
+              }, 10)
+            }),
+            error: { template: `<div>error</div>` },
+            timeout: 20
+          })
+        }
+      }).$mount()
+
+      setTimeout(() => {
+        expect(vm.$el.textContent).toBe('hi')
+        expect(`Failed to resolve async component`).not.toHaveBeenWarned()
+        done()
+      }, 50)
+    })
+
+    // #7107
+    it(`should work when resolving sync in sibling component's mounted hook`, done => {
+      let resolveTwo
+
+      const vm = new Vue({
+        template: `<div><one/> <two/></div>`,
+        components: {
+          one: {
+            template: `<div>one</div>`,
+            mounted () {
+              resolveTwo()
+            }
+          },
+          two: resolve => {
+            resolveTwo = () => {
+              resolve({
+                template: `<div>two</div>`
+              })
+            }
+          }
+        }
+      }).$mount()
+
+      expect(vm.$el.textContent).toBe('one ')
+      waitForUpdate(() => {
+        expect(vm.$el.textContent).toBe('one two')
+      }).then(done)
+    })
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/features/component/component-keep-alive.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/features/component/component-keep-alive.spec.js
new file mode 100644 (file)
index 0000000..49f7dd6
--- /dev/null
@@ -0,0 +1,1186 @@
+import Vue from 'vue'
+import injectStyles from '../transition/inject-styles'
+import { isIE9 } from 'core/util/env'
+import { nextFrame } from 'web/runtime/transition-util'
+
+describe('Component keep-alive', () => {
+  const { duration, buffer } = injectStyles()
+  let components, one, two, el
+  beforeEach(() => {
+    one = {
+      template: '<div>one</div>',
+      created: jasmine.createSpy('one created'),
+      mounted: jasmine.createSpy('one mounted'),
+      activated: jasmine.createSpy('one activated'),
+      deactivated: jasmine.createSpy('one deactivated'),
+      destroyed: jasmine.createSpy('one destroyed')
+    }
+    two = {
+      template: '<div>two</div>',
+      created: jasmine.createSpy('two created'),
+      mounted: jasmine.createSpy('two mounted'),
+      activated: jasmine.createSpy('two activated'),
+      deactivated: jasmine.createSpy('two deactivated'),
+      destroyed: jasmine.createSpy('two destroyed')
+    }
+    components = {
+      one,
+      two
+    }
+    el = document.createElement('div')
+    document.body.appendChild(el)
+  })
+
+  function assertHookCalls (component, callCounts) {
+    expect([
+      component.created.calls.count(),
+      component.mounted.calls.count(),
+      component.activated.calls.count(),
+      component.deactivated.calls.count(),
+      component.destroyed.calls.count()
+    ]).toEqual(callCounts)
+  }
+
+  it('should work', done => {
+    const vm = new Vue({
+      template: `
+        <div v-if="ok">
+          <keep-alive>
+            <component :is="view"></component>
+          </keep-alive>
+        </div>
+      `,
+      data: {
+        view: 'one',
+        ok: true
+      },
+      components
+    }).$mount()
+    expect(vm.$el.textContent).toBe('one')
+    assertHookCalls(one, [1, 1, 1, 0, 0])
+    assertHookCalls(two, [0, 0, 0, 0, 0])
+    vm.view = 'two'
+    waitForUpdate(() => {
+      expect(vm.$el.textContent).toBe('two')
+      assertHookCalls(one, [1, 1, 1, 1, 0])
+      assertHookCalls(two, [1, 1, 1, 0, 0])
+      vm.view = 'one'
+    }).then(() => {
+      expect(vm.$el.textContent).toBe('one')
+      assertHookCalls(one, [1, 1, 2, 1, 0])
+      assertHookCalls(two, [1, 1, 1, 1, 0])
+      vm.view = 'two'
+    }).then(() => {
+      expect(vm.$el.textContent).toBe('two')
+      assertHookCalls(one, [1, 1, 2, 2, 0])
+      assertHookCalls(two, [1, 1, 2, 1, 0])
+      vm.ok = false // teardown
+    }).then(() => {
+      expect(vm.$el.textContent).toBe('')
+      assertHookCalls(one, [1, 1, 2, 2, 1])
+      assertHookCalls(two, [1, 1, 2, 2, 1])
+    }).then(done)
+  })
+
+  it('should invoke hooks on the entire sub tree', done => {
+    one.template = '<two/>'
+    one.components = { two }
+
+    const vm = new Vue({
+      template: `
+        <div>
+          <keep-alive>
+            <one v-if="ok"/>
+          </keep-alive>
+        </div>
+      `,
+      data: {
+        ok: true
+      },
+      components
+    }).$mount()
+
+    expect(vm.$el.textContent).toBe('two')
+    assertHookCalls(one, [1, 1, 1, 0, 0])
+    assertHookCalls(two, [1, 1, 1, 0, 0])
+    vm.ok = false
+    waitForUpdate(() => {
+      expect(vm.$el.textContent).toBe('')
+      assertHookCalls(one, [1, 1, 1, 1, 0])
+      assertHookCalls(two, [1, 1, 1, 1, 0])
+      vm.ok = true
+    }).then(() => {
+      expect(vm.$el.textContent).toBe('two')
+      assertHookCalls(one, [1, 1, 2, 1, 0])
+      assertHookCalls(two, [1, 1, 2, 1, 0])
+      vm.ok = false
+    }).then(() => {
+      expect(vm.$el.textContent).toBe('')
+      assertHookCalls(one, [1, 1, 2, 2, 0])
+      assertHookCalls(two, [1, 1, 2, 2, 0])
+    }).then(done)
+  })
+
+  it('should handle nested keep-alive hooks properly', done => {
+    one.template = '<keep-alive><two v-if="ok" /></keep-alive>'
+    one.data = () => ({ ok: true })
+    one.components = { two }
+
+    const vm = new Vue({
+      template: `
+        <div>
+          <keep-alive>
+            <one v-if="ok" ref="one" />
+          </keep-alive>
+        </div>
+      `,
+      data: {
+        ok: true
+      },
+      components
+    }).$mount()
+
+    var oneInstance = vm.$refs.one
+    expect(vm.$el.textContent).toBe('two')
+    assertHookCalls(one, [1, 1, 1, 0, 0])
+    assertHookCalls(two, [1, 1, 1, 0, 0])
+    vm.ok = false
+    waitForUpdate(() => {
+      expect(vm.$el.textContent).toBe('')
+      assertHookCalls(one, [1, 1, 1, 1, 0])
+      assertHookCalls(two, [1, 1, 1, 1, 0])
+    }).then(() => {
+      vm.ok = true
+    }).then(() => {
+      expect(vm.$el.textContent).toBe('two')
+      assertHookCalls(one, [1, 1, 2, 1, 0])
+      assertHookCalls(two, [1, 1, 2, 1, 0])
+    }).then(() => {
+      // toggle sub component when activated
+      oneInstance.ok = false
+    }).then(() => {
+      expect(vm.$el.textContent).toBe('')
+      assertHookCalls(one, [1, 1, 2, 1, 0])
+      assertHookCalls(two, [1, 1, 2, 2, 0])
+    }).then(() => {
+      oneInstance.ok = true
+    }).then(() => {
+      expect(vm.$el.textContent).toBe('two')
+      assertHookCalls(one, [1, 1, 2, 1, 0])
+      assertHookCalls(two, [1, 1, 3, 2, 0])
+    }).then(() => {
+      vm.ok = false
+    }).then(() => {
+      expect(vm.$el.textContent).toBe('')
+      assertHookCalls(one, [1, 1, 2, 2, 0])
+      assertHookCalls(two, [1, 1, 3, 3, 0])
+    }).then(() => {
+      // toggle sub component when parent is deactivated
+      oneInstance.ok = false
+    }).then(() => {
+      expect(vm.$el.textContent).toBe('')
+      assertHookCalls(one, [1, 1, 2, 2, 0])
+      assertHookCalls(two, [1, 1, 3, 3, 0]) // should not be affected
+    }).then(() => {
+      oneInstance.ok = true
+    }).then(() => {
+      expect(vm.$el.textContent).toBe('')
+      assertHookCalls(one, [1, 1, 2, 2, 0])
+      assertHookCalls(two, [1, 1, 3, 3, 0]) // should not be affected
+    }).then(() => {
+      vm.ok = true
+    }).then(() => {
+      expect(vm.$el.textContent).toBe('two')
+      assertHookCalls(one, [1, 1, 3, 2, 0])
+      assertHookCalls(two, [1, 1, 4, 3, 0])
+    }).then(() => {
+      oneInstance.ok = false
+      vm.ok = false
+    }).then(() => {
+      expect(vm.$el.textContent).toBe('')
+      assertHookCalls(one, [1, 1, 3, 3, 0])
+      assertHookCalls(two, [1, 1, 4, 4, 0])
+    }).then(() => {
+      vm.ok = true
+    }).then(() => {
+      expect(vm.$el.textContent).toBe('')
+      assertHookCalls(one, [1, 1, 4, 3, 0])
+      assertHookCalls(two, [1, 1, 4, 4, 0]) // should remain inactive
+    }).then(done)
+  })
+
+  function sharedAssertions (vm, done) {
+    expect(vm.$el.textContent).toBe('one')
+    assertHookCalls(one, [1, 1, 1, 0, 0])
+    assertHookCalls(two, [0, 0, 0, 0, 0])
+    vm.view = 'two'
+    waitForUpdate(() => {
+      expect(vm.$el.textContent).toBe('two')
+      assertHookCalls(one, [1, 1, 1, 1, 0])
+      assertHookCalls(two, [1, 1, 0, 0, 0])
+      vm.view = 'one'
+    }).then(() => {
+      expect(vm.$el.textContent).toBe('one')
+      assertHookCalls(one, [1, 1, 2, 1, 0])
+      assertHookCalls(two, [1, 1, 0, 0, 1])
+      vm.view = 'two'
+    }).then(() => {
+      expect(vm.$el.textContent).toBe('two')
+      assertHookCalls(one, [1, 1, 2, 2, 0])
+      assertHookCalls(two, [2, 2, 0, 0, 1])
+      vm.ok = false // teardown
+    }).then(() => {
+      expect(vm.$el.textContent).toBe('')
+      assertHookCalls(one, [1, 1, 2, 2, 1])
+      assertHookCalls(two, [2, 2, 0, 0, 2])
+    }).then(done)
+  }
+
+  it('include (string)', done => {
+    const vm = new Vue({
+      template: `
+        <div v-if="ok">
+          <keep-alive include="one">
+            <component :is="view"></component>
+          </keep-alive>
+        </div>
+      `,
+      data: {
+        view: 'one',
+        ok: true
+      },
+      components
+    }).$mount()
+    sharedAssertions(vm, done)
+  })
+
+  it('include (regex)', done => {
+    const vm = new Vue({
+      template: `
+        <div v-if="ok">
+          <keep-alive :include="/^one$/">
+            <component :is="view"></component>
+          </keep-alive>
+        </div>
+      `,
+      data: {
+        view: 'one',
+        ok: true
+      },
+      components
+    }).$mount()
+    sharedAssertions(vm, done)
+  })
+
+  it('include (array)', done => {
+    const vm = new Vue({
+      template: `
+        <div v-if="ok">
+          <keep-alive :include="['one']">
+            <component :is="view"></component>
+          </keep-alive>
+        </div>
+      `,
+      data: {
+        view: 'one',
+        ok: true
+      },
+      components
+    }).$mount()
+    sharedAssertions(vm, done)
+  })
+
+  it('exclude (string)', done => {
+    const vm = new Vue({
+      template: `
+        <div v-if="ok">
+          <keep-alive exclude="two">
+            <component :is="view"></component>
+          </keep-alive>
+        </div>
+      `,
+      data: {
+        view: 'one',
+        ok: true
+      },
+      components
+    }).$mount()
+    sharedAssertions(vm, done)
+  })
+
+  it('exclude (regex)', done => {
+    const vm = new Vue({
+      template: `
+        <div v-if="ok">
+          <keep-alive :exclude="/^two$/">
+            <component :is="view"></component>
+          </keep-alive>
+        </div>
+      `,
+      data: {
+        view: 'one',
+        ok: true
+      },
+      components
+    }).$mount()
+    sharedAssertions(vm, done)
+  })
+
+  it('exclude (array)', done => {
+    const vm = new Vue({
+      template: `
+        <div v-if="ok">
+          <keep-alive :exclude="['two']">
+            <component :is="view"></component>
+          </keep-alive>
+        </div>
+      `,
+      data: {
+        view: 'one',
+        ok: true
+      },
+      components
+    }).$mount()
+    sharedAssertions(vm, done)
+  })
+
+  it('include + exclude', done => {
+    const vm = new Vue({
+      template: `
+        <div v-if="ok">
+          <keep-alive include="one,two" exclude="two">
+            <component :is="view"></component>
+          </keep-alive>
+        </div>
+      `,
+      data: {
+        view: 'one',
+        ok: true
+      },
+      components
+    }).$mount()
+    sharedAssertions(vm, done)
+  })
+
+  it('prune cache on include/exclude change', done => {
+    const vm = new Vue({
+      template: `
+        <div>
+          <keep-alive :include="include">
+            <component :is="view"></component>
+          </keep-alive>
+        </div>
+      `,
+      data: {
+        view: 'one',
+        include: 'one,two'
+      },
+      components
+    }).$mount()
+
+    vm.view = 'two'
+    waitForUpdate(() => {
+      assertHookCalls(one, [1, 1, 1, 1, 0])
+      assertHookCalls(two, [1, 1, 1, 0, 0])
+      vm.include = 'two'
+    }).then(() => {
+      assertHookCalls(one, [1, 1, 1, 1, 1])
+      assertHookCalls(two, [1, 1, 1, 0, 0])
+      vm.view = 'one'
+    }).then(() => {
+      assertHookCalls(one, [2, 2, 1, 1, 1])
+      assertHookCalls(two, [1, 1, 1, 1, 0])
+    }).then(done)
+  })
+
+  it('prune cache on include/exclude change + view switch', done => {
+    const vm = new Vue({
+      template: `
+        <div>
+          <keep-alive :include="include">
+            <component :is="view"></component>
+          </keep-alive>
+        </div>
+      `,
+      data: {
+        view: 'one',
+        include: 'one,two'
+      },
+      components
+    }).$mount()
+
+    vm.view = 'two'
+    waitForUpdate(() => {
+      assertHookCalls(one, [1, 1, 1, 1, 0])
+      assertHookCalls(two, [1, 1, 1, 0, 0])
+      vm.include = 'one'
+      vm.view = 'one'
+    }).then(() => {
+      assertHookCalls(one, [1, 1, 2, 1, 0])
+      // two should be pruned
+      assertHookCalls(two, [1, 1, 1, 1, 1])
+    }).then(done)
+  })
+
+  it('should not prune currently active instance', done => {
+    const vm = new Vue({
+      template: `
+        <div>
+          <keep-alive :include="include">
+            <component :is="view"></component>
+          </keep-alive>
+        </div>
+      `,
+      data: {
+        view: 'one',
+        include: 'one,two'
+      },
+      components
+    }).$mount()
+
+    vm.include = 'two'
+    waitForUpdate(() => {
+      assertHookCalls(one, [1, 1, 1, 0, 0])
+      assertHookCalls(two, [0, 0, 0, 0, 0])
+      vm.view = 'two'
+    }).then(() => {
+      assertHookCalls(one, [1, 1, 1, 0, 1])
+      assertHookCalls(two, [1, 1, 1, 0, 0])
+    }).then(done)
+  })
+
+  // #3882
+  it('deeply nested keep-alive should be destroyed properly', done => {
+    one.template = `<div><keep-alive><two></two></keep-alive></div>`
+    one.components = { two }
+    const vm = new Vue({
+      template: `<div><parent v-if="ok"></parent></div>`,
+      data: { ok: true },
+      components: {
+        parent: {
+          template: `<div><keep-alive><one></one></keep-alive></div>`,
+          components: { one }
+        }
+      }
+    }).$mount()
+
+    assertHookCalls(one, [1, 1, 1, 0, 0])
+    assertHookCalls(two, [1, 1, 1, 0, 0])
+
+    vm.ok = false
+    waitForUpdate(() => {
+      assertHookCalls(one, [1, 1, 1, 1, 1])
+      assertHookCalls(two, [1, 1, 1, 1, 1])
+    }).then(done)
+  })
+
+  // #4237
+  it('should update latest props/listeners for a re-activated component', done => {
+    const one = {
+      props: ['prop'],
+      template: `<div>one {{ prop }}</div>`
+    }
+    const two = {
+      props: ['prop'],
+      template: `<div>two {{ prop }}</div>`
+    }
+    const vm = new Vue({
+      data: { view: 'one', n: 1 },
+      template: `
+        <div>
+          <keep-alive>
+            <component :is="view" :prop="n"></component>
+          </keep-alive>
+        </div>
+      `,
+      components: { one, two }
+    }).$mount()
+
+    expect(vm.$el.textContent).toBe('one 1')
+    vm.n++
+    waitForUpdate(() => {
+      expect(vm.$el.textContent).toBe('one 2')
+      vm.view = 'two'
+    }).then(() => {
+      expect(vm.$el.textContent).toBe('two 2')
+    }).then(done)
+  })
+
+  it('max', done => {
+    const spyA = jasmine.createSpy()
+    const spyB = jasmine.createSpy()
+    const spyC = jasmine.createSpy()
+    const spyAD = jasmine.createSpy()
+    const spyBD = jasmine.createSpy()
+    const spyCD = jasmine.createSpy()
+
+    function assertCount (calls) {
+      expect([
+        spyA.calls.count(),
+        spyAD.calls.count(),
+        spyB.calls.count(),
+        spyBD.calls.count(),
+        spyC.calls.count(),
+        spyCD.calls.count()
+      ]).toEqual(calls)
+    }
+
+    const vm = new Vue({
+      template: `
+        <keep-alive max="2">
+          <component :is="n"></component>
+        </keep-alive>
+      `,
+      data: {
+        n: 'aa'
+      },
+      components: {
+        aa: {
+          template: '<div>a</div>',
+          created: spyA,
+          destroyed: spyAD
+        },
+        bb: {
+          template: '<div>bbb</div>',
+          created: spyB,
+          destroyed: spyBD
+        },
+        cc: {
+          template: '<div>ccc</div>',
+          created: spyC,
+          destroyed: spyCD
+        }
+      }
+    }).$mount()
+
+    assertCount([1, 0, 0, 0, 0, 0])
+    vm.n = 'bb'
+    waitForUpdate(() => {
+      assertCount([1, 0, 1, 0, 0, 0])
+      vm.n = 'cc'
+    }).then(() => {
+      // should prune A because max cache reached
+      assertCount([1, 1, 1, 0, 1, 0])
+      vm.n = 'bb'
+    }).then(() => {
+      // B should be reused, and made latest
+      assertCount([1, 1, 1, 0, 1, 0])
+      vm.n = 'aa'
+    }).then(() => {
+      // C should be pruned because B was used last so C is the oldest cached
+      assertCount([2, 1, 1, 0, 1, 1])
+    }).then(done)
+  })
+
+  it('should warn unknown component inside', () => {
+    new Vue({
+      template: `<keep-alive><foo/></keep-alive>`
+    }).$mount()
+    expect(`Unknown custom element: <foo>`).toHaveBeenWarned()
+  })
+
+  // #6938
+  it('should not cache anonymous component when include is specified', done => {
+    const Foo = {
+      name: 'foo',
+      template: `<div>foo</div>`,
+      created: jasmine.createSpy('foo')
+    }
+
+    const Bar = {
+      template: `<div>bar</div>`,
+      created: jasmine.createSpy('bar')
+    }
+
+    const Child = {
+      functional: true,
+      render (h, ctx) {
+        return h(ctx.props.view ? Foo : Bar)
+      }
+    }
+
+    const vm = new Vue({
+      template: `
+        <keep-alive include="foo">
+          <child :view="view"></child>
+        </keep-alive>
+      `,
+      data: {
+        view: true
+      },
+      components: { Child }
+    }).$mount()
+
+    function assert (foo, bar) {
+      expect(Foo.created.calls.count()).toBe(foo)
+      expect(Bar.created.calls.count()).toBe(bar)
+    }
+
+    expect(vm.$el.textContent).toBe('foo')
+    assert(1, 0)
+    vm.view = false
+    waitForUpdate(() => {
+      expect(vm.$el.textContent).toBe('bar')
+      assert(1, 1)
+      vm.view = true
+    }).then(() => {
+      expect(vm.$el.textContent).toBe('foo')
+      assert(1, 1)
+      vm.view = false
+    }).then(() => {
+      expect(vm.$el.textContent).toBe('bar')
+      assert(1, 2)
+    }).then(done)
+  })
+
+  it('should cache anonymous components if include is not specified', done => {
+    const Foo = {
+      template: `<div>foo</div>`,
+      created: jasmine.createSpy('foo')
+    }
+
+    const Bar = {
+      template: `<div>bar</div>`,
+      created: jasmine.createSpy('bar')
+    }
+
+    const Child = {
+      functional: true,
+      render (h, ctx) {
+        return h(ctx.props.view ? Foo : Bar)
+      }
+    }
+
+    const vm = new Vue({
+      template: `
+        <keep-alive>
+          <child :view="view"></child>
+        </keep-alive>
+      `,
+      data: {
+        view: true
+      },
+      components: { Child }
+    }).$mount()
+
+    function assert (foo, bar) {
+      expect(Foo.created.calls.count()).toBe(foo)
+      expect(Bar.created.calls.count()).toBe(bar)
+    }
+
+    expect(vm.$el.textContent).toBe('foo')
+    assert(1, 0)
+    vm.view = false
+    waitForUpdate(() => {
+      expect(vm.$el.textContent).toBe('bar')
+      assert(1, 1)
+      vm.view = true
+    }).then(() => {
+      expect(vm.$el.textContent).toBe('foo')
+      assert(1, 1)
+      vm.view = false
+    }).then(() => {
+      expect(vm.$el.textContent).toBe('bar')
+      assert(1, 1)
+    }).then(done)
+  })
+
+  // #7105
+  it('should not destroy active instance when pruning cache', done => {
+    const Foo = {
+      template: `<div>foo</div>`,
+      destroyed: jasmine.createSpy('destroyed')
+    }
+    const vm = new Vue({
+      template: `
+        <div>
+          <keep-alive :include="include">
+            <foo/>
+          </keep-alive>
+        </div>
+      `,
+      data: {
+        include: ['foo']
+      },
+      components: { Foo }
+    }).$mount()
+    // condition: a render where a previous component is reused
+    vm.include = ['foo']
+    waitForUpdate(() => {
+      vm.include = ['']
+    }).then(() => {
+      expect(Foo.destroyed).not.toHaveBeenCalled()
+    }).then(done)
+  })
+
+  if (!isIE9) {
+    it('with transition-mode out-in', done => {
+      let next
+      const vm = new Vue({
+        template: `<div>
+          <transition name="test" mode="out-in" @after-leave="afterLeave">
+            <keep-alive>
+              <component :is="view" class="test"></component>
+            </keep-alive>
+          </transition>
+        </div>`,
+        data: {
+          view: 'one'
+        },
+        components,
+        methods: {
+          afterLeave () {
+            next()
+          }
+        }
+      }).$mount(el)
+      expect(vm.$el.textContent).toBe('one')
+      assertHookCalls(one, [1, 1, 1, 0, 0])
+      assertHookCalls(two, [0, 0, 0, 0, 0])
+      vm.view = 'two'
+      waitForUpdate(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test test-leave test-leave-active">one</div><!---->'
+        )
+        assertHookCalls(one, [1, 1, 1, 1, 0])
+        assertHookCalls(two, [0, 0, 0, 0, 0])
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test test-leave-active test-leave-to">one</div><!---->'
+        )
+      }).thenWaitFor(_next => { next = _next }).then(() => {
+        expect(vm.$el.innerHTML).toBe('<!---->')
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test test-enter test-enter-active">two</div>'
+        )
+        assertHookCalls(one, [1, 1, 1, 1, 0])
+        assertHookCalls(two, [1, 1, 1, 0, 0])
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test test-enter-active test-enter-to">two</div>'
+        )
+      }).thenWaitFor(duration + buffer).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test">two</div>'
+        )
+        assertHookCalls(one, [1, 1, 1, 1, 0])
+        assertHookCalls(two, [1, 1, 1, 0, 0])
+      }).then(() => {
+        vm.view = 'one'
+      }).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test test-leave test-leave-active">two</div><!---->'
+        )
+        assertHookCalls(one, [1, 1, 1, 1, 0])
+        assertHookCalls(two, [1, 1, 1, 1, 0])
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test test-leave-active test-leave-to">two</div><!---->'
+        )
+      }).thenWaitFor(_next => { next = _next }).then(() => {
+        expect(vm.$el.innerHTML).toBe('<!---->')
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test test-enter test-enter-active">one</div>'
+        )
+        assertHookCalls(one, [1, 1, 2, 1, 0])
+        assertHookCalls(two, [1, 1, 1, 1, 0])
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test test-enter-active test-enter-to">one</div>'
+        )
+      }).thenWaitFor(duration + buffer).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test">one</div>'
+        )
+        assertHookCalls(one, [1, 1, 2, 1, 0])
+        assertHookCalls(two, [1, 1, 1, 1, 0])
+      }).then(done)
+    })
+
+    it('with transition-mode out-in + include', done => {
+      let next
+      const vm = new Vue({
+        template: `<div>
+          <transition name="test" mode="out-in" @after-leave="afterLeave">
+            <keep-alive include="one">
+              <component :is="view" class="test"></component>
+            </keep-alive>
+          </transition>
+        </div>`,
+        data: {
+          view: 'one'
+        },
+        components,
+        methods: {
+          afterLeave () {
+            next()
+          }
+        }
+      }).$mount(el)
+      expect(vm.$el.textContent).toBe('one')
+      assertHookCalls(one, [1, 1, 1, 0, 0])
+      assertHookCalls(two, [0, 0, 0, 0, 0])
+      vm.view = 'two'
+      waitForUpdate(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test test-leave test-leave-active">one</div><!---->'
+        )
+        assertHookCalls(one, [1, 1, 1, 1, 0])
+        assertHookCalls(two, [0, 0, 0, 0, 0])
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test test-leave-active test-leave-to">one</div><!---->'
+        )
+      }).thenWaitFor(_next => { next = _next }).then(() => {
+        expect(vm.$el.innerHTML).toBe('<!---->')
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test test-enter test-enter-active">two</div>'
+        )
+        assertHookCalls(one, [1, 1, 1, 1, 0])
+        assertHookCalls(two, [1, 1, 0, 0, 0])
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test test-enter-active test-enter-to">two</div>'
+        )
+      }).thenWaitFor(duration + buffer).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test">two</div>'
+        )
+        assertHookCalls(one, [1, 1, 1, 1, 0])
+        assertHookCalls(two, [1, 1, 0, 0, 0])
+      }).then(() => {
+        vm.view = 'one'
+      }).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test test-leave test-leave-active">two</div><!---->'
+        )
+        assertHookCalls(one, [1, 1, 1, 1, 0])
+        assertHookCalls(two, [1, 1, 0, 0, 1])
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test test-leave-active test-leave-to">two</div><!---->'
+        )
+      }).thenWaitFor(_next => { next = _next }).then(() => {
+        expect(vm.$el.innerHTML).toBe('<!---->')
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test test-enter test-enter-active">one</div>'
+        )
+        assertHookCalls(one, [1, 1, 2, 1, 0])
+        assertHookCalls(two, [1, 1, 0, 0, 1])
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test test-enter-active test-enter-to">one</div>'
+        )
+      }).thenWaitFor(duration + buffer).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test">one</div>'
+        )
+        assertHookCalls(one, [1, 1, 2, 1, 0])
+        assertHookCalls(two, [1, 1, 0, 0, 1])
+      }).then(done)
+    })
+
+    it('with transition-mode in-out', done => {
+      let next
+      const vm = new Vue({
+        template: `<div>
+          <transition name="test" mode="in-out" @after-enter="afterEnter">
+            <keep-alive>
+              <component :is="view" class="test"></component>
+            </keep-alive>
+          </transition>
+        </div>`,
+        data: {
+          view: 'one'
+        },
+        components,
+        methods: {
+          afterEnter () {
+            next()
+          }
+        }
+      }).$mount(el)
+      expect(vm.$el.textContent).toBe('one')
+      assertHookCalls(one, [1, 1, 1, 0, 0])
+      assertHookCalls(two, [0, 0, 0, 0, 0])
+      vm.view = 'two'
+      waitForUpdate(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test">one</div>' +
+          '<div class="test test-enter test-enter-active">two</div>'
+        )
+        assertHookCalls(one, [1, 1, 1, 1, 0])
+        assertHookCalls(two, [1, 1, 1, 0, 0])
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test">one</div>' +
+          '<div class="test test-enter-active test-enter-to">two</div>'
+        )
+      }).thenWaitFor(_next => { next = _next }).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test">one</div>' +
+          '<div class="test">two</div>'
+        )
+      }).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test test-leave test-leave-active">one</div>' +
+          '<div class="test">two</div>'
+        )
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test test-leave-active test-leave-to">one</div>' +
+          '<div class="test">two</div>'
+        )
+      }).thenWaitFor(duration + buffer).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test">two</div>'
+        )
+        assertHookCalls(one, [1, 1, 1, 1, 0])
+        assertHookCalls(two, [1, 1, 1, 0, 0])
+      }).then(() => {
+        vm.view = 'one'
+      }).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test">two</div>' +
+          '<div class="test test-enter test-enter-active">one</div>'
+        )
+        assertHookCalls(one, [1, 1, 2, 1, 0])
+        assertHookCalls(two, [1, 1, 1, 1, 0])
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test">two</div>' +
+          '<div class="test test-enter-active test-enter-to">one</div>'
+        )
+      }).thenWaitFor(_next => { next = _next }).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test">two</div>' +
+          '<div class="test">one</div>'
+        )
+      }).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test test-leave test-leave-active">two</div>' +
+          '<div class="test">one</div>'
+        )
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test test-leave-active test-leave-to">two</div>' +
+          '<div class="test">one</div>'
+        )
+      }).thenWaitFor(duration + buffer).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test">one</div>'
+        )
+        assertHookCalls(one, [1, 1, 2, 1, 0])
+        assertHookCalls(two, [1, 1, 1, 1, 0])
+      }).then(done)
+    })
+
+    it('dynamic components, in-out with early cancel', done => {
+      let next
+      const vm = new Vue({
+        template: `<div>
+          <transition name="test" mode="in-out" @after-enter="afterEnter">
+            <keep-alive>
+              <component :is="view" class="test"></component>
+            </keep-alive>
+          </transition>
+        </div>`,
+        data: { view: 'one' },
+        components,
+        methods: {
+          afterEnter () {
+            next()
+          }
+        }
+      }).$mount(el)
+      expect(vm.$el.textContent).toBe('one')
+      vm.view = 'two'
+      waitForUpdate(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test">one</div>' +
+          '<div class="test test-enter test-enter-active">two</div>'
+        )
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test">one</div>' +
+          '<div class="test test-enter-active test-enter-to">two</div>'
+        )
+        // switch again before enter finishes,
+        // this cancels both enter and leave.
+        vm.view = 'one'
+      }).then(() => {
+        // 1. the pending leaving "one" should be removed instantly.
+        // 2. the entering "two" should be placed into its final state instantly.
+        // 3. a new "one" is created and entering
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test">two</div>' +
+          '<div class="test test-enter test-enter-active">one</div>'
+        )
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test">two</div>' +
+          '<div class="test test-enter-active test-enter-to">one</div>'
+        )
+      }).thenWaitFor(_next => { next = _next }).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test">two</div>' +
+          '<div class="test">one</div>'
+        )
+      }).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test test-leave test-leave-active">two</div>' +
+          '<div class="test">one</div>'
+        )
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test test-leave-active test-leave-to">two</div>' +
+          '<div class="test">one</div>'
+        )
+      }).thenWaitFor(duration + buffer).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test">one</div>'
+        )
+      }).then(done).then(done)
+    })
+
+    // #4339
+    it('component with inner transition', done => {
+      const vm = new Vue({
+        template: `
+          <div>
+            <keep-alive>
+              <component ref="test" :is="view"></component>
+            </keep-alive>
+          </div>
+        `,
+        data: { view: 'foo' },
+        components: {
+          foo: { template: '<transition><div class="test">foo</div></transition>' },
+          bar: { template: '<transition name="test"><div class="test">bar</div></transition>' }
+        }
+      }).$mount(el)
+
+      // should not apply transition on initial render by default
+      expect(vm.$el.innerHTML).toBe('<div class="test">foo</div>')
+      vm.view = 'bar'
+      waitForUpdate(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test v-leave v-leave-active">foo</div>' +
+          '<div class="test test-enter test-enter-active">bar</div>'
+        )
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test v-leave-active v-leave-to">foo</div>' +
+          '<div class="test test-enter-active test-enter-to">bar</div>'
+        )
+      }).thenWaitFor(duration + buffer).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test">bar</div>'
+        )
+        vm.view = 'foo'
+      }).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test test-leave test-leave-active">bar</div>' +
+          '<div class="test v-enter v-enter-active">foo</div>'
+        )
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test test-leave-active test-leave-to">bar</div>' +
+          '<div class="test v-enter-active v-enter-to">foo</div>'
+        )
+      }).thenWaitFor(duration + buffer).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test">foo</div>'
+        )
+      }).then(done)
+    })
+
+    it('async components with transition-mode out-in', done => {
+      const barResolve = jasmine.createSpy('bar resolved')
+      let next
+      const foo = (resolve) => {
+        setTimeout(() => {
+          resolve(one)
+          Vue.nextTick(next)
+        }, duration / 2)
+      }
+      const bar = (resolve) => {
+        setTimeout(() => {
+          resolve(two)
+          barResolve()
+        }, duration / 2)
+      }
+      components = {
+        foo,
+        bar
+      }
+      const vm = new Vue({
+        template: `<div>
+          <transition name="test" mode="out-in" @after-enter="afterEnter" @after-leave="afterLeave">
+            <keep-alive>
+              <component :is="view" class="test"></component>
+            </keep-alive>
+          </transition>
+        </div>`,
+        data: {
+          view: 'foo'
+        },
+        components,
+        methods: {
+          afterEnter () {
+            next()
+          },
+          afterLeave () {
+            next()
+          }
+        }
+      }).$mount(el)
+      expect(vm.$el.textContent).toBe('')
+      next = () => {
+        assertHookCalls(one, [1, 1, 1, 0, 0])
+        assertHookCalls(two, [0, 0, 0, 0, 0])
+        waitForUpdate(() => {
+          expect(vm.$el.innerHTML).toBe(
+            '<div class="test test-enter test-enter-active">one</div>'
+          )
+        }).thenWaitFor(nextFrame).then(() => {
+          expect(vm.$el.innerHTML).toBe(
+            '<div class="test test-enter-active test-enter-to">one</div>'
+          )
+        }).thenWaitFor(_next => { next = _next }).then(() => {
+          // foo afterEnter get called
+          expect(vm.$el.innerHTML).toBe('<div class="test">one</div>')
+          vm.view = 'bar'
+        }).thenWaitFor(nextFrame).then(() => {
+          assertHookCalls(one, [1, 1, 1, 1, 0])
+          assertHookCalls(two, [0, 0, 0, 0, 0])
+          expect(vm.$el.innerHTML).toBe(
+            '<div class="test test-leave-active test-leave-to">one</div><!---->'
+          )
+        }).thenWaitFor(_next => { next = _next }).then(() => {
+          // foo afterLeave get called
+          // and bar has already been resolved before afterLeave get called
+          expect(barResolve.calls.count()).toBe(1)
+          expect(vm.$el.innerHTML).toBe('<!---->')
+        }).thenWaitFor(nextFrame).then(() => {
+          expect(vm.$el.innerHTML).toBe(
+            '<div class="test test-enter test-enter-active">two</div>'
+          )
+          assertHookCalls(one, [1, 1, 1, 1, 0])
+          assertHookCalls(two, [1, 1, 1, 0, 0])
+        }).thenWaitFor(nextFrame).then(() => {
+          expect(vm.$el.innerHTML).toBe(
+            '<div class="test test-enter-active test-enter-to">two</div>'
+          )
+        }).thenWaitFor(_next => { next = _next }).then(() => {
+          // bar afterEnter get called
+          expect(vm.$el.innerHTML).toBe('<div class="test">two</div>')
+        }).then(done)
+      }
+    })
+  }
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/features/component/component-scoped-slot.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/features/component/component-scoped-slot.spec.js
new file mode 100644 (file)
index 0000000..4fab012
--- /dev/null
@@ -0,0 +1,596 @@
+import Vue from 'vue'
+
+describe('Component scoped slot', () => {
+  it('default slot', done => {
+    const vm = new Vue({
+      template: `
+        <test ref="test">
+          <template slot-scope="props">
+            <span>{{ props.msg }}</span>
+          </template>
+        </test>
+      `,
+      components: {
+        test: {
+          data () {
+            return { msg: 'hello' }
+          },
+          template: `
+            <div>
+              <slot :msg="msg"></slot>
+            </div>
+          `
+        }
+      }
+    }).$mount()
+
+    expect(vm.$el.innerHTML).toBe('<span>hello</span>')
+    vm.$refs.test.msg = 'world'
+    waitForUpdate(() => {
+      expect(vm.$el.innerHTML).toBe('<span>world</span>')
+    }).then(done)
+  })
+
+  it('default slot (plain element)', done => {
+    const vm = new Vue({
+      template: `
+        <test ref="test">
+          <span slot-scope="props">{{ props.msg }}</span>
+        </test>
+      `,
+      components: {
+        test: {
+          data () {
+            return { msg: 'hello' }
+          },
+          template: `
+            <div>
+              <slot :msg="msg"></slot>
+            </div>
+          `
+        }
+      }
+    }).$mount()
+
+    expect(vm.$el.innerHTML).toBe('<span>hello</span>')
+    vm.$refs.test.msg = 'world'
+    waitForUpdate(() => {
+      expect(vm.$el.innerHTML).toBe('<span>world</span>')
+    }).then(done)
+  })
+
+  it('with v-bind', done => {
+    const vm = new Vue({
+      template: `
+        <test ref="test">
+          <template slot-scope="props">
+            <span>{{ props.msg }} {{ props.msg2 }} {{ props.msg3 }}</span>
+          </template>
+        </test>
+      `,
+      components: {
+        test: {
+          data () {
+            return {
+              msg: 'hello',
+              obj: { msg2: 'world', msg3: '.' }
+            }
+          },
+          template: `
+            <div>
+              <slot :msg="msg" v-bind="obj" msg3="!"></slot>
+            </div>
+          `
+        }
+      }
+    }).$mount()
+
+    expect(vm.$el.innerHTML).toBe('<span>hello world !</span>')
+    vm.$refs.test.msg = 'bye'
+    vm.$refs.test.obj.msg2 = 'bye'
+    waitForUpdate(() => {
+      expect(vm.$el.innerHTML).toBe('<span>bye bye !</span>')
+    }).then(done)
+  })
+
+  it('should warn when using v-bind with no object', () => {
+    new Vue({
+      template: `
+        <test ref="test">
+          <template scope="props">
+          </template>
+        </test>
+      `,
+      components: {
+        test: {
+          data () {
+            return {
+              text: 'some text'
+            }
+          },
+          template: `
+            <div>
+              <slot v-bind="text"></slot>
+            </div>
+          `
+        }
+      }
+    }).$mount()
+    expect('slot v-bind without argument expects an Object').toHaveBeenWarned()
+  })
+
+  it('should not warn when using v-bind with object', () => {
+    new Vue({
+      template: `
+        <test ref="test">
+          <template scope="props">
+          </template>
+        </test>
+      `,
+      components: {
+        test: {
+          data () {
+            return {
+              foo: {
+                text: 'some text'
+              }
+            }
+          },
+          template: `
+            <div>
+              <slot v-bind="foo"></slot>
+            </div>
+          `
+        }
+      }
+    }).$mount()
+    expect('slot v-bind without argument expects an Object').not.toHaveBeenWarned()
+  })
+
+  it('named scoped slot', done => {
+    const vm = new Vue({
+      template: `
+        <test ref="test">
+          <template slot="item" slot-scope="props">
+            <span>{{ props.foo }}</span><span>{{ props.bar }}</span>
+          </template>
+        </test>
+      `,
+      components: {
+        test: {
+          data () {
+            return { foo: 'FOO', bar: 'BAR' }
+          },
+          template: `
+            <div>
+              <slot name="item" :foo="foo" :bar="bar"></slot>
+            </div>
+          `
+        }
+      }
+    }).$mount()
+
+    expect(vm.$el.innerHTML).toBe('<span>FOO</span><span>BAR</span>')
+    vm.$refs.test.foo = 'BAZ'
+    waitForUpdate(() => {
+      expect(vm.$el.innerHTML).toBe('<span>BAZ</span><span>BAR</span>')
+    }).then(done)
+  })
+
+  it('named scoped slot (plain element)', done => {
+    const vm = new Vue({
+      template: `
+        <test ref="test">
+          <span slot="item" slot-scope="props">{{ props.foo }} {{ props.bar }}</span>
+        </test>
+      `,
+      components: {
+        test: {
+          data () {
+            return { foo: 'FOO', bar: 'BAR' }
+          },
+          template: `
+            <div>
+              <slot name="item" :foo="foo" :bar="bar"></slot>
+            </div>
+          `
+        }
+      }
+    }).$mount()
+
+    expect(vm.$el.innerHTML).toBe('<span>FOO BAR</span>')
+    vm.$refs.test.foo = 'BAZ'
+    waitForUpdate(() => {
+      expect(vm.$el.innerHTML).toBe('<span>BAZ BAR</span>')
+    }).then(done)
+  })
+
+  it('fallback content', () => {
+    const vm = new Vue({
+      template: `<test></test>`,
+      components: {
+        test: {
+          data () {
+            return { msg: 'hello' }
+          },
+          template: `
+            <div>
+              <slot name="item" :text="msg">
+                <span>{{ msg }} fallback</span>
+              </slot>
+            </div>
+          `
+        }
+      }
+    }).$mount()
+    expect(vm.$el.innerHTML).toBe('<span>hello fallback</span>')
+  })
+
+  it('slot with v-for', done => {
+    const vm = new Vue({
+      template: `
+        <test ref="test">
+          <template slot="item" slot-scope="props">
+            <span>{{ props.text }}</span>
+          </template>
+        </test>
+      `,
+      components: {
+        test: {
+          data () {
+            return {
+              items: ['foo', 'bar', 'baz']
+            }
+          },
+          template: `
+            <div>
+              <slot v-for="item in items" name="item" :text="item"></slot>
+            </div>
+          `
+        }
+      }
+    }).$mount()
+
+    function assertOutput () {
+      expect(vm.$el.innerHTML).toBe(vm.$refs.test.items.map(item => {
+        return `<span>${item}</span>`
+      }).join(''))
+    }
+
+    assertOutput()
+    vm.$refs.test.items.reverse()
+    waitForUpdate(assertOutput).then(() => {
+      vm.$refs.test.items.push('qux')
+    }).then(assertOutput).then(done)
+  })
+
+  it('slot inside v-for', done => {
+    const vm = new Vue({
+      template: `
+        <test ref="test">
+          <template slot="item" slot-scope="props">
+            <span>{{ props.text }}</span>
+          </template>
+        </test>
+      `,
+      components: {
+        test: {
+          data () {
+            return {
+              items: ['foo', 'bar', 'baz']
+            }
+          },
+          template: `
+            <ul>
+              <li v-for="item in items">
+                <slot name="item" :text="item"></slot>
+              </li>
+            </ul>
+          `
+        }
+      }
+    }).$mount()
+
+    function assertOutput () {
+      expect(vm.$el.innerHTML).toBe(vm.$refs.test.items.map(item => {
+        return `<li><span>${item}</span></li>`
+      }).join(''))
+    }
+
+    assertOutput()
+    vm.$refs.test.items.reverse()
+    waitForUpdate(assertOutput).then(() => {
+      vm.$refs.test.items.push('qux')
+    }).then(assertOutput).then(done)
+  })
+
+  it('scoped slot without scope alias', () => {
+    const vm = new Vue({
+      template: `
+        <test ref="test">
+          <span slot="item">I am static</span>
+        </test>
+      `,
+      components: {
+        test: {
+          data () {
+            return { msg: 'hello' }
+          },
+          template: `
+            <div>
+              <slot name="item" :text="msg"></slot>
+            </div>
+          `
+        }
+      }
+    }).$mount()
+    expect(vm.$el.innerHTML).toBe('<span>I am static</span>')
+  })
+
+  it('non-scoped slot with scope alias', () => {
+    const vm = new Vue({
+      template: `
+        <test ref="test">
+          <template slot="item" slot-scope="props">
+            <span>{{ props.text || 'meh' }}</span>
+          </template>
+        </test>
+      `,
+      components: {
+        test: {
+          data () {
+            return { msg: 'hello' }
+          },
+          template: `
+            <div>
+              <slot name="item"></slot>
+            </div>
+          `
+        }
+      }
+    }).$mount()
+    expect(vm.$el.innerHTML).toBe('<span>meh</span>')
+  })
+
+  it('warn key on slot', () => {
+    new Vue({
+      template: `
+        <test ref="test">
+          <template slot="item" slot-scope="props">
+            <span>{{ props.text }}</span>
+          </template>
+        </test>
+      `,
+      components: {
+        test: {
+          data () {
+            return {
+              items: ['foo', 'bar', 'baz']
+            }
+          },
+          template: `
+            <div>
+              <slot v-for="item in items" name="item" :text="item" :key="item"></slot>
+            </div>
+          `
+        }
+      }
+    }).$mount()
+    expect(`\`key\` does not work on <slot>`).toHaveBeenWarned()
+  })
+
+  it('render function usage (named, via data)', done => {
+    const vm = new Vue({
+      render (h) {
+        return h('test', {
+          ref: 'test',
+          scopedSlots: {
+            item: props => h('span', props.text)
+          }
+        })
+      },
+      components: {
+        test: {
+          data () {
+            return { msg: 'hello' }
+          },
+          render (h) {
+            return h('div', [
+              this.$scopedSlots.item({
+                text: this.msg
+              })
+            ])
+          }
+        }
+      }
+    }).$mount()
+
+    expect(vm.$el.innerHTML).toBe('<span>hello</span>')
+    vm.$refs.test.msg = 'world'
+    waitForUpdate(() => {
+      expect(vm.$el.innerHTML).toBe('<span>world</span>')
+    }).then(done)
+  })
+
+  it('render function usage (default, as children)', () => {
+    const vm = new Vue({
+      render (h) {
+        return h('test', [
+          props => h('span', [props.msg])
+        ])
+      },
+      components: {
+        test: {
+          data () {
+            return { msg: 'hello' }
+          },
+          render (h) {
+            return h('div', [
+              this.$scopedSlots.default({ msg: this.msg })
+            ])
+          }
+        }
+      }
+    }).$mount()
+    expect(vm.$el.innerHTML).toBe('<span>hello</span>')
+  })
+
+  // #4779
+  it('should support dynamic slot target', done => {
+    const Child = {
+      template: `
+        <div>
+          <slot name="a" msg="a" />
+          <slot name="b" msg="b" />
+        </div>
+      `
+    }
+
+    const vm = new Vue({
+      data: {
+        a: 'a',
+        b: 'b'
+      },
+      template: `
+        <child>
+          <template :slot="a" slot-scope="props">A {{ props.msg }}</template>
+          <template :slot="b" slot-scope="props">B {{ props.msg }}</template>
+        </child>
+      `,
+      components: { Child }
+    }).$mount()
+
+    expect(vm.$el.textContent.trim()).toBe('A a B b')
+
+    // switch slots
+    vm.a = 'b'
+    vm.b = 'a'
+    waitForUpdate(() => {
+      expect(vm.$el.textContent.trim()).toBe('B a A b')
+    }).then(done)
+  })
+
+  it('render function usage (JSX)', () => {
+    const vm = new Vue({
+      render (h) {
+        return <test>{
+          props => <span>{props.msg}</span>
+        }</test>
+      },
+      components: {
+        test: {
+          data () {
+            return { msg: 'hello' }
+          },
+          render (h) {
+            return <div>
+              {this.$scopedSlots.default({ msg: this.msg })}
+            </div>
+          }
+        }
+      }
+    }).$mount()
+    expect(vm.$el.innerHTML).toBe('<span>hello</span>')
+  })
+
+  // #5615
+  it('scoped slot with v-for', done => {
+    const vm = new Vue({
+      data: { names: ['foo', 'bar'] },
+      template: `
+        <test ref="test">
+          <template v-for="n in names" :slot="n" slot-scope="props">
+            <span>{{ props.msg }}</span>
+          </template>
+          <template slot="abc" slot-scope="props">
+            <span>{{ props.msg }}</span>
+          </template>
+        </test>
+      `,
+      components: {
+        test: {
+          data: () => ({ msg: 'hello' }),
+          template: `
+            <div>
+              <slot name="foo" :msg="msg + ' foo'"></slot>
+              <slot name="bar" :msg="msg + ' bar'"></slot>
+              <slot name="abc" :msg="msg + ' abc'"></slot>
+            </div>
+          `
+        }
+      }
+    }).$mount()
+
+    expect(vm.$el.innerHTML).toBe('<span>hello foo</span> <span>hello bar</span> <span>hello abc</span>')
+    vm.$refs.test.msg = 'world'
+    waitForUpdate(() => {
+      expect(vm.$el.innerHTML).toBe('<span>world foo</span> <span>world bar</span> <span>world abc</span>')
+    }).then(done)
+  })
+
+  it('scoped slot with v-for (plain elements)', done => {
+    const vm = new Vue({
+      data: { names: ['foo', 'bar'] },
+      template: `
+        <test ref="test">
+          <span v-for="n in names" :slot="n" slot-scope="props">{{ props.msg }}</span>
+          <span slot="abc" slot-scope="props">{{ props.msg }}</span>
+        </test>
+      `,
+      components: {
+        test: {
+          data: () => ({ msg: 'hello' }),
+          template: `
+            <div>
+              <slot name="foo" :msg="msg + ' foo'"></slot>
+              <slot name="bar" :msg="msg + ' bar'"></slot>
+              <slot name="abc" :msg="msg + ' abc'"></slot>
+            </div>
+          `
+        }
+      }
+    }).$mount()
+
+    expect(vm.$el.innerHTML).toBe('<span>hello foo</span> <span>hello bar</span> <span>hello abc</span>')
+    vm.$refs.test.msg = 'world'
+    waitForUpdate(() => {
+      expect(vm.$el.innerHTML).toBe('<span>world foo</span> <span>world bar</span> <span>world abc</span>')
+    }).then(done)
+  })
+
+  // #6725
+  it('scoped slot with v-if', done => {
+    const vm = new Vue({
+      data: {
+        ok: false
+      },
+      template: `
+        <test>
+          <template v-if="ok" slot-scope="foo">
+            <p>{{ foo.text }}</p>
+          </template>
+        </test>
+      `,
+      components: {
+        test: {
+          data () {
+            return { msg: 'hello' }
+          },
+          template: `
+            <div>
+              <slot :text="msg">
+                <span>{{ msg }} fallback</span>
+              </slot>
+            </div>
+          `
+        }
+      }
+    }).$mount()
+    expect(vm.$el.innerHTML).toBe('<span>hello fallback</span>')
+
+    vm.ok = true
+    waitForUpdate(() => {
+      expect(vm.$el.innerHTML).toBe('<p>hello</p>')
+    }).then(done)
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/features/component/component-slot.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/features/component/component-slot.spec.js
new file mode 100644 (file)
index 0000000..e667a46
--- /dev/null
@@ -0,0 +1,889 @@
+import Vue from 'vue'
+
+describe('Component slot', () => {
+  let vm, child
+  function mount (options) {
+    vm = new Vue({
+      data: {
+        msg: 'parent message'
+      },
+      template: `<div><test>${options.parentContent || ''}</test></div>`,
+      components: {
+        test: {
+          template: options.childTemplate,
+          data () {
+            return {
+              msg: 'child message'
+            }
+          }
+        }
+      }
+    }).$mount()
+    child = vm.$children[0]
+  }
+
+  it('no content', () => {
+    mount({
+      childTemplate: '<div><slot></slot></div>'
+    })
+    expect(child.$el.childNodes.length).toBe(0)
+  })
+
+  it('default slot', done => {
+    mount({
+      childTemplate: '<div><slot></slot></div>',
+      parentContent: '<p>{{ msg }}</p>'
+    })
+    expect(child.$el.tagName).toBe('DIV')
+    expect(child.$el.children[0].tagName).toBe('P')
+    expect(child.$el.children[0].textContent).toBe('parent message')
+    vm.msg = 'changed'
+    waitForUpdate(() => {
+      expect(child.$el.children[0].textContent).toBe('changed')
+    }).then(done)
+  })
+
+  it('named slot', done => {
+    mount({
+      childTemplate: '<div><slot name="test"></slot></div>',
+      parentContent: '<p slot="test">{{ msg }}</p>'
+    })
+    expect(child.$el.tagName).toBe('DIV')
+    expect(child.$el.children[0].tagName).toBe('P')
+    expect(child.$el.children[0].textContent).toBe('parent message')
+    vm.msg = 'changed'
+    waitForUpdate(() => {
+      expect(child.$el.children[0].textContent).toBe('changed')
+    }).then(done)
+  })
+
+  it('named slot with 0 as a number', done => {
+    mount({
+      childTemplate: '<div><slot :name="0"></slot></div>',
+      parentContent: '<p :slot="0">{{ msg }}</p>'
+    })
+    expect(child.$el.tagName).toBe('DIV')
+    expect(child.$el.children[0].tagName).toBe('P')
+    expect(child.$el.children[0].textContent).toBe('parent message')
+    vm.msg = 'changed'
+    waitForUpdate(() => {
+      expect(child.$el.children[0].textContent).toBe('changed')
+    }).then(done)
+  })
+
+  it('fallback content', () => {
+    mount({
+      childTemplate: '<div><slot><p>{{msg}}</p></slot></div>'
+    })
+    expect(child.$el.children[0].tagName).toBe('P')
+    expect(child.$el.textContent).toBe('child message')
+  })
+
+  it('fallback content with multiple named slots', () => {
+    mount({
+      childTemplate: `
+        <div>
+          <slot name="a"><p>fallback a</p></slot>
+          <slot name="b">fallback b</slot>
+        </div>
+      `,
+      parentContent: '<p slot="b">slot b</p>'
+    })
+    expect(child.$el.children.length).toBe(2)
+    expect(child.$el.children[0].textContent).toBe('fallback a')
+    expect(child.$el.children[1].textContent).toBe('slot b')
+  })
+
+  it('fallback content with mixed named/unnamed slots', () => {
+    mount({
+      childTemplate: `
+        <div>
+          <slot><p>fallback a</p></slot>
+          <slot name="b">fallback b</slot>
+        </div>
+      `,
+      parentContent: '<p slot="b">slot b</p>'
+    })
+    expect(child.$el.children.length).toBe(2)
+    expect(child.$el.children[0].textContent).toBe('fallback a')
+    expect(child.$el.children[1].textContent).toBe('slot b')
+  })
+
+  it('selector matching multiple elements', () => {
+    mount({
+      childTemplate: '<div><slot name="t"></slot></div>',
+      parentContent: '<p slot="t">1</p><div></div><p slot="t">2</p>'
+    })
+    expect(child.$el.innerHTML).toBe('<p>1</p><p>2</p>')
+  })
+
+  it('default content should only render parts not selected', () => {
+    mount({
+      childTemplate: `
+        <div>
+          <slot name="a"></slot>
+          <slot></slot>
+          <slot name="b"></slot>
+        </div>
+      `,
+      parentContent: '<div>foo</div><p slot="a">1</p><p slot="b">2</p>'
+    })
+    expect(child.$el.innerHTML).toBe('<p>1</p> <div>foo</div> <p>2</p>')
+  })
+
+  it('name should only match children', function () {
+    mount({
+      childTemplate: `
+        <div>
+          <slot name="a"><p>fallback a</p></slot>
+          <slot name="b"><p>fallback b</p></slot>
+          <slot name="c"><p>fallback c</p></slot>
+        </div>
+      `,
+      parentContent: `
+        '<p slot="b">select b</p>
+        '<span><p slot="b">nested b</p></span>
+        '<span><p slot="c">nested c</p></span>
+      `
+    })
+    expect(child.$el.children.length).toBe(3)
+    expect(child.$el.children[0].textContent).toBe('fallback a')
+    expect(child.$el.children[1].textContent).toBe('select b')
+    expect(child.$el.children[2].textContent).toBe('fallback c')
+  })
+
+  it('should accept expressions in slot attribute and slot names', () => {
+    mount({
+      childTemplate: `<div><slot :name="'a'"></slot></div>`,
+      parentContent: `<p>one</p><p :slot="'a'">two</p>`
+    })
+    expect(child.$el.innerHTML).toBe('<p>two</p>')
+  })
+
+  it('slot inside v-if', done => {
+    const vm = new Vue({
+      data: {
+        a: 1,
+        b: 2,
+        show: true
+      },
+      template: '<test :show="show"><p slot="b">{{b}}</p><p>{{a}}</p></test>',
+      components: {
+        test: {
+          props: ['show'],
+          template: '<div v-if="show"><slot></slot><slot name="b"></slot></div>'
+        }
+      }
+    }).$mount()
+    expect(vm.$el.textContent).toBe('12')
+    vm.a = 2
+    waitForUpdate(() => {
+      expect(vm.$el.textContent).toBe('22')
+      vm.show = false
+    }).then(() => {
+      expect(vm.$el.textContent).toBe('')
+      vm.show = true
+      vm.a = 3
+    }).then(() => {
+      expect(vm.$el.textContent).toBe('32')
+    }).then(done)
+  })
+
+  it('slot inside v-for', () => {
+    mount({
+      childTemplate: '<div><slot v-for="i in 3" :name="i"></slot></div>',
+      parentContent: '<p v-for="i in 3" :slot="i">{{ i - 1 }}</p>'
+    })
+    expect(child.$el.innerHTML).toBe('<p>0</p><p>1</p><p>2</p>')
+  })
+
+  it('nested slots', done => {
+    const vm = new Vue({
+      template: '<test><test2><p>{{ msg }}</p></test2></test>',
+      data: {
+        msg: 'foo'
+      },
+      components: {
+        test: {
+          template: '<div><slot></slot></div>'
+        },
+        test2: {
+          template: '<div><slot></slot></div>'
+        }
+      }
+    }).$mount()
+    expect(vm.$el.innerHTML).toBe('<div><p>foo</p></div>')
+    vm.msg = 'bar'
+    waitForUpdate(() => {
+      expect(vm.$el.innerHTML).toBe('<div><p>bar</p></div>')
+    }).then(done)
+  })
+
+  it('v-if on inserted content', done => {
+    const vm = new Vue({
+      template: '<test><p v-if="ok">{{ msg }}</p></test>',
+      data: {
+        ok: true,
+        msg: 'hi'
+      },
+      components: {
+        test: {
+          template: '<div><slot>fallback</slot></div>'
+        }
+      }
+    }).$mount()
+    expect(vm.$el.innerHTML).toBe('<p>hi</p>')
+    vm.ok = false
+    waitForUpdate(() => {
+      expect(vm.$el.innerHTML).toBe('fallback')
+      vm.ok = true
+      vm.msg = 'bye'
+    }).then(() => {
+      expect(vm.$el.innerHTML).toBe('<p>bye</p>')
+    }).then(done)
+  })
+
+  it('template slot', function () {
+    const vm = new Vue({
+      template: '<test><template slot="test">hello</template></test>',
+      components: {
+        test: {
+          template: '<div><slot name="test"></slot> world</div>'
+        }
+      }
+    }).$mount()
+    expect(vm.$el.innerHTML).toBe('hello world')
+  })
+
+  it('combined with v-for', () => {
+    const vm = new Vue({
+      template: '<div><test v-for="i in 3" :key="i">{{ i }}</test></div>',
+      components: {
+        test: {
+          template: '<div><slot></slot></div>'
+        }
+      }
+    }).$mount()
+    expect(vm.$el.innerHTML).toBe('<div>1</div><div>2</div><div>3</div>')
+  })
+
+  it('inside template v-if', () => {
+    mount({
+      childTemplate: `
+        <div>
+          <template v-if="true"><slot></slot></template>
+        </div>
+      `,
+      parentContent: 'foo'
+    })
+    expect(child.$el.innerHTML).toBe('foo')
+  })
+
+  it('default slot should use fallback content if has only whitespace', () => {
+    mount({
+      childTemplate: `
+        <div>
+          <slot name="first"><p>first slot</p></slot>
+          <slot><p>this is the default slot</p></slot>
+          <slot name="second"><p>second named slot</p></slot>
+        </div>
+      `,
+      parentContent: `<div slot="first">1</div> <div slot="second">2</div> <div slot="second">2+</div>`
+    })
+    expect(child.$el.innerHTML).toBe(
+      '<div>1</div> <p>this is the default slot</p> <div>2</div><div>2+</div>'
+    )
+  })
+
+  it('programmatic access to $slots', () => {
+    const vm = new Vue({
+      template: '<test><p slot="a">A</p><div>C</div><p slot="b">B</p></test>',
+      components: {
+        test: {
+          render () {
+            expect(this.$slots.a.length).toBe(1)
+            expect(this.$slots.a[0].tag).toBe('p')
+            expect(this.$slots.a[0].children.length).toBe(1)
+            expect(this.$slots.a[0].children[0].text).toBe('A')
+
+            expect(this.$slots.b.length).toBe(1)
+            expect(this.$slots.b[0].tag).toBe('p')
+            expect(this.$slots.b[0].children.length).toBe(1)
+            expect(this.$slots.b[0].children[0].text).toBe('B')
+
+            expect(this.$slots.default.length).toBe(1)
+            expect(this.$slots.default[0].tag).toBe('div')
+            expect(this.$slots.default[0].children.length).toBe(1)
+            expect(this.$slots.default[0].children[0].text).toBe('C')
+
+            return this.$slots.default[0]
+          }
+        }
+      }
+    }).$mount()
+    expect(vm.$el.tagName).toBe('DIV')
+    expect(vm.$el.textContent).toBe('C')
+  })
+
+  it('warn if user directly returns array', () => {
+    new Vue({
+      template: '<test><div></div></test>',
+      components: {
+        test: {
+          render () {
+            return this.$slots.default
+          }
+        }
+      }
+    }).$mount()
+    expect('Render function should return a single root node').toHaveBeenWarned()
+  })
+
+  // #3254
+  it('should not keep slot name when passed further down', () => {
+    const vm = new Vue({
+      template: '<test><span slot="foo">foo</span></test>',
+      components: {
+        test: {
+          template: '<child><slot name="foo"></slot></child>',
+          components: {
+            child: {
+              template: `
+                <div>
+                  <div class="default"><slot></slot></div>
+                  <div class="named"><slot name="foo"></slot></div>
+                </div>
+              `
+            }
+          }
+        }
+      }
+    }).$mount()
+    expect(vm.$el.querySelector('.default').textContent).toBe('foo')
+    expect(vm.$el.querySelector('.named').textContent).toBe('')
+  })
+
+  it('should not keep slot name when passed further down (nested)', () => {
+    const vm = new Vue({
+      template: '<wrap><test><span slot="foo">foo</span></test></wrap>',
+      components: {
+        wrap: {
+          template: '<div><slot></slot></div>'
+        },
+        test: {
+          template: '<child><slot name="foo"></slot></child>',
+          components: {
+            child: {
+              template: `
+                <div>
+                  <div class="default"><slot></slot></div>
+                  <div class="named"><slot name="foo"></slot></div>
+                </div>
+              `
+            }
+          }
+        }
+      }
+    }).$mount()
+    expect(vm.$el.querySelector('.default').textContent).toBe('foo')
+    expect(vm.$el.querySelector('.named').textContent).toBe('')
+  })
+
+  it('should not keep slot name when passed further down (functional)', () => {
+    const child = {
+      template: `
+        <div>
+          <div class="default"><slot></slot></div>
+          <div class="named"><slot name="foo"></slot></div>
+        </div>
+      `
+    }
+
+    const vm = new Vue({
+      template: '<test><span slot="foo">foo</span></test>',
+      components: {
+        test: {
+          functional: true,
+          render (h, ctx) {
+            const slots = ctx.slots()
+            return h(child, slots.foo)
+          }
+        }
+      }
+    }).$mount()
+    expect(vm.$el.querySelector('.default').textContent).toBe('foo')
+    expect(vm.$el.querySelector('.named').textContent).toBe('')
+  })
+
+  // #3400
+  it('named slots should be consistent across re-renders', done => {
+    const vm = new Vue({
+      template: `
+        <comp>
+          <div slot="foo">foo</div>
+        </comp>
+      `,
+      components: {
+        comp: {
+          data () {
+            return { a: 1 }
+          },
+          template: `<div><slot name="foo"></slot>{{ a }}</div>`
+        }
+      }
+    }).$mount()
+    expect(vm.$el.textContent).toBe('foo1')
+    vm.$children[0].a = 2
+    waitForUpdate(() => {
+      expect(vm.$el.textContent).toBe('foo2')
+    }).then(done)
+  })
+
+  // #3437
+  it('should correctly re-create components in slot', done => {
+    const calls = []
+    const vm = new Vue({
+      template: `
+        <comp ref="child">
+          <div slot="foo">
+            <child></child>
+          </div>
+        </comp>
+      `,
+      components: {
+        comp: {
+          data () {
+            return { ok: true }
+          },
+          template: `<div><slot name="foo" v-if="ok"></slot></div>`
+        },
+        child: {
+          template: '<div>child</div>',
+          created () {
+            calls.push(1)
+          },
+          destroyed () {
+            calls.push(2)
+          }
+        }
+      }
+    }).$mount()
+
+    expect(calls).toEqual([1])
+    vm.$refs.child.ok = false
+    waitForUpdate(() => {
+      expect(calls).toEqual([1, 2])
+      vm.$refs.child.ok = true
+    }).then(() => {
+      expect(calls).toEqual([1, 2, 1])
+      vm.$refs.child.ok = false
+    }).then(() => {
+      expect(calls).toEqual([1, 2, 1, 2])
+    }).then(done)
+  })
+
+  it('warn duplicate slots', () => {
+    new Vue({
+      template: `<div>
+        <test>
+          <div>foo</div>
+          <div slot="a">bar</div>
+        </test>
+      </div>`,
+      components: {
+        test: {
+          template: `<div>
+            <slot></slot><slot></slot>
+            <div v-for="i in 3"><slot name="a"></slot></div>
+          </div>`
+        }
+      }
+    }).$mount()
+    expect('Duplicate presence of slot "default"').toHaveBeenWarned()
+    expect('Duplicate presence of slot "a"').toHaveBeenWarned()
+  })
+
+  it('should not warn valid conditional slots', () => {
+    new Vue({
+      template: `<div>
+        <test>
+          <div>foo</div>
+        </test>
+      </div>`,
+      components: {
+        test: {
+          template: `<div>
+            <slot v-if="true"></slot>
+            <slot v-else></slot>
+          </div>`
+        }
+      }
+    }).$mount()
+    expect('Duplicate presence of slot "default"').not.toHaveBeenWarned()
+  })
+
+  // #3518
+  it('events should not break when slot is toggled by v-if', done => {
+    const spy = jasmine.createSpy()
+    const vm = new Vue({
+      template: `<test><div class="click" @click="test">hi</div></test>`,
+      methods: {
+        test: spy
+      },
+      components: {
+        test: {
+          data: () => ({
+            toggle: true
+          }),
+          template: `<div v-if="toggle"><slot></slot></div>`
+        }
+      }
+    }).$mount()
+
+    expect(vm.$el.textContent).toBe('hi')
+    vm.$children[0].toggle = false
+    waitForUpdate(() => {
+      vm.$children[0].toggle = true
+    }).then(() => {
+      triggerEvent(vm.$el.querySelector('.click'), 'click')
+      expect(spy).toHaveBeenCalled()
+    }).then(done)
+  })
+
+  it('renders static tree with text', () => {
+    const vm = new Vue({
+      template: `<div><test><template><div></div>Hello<div></div></template></test></div>`,
+      components: {
+        test: {
+          template: '<div><slot></slot></div>'
+        }
+      }
+    })
+    vm.$mount()
+    expect('Error when rendering root').not.toHaveBeenWarned()
+  })
+
+  // #3872
+  it('functional component as slot', () => {
+    const vm = new Vue({
+      template: `
+        <parent>
+          <child>one</child>
+          <child slot="a">two</child>
+        </parent>
+      `,
+      components: {
+        parent: {
+          template: `<div><slot name="a"></slot><slot></slot></div>`
+        },
+        child: {
+          functional: true,
+          render (h, { slots }) {
+            return h('div', slots().default)
+          }
+        }
+      }
+    }).$mount()
+    expect(vm.$el.innerHTML.trim()).toBe('<div>two</div><div>one</div>')
+  })
+
+  // #4209
+  it('slot of multiple text nodes should not be infinitely merged', done => {
+    const wrap = {
+      template: `<inner ref="inner">foo<slot></slot></inner>`,
+      components: {
+        inner: {
+          data: () => ({ a: 1 }),
+          template: `<div>{{a}}<slot></slot></div>`
+        }
+      }
+    }
+    const vm = new Vue({
+      template: `<wrap ref="wrap">bar</wrap>`,
+      components: { wrap }
+    }).$mount()
+
+    expect(vm.$el.textContent).toBe('1foobar')
+    vm.$refs.wrap.$refs.inner.a++
+    waitForUpdate(() => {
+      expect(vm.$el.textContent).toBe('2foobar')
+    }).then(done)
+  })
+
+  // #4315
+  it('functional component passing slot content to stateful child component', done => {
+    const ComponentWithSlots = {
+      render (h) {
+        return h('div', this.$slots.slot1)
+      }
+    }
+
+    const FunctionalComp = {
+      functional: true,
+      render (h) {
+        return h(ComponentWithSlots, [h('span', { slot: 'slot1' }, 'foo')])
+      }
+    }
+
+    const vm = new Vue({
+      data: { n: 1 },
+      render (h) {
+        return h('div', [this.n, h(FunctionalComp)])
+      }
+    }).$mount()
+
+    expect(vm.$el.textContent).toBe('1foo')
+    vm.n++
+    waitForUpdate(() => {
+      // should not lose named slot
+      expect(vm.$el.textContent).toBe('2foo')
+    }).then(done)
+  })
+
+  it('the elements of slot should be updated correctly', done => {
+    const vm = new Vue({
+      data: { n: 1 },
+      template: '<div><test><span v-for="i in n" :key="i">{{ i }}</span><input value="a"/></test></div>',
+      components: {
+        test: {
+          template: '<div><slot></slot></div>'
+        }
+      }
+    }).$mount()
+    expect(vm.$el.innerHTML).toBe('<div><span>1</span><input value="a"></div>')
+    const input = vm.$el.querySelector('input')
+    input.value = 'b'
+    vm.n++
+    waitForUpdate(() => {
+      expect(vm.$el.innerHTML).toBe('<div><span>1</span><span>2</span><input value="a"></div>')
+      expect(vm.$el.querySelector('input')).toBe(input)
+      expect(vm.$el.querySelector('input').value).toBe('b')
+    }).then(done)
+  })
+
+  // GitHub issue #5888
+  it('should resolve correctly slot with keep-alive', () => {
+    const vm = new Vue({
+      template: `
+      <div>
+        <container>
+          <keep-alive slot="foo">
+            <child></child>
+          </keep-alive>
+        </container>
+      </div>
+      `,
+      components: {
+        container: {
+          template:
+            '<div><slot>default</slot><slot name="foo">named</slot></div>'
+        },
+        child: {
+          template: '<span>foo</span>'
+        }
+      }
+    }).$mount()
+    expect(vm.$el.innerHTML).toBe('<div>default<span>foo</span></div>')
+  })
+
+  // #6372, #6915
+  it('should handle nested components in slots properly', done => {
+    const TestComponent = {
+      template: `
+        <component :is="toggleEl ? 'b' : 'i'">
+          <slot />
+        </component>
+      `,
+      data () {
+        return {
+          toggleEl: true
+        }
+      }
+    }
+
+    const vm = new Vue({
+      template: `
+        <div>
+          <test-component ref="test">
+            <div>
+              <foo/>
+            </div>
+            <bar>
+              <foo/>
+            </bar>
+          </test-component>
+        </div>
+      `,
+      components: {
+        TestComponent,
+        foo: {
+          template: `<div>foo</div>`
+        },
+        bar: {
+          template: `<div>bar<slot/></div>`
+        }
+      }
+    }).$mount()
+
+    expect(vm.$el.innerHTML).toBe(`<b><div><div>foo</div></div> <div>bar<div>foo</div></div></b>`)
+
+    vm.$refs.test.toggleEl = false
+    waitForUpdate(() => {
+      expect(vm.$el.innerHTML).toBe(`<i><div><div>foo</div></div> <div>bar<div>foo</div></div></i>`)
+    }).then(done)
+  })
+
+  it('should preserve slot attribute if not absorbed by a Vue component', () => {
+    const vm = new Vue({
+      template: `
+        <div>
+          <div slot="foo"></div>
+        </div>
+      `
+    }).$mount()
+    expect(vm.$el.children[0].getAttribute('slot')).toBe('foo')
+  })
+
+  it('passing a slot down as named slot', () => {
+    const Bar = {
+      template: `<div class="bar"><slot name="foo"/></div>`
+    }
+
+    const Foo = {
+      components: { Bar },
+      template: `<div class="foo"><bar><slot slot="foo"/></bar></div>`
+    }
+
+    const vm = new Vue({
+      components: { Foo },
+      template: `<div><foo>hello</foo></div>`
+    }).$mount()
+
+    expect(vm.$el.innerHTML).toBe('<div class="foo"><div class="bar">hello</div></div>')
+  })
+
+  it('fallback content for named template slot', () => {
+    const Bar = {
+      template: `<div class="bar"><slot name="foo">fallback</slot></div>`
+    }
+
+    const Foo = {
+      components: { Bar },
+      template: `<div class="foo"><bar><template slot="foo"/><slot/></template></bar></div>`
+    }
+
+    const vm = new Vue({
+      components: { Foo },
+      template: `<div><foo></foo></div>`
+    }).$mount()
+
+    expect(vm.$el.innerHTML).toBe('<div class="foo"><div class="bar">fallback</div></div>')
+  })
+
+  // #7106
+  it('should not lose functional slot across renders', done => {
+    const One = {
+      data: () => ({
+        foo: true
+      }),
+      render (h) {
+        this.foo
+        return h('div', this.$slots.slot)
+      }
+    }
+
+    const Two = {
+      render (h) {
+        return h('span', this.$slots.slot)
+      }
+    }
+
+    const Three = {
+      functional: true,
+      render: (h, { children }) => h('span', children)
+    }
+
+    const vm = new Vue({
+      template: `
+        <div>
+          <one ref="one">
+            <two slot="slot">
+              <three slot="slot">hello</three>
+            </two>
+          </one>
+        </div>
+      `,
+      components: { One, Two, Three }
+    }).$mount()
+
+    expect(vm.$el.textContent).toBe('hello')
+    // trigger re-render of <one>
+    vm.$refs.one.foo = false
+    waitForUpdate(() => {
+      // should still be there
+      expect(vm.$el.textContent).toBe('hello')
+    }).then(done)
+  })
+
+  it('should allow passing named slots as raw children down multiple layers of functional component', () => {
+    const CompB = {
+      functional: true,
+      render (h, { slots }) {
+        return slots().foo
+      }
+    }
+
+    const CompA = {
+      functional: true,
+      render (h, { children }) {
+        return h(CompB, children)
+      }
+    }
+
+    const vm = new Vue({
+      components: {
+        CompA
+      },
+      template: `
+        <div>
+          <comp-a>
+            <span slot="foo">foo</span>
+          </comp-a>
+        </div>
+      `
+    }).$mount()
+
+    expect(vm.$el.textContent).toBe('foo')
+  })
+
+  // #7817
+  it('should not match wrong named slot in functional component on re-render', done => {
+    const Functional = {
+      functional: true,
+      render: (h, ctx) => ctx.slots().default
+    }
+
+    const Stateful = {
+      data () {
+        return { ok: true }
+      },
+      render (h) {
+        this.ok // register dep
+        return h('div', [
+          h(Functional, this.$slots.named)
+        ])
+      }
+    }
+
+    const vm = new Vue({
+      template: `<stateful ref="stateful"><div slot="named">foo</div></stateful>`,
+      components: { Stateful }
+    }).$mount()
+
+    expect(vm.$el.textContent).toBe('foo')
+    vm.$refs.stateful.ok = false
+    waitForUpdate(() => {
+      expect(vm.$el.textContent).toBe('foo')
+    }).then(done)
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/features/component/component.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/features/component/component.spec.js
new file mode 100644 (file)
index 0000000..34c037a
--- /dev/null
@@ -0,0 +1,429 @@
+import Vue from 'vue'
+
+describe('Component', () => {
+  it('static', () => {
+    const vm = new Vue({
+      template: '<test></test>',
+      components: {
+        test: {
+          data () {
+            return { a: 123 }
+          },
+          template: '<span>{{a}}</span>'
+        }
+      }
+    }).$mount()
+    expect(vm.$el.tagName).toBe('SPAN')
+    expect(vm.$el.innerHTML).toBe('123')
+  })
+
+  it('using component in restricted elements', () => {
+    const vm = new Vue({
+      template: '<div><table><tbody><test></test></tbody></table></div>',
+      components: {
+        test: {
+          data () {
+            return { a: 123 }
+          },
+          template: '<tr><td>{{a}}</td></tr>'
+        }
+      }
+    }).$mount()
+    expect(vm.$el.innerHTML).toBe('<table><tbody><tr><td>123</td></tr></tbody></table>')
+  })
+
+  it('"is" attribute', () => {
+    const vm = new Vue({
+      template: '<div><table><tbody><tr is="test"></tr></tbody></table></div>',
+      components: {
+        test: {
+          data () {
+            return { a: 123 }
+          },
+          template: '<tr><td>{{a}}</td></tr>'
+        }
+      }
+    }).$mount()
+    expect(vm.$el.innerHTML).toBe('<table><tbody><tr><td>123</td></tr></tbody></table>')
+  })
+
+  it('inline-template', () => {
+    const vm = new Vue({
+      template: '<div><test inline-template><span>{{a}}</span></test></div>',
+      data: {
+        a: 'parent'
+      },
+      components: {
+        test: {
+          data () {
+            return { a: 'child' }
+          }
+        }
+      }
+    }).$mount()
+    expect(vm.$el.innerHTML).toBe('<span>child</span>')
+  })
+
+  it('fragment instance warning', () => {
+    new Vue({
+      template: '<test></test>',
+      components: {
+        test: {
+          data () {
+            return { a: 123, b: 234 }
+          },
+          template: '<p>{{a}}</p><p>{{b}}</p>'
+        }
+      }
+    }).$mount()
+    expect('Component template should contain exactly one root element').toHaveBeenWarned()
+  })
+
+  it('dynamic', done => {
+    const vm = new Vue({
+      template: '<component :is="view" :view="view"></component>',
+      data: {
+        view: 'view-a'
+      },
+      components: {
+        'view-a': {
+          template: '<div>foo {{view}}</div>',
+          data () {
+            return { view: 'a' }
+          }
+        },
+        'view-b': {
+          template: '<div>bar {{view}}</div>',
+          data () {
+            return { view: 'b' }
+          }
+        }
+      }
+    }).$mount()
+    expect(vm.$el.outerHTML).toBe('<div view="view-a">foo a</div>')
+    vm.view = 'view-b'
+    waitForUpdate(() => {
+      expect(vm.$el.outerHTML).toBe('<div view="view-b">bar b</div>')
+      vm.view = ''
+    })
+      .then(() => {
+        expect(vm.$el.nodeType).toBe(8)
+        expect(vm.$el.data).toBe('')
+      }).then(done)
+  })
+
+  it('dynamic with props', done => {
+    const vm = new Vue({
+      template: '<component :is="view" :view="view"></component>',
+      data: {
+        view: 'view-a'
+      },
+      components: {
+        'view-a': {
+          template: '<div>foo {{view}}</div>',
+          props: ['view']
+        },
+        'view-b': {
+          template: '<div>bar {{view}}</div>',
+          props: ['view']
+        }
+      }
+    }).$mount()
+    expect(vm.$el.outerHTML).toBe('<div>foo view-a</div>')
+    vm.view = 'view-b'
+    waitForUpdate(() => {
+      expect(vm.$el.outerHTML).toBe('<div>bar view-b</div>')
+      vm.view = ''
+    }).then(() => {
+      expect(vm.$el.nodeType).toBe(8)
+      expect(vm.$el.data).toBe('')
+    }).then(done)
+  })
+
+  it(':is using raw component constructor', () => {
+    const vm = new Vue({
+      template:
+        '<div>' +
+          '<component :is="$options.components.test"></component>' +
+          '<component :is="$options.components.async"></component>' +
+        '</div>',
+      components: {
+        test: {
+          template: '<span>foo</span>'
+        },
+        async: function (resolve) {
+          resolve({
+            template: '<span>bar</span>'
+          })
+        }
+      }
+    }).$mount()
+    expect(vm.$el.innerHTML).toBe('<span>foo</span><span>bar</span>')
+  })
+
+  it('dynamic combined with v-for', done => {
+    const vm = new Vue({
+      template:
+        '<div>' +
+          '<component v-for="(c, i) in comps" :key="i" :is="c.type"></component>' +
+        '</div>',
+      data: {
+        comps: [{ type: 'one' }, { type: 'two' }]
+      },
+      components: {
+        one: {
+          template: '<span>one</span>'
+        },
+        two: {
+          template: '<span>two</span>'
+        }
+      }
+    }).$mount()
+    expect(vm.$el.innerHTML).toBe('<span>one</span><span>two</span>')
+    vm.comps[1].type = 'one'
+    waitForUpdate(() => {
+      expect(vm.$el.innerHTML).toBe('<span>one</span><span>one</span>')
+    }).then(done)
+  })
+
+  it('dynamic elements with domProps', done => {
+    const vm = new Vue({
+      template: '<component :is="view" :value.prop="val"></component>',
+      data: {
+        view: 'input',
+        val: 'hello'
+      }
+    }).$mount()
+    expect(vm.$el.tagName).toBe('INPUT')
+    expect(vm.$el.value).toBe('hello')
+    vm.view = 'textarea'
+    vm.val += ' world'
+    waitForUpdate(() => {
+      expect(vm.$el.tagName).toBe('TEXTAREA')
+      expect(vm.$el.value).toBe('hello world')
+      vm.view = ''
+    }).then(done)
+  })
+
+  it('should compile parent template directives & content in parent scope', done => {
+    const vm = new Vue({
+      data: {
+        ok: false,
+        message: 'hello'
+      },
+      template: '<test v-show="ok">{{message}}</test>',
+      components: {
+        test: {
+          template: '<div><slot></slot> {{message}}</div>',
+          data () {
+            return {
+              message: 'world'
+            }
+          }
+        }
+      }
+    }).$mount()
+    expect(vm.$el.style.display).toBe('none')
+    expect(vm.$el.textContent).toBe('hello world')
+    vm.ok = true
+    vm.message = 'bye'
+    waitForUpdate(() => {
+      expect(vm.$el.style.display).toBe('')
+      expect(vm.$el.textContent).toBe('bye world')
+    }).then(done)
+  })
+
+  it('parent content + v-if', done => {
+    const vm = new Vue({
+      data: {
+        ok: false,
+        message: 'hello'
+      },
+      template: '<test v-if="ok">{{message}}</test>',
+      components: {
+        test: {
+          template: '<div><slot></slot> {{message}}</div>',
+          data () {
+            return {
+              message: 'world'
+            }
+          }
+        }
+      }
+    }).$mount()
+    expect(vm.$el.textContent).toBe('')
+    expect(vm.$children.length).toBe(0)
+    vm.ok = true
+    waitForUpdate(() => {
+      expect(vm.$children.length).toBe(1)
+      expect(vm.$el.textContent).toBe('hello world')
+    }).then(done)
+  })
+
+  it('props', () => {
+    const vm = new Vue({
+      data: {
+        list: [{ a: 1 }, { a: 2 }]
+      },
+      template: '<test :collection="list"></test>',
+      components: {
+        test: {
+          template: '<ul><li v-for="item in collection">{{item.a}}</li></ul>',
+          props: ['collection']
+        }
+      }
+    }).$mount()
+    expect(vm.$el.outerHTML).toBe('<ul><li>1</li><li>2</li></ul>')
+  })
+
+  it('should warn when using camelCased props in in-DOM template', () => {
+    new Vue({
+      data: {
+        list: [{ a: 1 }, { a: 2 }]
+      },
+      template: '<test :somecollection="list"></test>', // <-- simulate lowercased template
+      components: {
+        test: {
+          template: '<ul><li v-for="item in someCollection">{{item.a}}</li></ul>',
+          props: ['someCollection']
+        }
+      }
+    }).$mount()
+    expect(
+      'You should probably use "some-collection" instead of "someCollection".'
+    ).toHaveBeenTipped()
+  })
+
+  it('should warn when using camelCased events in in-DOM template', () => {
+    new Vue({
+      template: '<test @foobar="a++"></test>', // <-- simulate lowercased template
+      components: {
+        test: {
+          template: '<div></div>',
+          created () {
+            this.$emit('fooBar')
+          }
+        }
+      }
+    }).$mount()
+    expect(
+      'You should probably use "foo-bar" instead of "fooBar".'
+    ).toHaveBeenTipped()
+  })
+
+  it('not found component should not throw', () => {
+    expect(function () {
+      new Vue({
+        template: '<div is="non-existent"></div>'
+      })
+    }).not.toThrow()
+  })
+
+  it('properly update replaced higher-order component root node', done => {
+    const vm = new Vue({
+      data: {
+        color: 'red'
+      },
+      template: '<test id="foo" :class="color"></test>',
+      components: {
+        test: {
+          data () {
+            return { tag: 'div' }
+          },
+          render (h) {
+            return h(this.tag, { class: 'test' }, 'hi')
+          }
+        }
+      }
+    }).$mount()
+
+    expect(vm.$el.tagName).toBe('DIV')
+    expect(vm.$el.id).toBe('foo')
+    expect(vm.$el.className).toBe('test red')
+
+    vm.color = 'green'
+    waitForUpdate(() => {
+      expect(vm.$el.tagName).toBe('DIV')
+      expect(vm.$el.id).toBe('foo')
+      expect(vm.$el.className).toBe('test green')
+      vm.$children[0].tag = 'p'
+    }).then(() => {
+      expect(vm.$el.tagName).toBe('P')
+      expect(vm.$el.id).toBe('foo')
+      expect(vm.$el.className).toBe('test green')
+      vm.color = 'red'
+    }).then(() => {
+      expect(vm.$el.tagName).toBe('P')
+      expect(vm.$el.id).toBe('foo')
+      expect(vm.$el.className).toBe('test red')
+    }).then(done)
+  })
+
+  it('catch component render error and preserve previous vnode', done => {
+    const spy = jasmine.createSpy()
+    Vue.config.errorHandler = spy
+    const vm = new Vue({
+      data: {
+        a: {
+          b: 123
+        }
+      },
+      render (h) {
+        return h('div', [this.a.b])
+      }
+    }).$mount()
+    expect(vm.$el.textContent).toBe('123')
+    expect(spy).not.toHaveBeenCalled()
+    vm.a = null
+    waitForUpdate(() => {
+      expect(spy).toHaveBeenCalled()
+      expect(vm.$el.textContent).toBe('123') // should preserve rendered DOM
+      vm.a = { b: 234 }
+    }).then(() => {
+      expect(vm.$el.textContent).toBe('234') // should be able to recover
+      Vue.config.errorHandler = null
+    }).then(done)
+  })
+
+  it('relocates node without error', done => {
+    const el = document.createElement('div')
+    document.body.appendChild(el)
+    const target = document.createElement('div')
+    document.body.appendChild(target)
+
+    const Test = {
+      render (h) {
+        return h('div', { class: 'test' }, this.$slots.default)
+      },
+      mounted () {
+        target.appendChild(this.$el)
+      },
+      beforeDestroy () {
+        const parent = this.$el.parentNode
+        if (parent) {
+          parent.removeChild(this.$el)
+        }
+      }
+    }
+    const vm = new Vue({
+      data () {
+        return {
+          view: true
+        }
+      },
+      template: `<div><test v-if="view">Test</test></div>`,
+      components: {
+        test: Test
+      }
+    }).$mount(el)
+
+    expect(el.outerHTML).toBe('<div></div>')
+    expect(target.outerHTML).toBe('<div><div class="test">Test</div></div>')
+    vm.view = false
+    waitForUpdate(() => {
+      expect(el.outerHTML).toBe('<div></div>')
+      expect(target.outerHTML).toBe('<div></div>')
+      vm.$destroy()
+    }).then(done)
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/features/debug.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/features/debug.spec.js
new file mode 100644 (file)
index 0000000..ff49532
--- /dev/null
@@ -0,0 +1,117 @@
+import Vue from 'vue'
+import { formatComponentName, warn } from 'core/util/debug'
+
+describe('Debug utilities', () => {
+  it('properly format component names', () => {
+    const vm = new Vue()
+    expect(formatComponentName(vm)).toBe('<Root>')
+
+    vm.$root = null
+    vm.$options.name = 'hello-there'
+    expect(formatComponentName(vm)).toBe('<HelloThere>')
+
+    vm.$options.name = null
+    vm.$options._componentTag = 'foo-bar-1'
+    expect(formatComponentName(vm)).toBe('<FooBar1>')
+
+    vm.$options._componentTag = null
+    vm.$options.__file = '/foo/bar/baz/SomeThing.vue'
+    expect(formatComponentName(vm)).toBe(`<SomeThing> at ${vm.$options.__file}`)
+    expect(formatComponentName(vm, false)).toBe('<SomeThing>')
+
+    vm.$options.__file = 'C:\\foo\\bar\\baz\\windows_file.vue'
+    expect(formatComponentName(vm)).toBe(`<WindowsFile> at ${vm.$options.__file}`)
+    expect(formatComponentName(vm, false)).toBe('<WindowsFile>')
+  })
+
+  it('generate correct component hierarchy trace', () => {
+    const one = {
+      name: 'one',
+      render: h => h(two)
+    }
+    const two = {
+      name: 'two',
+      render: h => h(three)
+    }
+    const three = {
+      name: 'three'
+    }
+    new Vue({
+      render: h => h(one)
+    }).$mount()
+
+    expect(
+      `Failed to mount component: template or render function not defined.
+
+found in
+
+---> <Three>
+       <Two>
+         <One>
+           <Root>`
+    ).toHaveBeenWarned()
+  })
+
+  it('generate correct component hierarchy trace (recursive)', () => {
+    let i = 0
+    const one = {
+      name: 'one',
+      render: h => i++ < 5 ? h(one) : h(two)
+    }
+    const two = {
+      name: 'two',
+      render: h => h(three)
+    }
+    const three = {
+      name: 'three'
+    }
+    new Vue({
+      render: h => h(one)
+    }).$mount()
+
+    expect(
+      `Failed to mount component: template or render function not defined.
+
+found in
+
+---> <Three>
+       <Two>
+         <One>... (5 recursive calls)
+           <Root>`
+    ).toHaveBeenWarned()
+  })
+
+  describe('warn', () => {
+    const msg = 'message'
+    const vm = new Vue()
+
+    it('calls warnHandler if warnHandler is set', () => {
+      Vue.config.warnHandler = jasmine.createSpy()
+
+      warn(msg, vm)
+
+      expect(Vue.config.warnHandler).toHaveBeenCalledWith(msg, vm, jasmine.any(String))
+
+      Vue.config.warnHandler = null
+    })
+
+    it('calls console.error if silent is false', () => {
+      Vue.config.silent = false
+
+      warn(msg, vm)
+
+      expect(msg).toHaveBeenWarned()
+      expect(console.error).toHaveBeenCalled()
+    })
+
+    it('does not call console.error if silent is true', () => {
+      Vue.config.silent = true
+
+      warn(msg, vm)
+
+      expect(console.error).not.toHaveBeenCalled()
+
+      Vue.config.silent = false
+    })
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/features/directives/bind.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/features/directives/bind.spec.js
new file mode 100644 (file)
index 0000000..e9ab1bf
--- /dev/null
@@ -0,0 +1,414 @@
+import Vue from 'vue'
+
+describe('Directive v-bind', () => {
+  it('normal attr', done => {
+    const vm = new Vue({
+      template: '<div><span :test="foo">hello</span></div>',
+      data: { foo: 'ok' }
+    }).$mount()
+    expect(vm.$el.firstChild.getAttribute('test')).toBe('ok')
+    vm.foo = 'again'
+    waitForUpdate(() => {
+      expect(vm.$el.firstChild.getAttribute('test')).toBe('again')
+      vm.foo = null
+    }).then(() => {
+      expect(vm.$el.firstChild.hasAttribute('test')).toBe(false)
+      vm.foo = false
+    }).then(() => {
+      expect(vm.$el.firstChild.hasAttribute('test')).toBe(false)
+      vm.foo = true
+    }).then(() => {
+      expect(vm.$el.firstChild.getAttribute('test')).toBe('true')
+      vm.foo = 0
+    }).then(() => {
+      expect(vm.$el.firstChild.getAttribute('test')).toBe('0')
+    }).then(done)
+  })
+
+  it('should set property for input value', done => {
+    const vm = new Vue({
+      template: `
+        <div>
+          <input type="text" :value="foo">
+          <input type="checkbox" :checked="bar">
+        </div>
+      `,
+      data: {
+        foo: 'ok',
+        bar: false
+      }
+    }).$mount()
+    expect(vm.$el.firstChild.value).toBe('ok')
+    expect(vm.$el.lastChild.checked).toBe(false)
+    vm.bar = true
+    waitForUpdate(() => {
+      expect(vm.$el.lastChild.checked).toBe(true)
+    }).then(done)
+  })
+
+  it('xlink', done => {
+    const vm = new Vue({
+      template: '<svg><a :xlink:special="foo"></a></svg>',
+      data: {
+        foo: 'ok'
+      }
+    }).$mount()
+    const xlinkNS = 'http://www.w3.org/1999/xlink'
+    expect(vm.$el.firstChild.getAttributeNS(xlinkNS, 'special')).toBe('ok')
+    vm.foo = 'again'
+    waitForUpdate(() => {
+      expect(vm.$el.firstChild.getAttributeNS(xlinkNS, 'special')).toBe('again')
+      vm.foo = null
+    }).then(() => {
+      expect(vm.$el.firstChild.hasAttributeNS(xlinkNS, 'special')).toBe(false)
+      vm.foo = true
+    }).then(() => {
+      expect(vm.$el.firstChild.getAttributeNS(xlinkNS, 'special')).toBe('true')
+    }).then(done)
+  })
+
+  it('enumerated attr', done => {
+    const vm = new Vue({
+      template: '<div><span :draggable="foo">hello</span></div>',
+      data: { foo: true }
+    }).$mount()
+    expect(vm.$el.firstChild.getAttribute('draggable')).toBe('true')
+    vm.foo = 'again'
+    waitForUpdate(() => {
+      expect(vm.$el.firstChild.getAttribute('draggable')).toBe('true')
+      vm.foo = null
+    }).then(() => {
+      expect(vm.$el.firstChild.getAttribute('draggable')).toBe('false')
+      vm.foo = ''
+    }).then(() => {
+      expect(vm.$el.firstChild.getAttribute('draggable')).toBe('true')
+      vm.foo = false
+    }).then(() => {
+      expect(vm.$el.firstChild.getAttribute('draggable')).toBe('false')
+      vm.foo = 'false'
+    }).then(() => {
+      expect(vm.$el.firstChild.getAttribute('draggable')).toBe('false')
+    }).then(done)
+  })
+
+  it('boolean attr', done => {
+    const vm = new Vue({
+      template: '<div><span :disabled="foo">hello</span></div>',
+      data: { foo: true }
+    }).$mount()
+    expect(vm.$el.firstChild.getAttribute('disabled')).toBe('disabled')
+    vm.foo = 'again'
+    waitForUpdate(() => {
+      expect(vm.$el.firstChild.getAttribute('disabled')).toBe('disabled')
+      vm.foo = null
+    }).then(() => {
+      expect(vm.$el.firstChild.hasAttribute('disabled')).toBe(false)
+      vm.foo = ''
+    }).then(() => {
+      expect(vm.$el.firstChild.hasAttribute('disabled')).toBe(true)
+    }).then(done)
+  })
+
+  it('.prop modifier', () => {
+    const vm = new Vue({
+      template: '<div><span v-bind:text-content.prop="foo"></span><span :inner-html.prop="bar"></span></div>',
+      data: {
+        foo: 'hello',
+        bar: '<span>qux</span>'
+      }
+    }).$mount()
+    expect(vm.$el.children[0].textContent).toBe('hello')
+    expect(vm.$el.children[1].innerHTML).toBe('<span>qux</span>')
+  })
+
+  it('.prop modifier with normal attribute binding', () => {
+    const vm = new Vue({
+      template: '<input :some.prop="some" :id="id">',
+      data: {
+        some: 'hello',
+        id: false
+      }
+    }).$mount()
+    expect(vm.$el.some).toBe('hello')
+    expect(vm.$el.getAttribute('id')).toBe(null)
+  })
+
+  it('.camel modifier', () => {
+    const vm = new Vue({
+      template: '<svg :view-box.camel="viewBox"></svg>',
+      data: {
+        viewBox: '0 0 1 1'
+      }
+    }).$mount()
+    expect(vm.$el.getAttribute('viewBox')).toBe('0 0 1 1')
+  })
+
+  it('.sync modifier', done => {
+    const vm = new Vue({
+      template: `<test :foo-bar.sync="bar"/>`,
+      data: {
+        bar: 1
+      },
+      components: {
+        test: {
+          props: ['fooBar'],
+          template: `<div @click="$emit('update:fooBar', 2)">{{ fooBar }}</div>`
+        }
+      }
+    }).$mount()
+
+    expect(vm.$el.textContent).toBe('1')
+    triggerEvent(vm.$el, 'click')
+    waitForUpdate(() => {
+      expect(vm.$el.textContent).toBe('2')
+    }).then(done)
+  })
+
+  it('bind object', done => {
+    const vm = new Vue({
+      template: '<input v-bind="test">',
+      data: {
+        test: {
+          id: 'test',
+          class: 'ok',
+          value: 'hello'
+        }
+      }
+    }).$mount()
+    expect(vm.$el.getAttribute('id')).toBe('test')
+    expect(vm.$el.getAttribute('class')).toBe('ok')
+    expect(vm.$el.value).toBe('hello')
+    vm.test.id = 'hi'
+    vm.test.value = 'bye'
+    waitForUpdate(() => {
+      expect(vm.$el.getAttribute('id')).toBe('hi')
+      expect(vm.$el.getAttribute('class')).toBe('ok')
+      expect(vm.$el.value).toBe('bye')
+    }).then(done)
+  })
+
+  it('.sync modifier with bind object', done => {
+    const vm = new Vue({
+      template: `<test v-bind.sync="test"/>`,
+      data: {
+        test: {
+          fooBar: 1
+        }
+      },
+      components: {
+        test: {
+          props: ['fooBar'],
+          template: `<div @click="handleUpdate">{{ fooBar }}</div>`,
+          methods: {
+            handleUpdate () {
+              this.$emit('update:fooBar', 2)
+            }
+          }
+        }
+      }
+    }).$mount()
+    expect(vm.$el.textContent).toBe('1')
+    triggerEvent(vm.$el, 'click')
+    waitForUpdate(() => {
+      expect(vm.$el.textContent).toBe('2')
+      vm.test.fooBar = 3
+    }).then(() => {
+      expect(vm.$el.textContent).toBe('3')
+    }).then(done)
+  })
+
+  it('bind object with overwrite', done => {
+    const vm = new Vue({
+      template: '<input v-bind="test" id="foo" :class="test.value">',
+      data: {
+        test: {
+          id: 'test',
+          class: 'ok',
+          value: 'hello'
+        }
+      }
+    }).$mount()
+    expect(vm.$el.getAttribute('id')).toBe('foo')
+    expect(vm.$el.getAttribute('class')).toBe('hello')
+    expect(vm.$el.value).toBe('hello')
+    vm.test.id = 'hi'
+    vm.test.value = 'bye'
+    waitForUpdate(() => {
+      expect(vm.$el.getAttribute('id')).toBe('foo')
+      expect(vm.$el.getAttribute('class')).toBe('bye')
+      expect(vm.$el.value).toBe('bye')
+    }).then(done)
+  })
+
+  it('bind object with class/style', done => {
+    const vm = new Vue({
+      template: '<input class="a" style="color:red" v-bind="test">',
+      data: {
+        test: {
+          id: 'test',
+          class: ['b', 'c'],
+          style: { fontSize: '12px' }
+        }
+      }
+    }).$mount()
+    expect(vm.$el.id).toBe('test')
+    expect(vm.$el.className).toBe('a b c')
+    expect(vm.$el.style.color).toBe('red')
+    expect(vm.$el.style.fontSize).toBe('12px')
+    vm.test.id = 'hi'
+    vm.test.class = ['d']
+    vm.test.style = { fontSize: '14px' }
+    waitForUpdate(() => {
+      expect(vm.$el.id).toBe('hi')
+      expect(vm.$el.className).toBe('a d')
+      expect(vm.$el.style.color).toBe('red')
+      expect(vm.$el.style.fontSize).toBe('14px')
+    }).then(done)
+  })
+
+  it('bind object as prop', done => {
+    const vm = new Vue({
+      template: '<input v-bind.prop="test">',
+      data: {
+        test: {
+          id: 'test',
+          className: 'ok',
+          value: 'hello'
+        }
+      }
+    }).$mount()
+    expect(vm.$el.id).toBe('test')
+    expect(vm.$el.className).toBe('ok')
+    expect(vm.$el.value).toBe('hello')
+    vm.test.id = 'hi'
+    vm.test.className = 'okay'
+    vm.test.value = 'bye'
+    waitForUpdate(() => {
+      expect(vm.$el.id).toBe('hi')
+      expect(vm.$el.className).toBe('okay')
+      expect(vm.$el.value).toBe('bye')
+    }).then(done)
+  })
+
+  it('bind array', done => {
+    const vm = new Vue({
+      template: '<input v-bind="test">',
+      data: {
+        test: [
+          { id: 'test', class: 'ok' },
+          { value: 'hello' }
+        ]
+      }
+    }).$mount()
+    expect(vm.$el.getAttribute('id')).toBe('test')
+    expect(vm.$el.getAttribute('class')).toBe('ok')
+    expect(vm.$el.value).toBe('hello')
+    vm.test[0].id = 'hi'
+    vm.test[1].value = 'bye'
+    waitForUpdate(() => {
+      expect(vm.$el.getAttribute('id')).toBe('hi')
+      expect(vm.$el.getAttribute('class')).toBe('ok')
+      expect(vm.$el.value).toBe('bye')
+    }).then(done)
+  })
+
+  it('warn expect object', () => {
+    new Vue({
+      template: '<input v-bind="test">',
+      data: {
+        test: 1
+      }
+    }).$mount()
+    expect('v-bind without argument expects an Object or Array value').toHaveBeenWarned()
+  })
+
+  it('set value for option element', () => {
+    const vm = new Vue({
+      template: '<select><option :value="val">val</option></select>',
+      data: {
+        val: 'val'
+      }
+    }).$mount()
+    // check value attribute
+    expect(vm.$el.options[0].getAttribute('value')).toBe('val')
+  })
+
+  // a vdom patch edge case where the user has several un-keyed elements of the
+  // same tag next to each other, and toggling them.
+  it('properly update for toggling un-keyed children', done => {
+    const vm = new Vue({
+      template: `
+        <div>
+          <div v-if="ok" id="a" data-test="1"></div>
+          <div v-if="!ok" id="b"></div>
+        </div>
+      `,
+      data: {
+        ok: true
+      }
+    }).$mount()
+    expect(vm.$el.children[0].id).toBe('a')
+    expect(vm.$el.children[0].getAttribute('data-test')).toBe('1')
+    vm.ok = false
+    waitForUpdate(() => {
+      expect(vm.$el.children[0].id).toBe('b')
+      expect(vm.$el.children[0].getAttribute('data-test')).toBe(null)
+    }).then(done)
+  })
+
+  describe('bind object with special attribute', () => {
+    function makeInstance (options) {
+      return new Vue({
+        template: `<div>${options.parentTemp}</div>`,
+        data: {
+          attrs: {
+            [options.attr]: options.value
+          }
+        },
+        components: {
+          comp: {
+            template: options.childTemp
+          }
+        }
+      }).$mount()
+    }
+
+    it('key', () => {
+      const vm = makeInstance({
+        attr: 'key',
+        value: 'test',
+        parentTemp: '<div v-bind="attrs"></div>'
+      })
+      expect(vm._vnode.children[0].key).toBe('test')
+    })
+
+    it('ref', () => {
+      const vm = makeInstance({
+        attr: 'ref',
+        value: 'test',
+        parentTemp: '<div v-bind="attrs"></div>'
+      })
+      expect(vm.$refs.test).toBe(vm.$el.firstChild)
+    })
+
+    it('slot', () => {
+      const vm = makeInstance({
+        attr: 'slot',
+        value: 'test',
+        parentTemp: '<comp><span v-bind="attrs">123</span></comp>',
+        childTemp: '<div>slot:<slot name="test"></slot></div>'
+      })
+      expect(vm.$el.innerHTML).toBe('<div>slot:<span>123</span></div>')
+    })
+
+    it('is', () => {
+      const vm = makeInstance({
+        attr: 'is',
+        value: 'comp',
+        parentTemp: '<component v-bind="attrs"></component>',
+        childTemp: '<div>comp</div>'
+      })
+      expect(vm.$el.innerHTML).toBe('<div>comp</div>')
+    })
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/features/directives/class.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/features/directives/class.spec.js
new file mode 100644 (file)
index 0000000..c139069
--- /dev/null
@@ -0,0 +1,175 @@
+import Vue from 'vue'
+
+function assertClass (assertions, done) {
+  const vm = new Vue({
+    template: '<div class="foo" :class="value"></div>',
+    data: { value: '' }
+  }).$mount()
+  var chain = waitForUpdate()
+  assertions.forEach(([value, expected], i) => {
+    chain.then(() => {
+      if (typeof value === 'function') {
+        value(vm.value)
+      } else {
+        vm.value = value
+      }
+    }).then(() => {
+      expect(vm.$el.className).toBe(expected)
+      if (i >= assertions.length - 1) {
+        done()
+      }
+    })
+  })
+  chain.then(done)
+}
+
+describe('Directive v-bind:class', () => {
+  it('plain string', done => {
+    assertClass([
+      ['bar', 'foo bar'],
+      ['baz qux', 'foo baz qux'],
+      ['qux', 'foo qux'],
+      [undefined, 'foo']
+    ], done)
+  })
+
+  it('object value', done => {
+    assertClass([
+      [{ bar: true, baz: false }, 'foo bar'],
+      [{ baz: true }, 'foo baz'],
+      [null, 'foo'],
+      [{ 'bar baz': true, qux: false }, 'foo bar baz'],
+      [{ qux: true }, 'foo qux']
+    ], done)
+  })
+
+  it('array value', done => {
+    assertClass([
+      [['bar', 'baz'], 'foo bar baz'],
+      [['qux', 'baz'], 'foo qux baz'],
+      [['w', 'x y z'], 'foo w x y z'],
+      [undefined, 'foo'],
+      [['bar'], 'foo bar'],
+      [val => val.push('baz'), 'foo bar baz']
+    ], done)
+  })
+
+  it('array of mixed values', done => {
+    assertClass([
+      [['x', { y: true, z: true }], 'foo x y z'],
+      [['x', { y: true, z: false }], 'foo x y'],
+      [['f', { z: true }], 'foo f z'],
+      [['l', 'f', { n: true, z: true }], 'foo l f n z'],
+      [['x', {}], 'foo x'],
+      [undefined, 'foo']
+    ], done)
+  })
+
+  it('class merge between parent and child', done => {
+    const vm = new Vue({
+      template: '<child class="a" :class="value"></child>',
+      data: { value: 'b' },
+      components: {
+        child: {
+          template: '<div class="c" :class="value"></div>',
+          data: () => ({ value: 'd' })
+        }
+      }
+    }).$mount()
+    const child = vm.$children[0]
+    expect(vm.$el.className).toBe('c a d b')
+    vm.value = 'e'
+    waitForUpdate(() => {
+      expect(vm.$el.className).toBe('c a d e')
+    }).then(() => {
+      child.value = 'f'
+    }).then(() => {
+      expect(vm.$el.className).toBe('c a f e')
+    }).then(() => {
+      vm.value = { foo: true }
+      child.value = ['bar', 'baz']
+    }).then(() => {
+      expect(vm.$el.className).toBe('c a bar baz foo')
+    }).then(done)
+  })
+
+  it('class merge between multiple nested components sharing same element', done => {
+    const vm = new Vue({
+      template: `
+        <component1 :class="componentClass1">
+          <component2 :class="componentClass2">
+            <component3 :class="componentClass3">
+              some text
+            </component3>
+          </component2>
+        </component1>
+      `,
+      data: {
+        componentClass1: 'componentClass1',
+        componentClass2: 'componentClass2',
+        componentClass3: 'componentClass3'
+      },
+      components: {
+        component1: {
+          render () {
+            return this.$slots.default[0]
+          }
+        },
+        component2: {
+          render () {
+            return this.$slots.default[0]
+          }
+        },
+        component3: {
+          template: '<div class="staticClass"><slot></slot></div>'
+        }
+      }
+    }).$mount()
+    expect(vm.$el.className).toBe('staticClass componentClass3 componentClass2 componentClass1')
+    vm.componentClass1 = 'c1'
+    waitForUpdate(() => {
+      expect(vm.$el.className).toBe('staticClass componentClass3 componentClass2 c1')
+      vm.componentClass2 = 'c2'
+    }).then(() => {
+      expect(vm.$el.className).toBe('staticClass componentClass3 c2 c1')
+      vm.componentClass3 = 'c3'
+    }).then(() => {
+      expect(vm.$el.className).toBe('staticClass c3 c2 c1')
+    }).then(done)
+  })
+
+  it('deep update', done => {
+    const vm = new Vue({
+      template: '<div :class="test"></div>',
+      data: {
+        test: { a: true, b: false }
+      }
+    }).$mount()
+    expect(vm.$el.className).toBe('a')
+    vm.test.b = true
+    waitForUpdate(() => {
+      expect(vm.$el.className).toBe('a b')
+    }).then(done)
+  })
+
+  // a vdom patch edge case where the user has several un-keyed elements of the
+  // same tag next to each other, and toggling them.
+  it('properly remove staticClass for toggling un-keyed children', done => {
+    const vm = new Vue({
+      template: `
+        <div>
+          <div v-if="ok" class="a"></div>
+          <div v-if="!ok"></div>
+        </div>
+      `,
+      data: {
+        ok: true
+      }
+    }).$mount()
+    expect(vm.$el.children[0].className).toBe('a')
+    vm.ok = false
+    waitForUpdate(() => {
+      expect(vm.$el.children[0].className).toBe('')
+    }).then(done)
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/features/directives/cloak.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/features/directives/cloak.spec.js
new file mode 100644 (file)
index 0000000..618d21b
--- /dev/null
@@ -0,0 +1,10 @@
+import Vue from 'vue'
+
+describe('Directive v-cloak', () => {
+  it('should be removed after compile', () => {
+    const el = document.createElement('div')
+    el.setAttribute('v-cloak', '')
+    const vm = new Vue({ el })
+    expect(vm.$el.hasAttribute('v-cloak')).toBe(false)
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/features/directives/for.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/features/directives/for.spec.js
new file mode 100644 (file)
index 0000000..22528be
--- /dev/null
@@ -0,0 +1,511 @@
+import Vue from 'vue'
+
+describe('Directive v-for', () => {
+  it('should render array of primitive values', done => {
+    const vm = new Vue({
+      template: `
+        <div>
+          <span v-for="item in list">{{item}}</span>
+        </div>
+      `,
+      data: {
+        list: ['a', 'b', 'c']
+      }
+    }).$mount()
+    expect(vm.$el.innerHTML).toBe('<span>a</span><span>b</span><span>c</span>')
+    Vue.set(vm.list, 0, 'd')
+    waitForUpdate(() => {
+      expect(vm.$el.innerHTML).toBe('<span>d</span><span>b</span><span>c</span>')
+      vm.list.push('d')
+    }).then(() => {
+      expect(vm.$el.innerHTML).toBe('<span>d</span><span>b</span><span>c</span><span>d</span>')
+      vm.list.splice(1, 2)
+    }).then(() => {
+      expect(vm.$el.innerHTML).toBe('<span>d</span><span>d</span>')
+      vm.list = ['x', 'y']
+    }).then(() => {
+      expect(vm.$el.innerHTML).toBe('<span>x</span><span>y</span>')
+    }).then(done)
+  })
+
+  it('should render array of primitive values with index', done => {
+    const vm = new Vue({
+      template: `
+        <div>
+          <span v-for="(item, i) in list">{{i}}-{{item}}</span>
+        </div>
+      `,
+      data: {
+        list: ['a', 'b', 'c']
+      }
+    }).$mount()
+    expect(vm.$el.innerHTML).toBe('<span>0-a</span><span>1-b</span><span>2-c</span>')
+    Vue.set(vm.list, 0, 'd')
+    waitForUpdate(() => {
+      expect(vm.$el.innerHTML).toBe('<span>0-d</span><span>1-b</span><span>2-c</span>')
+      vm.list.push('d')
+    }).then(() => {
+      expect(vm.$el.innerHTML).toBe('<span>0-d</span><span>1-b</span><span>2-c</span><span>3-d</span>')
+      vm.list.splice(1, 2)
+    }).then(() => {
+      expect(vm.$el.innerHTML).toBe('<span>0-d</span><span>1-d</span>')
+      vm.list = ['x', 'y']
+    }).then(() => {
+      expect(vm.$el.innerHTML).toBe('<span>0-x</span><span>1-y</span>')
+    }).then(done)
+  })
+
+  it('should render array of object values', done => {
+    const vm = new Vue({
+      template: `
+        <div>
+          <span v-for="item in list">{{item.value}}</span>
+        </div>
+      `,
+      data: {
+        list: [
+          { value: 'a' },
+          { value: 'b' },
+          { value: 'c' }
+        ]
+      }
+    }).$mount()
+    expect(vm.$el.innerHTML).toBe('<span>a</span><span>b</span><span>c</span>')
+    Vue.set(vm.list, 0, { value: 'd' })
+    waitForUpdate(() => {
+      expect(vm.$el.innerHTML).toBe('<span>d</span><span>b</span><span>c</span>')
+      vm.list[0].value = 'e'
+    }).then(() => {
+      expect(vm.$el.innerHTML).toBe('<span>e</span><span>b</span><span>c</span>')
+      vm.list.push({})
+    }).then(() => {
+      expect(vm.$el.innerHTML).toBe('<span>e</span><span>b</span><span>c</span><span></span>')
+      vm.list.splice(1, 2)
+    }).then(() => {
+      expect(vm.$el.innerHTML).toBe('<span>e</span><span></span>')
+      vm.list = [{ value: 'x' }, { value: 'y' }]
+    }).then(() => {
+      expect(vm.$el.innerHTML).toBe('<span>x</span><span>y</span>')
+    }).then(done)
+  })
+
+  it('should render array of object values with index', done => {
+    const vm = new Vue({
+      template: `
+        <div>
+          <span v-for="(item, i) in list">{{i}}-{{item.value}}</span>
+        </div>
+      `,
+      data: {
+        list: [
+          { value: 'a' },
+          { value: 'b' },
+          { value: 'c' }
+        ]
+      }
+    }).$mount()
+    expect(vm.$el.innerHTML).toBe('<span>0-a</span><span>1-b</span><span>2-c</span>')
+    Vue.set(vm.list, 0, { value: 'd' })
+    waitForUpdate(() => {
+      expect(vm.$el.innerHTML).toBe('<span>0-d</span><span>1-b</span><span>2-c</span>')
+      vm.list[0].value = 'e'
+    }).then(() => {
+      expect(vm.$el.innerHTML).toBe('<span>0-e</span><span>1-b</span><span>2-c</span>')
+      vm.list.push({})
+    }).then(() => {
+      expect(vm.$el.innerHTML).toBe('<span>0-e</span><span>1-b</span><span>2-c</span><span>3-</span>')
+      vm.list.splice(1, 2)
+    }).then(() => {
+      expect(vm.$el.innerHTML).toBe('<span>0-e</span><span>1-</span>')
+      vm.list = [{ value: 'x' }, { value: 'y' }]
+    }).then(() => {
+      expect(vm.$el.innerHTML).toBe('<span>0-x</span><span>1-y</span>')
+    }).then(done)
+  })
+
+  it('should render an Object', done => {
+    const vm = new Vue({
+      template: `
+        <div>
+          <span v-for="val in obj">{{val}}</span>
+        </div>
+      `,
+      data: {
+        obj: { a: 0, b: 1, c: 2 }
+      }
+    }).$mount()
+    expect(vm.$el.innerHTML).toBe('<span>0</span><span>1</span><span>2</span>')
+    vm.obj.a = 3
+    waitForUpdate(() => {
+      expect(vm.$el.innerHTML).toBe('<span>3</span><span>1</span><span>2</span>')
+      Vue.set(vm.obj, 'd', 4)
+    }).then(() => {
+      expect(vm.$el.innerHTML).toBe('<span>3</span><span>1</span><span>2</span><span>4</span>')
+      Vue.delete(vm.obj, 'a')
+    }).then(() => {
+      expect(vm.$el.innerHTML).toBe('<span>1</span><span>2</span><span>4</span>')
+    }).then(done)
+  })
+
+  it('should render an Object with key', done => {
+    const vm = new Vue({
+      template: `
+        <div>
+          <span v-for="(val, key) in obj">{{val}}-{{key}}</span>
+        </div>
+      `,
+      data: {
+        obj: { a: 0, b: 1, c: 2 }
+      }
+    }).$mount()
+    expect(vm.$el.innerHTML).toBe('<span>0-a</span><span>1-b</span><span>2-c</span>')
+    vm.obj.a = 3
+    waitForUpdate(() => {
+      expect(vm.$el.innerHTML).toBe('<span>3-a</span><span>1-b</span><span>2-c</span>')
+      Vue.set(vm.obj, 'd', 4)
+    }).then(() => {
+      expect(vm.$el.innerHTML).toBe('<span>3-a</span><span>1-b</span><span>2-c</span><span>4-d</span>')
+      Vue.delete(vm.obj, 'a')
+    }).then(() => {
+      expect(vm.$el.innerHTML).toBe('<span>1-b</span><span>2-c</span><span>4-d</span>')
+    }).then(done)
+  })
+
+  it('should render an Object with key and index', done => {
+    const vm = new Vue({
+      template: `
+        <div>
+          <span v-for="(val, key, i) in obj">{{val}}-{{key}}-{{i}}</span>
+        </div>
+      `,
+      data: {
+        obj: { a: 0, b: 1, c: 2 }
+      }
+    }).$mount()
+    expect(vm.$el.innerHTML).toBe('<span>0-a-0</span><span>1-b-1</span><span>2-c-2</span>')
+    vm.obj.a = 3
+    waitForUpdate(() => {
+      expect(vm.$el.innerHTML).toBe('<span>3-a-0</span><span>1-b-1</span><span>2-c-2</span>')
+      Vue.set(vm.obj, 'd', 4)
+    }).then(() => {
+      expect(vm.$el.innerHTML).toBe('<span>3-a-0</span><span>1-b-1</span><span>2-c-2</span><span>4-d-3</span>')
+      Vue.delete(vm.obj, 'a')
+    }).then(() => {
+      expect(vm.$el.innerHTML).toBe('<span>1-b-0</span><span>2-c-1</span><span>4-d-2</span>')
+    }).then(done)
+  })
+
+  it('should render each key of data', done => {
+    const vm = new Vue({
+      template: `
+        <div>
+          <span v-for="(val, key) in $data">{{val}}-{{key}}</span>
+        </div>
+      `,
+      data: { a: 0, b: 1, c: 2 }
+    }).$mount()
+    expect(vm.$el.innerHTML).toBe('<span>0-a</span><span>1-b</span><span>2-c</span>')
+    vm.a = 3
+    waitForUpdate(() => {
+      expect(vm.$el.innerHTML).toBe('<span>3-a</span><span>1-b</span><span>2-c</span>')
+    }).then(done)
+  })
+
+  it('check priorities: v-if before v-for', function () {
+    const vm = new Vue({
+      data: {
+        items: [1, 2, 3]
+      },
+      template: '<div><div v-if="item < 3" v-for="item in items">{{item}}</div></div>'
+    }).$mount()
+    expect(vm.$el.textContent).toBe('12')
+  })
+
+  it('check priorities: v-if after v-for', function () {
+    const vm = new Vue({
+      data: {
+        items: [1, 2, 3]
+      },
+      template: '<div><div v-for="item in items" v-if="item < 3">{{item}}</div></div>'
+    }).$mount()
+    expect(vm.$el.textContent).toBe('12')
+  })
+
+  it('range v-for', () => {
+    const vm = new Vue({
+      template: '<div><div v-for="n in 3">{{n}}</div></div>'
+    }).$mount()
+    expect(vm.$el.textContent).toBe('123')
+  })
+
+  it('without key', done => {
+    const vm = new Vue({
+      data: {
+        items: [
+          { id: 1, msg: 'a' },
+          { id: 2, msg: 'b' },
+          { id: 3, msg: 'c' }
+        ]
+      },
+      template: '<div><div v-for="item in items">{{ item.msg }}</div></div>'
+    }).$mount()
+    expect(vm.$el.textContent).toBe('abc')
+    const first = vm.$el.children[0]
+    vm.items.reverse()
+    waitForUpdate(() => {
+      expect(vm.$el.textContent).toBe('cba')
+      // assert reusing DOM element in place
+      expect(vm.$el.children[0]).toBe(first)
+    }).then(done)
+  })
+
+  it('with key', done => {
+    const vm = new Vue({
+      data: {
+        items: [
+          { id: 1, msg: 'a' },
+          { id: 2, msg: 'b' },
+          { id: 3, msg: 'c' }
+        ]
+      },
+      template: '<div><div v-for="item in items" :key="item.id">{{ item.msg }}</div></div>'
+    }).$mount()
+    expect(vm.$el.textContent).toBe('abc')
+    const first = vm.$el.children[0]
+    vm.items.reverse()
+    waitForUpdate(() => {
+      expect(vm.$el.textContent).toBe('cba')
+      // assert moving DOM element
+      expect(vm.$el.children[0]).not.toBe(first)
+      expect(vm.$el.children[2]).toBe(first)
+    }).then(done)
+  })
+
+  it('nested loops', () => {
+    const vm = new Vue({
+      data: {
+        items: [
+          { items: [{ a: 1 }, { a: 2 }], a: 1 },
+          { items: [{ a: 3 }, { a: 4 }], a: 2 }
+        ]
+      },
+      template:
+        '<div>' +
+          '<div v-for="(item, i) in items">' +
+            '<p v-for="(subItem, j) in item.items">{{j}} {{subItem.a}} {{i}} {{item.a}}</p>' +
+          '</div>' +
+        '</div>'
+    }).$mount()
+    expect(vm.$el.innerHTML).toBe(
+      '<div><p>0 1 0 1</p><p>1 2 0 1</p></div>' +
+      '<div><p>0 3 1 2</p><p>1 4 1 2</p></div>'
+    )
+  })
+
+  it('template v-for', done => {
+    const vm = new Vue({
+      data: {
+        list: [
+          { a: 1 },
+          { a: 2 },
+          { a: 3 }
+        ]
+      },
+      template:
+        '<div>' +
+          '<template v-for="item in list">' +
+            '<p>{{item.a}}</p>' +
+            '<p>{{item.a + 1}}</p>' +
+          '</template>' +
+        '</div>'
+    }).$mount()
+    assertMarkup()
+    vm.list.reverse()
+    waitForUpdate(() => {
+      assertMarkup()
+      vm.list.splice(1, 1)
+    }).then(() => {
+      assertMarkup()
+      vm.list.splice(1, 0, { a: 2 })
+    }).then(done)
+
+    function assertMarkup () {
+      var markup = vm.list.map(function (item) {
+        return '<p>' + item.a + '</p><p>' + (item.a + 1) + '</p>'
+      }).join('')
+      expect(vm.$el.innerHTML).toBe(markup)
+    }
+  })
+
+  it('component v-for', done => {
+    const vm = new Vue({
+      data: {
+        list: [
+          { a: 1 },
+          { a: 2 },
+          { a: 3 }
+        ]
+      },
+      template:
+        '<div>' +
+          '<test v-for="item in list" :msg="item.a" :key="item.a">' +
+            '<span>{{item.a}}</span>' +
+          '</test>' +
+        '</div>',
+      components: {
+        test: {
+          props: ['msg'],
+          template: '<p>{{msg}}<slot></slot></p>'
+        }
+      }
+    }).$mount()
+    assertMarkup()
+    vm.list.reverse()
+    waitForUpdate(() => {
+      assertMarkup()
+      vm.list.splice(1, 1)
+    }).then(() => {
+      assertMarkup()
+      vm.list.splice(1, 0, { a: 2 })
+    }).then(done)
+
+    function assertMarkup () {
+      var markup = vm.list.map(function (item) {
+        return `<p>${item.a}<span>${item.a}</span></p>`
+      }).join('')
+      expect(vm.$el.innerHTML).toBe(markup)
+    }
+  })
+
+  it('dynamic component v-for', done => {
+    const vm = new Vue({
+      data: {
+        list: [
+          { type: 'one' },
+          { type: 'two' }
+        ]
+      },
+      template:
+        '<div>' +
+          '<component v-for="item in list" :key="item.type" :is="item.type"></component>' +
+        '</div>',
+      components: {
+        one: {
+          template: '<p>One!</p>'
+        },
+        two: {
+          template: '<div>Two!</div>'
+        }
+      }
+    }).$mount()
+    expect(vm.$el.innerHTML).toContain('<p>One!</p><div>Two!</div>')
+    vm.list.reverse()
+    waitForUpdate(() => {
+      expect(vm.$el.innerHTML).toContain('<div>Two!</div><p>One!</p>')
+    }).then(done)
+  })
+
+  it('should warn component v-for without keys', () => {
+    const warn = console.warn
+    console.warn = jasmine.createSpy()
+    new Vue({
+      template: `<div><test v-for="i in 3"></test></div>`,
+      components: {
+        test: {
+          render () {}
+        }
+      }
+    }).$mount()
+    expect(console.warn.calls.argsFor(0)[0]).toContain(
+      `<test v-for="i in 3">: component lists rendered with v-for should have explicit keys`
+    )
+    console.warn = warn
+  })
+
+  it('multi nested array reactivity', done => {
+    const vm = new Vue({
+      data: {
+        list: [[['foo']]]
+      },
+      template: `
+        <div>
+          <div v-for="i in list">
+            <div v-for="j in i">
+              <div v-for="k in j">
+                {{ k }}
+              </div>
+            </div>
+          </div>
+        </div>
+      `
+    }).$mount()
+    expect(vm.$el.textContent).toMatch(/\s+foo\s+/)
+    vm.list[0][0].push('bar')
+    waitForUpdate(() => {
+      expect(vm.$el.textContent).toMatch(/\s+foo\s+bar\s+/)
+    }).then(done)
+  })
+
+  it('should work with strings', done => {
+    const vm = new Vue({
+      data: {
+        text: 'foo'
+      },
+      template: `
+        <div>
+          <span v-for="letter in text">{{ letter }}.</span>
+        </div>
+      `
+    }).$mount()
+    expect(vm.$el.textContent).toMatch('f.o.o.')
+    vm.text += 'bar'
+    waitForUpdate(() => {
+      expect(vm.$el.textContent).toMatch('f.o.o.b.a.r.')
+    }).then(done)
+  })
+
+  // #7792
+  it('should work with multiline expressions', () => {
+    const vm = new Vue({
+      data: {
+        a: [1],
+        b: [2]
+      },
+      template: `
+        <div>
+          <span v-for="n in (
+            a.concat(
+              b
+            )
+          )">{{ n }}</span>
+        </div>
+      `
+    }).$mount()
+    expect(vm.$el.textContent).toBe('12')
+  })
+
+  const supportsDestructuring = (() => {
+    try {
+      new Function('var { foo } = bar')
+      return true
+    } catch (e) {}
+  })()
+
+  if (supportsDestructuring) {
+    it('should support destructuring syntax in alias position (object)', () => {
+      const vm = new Vue({
+        data: { list: [{ foo: 'hi', bar: 'ho' }] },
+        template: '<div><div v-for="({ foo, bar }, i) in list">{{ foo }} {{ bar }} {{ i }}</div></div>'
+      }).$mount()
+      expect(vm.$el.textContent).toBe('hi ho 0')
+    })
+
+    it('should support destructuring syntax in alias position (array)', () => {
+      const vm = new Vue({
+        data: { list: [[1, 2], [3, 4]] },
+        template: '<div><div v-for="([ foo, bar ], i) in list">{{ foo }} {{ bar }} {{ i }}</div></div>'
+      }).$mount()
+      expect(vm.$el.textContent).toBe('1 2 03 4 1')
+    })
+  }
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/features/directives/html.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/features/directives/html.spec.js
new file mode 100644 (file)
index 0000000..c398828
--- /dev/null
@@ -0,0 +1,67 @@
+import Vue from 'vue'
+
+describe('Directive v-html', () => {
+  it('should render html', () => {
+    const vm = new Vue({
+      template: '<div v-html="a"></div>',
+      data: { a: 'hello' }
+    }).$mount()
+    expect(vm.$el.innerHTML).toBe('hello')
+  })
+
+  it('should encode html entities', () => {
+    const vm = new Vue({
+      template: '<div v-html="a"></div>',
+      data: { a: '<span>&lt;</span>' }
+    }).$mount()
+    expect(vm.$el.innerHTML).toBe('<span>&lt;</span>')
+  })
+
+  it('should work inline', () => {
+    const vm = new Vue({
+      template: `<div v-html="'<span>&lt;</span>'"></div>`
+    }).$mount()
+    expect(vm.$el.innerHTML).toBe('<span>&lt;</span>')
+  })
+
+  it('should work inline in DOM', () => {
+    const el = document.createElement('div')
+    el.innerHTML = `<div v-html="'<span>&lt;</span>'"></div>`
+    const vm = new Vue({ el })
+    expect(vm.$el.children[0].innerHTML).toBe('<span>&lt;</span>')
+  })
+
+  it('should support all value types', done => {
+    const vm = new Vue({
+      template: '<div v-html="a"></div>',
+      data: { a: false }
+    }).$mount()
+    waitForUpdate(() => {
+      expect(vm.$el.innerHTML).toBe('false')
+      vm.a = []
+    }).then(() => {
+      expect(vm.$el.innerHTML).toBe('[]')
+      vm.a = {}
+    }).then(() => {
+      expect(vm.$el.innerHTML).toBe('{}')
+      vm.a = 123
+    }).then(() => {
+      expect(vm.$el.innerHTML).toBe('123')
+      vm.a = 0
+    }).then(() => {
+      expect(vm.$el.innerHTML).toBe('0')
+      vm.a = ' '
+    }).then(() => {
+      expect(vm.$el.innerHTML).toBe(' ')
+      vm.a = '    '
+    }).then(() => {
+      expect(vm.$el.innerHTML).toBe('    ')
+      vm.a = null
+    }).then(() => {
+      expect(vm.$el.innerHTML).toBe('')
+      vm.a = undefined
+    }).then(() => {
+      expect(vm.$el.innerHTML).toBe('')
+    }).then(done)
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/features/directives/if.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/features/directives/if.spec.js
new file mode 100644 (file)
index 0000000..458f1f9
--- /dev/null
@@ -0,0 +1,276 @@
+import Vue from 'vue'
+
+describe('Directive v-if', () => {
+  it('should check if value is truthy', () => {
+    const vm = new Vue({
+      template: '<div><span v-if="foo">hello</span></div>',
+      data: { foo: true }
+    }).$mount()
+    expect(vm.$el.innerHTML).toBe('<span>hello</span>')
+  })
+
+  it('should check if value is falsy', () => {
+    const vm = new Vue({
+      template: '<div><span v-if="foo">hello</span></div>',
+      data: { foo: false }
+    }).$mount()
+    expect(vm.$el.innerHTML).toBe('<!---->')
+  })
+
+  it('should update if value changed', done => {
+    const vm = new Vue({
+      template: '<div><span v-if="foo">hello</span></div>',
+      data: { foo: true }
+    }).$mount()
+    expect(vm.$el.innerHTML).toBe('<span>hello</span>')
+    vm.foo = false
+    waitForUpdate(() => {
+      expect(vm.$el.innerHTML).toBe('<!---->')
+      vm.foo = {}
+    }).then(() => {
+      expect(vm.$el.innerHTML).toBe('<span>hello</span>')
+      vm.foo = 0
+    }).then(() => {
+      expect(vm.$el.innerHTML).toBe('<!---->')
+      vm.foo = []
+    }).then(() => {
+      expect(vm.$el.innerHTML).toBe('<span>hello</span>')
+      vm.foo = null
+    }).then(() => {
+      expect(vm.$el.innerHTML).toBe('<!---->')
+      vm.foo = '0'
+    }).then(() => {
+      expect(vm.$el.innerHTML).toBe('<span>hello</span>')
+      vm.foo = undefined
+    }).then(() => {
+      expect(vm.$el.innerHTML).toBe('<!---->')
+      vm.foo = 1
+    }).then(() => {
+      expect(vm.$el.innerHTML).toBe('<span>hello</span>')
+    }).then(done)
+  })
+
+  it('should work well with v-else', done => {
+    const vm = new Vue({
+      template: `
+        <div>
+          <span v-if="foo">hello</span>
+          <span v-else>bye</span>
+        </div>
+      `,
+      data: { foo: true }
+    }).$mount()
+    expect(vm.$el.innerHTML.trim()).toBe('<span>hello</span>')
+    vm.foo = false
+    waitForUpdate(() => {
+      expect(vm.$el.innerHTML.trim()).toBe('<span>bye</span>')
+      vm.foo = {}
+    }).then(() => {
+      expect(vm.$el.innerHTML.trim()).toBe('<span>hello</span>')
+      vm.foo = 0
+    }).then(() => {
+      expect(vm.$el.innerHTML.trim()).toBe('<span>bye</span>')
+      vm.foo = []
+    }).then(() => {
+      expect(vm.$el.innerHTML.trim()).toBe('<span>hello</span>')
+      vm.foo = null
+    }).then(() => {
+      expect(vm.$el.innerHTML.trim()).toBe('<span>bye</span>')
+      vm.foo = '0'
+    }).then(() => {
+      expect(vm.$el.innerHTML.trim()).toBe('<span>hello</span>')
+      vm.foo = undefined
+    }).then(() => {
+      expect(vm.$el.innerHTML.trim()).toBe('<span>bye</span>')
+      vm.foo = 1
+    }).then(() => {
+      expect(vm.$el.innerHTML.trim()).toBe('<span>hello</span>')
+    }).then(done)
+  })
+
+  it('should work well with v-else-if', done => {
+    const vm = new Vue({
+      template: `
+        <div>
+          <span v-if="foo">hello</span>
+          <span v-else-if="bar">elseif</span>
+          <span v-else>bye</span>
+        </div>
+      `,
+      data: { foo: true, bar: false }
+    }).$mount()
+    expect(vm.$el.innerHTML.trim()).toBe('<span>hello</span>')
+    vm.foo = false
+    waitForUpdate(() => {
+      expect(vm.$el.innerHTML.trim()).toBe('<span>bye</span>')
+      vm.bar = true
+    }).then(() => {
+      expect(vm.$el.innerHTML.trim()).toBe('<span>elseif</span>')
+      vm.bar = false
+    }).then(() => {
+      expect(vm.$el.innerHTML.trim()).toBe('<span>bye</span>')
+      vm.foo = true
+    }).then(() => {
+      expect(vm.$el.innerHTML.trim()).toBe('<span>hello</span>')
+      vm.foo = false
+      vm.bar = {}
+    }).then(() => {
+      expect(vm.$el.innerHTML.trim()).toBe('<span>elseif</span>')
+      vm.bar = 0
+    }).then(() => {
+      expect(vm.$el.innerHTML.trim()).toBe('<span>bye</span>')
+      vm.bar = []
+    }).then(() => {
+      expect(vm.$el.innerHTML.trim()).toBe('<span>elseif</span>')
+      vm.bar = null
+    }).then(() => {
+      expect(vm.$el.innerHTML.trim()).toBe('<span>bye</span>')
+      vm.bar = '0'
+    }).then(() => {
+      expect(vm.$el.innerHTML.trim()).toBe('<span>elseif</span>')
+      vm.bar = undefined
+    }).then(() => {
+      expect(vm.$el.innerHTML.trim()).toBe('<span>bye</span>')
+      vm.bar = 1
+    }).then(() => {
+      expect(vm.$el.innerHTML.trim()).toBe('<span>elseif</span>')
+    }).then(done)
+  })
+
+  it('should work well with v-for', done => {
+    const vm = new Vue({
+      template: `
+        <div>
+          <span v-for="(item, i) in list" v-if="item.value">{{i}}</span>
+        </div>
+      `,
+      data: {
+        list: [
+          { value: true },
+          { value: false },
+          { value: true }
+        ]
+      }
+    }).$mount()
+    expect(vm.$el.innerHTML).toBe('<span>0</span><!----><span>2</span>')
+    vm.list[0].value = false
+    waitForUpdate(() => {
+      expect(vm.$el.innerHTML).toBe('<!----><!----><span>2</span>')
+      vm.list.push({ value: true })
+    }).then(() => {
+      expect(vm.$el.innerHTML).toBe('<!----><!----><span>2</span><span>3</span>')
+      vm.list.splice(1, 2)
+    }).then(() => {
+      expect(vm.$el.innerHTML).toBe('<!----><span>1</span>')
+    }).then(done)
+  })
+
+  it('should work well with v-for and v-else', done => {
+    const vm = new Vue({
+      template: `
+        <div>
+          <span v-for="(item, i) in list" v-if="item.value">hello</span>
+          <span v-else>bye</span>
+        </div>
+      `,
+      data: {
+        list: [
+          { value: true },
+          { value: false },
+          { value: true }
+        ]
+      }
+    }).$mount()
+    expect(vm.$el.innerHTML.trim()).toBe('<span>hello</span><span>bye</span><span>hello</span>')
+    vm.list[0].value = false
+    waitForUpdate(() => {
+      expect(vm.$el.innerHTML.trim()).toBe('<span>bye</span><span>bye</span><span>hello</span>')
+      vm.list.push({ value: true })
+    }).then(() => {
+      expect(vm.$el.innerHTML.trim()).toBe('<span>bye</span><span>bye</span><span>hello</span><span>hello</span>')
+      vm.list.splice(1, 2)
+    }).then(() => {
+      expect(vm.$el.innerHTML.trim()).toBe('<span>bye</span><span>hello</span>')
+    }).then(done)
+  })
+
+  it('should work with v-for on v-else branch', done => {
+    const vm = new Vue({
+      template: `
+        <div>
+          <span v-if="false">hello</span>
+          <span v-else v-for="item in list">{{ item }}</span>
+        </div>
+      `,
+      data: {
+        list: [1, 2, 3]
+      }
+    }).$mount()
+    expect(vm.$el.textContent.trim()).toBe('123')
+    vm.list.reverse()
+    waitForUpdate(() => {
+      expect(vm.$el.textContent.trim()).toBe('321')
+    }).then(done)
+  })
+
+  it('should work properly on component root', done => {
+    const vm = new Vue({
+      template: `
+        <div>
+          <test class="test"></test>
+        </div>
+      `,
+      components: {
+        test: {
+          data () {
+            return { ok: true }
+          },
+          template: '<div v-if="ok" id="ok" class="inner">test</div>'
+        }
+      }
+    }).$mount()
+    expect(vm.$el.children[0].id).toBe('ok')
+    expect(vm.$el.children[0].className).toBe('inner test')
+    vm.$children[0].ok = false
+    waitForUpdate(() => {
+      // attrs / class modules should not attempt to patch the comment node
+      expect(vm.$el.innerHTML).toBe('<!---->')
+      vm.$children[0].ok = true
+    }).then(() => {
+      expect(vm.$el.children[0].id).toBe('ok')
+      expect(vm.$el.children[0].className).toBe('inner test')
+    }).then(done)
+  })
+
+  it('should maintain stable list to avoid unnecessary patches', done => {
+    const created = jasmine.createSpy()
+    const destroyed = jasmine.createSpy()
+    const vm = new Vue({
+      data: {
+        ok: true
+      },
+      // when the first div is toggled, the second div should be reused
+      // instead of re-created/destroyed
+      template: `
+        <div>
+          <div v-if="ok"></div>
+          <div><test></test></div>
+        </div>
+      `,
+      components: {
+        test: {
+          template: '<div></div>',
+          created,
+          destroyed
+        }
+      }
+    }).$mount()
+
+    expect(created.calls.count()).toBe(1)
+    vm.ok = false
+    waitForUpdate(() => {
+      expect(created.calls.count()).toBe(1)
+      expect(destroyed).not.toHaveBeenCalled()
+    }).then(done)
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/features/directives/model-checkbox.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/features/directives/model-checkbox.spec.js
new file mode 100644 (file)
index 0000000..2b73e23
--- /dev/null
@@ -0,0 +1,351 @@
+import Vue from 'vue'
+
+describe('Directive v-model checkbox', () => {
+  it('should work', done => {
+    const vm = new Vue({
+      data: {
+        test: true
+      },
+      template: '<input type="checkbox" v-model="test">'
+    }).$mount()
+    document.body.appendChild(vm.$el)
+    expect(vm.$el.checked).toBe(true)
+    vm.test = false
+    waitForUpdate(function () {
+      expect(vm.$el.checked).toBe(false)
+      expect(vm.test).toBe(false)
+      vm.$el.click()
+      expect(vm.$el.checked).toBe(true)
+      expect(vm.test).toBe(true)
+    }).then(() => {
+      document.body.removeChild(vm.$el)
+    }).then(done)
+  })
+
+  it('should respect value bindings', done => {
+    const vm = new Vue({
+      data: {
+        test: 1,
+        a: 1,
+        b: 2
+      },
+      template: '<input type="checkbox" v-model="test" :true-value="a" :false-value="b">'
+    }).$mount()
+    document.body.appendChild(vm.$el)
+    expect(vm.$el.checked).toBe(true)
+    vm.$el.click()
+    expect(vm.$el.checked).toBe(false)
+    expect(vm.test).toBe(2)
+    vm.$el.click()
+    expect(vm.$el.checked).toBe(true)
+    expect(vm.test).toBe(1)
+    vm.test = 2
+    waitForUpdate(() => {
+      expect(vm.$el.checked).toBe(false)
+      vm.test = 1
+    }).then(() => {
+      expect(vm.$el.checked).toBe(true)
+      document.body.removeChild(vm.$el)
+    }).then(done)
+  })
+
+  it('bind to Array value', done => {
+    const vm = new Vue({
+      data: {
+        test: ['1']
+      },
+      template: `
+        <div>
+          <input type="checkbox" v-model="test" value="1">
+          <input type="checkbox" v-model="test" value="2">
+        </div>
+      `
+    }).$mount()
+    document.body.appendChild(vm.$el)
+    expect(vm.$el.children[0].checked).toBe(true)
+    expect(vm.$el.children[1].checked).toBe(false)
+    vm.$el.children[0].click()
+    expect(vm.test.length).toBe(0)
+    vm.$el.children[1].click()
+    expect(vm.test).toEqual(['2'])
+    vm.$el.children[0].click()
+    expect(vm.test).toEqual(['2', '1'])
+    vm.test = ['1']
+    waitForUpdate(() => {
+      expect(vm.$el.children[0].checked).toBe(true)
+      expect(vm.$el.children[1].checked).toBe(false)
+    }).then(done)
+  })
+
+  it('bind to Array value ignores false-value', done => {
+    const vm = new Vue({
+      data: {
+        test: ['1']
+      },
+      template: `
+        <div>
+          <input type="checkbox" v-model="test" value="1" :false-value="true">
+          <input type="checkbox" v-model="test" value="2" :false-value="true">
+        </div>
+      `
+    }).$mount()
+    document.body.appendChild(vm.$el)
+    expect(vm.$el.children[0].checked).toBe(true)
+    expect(vm.$el.children[1].checked).toBe(false)
+    vm.$el.children[0].click()
+    expect(vm.test.length).toBe(0)
+    vm.$el.children[1].click()
+    expect(vm.test).toEqual(['2'])
+    vm.$el.children[0].click()
+    expect(vm.test).toEqual(['2', '1'])
+    vm.test = ['1']
+    waitForUpdate(() => {
+      expect(vm.$el.children[0].checked).toBe(true)
+      expect(vm.$el.children[1].checked).toBe(false)
+    }).then(done)
+  })
+
+  it('bind to Array value with value bindings', done => {
+    const vm = new Vue({
+      data: {
+        test: [1]
+      },
+      template: `
+        <div>
+          <input type="checkbox" v-model="test" :value="1">
+          <input type="checkbox" v-model="test" :value="2">
+        </div>
+      `
+    }).$mount()
+    document.body.appendChild(vm.$el)
+    expect(vm.$el.children[0].checked).toBe(true)
+    expect(vm.$el.children[1].checked).toBe(false)
+    vm.$el.children[0].click()
+    expect(vm.test.length).toBe(0)
+    vm.$el.children[1].click()
+    expect(vm.test).toEqual([2])
+    vm.$el.children[0].click()
+    expect(vm.test).toEqual([2, 1])
+    vm.test = [1]
+    waitForUpdate(() => {
+      expect(vm.$el.children[0].checked).toBe(true)
+      expect(vm.$el.children[1].checked).toBe(false)
+    }).then(done)
+  })
+
+  it('bind to Array value with value bindings (object loose equal)', done => {
+    const vm = new Vue({
+      data: {
+        test: [{ a: 1 }]
+      },
+      template: `
+        <div>
+          <input type="checkbox" v-model="test" :value="{ a: 1 }">
+          <input type="checkbox" v-model="test" :value="{ a: 2 }">
+        </div>
+      `
+    }).$mount()
+    document.body.appendChild(vm.$el)
+    expect(vm.$el.children[0].checked).toBe(true)
+    expect(vm.$el.children[1].checked).toBe(false)
+    vm.$el.children[0].click()
+    expect(vm.test.length).toBe(0)
+    vm.$el.children[1].click()
+    expect(vm.test).toEqual([{ a: 2 }])
+    vm.$el.children[0].click()
+    expect(vm.test).toEqual([{ a: 2 }, { a: 1 }])
+    vm.test = [{ a: 1 }]
+    waitForUpdate(() => {
+      expect(vm.$el.children[0].checked).toBe(true)
+      expect(vm.$el.children[1].checked).toBe(false)
+    }).then(done)
+  })
+
+  it('bind to Array value with array value bindings (object loose equal)', done => {
+    const vm = new Vue({
+      data: {
+        test: [{ a: 1 }]
+      },
+      template: `
+        <div>
+          <input type="checkbox" v-model="test" :value="{ a: 1 }">
+          <input type="checkbox" v-model="test" :value="[2]">
+        </div>
+      `
+    }).$mount()
+    document.body.appendChild(vm.$el)
+    expect(vm.$el.children[0].checked).toBe(true)
+    expect(vm.$el.children[1].checked).toBe(false)
+    vm.$el.children[0].click()
+    expect(vm.test.length).toBe(0)
+    vm.$el.children[1].click()
+    expect(vm.test).toEqual([[2]])
+    vm.$el.children[0].click()
+    expect(vm.test).toEqual([[2], { a: 1 }])
+    vm.test = [{ a: 1 }]
+    waitForUpdate(() => {
+      expect(vm.$el.children[0].checked).toBe(true)
+      expect(vm.$el.children[1].checked).toBe(false)
+    }).then(done)
+  })
+
+  it('.number modifier', () => {
+    const vm = new Vue({
+      data: {
+        test: [],
+        check: true
+      },
+      template: `
+        <div>
+          <input type="checkbox" v-model.number="test" value="1">
+          <input type="checkbox" v-model="test" value="2">
+          <input type="checkbox" v-model.number="check">
+        </div>
+      `
+    }).$mount()
+    document.body.appendChild(vm.$el)
+    const checkboxInputs = vm.$el.getElementsByTagName('input')
+    expect(checkboxInputs[0].checked).toBe(false)
+    expect(checkboxInputs[1].checked).toBe(false)
+    expect(checkboxInputs[2].checked).toBe(true)
+    checkboxInputs[0].click()
+    checkboxInputs[1].click()
+    checkboxInputs[2].click()
+    expect(vm.test).toEqual([1, '2'])
+    expect(vm.check).toEqual(false)
+  })
+
+  it('should respect different primitive type value', (done) => {
+    const vm = new Vue({
+      data: {
+        test: [0]
+      },
+      template:
+        '<div>' +
+          '<input type="checkbox" value="" v-model="test">' +
+          '<input type="checkbox" value="0" v-model="test">' +
+          '<input type="checkbox" value="1" v-model="test">' +
+          '<input type="checkbox" value="false" v-model="test">' +
+          '<input type="checkbox" value="true" v-model="test">' +
+        '</div>'
+    }).$mount()
+    const checkboxInput = vm.$el.children
+    expect(checkboxInput[0].checked).toBe(false)
+    expect(checkboxInput[1].checked).toBe(true)
+    expect(checkboxInput[2].checked).toBe(false)
+    expect(checkboxInput[3].checked).toBe(false)
+    expect(checkboxInput[4].checked).toBe(false)
+    vm.test = [1]
+    waitForUpdate(() => {
+      expect(checkboxInput[0].checked).toBe(false)
+      expect(checkboxInput[1].checked).toBe(false)
+      expect(checkboxInput[2].checked).toBe(true)
+      expect(checkboxInput[3].checked).toBe(false)
+      expect(checkboxInput[4].checked).toBe(false)
+      vm.test = ['']
+    }).then(() => {
+      expect(checkboxInput[0].checked).toBe(true)
+      expect(checkboxInput[1].checked).toBe(false)
+      expect(checkboxInput[2].checked).toBe(false)
+      expect(checkboxInput[3].checked).toBe(false)
+      expect(checkboxInput[4].checked).toBe(false)
+      vm.test = [false]
+    }).then(() => {
+      expect(checkboxInput[0].checked).toBe(false)
+      expect(checkboxInput[1].checked).toBe(false)
+      expect(checkboxInput[2].checked).toBe(false)
+      expect(checkboxInput[3].checked).toBe(true)
+      expect(checkboxInput[4].checked).toBe(false)
+      vm.test = [true]
+    }).then(() => {
+      expect(checkboxInput[0].checked).toBe(false)
+      expect(checkboxInput[1].checked).toBe(false)
+      expect(checkboxInput[2].checked).toBe(false)
+      expect(checkboxInput[3].checked).toBe(false)
+      expect(checkboxInput[4].checked).toBe(true)
+      vm.test = ['', 0, 1, false, true]
+    }).then(() => {
+      expect(checkboxInput[0].checked).toBe(true)
+      expect(checkboxInput[1].checked).toBe(true)
+      expect(checkboxInput[2].checked).toBe(true)
+      expect(checkboxInput[3].checked).toBe(true)
+      expect(checkboxInput[4].checked).toBe(true)
+    }).then(done)
+  })
+
+  // #4521
+  it('should work with click event', (done) => {
+    const vm = new Vue({
+      data: {
+        num: 1,
+        checked: false
+      },
+      template: '<div @click="add">click {{ num }}<input ref="checkbox" type="checkbox" v-model="checked"/></div>',
+      methods: {
+        add: function () {
+          this.num++
+        }
+      }
+    }).$mount()
+    document.body.appendChild(vm.$el)
+    const checkbox = vm.$refs.checkbox
+    checkbox.click()
+    waitForUpdate(() => {
+      expect(checkbox.checked).toBe(true)
+      expect(vm.num).toBe(2)
+    }).then(done)
+  })
+
+  it('should get updated with model when in focus', (done) => {
+    const vm = new Vue({
+      data: {
+        a: 2
+      },
+      template: '<input type="checkbox" v-model="a"/>'
+    }).$mount()
+    document.body.appendChild(vm.$el)
+    vm.$el.click()
+    waitForUpdate(() => {
+      expect(vm.$el.checked).toBe(false)
+      vm.a = 2
+    }).then(() => {
+      expect(vm.$el.checked).toBe(true)
+    }).then(done)
+  })
+
+  it('triggers a watcher when binding to an array value in a checkbox', done => {
+    const vm = new Vue({
+      data: {
+        test: {
+          thing: false,
+          arr: [true]
+        }
+      },
+      template: `
+        <div>
+          <input type="checkbox" v-model="test.arr[0]">
+          <span>{{ test.arr[0] }}</span>
+        </div>
+      `
+    }).$mount()
+    document.body.appendChild(vm.$el)
+    expect(vm.$el.children[0].checked).toBe(true)
+    expect(vm.$el.children[1].textContent).toBe('true')
+    vm.$el.children[0].click()
+    expect(vm.$el.children[0].checked).toBe(false)
+    waitForUpdate(() => {
+      expect(vm.$el.children[1].textContent).toBe('false')
+    }).then(done)
+  })
+  
+  // #7811
+  it('type should not be overwritten by v-bind', () => {
+    const vm = new Vue({
+      data: {
+        test: true
+      },
+      template: '<input type="checkbox" v-model="test" v-bind="$attrs">'
+    }).$mount()
+    expect(vm.$el.type).toBe('checkbox')
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/features/directives/model-component.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/features/directives/model-component.spec.js
new file mode 100644 (file)
index 0000000..6098e4d
--- /dev/null
@@ -0,0 +1,151 @@
+import Vue from 'vue'
+
+describe('Directive v-model component', () => {
+  it('should work', done => {
+    const vm = new Vue({
+      data: {
+        msg: 'hello'
+      },
+      template: `
+        <div>
+          <p>{{ msg }}</p>
+          <test v-model="msg"></test>
+        </div>
+      `,
+      components: {
+        test: {
+          props: ['value'],
+          template: `<input :value="value" @input="$emit('input', $event.target.value)">`
+        }
+      }
+    }).$mount()
+    document.body.appendChild(vm.$el)
+    waitForUpdate(() => {
+      const input = vm.$el.querySelector('input')
+      input.value = 'world'
+      triggerEvent(input, 'input')
+    }).then(() => {
+      expect(vm.msg).toEqual('world')
+      expect(vm.$el.querySelector('p').textContent).toEqual('world')
+      vm.msg = 'changed'
+    }).then(() => {
+      expect(vm.$el.querySelector('p').textContent).toEqual('changed')
+      expect(vm.$el.querySelector('input').value).toEqual('changed')
+    }).then(() => {
+      document.body.removeChild(vm.$el)
+    }).then(done)
+  })
+
+  it('should work with native tags with "is"', done => {
+    const vm = new Vue({
+      data: {
+        msg: 'hello'
+      },
+      template: `
+        <div>
+          <p>{{ msg }}</p>
+          <input is="test" v-model="msg">
+        </div>
+      `,
+      components: {
+        test: {
+          props: ['value'],
+          template: `<input :value="value" @input="$emit('input', $event.target.value)">`
+        }
+      }
+    }).$mount()
+    document.body.appendChild(vm.$el)
+    waitForUpdate(() => {
+      const input = vm.$el.querySelector('input')
+      input.value = 'world'
+      triggerEvent(input, 'input')
+    }).then(() => {
+      expect(vm.msg).toEqual('world')
+      expect(vm.$el.querySelector('p').textContent).toEqual('world')
+      vm.msg = 'changed'
+    }).then(() => {
+      expect(vm.$el.querySelector('p').textContent).toEqual('changed')
+      expect(vm.$el.querySelector('input').value).toEqual('changed')
+    }).then(() => {
+      document.body.removeChild(vm.$el)
+    }).then(done)
+  })
+
+  it('should support customization via model option', done => {
+    const spy = jasmine.createSpy('update')
+    const vm = new Vue({
+      data: {
+        msg: 'hello'
+      },
+      methods: {
+        spy
+      },
+      template: `
+        <div>
+          <p>{{ msg }}</p>
+          <test v-model="msg" @update="spy"></test>
+        </div>
+      `,
+      components: {
+        test: {
+          model: {
+            prop: 'currentValue',
+            event: 'update'
+          },
+          props: ['currentValue'],
+          template: `<input :value="currentValue" @input="$emit('update', $event.target.value)">`
+        }
+      }
+    }).$mount()
+    document.body.appendChild(vm.$el)
+    waitForUpdate(() => {
+      const input = vm.$el.querySelector('input')
+      input.value = 'world'
+      triggerEvent(input, 'input')
+    }).then(() => {
+      expect(vm.msg).toEqual('world')
+      expect(vm.$el.querySelector('p').textContent).toEqual('world')
+      expect(spy).toHaveBeenCalledWith('world')
+      vm.msg = 'changed'
+    }).then(() => {
+      expect(vm.$el.querySelector('p').textContent).toEqual('changed')
+      expect(vm.$el.querySelector('input').value).toEqual('changed')
+    }).then(() => {
+      document.body.removeChild(vm.$el)
+    }).then(done)
+  })
+
+  it('modifier: .number', () => {
+    const vm = new Vue({
+      template: `<div><my-input ref="input" v-model.number="text"></my-input></div>`,
+      data: { text: 'foo' },
+      components: {
+        'my-input': {
+          template: '<input>'
+        }
+      }
+    }).$mount()
+    expect(vm.text).toBe('foo')
+    vm.$refs.input.$emit('input', 'bar')
+    expect(vm.text).toBe('bar')
+    vm.$refs.input.$emit('input', '123')
+    expect(vm.text).toBe(123)
+  })
+
+  it('modifier: .trim', () => {
+    const vm = new Vue({
+      template: `<div><my-input ref="input" v-model.trim="text"></my-input></div>`,
+      data: { text: 'foo' },
+      components: {
+        'my-input': {
+          template: '<input>'
+        }
+      }
+    }).$mount()
+    expect(vm.text).toBe('foo')
+    vm.$refs.input.$emit('input', '  bar  ')
+    expect(vm.text).toBe('bar')
+    vm.$refs.input.$emit('input', '   foo o  ')
+    expect(vm.text).toBe('foo o')
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/features/directives/model-dynamic.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/features/directives/model-dynamic.spec.js
new file mode 100644 (file)
index 0000000..88a910f
--- /dev/null
@@ -0,0 +1,218 @@
+import Vue from 'vue'
+
+describe('Directive v-model dynamic input type', () => {
+  it('should work', done => {
+    const vm = new Vue({
+      data: {
+        inputType: null,
+        test: 'b'
+      },
+      template: `<input :type="inputType" v-model="test">`
+    }).$mount()
+    document.body.appendChild(vm.$el)
+
+    // test text
+    assertInputWorks(vm, 'inputType').then(done)
+  })
+
+  it('with v-if', done => {
+    const vm = new Vue({
+      data: {
+        ok: true,
+        type: null,
+        test: 'b'
+      },
+      template: `<input v-if="ok" :type="type" v-model="test"><div v-else>haha</div>`
+    }).$mount()
+    document.body.appendChild(vm.$el)
+
+    const chain = assertInputWorks(vm).then(() => {
+      vm.ok = false
+    }).then(() => {
+      expect(vm.$el.textContent).toBe('haha')
+    }).then(() => {
+      // reset
+      vm.ok = true
+      vm.type = null
+      vm.test = 'b'
+    })
+
+    assertInputWorks(vm, chain).then(done)
+  })
+
+  it('with v-else', done => {
+    const data = {
+      ok: true,
+      type: null,
+      test: 'b'
+    }
+    const vm = new Vue({
+      data,
+      template: `<div v-if="ok">haha</div><input v-else :type="type" v-model="test">`
+    }).$mount()
+    document.body.appendChild(vm.$el)
+    expect(vm.$el.textContent).toBe('haha')
+
+    vm.ok = false
+    assertInputWorks(vm).then(done)
+  })
+
+  it('with v-else-if', done => {
+    const vm = new Vue({
+      data: {
+        foo: true,
+        bar: false,
+        type: null,
+        test: 'b'
+      },
+      template: `<div v-if="foo">text</div><input v-else-if="bar" :type="type" v-model="test">`
+    }).$mount()
+    document.body.appendChild(vm.$el)
+
+    const chain = waitForUpdate(() => {
+      expect(vm.$el.textContent).toBe('text')
+    }).then(() => {
+      vm.foo = false
+    }).then(() => {
+      expect(vm._vnode.isComment).toBe(true)
+    }).then(() => {
+      vm.bar = true
+    })
+
+    assertInputWorks(vm, chain).then(done)
+  })
+
+  it('with v-for', done => {
+    const vm = new Vue({
+      data: {
+        data: {
+          text: 'foo',
+          checkbox: true
+        },
+        types: ['text', 'checkbox']
+      },
+      template: `<div>
+        <input v-for="type in types" :type="type" v-model="data[type]">
+      </div>`
+    }).$mount()
+    document.body.appendChild(vm.$el)
+
+    let el1 = vm.$el.children[0]
+    expect(el1.type).toBe('text')
+    expect(el1.value).toBe('foo')
+    el1.value = 'bar'
+    triggerEvent(el1, 'input')
+    expect(vm.data.text).toBe('bar')
+
+    let el2 = vm.$el.children[1]
+    expect(el2.type).toBe('checkbox')
+    expect(el2.checked).toBe(true)
+    el2.click()
+    expect(vm.data.checkbox).toBe(false)
+
+    // now in reverse!
+    vm.types.reverse()
+    waitForUpdate(() => {
+      el1 = vm.$el.children[0]
+      expect(el1.type).toBe('checkbox')
+      expect(el1.checked).toBe(false)
+      el1.click()
+      expect(vm.data.checkbox).toBe(true)
+
+      el2 = vm.$el.children[1]
+      expect(el2.type).toBe('text')
+      expect(el2.value).toBe('bar')
+      el2.value = 'foo'
+      triggerEvent(el2, 'input')
+      expect(vm.data.text).toBe('foo')
+    }).then(done)
+  })
+
+  it('with v-bind', done => {
+    const vm = new Vue({
+      data: {
+        data: {
+          text: 'foo',
+          checkbox: true
+        },
+        inputs: [{ id: 'one', type: 'text' }, { id: 'two', type: 'checkbox' }]
+      },
+      template: `<div>
+        <input v-for="i in inputs" v-bind="i" v-model="data[i.type]">
+      </div>`
+    }).$mount()
+    document.body.appendChild(vm.$el)
+
+    let el1 = vm.$el.children[0]
+    expect(el1.id).toBe('one')
+    expect(el1.type).toBe('text')
+    expect(el1.value).toBe('foo')
+    el1.value = 'bar'
+    triggerEvent(el1, 'input')
+    expect(vm.data.text).toBe('bar')
+
+    let el2 = vm.$el.children[1]
+    expect(el2.id).toBe('two')
+    expect(el2.type).toBe('checkbox')
+    expect(el2.checked).toBe(true)
+    el2.click()
+    expect(vm.data.checkbox).toBe(false)
+
+    // now in reverse!
+    vm.inputs.reverse()
+    waitForUpdate(() => {
+      el1 = vm.$el.children[0]
+      expect(el1.id).toBe('two')
+      expect(el1.type).toBe('checkbox')
+      expect(el1.checked).toBe(false)
+      el1.click()
+      expect(vm.data.checkbox).toBe(true)
+
+      el2 = vm.$el.children[1]
+      expect(el2.id).toBe('one')
+      expect(el2.type).toBe('text')
+      expect(el2.value).toBe('bar')
+      el2.value = 'foo'
+      triggerEvent(el2, 'input')
+      expect(vm.data.text).toBe('foo')
+    }).then(done)
+  })
+})
+
+function assertInputWorks (vm, type, chain) {
+  if (typeof type !== 'string') {
+    if (!chain) chain = type
+    type = 'type'
+  }
+  if (!chain) chain = waitForUpdate()
+  chain.then(() => {
+    expect(vm.$el.value).toBe('b')
+    vm.test = 'a'
+  }).then(() => {
+    expect(vm.$el.value).toBe('a')
+    vm.$el.value = 'c'
+    triggerEvent(vm.$el, 'input')
+    expect(vm.test).toBe('c')
+  }).then(() => {
+    // change it to password
+    vm[type] = 'password'
+    vm.test = 'b'
+  }).then(() => {
+    expect(vm.$el.type).toBe('password')
+    expect(vm.$el.value).toBe('b')
+    vm.$el.value = 'c'
+    triggerEvent(vm.$el, 'input')
+    expect(vm.test).toBe('c')
+  }).then(() => {
+    // change it to checkbox...
+    vm[type] = 'checkbox'
+  }).then(() => {
+    expect(vm.$el.type).toBe('checkbox')
+    expect(vm.$el.checked).toBe(true)
+  }).then(() => {
+    vm.$el.click()
+    expect(vm.$el.checked).toBe(false)
+    expect(vm.test).toBe(false)
+  })
+  return chain
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/features/directives/model-file.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/features/directives/model-file.spec.js
new file mode 100644 (file)
index 0000000..8c92ab7
--- /dev/null
@@ -0,0 +1,13 @@
+import Vue from 'vue'
+
+describe('Directive v-model file', () => {
+  it('warn to use @change instead', () => {
+    new Vue({
+      data: {
+        file: ''
+      },
+      template: '<input v-model="file" type="file">'
+    }).$mount()
+    expect('Use a v-on:change listener instead').toHaveBeenWarned()
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/features/directives/model-parse.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/features/directives/model-parse.spec.js
new file mode 100644 (file)
index 0000000..f9c48a6
--- /dev/null
@@ -0,0 +1,39 @@
+import { parseModel } from 'compiler/directives/model'
+
+describe('model expression parser', () => {
+  it('parse single path', () => {
+    const res = parseModel('foo')
+    expect(res.exp).toBe('foo')
+    expect(res.key).toBe(null)
+  })
+
+  it('parse object dot notation', () => {
+    const res = parseModel('a.b.c')
+    expect(res.exp).toBe('a.b')
+    expect(res.key).toBe('"c"')
+  })
+
+  it('parse string in brackets', () => {
+    const res = parseModel('a["b"][c]')
+    expect(res.exp).toBe('a["b"]')
+    expect(res.key).toBe('c')
+  })
+
+  it('parse brackets with object dot notation', () => {
+    const res = parseModel('a["b"][c].xxx')
+    expect(res.exp).toBe('a["b"][c]')
+    expect(res.key).toBe('"xxx"')
+  })
+
+  it('parse nested brackets', () => {
+    const res = parseModel('a[i[c]]')
+    expect(res.exp).toBe('a')
+    expect(res.key).toBe('i[c]')
+  })
+
+  it('combined', () => {
+    const res = parseModel('test.xxx.a["asa"][test1[key]]')
+    expect(res.exp).toBe('test.xxx.a["asa"]')
+    expect(res.key).toBe('test1[key]')
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/features/directives/model-radio.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/features/directives/model-radio.spec.js
new file mode 100644 (file)
index 0000000..4b3886c
--- /dev/null
@@ -0,0 +1,254 @@
+import Vue from 'vue'
+
+describe('Directive v-model radio', () => {
+  it('should work', done => {
+    const vm = new Vue({
+      data: {
+        test: '1'
+      },
+      template: `
+        <div>
+          <input type="radio" value="1" v-model="test" name="test">
+          <input type="radio" value="2" v-model="test" name="test">
+        </div>
+      `
+    }).$mount()
+    document.body.appendChild(vm.$el)
+    expect(vm.$el.children[0].checked).toBe(true)
+    expect(vm.$el.children[1].checked).toBe(false)
+    vm.test = '2'
+    waitForUpdate(() => {
+      expect(vm.$el.children[0].checked).toBe(false)
+      expect(vm.$el.children[1].checked).toBe(true)
+      vm.$el.children[0].click()
+      expect(vm.$el.children[0].checked).toBe(true)
+      expect(vm.$el.children[1].checked).toBe(false)
+      expect(vm.test).toBe('1')
+    }).then(() => {
+      document.body.removeChild(vm.$el)
+    }).then(done)
+  })
+
+  it('should respect value bindings', done => {
+    const vm = new Vue({
+      data: {
+        test: 1
+      },
+      template: `
+        <div>
+          <input type="radio" :value="1" v-model="test" name="test">
+          <input type="radio" :value="2" v-model="test" name="test">
+        </div>
+      `
+    }).$mount()
+    document.body.appendChild(vm.$el)
+    expect(vm.$el.children[0].checked).toBe(true)
+    expect(vm.$el.children[1].checked).toBe(false)
+    vm.test = 2
+    waitForUpdate(() => {
+      expect(vm.$el.children[0].checked).toBe(false)
+      expect(vm.$el.children[1].checked).toBe(true)
+      vm.$el.children[0].click()
+      expect(vm.$el.children[0].checked).toBe(true)
+      expect(vm.$el.children[1].checked).toBe(false)
+      expect(vm.test).toBe(1)
+    }).then(() => {
+      document.body.removeChild(vm.$el)
+    }).then(done)
+  })
+
+  it('should respect value bindings (object loose equal)', done => {
+    const vm = new Vue({
+      data: {
+        test: { a: 1 }
+      },
+      template: `
+        <div>
+          <input type="radio" :value="{ a: 1 }" v-model="test" name="test">
+          <input type="radio" :value="{ a: 2 }" v-model="test" name="test">
+        </div>
+      `
+    }).$mount()
+    document.body.appendChild(vm.$el)
+    expect(vm.$el.children[0].checked).toBe(true)
+    expect(vm.$el.children[1].checked).toBe(false)
+    vm.test = { a: 2 }
+    waitForUpdate(() => {
+      expect(vm.$el.children[0].checked).toBe(false)
+      expect(vm.$el.children[1].checked).toBe(true)
+      vm.$el.children[0].click()
+      expect(vm.$el.children[0].checked).toBe(true)
+      expect(vm.$el.children[1].checked).toBe(false)
+      expect(vm.test).toEqual({ a: 1 })
+    }).then(() => {
+      document.body.removeChild(vm.$el)
+    }).then(done)
+  })
+
+  it('multiple radios ', (done) => {
+    const spy = jasmine.createSpy()
+    const vm = new Vue({
+      data: {
+        selections: ['a', '1'],
+        radioList: [
+          {
+            name: 'questionA',
+            data: ['a', 'b', 'c']
+          },
+          {
+            name: 'questionB',
+            data: ['1', '2']
+          }
+        ]
+      },
+      watch: {
+        selections: spy
+      },
+      template:
+        '<div>' +
+          '<div v-for="(radioGroup, idx) in radioList">' +
+            '<div>' +
+              '<span v-for="(item, index) in radioGroup.data">' +
+                '<input :name="radioGroup.name" type="radio" :value="item" v-model="selections[idx]" :id="idx"/>' +
+                '<label>{{item}}</label>' +
+              '</span>' +
+            '</div>' +
+          '</div>' +
+        '</div>'
+    }).$mount()
+    document.body.appendChild(vm.$el)
+    var inputs = vm.$el.getElementsByTagName('input')
+    inputs[1].click()
+    waitForUpdate(() => {
+      expect(vm.selections).toEqual(['b', '1'])
+      expect(spy).toHaveBeenCalled()
+    }).then(done)
+  })
+
+  it('.number modifier', () => {
+    const vm = new Vue({
+      data: {
+        test: 1
+      },
+      template: `
+        <div>
+          <input type="radio" value="1" v-model="test" name="test">
+          <input type="radio" value="2" v-model.number="test" name="test">
+        </div>
+      `
+    }).$mount()
+    document.body.appendChild(vm.$el)
+    expect(vm.$el.children[0].checked).toBe(true)
+    expect(vm.$el.children[1].checked).toBe(false)
+    vm.$el.children[1].click()
+    expect(vm.$el.children[0].checked).toBe(false)
+    expect(vm.$el.children[1].checked).toBe(true)
+    expect(vm.test).toBe(2)
+  })
+
+  it('should respect different primitive type value', (done) => {
+    const vm = new Vue({
+      data: {
+        test: 1
+      },
+      template:
+        '<div>' +
+          '<input type="radio" value="" v-model="test" name="test">' +
+          '<input type="radio" value="0" v-model="test" name="test">' +
+          '<input type="radio" value="1" v-model="test" name="test">' +
+          '<input type="radio" value="false" v-model="test" name="test">' +
+          '<input type="radio" value="true" v-model="test" name="test">' +
+        '</div>'
+    }).$mount()
+    var radioboxInput = vm.$el.children
+    expect(radioboxInput[0].checked).toBe(false)
+    expect(radioboxInput[1].checked).toBe(false)
+    expect(radioboxInput[2].checked).toBe(true)
+    expect(radioboxInput[3].checked).toBe(false)
+    expect(radioboxInput[4].checked).toBe(false)
+    vm.test = 0
+    waitForUpdate(() => {
+      expect(radioboxInput[0].checked).toBe(false)
+      expect(radioboxInput[1].checked).toBe(true)
+      expect(radioboxInput[2].checked).toBe(false)
+      expect(radioboxInput[3].checked).toBe(false)
+      expect(radioboxInput[4].checked).toBe(false)
+      vm.test = ''
+    }).then(() => {
+      expect(radioboxInput[0].checked).toBe(true)
+      expect(radioboxInput[1].checked).toBe(false)
+      expect(radioboxInput[2].checked).toBe(false)
+      expect(radioboxInput[3].checked).toBe(false)
+      expect(radioboxInput[4].checked).toBe(false)
+      vm.test = false
+    }).then(() => {
+      expect(radioboxInput[0].checked).toBe(false)
+      expect(radioboxInput[1].checked).toBe(false)
+      expect(radioboxInput[2].checked).toBe(false)
+      expect(radioboxInput[3].checked).toBe(true)
+      expect(radioboxInput[4].checked).toBe(false)
+      vm.test = true
+    }).then(() => {
+      expect(radioboxInput[0].checked).toBe(false)
+      expect(radioboxInput[1].checked).toBe(false)
+      expect(radioboxInput[2].checked).toBe(false)
+      expect(radioboxInput[3].checked).toBe(false)
+      expect(radioboxInput[4].checked).toBe(true)
+    }).then(done)
+  })
+
+  // #4521
+  it('should work with click event', (done) => {
+    const vm = new Vue({
+      data: {
+        num: 1,
+        checked: 1
+      },
+      template:
+        '<div @click="add">' +
+          'click {{ num }}<input name="test" type="radio" value="1" v-model="checked"/>' +
+          '<input name="test" type="radio" value="2" v-model="checked"/>' +
+        '</div>',
+      methods: {
+        add: function () {
+          this.num++
+        }
+      }
+    }).$mount()
+    document.body.appendChild(vm.$el)
+    const radios = vm.$el.getElementsByTagName('input')
+    radios[0].click()
+    waitForUpdate(() => {
+      expect(radios[0].checked).toBe(true)
+      expect(radios[1].checked).toBe(false)
+      expect(vm.num).toBe(2)
+      radios[0].click()
+    }).then(() => {
+      expect(radios[0].checked).toBe(true)
+      expect(radios[1].checked).toBe(false)
+      expect(vm.num).toBe(3)
+      radios[1].click()
+    }).then(() => {
+      expect(radios[0].checked).toBe(false)
+      expect(radios[1].checked).toBe(true)
+      expect(vm.num).toBe(4)
+    }).then(done)
+  })
+
+  it('should get updated with model when in focus', (done) => {
+    const vm = new Vue({
+      data: {
+        a: '2'
+      },
+      template: '<input type="radio" value="1" v-model="a"/>'
+    }).$mount()
+    document.body.appendChild(vm.$el)
+    vm.$el.click()
+    waitForUpdate(() => {
+      expect(vm.$el.checked).toBe(true)
+      vm.a = 2
+    }).then(() => {
+      expect(vm.$el.checked).toBe(false)
+    }).then(done)
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/features/directives/model-select.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/features/directives/model-select.spec.js
new file mode 100644 (file)
index 0000000..c961224
--- /dev/null
@@ -0,0 +1,591 @@
+import Vue from 'vue'
+import { looseEqual } from 'shared/util'
+
+// Android 4.4 Chrome 30 has the bug that a multi-select option cannot be
+// deselected by setting its "selected" prop via JavaScript.
+function hasMultiSelectBug () {
+  var s = document.createElement('select')
+  s.setAttribute('multiple', '')
+  var o = document.createElement('option')
+  s.appendChild(o)
+  o.selected = true
+  o.selected = false
+  return o.selected !== false
+}
+
+/**
+ * setting <select>'s value in IE9 doesn't work
+ * we have to manually loop through the options
+ */
+function updateSelect (el, value) {
+  var options = el.options
+  var i = options.length
+  while (i--) {
+    if (looseEqual(getValue(options[i]), value)) {
+      options[i].selected = true
+      break
+    }
+  }
+}
+
+function getValue (option) {
+  return '_value' in option
+    ? option._value
+    : option.value || option.text
+}
+
+describe('Directive v-model select', () => {
+  it('should work', done => {
+    const vm = new Vue({
+      data: {
+        test: 'b'
+      },
+      template:
+        '<select v-model="test">' +
+          '<option>a</option>' +
+          '<option>b</option>' +
+          '<option>c</option>' +
+        '</select>'
+    }).$mount()
+    document.body.appendChild(vm.$el)
+    expect(vm.test).toBe('b')
+    expect(vm.$el.value).toBe('b')
+    expect(vm.$el.childNodes[1].selected).toBe(true)
+    vm.test = 'c'
+    waitForUpdate(function () {
+      expect(vm.$el.value).toBe('c')
+      expect(vm.$el.childNodes[2].selected).toBe(true)
+      updateSelect(vm.$el, 'a')
+      triggerEvent(vm.$el, 'change')
+      expect(vm.test).toBe('a')
+    }).then(done)
+  })
+
+  it('should work with value bindings', done => {
+    const vm = new Vue({
+      data: {
+        test: 2
+      },
+      template:
+        '<select v-model="test">' +
+          '<option value="1">a</option>' +
+          '<option :value="2">b</option>' +
+          '<option :value="3">c</option>' +
+        '</select>'
+    }).$mount()
+    document.body.appendChild(vm.$el)
+    expect(vm.$el.value).toBe('2')
+    expect(vm.$el.childNodes[1].selected).toBe(true)
+    vm.test = 3
+    waitForUpdate(function () {
+      expect(vm.$el.value).toBe('3')
+      expect(vm.$el.childNodes[2].selected).toBe(true)
+
+      updateSelect(vm.$el, '1')
+      triggerEvent(vm.$el, 'change')
+      expect(vm.test).toBe('1')
+
+      updateSelect(vm.$el, '2')
+      triggerEvent(vm.$el, 'change')
+      expect(vm.test).toBe(2)
+    }).then(done)
+  })
+
+  it('should work with value bindings (object loose equal)', done => {
+    const vm = new Vue({
+      data: {
+        test: { a: 2 }
+      },
+      template:
+        '<select v-model="test">' +
+          '<option value="1">a</option>' +
+          '<option :value="{ a: 2 }">b</option>' +
+          '<option :value="{ a: 3 }">c</option>' +
+        '</select>'
+    }).$mount()
+    document.body.appendChild(vm.$el)
+    expect(vm.$el.childNodes[1].selected).toBe(true)
+    vm.test = { a: 3 }
+    waitForUpdate(function () {
+      expect(vm.$el.childNodes[2].selected).toBe(true)
+
+      updateSelect(vm.$el, '1')
+      triggerEvent(vm.$el, 'change')
+      expect(vm.test).toBe('1')
+
+      updateSelect(vm.$el, { a: 2 })
+      triggerEvent(vm.$el, 'change')
+      expect(vm.test).toEqual({ a: 2 })
+    }).then(done)
+  })
+
+  it('should work with value bindings (Array loose equal)', done => {
+    const vm = new Vue({
+      data: {
+        test: [{ a: 2 }]
+      },
+      template:
+        '<select v-model="test">' +
+          '<option value="1">a</option>' +
+          '<option :value="[{ a: 2 }]">b</option>' +
+          '<option :value="[{ a: 3 }]">c</option>' +
+        '</select>'
+    }).$mount()
+    document.body.appendChild(vm.$el)
+    expect(vm.$el.childNodes[1].selected).toBe(true)
+    vm.test = [{ a: 3 }]
+    waitForUpdate(function () {
+      expect(vm.$el.childNodes[2].selected).toBe(true)
+
+      updateSelect(vm.$el, '1')
+      triggerEvent(vm.$el, 'change')
+      expect(vm.test).toBe('1')
+
+      updateSelect(vm.$el, [{ a: 2 }])
+      triggerEvent(vm.$el, 'change')
+      expect(vm.test).toEqual([{ a: 2 }])
+    }).then(done)
+  })
+
+  it('should work with v-for', done => {
+    const vm = new Vue({
+      data: {
+        test: 'b',
+        opts: ['a', 'b', 'c']
+      },
+      template:
+        '<select v-model="test">' +
+          '<option v-for="o in opts">{{ o }}</option>' +
+        '</select>'
+    }).$mount()
+    document.body.appendChild(vm.$el)
+    expect(vm.test).toBe('b')
+    expect(vm.$el.value).toBe('b')
+    expect(vm.$el.childNodes[1].selected).toBe(true)
+    vm.test = 'c'
+    waitForUpdate(function () {
+      expect(vm.$el.value).toBe('c')
+      expect(vm.$el.childNodes[2].selected).toBe(true)
+      updateSelect(vm.$el, 'a')
+      triggerEvent(vm.$el, 'change')
+      expect(vm.test).toBe('a')
+      // update v-for opts
+      vm.opts = ['d', 'a']
+    }).then(() => {
+      expect(vm.$el.childNodes[0].selected).toBe(false)
+      expect(vm.$el.childNodes[1].selected).toBe(true)
+    }).then(done)
+  })
+
+  it('should work with v-for & value bindings', done => {
+    const vm = new Vue({
+      data: {
+        test: 2,
+        opts: [1, 2, 3]
+      },
+      template:
+        '<select v-model="test">' +
+          '<option v-for="o in opts" :value="o">option {{ o }}</option>' +
+        '</select>'
+    }).$mount()
+    document.body.appendChild(vm.$el)
+    expect(vm.$el.value).toBe('2')
+    expect(vm.$el.childNodes[1].selected).toBe(true)
+    vm.test = 3
+    waitForUpdate(function () {
+      expect(vm.$el.value).toBe('3')
+      expect(vm.$el.childNodes[2].selected).toBe(true)
+      updateSelect(vm.$el, 1)
+      triggerEvent(vm.$el, 'change')
+      expect(vm.test).toBe(1)
+      // update v-for opts
+      vm.opts = [0, 1]
+    }).then(() => {
+      expect(vm.$el.childNodes[0].selected).toBe(false)
+      expect(vm.$el.childNodes[1].selected).toBe(true)
+    }).then(done)
+  })
+
+  it('should work with select which has no default selected options', (done) => {
+    const spy = jasmine.createSpy()
+    const vm = new Vue({
+      data: {
+        id: 4,
+        list: [1, 2, 3],
+        testChange: 5
+      },
+      template:
+        '<div>' +
+          '<select @change="test" v-model="id">' +
+            '<option v-for="item in list" :value="item">{{item}}</option>' +
+          '</select>' +
+          '{{testChange}}' +
+        '</div>',
+      methods: {
+        test: spy
+      }
+    }).$mount()
+    document.body.appendChild(vm.$el)
+    vm.testChange = 10
+    waitForUpdate(() => {
+      expect(spy.calls.count()).toBe(0)
+    }).then(done)
+  })
+
+  if (!hasMultiSelectBug()) {
+    it('multiple', done => {
+      const vm = new Vue({
+        data: {
+          test: ['b']
+        },
+        template:
+          '<select v-model="test" multiple>' +
+            '<option>a</option>' +
+            '<option>b</option>' +
+            '<option>c</option>' +
+          '</select>'
+      }).$mount()
+      var opts = vm.$el.options
+      expect(opts[0].selected).toBe(false)
+      expect(opts[1].selected).toBe(true)
+      expect(opts[2].selected).toBe(false)
+      vm.test = ['a', 'c']
+      waitForUpdate(() => {
+        expect(opts[0].selected).toBe(true)
+        expect(opts[1].selected).toBe(false)
+        expect(opts[2].selected).toBe(true)
+        opts[0].selected = false
+        opts[1].selected = true
+        triggerEvent(vm.$el, 'change')
+        expect(vm.test).toEqual(['b', 'c'])
+      }).then(done)
+    })
+
+    it('multiple + v-for', done => {
+      const vm = new Vue({
+        data: {
+          test: ['b'],
+          opts: ['a', 'b', 'c']
+        },
+        template:
+          '<select v-model="test" multiple>' +
+            '<option v-for="o in opts">{{ o }}</option>' +
+          '</select>'
+      }).$mount()
+      var opts = vm.$el.options
+      expect(opts[0].selected).toBe(false)
+      expect(opts[1].selected).toBe(true)
+      expect(opts[2].selected).toBe(false)
+      vm.test = ['a', 'c']
+      waitForUpdate(() => {
+        expect(opts[0].selected).toBe(true)
+        expect(opts[1].selected).toBe(false)
+        expect(opts[2].selected).toBe(true)
+        opts[0].selected = false
+        opts[1].selected = true
+        triggerEvent(vm.$el, 'change')
+        expect(vm.test).toEqual(['b', 'c'])
+        // update v-for opts
+        vm.opts = ['c', 'd']
+      }).then(() => {
+        expect(opts[0].selected).toBe(true)
+        expect(opts[1].selected).toBe(false)
+        expect(vm.test).toEqual(['c']) // should remove 'd' which no longer has a matching option
+      }).then(done)
+    })
+  }
+
+  it('should work with multiple binding', (done) => {
+    const spy = jasmine.createSpy()
+    const vm = new Vue({
+      data: {
+        isMultiple: true,
+        selections: ['1']
+      },
+      template:
+        '<select v-model="selections" :multiple="isMultiple">' +
+          '<option value="1">item 1</option>' +
+          '<option value="2">item 2</option>' +
+        '</select>',
+      watch: {
+        selections: spy
+      }
+    }).$mount()
+    document.body.appendChild(vm.$el)
+    vm.$el.options[1].selected = true
+    triggerEvent(vm.$el, 'change')
+    waitForUpdate(() => {
+      expect(spy).toHaveBeenCalled()
+      expect(vm.selections).toEqual(['1', '2'])
+    }).then(done)
+  })
+
+  it('should not have multiple attr with falsy values except \'\'', () => {
+    const vm = new Vue({
+      template:
+        '<div>' +
+          '<select id="undefined" :multiple="undefined"></select>' +
+          '<select id="null" :multiple="null"></select>' +
+          '<select id="false" :multiple="false"></select>' +
+          '<select id="string" :multiple="\'\'"></select>' +
+        '</div>'
+    }).$mount()
+    expect(vm.$el.querySelector('#undefined').multiple).toEqual(false)
+    expect(vm.$el.querySelector('#null').multiple).toEqual(false)
+    expect(vm.$el.querySelector('#false').multiple).toEqual(false)
+    expect(vm.$el.querySelector('#string').multiple).toEqual(true)
+  })
+
+  it('multiple with static template', () => {
+    const vm = new Vue({
+      template:
+      '<select multiple>' +
+        '<option selected>a</option>' +
+        '<option selected>b</option>' +
+        '<option selected>c</option>' +
+      '</select>'
+    }).$mount()
+    var opts = vm.$el.options
+    expect(opts[0].selected).toBe(true)
+    expect(opts[1].selected).toBe(true)
+    expect(opts[2].selected).toBe(true)
+  })
+
+  it('multiple selects', (done) => {
+    const spy = jasmine.createSpy()
+    const vm = new Vue({
+      data: {
+        selections: ['', ''],
+        selectBoxes: [
+          [
+            { value: 'foo', text: 'foo' },
+            { value: 'bar', text: 'bar' }
+          ],
+          [
+            { value: 'day', text: 'day' },
+            { value: 'night', text: 'night' }
+          ]
+        ]
+      },
+      watch: {
+        selections: spy
+      },
+      template:
+        '<div>' +
+          '<select v-for="(item, index) in selectBoxes" v-model="selections[index]">' +
+            '<option v-for="element in item" v-bind:value="element.value" v-text="element.text"></option>' +
+          '</select>' +
+          '<span ref="rs">{{selections}}</span>' +
+        '</div>'
+    }).$mount()
+    document.body.appendChild(vm.$el)
+    var selects = vm.$el.getElementsByTagName('select')
+    var select0 = selects[0]
+    select0.options[0].selected = true
+    triggerEvent(select0, 'change')
+    waitForUpdate(() => {
+      expect(spy).toHaveBeenCalled()
+      expect(vm.selections).toEqual(['foo', ''])
+    }).then(done)
+  })
+
+  it('.number modifier', () => {
+    const vm = new Vue({
+      data: {
+        test: 2
+      },
+      template:
+        '<select v-model.number="test">' +
+          '<option value="1">a</option>' +
+          '<option :value="2">b</option>' +
+          '<option :value="3">c</option>' +
+        '</select>'
+    }).$mount()
+    document.body.appendChild(vm.$el)
+    updateSelect(vm.$el, '1')
+    triggerEvent(vm.$el, 'change')
+    expect(vm.test).toBe(1)
+  })
+
+  it('should respect different primitive type value', (done) => {
+    const vm = new Vue({
+      data: {
+        test: 0
+      },
+      template:
+        '<select v-model.number="test">' +
+          '<option value="">a</option>' +
+          '<option value="0">b</option>' +
+          '<option value="1">c</option>' +
+          '<option value="false">c</option>' +
+          '<option value="true">c</option>' +
+        '</select>'
+    }).$mount()
+    var opts = vm.$el.options
+    expect(opts[0].selected).toBe(false)
+    expect(opts[1].selected).toBe(true)
+    expect(opts[2].selected).toBe(false)
+    expect(opts[3].selected).toBe(false)
+    expect(opts[4].selected).toBe(false)
+    vm.test = 1
+    waitForUpdate(() => {
+      expect(opts[0].selected).toBe(false)
+      expect(opts[1].selected).toBe(false)
+      expect(opts[2].selected).toBe(true)
+      expect(opts[3].selected).toBe(false)
+      expect(opts[4].selected).toBe(false)
+      vm.test = ''
+    }).then(() => {
+      expect(opts[0].selected).toBe(true)
+      expect(opts[1].selected).toBe(false)
+      expect(opts[2].selected).toBe(false)
+      expect(opts[3].selected).toBe(false)
+      expect(opts[4].selected).toBe(false)
+      vm.test = false
+    }).then(() => {
+      expect(opts[0].selected).toBe(false)
+      expect(opts[1].selected).toBe(false)
+      expect(opts[2].selected).toBe(false)
+      expect(opts[3].selected).toBe(true)
+      expect(opts[4].selected).toBe(false)
+      vm.test = true
+    }).then(() => {
+      expect(opts[0].selected).toBe(false)
+      expect(opts[1].selected).toBe(false)
+      expect(opts[2].selected).toBe(false)
+      expect(opts[3].selected).toBe(false)
+      expect(opts[4].selected).toBe(true)
+    }).then(done)
+  })
+
+  it('should warn multiple with non-Array value', done => {
+    new Vue({
+      data: {
+        test: 'meh'
+      },
+      template:
+        '<select v-model="test" multiple></select>'
+    }).$mount()
+    // IE warns on a setTimeout as well
+    setTimeout(() => {
+      expect('<select multiple v-model="test"> expects an Array value for its binding, but got String')
+        .toHaveBeenWarned()
+      done()
+    }, 0)
+  })
+
+  it('should work with option value that has circular reference', done => {
+    const circular = {}
+    circular.self = circular
+
+    const vm = new Vue({
+      data: {
+        test: 'b',
+        circular
+      },
+      template:
+        '<select v-model="test">' +
+          '<option :value="circular">a</option>' +
+          '<option>b</option>' +
+          '<option>c</option>' +
+        '</select>'
+    }).$mount()
+    document.body.appendChild(vm.$el)
+    expect(vm.test).toBe('b')
+    expect(vm.$el.value).toBe('b')
+    expect(vm.$el.childNodes[1].selected).toBe(true)
+    vm.test = circular
+    waitForUpdate(function () {
+      expect(vm.$el.childNodes[0].selected).toBe(true)
+    }).then(done)
+  })
+
+  // #6112
+  it('should not set non-matching value to undefined if options did not change', done => {
+    const vm = new Vue({
+      data: {
+        test: '1'
+      },
+      template:
+        '<select v-model="test">' +
+          '<option>a</option>' +
+        '</select>'
+    }).$mount()
+
+    vm.test = '2'
+    waitForUpdate(() => {
+      expect(vm.test).toBe('2')
+    }).then(done)
+  })
+
+  // #6193
+  it('should not trigger change event when matching option can be found for each value', done => {
+    const spy = jasmine.createSpy()
+    const vm = new Vue({
+      data: {
+        options: ['1']
+      },
+      computed: {
+        test: {
+          get () {
+            return '1'
+          },
+          set () {
+            spy()
+          }
+        }
+      },
+      template:
+        '<select v-model="test">' +
+          '<option :key="opt" v-for="opt in options" :value="opt">{{ opt }}</option>' +
+        '</select>'
+    }).$mount()
+
+    vm.options = ['1', '2']
+    waitForUpdate(() => {
+      expect(spy).not.toHaveBeenCalled()
+    }).then(done)
+  })
+
+  // #6903
+  describe('should correctly handle v-model when the vnodes are the same', () => {
+    function makeInstance (foo) {
+      return new Vue({
+        data: {
+          foo: foo,
+          options: ['b', 'c', 'd'],
+          value: 'c'
+        },
+        template:
+          '<div>' +
+            '<select v-if="foo" data-attr>' +
+              '<option selected>a</option>' +
+            '</select>' +
+            '<select v-else v-model="value">' +
+              '<option v-for="option in options" :value="option">{{ option }}</option>' +
+            '</select>' +
+          '</div>'
+      }).$mount()
+    }
+
+    it('register v-model', done => {
+      const vm = makeInstance(true)
+
+      expect(vm.$el.firstChild.selectedIndex).toBe(0)
+      vm.foo = false
+      waitForUpdate(() => {
+        expect(vm.$el.firstChild.selectedIndex).toBe(1)
+      }).then(done)
+    })
+
+    it('remove v-model', done => {
+      const vm = makeInstance(false)
+
+      expect(vm.$el.firstChild.selectedIndex).toBe(1)
+      vm.foo = true
+      waitForUpdate(() => {
+        expect(vm.$el.firstChild.selectedIndex).toBe(0)
+      }).then(done)
+    })
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/features/directives/model-text.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/features/directives/model-text.spec.js
new file mode 100644 (file)
index 0000000..7ae44f9
--- /dev/null
@@ -0,0 +1,456 @@
+import Vue from 'vue'
+import { isIE9, isIE, isAndroid } from 'core/util/env'
+
+describe('Directive v-model text', () => {
+  it('should update value both ways', done => {
+    const vm = new Vue({
+      data: {
+        test: 'b'
+      },
+      template: '<input v-model="test">'
+    }).$mount()
+    expect(vm.$el.value).toBe('b')
+    vm.test = 'a'
+    waitForUpdate(() => {
+      expect(vm.$el.value).toBe('a')
+      vm.$el.value = 'c'
+      triggerEvent(vm.$el, 'input')
+      expect(vm.test).toBe('c')
+    }).then(done)
+  })
+
+  it('should work with space ended expression in v-model', () => {
+    const vm = new Vue({
+      data: {
+        obj: {
+          test: 'b'
+        }
+      },
+      template: '<input v-model="obj.test ">'
+    }).$mount()
+
+    triggerEvent(vm.$el, 'input')
+    expect(vm.obj['test ']).toBe(undefined)
+    expect(vm.obj.test).toBe('b')
+  })
+
+  it('.lazy modifier', () => {
+    const vm = new Vue({
+      data: {
+        test: 'b'
+      },
+      template: '<input v-model.lazy="test">'
+    }).$mount()
+    expect(vm.$el.value).toBe('b')
+    expect(vm.test).toBe('b')
+    vm.$el.value = 'c'
+    triggerEvent(vm.$el, 'input')
+    expect(vm.test).toBe('b')
+    triggerEvent(vm.$el, 'change')
+    expect(vm.test).toBe('c')
+  })
+
+  it('.number modifier', () => {
+    const vm = new Vue({
+      data: {
+        test: 1
+      },
+      template: '<input v-model.number="test">'
+    }).$mount()
+    expect(vm.test).toBe(1)
+    vm.$el.value = '2'
+    triggerEvent(vm.$el, 'input')
+    expect(vm.test).toBe(2)
+    // should let strings pass through
+    vm.$el.value = 'f'
+    triggerEvent(vm.$el, 'input')
+    expect(vm.test).toBe('f')
+  })
+
+  it('.trim modifier', () => {
+    const vm = new Vue({
+      data: {
+        test: 'hi'
+      },
+      template: '<input v-model.trim="test">'
+    }).$mount()
+    expect(vm.test).toBe('hi')
+    vm.$el.value = ' what '
+    triggerEvent(vm.$el, 'input')
+    expect(vm.test).toBe('what')
+  })
+
+  it('.number focus and typing', (done) => {
+    const vm = new Vue({
+      data: {
+        test: 0,
+        update: 0
+      },
+      template:
+        '<div>' +
+          '<input ref="input" v-model.number="test">{{ update }}' +
+          '<input ref="blur">' +
+        '</div>'
+    }).$mount()
+    document.body.appendChild(vm.$el)
+    vm.$refs.input.focus()
+    expect(vm.test).toBe(0)
+    vm.$refs.input.value = '1.0'
+    triggerEvent(vm.$refs.input, 'input')
+    expect(vm.test).toBe(1)
+    vm.update++
+    waitForUpdate(() => {
+      expect(vm.$refs.input.value).toBe('1.0')
+      vm.$refs.blur.focus()
+      vm.update++
+    }).then(() => {
+      expect(vm.$refs.input.value).toBe('1')
+    }).then(done)
+  })
+
+  it('.trim focus and typing', (done) => {
+    const vm = new Vue({
+      data: {
+        test: 'abc',
+        update: 0
+      },
+      template:
+        '<div>' +
+          '<input ref="input" v-model.trim="test" type="text">{{ update }}' +
+          '<input ref="blur"/>' +
+        '</div>'
+    }).$mount()
+    document.body.appendChild(vm.$el)
+    vm.$refs.input.focus()
+    vm.$refs.input.value = ' abc '
+    triggerEvent(vm.$refs.input, 'input')
+    expect(vm.test).toBe('abc')
+    vm.update++
+    waitForUpdate(() => {
+      expect(vm.$refs.input.value).toBe(' abc ')
+      vm.$refs.blur.focus()
+      vm.update++
+    }).then(() => {
+      expect(vm.$refs.input.value).toBe('abc')
+    }).then(done)
+  })
+
+  it('multiple inputs', (done) => {
+    const spy = jasmine.createSpy()
+    const vm = new Vue({
+      data: {
+        selections: [[1, 2, 3], [4, 5]],
+        inputList: [
+          {
+            name: 'questionA',
+            data: ['a', 'b', 'c']
+          },
+          {
+            name: 'questionB',
+            data: ['1', '2']
+          }
+        ]
+      },
+      watch: {
+        selections: spy
+      },
+      template:
+        '<div>' +
+          '<div v-for="(inputGroup, idx) in inputList">' +
+            '<div>' +
+              '<span v-for="(item, index) in inputGroup.data">' +
+                '<input v-bind:name="item" type="text" v-model.number="selections[idx][index]" v-bind:id="idx+\'-\'+index"/>' +
+                '<label>{{item}}</label>' +
+              '</span>' +
+            '</div>' +
+          '</div>' +
+          '<span ref="rs">{{selections}}</span>' +
+        '</div>'
+    }).$mount()
+    var inputs = vm.$el.getElementsByTagName('input')
+    inputs[1].value = 'test'
+    triggerEvent(inputs[1], 'input')
+    waitForUpdate(() => {
+      expect(spy).toHaveBeenCalled()
+      expect(vm.selections).toEqual([[1, 'test', 3], [4, 5]])
+    }).then(done)
+  })
+
+  if (isIE9) {
+    it('IE9 selectionchange', done => {
+      const vm = new Vue({
+        data: {
+          test: 'foo'
+        },
+        template: '<input v-model="test">'
+      }).$mount()
+      const input = vm.$el
+      input.value = 'bar'
+      document.body.appendChild(input)
+      input.focus()
+      triggerEvent(input, 'selectionchange')
+      waitForUpdate(() => {
+        expect(vm.test).toBe('bar')
+        input.value = 'a'
+        triggerEvent(input, 'selectionchange')
+        expect(vm.test).toBe('a')
+      }).then(done)
+    })
+  }
+
+  it('compositionevents', function (done) {
+    const vm = new Vue({
+      data: {
+        test: 'foo'
+      },
+      template: '<input v-model="test">'
+    }).$mount()
+    const input = vm.$el
+    triggerEvent(input, 'compositionstart')
+    input.value = 'baz'
+    // input before composition unlock should not call set
+    triggerEvent(input, 'input')
+    expect(vm.test).toBe('foo')
+    // after composition unlock it should work
+    triggerEvent(input, 'compositionend')
+    triggerEvent(input, 'input')
+    expect(vm.test).toBe('baz')
+    done()
+  })
+
+  it('warn invalid tag', () => {
+    new Vue({
+      data: {
+        test: 'foo'
+      },
+      template: '<div v-model="test"></div>'
+    }).$mount()
+    expect('<div v-model="test">: v-model is not supported on this element type').toHaveBeenWarned()
+  })
+
+  // #3468
+  it('should have higher priority than user v-on events', () => {
+    const spy = jasmine.createSpy()
+    const vm = new Vue({
+      data: {
+        a: 'a'
+      },
+      template: '<input v-model="a" @input="onInput">',
+      methods: {
+        onInput (e) {
+          spy(e.target.value)
+        }
+      }
+    }).$mount()
+    vm.$el.value = 'b'
+    triggerEvent(vm.$el, 'input')
+    expect(spy).toHaveBeenCalledWith('b')
+  })
+
+  it('warn binding to v-for alias', () => {
+    new Vue({
+      data: {
+        strings: ['hi']
+      },
+      template: `
+        <div>
+          <div v-for="str in strings">
+            <input v-model="str">
+          </div>
+        </div>
+      `
+    }).$mount()
+    expect('You are binding v-model directly to a v-for iteration alias').toHaveBeenWarned()
+  })
+
+  it('warn if v-model and v-bind:value conflict', () => {
+    new Vue({
+      data: {
+        test: 'foo'
+      },
+      template: '<input type="text" v-model="test" v-bind:value="test">'
+    }).$mount()
+    expect('v-bind:value="test" conflicts with v-model').toHaveBeenWarned()
+  })
+
+  it('warn if v-model and :value conflict', () => {
+    new Vue({
+      data: {
+        test: 'foo'
+      },
+      template: '<input type="text" v-model="test" :value="test">'
+    }).$mount()
+    expect(':value="test" conflicts with v-model').toHaveBeenWarned()
+  })
+
+  it('should not warn on radio, checkbox, or custom component', () => {
+    new Vue({
+      data: { test: '' },
+      components: {
+        foo: {
+          props: ['model', 'value'],
+          model: { prop: 'model', event: 'change' },
+          template: `<div/>`
+        }
+      },
+      template: `
+        <div>
+          <input type="checkbox" v-model="test" :value="test">
+          <input type="radio" v-model="test" :value="test">
+          <foo v-model="test" :value="test"/>
+        </div>
+      `
+    }).$mount()
+    expect('conflicts with v-model').not.toHaveBeenWarned()
+  })
+
+  it('should not warn on input with dynamic type binding', () => {
+    new Vue({
+      data: {
+        type: 'checkbox',
+        test: 'foo'
+      },
+      template: '<input :type="type" v-model="test" :value="test">'
+    }).$mount()
+    expect('conflicts with v-model').not.toHaveBeenWarned()
+  })
+
+  if (!isAndroid) {
+    it('does not trigger extra input events with single compositionend', () => {
+      const spy = jasmine.createSpy()
+      const vm = new Vue({
+        data: {
+          a: 'a'
+        },
+        template: '<input v-model="a" @input="onInput">',
+        methods: {
+          onInput (e) {
+            spy(e.target.value)
+          }
+        }
+      }).$mount()
+      expect(spy.calls.count()).toBe(0)
+      vm.$el.value = 'b'
+      triggerEvent(vm.$el, 'input')
+      expect(spy.calls.count()).toBe(1)
+      triggerEvent(vm.$el, 'compositionend')
+      expect(spy.calls.count()).toBe(1)
+    })
+
+    it('triggers extra input on compositionstart + end', () => {
+      const spy = jasmine.createSpy()
+      const vm = new Vue({
+        data: {
+          a: 'a'
+        },
+        template: '<input v-model="a" @input="onInput">',
+        methods: {
+          onInput (e) {
+            spy(e.target.value)
+          }
+        }
+      }).$mount()
+      expect(spy.calls.count()).toBe(0)
+      vm.$el.value = 'b'
+      triggerEvent(vm.$el, 'input')
+      expect(spy.calls.count()).toBe(1)
+      triggerEvent(vm.$el, 'compositionstart')
+      triggerEvent(vm.$el, 'compositionend')
+      expect(spy.calls.count()).toBe(2)
+    })
+
+    // #4392
+    it('should not update value with modifiers when in focus if post-conversion values are the same', done => {
+      const vm = new Vue({
+        data: {
+          a: 1,
+          foo: false
+        },
+        template: '<div>{{ foo }}<input ref="input" v-model.number="a"></div>'
+      }).$mount()
+
+      document.body.appendChild(vm.$el)
+      vm.$refs.input.focus()
+      vm.$refs.input.value = '1.000'
+      vm.foo = true
+
+      waitForUpdate(() => {
+        expect(vm.$refs.input.value).toBe('1.000')
+      }).then(done)
+    })
+
+    // #6552
+    // This was original introduced due to the microtask between DOM events issue
+    // but fixed after switching to MessageChannel.
+    it('should not block input when another input listener with modifier is used', done => {
+      const vm = new Vue({
+        data: {
+          a: 'a',
+          foo: false
+        },
+        template: `
+          <div>
+            <input ref="input" v-model="a" @input.capture="onInput">{{ a }}
+            <div v-if="foo">foo</div>
+          </div>
+        `,
+        methods: {
+          onInput (e) {
+            this.foo = true
+          }
+        }
+      }).$mount()
+
+      document.body.appendChild(vm.$el)
+      vm.$refs.input.focus()
+      vm.$refs.input.value = 'b'
+      triggerEvent(vm.$refs.input, 'input')
+
+      // not using wait for update here because there will be two update cycles
+      // one caused by onInput in the first listener
+      setTimeout(() => {
+        expect(vm.a).toBe('b')
+        expect(vm.$refs.input.value).toBe('b')
+        done()
+      }, 16)
+    })
+
+    it('should create and make reactive non-existent properties', done => {
+      const vm = new Vue({
+        data: {
+          foo: {}
+        },
+        template: '<input v-model="foo.bar">'
+      }).$mount()
+      expect(vm.$el.value).toBe('')
+
+      vm.$el.value = 'a'
+      triggerEvent(vm.$el, 'input')
+      expect(vm.foo.bar).toBe('a')
+      vm.foo.bar = 'b'
+      waitForUpdate(() => {
+        expect(vm.$el.value).toBe('b')
+        vm.foo = {}
+      }).then(() => {
+        expect(vm.$el.value).toBe('')
+      }).then(done)
+    })
+  }
+
+  // #7138
+  if (isIE && !isIE9) {
+    it('should not fire input on initial render of textarea with placeholder in IE10/11', done => {
+      const el = document.createElement('div')
+      document.body.appendChild(el)
+      const vm = new Vue({
+        el,
+        data: { foo: null },
+        template: `<textarea v-model="foo" placeholder="bar"></textarea>`
+      })
+      setTimeout(() => {
+        expect(vm.foo).toBe(null)
+        done()
+      }, 17)
+    })
+  }
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/features/directives/on.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/features/directives/on.spec.js
new file mode 100644 (file)
index 0000000..3973c41
--- /dev/null
@@ -0,0 +1,898 @@
+import Vue from 'vue'
+import { supportsPassive } from 'core/util/env'
+
+describe('Directive v-on', () => {
+  let vm, spy, el
+
+  beforeEach(() => {
+    vm = null
+    spy = jasmine.createSpy()
+    el = document.createElement('div')
+    document.body.appendChild(el)
+  })
+
+  afterEach(() => {
+    if (vm) {
+      document.body.removeChild(vm.$el)
+    }
+  })
+
+  it('should bind event to a method', () => {
+    vm = new Vue({
+      el,
+      template: '<div v-on:click="foo"></div>',
+      methods: { foo: spy }
+    })
+    triggerEvent(vm.$el, 'click')
+    expect(spy.calls.count()).toBe(1)
+
+    const args = spy.calls.allArgs()
+    const event = args[0] && args[0][0] || {}
+    expect(event.type).toBe('click')
+  })
+
+  it('should bind event to a inline statement', () => {
+    vm = new Vue({
+      el,
+      template: '<div v-on:click="foo(1,2,3,$event)"></div>',
+      methods: { foo: spy }
+    })
+    triggerEvent(vm.$el, 'click')
+    expect(spy.calls.count()).toBe(1)
+
+    const args = spy.calls.allArgs()
+    const firstArgs = args[0]
+    expect(firstArgs.length).toBe(4)
+    expect(firstArgs[0]).toBe(1)
+    expect(firstArgs[1]).toBe(2)
+    expect(firstArgs[2]).toBe(3)
+    expect(firstArgs[3].type).toBe('click')
+  })
+
+  it('should support inline function expression', () => {
+    const spy = jasmine.createSpy()
+    vm = new Vue({
+      el,
+      template: `<div class="test" @click="function (e) { log(e.target.className) }"></div>`,
+      methods: {
+        log: spy
+      }
+    }).$mount()
+    triggerEvent(vm.$el, 'click')
+    expect(spy).toHaveBeenCalledWith('test')
+  })
+
+  it('should support shorthand', () => {
+    vm = new Vue({
+      el,
+      template: '<a href="#test" @click.prevent="foo"></a>',
+      methods: { foo: spy }
+    })
+    triggerEvent(vm.$el, 'click')
+    expect(spy.calls.count()).toBe(1)
+  })
+
+  it('should support stop propagation', () => {
+    vm = new Vue({
+      el,
+      template: `
+        <div @click.stop="foo"></div>
+      `,
+      methods: { foo: spy }
+    })
+    const hash = window.location.hash
+    triggerEvent(vm.$el, 'click')
+    expect(window.location.hash).toBe(hash)
+  })
+
+  it('should support prevent default', () => {
+    vm = new Vue({
+      el,
+      template: `
+        <input type="checkbox" ref="input" @click.prevent="foo">
+      `,
+      methods: {
+        foo ($event) {
+          spy($event.defaultPrevented)
+        }
+      }
+    })
+    vm.$refs.input.checked = false
+    triggerEvent(vm.$refs.input, 'click')
+    expect(spy).toHaveBeenCalledWith(true)
+  })
+
+  it('should support capture', () => {
+    const callOrder = []
+    vm = new Vue({
+      el,
+      template: `
+        <div @click.capture="foo">
+          <div @click="bar"></div>
+        </div>
+      `,
+      methods: {
+        foo () { callOrder.push(1) },
+        bar () { callOrder.push(2) }
+      }
+    })
+    triggerEvent(vm.$el.firstChild, 'click')
+    expect(callOrder.toString()).toBe('1,2')
+  })
+
+  it('should support once', () => {
+    vm = new Vue({
+      el,
+      template: `
+        <div @click.once="foo">
+        </div>
+      `,
+      methods: { foo: spy }
+    })
+    triggerEvent(vm.$el, 'click')
+    expect(spy.calls.count()).toBe(1)
+    triggerEvent(vm.$el, 'click')
+    expect(spy.calls.count()).toBe(1) // should no longer trigger
+  })
+
+  // #4655
+  it('should handle .once on multiple elements properly', () => {
+    vm = new Vue({
+      el,
+      template: `
+        <div>
+          <button ref="one" @click.once="foo">one</button>
+          <button ref="two" @click.once="foo">two</button>
+        </div>
+      `,
+      methods: { foo: spy }
+    })
+    triggerEvent(vm.$refs.one, 'click')
+    expect(spy.calls.count()).toBe(1)
+    triggerEvent(vm.$refs.one, 'click')
+    expect(spy.calls.count()).toBe(1)
+    triggerEvent(vm.$refs.two, 'click')
+    expect(spy.calls.count()).toBe(2)
+    triggerEvent(vm.$refs.one, 'click')
+    triggerEvent(vm.$refs.two, 'click')
+    expect(spy.calls.count()).toBe(2)
+  })
+
+  it('should support capture and once', () => {
+    const callOrder = []
+    vm = new Vue({
+      el,
+      template: `
+        <div @click.capture.once="foo">
+          <div @click="bar"></div>
+        </div>
+      `,
+      methods: {
+        foo () { callOrder.push(1) },
+        bar () { callOrder.push(2) }
+      }
+    })
+    triggerEvent(vm.$el.firstChild, 'click')
+    expect(callOrder.toString()).toBe('1,2')
+    triggerEvent(vm.$el.firstChild, 'click')
+    expect(callOrder.toString()).toBe('1,2,2')
+  })
+
+  // #4846
+  it('should support once and other modifiers', () => {
+    vm = new Vue({
+      el,
+      template: `<div @click.once.self="foo"><span/></div>`,
+      methods: { foo: spy }
+    })
+    triggerEvent(vm.$el.firstChild, 'click')
+    expect(spy).not.toHaveBeenCalled()
+    triggerEvent(vm.$el, 'click')
+    expect(spy).toHaveBeenCalled()
+    triggerEvent(vm.$el, 'click')
+    expect(spy.calls.count()).toBe(1)
+  })
+
+  it('should support keyCode', () => {
+    vm = new Vue({
+      el,
+      template: `<input @keyup.enter="foo">`,
+      methods: { foo: spy }
+    })
+    triggerEvent(vm.$el, 'keyup', e => {
+      e.keyCode = 13
+    })
+    expect(spy).toHaveBeenCalled()
+  })
+
+  it('should support automatic key name inference', () => {
+    vm = new Vue({
+      el,
+      template: `<input @keyup.arrow-right="foo">`,
+      methods: { foo: spy }
+    })
+    triggerEvent(vm.$el, 'keyup', e => {
+      e.key = 'ArrowRight'
+    })
+    expect(spy).toHaveBeenCalled()
+  })
+
+  // ctrl, shift, alt, meta
+  it('should support system modifers', () => {
+    vm = new Vue({
+      el,
+      template: `
+        <div>
+          <input ref="ctrl" @keyup.ctrl="foo">
+          <input ref="shift" @keyup.shift="foo">
+          <input ref="alt" @keyup.alt="foo">
+          <input ref="meta" @keyup.meta="foo">
+        </div>
+      `,
+      methods: { foo: spy }
+    })
+
+    triggerEvent(vm.$refs.ctrl, 'keyup')
+    expect(spy.calls.count()).toBe(0)
+    triggerEvent(vm.$refs.ctrl, 'keyup', e => { e.ctrlKey = true })
+    expect(spy.calls.count()).toBe(1)
+
+    triggerEvent(vm.$refs.shift, 'keyup')
+    expect(spy.calls.count()).toBe(1)
+    triggerEvent(vm.$refs.shift, 'keyup', e => { e.shiftKey = true })
+    expect(spy.calls.count()).toBe(2)
+
+    triggerEvent(vm.$refs.alt, 'keyup')
+    expect(spy.calls.count()).toBe(2)
+    triggerEvent(vm.$refs.alt, 'keyup', e => { e.altKey = true })
+    expect(spy.calls.count()).toBe(3)
+
+    triggerEvent(vm.$refs.meta, 'keyup')
+    expect(spy.calls.count()).toBe(3)
+    triggerEvent(vm.$refs.meta, 'keyup', e => { e.metaKey = true })
+    expect(spy.calls.count()).toBe(4)
+  })
+
+  it('should support exact modifier', () => {
+    vm = new Vue({
+      el,
+      template: `
+        <div>
+          <input ref="ctrl" @keyup.exact="foo">
+        </div>
+      `,
+      methods: { foo: spy }
+    })
+
+    triggerEvent(vm.$refs.ctrl, 'keyup')
+    expect(spy.calls.count()).toBe(1)
+
+    triggerEvent(vm.$refs.ctrl, 'keyup', e => {
+      e.ctrlKey = true
+    })
+    expect(spy.calls.count()).toBe(1)
+
+    // should not trigger if has other system modifiers
+    triggerEvent(vm.$refs.ctrl, 'keyup', e => {
+      e.ctrlKey = true
+      e.altKey = true
+    })
+    expect(spy.calls.count()).toBe(1)
+  })
+
+  it('should support system modifers with exact', () => {
+    vm = new Vue({
+      el,
+      template: `
+        <div>
+          <input ref="ctrl" @keyup.ctrl.exact="foo">
+        </div>
+      `,
+      methods: { foo: spy }
+    })
+
+    triggerEvent(vm.$refs.ctrl, 'keyup')
+    expect(spy.calls.count()).toBe(0)
+
+    triggerEvent(vm.$refs.ctrl, 'keyup', e => {
+      e.ctrlKey = true
+    })
+    expect(spy.calls.count()).toBe(1)
+
+    // should not trigger if has other system modifiers
+    triggerEvent(vm.$refs.ctrl, 'keyup', e => {
+      e.ctrlKey = true
+      e.altKey = true
+    })
+    expect(spy.calls.count()).toBe(1)
+  })
+
+  it('should support number keyCode', () => {
+    vm = new Vue({
+      el,
+      template: `<input @keyup.13="foo">`,
+      methods: { foo: spy }
+    })
+    triggerEvent(vm.$el, 'keyup', e => {
+      e.keyCode = 13
+    })
+    expect(spy).toHaveBeenCalled()
+  })
+
+  it('should support mouse modifier', () => {
+    const left = 0
+    const middle = 1
+    const right = 2
+    const spyLeft = jasmine.createSpy()
+    const spyMiddle = jasmine.createSpy()
+    const spyRight = jasmine.createSpy()
+
+    vm = new Vue({
+      el,
+      template: `
+        <div>
+          <div ref="left" @mousedown.left="foo">left</div>
+          <div ref="right" @mousedown.right="foo1">right</div>
+          <div ref="middle" @mousedown.middle="foo2">right</div>
+        </div>
+      `,
+      methods: {
+        foo: spyLeft,
+        foo1: spyRight,
+        foo2: spyMiddle
+      }
+    })
+
+    triggerEvent(vm.$refs.left, 'mousedown', e => { e.button = right })
+    triggerEvent(vm.$refs.left, 'mousedown', e => { e.button = middle })
+    expect(spyLeft).not.toHaveBeenCalled()
+    triggerEvent(vm.$refs.left, 'mousedown', e => { e.button = left })
+    expect(spyLeft).toHaveBeenCalled()
+
+    triggerEvent(vm.$refs.right, 'mousedown', e => { e.button = left })
+    triggerEvent(vm.$refs.right, 'mousedown', e => { e.button = middle })
+    expect(spyRight).not.toHaveBeenCalled()
+    triggerEvent(vm.$refs.right, 'mousedown', e => { e.button = right })
+    expect(spyRight).toHaveBeenCalled()
+
+    triggerEvent(vm.$refs.middle, 'mousedown', e => { e.button = left })
+    triggerEvent(vm.$refs.middle, 'mousedown', e => { e.button = right })
+    expect(spyMiddle).not.toHaveBeenCalled()
+    triggerEvent(vm.$refs.middle, 'mousedown', e => { e.button = middle })
+    expect(spyMiddle).toHaveBeenCalled()
+  })
+
+  it('should support KeyboardEvent.key for built in aliases', () => {
+    vm = new Vue({
+      el,
+      template: `
+        <div>
+          <input ref="enter" @keyup.enter="foo">
+          <input ref="space" @keyup.space="foo">
+          <input ref="esc" @keyup.esc="foo">
+          <input ref="left" @keyup.left="foo">
+          <input ref="delete" @keyup.delete="foo">
+        </div>
+      `,
+      methods: { foo: spy }
+    })
+
+    triggerEvent(vm.$refs.enter, 'keyup', e => { e.key = 'Enter' })
+    expect(spy.calls.count()).toBe(1)
+    triggerEvent(vm.$refs.space, 'keyup', e => { e.key = ' ' })
+    expect(spy.calls.count()).toBe(2)
+    triggerEvent(vm.$refs.esc, 'keyup', e => { e.key = 'Escape' })
+    expect(spy.calls.count()).toBe(3)
+    triggerEvent(vm.$refs.left, 'keyup', e => { e.key = 'ArrowLeft' })
+    expect(spy.calls.count()).toBe(4)
+    triggerEvent(vm.$refs.delete, 'keyup', e => { e.key = 'Backspace' })
+    expect(spy.calls.count()).toBe(5)
+    triggerEvent(vm.$refs.delete, 'keyup', e => { e.key = 'Delete' })
+    expect(spy.calls.count()).toBe(6)
+  })
+
+  it('should support custom keyCode', () => {
+    Vue.config.keyCodes.test = 1
+    vm = new Vue({
+      el,
+      template: `<input @keyup.test="foo">`,
+      methods: { foo: spy }
+    })
+    triggerEvent(vm.$el, 'keyup', e => {
+      e.keyCode = 1
+    })
+    expect(spy).toHaveBeenCalled()
+    Vue.config.keyCodes = Object.create(null)
+  })
+
+  it('should override build-in keyCode', () => {
+    Vue.config.keyCodes.up = [1, 87]
+    vm = new Vue({
+      el,
+      template: `<input @keyup.up="foo" @keyup.down="foo">`,
+      methods: { foo: spy }
+    })
+    triggerEvent(vm.$el, 'keyup', e => {
+      e.keyCode = 87
+    })
+    expect(spy).toHaveBeenCalled()
+    triggerEvent(vm.$el, 'keyup', e => {
+      e.keyCode = 1
+    })
+    expect(spy).toHaveBeenCalledTimes(2)
+    // should not affect build-in down keycode
+    triggerEvent(vm.$el, 'keyup', e => {
+      e.keyCode = 40
+    })
+    expect(spy).toHaveBeenCalledTimes(3)
+    Vue.config.keyCodes = Object.create(null)
+  })
+
+  it('should bind to a child component', () => {
+    vm = new Vue({
+      el,
+      template: '<bar @custom="foo"></bar>',
+      methods: { foo: spy },
+      components: {
+        bar: {
+          template: '<span>Hello</span>'
+        }
+      }
+    })
+    vm.$children[0].$emit('custom', 'foo', 'bar')
+    expect(spy).toHaveBeenCalledWith('foo', 'bar')
+  })
+
+  it('should be able to bind native events for a child component', () => {
+    vm = new Vue({
+      el,
+      template: '<bar @click.native="foo"></bar>',
+      methods: { foo: spy },
+      components: {
+        bar: {
+          template: '<span>Hello</span>'
+        }
+      }
+    })
+    vm.$children[0].$emit('click')
+    expect(spy).not.toHaveBeenCalled()
+    triggerEvent(vm.$children[0].$el, 'click')
+    expect(spy).toHaveBeenCalled()
+  })
+
+  it('.once modifier should work with child components', () => {
+    vm = new Vue({
+      el,
+      template: '<bar @custom.once="foo"></bar>',
+      methods: { foo: spy },
+      components: {
+        bar: {
+          template: '<span>Hello</span>'
+        }
+      }
+    })
+    vm.$children[0].$emit('custom')
+    expect(spy.calls.count()).toBe(1)
+    vm.$children[0].$emit('custom')
+    expect(spy.calls.count()).toBe(1) // should not be called again
+  })
+
+  it('remove listener', done => {
+    const spy2 = jasmine.createSpy('remove listener')
+    vm = new Vue({
+      el,
+      methods: { foo: spy, bar: spy2 },
+      data: {
+        ok: true
+      },
+      render (h) {
+        return this.ok
+          ? h('input', { on: { click: this.foo }})
+          : h('input', { on: { input: this.bar }})
+      }
+    })
+    triggerEvent(vm.$el, 'click')
+    expect(spy.calls.count()).toBe(1)
+    expect(spy2.calls.count()).toBe(0)
+    vm.ok = false
+    waitForUpdate(() => {
+      triggerEvent(vm.$el, 'click')
+      expect(spy.calls.count()).toBe(1) // should no longer trigger
+      triggerEvent(vm.$el, 'input')
+      expect(spy2.calls.count()).toBe(1)
+    }).then(done)
+  })
+
+  it('remove capturing listener', done => {
+    const spy2 = jasmine.createSpy('remove listener')
+    vm = new Vue({
+      el,
+      methods: { foo: spy, bar: spy2, stopped (ev) { ev.stopPropagation() } },
+      data: {
+        ok: true
+      },
+      render (h) {
+        return this.ok
+          ? h('div', { on: { '!click': this.foo }}, [h('div', { on: { click: this.stopped }})])
+          : h('div', { on: { mouseOver: this.bar }}, [h('div')])
+      }
+    })
+    triggerEvent(vm.$el.firstChild, 'click')
+    expect(spy.calls.count()).toBe(1)
+    expect(spy2.calls.count()).toBe(0)
+    vm.ok = false
+    waitForUpdate(() => {
+      triggerEvent(vm.$el.firstChild, 'click')
+      expect(spy.calls.count()).toBe(1) // should no longer trigger
+      triggerEvent(vm.$el, 'mouseOver')
+      expect(spy2.calls.count()).toBe(1)
+    }).then(done)
+  })
+
+  it('remove once listener', done => {
+    const spy2 = jasmine.createSpy('remove listener')
+    vm = new Vue({
+      el,
+      methods: { foo: spy, bar: spy2 },
+      data: {
+        ok: true
+      },
+      render (h) {
+        return this.ok
+          ? h('input', { on: { '~click': this.foo }})
+          : h('input', { on: { input: this.bar }})
+      }
+    })
+    triggerEvent(vm.$el, 'click')
+    expect(spy.calls.count()).toBe(1)
+    triggerEvent(vm.$el, 'click')
+    expect(spy.calls.count()).toBe(1) // should no longer trigger
+    expect(spy2.calls.count()).toBe(0)
+    vm.ok = false
+    waitForUpdate(() => {
+      triggerEvent(vm.$el, 'click')
+      expect(spy.calls.count()).toBe(1) // should no longer trigger
+      triggerEvent(vm.$el, 'input')
+      expect(spy2.calls.count()).toBe(1)
+    }).then(done)
+  })
+
+  it('remove capturing and once listener', done => {
+    const spy2 = jasmine.createSpy('remove listener')
+    vm = new Vue({
+      el,
+      methods: { foo: spy, bar: spy2, stopped (ev) { ev.stopPropagation() } },
+      data: {
+        ok: true
+      },
+      render (h) {
+        return this.ok
+          ? h('div', { on: { '~!click': this.foo }}, [h('div', { on: { click: this.stopped }})])
+          : h('div', { on: { mouseOver: this.bar }}, [h('div')])
+      }
+    })
+    triggerEvent(vm.$el.firstChild, 'click')
+    expect(spy.calls.count()).toBe(1)
+    triggerEvent(vm.$el.firstChild, 'click')
+    expect(spy.calls.count()).toBe(1) // should no longer trigger
+    expect(spy2.calls.count()).toBe(0)
+    vm.ok = false
+    waitForUpdate(() => {
+      triggerEvent(vm.$el.firstChild, 'click')
+      expect(spy.calls.count()).toBe(1) // should no longer trigger
+      triggerEvent(vm.$el, 'mouseOver')
+      expect(spy2.calls.count()).toBe(1)
+    }).then(done)
+  })
+
+  it('remove listener on child component', done => {
+    const spy2 = jasmine.createSpy('remove listener')
+    vm = new Vue({
+      el,
+      methods: { foo: spy, bar: spy2 },
+      data: {
+        ok: true
+      },
+      components: {
+        test: {
+          template: '<div></div>'
+        }
+      },
+      render (h) {
+        return this.ok
+          ? h('test', { on: { foo: this.foo }})
+          : h('test', { on: { bar: this.bar }})
+      }
+    })
+    vm.$children[0].$emit('foo')
+    expect(spy.calls.count()).toBe(1)
+    expect(spy2.calls.count()).toBe(0)
+    vm.ok = false
+    waitForUpdate(() => {
+      vm.$children[0].$emit('foo')
+      expect(spy.calls.count()).toBe(1) // should no longer trigger
+      vm.$children[0].$emit('bar')
+      expect(spy2.calls.count()).toBe(1)
+    }).then(done)
+  })
+
+  it('warn missing handlers', () => {
+    vm = new Vue({
+      el,
+      data: { none: null },
+      template: `<div @click="none"></div>`
+    })
+    expect(`Invalid handler for event "click": got null`).toHaveBeenWarned()
+    expect(() => {
+      triggerEvent(vm.$el, 'click')
+    }).not.toThrow()
+  })
+
+  // Github Issue #5046
+  it('should support keyboard modifier for direction keys', () => {
+    const spyLeft = jasmine.createSpy()
+    const spyRight = jasmine.createSpy()
+    const spyUp = jasmine.createSpy()
+    const spyDown = jasmine.createSpy()
+    vm = new Vue({
+      el,
+      template: `
+        <div>
+          <input ref="left" @keydown.left="foo"></input>
+          <input ref="right" @keydown.right="foo1"></input>
+          <input ref="up" @keydown.up="foo2"></input>
+          <input ref="down" @keydown.down="foo3"></input>
+        </div>
+      `,
+      methods: {
+        foo: spyLeft,
+        foo1: spyRight,
+        foo2: spyUp,
+        foo3: spyDown
+      }
+    })
+    triggerEvent(vm.$refs.left, 'keydown', e => { e.keyCode = 37 })
+    triggerEvent(vm.$refs.left, 'keydown', e => { e.keyCode = 39 })
+
+    triggerEvent(vm.$refs.right, 'keydown', e => { e.keyCode = 39 })
+    triggerEvent(vm.$refs.right, 'keydown', e => { e.keyCode = 38 })
+
+    triggerEvent(vm.$refs.up, 'keydown', e => { e.keyCode = 38 })
+    triggerEvent(vm.$refs.up, 'keydown', e => { e.keyCode = 37 })
+
+    triggerEvent(vm.$refs.down, 'keydown', e => { e.keyCode = 40 })
+    triggerEvent(vm.$refs.down, 'keydown', e => { e.keyCode = 39 })
+
+    expect(spyLeft.calls.count()).toBe(1)
+    expect(spyRight.calls.count()).toBe(1)
+    expect(spyUp.calls.count()).toBe(1)
+    expect(spyDown.calls.count()).toBe(1)
+  })
+
+  // This test case should only run when the test browser supports passive.
+  if (supportsPassive) {
+    it('should support passive', () => {
+      vm = new Vue({
+        el,
+        template: `
+          <div>
+            <input type="checkbox" ref="normal" @click="foo"/>
+            <input type="checkbox" ref="passive" @click.passive="foo"/>
+            <input type="checkbox" ref="exclusive" @click.prevent.passive/>
+          </div>
+        `,
+        methods: {
+          foo (e) {
+            e.preventDefault()
+          }
+        }
+      })
+
+      vm.$refs.normal.checked = false
+      vm.$refs.passive.checked = false
+      vm.$refs.exclusive.checked = false
+      vm.$refs.normal.click()
+      vm.$refs.passive.click()
+      vm.$refs.exclusive.click()
+      expect(vm.$refs.normal.checked).toBe(false)
+      expect(vm.$refs.passive.checked).toBe(true)
+      expect(vm.$refs.exclusive.checked).toBe(true)
+      expect('passive and prevent can\'t be used together. Passive handler can\'t prevent default event.').toHaveBeenWarned()
+    })
+  }
+
+  // GitHub Issues #5146
+  it('should only prevent when match keycode', () => {
+    let prevented = false
+    vm = new Vue({
+      el,
+      template: `
+        <input ref="input" @keydown.enter.prevent="foo">
+      `,
+      methods: {
+        foo ($event) {
+          prevented = $event.defaultPrevented
+        }
+      }
+    })
+
+    triggerEvent(vm.$refs.input, 'keydown', e => { e.keyCode = 32 })
+    expect(prevented).toBe(false)
+    triggerEvent(vm.$refs.input, 'keydown', e => { e.keyCode = 13 })
+    expect(prevented).toBe(true)
+  })
+
+  it('should transform click.right to contextmenu', () => {
+    const spy = jasmine.createSpy('click.right')
+    const vm = new Vue({
+      template: `<div @click.right="foo"></div>`,
+      methods: { foo: spy }
+    }).$mount()
+
+    triggerEvent(vm.$el, 'contextmenu')
+    expect(spy).toHaveBeenCalled()
+  })
+
+  it('should transform click.middle to mouseup', () => {
+    const spy = jasmine.createSpy('click.middle')
+    const vm = new Vue({
+      template: `<div @click.middle="foo"></div>`,
+      methods: { foo: spy }
+    }).$mount()
+    triggerEvent(vm.$el, 'mouseup', e => { e.button = 0 })
+    expect(spy).not.toHaveBeenCalled()
+    triggerEvent(vm.$el, 'mouseup', e => { e.button = 1 })
+    expect(spy).toHaveBeenCalled()
+  })
+
+  it('object syntax (no argument)', () => {
+    const click = jasmine.createSpy('click')
+    const mouseup = jasmine.createSpy('mouseup')
+    vm = new Vue({
+      el,
+      template: `<button v-on="listeners">foo</button>`,
+      created () {
+        this.listeners = {
+          click,
+          mouseup
+        }
+      }
+    })
+
+    triggerEvent(vm.$el, 'click')
+    expect(click.calls.count()).toBe(1)
+    expect(mouseup.calls.count()).toBe(0)
+
+    triggerEvent(vm.$el, 'mouseup')
+    expect(click.calls.count()).toBe(1)
+    expect(mouseup.calls.count()).toBe(1)
+  })
+
+  it('object syntax (no argument, mixed with normal listeners)', () => {
+    const click1 = jasmine.createSpy('click1')
+    const click2 = jasmine.createSpy('click2')
+    const mouseup = jasmine.createSpy('mouseup')
+    vm = new Vue({
+      el,
+      template: `<button v-on="listeners" @click="click2">foo</button>`,
+      created () {
+        this.listeners = {
+          click: click1,
+          mouseup
+        }
+      },
+      methods: {
+        click2
+      }
+    })
+
+    triggerEvent(vm.$el, 'click')
+    expect(click1.calls.count()).toBe(1)
+    expect(click2.calls.count()).toBe(1)
+    expect(mouseup.calls.count()).toBe(0)
+
+    triggerEvent(vm.$el, 'mouseup')
+    expect(click1.calls.count()).toBe(1)
+    expect(click2.calls.count()).toBe(1)
+    expect(mouseup.calls.count()).toBe(1)
+  })
+
+  it('object syntax (usage in HOC, mixed with native listeners)', () => {
+    const click = jasmine.createSpy('click')
+    const mouseup = jasmine.createSpy('mouseup')
+    const mousedown = jasmine.createSpy('mousedown')
+
+    vm = new Vue({
+      el,
+      template: `
+        <foo-button
+          @click="click"
+          @mousedown="mousedown"
+          @mouseup.native="mouseup">
+        </foo-button>
+      `,
+      methods: {
+        click,
+        mouseup,
+        mousedown
+      },
+      components: {
+        fooButton: {
+          template: `
+            <button v-on="$listeners"></button>
+          `
+        }
+      }
+    })
+
+    triggerEvent(vm.$el, 'click')
+    expect(click.calls.count()).toBe(1)
+    expect(mouseup.calls.count()).toBe(0)
+    expect(mousedown.calls.count()).toBe(0)
+
+    triggerEvent(vm.$el, 'mouseup')
+    expect(click.calls.count()).toBe(1)
+    expect(mouseup.calls.count()).toBe(1)
+    expect(mousedown.calls.count()).toBe(0)
+
+    triggerEvent(vm.$el, 'mousedown')
+    expect(click.calls.count()).toBe(1)
+    expect(mouseup.calls.count()).toBe(1)
+    expect(mousedown.calls.count()).toBe(1)
+  })
+
+  // #6805 (v-on="object" bind order problem)
+  it('object syntax (no argument): should fire after high-priority listeners', done => {
+    const MyCheckbox = {
+      template: '<input type="checkbox" v-model="model" v-on="$listeners">',
+      props: {
+        value: false
+      },
+      computed: {
+        model: {
+          get () {
+            return this.value
+          },
+          set (val) {
+            this.$emit('input', val)
+          }
+        }
+      }
+    }
+
+    vm = new Vue({
+      el,
+      template: `
+        <div>
+          <my-checkbox v-model="check" @change="change"></my-checkbox>
+        </div>
+      `,
+      components: { MyCheckbox },
+      data: {
+        check: false
+      },
+      methods: {
+        change () {
+          expect(this.check).toBe(true)
+          done()
+        }
+      }
+    })
+
+    vm.$el.querySelector('input').click()
+  })
+
+  it('warn object syntax with modifier', () => {
+    new Vue({
+      template: `<button v-on.self="{}"></button>`
+    }).$mount()
+    expect(`v-on without argument does not support modifiers`).toHaveBeenWarned()
+  })
+
+  it('warn object syntax with non-object value', () => {
+    new Vue({
+      template: `<button v-on="123"></button>`
+    }).$mount()
+    expect(`v-on without argument expects an Object value`).toHaveBeenWarned()
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/features/directives/once.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/features/directives/once.spec.js
new file mode 100644 (file)
index 0000000..eca8be0
--- /dev/null
@@ -0,0 +1,364 @@
+import Vue from 'vue'
+
+describe('Directive v-once', () => {
+  it('should not rerender component', done => {
+    const vm = new Vue({
+      template: '<div v-once>{{ a }}</div>',
+      data: { a: 'hello' }
+    }).$mount()
+    expect(vm.$el.innerHTML).toBe('hello')
+    vm.a = 'world'
+    waitForUpdate(() => {
+      expect(vm.$el.innerHTML).toBe('hello')
+    }).then(done)
+  })
+
+  it('should not rerender self and child component', done => {
+    const vm = new Vue({
+      template: `
+        <div v-once>
+          <span>{{ a }}</span>
+          <item :b="a"></item>
+        </div>`,
+      data: { a: 'hello' },
+      components: {
+        item: {
+          template: '<div>{{ b }}</div>',
+          props: ['b']
+        }
+      }
+    }).$mount()
+    expect(vm.$children.length).toBe(1)
+    expect(vm.$el.innerHTML)
+      .toBe('<span>hello</span> <div>hello</div>')
+    vm.a = 'world'
+    waitForUpdate(() => {
+      expect(vm.$el.innerHTML)
+        .toBe('<span>hello</span> <div>hello</div>')
+    }).then(done)
+  })
+
+  it('should rerender parent but not self', done => {
+    const vm = new Vue({
+      template: `
+        <div>
+          <span>{{ a }}</span>
+          <item v-once :b="a"></item>
+        </div>`,
+      data: { a: 'hello' },
+      components: {
+        item: {
+          template: '<div>{{ b }}</div>',
+          props: ['b']
+        }
+      }
+    }).$mount()
+    expect(vm.$children.length).toBe(1)
+    expect(vm.$el.innerHTML)
+      .toBe('<span>hello</span> <div>hello</div>')
+    vm.a = 'world'
+    waitForUpdate(() => {
+      expect(vm.$el.innerHTML)
+        .toBe('<span>world</span> <div>hello</div>')
+    }).then(done)
+  })
+
+  it('should not rerender static sub nodes', done => {
+    const vm = new Vue({
+      template: `
+        <div>
+          <span v-once>{{ a }}</span>
+          <item :b="a"></item>
+          <span>{{ suffix }}</span>
+        </div>`,
+      data: {
+        a: 'hello',
+        suffix: '?'
+      },
+      components: {
+        item: {
+          template: '<div>{{ b }}</div>',
+          props: ['b']
+        }
+      }
+    }).$mount()
+    expect(vm.$el.innerHTML)
+      .toBe('<span>hello</span> <div>hello</div> <span>?</span>')
+    vm.a = 'world'
+    waitForUpdate(() => {
+      expect(vm.$el.innerHTML)
+        .toBe('<span>hello</span> <div>world</div> <span>?</span>')
+      vm.suffix = '!'
+    }).then(() => {
+      expect(vm.$el.innerHTML)
+        .toBe('<span>hello</span> <div>world</div> <span>!</span>')
+    }).then(done)
+  })
+
+  it('should work with v-if', done => {
+    const vm = new Vue({
+      data: {
+        tester: true,
+        yes: 'y',
+        no: 'n'
+      },
+      template: `
+        <div>
+          <div v-if="tester">{{ yes }}</div>
+          <div v-else>{{ no }}</div>
+          <div v-if="tester" v-once>{{ yes }}</div>
+          <div v-else>{{ no }}</div>
+          <div v-if="tester">{{ yes }}</div>
+          <div v-else v-once>{{ no }}</div>
+          <div v-if="tester" v-once>{{ yes }}</div>
+          <div v-else v-once>{{ no }}</div>
+        </div>
+      `
+    }).$mount()
+    expectTextContent(vm, 'yyyy')
+    vm.yes = 'yes'
+    waitForUpdate(() => {
+      expectTextContent(vm, 'yesyyesy')
+      vm.tester = false
+    }).then(() => {
+      expectTextContent(vm, 'nnnn')
+      vm.no = 'no'
+    }).then(() => {
+      expectTextContent(vm, 'nononn')
+    }).then(done)
+  })
+
+  it('should work with v-for', done => {
+    const vm = new Vue({
+      data: {
+        list: [1, 2, 3]
+      },
+      template: `<div><div v-for="i in list" v-once>{{i}}</div></div>`
+    }).$mount()
+    expect(vm.$el.textContent).toBe('123')
+    vm.list.reverse()
+    waitForUpdate(() => {
+      expect(vm.$el.textContent).toBe('123')
+    }).then(done)
+  })
+
+  it('should work inside v-for', done => {
+    const vm = new Vue({
+      data: {
+        list: [
+          { id: 0, text: 'a' },
+          { id: 1, text: 'b' },
+          { id: 2, text: 'c' }
+        ]
+      },
+      template: `
+        <div>
+          <div v-for="i in list" :key="i.id">
+            <div>
+              <span v-once>{{ i.text }}</span><span>{{ i.text }}</span>
+            </div>
+          </div>
+        </div>
+      `
+    }).$mount()
+
+    expect(vm.$el.textContent).toBe('aabbcc')
+
+    vm.list[0].text = 'd'
+    waitForUpdate(() => {
+      expect(vm.$el.textContent).toBe('adbbcc')
+      vm.list[1].text = 'e'
+    }).then(() => {
+      expect(vm.$el.textContent).toBe('adbecc')
+      vm.list.reverse()
+    }).then(() => {
+      expect(vm.$el.textContent).toBe('ccbead')
+    }).then(done)
+  })
+
+  it('should work inside v-for with v-if', done => {
+    const vm = new Vue({
+      data: {
+        list: [
+          { id: 0, text: 'a', tester: true, truthy: 'y' }
+        ]
+      },
+      template: `
+        <div>
+          <div v-for="i in list" :key="i.id">
+              <span v-if="i.tester" v-once>{{ i.truthy }}</span>
+              <span v-else v-once>{{ i.text }}</span>
+              <span v-if="i.tester" v-once>{{ i.truthy }}</span>
+              <span v-else>{{ i.text }}</span>
+              <span v-if="i.tester">{{ i.truthy }}</span>
+              <span v-else v-once>{{ i.text }}</span>
+              <span v-if="i.tester">{{ i.truthy }}</span>
+              <span v-else>{{ i.text }}</span>
+          </div>
+        </div>
+      `
+    }).$mount()
+
+    expectTextContent(vm, 'yyyy')
+
+    vm.list[0].truthy = 'yy'
+    waitForUpdate(() => {
+      expectTextContent(vm, 'yyyyyy')
+      vm.list[0].tester = false
+    }).then(() => {
+      expectTextContent(vm, 'aaaa')
+      vm.list[0].text = 'nn'
+    }).then(() => {
+      expectTextContent(vm, 'annann')
+    }).then(done)
+  })
+
+  it('should work inside v-for with nested v-else', done => {
+    const vm = new Vue({
+      data: {
+        list: [{ id: 0, text: 'a', tester: true, truthy: 'y' }]
+      },
+      template: `
+        <div v-if="0"></div>
+        <div v-else>
+          <div v-for="i in list" :key="i.id">
+            <span v-if="i.tester" v-once>{{ i.truthy }}</span>
+            <span v-else v-once>{{ i.text }}</span>
+          </div>
+        </div>
+      `
+    }).$mount()
+
+    expectTextContent(vm, 'y')
+    vm.list[0].truthy = 'yy'
+    waitForUpdate(() => {
+      expectTextContent(vm, 'y')
+      vm.list[0].tester = false
+    }).then(() => {
+      expectTextContent(vm, 'a')
+      vm.list[0].text = 'nn'
+    }).then(() => {
+      expectTextContent(vm, 'a')
+    }).then(done)
+  })
+
+  it('should work inside v-for with nested v-else-if and v-else', done => {
+    const vm = new Vue({
+      data: {
+        tester: false,
+        list: [{ id: 0, text: 'a', tester: true, truthy: 'y' }]
+      },
+      template: `
+        <div v-if="0"></div>
+        <div v-else-if="tester">
+          <div v-for="i in list" :key="i.id">
+            <span v-if="i.tester" v-once>{{ i.truthy }}</span>
+            <span v-else-if="tester" v-once>{{ i.text }}elseif</span>
+            <span v-else v-once>{{ i.text }}</span>
+          </div>
+        </div>
+        <div v-else>
+          <div v-for="i in list" :key="i.id">
+            <span v-if="i.tester" v-once>{{ i.truthy }}</span>
+            <span v-else-if="tester">{{ i.text }}elseif</span>
+            <span v-else v-once>{{ i.text }}</span>
+          </div>
+        </div>
+      `
+    }).$mount()
+
+    expectTextContent(vm, 'y')
+    vm.list[0].truthy = 'yy'
+    waitForUpdate(() => {
+      expectTextContent(vm, 'y')
+      vm.list[0].tester = false
+    }).then(() => {
+      expectTextContent(vm, 'a')
+      vm.list[0].text = 'nn'
+    }).then(() => {
+      expectTextContent(vm, 'a')
+      vm.tester = true
+    }).then(() => {
+      expectTextContent(vm, 'nnelseif')
+      vm.list[0].text = 'xx'
+    }).then(() => {
+      expectTextContent(vm, 'nnelseif')
+      vm.list[0].tester = true
+    }).then(() => {
+      expectTextContent(vm, 'yy')
+      vm.list[0].truthy = 'nn'
+    }).then(() => {
+      expectTextContent(vm, 'yy')
+    }).then(done)
+  })
+
+  it('should warn inside non-keyed v-for', () => {
+    const vm = new Vue({
+      data: {
+        list: [
+          { id: 0, text: 'a' },
+          { id: 1, text: 'b' },
+          { id: 2, text: 'c' }
+        ]
+      },
+      template: `
+        <div>
+          <div v-for="i in list">
+            <span v-once>{{ i.text }}</span><span>{{ i.text }}</span>
+          </div>
+        </div>
+      `
+    }).$mount()
+
+    expect(vm.$el.textContent).toBe('aabbcc')
+    expect(`v-once can only be used inside v-for that is keyed.`).toHaveBeenWarned()
+  })
+
+  // #4288
+  it('should inherit child reference for v-once', done => {
+    const vm = new Vue({
+      template: `<div>{{a}}<test v-if="ok" v-once></test></div>`,
+      data: {
+        a: 0,
+        ok: true
+      },
+      components: {
+        test: {
+          template: '<div>foo</div>'
+        }
+      }
+    }).$mount()
+    vm.a++ // first update to force a patch
+    waitForUpdate(() => {
+      expect(vm.$el.textContent).toBe('1foo')
+    }).then(() => {
+      vm.ok = false // teardown component with v-once
+    }).then(done) // should not throw
+  })
+
+  // #6826
+  it('should render different component instances properly', done => {
+    const vm = new Vue({
+      components: {
+        foo: {
+          props: ['name'],
+          template: '<div v-once>{{ name }}</div>'
+        }
+      },
+      template: `
+        <div>
+          <foo name="a" v-once></foo>
+          <foo name="b" v-once></foo>
+        </div>
+      `
+    }).$mount()
+    waitForUpdate(() => {
+      expect(vm.$el.children[0].innerHTML).toBe('a')
+      expect(vm.$el.children[1].innerHTML).toBe('b')
+    }).then(done)
+  })
+})
+
+function expectTextContent (vm, text) {
+  expect(vm.$el.textContent.replace(/\s+/g, '')).toBe(text)
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/features/directives/pre.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/features/directives/pre.spec.js
new file mode 100644 (file)
index 0000000..92d3bc8
--- /dev/null
@@ -0,0 +1,34 @@
+import Vue from 'vue'
+
+describe('Directive v-pre', function () {
+  it('should not compile inner content', function () {
+    const vm = new Vue({
+      template: `<div>
+        <div v-pre>{{ a }}</div>
+        <div>{{ a }}</div>
+        <div v-pre>
+          <component></component>
+        </div>
+      </div>`,
+      data: {
+        a: 123
+      }
+    })
+    vm.$mount()
+    expect(vm.$el.firstChild.textContent).toBe('{{ a }}')
+    expect(vm.$el.children[1].textContent).toBe('123')
+    expect(vm.$el.lastChild.innerHTML).toBe('<component></component>')
+  })
+
+  it('should not compile on root node', function () {
+    const vm = new Vue({
+      template: '<div v-pre>{{ a }}</div>',
+      replace: true,
+      data: {
+        a: 123
+      }
+    })
+    vm.$mount()
+    expect(vm.$el.firstChild.textContent).toBe('{{ a }}')
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/features/directives/show.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/features/directives/show.spec.js
new file mode 100644 (file)
index 0000000..dd50957
--- /dev/null
@@ -0,0 +1,84 @@
+import Vue from 'vue'
+
+describe('Directive v-show', () => {
+  it('should check show value is truthy', () => {
+    const vm = new Vue({
+      template: '<div><span v-show="foo">hello</span></div>',
+      data: { foo: true }
+    }).$mount()
+    expect(vm.$el.firstChild.style.display).toBe('')
+  })
+
+  it('should check show value is falsy', () => {
+    const vm = new Vue({
+      template: '<div><span v-show="foo">hello</span></div>',
+      data: { foo: false }
+    }).$mount()
+    expect(vm.$el.firstChild.style.display).toBe('none')
+  })
+
+  it('should update show value changed', done => {
+    const vm = new Vue({
+      template: '<div><span v-show="foo">hello</span></div>',
+      data: { foo: true }
+    }).$mount()
+    expect(vm.$el.firstChild.style.display).toBe('')
+    vm.foo = false
+    waitForUpdate(() => {
+      expect(vm.$el.firstChild.style.display).toBe('none')
+      vm.foo = {}
+    }).then(() => {
+      expect(vm.$el.firstChild.style.display).toBe('')
+      vm.foo = 0
+    }).then(() => {
+      expect(vm.$el.firstChild.style.display).toBe('none')
+      vm.foo = []
+    }).then(() => {
+      expect(vm.$el.firstChild.style.display).toBe('')
+      vm.foo = null
+    }).then(() => {
+      expect(vm.$el.firstChild.style.display).toBe('none')
+      vm.foo = '0'
+    }).then(() => {
+      expect(vm.$el.firstChild.style.display).toBe('')
+      vm.foo = undefined
+    }).then(() => {
+      expect(vm.$el.firstChild.style.display).toBe('none')
+      vm.foo = 1
+    }).then(() => {
+      expect(vm.$el.firstChild.style.display).toBe('')
+    }).then(done)
+  })
+
+  it('should respect display value in style attribute', done => {
+    const vm = new Vue({
+      template: '<div><span v-show="foo" style="display:block">hello</span></div>',
+      data: { foo: true }
+    }).$mount()
+    expect(vm.$el.firstChild.style.display).toBe('block')
+    vm.foo = false
+    waitForUpdate(() => {
+      expect(vm.$el.firstChild.style.display).toBe('none')
+      vm.foo = true
+    }).then(() => {
+      expect(vm.$el.firstChild.style.display).toBe('block')
+    }).then(done)
+  })
+
+  it('should support unbind when reused', done => {
+    const vm = new Vue({
+      template:
+        '<div v-if="tester"><span v-show="false"></span></div>' +
+        '<div v-else><span @click="tester=!tester">show</span></div>',
+      data: { tester: true }
+    }).$mount()
+    expect(vm.$el.firstChild.style.display).toBe('none')
+    vm.tester = false
+    waitForUpdate(() => {
+      expect(vm.$el.firstChild.style.display).toBe('')
+      vm.tester = true
+    }).then(() => {
+      expect(vm.$el.firstChild.style.display).toBe('none')
+    }).then(done)
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/features/directives/static-style-parser.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/features/directives/static-style-parser.spec.js
new file mode 100644 (file)
index 0000000..13dd675
--- /dev/null
@@ -0,0 +1,41 @@
+import { parseStyleText } from 'web/util/style'
+const base64ImgUrl = 'url("data:image/webp;base64,UklGRkoAAABXRUJQVlA4WAoAAAAQAAAAAAAAAAAAQUxQSAwAAAARBxAR/Q9ERP8DAABWUDggGAAAABQBAJ0BKgEAAQAAAP4AAA3AAP7mtQAAAA==")'
+const logoUrl = 'url(https://vuejs.org/images/logo.png)'
+
+it('should parse normal static style', () => {
+  const staticStyle = `font-size: 12px;background: ${logoUrl};color:red`
+  const res = parseStyleText(staticStyle)
+  expect(res.background).toBe(logoUrl)
+  expect(res.color).toBe('red')
+  expect(res['font-size']).toBe('12px')
+})
+
+it('should parse base64 background', () => {
+  const staticStyle = `background: ${base64ImgUrl}`
+  const res = parseStyleText(staticStyle)
+  expect(res.background).toBe(base64ImgUrl)
+})
+
+it('should parse multiple background images ', () => {
+  let staticStyle = `background: ${logoUrl}, ${logoUrl};`
+  let res = parseStyleText(staticStyle)
+  expect(res.background).toBe(`${logoUrl}, ${logoUrl}`)
+
+  staticStyle = `background: ${base64ImgUrl}, ${base64ImgUrl}`
+  res = parseStyleText(staticStyle)
+  expect(res.background).toBe(`${base64ImgUrl}, ${base64ImgUrl}`)
+})
+
+it('should parse other images ', () => {
+  let staticStyle = `shape-outside: ${logoUrl}`
+  let res = parseStyleText(staticStyle)
+  expect(res['shape-outside']).toBe(logoUrl)
+
+  staticStyle = `list-style-image: ${logoUrl}`
+  res = parseStyleText(staticStyle)
+  expect(res['list-style-image']).toBe(logoUrl)
+
+  staticStyle = `border-image: ${logoUrl} 30 30 repeat`
+  res = parseStyleText(staticStyle)
+  expect(res['border-image']).toBe(`${logoUrl} 30 30 repeat`)
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/features/directives/style.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/features/directives/style.spec.js
new file mode 100644 (file)
index 0000000..1d8f68b
--- /dev/null
@@ -0,0 +1,381 @@
+import Vue from 'vue'
+
+function checkPrefixedProp (prop) {
+  var el = document.createElement('div')
+  var upper = prop.charAt(0).toUpperCase() + prop.slice(1)
+  if (!(prop in el.style)) {
+    var prefixes = ['Webkit', 'Moz', 'ms']
+    var i = prefixes.length
+    while (i--) {
+      if ((prefixes[i] + upper) in el.style) {
+        prop = prefixes[i] + upper
+      }
+    }
+  }
+  return prop
+}
+
+describe('Directive v-bind:style', () => {
+  let vm
+
+  beforeEach(() => {
+    vm = new Vue({
+      template: '<div :style="styles"></div>',
+      data () {
+        return {
+          styles: {},
+          fontSize: 16
+        }
+      }
+    }).$mount()
+  })
+
+  it('string', done => {
+    vm.styles = 'color:red;'
+    waitForUpdate(() => {
+      expect(vm.$el.style.cssText.replace(/\s/g, '')).toBe('color:red;')
+    }).then(done)
+  })
+
+  it('falsy number', done => {
+    vm.styles = { opacity: 0 }
+    waitForUpdate(() => {
+      expect(vm.$el.style.opacity).toBe('0')
+    }).then(done)
+  })
+
+  it('plain object', done => {
+    vm.styles = { color: 'red' }
+    waitForUpdate(() => {
+      expect(vm.$el.style.cssText.replace(/\s/g, '')).toBe('color:red;')
+    }).then(done)
+  })
+
+  it('camelCase', done => {
+    vm.styles = { marginRight: '10px' }
+    waitForUpdate(() => {
+      expect(vm.$el.style.marginRight).toBe('10px')
+    }).then(done)
+  })
+
+  it('remove if falsy value', done => {
+    vm.$el.style.color = 'red'
+    waitForUpdate(() => {
+      vm.styles = { color: null }
+    }).then(() => {
+      expect(vm.$el.style.color).toBe('')
+    }).then(done)
+  })
+
+  it('ignore unsupported property', done => {
+    vm.styles = { foo: 'bar' }
+    waitForUpdate(() => {
+      expect(vm.$el.style.foo).not.toBe('bar')
+    }).then(done)
+  })
+
+  it('auto prefix', done => {
+    const prop = checkPrefixedProp('transform')
+    const val = 'scale(0.5)'
+    vm.styles = { transform: val }
+    waitForUpdate(() => {
+      expect(vm.$el.style[prop]).toBe(val)
+    }).then(done)
+  })
+
+  it('auto-prefixed style value as array', done => {
+    vm.styles = { display: ['-webkit-box', '-ms-flexbox', 'flex'] }
+    const testEl = document.createElement('div')
+    vm.styles.display.forEach(value => {
+      testEl.style.display = value
+    })
+    waitForUpdate(() => {
+      expect(vm.$el.style.display).toBe(testEl.style.display)
+    }).then(done)
+  })
+
+  it('!important', done => {
+    vm.styles = { display: 'block !important' }
+    waitForUpdate(() => {
+      expect(vm.$el.style.getPropertyPriority('display')).toBe('important')
+    }).then(done)
+  })
+
+  it('object with multiple entries', done => {
+    vm.$el.style.color = 'red'
+    vm.styles = {
+      marginLeft: '10px',
+      marginRight: '15px'
+    }
+    waitForUpdate(() => {
+      expect(vm.$el.style.getPropertyValue('color')).toBe('red')
+      expect(vm.$el.style.getPropertyValue('margin-left')).toBe('10px')
+      expect(vm.$el.style.getPropertyValue('margin-right')).toBe('15px')
+      vm.styles = {
+        color: 'blue',
+        padding: null
+      }
+    }).then(() => {
+      expect(vm.$el.style.getPropertyValue('color')).toBe('blue')
+      expect(vm.$el.style.getPropertyValue('padding')).toBeFalsy()
+      expect(vm.$el.style.getPropertyValue('margin-left')).toBeFalsy()
+      expect(vm.$el.style.getPropertyValue('margin-right')).toBeFalsy()
+      // handle falsy value
+      vm.styles = null
+    }).then(() => {
+      expect(vm.$el.style.getPropertyValue('color')).toBeFalsy()
+      expect(vm.$el.style.getPropertyValue('padding')).toBeFalsy()
+      expect(vm.$el.style.getPropertyValue('margin-left')).toBeFalsy()
+      expect(vm.$el.style.getPropertyValue('margin-right')).toBeFalsy()
+    }).then(done)
+  })
+
+  it('array of objects', done => {
+    vm.$el.style.padding = '10px'
+    vm.styles = [{ color: 'red' }, { marginRight: '20px' }]
+
+    waitForUpdate(() => {
+      expect(vm.$el.style.getPropertyValue('color')).toBe('red')
+      expect(vm.$el.style.getPropertyValue('margin-right')).toBe('20px')
+      expect(vm.$el.style.getPropertyValue('padding')).toBe('10px')
+      vm.styles = [{ color: 'blue' }, { padding: null }]
+    }).then(() => {
+      expect(vm.$el.style.getPropertyValue('color')).toBe('blue')
+      expect(vm.$el.style.getPropertyValue('margin-right')).toBeFalsy()
+      expect(vm.$el.style.getPropertyValue('padding')).toBeFalsy()
+    }).then(done)
+  })
+
+  it('updates objects deeply', done => {
+    vm.styles = { display: 'none' }
+    waitForUpdate(() => {
+      expect(vm.$el.style.display).toBe('none')
+      vm.styles.display = 'block'
+    }).then(() => {
+      expect(vm.$el.style.display).toBe('block')
+    }).then(done)
+  })
+
+  it('background size with only one value', done => {
+    vm.styles = { backgroundSize: '100%' }
+    waitForUpdate(() => {
+      expect(vm.$el.style.cssText.replace(/\s/g, '')).toMatch(/background-size:100%(auto)?;/)
+    }).then(done)
+  })
+
+  it('should work with interpolation', done => {
+    vm.styles = { fontSize: `${vm.fontSize}px` }
+    waitForUpdate(() => {
+      expect(vm.$el.style.fontSize).toBe('16px')
+    }).then(done)
+  })
+
+  const supportCssVariable = () => {
+    const el = document.createElement('div')
+    el.style.setProperty('--color', 'red')
+    return el.style.getPropertyValue('--color') === 'red'
+  }
+
+  if (supportCssVariable()) {
+    it('CSS variables', done => {
+      vm.styles = { '--color': 'red' }
+      waitForUpdate(() => {
+        expect(vm.$el.style.getPropertyValue('--color')).toBe('red')
+      }).then(done)
+    })
+  }
+
+  it('should merge static style with binding style', () => {
+    const vm = new Vue({
+      template: '<div style="background: url(https://vuejs.org/images/logo.png);color: blue" :style="test"></div>',
+      data: {
+        test: { color: 'red', fontSize: '12px' }
+      }
+    }).$mount()
+    const style = vm.$el.style
+    expect(style.getPropertyValue('background-image')).toMatch('https://vuejs.org/images/logo.png')
+    expect(style.getPropertyValue('color')).toBe('red')
+    expect(style.getPropertyValue('font-size')).toBe('12px')
+  })
+
+  it('should merge between parent and child', done => {
+    const vm = new Vue({
+      template: '<child style="text-align: left;margin-right:20px" :style="test"></child>',
+      data: {
+        test: { color: 'red', fontSize: '12px' }
+      },
+      components: {
+        child: {
+          template: '<div style="margin-right:10px;" :style="{marginLeft: marginLeft}"></div>',
+          data: () => ({ marginLeft: '16px' })
+        }
+      }
+    }).$mount()
+    const style = vm.$el.style
+    const child = vm.$children[0]
+    const css = style.cssText.replace(/\s/g, '')
+    expect(css).toContain('margin-right:20px;')
+    expect(css).toContain('margin-left:16px;')
+    expect(css).toContain('text-align:left;')
+    expect(css).toContain('color:red;')
+    expect(css).toContain('font-size:12px;')
+    expect(style.color).toBe('red')
+    expect(style.marginRight).toBe('20px')
+    vm.test.color = 'blue'
+    waitForUpdate(() => {
+      expect(style.color).toBe('blue')
+      child.marginLeft = '30px'
+    }).then(() => {
+      expect(style.marginLeft).toBe('30px')
+      child.fontSize = '30px'
+    }).then(() => {
+      expect(style.fontSize).toBe('12px')
+    }).then(done)
+  })
+
+  it('should not pass to child root element', () => {
+    const vm = new Vue({
+      template: '<child :style="test"></child>',
+      data: {
+        test: { color: 'red', fontSize: '12px' }
+      },
+      components: {
+        child: {
+          template: '<div><nested ref="nested" style="color: blue;text-align:left"></nested></div>',
+          components: {
+            nested: {
+              template: '<div></div>'
+            }
+          }
+        }
+      }
+    }).$mount()
+    const style = vm.$el.style
+    expect(style.color).toBe('red')
+    expect(style.textAlign).toBe('')
+    expect(style.fontSize).toBe('12px')
+    expect(vm.$children[0].$refs.nested.$el.style.color).toBe('blue')
+  })
+
+  it('should merge between nested components', (done) => {
+    const vm = new Vue({
+      template: '<child :style="test"></child>',
+      data: {
+        test: { color: 'red', fontSize: '12px' }
+      },
+      components: {
+        child: {
+          template: '<nested style="color: blue;text-align:left"></nested>',
+          components: {
+            nested: {
+              template: '<div style="margin-left: 12px;" :style="nestedStyle"></div>',
+              data: () => ({ nestedStyle: { marginLeft: '30px' }})
+            }
+          }
+        }
+      }
+    }).$mount()
+    const style = vm.$el.style
+    const child = vm.$children[0].$children[0]
+    expect(style.color).toBe('red')
+    expect(style.marginLeft).toBe('30px')
+    expect(style.textAlign).toBe('left')
+    expect(style.fontSize).toBe('12px')
+    vm.test.color = 'yellow'
+    waitForUpdate(() => {
+      child.nestedStyle.marginLeft = '60px'
+    }).then(() => {
+      expect(style.marginLeft).toBe('60px')
+      child.nestedStyle = {
+        fontSize: '14px',
+        marginLeft: '40px'
+      }
+    }).then(() => {
+      expect(style.fontSize).toBe('12px')
+      expect(style.marginLeft).toBe('40px')
+    }).then(done)
+  })
+
+  it('should not merge for different adjacent elements', (done) => {
+    const vm = new Vue({
+      template:
+        '<div>' +
+          '<section style="color: blue" :style="style" v-if="!bool"></section>' +
+          '<div></div>' +
+          '<section style="margin-top: 12px" v-if="bool"></section>' +
+        '</div>',
+      data: {
+        bool: false,
+        style: {
+          fontSize: '12px'
+        }
+      }
+    }).$mount()
+    const style = vm.$el.children[0].style
+    expect(style.fontSize).toBe('12px')
+    expect(style.color).toBe('blue')
+    waitForUpdate(() => {
+      vm.bool = true
+    }).then(() => {
+      expect(style.color).toBe('')
+      expect(style.fontSize).toBe('')
+      expect(style.marginTop).toBe('12px')
+    }).then(done)
+  })
+
+  it('should not merge for v-if, v-else-if and v-else elements', (done) => {
+    const vm = new Vue({
+      template:
+        '<div>' +
+          '<section style="color: blue" :style="style" v-if="foo"></section>' +
+          '<section style="margin-top: 12px" v-else-if="bar"></section>' +
+          '<section style="margin-bottom: 24px" v-else></section>' +
+          '<div></div>' +
+        '</div>',
+      data: {
+        foo: true,
+        bar: false,
+        style: {
+          fontSize: '12px'
+        }
+      }
+    }).$mount()
+    const style = vm.$el.children[0].style
+    expect(style.fontSize).toBe('12px')
+    expect(style.color).toBe('blue')
+    waitForUpdate(() => {
+      vm.foo = false
+    }).then(() => {
+      expect(style.color).toBe('')
+      expect(style.fontSize).toBe('')
+      expect(style.marginBottom).toBe('24px')
+      vm.bar = true
+    }).then(() => {
+      expect(style.color).toBe('')
+      expect(style.fontSize).toBe('')
+      expect(style.marginBottom).toBe('')
+      expect(style.marginTop).toBe('12px')
+    }).then(done)
+  })
+
+  // #5318
+  it('should work for elements passed down as a slot', done => {
+    const vm = new Vue({
+      template: `<test><div :style="style"/></test>`,
+      data: {
+        style: { color: 'red' }
+      },
+      components: {
+        test: {
+          template: `<div><slot/></div>`
+        }
+      }
+    }).$mount()
+
+    expect(vm.$el.children[0].style.color).toBe('red')
+    vm.style.color = 'green'
+    waitForUpdate(() => {
+      expect(vm.$el.children[0].style.color).toBe('green')
+    }).then(done)
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/features/directives/text.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/features/directives/text.spec.js
new file mode 100644 (file)
index 0000000..477badf
--- /dev/null
@@ -0,0 +1,53 @@
+import Vue from 'vue'
+
+describe('Directive v-text', () => {
+  it('should render text', () => {
+    const vm = new Vue({
+      template: '<div v-text="a"></div>',
+      data: { a: 'hello' }
+    }).$mount()
+    expect(vm.$el.innerHTML).toBe('hello')
+  })
+
+  it('should encode html entities', () => {
+    const vm = new Vue({
+      template: '<div v-text="a"></div>',
+      data: { a: '<foo>' }
+    }).$mount()
+    expect(vm.$el.innerHTML).toBe('&lt;foo&gt;')
+  })
+
+  it('should support all value types', done => {
+    const vm = new Vue({
+      template: '<div v-text="a"></div>',
+      data: { a: false }
+    }).$mount()
+    waitForUpdate(() => {
+      expect(vm.$el.innerHTML).toBe('false')
+      vm.a = []
+    }).then(() => {
+      expect(vm.$el.innerHTML).toBe('[]')
+      vm.a = {}
+    }).then(() => {
+      expect(vm.$el.innerHTML).toBe('{}')
+      vm.a = 123
+    }).then(() => {
+      expect(vm.$el.innerHTML).toBe('123')
+      vm.a = 0
+    }).then(() => {
+      expect(vm.$el.innerHTML).toBe('0')
+      vm.a = ' '
+    }).then(() => {
+      expect(vm.$el.innerHTML).toBe(' ')
+      vm.a = '    '
+    }).then(() => {
+      expect(vm.$el.innerHTML).toBe('    ')
+      vm.a = null
+    }).then(() => {
+      expect(vm.$el.innerHTML).toBe('')
+      vm.a = undefined
+    }).then(() => {
+      expect(vm.$el.innerHTML).toBe('')
+    }).then(done)
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/features/error-handling.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/features/error-handling.spec.js
new file mode 100644 (file)
index 0000000..217bb72
--- /dev/null
@@ -0,0 +1,287 @@
+import Vue from 'vue'
+
+const components = createErrorTestComponents()
+
+describe('Error handling', () => {
+  // hooks that prevents the component from rendering, but should not
+  // break parent component
+  ;[
+    ['data', 'data()'],
+    ['render', 'render'],
+    ['beforeCreate', 'beforeCreate hook'],
+    ['created', 'created hook'],
+    ['beforeMount', 'beforeMount hook'],
+    ['directive bind', 'directive foo bind hook'],
+    ['event', 'event handler for "e"']
+  ].forEach(([type, description]) => {
+    it(`should recover from errors in ${type}`, done => {
+      const vm = createTestInstance(components[type])
+      expect(`Error in ${description}`).toHaveBeenWarned()
+      expect(`Error: ${type}`).toHaveBeenWarned()
+      assertRootInstanceActive(vm).then(done)
+    })
+  })
+
+  // error in mounted hook should affect neither child nor parent
+  it('should recover from errors in mounted hook', done => {
+    const vm = createTestInstance(components.mounted)
+    expect(`Error in mounted hook`).toHaveBeenWarned()
+    expect(`Error: mounted`).toHaveBeenWarned()
+    assertBothInstancesActive(vm).then(done)
+  })
+
+  // error in beforeUpdate/updated should affect neither child nor parent
+  ;[
+    ['beforeUpdate', 'beforeUpdate hook'],
+    ['updated', 'updated hook'],
+    ['directive update', 'directive foo update hook']
+  ].forEach(([type, description]) => {
+    it(`should recover from errors in ${type} hook`, done => {
+      const vm = createTestInstance(components[type])
+      assertBothInstancesActive(vm).then(() => {
+        expect(`Error in ${description}`).toHaveBeenWarned()
+        expect(`Error: ${type}`).toHaveBeenWarned()
+      }).then(done)
+    })
+  })
+
+  ;[
+    ['beforeDestroy', 'beforeDestroy hook'],
+    ['destroyed', 'destroyed hook'],
+    ['directive unbind', 'directive foo unbind hook']
+  ].forEach(([type, description]) => {
+    it(`should recover from errors in ${type} hook`, done => {
+      const vm = createTestInstance(components[type])
+      vm.ok = false
+      waitForUpdate(() => {
+        expect(`Error in ${description}`).toHaveBeenWarned()
+        expect(`Error: ${type}`).toHaveBeenWarned()
+      }).thenWaitFor(next => {
+        assertRootInstanceActive(vm).end(next)
+      }).then(done)
+    })
+  })
+
+  it('should recover from errors in user watcher getter', done => {
+    const vm = createTestInstance(components.userWatcherGetter)
+    vm.n++
+    waitForUpdate(() => {
+      expect(`Error in getter for watcher`).toHaveBeenWarned()
+      function getErrorMsg () {
+        try {
+          this.a.b.c
+        } catch (e) {
+          return e.toString()
+        }
+      }
+      const msg = getErrorMsg.call(vm)
+      expect(msg).toHaveBeenWarned()
+    }).thenWaitFor(next => {
+      assertBothInstancesActive(vm).end(next)
+    }).then(done)
+  })
+
+  it('should recover from errors in user watcher callback', done => {
+    const vm = createTestInstance(components.userWatcherCallback)
+    vm.n++
+    waitForUpdate(() => {
+      expect(`Error in callback for watcher "n"`).toHaveBeenWarned()
+      expect(`Error: userWatcherCallback`).toHaveBeenWarned()
+    }).thenWaitFor(next => {
+      assertBothInstancesActive(vm).end(next)
+    }).then(done)
+  })
+
+  it('config.errorHandler should capture render errors', done => {
+    const spy = Vue.config.errorHandler = jasmine.createSpy('errorHandler')
+    const vm = createTestInstance(components.render)
+
+    const args = spy.calls.argsFor(0)
+    expect(args[0].toString()).toContain('Error: render') // error
+    expect(args[1]).toBe(vm.$refs.child) // vm
+    expect(args[2]).toContain('render') // description
+
+    assertRootInstanceActive(vm).then(() => {
+      Vue.config.errorHandler = null
+    }).then(done)
+  })
+
+  it('should capture and recover from nextTick errors', done => {
+    const err1 = new Error('nextTick')
+    const err2 = new Error('nextTick2')
+    const spy = Vue.config.errorHandler = jasmine.createSpy('errorHandler')
+    Vue.nextTick(() => { throw err1 })
+    Vue.nextTick(() => {
+      expect(spy).toHaveBeenCalledWith(err1, undefined, 'nextTick')
+
+      const vm = new Vue()
+      vm.$nextTick(() => { throw err2 })
+      Vue.nextTick(() => {
+        // should be called with correct instance info
+        expect(spy).toHaveBeenCalledWith(err2, vm, 'nextTick')
+        Vue.config.errorHandler = null
+        done()
+      })
+    })
+  })
+
+  it('should recover from errors thrown in errorHandler itself', () => {
+    Vue.config.errorHandler = () => {
+      throw new Error('error in errorHandler ¯\\_(ツ)_/¯')
+    }
+    const vm = new Vue({
+      render (h) {
+        throw new Error('error in render')
+      },
+      renderError (h, err) {
+        return h('div', err.toString())
+      }
+    }).$mount()
+    expect('error in errorHandler').toHaveBeenWarned()
+    expect('error in render').toHaveBeenWarned()
+    expect(vm.$el.textContent).toContain('error in render')
+    Vue.config.errorHandler = null
+  })
+})
+
+function createErrorTestComponents () {
+  const components = {}
+
+  // data
+  components.data = {
+    data () {
+      throw new Error('data')
+    },
+    render (h) {
+      return h('div')
+    }
+  }
+
+  // render error
+  components.render = {
+    render (h) {
+      throw new Error('render')
+    }
+  }
+
+  // lifecycle errors
+  ;['create', 'mount', 'update', 'destroy'].forEach(hook => {
+    // before
+    const before = 'before' + hook.charAt(0).toUpperCase() + hook.slice(1)
+    const beforeComp = components[before] = {
+      props: ['n'],
+      render (h) {
+        return h('div', this.n)
+      }
+    }
+    beforeComp[before] = function () {
+      throw new Error(before)
+    }
+
+    // after
+    const after = hook.replace(/e?$/, 'ed')
+    const afterComp = components[after] = {
+      props: ['n'],
+      render (h) {
+        return h('div', this.n)
+      }
+    }
+    afterComp[after] = function () {
+      throw new Error(after)
+    }
+  })
+
+  // directive hooks errors
+  ;['bind', 'update', 'unbind'].forEach(hook => {
+    const key = 'directive ' + hook
+    const dirComp = components[key] = {
+      props: ['n'],
+      template: `<div v-foo="n">{{ n }}</div>`
+    }
+    const dirFoo = {}
+    dirFoo[hook] = function () {
+      throw new Error(key)
+    }
+    dirComp.directives = {
+      foo: dirFoo
+    }
+  })
+
+  // user watcher
+  components.userWatcherGetter = {
+    props: ['n'],
+    created () {
+      this.$watch(function () {
+        return this.n + this.a.b.c
+      }, val => {
+        console.log('user watcher fired: ' + val)
+      })
+    },
+    render (h) {
+      return h('div', this.n)
+    }
+  }
+
+  components.userWatcherCallback = {
+    props: ['n'],
+    watch: {
+      n () {
+        throw new Error('userWatcherCallback error')
+      }
+    },
+    render (h) {
+      return h('div', this.n)
+    }
+  }
+
+  // event errors
+  components.event = {
+    beforeCreate () {
+      this.$on('e', () => { throw new Error('event') })
+    },
+    mounted () {
+      this.$emit('e')
+    },
+    render (h) {
+      return h('div')
+    }
+  }
+
+  return components
+}
+
+function createTestInstance (Comp) {
+  return new Vue({
+    data: {
+      n: 0,
+      ok: true
+    },
+    render (h) {
+      return h('div', [
+        'n:' + this.n + '\n',
+        this.ok
+          ? h(Comp, { ref: 'child', props: { n: this.n }})
+          : null
+      ])
+    }
+  }).$mount()
+}
+
+function assertRootInstanceActive (vm, chain) {
+  expect(vm.$el.innerHTML).toContain('n:0\n')
+  vm.n++
+  return waitForUpdate(() => {
+    expect(vm.$el.innerHTML).toContain('n:1\n')
+  })
+}
+
+function assertBothInstancesActive (vm) {
+  vm.n = 0
+  return waitForUpdate(() => {
+    expect(vm.$refs.child.$el.innerHTML).toContain('0')
+  }).thenWaitFor(next => {
+    assertRootInstanceActive(vm).then(() => {
+      expect(vm.$refs.child.$el.innerHTML).toContain('1')
+    }).end(next)
+  })
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/features/filter/filter.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/features/filter/filter.spec.js
new file mode 100644 (file)
index 0000000..82c57a3
--- /dev/null
@@ -0,0 +1,197 @@
+import Vue from 'vue'
+import { parseFilters } from 'compiler/parser/filter-parser'
+
+describe('Filters', () => {
+  it('basic usage', () => {
+    const vm = new Vue({
+      template: '<div>{{ msg | upper }}</div>',
+      data: {
+        msg: 'hi'
+      },
+      filters: {
+        upper: v => v.toUpperCase()
+      }
+    }).$mount()
+    expect(vm.$el.textContent).toBe('HI')
+  })
+
+  it('chained usage', () => {
+    const vm = new Vue({
+      template: '<div>{{ msg | upper | reverse }}</div>',
+      data: {
+        msg: 'hi'
+      },
+      filters: {
+        upper: v => v.toUpperCase(),
+        reverse: v => v.split('').reverse().join('')
+      }
+    }).$mount()
+    expect(vm.$el.textContent).toBe('IH')
+  })
+
+  it('in v-bind', () => {
+    const vm = new Vue({
+      template: `
+        <div
+          v-bind:id="id | upper | reverse"
+          :class="cls | reverse"
+          :ref="ref | lower">
+        </div>
+      `,
+      filters: {
+        upper: v => v.toUpperCase(),
+        reverse: v => v.split('').reverse().join(''),
+        lower: v => v.toLowerCase()
+      },
+      data: {
+        id: 'abc',
+        cls: 'foo',
+        ref: 'BAR'
+      }
+    }).$mount()
+    expect(vm.$el.id).toBe('CBA')
+    expect(vm.$el.className).toBe('oof')
+    expect(vm.$refs.bar).toBe(vm.$el)
+  })
+
+  it('handle regex with pipe', () => {
+    const vm = new Vue({
+      template: `<test ref="test" :pattern="/a|b\\// | identity"></test>`,
+      filters: { identity: v => v },
+      components: {
+        test: {
+          props: ['pattern'],
+          template: '<div></div>'
+        }
+      }
+    }).$mount()
+    expect(vm.$refs.test.pattern instanceof RegExp).toBe(true)
+    expect(vm.$refs.test.pattern.toString()).toBe('/a|b\\//')
+  })
+
+  it('handle division', () => {
+    const vm = new Vue({
+      data: { a: 2 },
+      template: `<div>{{ 1/a / 4 | double }}</div>`,
+      filters: { double: v => v * 2 }
+    }).$mount()
+    expect(vm.$el.textContent).toBe(String(1 / 4))
+  })
+
+  it('handle division with parenthesis', () => {
+    const vm = new Vue({
+      data: { a: 20 },
+      template: `<div>{{ (a*2) / 5 | double }}</div>`,
+      filters: { double: v => v * 2 }
+    }).$mount()
+    expect(vm.$el.textContent).toBe(String(16))
+  })
+
+  it('handle division with dot', () => {
+    const vm = new Vue({
+      template: `<div>{{ 20. / 5 | double }}</div>`,
+      filters: { double: v => v * 2 }
+    }).$mount()
+    expect(vm.$el.textContent).toBe(String(8))
+  })
+
+  it('handle division with array values', () => {
+    const vm = new Vue({
+      data: { a: [20] },
+      template: `<div>{{ a[0] / 5 | double }}</div>`,
+      filters: { double: v => v * 2 }
+    }).$mount()
+    expect(vm.$el.textContent).toBe(String(8))
+  })
+
+  it('handle division with hash values', () => {
+    const vm = new Vue({
+      data: { a: { n: 20 }},
+      template: `<div>{{ a['n'] / 5 | double }}</div>`,
+      filters: { double: v => v * 2 }
+    }).$mount()
+    expect(vm.$el.textContent).toBe(String(8))
+  })
+
+  it('handle division with variable_', () => {
+    const vm = new Vue({
+      data: { a_: 8 },
+      template: `<div>{{ a_ / 2 | double }}</div>`,
+      filters: { double: v => v * 2 }
+    }).$mount()
+    expect(vm.$el.textContent).toBe(String(8))
+  })
+
+  it('arguments', () => {
+    const vm = new Vue({
+      template: `<div>{{ msg | add(a, 3) }}</div>`,
+      data: {
+        msg: 1,
+        a: 2
+      },
+      filters: {
+        add: (v, arg1, arg2) => v + arg1 + arg2
+      }
+    }).$mount()
+    expect(vm.$el.textContent).toBe('6')
+  })
+
+  it('quotes', () => {
+    const vm = new Vue({
+      template: `<div>{{ msg + "b | c" + 'd' | upper }}</div>`,
+      data: {
+        msg: 'a'
+      },
+      filters: {
+        upper: v => v.toUpperCase()
+      }
+    }).$mount()
+    expect(vm.$el.textContent).toBe('AB | CD')
+  })
+
+  it('double pipe', () => {
+    const vm = new Vue({
+      template: `<div>{{ b || msg | upper }}</div>`,
+      data: {
+        b: false,
+        msg: 'a'
+      },
+      filters: {
+        upper: v => v.toUpperCase()
+      }
+    }).$mount()
+    expect(vm.$el.textContent).toBe('A')
+  })
+
+  it('object literal', () => {
+    const vm = new Vue({
+      template: `<div>{{ { a: 123 } | pick('a') }}</div>`,
+      filters: {
+        pick: (v, key) => v[key]
+      }
+    }).$mount()
+    expect(vm.$el.textContent).toBe('123')
+  })
+
+  it('array literal', () => {
+    const vm = new Vue({
+      template: `<div>{{ [1, 2, 3] | reverse }}</div>`,
+      filters: {
+        reverse: arr => arr.reverse().join(',')
+      }
+    }).$mount()
+    expect(vm.$el.textContent).toBe('3,2,1')
+  })
+
+  it('warn non-existent', () => {
+    new Vue({
+      template: '<div>{{ msg | upper }}</div>',
+      data: { msg: 'foo' }
+    }).$mount()
+    expect('Failed to resolve filter: upper').toHaveBeenWarned()
+  })
+
+  it('support template string', () => {
+    expect(parseFilters('`a | ${b}c` | d')).toBe('_f("d")(`a | ${b}c`)')
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/features/global-api/assets.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/features/global-api/assets.spec.js
new file mode 100644 (file)
index 0000000..41e6b5f
--- /dev/null
@@ -0,0 +1,68 @@
+import Vue from 'vue'
+
+describe('Global API: assets', () => {
+  const Test = Vue.extend()
+
+  it('directive / filters', () => {
+    const assets = ['directive', 'filter']
+    assets.forEach(function (type) {
+      const def = {}
+      Test[type]('test', def)
+      expect(Test.options[type + 's'].test).toBe(def)
+      expect(Test[type]('test')).toBe(def)
+      // extended registration should not pollute global
+      expect(Vue.options[type + 's'].test).toBeUndefined()
+    })
+  })
+
+  describe('Vue.component', () => {
+    it('should register a component', () => {
+      Vue.component('foo', {
+        template: '<span>foo</span>'
+      })
+      Vue.component('bar', {
+        template: '<span>bar</span>'
+      })
+      const vm = new Vue({
+        template: '<div><foo></foo><bar></bar></div>'
+      }).$mount()
+      expect(vm.$el.innerHTML).toBe('<span>foo</span><span>bar</span>')
+      // unregister them
+      delete Vue.options.components.foo
+      delete Vue.options.components.bar
+    })
+  })
+
+  it('component on extended constructor', () => {
+    const def = { a: 1 }
+    Test.component('test', def)
+    const component = Test.options.components.test
+    expect(typeof component).toBe('function')
+    expect(component.super).toBe(Vue)
+    expect(component.options.a).toBe(1)
+    expect(component.options.name).toBe('test')
+    expect(Test.component('test')).toBe(component)
+    // already extended
+    Test.component('test2', component)
+    expect(Test.component('test2')).toBe(component)
+    // extended registration should not pollute global
+    expect(Vue.options.components.test).toBeUndefined()
+  })
+
+  // #4434
+  it('local registration should take priority regardless of naming convention', () => {
+    Vue.component('x-foo', {
+      template: '<span>global</span>'
+    })
+    const vm = new Vue({
+      components: {
+        xFoo: {
+          template: '<span>local</span>'
+        }
+      },
+      template: '<div><x-foo></x-foo></div>'
+    }).$mount()
+    expect(vm.$el.textContent).toBe('local')
+    delete Vue.options.components['x-foo']
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/features/global-api/compile.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/features/global-api/compile.spec.js
new file mode 100644 (file)
index 0000000..64ce0ee
--- /dev/null
@@ -0,0 +1,15 @@
+import Vue from 'vue'
+
+describe('Global API: compile', () => {
+  it('should compile render functions', () => {
+    const res = Vue.compile('<div><span>{{ msg }}</span></div>')
+    const vm = new Vue({
+      data: {
+        msg: 'hello'
+      },
+      render: res.render,
+      staticRenderFns: res.staticRenderFns
+    }).$mount()
+    expect(vm.$el.innerHTML).toContain('<span>hello</span>')
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/features/global-api/config.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/features/global-api/config.spec.js
new file mode 100644 (file)
index 0000000..1edfc3c
--- /dev/null
@@ -0,0 +1,58 @@
+import Vue from 'vue'
+import { warn } from 'core/util/debug'
+
+describe('Global config', () => {
+  it('should warn replacing config object', () => {
+    const originalConfig = Vue.config
+    Vue.config = {}
+    expect(Vue.config).toBe(originalConfig)
+    expect('Do not replace the Vue.config object').toHaveBeenWarned()
+  })
+
+  describe('silent', () => {
+    it('should be false by default', () => {
+      warn('foo')
+      expect('foo').toHaveBeenWarned()
+    })
+
+    it('should work when set to true', () => {
+      Vue.config.silent = true
+      warn('foo')
+      expect('foo').not.toHaveBeenWarned()
+      Vue.config.silent = false
+    })
+  })
+
+  describe('optionMergeStrategies', () => {
+    it('should allow defining custom option merging strategies', () => {
+      const spy = jasmine.createSpy('option merging')
+      Vue.config.optionMergeStrategies.__test__ = (parent, child, vm) => {
+        spy(parent, child, vm)
+        return child + 1
+      }
+      const Test = Vue.extend({
+        __test__: 1
+      })
+      expect(spy.calls.count()).toBe(1)
+      expect(spy).toHaveBeenCalledWith(undefined, 1, undefined)
+      expect(Test.options.__test__).toBe(2)
+      const test = new Test({
+        __test__: 2
+      })
+      expect(spy.calls.count()).toBe(2)
+      expect(spy).toHaveBeenCalledWith(2, 2, test)
+      expect(test.$options.__test__).toBe(3)
+    })
+  })
+
+  describe('ignoredElements', () => {
+    it('should work', () => {
+      Vue.config.ignoredElements = ['foo', /^ion-/]
+      new Vue({
+        template: `<div><foo/><ion-foo/><ion-bar/></div>`
+      }).$mount()
+      expect('Unknown custom element').not.toHaveBeenWarned()
+      Vue.config.ignoredElements = []
+    })
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/features/global-api/extend.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/features/global-api/extend.spec.js
new file mode 100644 (file)
index 0000000..4a4a735
--- /dev/null
@@ -0,0 +1,134 @@
+import Vue from 'vue'
+
+describe('Global API: extend', () => {
+  it('should correctly merge options', () => {
+    const Test = Vue.extend({
+      name: 'test',
+      a: 1,
+      b: 2
+    })
+    expect(Test.options.a).toBe(1)
+    expect(Test.options.b).toBe(2)
+    expect(Test.super).toBe(Vue)
+    const t = new Test({
+      a: 2
+    })
+    expect(t.$options.a).toBe(2)
+    expect(t.$options.b).toBe(2)
+    // inheritance
+    const Test2 = Test.extend({
+      a: 2
+    })
+    expect(Test2.options.a).toBe(2)
+    expect(Test2.options.b).toBe(2)
+    const t2 = new Test2({
+      a: 3
+    })
+    expect(t2.$options.a).toBe(3)
+    expect(t2.$options.b).toBe(2)
+  })
+
+  it('should warn invalid names', () => {
+    Vue.extend({ name: '123' })
+    expect('Invalid component name: "123"').toHaveBeenWarned()
+    Vue.extend({ name: '_fesf' })
+    expect('Invalid component name: "_fesf"').toHaveBeenWarned()
+    Vue.extend({ name: 'Some App' })
+    expect('Invalid component name: "Some App"').toHaveBeenWarned()
+  })
+
+  it('should work when used as components', () => {
+    const foo = Vue.extend({
+      template: '<span>foo</span>'
+    })
+    const bar = Vue.extend({
+      template: '<span>bar</span>'
+    })
+    const vm = new Vue({
+      template: '<div><foo></foo><bar></bar></div>',
+      components: { foo, bar }
+    }).$mount()
+    expect(vm.$el.innerHTML).toBe('<span>foo</span><span>bar</span>')
+  })
+
+  it('should merge lifecycle hooks', () => {
+    const calls = []
+    const A = Vue.extend({
+      created () {
+        calls.push(1)
+      }
+    })
+    const B = A.extend({
+      created () {
+        calls.push(2)
+      }
+    })
+    new B({
+      created () {
+        calls.push(3)
+      }
+    })
+    expect(calls).toEqual([1, 2, 3])
+  })
+
+  it('should merge methods', () => {
+    const A = Vue.extend({
+      methods: {
+        a () { return this.n }
+      }
+    })
+    const B = A.extend({
+      methods: {
+        b () { return this.n + 1 }
+      }
+    })
+    const b = new B({
+      data: { n: 0 },
+      methods: {
+        c () { return this.n + 2 }
+      }
+    })
+    expect(b.a()).toBe(0)
+    expect(b.b()).toBe(1)
+    expect(b.c()).toBe(2)
+  })
+
+  it('should merge assets', () => {
+    const A = Vue.extend({
+      components: {
+        aa: {
+          template: '<div>A</div>'
+        }
+      }
+    })
+    const B = A.extend({
+      components: {
+        bb: {
+          template: '<div>B</div>'
+        }
+      }
+    })
+    const b = new B({
+      template: '<div><aa></aa><bb></bb></div>'
+    }).$mount()
+    expect(b.$el.innerHTML).toBe('<div>A</div><div>B</div>')
+  })
+
+  it('caching', () => {
+    const options = {
+      template: '<div></div>'
+    }
+    const A = Vue.extend(options)
+    const B = Vue.extend(options)
+    expect(A).toBe(B)
+  })
+
+  // #4767
+  it('extended options should use different identify from parent', () => {
+    const A = Vue.extend({ computed: {}})
+    const B = A.extend()
+    B.options.computed.b = () => 'foo'
+    expect(B.options.computed).not.toBe(A.options.computed)
+    expect(A.options.computed.b).toBeUndefined()
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/features/global-api/mixin.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/features/global-api/mixin.spec.js
new file mode 100644 (file)
index 0000000..bcf9624
--- /dev/null
@@ -0,0 +1,165 @@
+import Vue from 'vue'
+
+describe('Global API: mixin', () => {
+  let options
+  beforeEach(() => { options = Vue.options })
+  afterEach(() => { Vue.options = options })
+
+  it('should work', () => {
+    const spy = jasmine.createSpy('global mixin')
+    Vue.mixin({
+      created () {
+        spy(this.$options.myOption)
+      }
+    })
+    new Vue({
+      myOption: 'hello'
+    })
+    expect(spy).toHaveBeenCalledWith('hello')
+  })
+
+  it('should work for constructors created before mixin is applied', () => {
+    const calls = []
+    const Test = Vue.extend({
+      name: 'test',
+      beforeCreate () {
+        calls.push(this.$options.myOption + ' local')
+      }
+    })
+    Vue.mixin({
+      beforeCreate () {
+        calls.push(this.$options.myOption + ' global')
+      }
+    })
+    expect(Test.options.name).toBe('test')
+    new Test({
+      myOption: 'hello'
+    })
+    expect(calls).toEqual(['hello global', 'hello local'])
+  })
+
+  // #3957
+  it('should work for global props', () => {
+    const Test = Vue.extend({
+      template: `<div>{{ prop }}</div>`
+    })
+
+    Vue.mixin({
+      props: ['prop']
+    })
+
+    // test child component
+    const vm = new Vue({
+      template: '<test prop="hi"></test>',
+      components: { Test }
+    }).$mount()
+
+    expect(vm.$el.textContent).toBe('hi')
+  })
+
+  // vue-loader#433
+  it('should not drop late-set render functions', () => {
+    const Test = Vue.extend({})
+    Test.options.render = h => h('div', 'hello')
+
+    Vue.mixin({})
+
+    const vm = new Vue({
+      render: h => h(Test)
+    }).$mount()
+
+    expect(vm.$el.textContent).toBe('hello')
+  })
+
+  // #4266
+  it('should not drop scopedId', () => {
+    const Test = Vue.extend({})
+    Test.options._scopeId = 'foo'
+
+    Vue.mixin({})
+
+    const vm = new Test({
+      template: '<div><p>hi</p></div>'
+    }).$mount()
+
+    expect(vm.$el.children[0].hasAttribute('foo')).toBe(true)
+  })
+
+  // #4976
+  it('should not drop late-attached custom options on existing constructors', () => {
+    const baseSpy = jasmine.createSpy('base')
+    const Base = Vue.extend({
+      beforeCreate: baseSpy
+    })
+
+    const Test = Base.extend({})
+
+    // Inject options later
+    // vue-loader and vue-hot-reload-api are doing like this
+    Test.options.computed = {
+      $style: () => 123
+    }
+
+    const spy = jasmine.createSpy('late attached')
+    Test.options.beforeCreate = Test.options.beforeCreate.concat(spy)
+
+    // Update super constructor's options
+    const mixinSpy = jasmine.createSpy('mixin')
+    Vue.mixin({
+      beforeCreate: mixinSpy
+    })
+
+    // mount the component
+    const vm = new Test({
+      template: '<div>{{ $style }}</div>'
+    }).$mount()
+
+    expect(spy.calls.count()).toBe(1)
+    expect(baseSpy.calls.count()).toBe(1)
+    expect(mixinSpy.calls.count()).toBe(1)
+    expect(vm.$el.textContent).toBe('123')
+    expect(vm.$style).toBe(123)
+
+    // Should not be dropped
+    expect(Test.options.computed.$style()).toBe(123)
+    expect(Test.options.beforeCreate).toEqual([mixinSpy, baseSpy, spy])
+  })
+
+  // vue-class-component#83
+  it('should work for a constructor mixin', () => {
+    const spy = jasmine.createSpy('global mixin')
+    const Mixin = Vue.extend({
+      created () {
+        spy(this.$options.myOption)
+      }
+    })
+
+    Vue.mixin(Mixin)
+
+    new Vue({
+      myOption: 'hello'
+    })
+    expect(spy).toHaveBeenCalledWith('hello')
+  })
+
+  // vue-class-component#87
+  it('should not drop original lifecycle hooks', () => {
+    const base = jasmine.createSpy('base')
+
+    const Base = Vue.extend({
+      beforeCreate: base
+    })
+
+    const injected = jasmine.createSpy('injected')
+
+    // inject a function
+    Base.options.beforeCreate = Base.options.beforeCreate.concat(injected)
+
+    Vue.mixin({})
+
+    new Base({})
+
+    expect(base).toHaveBeenCalled()
+    expect(injected).toHaveBeenCalled()
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/features/global-api/set-delete.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/features/global-api/set-delete.spec.js
new file mode 100644 (file)
index 0000000..d1c7f3d
--- /dev/null
@@ -0,0 +1,170 @@
+import Vue from 'vue'
+
+describe('Global API: set/delete', () => {
+  describe('Vue.set', () => {
+    it('should update a vue object', done => {
+      const vm = new Vue({
+        template: '<div>{{x}}</div>',
+        data: { x: 1 }
+      }).$mount()
+      expect(vm.$el.innerHTML).toBe('1')
+      Vue.set(vm, 'x', 2)
+      waitForUpdate(() => {
+        expect(vm.$el.innerHTML).toBe('2')
+      }).then(done)
+    })
+
+    it('should update a observing object', done => {
+      const vm = new Vue({
+        template: '<div>{{foo.x}}</div>',
+        data: { foo: { x: 1 }}
+      }).$mount()
+      expect(vm.$el.innerHTML).toBe('1')
+      Vue.set(vm.foo, 'x', 2)
+      waitForUpdate(() => {
+        expect(vm.$el.innerHTML).toBe('2')
+      }).then(done)
+    })
+
+    it('should update a observing array', done => {
+      const vm = new Vue({
+        template: '<div><div v-for="v,k in list">{{k}}-{{v}}</div></div>',
+        data: { list: ['a', 'b', 'c'] }
+      }).$mount()
+      expect(vm.$el.innerHTML).toBe('<div>0-a</div><div>1-b</div><div>2-c</div>')
+      Vue.set(vm.list, 1, 'd')
+      waitForUpdate(() => {
+        expect(vm.$el.innerHTML).toBe('<div>0-a</div><div>1-d</div><div>2-c</div>')
+        Vue.set(vm.list, '2', 'e')
+      }).then(() => {
+        expect(vm.$el.innerHTML).toBe('<div>0-a</div><div>1-d</div><div>2-e</div>')
+        /* eslint-disable no-new-wrappers */
+        Vue.set(vm.list, new Number(1), 'f')
+      }).then(() => {
+        expect(vm.$el.innerHTML).toBe('<div>0-a</div><div>1-f</div><div>2-e</div>')
+        Vue.set(vm.list, '3g', 'g')
+      }).then(() => {
+        expect(vm.$el.innerHTML).toBe('<div>0-a</div><div>1-f</div><div>2-e</div>')
+      }).then(done)
+    })
+
+    it('should update a vue object with nothing', done => {
+      const vm = new Vue({
+        template: '<div>{{x}}</div>',
+        data: { x: 1 }
+      }).$mount()
+      expect(vm.$el.innerHTML).toBe('1')
+      Vue.set(vm, 'x', null)
+      waitForUpdate(() => {
+        expect(vm.$el.innerHTML).toBe('')
+        Vue.set(vm, 'x')
+      }).then(() => {
+        expect(vm.$el.innerHTML).toBe('')
+      }).then(done)
+    })
+
+    it('be able to use string type index in array', done => {
+      const vm = new Vue({
+        template: '<div><p v-for="obj in lists">{{obj.name}}</p></div>',
+        data: {
+          lists: [
+            { name: 'A' },
+            { name: 'B' },
+            { name: 'C' }
+          ]
+        }
+      }).$mount()
+      expect(vm.$el.innerHTML).toBe('<p>A</p><p>B</p><p>C</p>')
+      Vue.set(vm.lists, '0', { name: 'D' })
+      waitForUpdate(() => {
+        expect(vm.$el.innerHTML).toBe('<p>D</p><p>B</p><p>C</p>')
+      }).then(done)
+    })
+
+    // #6845
+    it('should not overwrite properties on prototype chain', () => {
+      class Model {
+        constructor () {
+          this._bar = null
+        }
+        get bar () {
+          return this._bar
+        }
+        set bar (newvalue) {
+          this._bar = newvalue
+        }
+      }
+
+      const vm = new Vue({
+        data: {
+          data: new Model()
+        }
+      })
+
+      Vue.set(vm.data, 'bar', 123)
+      expect(vm.data.bar).toBe(123)
+      expect(vm.data.hasOwnProperty('bar')).toBe(false)
+      expect(vm.data._bar).toBe(123)
+    })
+  })
+
+  describe('Vue.delete', () => {
+    it('should delete a key', done => {
+      const vm = new Vue({
+        template: '<div>{{obj.x}}</div>',
+        data: { obj: { x: 1 }}
+      }).$mount()
+      expect(vm.$el.innerHTML).toBe('1')
+      vm.obj.x = 2
+      waitForUpdate(() => {
+        expect(vm.$el.innerHTML).toBe('2')
+        Vue.delete(vm.obj, 'x')
+      }).then(() => {
+        expect(vm.$el.innerHTML).toBe('')
+        vm.obj.x = 3
+      }).then(() => {
+        expect(vm.$el.innerHTML).toBe('')
+      }).then(done)
+    })
+
+    it('be able to delete an item in array', done => {
+      const vm = new Vue({
+        template: '<div><p v-for="obj in lists">{{obj.name}}</p></div>',
+        data: {
+          lists: [
+            { name: 'A' },
+            { name: 'B' },
+            { name: 'C' }
+          ]
+        }
+      }).$mount()
+      expect(vm.$el.innerHTML).toBe('<p>A</p><p>B</p><p>C</p>')
+      Vue.delete(vm.lists, 1)
+      waitForUpdate(() => {
+        expect(vm.$el.innerHTML).toBe('<p>A</p><p>C</p>')
+        Vue.delete(vm.lists, NaN)
+      }).then(() => {
+        expect(vm.$el.innerHTML).toBe('<p>A</p><p>C</p>')
+        Vue.delete(vm.lists, -1)
+      }).then(() => {
+        expect(vm.$el.innerHTML).toBe('<p>A</p><p>C</p>')
+        Vue.delete(vm.lists, '1.3')
+      }).then(() => {
+        expect(vm.$el.innerHTML).toBe('<p>A</p><p>C</p>')
+        Vue.delete(vm.lists, true)
+      }).then(() => {
+        expect(vm.$el.innerHTML).toBe('<p>A</p><p>C</p>')
+        Vue.delete(vm.lists, {})
+      }).then(() => {
+        expect(vm.$el.innerHTML).toBe('<p>A</p><p>C</p>')
+        Vue.delete(vm.lists, '1')
+      }).then(() => {
+        expect(vm.$el.innerHTML).toBe('<p>A</p>')
+        /* eslint-disable no-new-wrappers */
+        Vue.delete(vm.lists, new Number(0))
+      }).then(() => {
+        expect(vm.$el.innerHTML).toBe('')
+      }).then(done)
+    })
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/features/global-api/use.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/features/global-api/use.spec.js
new file mode 100644 (file)
index 0000000..00053f8
--- /dev/null
@@ -0,0 +1,52 @@
+import Vue from 'vue'
+
+describe('Global API: use', () => {
+  const def = {}
+  const options = {}
+  const pluginStub = {
+    install: (Vue, opts) => {
+      Vue.directive('plugin-test', def)
+      expect(opts).toBe(options)
+    }
+  }
+
+  it('should apply Object plugin', () => {
+    Vue.use(pluginStub, options)
+    expect(Vue.options.directives['plugin-test']).toBe(def)
+    delete Vue.options.directives['plugin-test']
+    expect(Vue.options.directives['plugin-test']).toBeUndefined()
+
+    // should not double apply
+    Vue.use(pluginStub, options)
+    expect(Vue.options.directives['plugin-test']).toBeUndefined()
+  })
+
+  it('should apply Function plugin', () => {
+    Vue.use(pluginStub.install, options)
+    expect(Vue.options.directives['plugin-test']).toBe(def)
+    delete Vue.options.directives['plugin-test']
+  })
+
+  it('should work on extended constructors without polluting the base', () => {
+    const Ctor = Vue.extend({})
+    Ctor.use(pluginStub, options)
+    expect(Vue.options.directives['plugin-test']).toBeUndefined()
+    expect(Ctor.options.directives['plugin-test']).toBe(def)
+  })
+
+  // GitHub issue #5970
+  it('should work on multi version', () => {
+    const Ctor1 = Vue.extend({})
+    const Ctor2 = Vue.extend({})
+
+    Ctor1.use(pluginStub, options)
+    expect(Vue.options.directives['plugin-test']).toBeUndefined()
+    expect(Ctor1.options.directives['plugin-test']).toBe(def)
+
+    // multi version Vue Ctor with the same cid
+    Ctor2.cid = Ctor1.cid
+    Ctor2.use(pluginStub, options)
+    expect(Vue.options.directives['plugin-test']).toBeUndefined()
+    expect(Ctor2.options.directives['plugin-test']).toBe(def)
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/features/instance/init.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/features/instance/init.spec.js
new file mode 100644 (file)
index 0000000..62cc06d
--- /dev/null
@@ -0,0 +1,12 @@
+import Vue from 'vue'
+
+describe('Initialization', () => {
+  it('without new', () => {
+    try { Vue() } catch (e) {}
+    expect('Vue is a constructor and should be called with the `new` keyword').toHaveBeenWarned()
+  })
+
+  it('with new', () => {
+    expect(new Vue() instanceof Vue).toBe(true)
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/features/instance/methods-data.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/features/instance/methods-data.spec.js
new file mode 100644 (file)
index 0000000..8684c69
--- /dev/null
@@ -0,0 +1,116 @@
+import Vue from 'vue'
+
+describe('Instance methods data', () => {
+  it('$set/$delete', done => {
+    const vm = new Vue({
+      template: '<div>{{ a.msg }}</div>',
+      data: {
+        a: {}
+      }
+    }).$mount()
+    expect(vm.$el.innerHTML).toBe('')
+    vm.$set(vm.a, 'msg', 'hello')
+    waitForUpdate(() => {
+      expect(vm.$el.innerHTML).toBe('hello')
+      vm.$delete(vm.a, 'msg')
+    }).then(() => {
+      expect(vm.$el.innerHTML).toBe('')
+    }).then(done)
+  })
+
+  describe('$watch', () => {
+    let vm, spy
+    beforeEach(() => {
+      spy = jasmine.createSpy('watch')
+      vm = new Vue({
+        data: {
+          a: {
+            b: 1
+          }
+        },
+        methods: {
+          foo: spy
+        }
+      })
+    })
+
+    it('basic usage', done => {
+      vm.$watch('a.b', spy)
+      vm.a.b = 2
+      waitForUpdate(() => {
+        expect(spy.calls.count()).toBe(1)
+        expect(spy).toHaveBeenCalledWith(2, 1)
+        vm.a = { b: 3 }
+      }).then(() => {
+        expect(spy.calls.count()).toBe(2)
+        expect(spy).toHaveBeenCalledWith(3, 2)
+      }).then(done)
+    })
+
+    it('immediate', () => {
+      vm.$watch('a.b', spy, { immediate: true })
+      expect(spy.calls.count()).toBe(1)
+      expect(spy).toHaveBeenCalledWith(1)
+    })
+
+    it('unwatch', done => {
+      const unwatch = vm.$watch('a.b', spy)
+      unwatch()
+      vm.a.b = 2
+      waitForUpdate(() => {
+        expect(spy.calls.count()).toBe(0)
+      }).then(done)
+    })
+
+    it('function watch', done => {
+      vm.$watch(function () {
+        return this.a.b
+      }, spy)
+      vm.a.b = 2
+      waitForUpdate(() => {
+        expect(spy).toHaveBeenCalledWith(2, 1)
+      }).then(done)
+    })
+
+    it('deep watch', done => {
+      var oldA = vm.a
+      vm.$watch('a', spy, { deep: true })
+      vm.a.b = 2
+      waitForUpdate(() => {
+        expect(spy).toHaveBeenCalledWith(oldA, oldA)
+        vm.a = { b: 3 }
+      }).then(() => {
+        expect(spy).toHaveBeenCalledWith(vm.a, oldA)
+      }).then(done)
+    })
+
+    it('handler option', done => {
+      var oldA = vm.a
+      vm.$watch('a', {
+        handler: spy,
+        deep: true
+      })
+      vm.a.b = 2
+      waitForUpdate(() => {
+        expect(spy).toHaveBeenCalledWith(oldA, oldA)
+        vm.a = { b: 3 }
+      }).then(() => {
+        expect(spy).toHaveBeenCalledWith(vm.a, oldA)
+      }).then(done)
+    })
+
+    it('handler option in string', () => {
+      vm.$watch('a.b', {
+        handler: 'foo',
+        immediate: true
+      })
+      expect(spy.calls.count()).toBe(1)
+      expect(spy).toHaveBeenCalledWith(1)
+    })
+
+    it('warn expression', () => {
+      vm.$watch('a + b', spy)
+      expect('Watcher only accepts simple dot-delimited paths').toHaveBeenWarned()
+    })
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/features/instance/methods-events.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/features/instance/methods-events.spec.js
new file mode 100644 (file)
index 0000000..8883457
--- /dev/null
@@ -0,0 +1,89 @@
+import Vue from 'vue'
+
+describe('Instance methods events', () => {
+  let vm, spy
+  beforeEach(() => {
+    vm = new Vue()
+    spy = jasmine.createSpy('emitter')
+  })
+
+  it('$on', () => {
+    vm.$on('test', function () {
+      // expect correct context
+      expect(this).toBe(vm)
+      spy.apply(this, arguments)
+    })
+    vm.$emit('test', 1, 2, 3, 4)
+    expect(spy.calls.count()).toBe(1)
+    expect(spy).toHaveBeenCalledWith(1, 2, 3, 4)
+  })
+
+  it('$on multi event', () => {
+    vm.$on(['test1', 'test2'], function () {
+      expect(this).toBe(vm)
+      spy.apply(this, arguments)
+    })
+    vm.$emit('test1', 1, 2, 3, 4)
+    expect(spy.calls.count()).toBe(1)
+    expect(spy).toHaveBeenCalledWith(1, 2, 3, 4)
+    vm.$emit('test2', 5, 6, 7, 8)
+    expect(spy.calls.count()).toBe(2)
+    expect(spy).toHaveBeenCalledWith(5, 6, 7, 8)
+  })
+
+  it('$off multi event', () => {
+    vm.$on(['test1', 'test2', 'test3'], spy)
+    vm.$off(['test1', 'test2'], spy)
+    vm.$emit('test1')
+    vm.$emit('test2')
+    expect(spy).not.toHaveBeenCalled()
+    vm.$emit('test3', 1, 2, 3, 4)
+    expect(spy.calls.count()).toBe(1)
+  })
+
+  it('$off multi event without callback', () => {
+    vm.$on(['test1', 'test2'], spy)
+    vm.$off(['test1', 'test2'])
+    vm.$emit('test1')
+    expect(spy).not.toHaveBeenCalled()
+  })
+
+  it('$once', () => {
+    vm.$once('test', spy)
+    vm.$emit('test', 1, 2, 3)
+    vm.$emit('test', 2, 3, 4)
+    expect(spy.calls.count()).toBe(1)
+    expect(spy).toHaveBeenCalledWith(1, 2, 3)
+  })
+
+  it('$off', () => {
+    vm.$on('test1', spy)
+    vm.$on('test2', spy)
+    vm.$off()
+    vm.$emit('test1')
+    vm.$emit('test2')
+    expect(spy).not.toHaveBeenCalled()
+  })
+
+  it('$off event', () => {
+    vm.$on('test1', spy)
+    vm.$on('test2', spy)
+    vm.$off('test1')
+    vm.$off('test1') // test off something that's already off
+    vm.$emit('test1', 1)
+    vm.$emit('test2', 2)
+    expect(spy.calls.count()).toBe(1)
+    expect(spy).toHaveBeenCalledWith(2)
+  })
+
+  it('$off event + fn', () => {
+    var spy2 = jasmine.createSpy('emitter')
+    vm.$on('test', spy)
+    vm.$on('test', spy2)
+    vm.$off('test', spy)
+    vm.$emit('test', 1, 2, 3)
+    expect(spy).not.toHaveBeenCalled()
+    expect(spy2.calls.count()).toBe(1)
+    expect(spy2).toHaveBeenCalledWith(1, 2, 3)
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/features/instance/methods-lifecycle.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/features/instance/methods-lifecycle.spec.js
new file mode 100644 (file)
index 0000000..71525be
--- /dev/null
@@ -0,0 +1,130 @@
+import Vue from 'vue'
+
+describe('Instance methods lifecycle', () => {
+  describe('$mount', () => {
+    it('empty mount', () => {
+      const vm = new Vue({
+        data: { msg: 'hi' },
+        template: '<div>{{ msg }}</div>'
+      }).$mount()
+      expect(vm.$el.tagName).toBe('DIV')
+      expect(vm.$el.textContent).toBe('hi')
+    })
+
+    it('mount to existing element', () => {
+      const el = document.createElement('div')
+      el.innerHTML = '{{ msg }}'
+      const vm = new Vue({
+        data: { msg: 'hi' }
+      }).$mount(el)
+      expect(vm.$el.tagName).toBe('DIV')
+      expect(vm.$el.textContent).toBe('hi')
+    })
+
+    it('mount to id', () => {
+      const el = document.createElement('div')
+      el.id = 'mount-test'
+      el.innerHTML = '{{ msg }}'
+      document.body.appendChild(el)
+      const vm = new Vue({
+        data: { msg: 'hi' }
+      }).$mount('#mount-test')
+      expect(vm.$el.tagName).toBe('DIV')
+      expect(vm.$el.textContent).toBe('hi')
+    })
+  })
+
+  describe('$destroy', () => {
+    it('remove self from parent', () => {
+      const vm = new Vue({
+        template: '<test></test>',
+        components: {
+          test: { template: '<div></div>' }
+        }
+      }).$mount()
+      vm.$children[0].$destroy()
+      expect(vm.$children.length).toBe(0)
+    })
+
+    it('teardown watchers', () => {
+      const vm = new Vue({
+        data: { a: 123 },
+        template: '<div></div>'
+      }).$mount()
+      vm.$watch('a', () => {})
+      vm.$destroy()
+      expect(vm._watcher.active).toBe(false)
+      expect(vm._watchers.every(w => !w.active)).toBe(true)
+    })
+
+    it('remove self from data observer', () => {
+      const vm = new Vue({ data: { a: 1 }})
+      vm.$destroy()
+      expect(vm.$data.__ob__.vmCount).toBe(0)
+    })
+
+    it('avoid duplicate calls', () => {
+      const spy = jasmine.createSpy('destroy')
+      const vm = new Vue({
+        beforeDestroy: spy
+      })
+      vm.$destroy()
+      vm.$destroy()
+      expect(spy.calls.count()).toBe(1)
+    })
+  })
+
+  describe('$forceUpdate', () => {
+    it('should force update', done => {
+      const vm = new Vue({
+        data: {
+          a: {}
+        },
+        template: '<div>{{ a.b }}</div>'
+      }).$mount()
+      expect(vm.$el.textContent).toBe('')
+      vm.a.b = 'foo'
+      waitForUpdate(() => {
+        // should not work because adding new property
+        expect(vm.$el.textContent).toBe('')
+        vm.$forceUpdate()
+      }).then(() => {
+        expect(vm.$el.textContent).toBe('foo')
+      }).then(done)
+    })
+  })
+
+  describe('$nextTick', () => {
+    it('should be called after DOM update in correct context', done => {
+      const vm = new Vue({
+        template: '<div>{{ msg }}</div>',
+        data: {
+          msg: 'foo'
+        }
+      }).$mount()
+      vm.msg = 'bar'
+      vm.$nextTick(function () {
+        expect(this).toBe(vm)
+        expect(vm.$el.textContent).toBe('bar')
+        done()
+      })
+    })
+
+    if (typeof Promise !== 'undefined') {
+      it('should be called after DOM update in correct context, when using Promise syntax', done => {
+        const vm = new Vue({
+          template: '<div>{{ msg }}</div>',
+          data: {
+            msg: 'foo'
+          }
+        }).$mount()
+        vm.msg = 'bar'
+        vm.$nextTick().then(ctx => {
+          expect(ctx).toBe(vm)
+          expect(vm.$el.textContent).toBe('bar')
+          done()
+        })
+      })
+    }
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/features/instance/properties.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/features/instance/properties.spec.js
new file mode 100644 (file)
index 0000000..02aca12
--- /dev/null
@@ -0,0 +1,203 @@
+import Vue from 'vue'
+
+describe('Instance properties', () => {
+  it('$data', () => {
+    const data = { a: 1 }
+    const vm = new Vue({
+      data
+    })
+    expect(vm.a).toBe(1)
+    expect(vm.$data).toBe(data)
+    // vm -> data
+    vm.a = 2
+    expect(data.a).toBe(2)
+    // data -> vm
+    data.a = 3
+    expect(vm.a).toBe(3)
+  })
+
+  it('$options', () => {
+    const A = Vue.extend({
+      methods: {
+        a () {}
+      }
+    })
+    const vm = new A({
+      methods: {
+        b () {}
+      }
+    })
+    expect(typeof vm.$options.methods.a).toBe('function')
+    expect(typeof vm.$options.methods.b).toBe('function')
+  })
+
+  it('$root/$children', done => {
+    const vm = new Vue({
+      template: '<div><test v-if="ok"></test></div>',
+      data: { ok: true },
+      components: {
+        test: {
+          template: '<div></div>'
+        }
+      }
+    }).$mount()
+    expect(vm.$root).toBe(vm)
+    expect(vm.$children.length).toBe(1)
+    expect(vm.$children[0].$root).toBe(vm)
+    vm.ok = false
+    waitForUpdate(() => {
+      expect(vm.$children.length).toBe(0)
+      vm.ok = true
+    }).then(() => {
+      expect(vm.$children.length).toBe(1)
+      expect(vm.$children[0].$root).toBe(vm)
+    }).then(done)
+  })
+
+  it('$parent', () => {
+    const calls = []
+    const makeOption = name => ({
+      name,
+      template: `<div><slot></slot></div>`,
+      created () {
+        calls.push(`${name}:${this.$parent.$options.name}`)
+      }
+    })
+    new Vue({
+      template: `
+        <div>
+          <outer><middle><inner></inner></middle></outer>
+          <next></next>
+        </div>
+      `,
+      components: {
+        outer: makeOption('outer'),
+        middle: makeOption('middle'),
+        inner: makeOption('inner'),
+        next: makeOption('next')
+      }
+    }).$mount()
+    expect(calls).toEqual(['outer:undefined', 'middle:outer', 'inner:middle', 'next:undefined'])
+  })
+
+  it('$props', done => {
+    const Comp = Vue.extend({
+      props: ['msg'],
+      template: '<div>{{ msg }} {{ $props.msg }}</div>'
+    })
+    const vm = new Comp({
+      propsData: {
+        msg: 'foo'
+      }
+    }).$mount()
+    // check render
+    expect(vm.$el.textContent).toContain('foo foo')
+    // warn set
+    vm.$props = {}
+    expect('$props is readonly').toHaveBeenWarned()
+    // check existence
+    expect(vm.$props.msg).toBe('foo')
+    // check change
+    vm.msg = 'bar'
+    expect(vm.$props.msg).toBe('bar')
+    waitForUpdate(() => {
+      expect(vm.$el.textContent).toContain('bar bar')
+    }).then(() => {
+      vm.$props.msg = 'baz'
+      expect(vm.msg).toBe('baz')
+    }).then(() => {
+      expect(vm.$el.textContent).toContain('baz baz')
+    }).then(done)
+  })
+
+  it('warn mutating $props', () => {
+    const Comp = {
+      props: ['msg'],
+      render () {},
+      mounted () {
+        expect(this.$props.msg).toBe('foo')
+        this.$props.msg = 'bar'
+      }
+    }
+    new Vue({
+      template: `<comp ref="comp" msg="foo" />`,
+      components: { Comp }
+    }).$mount()
+    expect(`Avoid mutating a prop`).toHaveBeenWarned()
+  })
+
+  it('$attrs', done => {
+    const vm = new Vue({
+      template: `<foo :id="foo" bar="1"/>`,
+      data: { foo: 'foo' },
+      components: {
+        foo: {
+          props: ['bar'],
+          template: `<div><div v-bind="$attrs"></div></div>`
+        }
+      }
+    }).$mount()
+    expect(vm.$el.children[0].id).toBe('foo')
+    expect(vm.$el.children[0].hasAttribute('bar')).toBe(false)
+    vm.foo = 'bar'
+    waitForUpdate(() => {
+      expect(vm.$el.children[0].id).toBe('bar')
+      expect(vm.$el.children[0].hasAttribute('bar')).toBe(false)
+    }).then(done)
+  })
+
+  // #6263
+  it('$attrs should not be undefined when no props passed in', () => {
+    const vm = new Vue({
+      template: `<foo/>`,
+      data: { foo: 'foo' },
+      components: {
+        foo: {
+          template: `<div>{{ this.foo }}</div>`
+        }
+      }
+    }).$mount()
+    expect(vm.$attrs).toBeDefined()
+  })
+
+  it('warn mutating $attrs', () => {
+    const vm = new Vue()
+    vm.$attrs = {}
+    expect(`$attrs is readonly`).toHaveBeenWarned()
+  })
+
+  it('$listeners', done => {
+    const spyA = jasmine.createSpy('A')
+    const spyB = jasmine.createSpy('B')
+    const vm = new Vue({
+      template: `<foo @click="foo"/>`,
+      data: { foo: spyA },
+      components: {
+        foo: {
+          template: `<div v-on="$listeners"></div>`
+        }
+      }
+    }).$mount()
+
+    // has to be in dom for test to pass in IE
+    document.body.appendChild(vm.$el)
+
+    triggerEvent(vm.$el, 'click')
+    expect(spyA.calls.count()).toBe(1)
+    expect(spyB.calls.count()).toBe(0)
+
+    vm.foo = spyB
+    waitForUpdate(() => {
+      triggerEvent(vm.$el, 'click')
+      expect(spyA.calls.count()).toBe(1)
+      expect(spyB.calls.count()).toBe(1)
+      document.body.removeChild(vm.$el)
+    }).then(done)
+  })
+
+  it('warn mutating $listeners', () => {
+    const vm = new Vue()
+    vm.$listeners = {}
+    expect(`$listeners is readonly`).toHaveBeenWarned()
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/features/instance/render-proxy.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/features/instance/render-proxy.spec.js
new file mode 100644 (file)
index 0000000..d4d01eb
--- /dev/null
@@ -0,0 +1,32 @@
+import Vue from 'vue'
+
+if (typeof Proxy !== 'undefined') {
+  describe('render proxy', () => {
+    it('should warn missing property in render fns with `with`', () => {
+      new Vue({
+        template: `<div>{{ a }}</div>`
+      }).$mount()
+      expect(`Property or method "a" is not defined`).toHaveBeenWarned()
+    })
+
+    it('should warn missing property in render fns without `with`', () => {
+      const render = function (h) {
+        return h('div', [this.a])
+      }
+      render._withStripped = true
+      new Vue({
+        render
+      }).$mount()
+      expect(`Property or method "a" is not defined`).toHaveBeenWarned()
+    })
+
+    it('should not warn for hand-written render functions', () => {
+      new Vue({
+        render (h) {
+          return h('div', [this.a])
+        }
+      }).$mount()
+      expect(`Property or method "a" is not defined`).not.toHaveBeenWarned()
+    })
+  })
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/features/options/_scopeId.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/features/options/_scopeId.spec.js
new file mode 100644 (file)
index 0000000..ec45f90
--- /dev/null
@@ -0,0 +1,96 @@
+import Vue from 'vue'
+
+describe('Options _scopeId', () => {
+  it('should add scopeId attributes', () => {
+    const vm = new Vue({
+      _scopeId: 'foo',
+      template: '<div><p><span></span></p></div>'
+    }).$mount()
+    expect(vm.$el.hasAttribute('foo')).toBe(true)
+    expect(vm.$el.children[0].hasAttribute('foo')).toBe(true)
+    expect(vm.$el.children[0].children[0].hasAttribute('foo')).toBe(true)
+  })
+
+  it('should add scopedId attributes from both parent and child on child root', () => {
+    const vm = new Vue({
+      _scopeId: 'foo',
+      template: '<div><child></child></div>',
+      components: {
+        child: {
+          _scopeId: 'bar',
+          template: '<div></div>'
+        }
+      }
+    }).$mount()
+    expect(vm.$el.children[0].hasAttribute('foo')).toBe(true)
+    expect(vm.$el.children[0].hasAttribute('bar')).toBe(true)
+  })
+
+  it('should add scopedId attributes from both parent and child on slot contents', () => {
+    const vm = new Vue({
+      _scopeId: 'foo',
+      template: '<div><child><p>hi</p></child></div>',
+      components: {
+        child: {
+          _scopeId: 'bar',
+          template: '<div><slot></slot></div>'
+        }
+      }
+    }).$mount()
+    expect(vm.$el.children[0].children[0].hasAttribute('foo')).toBe(true)
+    expect(vm.$el.children[0].children[0].hasAttribute('bar')).toBe(true)
+  })
+
+  // #4774
+  it('should not discard parent scopeId when component root element is replaced', done => {
+    const vm = new Vue({
+      _scopeId: 'data-1',
+      template: `<div><child ref="child" /></div>`,
+      components: {
+        child: {
+          _scopeId: 'data-2',
+          data: () => ({ show: true }),
+          template: '<div v-if="show"></div>'
+        }
+      }
+    }).$mount()
+
+    const child = vm.$refs.child
+
+    expect(child.$el.hasAttribute('data-1')).toBe(true)
+    expect(child.$el.hasAttribute('data-2')).toBe(true)
+
+    child.show = false
+    waitForUpdate(() => {
+      child.show = true
+    }).then(() => {
+      expect(child.$el.hasAttribute('data-1')).toBe(true)
+      expect(child.$el.hasAttribute('data-2')).toBe(true)
+    }).then(done)
+  })
+
+  it('should work on functional components', () => {
+    const child = {
+      functional: true,
+      _scopeId: 'child',
+      render (h) {
+        return h('div', { class: 'child' }, [
+          h('span', { class: 'child' }, 'child')
+        ])
+      }
+    }
+    const vm = new Vue({
+      _scopeId: 'parent',
+      components: { child },
+      template: '<div><child></child></div>'
+    }).$mount()
+
+    expect(vm.$el.hasAttribute('parent')).toBe(true)
+    const childEls = vm.$el.querySelectorAll('.child')
+    ;[].forEach.call(childEls, el => {
+      expect(el.hasAttribute('child')).toBe(true)
+      // functional component with scopeId will not inherit parent scopeId
+      expect(el.hasAttribute('parent')).toBe(false)
+    })
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/features/options/comments.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/features/options/comments.spec.js
new file mode 100644 (file)
index 0000000..b13b63a
--- /dev/null
@@ -0,0 +1,16 @@
+import Vue from 'vue'
+
+describe('Comments', () => {
+  it('comments should be kept', () => {
+    const vm = new Vue({
+      comments: true,
+      data () {
+        return {
+          foo: 1
+        }
+      },
+      template: '<div><span>node1</span><!--comment1-->{{foo}}<!--comment2--></div>'
+    }).$mount()
+    expect(vm.$el.innerHTML).toEqual('<span>node1</span><!--comment1-->1<!--comment2-->')
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/features/options/components.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/features/options/components.spec.js
new file mode 100644 (file)
index 0000000..1a94380
--- /dev/null
@@ -0,0 +1,92 @@
+import Vue from 'vue'
+import { UA } from 'core/util/env'
+import testObjectOption from '../../../helpers/test-object-option'
+
+describe('Options components', () => {
+  testObjectOption('components')
+
+  it('should accept plain object', () => {
+    const vm = new Vue({
+      template: '<test></test>',
+      components: {
+        test: {
+          template: '<div>hi</div>'
+        }
+      }
+    }).$mount()
+    expect(vm.$el.tagName).toBe('DIV')
+    expect(vm.$el.textContent).toBe('hi')
+  })
+
+  it('should accept extended constructor', () => {
+    const Test = Vue.extend({
+      template: '<div>hi</div>'
+    })
+    const vm = new Vue({
+      template: '<test></test>',
+      components: {
+        test: Test
+      }
+    }).$mount()
+    expect(vm.$el.tagName).toBe('DIV')
+    expect(vm.$el.textContent).toBe('hi')
+  })
+
+  it('should accept camelCase', () => {
+    const myComp = {
+      template: '<div>hi</div>'
+    }
+    const vm = new Vue({
+      template: '<my-comp></my-comp>',
+      components: {
+        myComp
+      }
+    }).$mount()
+    expect(vm.$el.tagName).toBe('DIV')
+    expect(vm.$el.textContent).toBe('hi')
+  })
+
+  it('should accept PascalCase', () => {
+    const MyComp = {
+      template: '<div>hi</div>'
+    }
+    const vm = new Vue({
+      template: '<my-comp></my-comp>',
+      components: {
+        MyComp
+      }
+    }).$mount()
+    expect(vm.$el.tagName).toBe('DIV')
+    expect(vm.$el.textContent).toBe('hi')
+  })
+
+  it('should warn native HTML elements', () => {
+    new Vue({
+      components: {
+        div: { template: '<div></div>' }
+      }
+    })
+    expect('Do not use built-in or reserved HTML elements as component').toHaveBeenWarned()
+  })
+
+  it('should warn built-in elements', () => {
+    new Vue({
+      components: {
+        component: { template: '<div></div>' }
+      }
+    })
+    expect('Do not use built-in or reserved HTML elements as component').toHaveBeenWarned()
+  })
+
+  // the HTMLUnknownElement check doesn't work in Android 4.2
+  // but since it doesn't support custom elements nor will any dev use it
+  // as their primary debugging browser, it doesn't really matter.
+  if (!(UA && /android 4\.2/.test(UA))) {
+    it('warn non-existent', () => {
+      new Vue({
+        template: '<test></test>'
+      }).$mount()
+      expect('Unknown custom element: <test>').toHaveBeenWarned()
+    })
+  }
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/features/options/computed.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/features/options/computed.spec.js
new file mode 100644 (file)
index 0000000..edc20ba
--- /dev/null
@@ -0,0 +1,219 @@
+import Vue from 'vue'
+import testObjectOption from '../../../helpers/test-object-option'
+
+describe('Options computed', () => {
+  testObjectOption('computed')
+
+  it('basic usage', done => {
+    const vm = new Vue({
+      template: '<div>{{ b }}</div>',
+      data: {
+        a: 1
+      },
+      computed: {
+        b () {
+          return this.a + 1
+        }
+      }
+    }).$mount()
+    expect(vm.b).toBe(2)
+    expect(vm.$el.textContent).toBe('2')
+    vm.a = 2
+    expect(vm.b).toBe(3)
+    waitForUpdate(() => {
+      expect(vm.$el.textContent).toBe('3')
+    }).then(done)
+  })
+
+  it('with setter', done => {
+    const vm = new Vue({
+      template: '<div>{{ b }}</div>',
+      data: {
+        a: 1
+      },
+      computed: {
+        b: {
+          get () { return this.a + 1 },
+          set (v) { this.a = v - 1 }
+        }
+      }
+    }).$mount()
+    expect(vm.b).toBe(2)
+    expect(vm.$el.textContent).toBe('2')
+    vm.a = 2
+    expect(vm.b).toBe(3)
+    waitForUpdate(() => {
+      expect(vm.$el.textContent).toBe('3')
+      vm.b = 1
+      expect(vm.a).toBe(0)
+    }).then(() => {
+      expect(vm.$el.textContent).toBe('1')
+    }).then(done)
+  })
+
+  it('warn with setter and no getter', () => {
+    const vm = new Vue({
+      template: `
+        <div>
+          <test></test>
+        </div>
+      `,
+      components: {
+        test: {
+          data () {
+            return {
+              a: 1
+            }
+          },
+          computed: {
+            b: {
+              set (v) { this.a = v }
+            }
+          },
+          template: `<div>{{a}}</div>`
+        }
+      }
+    }).$mount()
+    expect(vm.$el.innerHTML).toBe('<div>1</div>')
+    expect('Getter is missing for computed property "b".').toHaveBeenWarned()
+  })
+
+  it('warn assigning to computed with no setter', () => {
+    const vm = new Vue({
+      computed: {
+        b () {
+          return 1
+        }
+      }
+    })
+    vm.b = 2
+    expect(`Computed property "b" was assigned to but it has no setter.`).toHaveBeenWarned()
+  })
+
+  it('watching computed', done => {
+    const spy = jasmine.createSpy('watch computed')
+    const vm = new Vue({
+      data: {
+        a: 1
+      },
+      computed: {
+        b () { return this.a + 1 }
+      }
+    })
+    vm.$watch('b', spy)
+    vm.a = 2
+    waitForUpdate(() => {
+      expect(spy).toHaveBeenCalledWith(3, 2)
+    }).then(done)
+  })
+
+  it('caching', () => {
+    const spy = jasmine.createSpy('cached computed')
+    const vm = new Vue({
+      data: {
+        a: 1
+      },
+      computed: {
+        b () {
+          spy()
+          return this.a + 1
+        }
+      }
+    })
+    expect(spy.calls.count()).toBe(0)
+    vm.b
+    expect(spy.calls.count()).toBe(1)
+    vm.b
+    expect(spy.calls.count()).toBe(1)
+  })
+
+  it('cache: false', () => {
+    const spy = jasmine.createSpy('cached computed')
+    const vm = new Vue({
+      data: {
+        a: 1
+      },
+      computed: {
+        b: {
+          cache: false,
+          get () {
+            spy()
+            return this.a + 1
+          }
+        }
+      }
+    })
+    expect(spy.calls.count()).toBe(0)
+    vm.b
+    expect(spy.calls.count()).toBe(1)
+    vm.b
+    expect(spy.calls.count()).toBe(2)
+  })
+
+  it('as component', done => {
+    const Comp = Vue.extend({
+      template: `<div>{{ b }} {{ c }}</div>`,
+      data () {
+        return { a: 1 }
+      },
+      computed: {
+        // defined on prototype
+        b () {
+          return this.a + 1
+        }
+      }
+    })
+
+    const vm = new Comp({
+      computed: {
+        // defined at instantiation
+        c () {
+          return this.b + 1
+        }
+      }
+    }).$mount()
+    expect(vm.b).toBe(2)
+    expect(vm.c).toBe(3)
+    expect(vm.$el.textContent).toBe('2 3')
+    vm.a = 2
+    expect(vm.b).toBe(3)
+    expect(vm.c).toBe(4)
+    waitForUpdate(() => {
+      expect(vm.$el.textContent).toBe('3 4')
+    }).then(done)
+  })
+
+  it('warn conflict with data', () => {
+    new Vue({
+      data: {
+        a: 1
+      },
+      computed: {
+        a: () => 2
+      }
+    })
+    expect(`computed property "a" is already defined in data`).toHaveBeenWarned()
+  })
+
+  it('warn conflict with props', () => {
+    new Vue({
+      props: ['a'],
+      propsData: { a: 1 },
+      computed: {
+        a: () => 2
+      }
+    })
+    expect(`computed property "a" is already defined as a prop`).toHaveBeenWarned()
+  })
+
+  it('rethrow computed error', () => {
+    const vm = new Vue({
+      computed: {
+        a: () => {
+          throw new Error('rethrow')
+        }
+      }
+    })
+    expect(() => vm.a).toThrowError('rethrow')
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/features/options/data.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/features/options/data.spec.js
new file mode 100644 (file)
index 0000000..ac431bb
--- /dev/null
@@ -0,0 +1,186 @@
+import Vue from 'vue'
+
+describe('Options data', () => {
+  it('should proxy and be reactive', done => {
+    const data = { msg: 'foo' }
+    const vm = new Vue({
+      data,
+      template: '<div>{{ msg }}</div>'
+    }).$mount()
+    expect(vm.$data).toEqual({ msg: 'foo' })
+    expect(vm.$data).toBe(data)
+    data.msg = 'bar'
+    waitForUpdate(() => {
+      expect(vm.$el.textContent).toBe('bar')
+    }).then(done)
+  })
+
+  it('should merge data properly', () => {
+    const Test = Vue.extend({
+      data () {
+        return { a: 1 }
+      }
+    })
+    let vm = new Test({
+      data: { b: 2 }
+    })
+    expect(vm.a).toBe(1)
+    expect(vm.b).toBe(2)
+    // no instance data
+    vm = new Test()
+    expect(vm.a).toBe(1)
+    // no child-val
+    const Extended = Test.extend({})
+    vm = new Extended()
+    expect(vm.a).toBe(1)
+    // recursively merge objects
+    const WithObject = Vue.extend({
+      data () {
+        return {
+          obj: {
+            a: 1
+          }
+        }
+      }
+    })
+    vm = new WithObject({
+      data: {
+        obj: {
+          b: 2
+        }
+      }
+    })
+    expect(vm.obj.a).toBe(1)
+    expect(vm.obj.b).toBe(2)
+  })
+
+  it('should warn non-function during extend', () => {
+    Vue.extend({
+      data: { msg: 'foo' }
+    })
+    expect('The "data" option should be a function').toHaveBeenWarned()
+  })
+
+  it('should warn non object return', () => {
+    new Vue({
+      data () {}
+    })
+    expect('data functions should return an object').toHaveBeenWarned()
+  })
+
+  it('should warn replacing root $data', () => {
+    const vm = new Vue({
+      data: {}
+    })
+    vm.$data = {}
+    expect('Avoid replacing instance root $data').toHaveBeenWarned()
+  })
+
+  it('should have access to props', () => {
+    const Test = {
+      props: ['a'],
+      render () {},
+      data () {
+        return {
+          b: this.a
+        }
+      }
+    }
+    const vm = new Vue({
+      template: `<test ref="test" :a="1"></test>`,
+      components: { Test }
+    }).$mount()
+    expect(vm.$refs.test.b).toBe(1)
+  })
+
+  it('props should not be reactive', done => {
+    let calls = 0
+    const vm = new Vue({
+      template: `<child :msg="msg"></child>`,
+      data: {
+        msg: 'hello'
+      },
+      beforeUpdate () { calls++ },
+      components: {
+        child: {
+          template: `<span>{{ localMsg }}</span>`,
+          props: ['msg'],
+          data () {
+            return { localMsg: this.msg }
+          },
+          computed: {
+            computedMsg () {
+              return this.msg + ' world'
+            }
+          }
+        }
+      }
+    }).$mount()
+    const child = vm.$children[0]
+    vm.msg = 'hi'
+    waitForUpdate(() => {
+      expect(child.localMsg).toBe('hello')
+      expect(child.computedMsg).toBe('hi world')
+      expect(calls).toBe(1)
+    }).then(done)
+  })
+
+  it('should have access to methods', () => {
+    const vm = new Vue({
+      methods: {
+        get () {
+          return { a: 1 }
+        }
+      },
+      data () {
+        return this.get()
+      }
+    })
+    expect(vm.a).toBe(1)
+  })
+
+  it('should be called with this', () => {
+    const vm = new Vue({
+      template: '<div><child></child></div>',
+      provide: { foo: 1 },
+      components: {
+        child: {
+          template: '<span>{{bar}}</span>',
+          inject: ['foo'],
+          data ({ foo }) {
+            return { bar: 'foo:' + foo }
+          }
+        }
+      }
+    }).$mount()
+    expect(vm.$el.innerHTML).toBe('<span>foo:1</span>')
+  })
+
+  it('should be called with vm as first argument when merged', () => {
+    const superComponent = {
+      data: ({ foo }) => ({ ext: 'ext:' + foo })
+    }
+    const mixins = [
+      {
+        data: ({ foo }) => ({ mixin1: 'm1:' + foo })
+      },
+      {
+        data: ({ foo }) => ({ mixin2: 'm2:' + foo })
+      }
+    ]
+    const vm = new Vue({
+      template: '<div><child></child></div>',
+      provide: { foo: 1 },
+      components: {
+        child: {
+          extends: superComponent,
+          mixins,
+          template: '<span>{{bar}}-{{ext}}-{{mixin1}}-{{mixin2}}</span>',
+          inject: ['foo'],
+          data: ({ foo }) => ({ bar: 'foo:' + foo })
+        }
+      }
+    }).$mount()
+    expect(vm.$el.innerHTML).toBe('<span>foo:1-ext:1-m1:1-m2:1</span>')
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/features/options/delimiters.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/features/options/delimiters.spec.js
new file mode 100644 (file)
index 0000000..d477cab
--- /dev/null
@@ -0,0 +1,116 @@
+import Vue from 'vue'
+
+describe('Delimiters', () => {
+  it('default delimiters should work', () => {
+    const vm = new Vue({
+      data: {
+        a: 1
+      },
+      template: '<div>{{ a }}</div>'
+    }).$mount()
+    expect(vm.$el.textContent).toEqual('1')
+  })
+
+  it('custom delimiters should work', () => {
+    const vm = new Vue({
+      delimiters: ['[[', ']]'],
+      template: '<div>[[ a ]]</div>',
+      data: {
+        a: 1
+      }
+    }).$mount()
+
+    expect(vm.$el.textContent).toEqual('1')
+  })
+
+  it('default delimiters should be ignored when custom delimiters defined', () => {
+    const vm = new Vue({
+      delimiters: ['[[', ']]'],
+      template: '<div>{{ a }}</div>',
+      data: {
+        a: 1
+      }
+    }).$mount()
+
+    expect(vm.$el.textContent).toEqual('{{ a }}')
+  })
+
+  it('delimiters should only affect vm', () => {
+    const Component = Vue.extend({
+      data: function () {
+        return {
+          b: 2
+        }
+      },
+      template: '<span>[[ b ]]</span>'
+    })
+
+    const vm = new Vue({
+      delimiters: ['[[', ']]'],
+      template: '<div>[[ a ]] - <test-component></test-component></div>',
+      data: {
+        a: 2
+      },
+      components: {
+        'test-component': Component
+      }
+    }).$mount()
+
+    expect(vm.$el.textContent).toEqual('2 - [[ b ]]')
+  })
+
+  it('delimiters defined globally should work on all vms', () => {
+    Vue.options.delimiters = ['[[', ']]']
+
+    const Component = Vue.extend({
+      template: '<span>[[ a ]]</span>',
+      data: function () {
+        return {
+          a: 2
+        }
+      }
+    })
+
+    const vm = new Vue({
+      data: {
+        b: 1
+      },
+      template: '<div>[[ b ]] - <test-component></test-component></div>',
+      components: {
+        'test-component': Component
+      }
+    }).$mount()
+
+    expect(vm.$el.textContent).toEqual('1 - 2')
+    // restore default options
+    delete Vue.options.delimiters
+  })
+
+  it('component specific delimiters should override global delimiters', () => {
+    Vue.options.delimiters = ['[[', ']]']
+
+    const Component = Vue.extend({
+      delimiters: ['@{{', '}}'],
+      template: '<span>@{{ a }}</span>',
+      data: function () {
+        return {
+          a: 2
+        }
+      }
+    })
+
+    const vm = new Vue({
+      data: {
+        b: 1
+      },
+      template: '<div>[[ b ]] - <test-component></test-component></div>',
+      components: {
+        'test-component': Component
+      }
+    }).$mount()
+
+    expect(vm.$el.textContent).toEqual('1 - 2')
+    // restore default options
+    delete Vue.options.delimiters
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/features/options/directives.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/features/options/directives.spec.js
new file mode 100644 (file)
index 0000000..f15dd77
--- /dev/null
@@ -0,0 +1,268 @@
+import Vue from 'vue'
+
+describe('Options directives', () => {
+  it('basic usage', done => {
+    const bindSpy = jasmine.createSpy('bind')
+    const insertedSpy = jasmine.createSpy('inserted')
+    const updateSpy = jasmine.createSpy('update')
+    const componentUpdatedSpy = jasmine.createSpy('componentUpdated')
+    const unbindSpy = jasmine.createSpy('unbind')
+
+    const assertContext = (el, binding, vnode) => {
+      expect(vnode.context).toBe(vm)
+      expect(binding.arg).toBe('arg')
+      expect(binding.modifiers).toEqual({ hello: true })
+    }
+
+    const vm = new Vue({
+      template: '<div class="hi"><div v-if="ok" v-test:arg.hello="a">{{ msg }}</div></div>',
+      data: {
+        msg: 'hi',
+        a: 'foo',
+        ok: true
+      },
+      directives: {
+        test: {
+          bind (el, binding, vnode) {
+            bindSpy()
+            assertContext(el, binding, vnode)
+            expect(binding.value).toBe('foo')
+            expect(binding.expression).toBe('a')
+            expect(binding.oldValue).toBeUndefined()
+            expect(el.parentNode).toBeNull()
+          },
+          inserted (el, binding, vnode) {
+            insertedSpy()
+            assertContext(el, binding, vnode)
+            expect(binding.value).toBe('foo')
+            expect(binding.expression).toBe('a')
+            expect(binding.oldValue).toBeUndefined()
+            expect(el.parentNode.className).toBe('hi')
+          },
+          update (el, binding, vnode, oldVnode) {
+            updateSpy()
+            assertContext(el, binding, vnode)
+            expect(el).toBe(vm.$el.children[0])
+            expect(oldVnode).not.toBe(vnode)
+            expect(binding.expression).toBe('a')
+            if (binding.value !== binding.oldValue) {
+              expect(binding.value).toBe('bar')
+              expect(binding.oldValue).toBe('foo')
+            }
+          },
+          componentUpdated (el, binding, vnode) {
+            componentUpdatedSpy()
+            assertContext(el, binding, vnode)
+          },
+          unbind (el, binding, vnode) {
+            unbindSpy()
+            assertContext(el, binding, vnode)
+          }
+        }
+      }
+    })
+
+    vm.$mount()
+    expect(bindSpy).toHaveBeenCalled()
+    expect(insertedSpy).toHaveBeenCalled()
+    expect(updateSpy).not.toHaveBeenCalled()
+    expect(componentUpdatedSpy).not.toHaveBeenCalled()
+    expect(unbindSpy).not.toHaveBeenCalled()
+    vm.a = 'bar'
+    waitForUpdate(() => {
+      expect(updateSpy).toHaveBeenCalled()
+      expect(componentUpdatedSpy).toHaveBeenCalled()
+      expect(unbindSpy).not.toHaveBeenCalled()
+      vm.msg = 'bye'
+    }).then(() => {
+      expect(componentUpdatedSpy.calls.count()).toBe(2)
+      vm.ok = false
+    }).then(() => {
+      expect(unbindSpy).toHaveBeenCalled()
+    }).then(done)
+  })
+
+  it('function shorthand', done => {
+    const spy = jasmine.createSpy('directive')
+    const vm = new Vue({
+      template: '<div v-test:arg.hello="a"></div>',
+      data: { a: 'foo' },
+      directives: {
+        test (el, binding, vnode) {
+          expect(vnode.context).toBe(vm)
+          expect(binding.arg).toBe('arg')
+          expect(binding.modifiers).toEqual({ hello: true })
+          spy(binding.value, binding.oldValue)
+        }
+      }
+    })
+    vm.$mount()
+    expect(spy).toHaveBeenCalledWith('foo', undefined)
+    vm.a = 'bar'
+    waitForUpdate(() => {
+      expect(spy).toHaveBeenCalledWith('bar', 'foo')
+    }).then(done)
+  })
+
+  it('function shorthand (global)', done => {
+    const spy = jasmine.createSpy('directive')
+    Vue.directive('test', function (el, binding, vnode) {
+      expect(vnode.context).toBe(vm)
+      expect(binding.arg).toBe('arg')
+      expect(binding.modifiers).toEqual({ hello: true })
+      spy(binding.value, binding.oldValue)
+    })
+    const vm = new Vue({
+      template: '<div v-test:arg.hello="a"></div>',
+      data: { a: 'foo' }
+    })
+    vm.$mount()
+    expect(spy).toHaveBeenCalledWith('foo', undefined)
+    vm.a = 'bar'
+    waitForUpdate(() => {
+      expect(spy).toHaveBeenCalledWith('bar', 'foo')
+      delete Vue.options.directives.test
+    }).then(done)
+  })
+
+  it('should teardown directives on old vnodes when new vnodes have none', done => {
+    const vm = new Vue({
+      data: {
+        ok: true
+      },
+      template: `
+        <div>
+          <div v-if="ok" v-test>a</div>
+          <div v-else class="b">b</div>
+        </div>
+      `,
+      directives: {
+        test: {
+          bind: el => { el.id = 'a' },
+          unbind: el => { el.id = '' }
+        }
+      }
+    }).$mount()
+    expect(vm.$el.children[0].id).toBe('a')
+    vm.ok = false
+    waitForUpdate(() => {
+      expect(vm.$el.children[0].id).toBe('')
+      expect(vm.$el.children[0].className).toBe('b')
+    }).then(done)
+  })
+
+  it('should properly handle same node with different directive sets', done => {
+    const spies = {}
+    const createSpy = name => (spies[name] = jasmine.createSpy(name))
+    const vm = new Vue({
+      data: {
+        ok: true,
+        val: 123
+      },
+      template: `
+        <div>
+          <div v-if="ok" v-test="val" v-test.hi="val"></div>
+          <div v-if="!ok" v-test.hi="val" v-test2="val"></div>
+        </div>
+      `,
+      directives: {
+        test: {
+          bind: createSpy('bind1'),
+          inserted: createSpy('inserted1'),
+          update: createSpy('update1'),
+          componentUpdated: createSpy('componentUpdated1'),
+          unbind: createSpy('unbind1')
+        },
+        test2: {
+          bind: createSpy('bind2'),
+          inserted: createSpy('inserted2'),
+          update: createSpy('update2'),
+          componentUpdated: createSpy('componentUpdated2'),
+          unbind: createSpy('unbind2')
+        }
+      }
+    }).$mount()
+
+    expect(spies.bind1.calls.count()).toBe(2)
+    expect(spies.inserted1.calls.count()).toBe(2)
+    expect(spies.bind2.calls.count()).toBe(0)
+    expect(spies.inserted2.calls.count()).toBe(0)
+
+    vm.ok = false
+    waitForUpdate(() => {
+      // v-test with modifier should be updated
+      expect(spies.update1.calls.count()).toBe(1)
+      expect(spies.componentUpdated1.calls.count()).toBe(1)
+
+      // v-test without modifier should be unbound
+      expect(spies.unbind1.calls.count()).toBe(1)
+
+      // v-test2 should be bound
+      expect(spies.bind2.calls.count()).toBe(1)
+      expect(spies.inserted2.calls.count()).toBe(1)
+
+      vm.ok = true
+    }).then(() => {
+      // v-test without modifier should be bound again
+      expect(spies.bind1.calls.count()).toBe(3)
+      expect(spies.inserted1.calls.count()).toBe(3)
+
+      // v-test2 should be unbound
+      expect(spies.unbind2.calls.count()).toBe(1)
+
+      // v-test with modifier should be updated again
+      expect(spies.update1.calls.count()).toBe(2)
+      expect(spies.componentUpdated1.calls.count()).toBe(2)
+
+      vm.val = 234
+    }).then(() => {
+      expect(spies.update1.calls.count()).toBe(4)
+      expect(spies.componentUpdated1.calls.count()).toBe(4)
+    }).then(done)
+  })
+
+  it('warn non-existent', () => {
+    new Vue({
+      template: '<div v-test></div>'
+    }).$mount()
+    expect('Failed to resolve directive: test').toHaveBeenWarned()
+  })
+
+  // #6513
+  it('should invoke unbind & inserted on inner component root element change', done => {
+    const dir = {
+      bind: jasmine.createSpy('bind'),
+      inserted: jasmine.createSpy('inserted'),
+      unbind: jasmine.createSpy('unbind')
+    }
+
+    const Child = {
+      template: `<div v-if="ok"/><span v-else/>`,
+      data: () => ({ ok: true })
+    }
+
+    const vm = new Vue({
+      template: `<child ref="child" v-test />`,
+      directives: { test: dir },
+      components: { Child }
+    }).$mount()
+
+    const oldEl = vm.$el
+    expect(dir.bind.calls.count()).toBe(1)
+    expect(dir.bind.calls.argsFor(0)[0]).toBe(oldEl)
+    expect(dir.inserted.calls.count()).toBe(1)
+    expect(dir.inserted.calls.argsFor(0)[0]).toBe(oldEl)
+    expect(dir.unbind).not.toHaveBeenCalled()
+
+    vm.$refs.child.ok = false
+    waitForUpdate(() => {
+      expect(vm.$el.tagName).toBe('SPAN')
+      expect(dir.bind.calls.count()).toBe(2)
+      expect(dir.bind.calls.argsFor(1)[0]).toBe(vm.$el)
+      expect(dir.inserted.calls.count()).toBe(2)
+      expect(dir.inserted.calls.argsFor(1)[0]).toBe(vm.$el)
+      expect(dir.unbind.calls.count()).toBe(1)
+      expect(dir.unbind.calls.argsFor(0)[0]).toBe(oldEl)
+    }).then(done)
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/features/options/el.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/features/options/el.spec.js
new file mode 100644 (file)
index 0000000..75beda1
--- /dev/null
@@ -0,0 +1,90 @@
+import Vue from 'vue'
+
+describe('Options el', () => {
+  it('basic usage', () => {
+    const el = document.createElement('div')
+    el.innerHTML = '<span>{{message}}</span>'
+    const vm = new Vue({
+      el,
+      data: { message: 'hello world' }
+    })
+    expect(vm.$el.tagName).toBe('DIV')
+    expect(vm.$el.textContent).toBe(vm.message)
+  })
+
+  it('should be replaced when use together with `template` option', () => {
+    const el = document.createElement('div')
+    el.innerHTML = '<span>{{message}}</span>'
+    const vm = new Vue({
+      el,
+      template: '<p id="app"><span>{{message}}</span></p>',
+      data: { message: 'hello world' }
+    })
+    expect(vm.$el.tagName).toBe('P')
+    expect(vm.$el.textContent).toBe(vm.message)
+  })
+
+  it('should be replaced when use together with `render` option', () => {
+    const el = document.createElement('div')
+    el.innerHTML = '<span>{{message}}</span>'
+    const vm = new Vue({
+      el,
+      render (h) {
+        return h('p', { staticAttrs: { id: 'app' }}, [
+          h('span', {}, [this.message])
+        ])
+      },
+      data: { message: 'hello world' }
+    })
+    expect(vm.$el.tagName).toBe('P')
+    expect(vm.$el.textContent).toBe(vm.message)
+  })
+
+  it('svg element', () => {
+    const parent = document.createElement('div')
+    parent.innerHTML =
+      '<svg>' +
+        '<text :x="x" :y="y" :fill="color">{{ text }}</text>' +
+        '<g><clipPath><foo></foo></clipPath></g>' +
+      '</svg>'
+    const vm = new Vue({
+      el: parent.childNodes[0],
+      data: {
+        x: 64,
+        y: 128,
+        color: 'red',
+        text: 'svg text'
+      }
+    })
+    expect(vm.$el.tagName).toBe('svg')
+    expect(vm.$el.childNodes[0].getAttribute('x')).toBe(vm.x.toString())
+    expect(vm.$el.childNodes[0].getAttribute('y')).toBe(vm.y.toString())
+    expect(vm.$el.childNodes[0].getAttribute('fill')).toBe(vm.color)
+    expect(vm.$el.childNodes[0].textContent).toBe(vm.text)
+    // nested, non-explicitly listed SVG elements
+    expect(vm.$el.childNodes[1].childNodes[0].namespaceURI).toContain('svg')
+    expect(vm.$el.childNodes[1].childNodes[0].childNodes[0].namespaceURI).toContain('svg')
+  })
+
+  // https://w3c.github.io/DOM-Parsing/#dfn-serializing-an-attribute-value
+  it('properly decode attribute values when parsing templates from DOM', () => {
+    const el = document.createElement('div')
+    el.innerHTML = '<a href="/a?foo=bar&baz=qux" name="<abc>" single=\'"hi"\'></a>'
+    const vm = new Vue({ el })
+    expect(vm.$el.children[0].getAttribute('href')).toBe('/a?foo=bar&baz=qux')
+    expect(vm.$el.children[0].getAttribute('name')).toBe('<abc>')
+    expect(vm.$el.children[0].getAttribute('single')).toBe('"hi"')
+  })
+
+  it('decode attribute value newlines when parsing templates from DOM in IE', () => {
+    const el = document.createElement('div')
+    el.innerHTML = `<a :style="{\ncolor:'red'\n}"></a>`
+    const vm = new Vue({ el })
+    expect(vm.$el.children[0].style.color).toBe('red')
+  })
+
+  it('warn cannot find element', () => {
+    new Vue({ el: '#non-existent' })
+    expect('Cannot find element: #non-existent').toHaveBeenWarned()
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/features/options/errorCaptured.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/features/options/errorCaptured.spec.js
new file mode 100644 (file)
index 0000000..d16c057
--- /dev/null
@@ -0,0 +1,212 @@
+import Vue from 'vue'
+
+describe('Options errorCaptured', () => {
+  let globalSpy
+
+  beforeEach(() => {
+    globalSpy = Vue.config.errorHandler = jasmine.createSpy()
+  })
+
+  afterEach(() => {
+    Vue.config.errorHandler = null
+  })
+
+  it('should capture error from child component', () => {
+    const spy = jasmine.createSpy()
+
+    let child
+    let err
+    const Child = {
+      created () {
+        child = this
+        err = new Error('child')
+        throw err
+      },
+      render () {}
+    }
+
+    new Vue({
+      errorCaptured: spy,
+      render: h => h(Child)
+    }).$mount()
+
+    expect(spy).toHaveBeenCalledWith(err, child, 'created hook')
+    // should propagate by default
+    expect(globalSpy).toHaveBeenCalledWith(err, child, 'created hook')
+  })
+
+  it('should be able to render the error in itself', done => {
+    let child
+    const Child = {
+      created () {
+        child = this
+        throw new Error('error from child')
+      },
+      render () {}
+    }
+
+    const vm = new Vue({
+      data: {
+        error: null
+      },
+      errorCaptured (e, vm, info) {
+        expect(vm).toBe(child)
+        this.error = e.toString() + ' in ' + info
+      },
+      render (h) {
+        if (this.error) {
+          return h('pre', this.error)
+        }
+        return h(Child)
+      }
+    }).$mount()
+
+    waitForUpdate(() => {
+      expect(vm.$el.textContent).toContain('error from child')
+      expect(vm.$el.textContent).toContain('in created hook')
+    }).then(done)
+  })
+
+  it('should not propagate to global handler when returning true', () => {
+    const spy = jasmine.createSpy()
+
+    let child
+    let err
+    const Child = {
+      created () {
+        child = this
+        err = new Error('child')
+        throw err
+      },
+      render () {}
+    }
+
+    new Vue({
+      errorCaptured (err, vm, info) {
+        spy(err, vm, info)
+        return false
+      },
+      render: h => h(Child, {})
+    }).$mount()
+
+    expect(spy).toHaveBeenCalledWith(err, child, 'created hook')
+    // should not propagate
+    expect(globalSpy).not.toHaveBeenCalled()
+  })
+
+  it('should propagate to global handler if itself throws error', () => {
+    let child
+    let err
+    const Child = {
+      created () {
+        child = this
+        err = new Error('child')
+        throw err
+      },
+      render () {}
+    }
+
+    let err2
+    const vm = new Vue({
+      errorCaptured () {
+        err2 = new Error('foo')
+        throw err2
+      },
+      render: h => h(Child, {})
+    }).$mount()
+
+    expect(globalSpy).toHaveBeenCalledWith(err, child, 'created hook')
+    expect(globalSpy).toHaveBeenCalledWith(err2, vm, 'errorCaptured hook')
+  })
+
+  it('should work across multiple parents, mixins and extends', () => {
+    const calls = []
+
+    const Child = {
+      created () {
+        throw new Error('child')
+      },
+      render () {}
+    }
+
+    const ErrorBoundaryBase = {
+      errorCaptured () {
+        calls.push(1)
+      }
+    }
+
+    const mixin = {
+      errorCaptured () {
+        calls.push(2)
+      }
+    }
+
+    const ErrorBoundaryExtended = {
+      extends: ErrorBoundaryBase,
+      mixins: [mixin],
+      errorCaptured () {
+        calls.push(3)
+      },
+      render: h => h(Child)
+    }
+
+    Vue.config.errorHandler = () => {
+      calls.push(5)
+    }
+
+    new Vue({
+      errorCaptured () {
+        calls.push(4)
+      },
+      render: h => h(ErrorBoundaryExtended)
+    }).$mount()
+
+    expect(calls).toEqual([1, 2, 3, 4, 5])
+  })
+
+  it('should work across multiple parents, mixins and extends with return false', () => {
+    const calls = []
+
+    const Child = {
+      created () {
+        throw new Error('child')
+      },
+      render () {}
+    }
+
+    const ErrorBoundaryBase = {
+      errorCaptured () {
+        calls.push(1)
+      }
+    }
+
+    const mixin = {
+      errorCaptured () {
+        calls.push(2)
+      }
+    }
+
+    const ErrorBoundaryExtended = {
+      extends: ErrorBoundaryBase,
+      mixins: [mixin],
+      errorCaptured () {
+        calls.push(3)
+        return false
+      },
+      render: h => h(Child)
+    }
+
+    Vue.config.errorHandler = () => {
+      calls.push(5)
+    }
+
+    new Vue({
+      errorCaptured () {
+        calls.push(4)
+      },
+      render: h => h(ErrorBoundaryExtended)
+    }).$mount()
+
+    expect(calls).toEqual([1, 2, 3])
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/features/options/extends.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/features/options/extends.spec.js
new file mode 100644 (file)
index 0000000..1734640
--- /dev/null
@@ -0,0 +1,75 @@
+import Vue from 'vue'
+import { nativeWatch } from 'core/util/env'
+
+describe('Options extends', () => {
+  it('should work on objects', () => {
+    const A = {
+      data () {
+        return { a: 1 }
+      }
+    }
+    const B = {
+      extends: A,
+      data () {
+        return { b: 2 }
+      }
+    }
+    const vm = new Vue({
+      extends: B,
+      data: {
+        c: 3
+      }
+    })
+    expect(vm.a).toBe(1)
+    expect(vm.b).toBe(2)
+    expect(vm.c).toBe(3)
+  })
+
+  it('should work on extended constructors', () => {
+    const A = Vue.extend({
+      data () {
+        return { a: 1 }
+      }
+    })
+    const B = Vue.extend({
+      extends: A,
+      data () {
+        return { b: 2 }
+      }
+    })
+    const vm = new Vue({
+      extends: B,
+      data: {
+        c: 3
+      }
+    })
+    expect(vm.a).toBe(1)
+    expect(vm.b).toBe(2)
+    expect(vm.c).toBe(3)
+  })
+
+  if (nativeWatch) {
+    it('should work with global mixins + Object.prototype.watch', done => {
+      Vue.mixin({})
+
+      const spy = jasmine.createSpy('watch')
+      const A = Vue.extend({
+        data: function () {
+          return { a: 1 }
+        },
+        watch: {
+          a: spy
+        },
+        created: function () {
+          this.a = 2
+        }
+      })
+      new Vue({
+        extends: A
+      })
+      waitForUpdate(() => {
+        expect(spy).toHaveBeenCalledWith(2, 1)
+      }).then(done)
+    })
+  }
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/features/options/functional.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/features/options/functional.spec.js
new file mode 100644 (file)
index 0000000..2c6abe9
--- /dev/null
@@ -0,0 +1,319 @@
+import Vue from 'vue'
+import { createEmptyVNode } from 'core/vdom/vnode'
+
+describe('Options functional', () => {
+  it('should work', done => {
+    const vm = new Vue({
+      data: { test: 'foo' },
+      template: '<div><wrap :msg="test">bar</wrap></div>',
+      components: {
+        wrap: {
+          functional: true,
+          props: ['msg'],
+          render (h, { props, children }) {
+            return h('div', null, [props.msg, ' '].concat(children))
+          }
+        }
+      }
+    }).$mount()
+    expect(vm.$el.innerHTML).toBe('<div>foo bar</div>')
+    vm.test = 'qux'
+    waitForUpdate(() => {
+      expect(vm.$el.innerHTML).toBe('<div>qux bar</div>')
+    }).then(done)
+  })
+
+  it('should expose all props when not declared', done => {
+    const fn = {
+      functional: true,
+      render (h, { props }) {
+        return h('div', `${props.msg} ${props.kebabMsg}`)
+      }
+    }
+
+    const vm = new Vue({
+      data: { test: 'foo' },
+      render (h) {
+        return h('div', [
+          h(fn, {
+            props: { msg: this.test },
+            attrs: { 'kebab-msg': 'bar' }
+          })
+        ])
+      }
+    }).$mount()
+
+    expect(vm.$el.innerHTML).toBe('<div>foo bar</div>')
+    vm.test = 'qux'
+    waitForUpdate(() => {
+      expect(vm.$el.innerHTML).toBe('<div>qux bar</div>')
+    }).then(done)
+  })
+
+  it('should expose data.on as listeners', () => {
+    const foo = jasmine.createSpy('foo')
+    const bar = jasmine.createSpy('bar')
+    const vm = new Vue({
+      template: '<div><wrap @click="foo" @test="bar"/></div>',
+      methods: { foo, bar },
+      components: {
+        wrap: {
+          functional: true,
+          render (h, { listeners }) {
+            return h('div', {
+              on: {
+                click: [listeners.click, () => listeners.test('bar')]
+              }
+            })
+          }
+        }
+      }
+    }).$mount()
+
+    triggerEvent(vm.$el.children[0], 'click')
+    expect(foo).toHaveBeenCalled()
+    expect(foo.calls.argsFor(0)[0].type).toBe('click') // should have click event
+    triggerEvent(vm.$el.children[0], 'mousedown')
+    expect(bar).toHaveBeenCalledWith('bar')
+  })
+
+  it('should support returning more than one root node', () => {
+    const vm = new Vue({
+      template: `<div><test></test></div>`,
+      components: {
+        test: {
+          functional: true,
+          render (h) {
+            return [h('span', 'foo'), h('span', 'bar')]
+          }
+        }
+      }
+    }).$mount()
+    expect(vm.$el.innerHTML).toBe('<span>foo</span><span>bar</span>')
+  })
+
+  it('should support slots', () => {
+    const vm = new Vue({
+      data: { test: 'foo' },
+      template: '<div><wrap><div slot="a">foo</div><div slot="b">bar</div></wrap></div>',
+      components: {
+        wrap: {
+          functional: true,
+          props: ['msg'],
+          render (h, { slots }) {
+            slots = slots()
+            return h('div', null, [slots.b, slots.a])
+          }
+        }
+      }
+    }).$mount()
+    expect(vm.$el.innerHTML).toBe('<div><div>bar</div><div>foo</div></div>')
+  })
+
+  it('should let vnode raw data pass through', done => {
+    const onValid = jasmine.createSpy('valid')
+    const vm = new Vue({
+      data: { msg: 'hello' },
+      template: `<div>
+        <validate field="field1" @valid="onValid">
+          <input type="text" v-model="msg">
+        </validate>
+      </div>`,
+      components: {
+        validate: {
+          functional: true,
+          props: ['field'],
+          render (h, { props, children, data: { on }}) {
+            props.child = children[0]
+            return h('validate-control', { props, on })
+          }
+        },
+        'validate-control': {
+          props: ['field', 'child'],
+          render () {
+            return this.child
+          },
+          mounted () {
+            this.$el.addEventListener('input', this.onInput)
+          },
+          destroyed () {
+            this.$el.removeEventListener('input', this.onInput)
+          },
+          methods: {
+            onInput (e) {
+              const value = e.target.value
+              if (this.validate(value)) {
+                this.$emit('valid', this)
+              }
+            },
+            // something validation logic here
+            validate (val) {
+              return val.length > 0
+            }
+          }
+        }
+      },
+      methods: { onValid }
+    }).$mount()
+    document.body.appendChild(vm.$el)
+    const input = vm.$el.querySelector('input')
+    expect(onValid).not.toHaveBeenCalled()
+    waitForUpdate(() => {
+      input.value = 'foo'
+      triggerEvent(input, 'input')
+    }).then(() => {
+      expect(onValid).toHaveBeenCalled()
+    }).then(() => {
+      document.body.removeChild(vm.$el)
+      vm.$destroy()
+    }).then(done)
+  })
+
+  it('create empty vnode when render return null', () => {
+    const child = {
+      functional: true,
+      render () {
+        return null
+      }
+    }
+    const vm = new Vue({
+      components: {
+        child
+      }
+    })
+    const h = vm.$createElement
+    const vnode = h('child')
+    expect(vnode).toEqual(createEmptyVNode())
+  })
+
+  // #7282
+  it('should normalize top-level arrays', () => {
+    const Foo = {
+      functional: true,
+      render (h) {
+        return [h('span', 'hi'), null]
+      }
+    }
+    const vm = new Vue({
+      template: `<div><foo/></div>`,
+      components: { Foo }
+    }).$mount()
+    expect(vm.$el.innerHTML).toBe('<span>hi</span>')
+  })
+
+  it('should work when used as named slot and returning array', () => {
+    const Foo = {
+      template: `<div><slot name="test"/></div>`
+    }
+
+    const Bar = {
+      functional: true,
+      render: h => ([
+        h('div', 'one'),
+        h('div', 'two'),
+        h(Baz)
+      ])
+    }
+
+    const Baz = {
+      functional: true,
+      render: h => h('div', 'three')
+    }
+
+    const vm = new Vue({
+      template: `<foo><bar slot="test"/></foo>`,
+      components: { Foo, Bar }
+    }).$mount()
+
+    expect(vm.$el.innerHTML).toBe('<div>one</div><div>two</div><div>three</div>')
+  })
+
+  it('should apply namespace when returning arrays', () => {
+    const Child = {
+      functional: true,
+      render: h => ([h('foo'), h('bar')])
+    }
+    const vm = new Vue({
+      template: `<svg><child/></svg>`,
+      components: { Child }
+    }).$mount()
+
+    expect(vm.$el.childNodes[0].namespaceURI).toContain('svg')
+    expect(vm.$el.childNodes[1].namespaceURI).toContain('svg')
+  })
+
+  it('should work with render fns compiled from template', done => {
+    // code generated via vue-template-es2015-compiler
+    var render = function (_h, _vm) {
+      var _c = _vm._c
+      return _c(
+        'div',
+        [
+          _c('h2', { staticClass: 'red' }, [_vm._v(_vm._s(_vm.props.msg))]),
+          _vm._t('default'),
+          _vm._t('slot2'),
+          _vm._t('scoped', null, { msg: _vm.props.msg }),
+          _vm._m(0),
+          _c('div', { staticClass: 'clickable', on: { click: _vm.parent.fn }}, [
+            _vm._v('click me')
+          ])
+        ],
+        2
+      )
+    }
+    var staticRenderFns = [
+      function (_h, _vm) {
+        var _c = _vm._c
+        return _c('div', [_vm._v('Some '), _c('span', [_vm._v('text')])])
+      }
+    ]
+
+    const child = {
+      functional: true,
+      _compiled: true,
+      render,
+      staticRenderFns
+    }
+
+    const parent = new Vue({
+      components: {
+        child
+      },
+      data: {
+        msg: 'hello'
+      },
+      template: `
+      <div>
+        <child :msg="msg">
+          <span>{{ msg }}</span>
+          <div slot="slot2">Second slot</div>
+          <template slot="scoped" slot-scope="scope">{{ scope.msg }}</template>
+        </child>
+      </div>
+      `,
+      methods: {
+        fn () {
+          this.msg = 'bye'
+        }
+      }
+    }).$mount()
+
+    function assertMarkup () {
+      expect(parent.$el.innerHTML).toBe(
+        `<div>` +
+          `<h2 class="red">${parent.msg}</h2>` +
+          `<span>${parent.msg}</span> ` +
+          `<div>Second slot</div>` +
+          parent.msg +
+          // static
+          `<div>Some <span>text</span></div>` +
+          `<div class="clickable">click me</div>` +
+        `</div>`
+      )
+    }
+
+    assertMarkup()
+    triggerEvent(parent.$el.querySelector('.clickable'), 'click')
+    waitForUpdate(assertMarkup).then(done)
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/features/options/inheritAttrs.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/features/options/inheritAttrs.spec.js
new file mode 100644 (file)
index 0000000..7ccc7c0
--- /dev/null
@@ -0,0 +1,39 @@
+import Vue from 'vue'
+
+describe('Options inheritAttrs', () => {
+  it('should work', done => {
+    const vm = new Vue({
+      template: `<foo :id="foo"/>`,
+      data: { foo: 'foo' },
+      components: {
+        foo: {
+          inheritAttrs: false,
+          template: `<div>foo</div>`
+        }
+      }
+    }).$mount()
+    expect(vm.$el.id).toBe('')
+    vm.foo = 'bar'
+    waitForUpdate(() => {
+      expect(vm.$el.id).toBe('')
+    }).then(done)
+  })
+
+  it('with inner v-bind', done => {
+    const vm = new Vue({
+      template: `<foo :id="foo"/>`,
+      data: { foo: 'foo' },
+      components: {
+        foo: {
+          inheritAttrs: false,
+          template: `<div><div v-bind="$attrs"></div></div>`
+        }
+      }
+    }).$mount()
+    expect(vm.$el.children[0].id).toBe('foo')
+    vm.foo = 'bar'
+    waitForUpdate(() => {
+      expect(vm.$el.children[0].id).toBe('bar')
+    }).then(done)
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/features/options/inject.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/features/options/inject.spec.js
new file mode 100644 (file)
index 0000000..53f55e1
--- /dev/null
@@ -0,0 +1,650 @@
+import Vue from 'vue'
+import { Observer } from 'core/observer/index'
+import { isNative, isObject, hasOwn } from 'core/util/index'
+import testObjectOption from '../../../helpers/test-object-option'
+
+describe('Options provide/inject', () => {
+  testObjectOption('inject')
+
+  let injected
+  const injectedComp = {
+    inject: ['foo', 'bar'],
+    render () {},
+    created () {
+      injected = [this.foo, this.bar]
+    }
+  }
+
+  beforeEach(() => {
+    injected = null
+  })
+
+  it('should work', () => {
+    new Vue({
+      template: `<child/>`,
+      provide: {
+        foo: 1,
+        bar: false
+      },
+      components: {
+        child: {
+          template: `<injected-comp/>`,
+          components: {
+            injectedComp
+          }
+        }
+      }
+    }).$mount()
+
+    expect(injected).toEqual([1, false])
+  })
+
+  it('should use closest parent', () => {
+    new Vue({
+      template: `<child/>`,
+      provide: {
+        foo: 1,
+        bar: null
+      },
+      components: {
+        child: {
+          provide: {
+            foo: 3
+          },
+          template: `<injected-comp/>`,
+          components: {
+            injectedComp
+          }
+        }
+      }
+    }).$mount()
+
+    expect(injected).toEqual([3, null])
+  })
+
+  it('provide function', () => {
+    new Vue({
+      template: `<child/>`,
+      data: {
+        a: 1,
+        b: false
+      },
+      provide () {
+        return {
+          foo: this.a,
+          bar: this.b
+        }
+      },
+      components: {
+        child: {
+          template: `<injected-comp/>`,
+          components: {
+            injectedComp
+          }
+        }
+      }
+    }).$mount()
+
+    expect(injected).toEqual([1, false])
+  })
+
+  it('inject with alias', () => {
+    const injectAlias = {
+      inject: {
+        baz: 'foo',
+        qux: 'bar'
+      },
+      render () {},
+      created () {
+        injected = [this.baz, this.qux]
+      }
+    }
+
+    new Vue({
+      template: `<child/>`,
+      provide: {
+        foo: false,
+        bar: 2
+      },
+      components: {
+        child: {
+          template: `<inject-alias/>`,
+          components: {
+            injectAlias
+          }
+        }
+      }
+    }).$mount()
+
+    expect(injected).toEqual([false, 2])
+  })
+
+  it('inject before resolving data/props', () => {
+    const vm = new Vue({
+      provide: {
+        foo: 1
+      }
+    })
+
+    const child = new Vue({
+      parent: vm,
+      inject: ['foo'],
+      data () {
+        return {
+          bar: this.foo + 1
+        }
+      },
+      props: {
+        baz: {
+          default () {
+            return this.foo + 2
+          }
+        }
+      }
+    })
+
+    expect(child.foo).toBe(1)
+    expect(child.bar).toBe(2)
+    expect(child.baz).toBe(3)
+  })
+
+  // GitHub issue #5194
+  it('should work with functional', () => {
+    new Vue({
+      template: `<child/>`,
+      provide: {
+        foo: 1,
+        bar: false
+      },
+      components: {
+        child: {
+          functional: true,
+          inject: ['foo', 'bar'],
+          render (h, context) {
+            const { injections } = context
+            injected = [injections.foo, injections.bar]
+          }
+        }
+      }
+    }).$mount()
+
+    expect(injected).toEqual([1, false])
+  })
+
+  if (typeof Reflect !== 'undefined' && isNative(Reflect.ownKeys)) {
+    it('with Symbol keys', () => {
+      const s = Symbol()
+      const vm = new Vue({
+        template: `<child/>`,
+        provide: {
+          [s]: 123
+        },
+        components: {
+          child: {
+            inject: { s },
+            template: `<div>{{ s }}</div>`
+          }
+        }
+      }).$mount()
+      expect(vm.$el.textContent).toBe('123')
+    })
+  }
+
+  // GitHub issue #5223
+  it('should work with reactive array', done => {
+    const vm = new Vue({
+      template: `<div><child></child></div>`,
+      data () {
+        return {
+          foo: []
+        }
+      },
+      provide () {
+        return {
+          foo: this.foo
+        }
+      },
+      components: {
+        child: {
+          inject: ['foo'],
+          template: `<span>{{foo.length}}</span>`
+        }
+      }
+    }).$mount()
+
+    expect(vm.$el.innerHTML).toEqual(`<span>0</span>`)
+    vm.foo.push(vm.foo.length)
+    vm.$nextTick(() => {
+      expect(vm.$el.innerHTML).toEqual(`<span>1</span>`)
+      vm.foo.pop()
+      vm.$nextTick(() => {
+        expect(vm.$el.innerHTML).toEqual(`<span>0</span>`)
+        done()
+      })
+    })
+  })
+
+  it('should extend properly', () => {
+    const parent = Vue.extend({
+      template: `<span/>`,
+      inject: ['foo']
+    })
+
+    const child = parent.extend({
+      template: `<span/>`,
+      inject: ['bar'],
+      created () {
+        injected = [this.foo, this.bar]
+      }
+    })
+
+    new Vue({
+      template: `<div><parent/><child/></div>`,
+      provide: {
+        foo: 1,
+        bar: false
+      },
+      components: {
+        parent,
+        child
+      }
+    }).$mount()
+
+    expect(injected).toEqual([1, false])
+  })
+
+  it('should merge from mixins properly (objects)', () => {
+    const mixinA = { inject: { foo: 'foo' }}
+    const mixinB = { inject: { bar: 'bar' }}
+    const child = {
+      mixins: [mixinA, mixinB],
+      template: `<span/>`,
+      created () {
+        injected = [this.foo, this.bar]
+      }
+    }
+    new Vue({
+      provide: { foo: 'foo', bar: 'bar', baz: 'baz' },
+      render (h) {
+        return h(child)
+      }
+    }).$mount()
+
+    expect(injected).toEqual(['foo', 'bar'])
+  })
+
+  it('should merge from mixins properly (arrays)', () => {
+    const mixinA = { inject: ['foo'] }
+    const mixinB = { inject: ['bar'] }
+    const child = {
+      mixins: [mixinA, mixinB],
+      inject: ['baz'],
+      template: `<span/>`,
+      created () {
+        injected = [this.foo, this.bar, this.baz]
+      }
+    }
+    new Vue({
+      provide: { foo: 'foo', bar: 'bar', baz: 'baz' },
+      render (h) {
+        return h(child)
+      }
+    }).$mount()
+
+    expect(injected).toEqual(['foo', 'bar', 'baz'])
+  })
+
+  it('should merge from mixins properly (mix of objects and arrays)', () => {
+    const mixinA = { inject: { foo: 'foo' }}
+    const mixinB = { inject: ['bar'] }
+    const child = {
+      mixins: [mixinA, mixinB],
+      inject: { qux: 'baz' },
+      template: `<span/>`,
+      created () {
+        injected = [this.foo, this.bar, this.qux]
+      }
+    }
+    new Vue({
+      provide: { foo: 'foo', bar: 'bar', baz: 'baz' },
+      render (h) {
+        return h(child)
+      }
+    }).$mount()
+
+    expect(injected).toEqual(['foo', 'bar', 'baz'])
+  })
+
+  it('should warn when injections has been modified', () => {
+    const key = 'foo'
+    const vm = new Vue({
+      provide: {
+        foo: 1
+      }
+    })
+
+    const child = new Vue({
+      parent: vm,
+      inject: ['foo']
+    })
+
+    expect(child.foo).toBe(1)
+    child.foo = 2
+    expect(
+      `Avoid mutating an injected value directly since the changes will be ` +
+      `overwritten whenever the provided component re-renders. ` +
+      `injection being mutated: "${key}"`).toHaveBeenWarned()
+  })
+
+  it('should warn when injections cannot be found', () => {
+    const vm = new Vue({})
+    new Vue({
+      parent: vm,
+      inject: ['foo', 'bar'],
+      created () {}
+    })
+    expect(`Injection "foo" not found`).toHaveBeenWarned()
+    expect(`Injection "bar" not found`).toHaveBeenWarned()
+  })
+
+  it('should not warn when injections can be found', () => {
+    const vm = new Vue({
+      provide: {
+        foo: 1,
+        bar: false,
+        baz: undefined
+      }
+    })
+    new Vue({
+      parent: vm,
+      inject: ['foo', 'bar', 'baz'],
+      created () {}
+    })
+    expect(`Injection "foo" not found`).not.toHaveBeenWarned()
+    expect(`Injection "bar" not found`).not.toHaveBeenWarned()
+    expect(`Injection "baz" not found`).not.toHaveBeenWarned()
+  })
+
+  it('should not warn when injection key which is not provided is not enumerable', () => {
+    const parent = new Vue({ provide: { foo: 1 }})
+    const inject = { foo: 'foo' }
+    Object.defineProperty(inject, '__ob__', { enumerable: false, value: '__ob__' })
+    new Vue({ parent, inject })
+    expect(`Injection "__ob__" not found`).not.toHaveBeenWarned()
+  })
+
+  // Github issue #6097
+  it('should not warn when injections cannot be found but have default value', () => {
+    const vm = new Vue({})
+    new Vue({
+      parent: vm,
+      inject: {
+        foo: { default: 1 },
+        bar: { default: false },
+        baz: { default: undefined }
+      },
+      created () {
+        injected = [this.foo, this.bar, this.baz]
+      }
+    })
+    expect(injected).toEqual([1, false, undefined])
+  })
+
+  it('should support name alias and default together', () => {
+    const vm = new Vue({
+      provide: {
+        FOO: 2
+      }
+    })
+    new Vue({
+      parent: vm,
+      inject: {
+        foo: { from: 'FOO', default: 1 },
+        bar: { default: false },
+        baz: { default: undefined }
+      },
+      created () {
+        injected = [this.foo, this.bar, this.baz]
+      }
+    })
+    expect(injected).toEqual([2, false, undefined])
+  })
+
+  it('should use provided value even if inject has default', () => {
+    const vm = new Vue({
+      provide: {
+        foo: 1,
+        bar: false,
+        baz: undefined
+      }
+    })
+    new Vue({
+      parent: vm,
+      inject: {
+        foo: { default: 2 },
+        bar: { default: 2 },
+        baz: { default: 2 }
+      },
+      created () {
+        injected = [this.foo, this.bar, this.baz]
+      }
+    })
+    expect(injected).toEqual([1, false, undefined])
+  })
+
+  // Github issue #6008
+  it('should merge provide from mixins (objects)', () => {
+    const mixinA = { provide: { foo: 'foo' }}
+    const mixinB = { provide: { bar: 'bar' }}
+    const child = {
+      inject: ['foo', 'bar'],
+      template: `<span/>`,
+      created () {
+        injected = [this.foo, this.bar]
+      }
+    }
+    new Vue({
+      mixins: [mixinA, mixinB],
+      render (h) {
+        return h(child)
+      }
+    }).$mount()
+
+    expect(injected).toEqual(['foo', 'bar'])
+  })
+
+  it('should merge provide from mixins (functions)', () => {
+    const mixinA = { provide: () => ({ foo: 'foo' }) }
+    const mixinB = { provide: () => ({ bar: 'bar' }) }
+    const child = {
+      inject: ['foo', 'bar'],
+      template: `<span/>`,
+      created () {
+        injected = [this.foo, this.bar]
+      }
+    }
+    new Vue({
+      mixins: [mixinA, mixinB],
+      render (h) {
+        return h(child)
+      }
+    }).$mount()
+
+    expect(injected).toEqual(['foo', 'bar'])
+  })
+
+  it('should merge provide from mixins (mix of objects and functions)', () => {
+    const mixinA = { provide: { foo: 'foo' }}
+    const mixinB = { provide: () => ({ bar: 'bar' }) }
+    const mixinC = { provide: { baz: 'baz' }}
+    const mixinD = { provide: () => ({ bam: 'bam' }) }
+    const child = {
+      inject: ['foo', 'bar', 'baz', 'bam'],
+      template: `<span/>`,
+      created () {
+        injected = [this.foo, this.bar, this.baz, this.bam]
+      }
+    }
+    new Vue({
+      mixins: [mixinA, mixinB, mixinC, mixinD],
+      render (h) {
+        return h(child)
+      }
+    }).$mount()
+
+    expect(injected).toEqual(['foo', 'bar', 'baz', 'bam'])
+  })
+
+  it('should merge provide from mixins and override existing keys', () => {
+    const mixinA = { provide: { foo: 'foo' }}
+    const mixinB = { provide: { foo: 'bar' }}
+    const child = {
+      inject: ['foo'],
+      template: `<span/>`,
+      created () {
+        injected = [this.foo]
+      }
+    }
+    new Vue({
+      mixins: [mixinA, mixinB],
+      render (h) {
+        return h(child)
+      }
+    }).$mount()
+
+    expect(injected).toEqual(['bar'])
+  })
+
+  it('should merge provide when Vue.extend', () => {
+    const mixinA = { provide: () => ({ foo: 'foo' }) }
+    const child = {
+      inject: ['foo', 'bar'],
+      template: `<span/>`,
+      created () {
+        injected = [this.foo, this.bar]
+      }
+    }
+    const Ctor = Vue.extend({
+      mixins: [mixinA],
+      provide: { bar: 'bar' },
+      render (h) {
+        return h(child)
+      }
+    })
+
+    new Ctor().$mount()
+
+    expect(injected).toEqual(['foo', 'bar'])
+  })
+
+  // #5913
+  it('should keep the reactive with provide', () => {
+    function isObserver (obj) {
+      if (isObject(obj)) {
+        return hasOwn(obj, '__ob__') && obj.__ob__ instanceof Observer
+      }
+      return false
+    }
+
+    const vm = new Vue({
+      template: `<div><child ref='child'></child></div>`,
+      data () {
+        return {
+          foo: {},
+          $foo: {},
+          foo1: []
+        }
+      },
+      provide () {
+        return {
+          foo: this.foo,
+          $foo: this.$foo,
+          foo1: this.foo1,
+          bar: {},
+          baz: []
+        }
+      },
+      components: {
+        child: {
+          inject: ['foo', '$foo', 'foo1', 'bar', 'baz'],
+          template: `<span/>`
+        }
+      }
+    }).$mount()
+    const child = vm.$refs.child
+    expect(isObserver(child.foo)).toBe(true)
+    expect(isObserver(child.$foo)).toBe(false)
+    expect(isObserver(child.foo1)).toBe(true)
+    expect(isObserver(child.bar)).toBe(false)
+    expect(isObserver(child.baz)).toBe(false)
+  })
+
+  // #6175
+  it('merge provide properly from mixins', () => {
+    const ProvideFooMixin = {
+      provide: {
+        foo: 'foo injected'
+      }
+    }
+
+    const ProvideBarMixin = {
+      provide: {
+        bar: 'bar injected'
+      }
+    }
+
+    const Child = {
+      inject: ['foo', 'bar'],
+      render (h) {
+        return h('div', [`foo: ${this.foo}, `, `bar: ${this.bar}`])
+      }
+    }
+
+    const Parent = {
+      mixins: [ProvideFooMixin, ProvideBarMixin],
+      render (h) {
+        return h(Child)
+      }
+    }
+
+    const vm = new Vue({
+      render (h) {
+        return h(Parent)
+      }
+    }).$mount()
+
+    expect(vm.$el.textContent).toBe(`foo: foo injected, bar: bar injected`)
+  })
+
+  it('merge provide with object syntax when using Vue.extend', () => {
+    const child = {
+      inject: ['foo'],
+      template: `<span/>`,
+      created () {
+        injected = this.foo
+      }
+    }
+    const Ctor = Vue.extend({
+      provide: { foo: 'foo' },
+      render (h) {
+        return h(child)
+      }
+    })
+
+    new Ctor().$mount()
+
+    expect(injected).toEqual('foo')
+  })
+
+  // #7284
+  it('should not inject prototype properties', () => {
+    const vm = new Vue({
+      provide: {}
+    })
+    new Vue({
+      parent: vm,
+      inject: ['constructor']
+    })
+    expect(`Injection "constructor" not found`).toHaveBeenWarned()
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/features/options/lifecycle.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/features/options/lifecycle.spec.js
new file mode 100644 (file)
index 0000000..2b649aa
--- /dev/null
@@ -0,0 +1,249 @@
+import Vue from 'vue'
+
+describe('Options lifecycle hooks', () => {
+  let spy
+  beforeEach(() => {
+    spy = jasmine.createSpy('hook')
+  })
+
+  describe('beforeCreate', () => {
+    it('should allow modifying options', () => {
+      const vm = new Vue({
+        data: {
+          a: 1
+        },
+        beforeCreate () {
+          spy()
+          expect(this.a).toBeUndefined()
+          this.$options.computed = {
+            b () {
+              return this.a + 1
+            }
+          }
+        }
+      })
+      expect(spy).toHaveBeenCalled()
+      expect(vm.b).toBe(2)
+    })
+  })
+
+  describe('created', () => {
+    it('should have completed observation', () => {
+      new Vue({
+        data: {
+          a: 1
+        },
+        created () {
+          expect(this.a).toBe(1)
+          spy()
+        }
+      })
+      expect(spy).toHaveBeenCalled()
+    })
+  })
+
+  describe('beforeMount', () => {
+    it('should not have mounted', () => {
+      const vm = new Vue({
+        render () {},
+        beforeMount () {
+          spy()
+          expect(this._isMounted).toBe(false)
+          expect(this.$el).toBeUndefined() // due to empty mount
+          expect(this._vnode).toBeNull()
+          expect(this._watcher).toBeNull()
+        }
+      })
+      expect(spy).not.toHaveBeenCalled()
+      vm.$mount()
+      expect(spy).toHaveBeenCalled()
+    })
+  })
+
+  describe('mounted', () => {
+    it('should have mounted', () => {
+      const vm = new Vue({
+        template: '<div></div>',
+        mounted () {
+          spy()
+          expect(this._isMounted).toBe(true)
+          expect(this.$el.tagName).toBe('DIV')
+          expect(this._vnode.tag).toBe('div')
+        }
+      })
+      expect(spy).not.toHaveBeenCalled()
+      vm.$mount()
+      expect(spy).toHaveBeenCalled()
+    })
+
+    // #3898
+    it('should call for manually mounted instance with parent', () => {
+      const parent = new Vue()
+      expect(spy).not.toHaveBeenCalled()
+      new Vue({
+        parent,
+        template: '<div></div>',
+        mounted () {
+          spy()
+        }
+      }).$mount()
+      expect(spy).toHaveBeenCalled()
+    })
+
+    it('should mount child parent in correct order', () => {
+      const calls = []
+      new Vue({
+        template: '<div><test></test></div>',
+        mounted () {
+          calls.push('parent')
+        },
+        components: {
+          test: {
+            template: '<nested></nested>',
+            mounted () {
+              expect(this.$el.parentNode).toBeTruthy()
+              calls.push('child')
+            },
+            components: {
+              nested: {
+                template: '<div></div>',
+                mounted () {
+                  expect(this.$el.parentNode).toBeTruthy()
+                  calls.push('nested')
+                }
+              }
+            }
+          }
+        }
+      }).$mount()
+      expect(calls).toEqual(['nested', 'child', 'parent'])
+    })
+  })
+
+  describe('beforeUpdate', () => {
+    it('should be called before update', done => {
+      const vm = new Vue({
+        template: '<div>{{ msg }}</div>',
+        data: { msg: 'foo' },
+        beforeUpdate () {
+          spy()
+          expect(this.$el.textContent).toBe('foo')
+        }
+      }).$mount()
+      expect(spy).not.toHaveBeenCalled()
+      vm.msg = 'bar'
+      expect(spy).not.toHaveBeenCalled() // should be async
+      waitForUpdate(() => {
+        expect(spy).toHaveBeenCalled()
+      }).then(done)
+    })
+  })
+
+  describe('updated', () => {
+    it('should be called after update', done => {
+      const vm = new Vue({
+        template: '<div>{{ msg }}</div>',
+        data: { msg: 'foo' },
+        updated () {
+          spy()
+          expect(this.$el.textContent).toBe('bar')
+        }
+      }).$mount()
+      expect(spy).not.toHaveBeenCalled()
+      vm.msg = 'bar'
+      expect(spy).not.toHaveBeenCalled() // should be async
+      waitForUpdate(() => {
+        expect(spy).toHaveBeenCalled()
+      }).then(done)
+    })
+
+    it('should be called after children are updated', done => {
+      const calls = []
+      const vm = new Vue({
+        template: '<div><test ref="child">{{ msg }}</test></div>',
+        data: { msg: 'foo' },
+        components: {
+          test: {
+            template: `<div><slot></slot></div>`,
+            updated () {
+              expect(this.$el.textContent).toBe('bar')
+              calls.push('child')
+            }
+          }
+        },
+        updated () {
+          expect(this.$el.textContent).toBe('bar')
+          calls.push('parent')
+        }
+      }).$mount()
+
+      expect(calls).toEqual([])
+      vm.msg = 'bar'
+      expect(calls).toEqual([])
+      waitForUpdate(() => {
+        expect(calls).toEqual(['child', 'parent'])
+      }).then(done)
+    })
+  })
+
+  describe('beforeDestroy', () => {
+    it('should be called before destroy', () => {
+      const vm = new Vue({
+        render () {},
+        beforeDestroy () {
+          spy()
+          expect(this._isBeingDestroyed).toBe(false)
+          expect(this._isDestroyed).toBe(false)
+        }
+      }).$mount()
+      expect(spy).not.toHaveBeenCalled()
+      vm.$destroy()
+      vm.$destroy()
+      expect(spy).toHaveBeenCalled()
+      expect(spy.calls.count()).toBe(1)
+    })
+  })
+
+  describe('destroyed', () => {
+    it('should be called after destroy', () => {
+      const vm = new Vue({
+        render () {},
+        destroyed () {
+          spy()
+          expect(this._isBeingDestroyed).toBe(true)
+          expect(this._isDestroyed).toBe(true)
+        }
+      }).$mount()
+      expect(spy).not.toHaveBeenCalled()
+      vm.$destroy()
+      vm.$destroy()
+      expect(spy).toHaveBeenCalled()
+      expect(spy.calls.count()).toBe(1)
+    })
+  })
+
+  it('should emit hook events', () => {
+    const created = jasmine.createSpy()
+    const mounted = jasmine.createSpy()
+    const destroyed = jasmine.createSpy()
+    const vm = new Vue({
+      render () {},
+      beforeCreate () {
+        this.$on('hook:created', created)
+        this.$on('hook:mounted', mounted)
+        this.$on('hook:destroyed', destroyed)
+      }
+    })
+
+    expect(created).toHaveBeenCalled()
+    expect(mounted).not.toHaveBeenCalled()
+    expect(destroyed).not.toHaveBeenCalled()
+
+    vm.$mount()
+    expect(mounted).toHaveBeenCalled()
+    expect(destroyed).not.toHaveBeenCalled()
+
+    vm.$destroy()
+    expect(destroyed).toHaveBeenCalled()
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/features/options/methods.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/features/options/methods.spec.js
new file mode 100644 (file)
index 0000000..34f9ee8
--- /dev/null
@@ -0,0 +1,51 @@
+import Vue from 'vue'
+import testObjectOption from '../../../helpers/test-object-option'
+
+describe('Options methods', () => {
+  testObjectOption('methods')
+
+  it('should have correct context', () => {
+    const vm = new Vue({
+      data: {
+        a: 1
+      },
+      methods: {
+        plus () {
+          this.a++
+        }
+      }
+    })
+    vm.plus()
+    expect(vm.a).toBe(2)
+  })
+
+  it('should warn undefined methods', () => {
+    new Vue({
+      methods: {
+        hello: undefined
+      }
+    })
+    expect(`Method "hello" has an undefined value in the component definition`).toHaveBeenWarned()
+  })
+
+  it('should warn methods conflicting with data', () => {
+    new Vue({
+      data: {
+        foo: 1
+      },
+      methods: {
+        foo () {}
+      }
+    })
+    expect(`Method "foo" has already been defined as a data property`).toHaveBeenWarned()
+  })
+
+  it('should warn methods conflicting with internal methods', () => {
+    new Vue({
+      methods: {
+        _update () {}
+      }
+    })
+    expect(`Method "_update" conflicts with an existing Vue instance method`).toHaveBeenWarned()
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/features/options/mixins.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/features/options/mixins.spec.js
new file mode 100644 (file)
index 0000000..8385edf
--- /dev/null
@@ -0,0 +1,112 @@
+import Vue from 'vue'
+import { mergeOptions } from 'core/util/index'
+
+describe('Options mixins', () => {
+  it('vm should have options from mixin', () => {
+    const mixin = {
+      directives: {
+        c: {}
+      },
+      methods: {
+        a: function () {}
+      }
+    }
+
+    const vm = new Vue({
+      mixins: [mixin],
+      methods: {
+        b: function () {}
+      }
+    })
+
+    expect(vm.a).toBeDefined()
+    expect(vm.b).toBeDefined()
+    expect(vm.$options.directives.c).toBeDefined()
+  })
+
+  it('should call hooks from mixins first', () => {
+    const a = {}
+    const b = {}
+    const c = {}
+    const f1 = function () {}
+    const f2 = function () {}
+    const f3 = function () {}
+    const mixinA = {
+      a: 1,
+      template: 'foo',
+      directives: {
+        a: a
+      },
+      created: f1
+    }
+    const mixinB = {
+      b: 1,
+      directives: {
+        b: b
+      },
+      created: f2
+    }
+    const result = mergeOptions({}, {
+      directives: {
+        c: c
+      },
+      template: 'bar',
+      mixins: [mixinA, mixinB],
+      created: f3
+    })
+    expect(result.a).toBe(1)
+    expect(result.b).toBe(1)
+    expect(result.directives.a).toBe(a)
+    expect(result.directives.b).toBe(b)
+    expect(result.directives.c).toBe(c)
+    expect(result.created[0]).toBe(f1)
+    expect(result.created[1]).toBe(f2)
+    expect(result.created[2]).toBe(f3)
+    expect(result.template).toBe('bar')
+  })
+
+  it('mixin methods should not override defined method', () => {
+    const f1 = function () {}
+    const f2 = function () {}
+    const f3 = function () {}
+    const mixinA = {
+      methods: {
+        xyz: f1
+      }
+    }
+    const mixinB = {
+      methods: {
+        xyz: f2
+      }
+    }
+    const result = mergeOptions({}, {
+      mixins: [mixinA, mixinB],
+      methods: {
+        xyz: f3
+      }
+    })
+    expect(result.methods.xyz).toBe(f3)
+  })
+
+  it('should accept constructors as mixins', () => {
+    const mixin = Vue.extend({
+      directives: {
+        c: {}
+      },
+      methods: {
+        a: function () {}
+      }
+    })
+
+    const vm = new Vue({
+      mixins: [mixin],
+      methods: {
+        b: function () {}
+      }
+    })
+
+    expect(vm.a).toBeDefined()
+    expect(vm.b).toBeDefined()
+    expect(vm.$options.directives.c).toBeDefined()
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/features/options/name.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/features/options/name.spec.js
new file mode 100644 (file)
index 0000000..2f586f8
--- /dev/null
@@ -0,0 +1,40 @@
+import Vue from 'vue'
+
+describe('Options name', () => {
+  it('should contain itself in self components', () => {
+    const vm = Vue.extend({
+      name: 'SuperVue'
+    })
+
+    expect(vm.options.components['SuperVue']).toEqual(vm)
+  })
+
+  it('should warn when incorrect name given', () => {
+    Vue.extend({
+      name: 'Hyper*Vue'
+    })
+
+    /* eslint-disable */
+    expect(`Invalid component name: "Hyper*Vue". Component names can only contain alphanumeric characters and the hyphen, and must start with a letter.`)
+      .toHaveBeenWarned()
+    /* eslint-enable */
+
+    Vue.extend({
+      name: '2Cool2BValid'
+    })
+
+    /* eslint-disable */
+    expect(`Invalid component name: "2Cool2BValid". Component names can only contain alphanumeric characters and the hyphen, and must start with a letter.`)
+      .toHaveBeenWarned()
+    /* eslint-enable */
+  })
+
+  it('id should not override given name when using Vue.component', () => {
+    const SuperComponent = Vue.component('super-component', {
+      name: 'SuperVue'
+    })
+
+    expect(SuperComponent.options.components['SuperVue']).toEqual(SuperComponent)
+    expect(SuperComponent.options.components['super-component']).toEqual(SuperComponent)
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/features/options/parent.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/features/options/parent.spec.js
new file mode 100644 (file)
index 0000000..ac84471
--- /dev/null
@@ -0,0 +1,28 @@
+import Vue from 'vue'
+
+describe('Options parent', () => {
+  it('should work', () => {
+    const parent = new Vue({
+      render () {}
+    }).$mount()
+
+    const child = new Vue({
+      parent: parent,
+      render () {}
+    }).$mount()
+
+    // this option is straight-forward
+    // it should register 'parent' as a $parent for 'child'
+    // and push 'child' to $children array on 'parent'
+    expect(child.$options.parent).toBeDefined()
+    expect(child.$options.parent).toEqual(parent)
+    expect(child.$parent).toBeDefined()
+    expect(child.$parent).toEqual(parent)
+    expect(parent.$children).toContain(child)
+
+    // destroy 'child' and check if it was removed from 'parent' $children
+    child.$destroy()
+    expect(parent.$children.length).toEqual(0)
+    parent.$destroy()
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/features/options/props.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/features/options/props.spec.js
new file mode 100644 (file)
index 0000000..bdb6cda
--- /dev/null
@@ -0,0 +1,532 @@
+import Vue from 'vue'
+import { hasSymbol } from 'core/util/env'
+import testObjectOption from '../../../helpers/test-object-option'
+
+describe('Options props', () => {
+  testObjectOption('props')
+
+  it('array syntax', done => {
+    const vm = new Vue({
+      data: {
+        b: 'bar'
+      },
+      template: '<test v-bind:b="b" ref="child"></test>',
+      components: {
+        test: {
+          props: ['b'],
+          template: '<div>{{b}}</div>'
+        }
+      }
+    }).$mount()
+    expect(vm.$el.innerHTML).toBe('bar')
+    vm.b = 'baz'
+    waitForUpdate(() => {
+      expect(vm.$el.innerHTML).toBe('baz')
+      vm.$refs.child.b = 'qux'
+    }).then(() => {
+      expect(vm.$el.innerHTML).toBe('qux')
+      expect('Avoid mutating a prop directly').toHaveBeenWarned()
+    }).then(done)
+  })
+
+  it('object syntax', done => {
+    const vm = new Vue({
+      data: {
+        b: 'bar'
+      },
+      template: '<test v-bind:b="b" ref="child"></test>',
+      components: {
+        test: {
+          props: { b: String },
+          template: '<div>{{b}}</div>'
+        }
+      }
+    }).$mount()
+    expect(vm.$el.innerHTML).toBe('bar')
+    vm.b = 'baz'
+    waitForUpdate(() => {
+      expect(vm.$el.innerHTML).toBe('baz')
+      vm.$refs.child.b = 'qux'
+    }).then(() => {
+      expect(vm.$el.innerHTML).toBe('qux')
+      expect('Avoid mutating a prop directly').toHaveBeenWarned()
+    }).then(done)
+  })
+
+  it('warn mixed syntax', () => {
+    new Vue({
+      props: [{ b: String }]
+    })
+    expect('props must be strings when using array syntax').toHaveBeenWarned()
+  })
+
+  it('default values', () => {
+    const vm = new Vue({
+      data: {
+        b: undefined
+      },
+      template: '<test :b="b"></test>',
+      components: {
+        test: {
+          props: {
+            a: {
+              default: 'A' // absent
+            },
+            b: {
+              default: 'B' // undefined
+            }
+          },
+          template: '<div>{{a}}{{b}}</div>'
+        }
+      }
+    }).$mount()
+    expect(vm.$el.textContent).toBe('AB')
+  })
+
+  it('default value reactivity', done => {
+    const vm = new Vue({
+      props: {
+        a: {
+          default: () => ({ b: 1 })
+        }
+      },
+      propsData: {
+        a: undefined
+      },
+      template: '<div>{{ a.b }}</div>'
+    }).$mount()
+    expect(vm.$el.textContent).toBe('1')
+    vm.a.b = 2
+    waitForUpdate(() => {
+      expect(vm.$el.textContent).toBe('2')
+    }).then(done)
+  })
+
+  it('default value Function', () => {
+    const func = () => 132
+    const vm = new Vue({
+      props: {
+        a: {
+          type: Function,
+          default: func
+        }
+      },
+      propsData: {
+        a: undefined
+      }
+    })
+    expect(vm.a).toBe(func)
+  })
+
+  it('warn object/array default values', () => {
+    new Vue({
+      props: {
+        a: {
+          default: { b: 1 }
+        }
+      },
+      propsData: {
+        a: undefined
+      }
+    })
+    expect('Props with type Object/Array must use a factory function').toHaveBeenWarned()
+  })
+
+  it('warn missing required', () => {
+    new Vue({
+      template: '<test></test>',
+      components: {
+        test: {
+          props: { a: { required: true }},
+          template: '<div>{{a}}</div>'
+        }
+      }
+    }).$mount()
+    expect('Missing required prop: "a"').toHaveBeenWarned()
+  })
+
+  describe('assertions', () => {
+    function makeInstance (value, type, validator, required) {
+      return new Vue({
+        template: '<test :test="val"></test>',
+        data: {
+          val: value
+        },
+        components: {
+          test: {
+            template: '<div></div>',
+            props: {
+              test: {
+                type,
+                validator,
+                required
+              }
+            }
+          }
+        }
+      }).$mount()
+    }
+
+    it('string', () => {
+      makeInstance('hello', String)
+      expect(console.error.calls.count()).toBe(0)
+      makeInstance(123, String)
+      expect('Expected String').toHaveBeenWarned()
+    })
+
+    it('number', () => {
+      makeInstance(123, Number)
+      expect(console.error.calls.count()).toBe(0)
+      makeInstance('123', Number)
+      expect('Expected Number').toHaveBeenWarned()
+    })
+
+    it('boolean', () => {
+      makeInstance(true, Boolean)
+      expect(console.error.calls.count()).toBe(0)
+      makeInstance('123', Boolean)
+      expect('Expected Boolean').toHaveBeenWarned()
+    })
+
+    it('function', () => {
+      makeInstance(() => {}, Function)
+      expect(console.error.calls.count()).toBe(0)
+      makeInstance(123, Function)
+      expect('Expected Function').toHaveBeenWarned()
+    })
+
+    it('object', () => {
+      makeInstance({}, Object)
+      expect(console.error.calls.count()).toBe(0)
+      makeInstance([], Object)
+      expect('Expected Object').toHaveBeenWarned()
+    })
+
+    it('array', () => {
+      makeInstance([], Array)
+      expect(console.error.calls.count()).toBe(0)
+      makeInstance({}, Array)
+      expect('Expected Array').toHaveBeenWarned()
+    })
+
+    it('primitive wrapper objects', () => {
+      /* eslint-disable no-new-wrappers */
+      makeInstance(new String('s'), String)
+      expect(console.error.calls.count()).toBe(0)
+      makeInstance(new Number(1), Number)
+      expect(console.error.calls.count()).toBe(0)
+      makeInstance(new Boolean(true), Boolean)
+      expect(console.error.calls.count()).toBe(0)
+      /* eslint-enable no-new-wrappers */
+    })
+
+    if (hasSymbol) {
+      it('symbol', () => {
+        makeInstance(Symbol('foo'), Symbol)
+        expect(console.error.calls.count()).toBe(0)
+        makeInstance({}, Symbol)
+        expect('Expected Symbol').toHaveBeenWarned()
+      })
+    }
+
+    it('custom constructor', () => {
+      function Class () {}
+      makeInstance(new Class(), Class)
+      expect(console.error.calls.count()).toBe(0)
+      makeInstance({}, Class)
+      expect('type check failed').toHaveBeenWarned()
+    })
+
+    it('multiple types', () => {
+      makeInstance([], [Array, Number, Boolean])
+      expect(console.error.calls.count()).toBe(0)
+      makeInstance({}, [Array, Number, Boolean])
+      expect('Expected Array, Number, Boolean, got Object').toHaveBeenWarned()
+    })
+
+    it('custom validator', () => {
+      makeInstance(123, null, v => v === 123)
+      expect(console.error.calls.count()).toBe(0)
+      makeInstance(123, null, v => v === 234)
+      expect('custom validator check failed').toHaveBeenWarned()
+    })
+
+    it('type check + custom validator', () => {
+      makeInstance(123, Number, v => v === 123)
+      expect(console.error.calls.count()).toBe(0)
+      makeInstance(123, Number, v => v === 234)
+      expect('custom validator check failed').toHaveBeenWarned()
+      makeInstance(123, String, v => v === 123)
+      expect('Expected String').toHaveBeenWarned()
+    })
+
+    it('multiple types + custom validator', () => {
+      makeInstance(123, [Number, String, Boolean], v => v === 123)
+      expect(console.error.calls.count()).toBe(0)
+      makeInstance(123, [Number, String, Boolean], v => v === 234)
+      expect('custom validator check failed').toHaveBeenWarned()
+      makeInstance(123, [String, Boolean], v => v === 123)
+      expect('Expected String, Boolean').toHaveBeenWarned()
+    })
+
+    it('optional with type + null/undefined', () => {
+      makeInstance(undefined, String)
+      expect(console.error.calls.count()).toBe(0)
+      makeInstance(null, String)
+      expect(console.error.calls.count()).toBe(0)
+    })
+
+    it('required with type + null/undefined', () => {
+      makeInstance(undefined, String, null, true)
+      expect(console.error.calls.count()).toBe(1)
+      expect('Expected String').toHaveBeenWarned()
+      makeInstance(null, Boolean, null, true)
+      expect(console.error.calls.count()).toBe(2)
+      expect('Expected Boolean').toHaveBeenWarned()
+    })
+
+    it('optional prop of any type (type: true or prop: true)', () => {
+      makeInstance(1, true)
+      expect(console.error.calls.count()).toBe(0)
+      makeInstance('any', true)
+      expect(console.error.calls.count()).toBe(0)
+      makeInstance({}, true)
+      expect(console.error.calls.count()).toBe(0)
+      makeInstance(undefined, true)
+      expect(console.error.calls.count()).toBe(0)
+      makeInstance(null, true)
+      expect(console.error.calls.count()).toBe(0)
+    })
+  })
+
+  it('should work with v-bind', () => {
+    const vm = new Vue({
+      template: `<test v-bind="{ a: 1, b: 2 }"></test>`,
+      components: {
+        test: {
+          props: ['a', 'b'],
+          template: '<div>{{ a }} {{ b }}</div>'
+        }
+      }
+    }).$mount()
+    expect(vm.$el.textContent).toBe('1 2')
+  })
+
+  it('should warn data fields already defined as a prop', () => {
+    new Vue({
+      template: '<test a="1"></test>',
+      components: {
+        test: {
+          template: '<div></div>',
+          data: function () {
+            return { a: 123 }
+          },
+          props: {
+            a: null
+          }
+        }
+      }
+    }).$mount()
+    expect('already declared as a prop').toHaveBeenWarned()
+  })
+
+  it('should warn methods already defined as a prop', () => {
+    new Vue({
+      template: '<test a="1"></test>',
+      components: {
+        test: {
+          template: '<div></div>',
+          props: {
+            a: null
+          },
+          methods: {
+            a () {
+
+            }
+          }
+        }
+      }
+    }).$mount()
+    expect(`Method "a" has already been defined as a prop`).toHaveBeenWarned()
+    expect(`Avoid mutating a prop directly`).toHaveBeenWarned()
+  })
+
+  it('treat boolean props properly', () => {
+    const vm = new Vue({
+      template: '<comp ref="child" prop-a prop-b="prop-b"></comp>',
+      components: {
+        comp: {
+          template: '<div></div>',
+          props: {
+            propA: Boolean,
+            propB: Boolean,
+            propC: Boolean
+          }
+        }
+      }
+    }).$mount()
+    expect(vm.$refs.child.propA).toBe(true)
+    expect(vm.$refs.child.propB).toBe(true)
+    expect(vm.$refs.child.propC).toBe(false)
+  })
+
+  it('should respect default value of a Boolean prop', function () {
+    const vm = new Vue({
+      template: '<test></test>',
+      components: {
+        test: {
+          props: {
+            prop: {
+              type: Boolean,
+              default: true
+            }
+          },
+          template: '<div>{{prop}}</div>'
+        }
+      }
+    }).$mount()
+    expect(vm.$el.textContent).toBe('true')
+  })
+
+  it('non reactive values passed down as prop should not be converted', done => {
+    const a = Object.freeze({
+      nested: {
+        msg: 'hello'
+      }
+    })
+    const parent = new Vue({
+      template: '<comp :a="a.nested"></comp>',
+      data: {
+        a: a
+      },
+      components: {
+        comp: {
+          template: '<div></div>',
+          props: ['a']
+        }
+      }
+    }).$mount()
+    const child = parent.$children[0]
+    expect(child.a.msg).toBe('hello')
+    expect(child.a.__ob__).toBeUndefined() // should not be converted
+    parent.a = Object.freeze({
+      nested: {
+        msg: 'yo'
+      }
+    })
+    waitForUpdate(() => {
+      expect(child.a.msg).toBe('yo')
+      expect(child.a.__ob__).toBeUndefined()
+    }).then(done)
+  })
+
+  it('should not warn for non-required, absent prop', function () {
+    new Vue({
+      template: '<test></test>',
+      components: {
+        test: {
+          template: '<div></div>',
+          props: {
+            prop: {
+              type: String
+            }
+          }
+        }
+      }
+    }).$mount()
+    expect(console.error.calls.count()).toBe(0)
+  })
+
+  // #3453
+  it('should not fire watcher on object/array props when parent re-renders', done => {
+    const spy = jasmine.createSpy()
+    const vm = new Vue({
+      data: {
+        arr: []
+      },
+      template: '<test :prop="arr">hi</test>',
+      components: {
+        test: {
+          props: ['prop'],
+          watch: {
+            prop: spy
+          },
+          template: '<div><slot></slot></div>'
+        }
+      }
+    }).$mount()
+    vm.$forceUpdate()
+    waitForUpdate(() => {
+      expect(spy).not.toHaveBeenCalled()
+    }).then(done)
+  })
+
+  // #4090
+  it('should not trigger watcher on default value', done => {
+    const spy = jasmine.createSpy()
+    const vm = new Vue({
+      template: `<test :value="a" :test="b"></test>`,
+      data: {
+        a: 1,
+        b: undefined
+      },
+      components: {
+        test: {
+          template: '<div>{{ value }}</div>',
+          props: {
+            value: { type: Number },
+            test: {
+              type: Object,
+              default: () => ({})
+            }
+          },
+          watch: {
+            test: spy
+          }
+        }
+      }
+    }).$mount()
+
+    vm.a++
+    waitForUpdate(() => {
+      expect(spy).not.toHaveBeenCalled()
+      vm.b = {}
+    }).then(() => {
+      expect(spy.calls.count()).toBe(1)
+    }).then(() => {
+      vm.b = undefined
+    }).then(() => {
+      expect(spy.calls.count()).toBe(2)
+      vm.a++
+    }).then(() => {
+      expect(spy.calls.count()).toBe(2)
+    }).then(done)
+  })
+
+  it('warn reserved props', () => {
+    const specialAttrs = ['key', 'ref', 'slot', 'is', 'slot-scope']
+    new Vue({
+      props: specialAttrs
+    })
+    specialAttrs.forEach(attr => {
+      expect(`"${attr}" is a reserved attribute`).toHaveBeenWarned()
+    })
+  })
+
+  it('should consider order when casting [Boolean, String] multi-type props', () => {
+    const vm = new Vue({
+      template: '<test ref="test" booleanOrString stringOrBoolean />',
+      components: {
+        test: {
+          template: '<div></div>',
+          props: {
+            booleanOrString: [Boolean, String],
+            stringOrBoolean: [String, Boolean]
+          }
+        }
+      }
+    }).$mount()
+    expect(vm.$refs.test.$props.booleanOrString).toBe(true)
+    expect(vm.$refs.test.$props.stringOrBoolean).toBe('')
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/features/options/propsData.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/features/options/propsData.spec.js
new file mode 100644 (file)
index 0000000..9fa5557
--- /dev/null
@@ -0,0 +1,30 @@
+import Vue from 'vue'
+
+describe('Options propsData', () => {
+  it('should work', done => {
+    const A = Vue.extend({
+      props: ['a'],
+      template: '<div>{{ a }}</div>'
+    })
+    const vm = new A({
+      propsData: {
+        a: 123
+      }
+    }).$mount()
+    expect(vm.a).toBe(123)
+    expect(vm.$el.textContent).toBe('123')
+    vm.a = 234
+    waitForUpdate(() => {
+      expect(vm.$el.textContent).toBe('234')
+    }).then(done)
+  })
+
+  it('warn non instantiation usage', () => {
+    Vue.extend({
+      propsData: {
+        a: 123
+      }
+    })
+    expect('option "propsData" can only be used during instance creation').toHaveBeenWarned()
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/features/options/render.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/features/options/render.spec.js
new file mode 100644 (file)
index 0000000..302e2ee
--- /dev/null
@@ -0,0 +1,39 @@
+import Vue from 'vue'
+
+describe('Options render', () => {
+  it('basic usage', () => {
+    const vm = new Vue({
+      render (h) {
+        const children = []
+        for (let i = 0; i < this.items.length; i++) {
+          children.push(h('li', { staticClass: 'task' }, [this.items[i].name]))
+        }
+        return h('ul', { staticClass: 'tasks' }, children)
+      },
+      data: {
+        items: [{ id: 1, name: 'task1' }, { id: 2, name: 'task2' }]
+      }
+    }).$mount()
+    expect(vm.$el.tagName).toBe('UL')
+    for (let i = 0; i < vm.$el.children.length; i++) {
+      const li = vm.$el.children[i]
+      expect(li.tagName).toBe('LI')
+      expect(li.textContent).toBe(vm.items[i].name)
+    }
+  })
+
+  it('allow null data', () => {
+    const vm = new Vue({
+      render (h) {
+        return h('div', null, 'hello' /* string as children*/)
+      }
+    }).$mount()
+    expect(vm.$el.tagName).toBe('DIV')
+    expect(vm.$el.textContent).toBe('hello')
+  })
+
+  it('should warn non `render` option and non `template` option', () => {
+    new Vue().$mount()
+    expect('Failed to mount component: template or render function not defined.').toHaveBeenWarned()
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/features/options/renderError.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/features/options/renderError.spec.js
new file mode 100644 (file)
index 0000000..20a0aa7
--- /dev/null
@@ -0,0 +1,42 @@
+import Vue from 'vue'
+
+describe('Options renderError', () => {
+  it('should be used on render errors', done => {
+    Vue.config.errorHandler = () => {}
+    const vm = new Vue({
+      data: {
+        ok: true
+      },
+      render (h) {
+        if (this.ok) {
+          return h('div', 'ok')
+        } else {
+          throw new Error('no')
+        }
+      },
+      renderError (h, err) {
+        return h('div', err.toString())
+      }
+    }).$mount()
+    expect(vm.$el.textContent).toBe('ok')
+    vm.ok = false
+    waitForUpdate(() => {
+      expect(vm.$el.textContent).toBe('Error: no')
+      Vue.config.errorHandler = null
+    }).then(done)
+  })
+
+  it('should pass on errors in renderError to global handler', () => {
+    const spy = Vue.config.errorHandler = jasmine.createSpy()
+    const err = new Error('renderError')
+    const vm = new Vue({
+      render () {
+        throw new Error('render')
+      },
+      renderError () {
+        throw err
+      }
+    }).$mount()
+    expect(spy).toHaveBeenCalledWith(err, vm, 'renderError')
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/features/options/template.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/features/options/template.spec.js
new file mode 100644 (file)
index 0000000..09aafd3
--- /dev/null
@@ -0,0 +1,91 @@
+import Vue from 'vue'
+
+describe('Options template', () => {
+  let el
+  beforeEach(() => {
+    el = document.createElement('script')
+    el.type = 'x-template'
+    el.id = 'app'
+    el.innerHTML = '<p>{{message}}</p>'
+    document.body.appendChild(el)
+  })
+
+  afterEach(() => {
+    document.body.removeChild(el)
+  })
+
+  it('basic usage', () => {
+    const vm = new Vue({
+      template: '<div>{{message}}</div>',
+      data: { message: 'hello world' }
+    }).$mount()
+    expect(vm.$el.tagName).toBe('DIV')
+    expect(vm.$el.textContent).toBe(vm.message)
+  })
+
+  it('id reference', () => {
+    const vm = new Vue({
+      template: '#app',
+      data: { message: 'hello world' }
+    }).$mount()
+    expect(vm.$el.tagName).toBe('P')
+    expect(vm.$el.textContent).toBe(vm.message)
+  })
+
+  it('DOM element', () => {
+    const elm = document.createElement('p')
+    elm.innerHTML = '<p>{{message}}</p>'
+    const vm = new Vue({
+      template: elm,
+      data: { message: 'hello world' }
+    }).$mount()
+    expect(vm.$el.tagName).toBe('P')
+    expect(vm.$el.textContent).toBe(vm.message)
+  })
+
+  it('invalid template', () => {
+    new Vue({
+      template: Vue,
+      data: { message: 'hello world' }
+    }).$mount()
+    expect('invalid template option').toHaveBeenWarned()
+  })
+
+  it('warn error in generated function', () => {
+    new Vue({
+      template: '<div v-if="!@"><span>{{ a"" }}</span><span>{{ do + 1 }}</span></div>'
+    }).$mount()
+    expect('Error compiling template').toHaveBeenWarned()
+    expect('Raw expression: v-if="!@"').toHaveBeenWarned()
+    expect('Raw expression: {{ a"" }}').toHaveBeenWarned()
+    expect('avoid using JavaScript keyword as property name: "do"').toHaveBeenWarned()
+  })
+
+  it('should not warn $ prefixed keywords', () => {
+    new Vue({
+      template: `<div @click="$delete(foo, 'bar')"></div>`
+    }).$mount()
+    expect('avoid using JavaScript keyword as property name').not.toHaveBeenWarned()
+  })
+
+  it('warn error in generated function (v-for)', () => {
+    new Vue({
+      template: '<div><div v-for="(1, 2) in a----"></div></div>'
+    }).$mount()
+    expect('Error compiling template').toHaveBeenWarned()
+    expect('invalid v-for alias "1"').toHaveBeenWarned()
+    expect('invalid v-for iterator "2"').toHaveBeenWarned()
+    expect('Raw expression: v-for="(1, 2) in a----"').toHaveBeenWarned()
+  })
+
+  it('warn error in generated function (v-on)', () => {
+    new Vue({
+      template: `<div @click="delete('Delete')"></div>`,
+      methods: { delete: function () {} }
+    }).$mount()
+    expect('Error compiling template').toHaveBeenWarned()
+    expect(
+      `avoid using JavaScript unary operator as property name: "delete()" in expression @click="delete('Delete')"`
+    ).toHaveBeenWarned()
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/features/options/watch.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/features/options/watch.spec.js
new file mode 100644 (file)
index 0000000..e16b2f8
--- /dev/null
@@ -0,0 +1,146 @@
+import Vue from 'vue'
+import testObjectOption from '../../../helpers/test-object-option'
+
+describe('Options watch', () => {
+  let spy
+  beforeEach(() => {
+    spy = jasmine.createSpy('watch')
+  })
+
+  testObjectOption('watch')
+
+  it('basic usage', done => {
+    const vm = new Vue({
+      data: {
+        a: 1
+      },
+      watch: {
+        a: spy
+      }
+    })
+    expect(spy).not.toHaveBeenCalled()
+    vm.a = 2
+    expect(spy).not.toHaveBeenCalled()
+    waitForUpdate(() => {
+      expect(spy).toHaveBeenCalledWith(2, 1)
+    }).then(done)
+  })
+
+  it('string method name', done => {
+    const vm = new Vue({
+      data: {
+        a: 1
+      },
+      watch: {
+        a: 'onChange'
+      },
+      methods: {
+        onChange: spy
+      }
+    })
+    expect(spy).not.toHaveBeenCalled()
+    vm.a = 2
+    expect(spy).not.toHaveBeenCalled()
+    waitForUpdate(() => {
+      expect(spy).toHaveBeenCalledWith(2, 1)
+    }).then(done)
+  })
+
+  it('multiple cbs (after option merge)', done => {
+    const spy1 = jasmine.createSpy('watch')
+    const Test = Vue.extend({
+      watch: {
+        a: spy1
+      }
+    })
+    const vm = new Test({
+      data: { a: 1 },
+      watch: {
+        a: spy
+      }
+    })
+    vm.a = 2
+    waitForUpdate(() => {
+      expect(spy1).toHaveBeenCalledWith(2, 1)
+      expect(spy).toHaveBeenCalledWith(2, 1)
+    }).then(done)
+  })
+
+  it('with option: immediate', done => {
+    const vm = new Vue({
+      data: { a: 1 },
+      watch: {
+        a: {
+          handler: spy,
+          immediate: true
+        }
+      }
+    })
+    expect(spy).toHaveBeenCalledWith(1)
+    vm.a = 2
+    waitForUpdate(() => {
+      expect(spy).toHaveBeenCalledWith(2, 1)
+    }).then(done)
+  })
+
+  it('with option: deep', done => {
+    const vm = new Vue({
+      data: { a: { b: 1 }},
+      watch: {
+        a: {
+          handler: spy,
+          deep: true
+        }
+      }
+    })
+    const oldA = vm.a
+    expect(spy).not.toHaveBeenCalled()
+    vm.a.b = 2
+    expect(spy).not.toHaveBeenCalled()
+    waitForUpdate(() => {
+      expect(spy).toHaveBeenCalledWith(vm.a, vm.a)
+      vm.a = { b: 3 }
+    }).then(() => {
+      expect(spy).toHaveBeenCalledWith(vm.a, oldA)
+    }).then(done)
+  })
+
+  it('correctly merges multiple extends', done => {
+    var spy2 = jasmine.createSpy('A')
+    var spy3 = jasmine.createSpy('B')
+    var A = Vue.extend({
+      data: function () {
+        return {
+          a: 0,
+          b: 0
+        }
+      },
+      watch: {
+        b: spy
+      }
+    })
+
+    var B = Vue.extend({
+      extends: A,
+      watch: {
+        a: spy2
+      }
+    })
+
+    var C = Vue.extend({
+      extends: B,
+      watch: {
+        a: spy3
+      }
+    })
+
+    var vm = new C()
+    vm.a = 1
+
+    waitForUpdate(() => {
+      expect(spy).not.toHaveBeenCalled()
+      expect(spy2).toHaveBeenCalledWith(1, 0)
+      expect(spy3).toHaveBeenCalledWith(1, 0)
+    }).then(done)
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/features/ref.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/features/ref.spec.js
new file mode 100644 (file)
index 0000000..971c8fb
--- /dev/null
@@ -0,0 +1,227 @@
+import Vue from 'vue'
+
+describe('ref', () => {
+  const components = {
+    test: {
+      id: 'test',
+      template: '<div>test</div>'
+    },
+    test2: {
+      id: 'test2',
+      template: '<div>test2</div>'
+    },
+    test3: {
+      id: 'test3',
+      template: '<div>test3</div>'
+    }
+  }
+
+  it('should work', () => {
+    const vm = new Vue({
+      data: {
+        value: 'bar'
+      },
+      template: `<div>
+        <test ref="foo"></test>
+        <test2 :ref="value"></test2>
+        <test3 :ref="0"></test3>
+      </div>`,
+      components
+    })
+    vm.$mount()
+    expect(vm.$refs.foo).toBeTruthy()
+    expect(vm.$refs.foo.$options.id).toBe('test')
+    expect(vm.$refs.bar).toBeTruthy()
+    expect(vm.$refs.bar.$options.id).toBe('test2')
+    expect(vm.$refs['0']).toBeTruthy()
+    expect(vm.$refs['0'].$options.id).toBe('test3')
+  })
+
+  it('should dynamically update refs', done => {
+    const vm = new Vue({
+      data: {
+        value: 'foo'
+      },
+      template: '<div :ref="value"></div>'
+    }).$mount()
+    expect(vm.$refs.foo).toBe(vm.$el)
+    vm.value = 'bar'
+    waitForUpdate(() => {
+      expect(vm.$refs.foo).toBeUndefined()
+      expect(vm.$refs.bar).toBe(vm.$el)
+    }).then(done)
+  })
+
+  it('should work as a hyperscript prop', () => {
+    const vm = new Vue({
+      components,
+      render (h) {
+        return h('div', null, [
+          h('test', { ref: 'test' })
+        ])
+      }
+    })
+    vm.$mount()
+    expect(vm.$refs.test).toBeTruthy()
+    expect(vm.$refs.test.$options.id).toBe('test')
+  })
+
+  it('should accept HOC component', () => {
+    const vm = new Vue({
+      template: '<test ref="test"></test>',
+      components
+    })
+    vm.$mount()
+    expect(vm.$refs.test).toBeTruthy()
+    expect(vm.$refs.test.$options.id).toBe('test')
+  })
+
+  it('should accept dynamic component', done => {
+    const vm = new Vue({
+      template: `<div>
+        <component :is="test" ref="test"></component>
+      </div>`,
+      components,
+      data: { test: 'test' }
+    })
+    vm.$mount()
+    expect(vm.$refs.test.$options.id).toBe('test')
+    vm.test = 'test2'
+    waitForUpdate(() => {
+      expect(vm.$refs.test.$options.id).toBe('test2')
+      vm.test = ''
+    }).then(() => {
+      expect(vm.$refs.test).toBeUndefined()
+    }).then(done)
+  })
+
+  it('should register as Array when used with v-for', done => {
+    const vm = new Vue({
+      data: {
+        items: [1, 2, 3]
+      },
+      template: `
+        <div>
+          <div v-for="n in items" ref="list">{{n}}</div>
+        </div>
+      `
+    }).$mount()
+    assertRefs()
+    // updating
+    vm.items.push(4)
+    waitForUpdate(assertRefs)
+      .then(() => { vm.items = [] })
+      .then(assertRefs)
+      .then(done)
+
+    function assertRefs () {
+      expect(Array.isArray(vm.$refs.list)).toBe(true)
+      expect(vm.$refs.list.length).toBe(vm.items.length)
+      expect(vm.$refs.list.every((item, i) => item.textContent === String(i + 1))).toBe(true)
+    }
+  })
+
+  it('should register as Array when used with v-for (components)', done => {
+    const vm = new Vue({
+      data: {
+        items: [1, 2, 3]
+      },
+      template: `
+        <div>
+          <test v-for="n in items" ref="list" :key="n" :n="n"></test>
+        </div>
+      `,
+      components: {
+        test: {
+          props: ['n'],
+          template: '<div>{{ n }}</div>'
+        }
+      }
+    }).$mount()
+    assertRefs()
+    // updating
+    vm.items.push(4)
+    waitForUpdate(assertRefs)
+      .then(() => { vm.items = [] })
+      .then(assertRefs)
+      .then(done)
+
+    function assertRefs () {
+      expect(Array.isArray(vm.$refs.list)).toBe(true)
+      expect(vm.$refs.list.length).toBe(vm.items.length)
+      expect(vm.$refs.list.every((comp, i) => comp.$el.textContent === String(i + 1))).toBe(true)
+    }
+  })
+
+  it('should work with v-for on dynamic component', done => {
+    components.test3 = {
+      id: 'test3',
+      template: `<test1 v-if="!normal"></test1><div v-else>test3</div>`,
+      data () {
+        return { normal: false }
+      },
+      components: { test1: components.test }
+    }
+    // a flag that representing whether to test component content or not
+    let testContent = false
+
+    const vm = new Vue({
+      template: `
+        <div>
+          <component
+            v-for="(item, index) in items"
+            :key="index"
+            :is="item"
+            ref="children">
+          </component>
+        </div>
+      `,
+      data: {
+        items: ['test2', 'test3']
+      },
+      components
+    }).$mount()
+    assertRefs()
+    expect(vm.$refs.children[0].$el.textContent).toBe('test2')
+    expect(vm.$refs.children[1].$el.textContent).toBe('test')
+    // updating
+    vm.$refs.children[1].normal = true
+    testContent = true
+    waitForUpdate(assertRefs)
+      .then(() => { vm.items.push('test') })
+      .then(assertRefs)
+      .then(done)
+
+    function assertRefs () {
+      expect(Array.isArray(vm.$refs.children)).toBe(true)
+      expect(vm.$refs.children.length).toBe(vm.items.length)
+      if (testContent) {
+        expect(
+          vm.$refs.children.every((comp, i) => comp.$el.textContent === vm.items[i])
+        ).toBe(true)
+      }
+    }
+  })
+
+  it('should register on component with empty roots', done => {
+    const vm = new Vue({
+      template: '<child ref="test"></child>',
+      components: {
+        child: {
+          template: '<div v-if="show"></div>',
+          data () {
+            return { show: false }
+          }
+        }
+      }
+    }).$mount()
+    expect(vm.$refs.test).toBe(vm.$children[0])
+    vm.$refs.test.show = true
+    waitForUpdate(() => {
+      expect(vm.$refs.test).toBe(vm.$children[0])
+      vm.$refs.test.show = false
+    }).then(() => {
+      expect(vm.$refs.test).toBe(vm.$children[0])
+    }).then(done)
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/features/transition/inject-styles.js b/advancedcontentfilter/vendor/asset/vue/test/unit/features/transition/inject-styles.js
new file mode 100644 (file)
index 0000000..2304e3d
--- /dev/null
@@ -0,0 +1,64 @@
+function insertCSS (text) {
+  var cssEl = document.createElement('style')
+  cssEl.textContent = text.trim()
+  document.head.appendChild(cssEl)
+}
+
+const duration = process.env.TRANSITION_DURATION || 50
+const buffer = process.env.TRANSITION_BUFFER || 10
+let injected = false
+
+export default function injectStyles () {
+  if (injected) return { duration, buffer }
+  injected = true
+  insertCSS(`
+    .test {
+      -webkit-transition: opacity ${duration}ms ease;
+      transition: opacity ${duration}ms ease;
+    }
+    .group-move {
+      -webkit-transition: -webkit-transform ${duration}ms ease;
+      transition: transform ${duration}ms ease;
+    }
+    .v-appear, .v-enter, .v-leave-active,
+    .test-appear, .test-enter, .test-leave-active,
+    .hello, .bye.active,
+    .changed-enter {
+      opacity: 0;
+    }
+    .test-anim-enter-active {
+      animation: test-enter ${duration}ms;
+      -webkit-animation: test-enter ${duration}ms;
+    }
+    .test-anim-leave-active {
+      animation: test-leave ${duration}ms;
+      -webkit-animation: test-leave ${duration}ms;
+    }
+    .test-anim-long-enter-active {
+      animation: test-enter ${duration * 2}ms;
+      -webkit-animation: test-enter ${duration * 2}ms;
+    }
+    .test-anim-long-leave-active {
+      animation: test-leave ${duration * 2}ms;
+      -webkit-animation: test-leave ${duration * 2}ms;
+    }
+    @keyframes test-enter {
+      from { opacity: 0 }
+      to { opacity: 1 }
+    }
+    @-webkit-keyframes test-enter {
+      from { opacity: 0 }
+      to { opacity: 1 }
+    }
+    @keyframes test-leave {
+      from { opacity: 1 }
+      to { opacity: 0 }
+    }
+    @-webkit-keyframes test-leave {
+      from { opacity: 1 }
+      to { opacity: 0 }
+    }
+  `)
+  return { duration, buffer }
+}
+
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/features/transition/transition-group.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/features/transition/transition-group.spec.js
new file mode 100644 (file)
index 0000000..2988d5b
--- /dev/null
@@ -0,0 +1,344 @@
+import Vue from 'vue'
+import injectStyles from './inject-styles'
+import { isIE9 } from 'core/util/env'
+import { nextFrame } from 'web/runtime/transition-util'
+
+if (!isIE9) {
+  describe('Transition group', () => {
+    const { duration, buffer } = injectStyles()
+
+    let el
+    beforeEach(() => {
+      el = document.createElement('div')
+      document.body.appendChild(el)
+    })
+
+    function createBasicVM (useIs, appear) {
+      const vm = new Vue({
+        template: `
+          <div>
+            ${useIs ? `<span is="transition-group">` : `<transition-group${appear ? ` appear` : ``}>`}
+              <div v-for="item in items" :key="item" class="test">{{ item }}</div>
+            ${useIs ? `</span>` : `</transition-group>`}
+          </div>
+        `,
+        data: {
+          items: ['a', 'b', 'c']
+        }
+      }).$mount(el)
+      if (!appear) {
+        expect(vm.$el.innerHTML).toBe(
+          `<span>` +
+            vm.items.map(i => `<div class="test">${i}</div>`).join('') +
+          `</span>`
+        )
+      }
+      return vm
+    }
+
+    it('enter', done => {
+      const vm = createBasicVM()
+      vm.items.push('d', 'e')
+      waitForUpdate(() => {
+        expect(vm.$el.innerHTML).toBe(
+          `<span>` +
+            ['a', 'b', 'c'].map(i => `<div class="test">${i}</div>`).join('') +
+            `<div class="test v-enter v-enter-active">d</div>` +
+            `<div class="test v-enter v-enter-active">e</div>` +
+          `</span>`
+        )
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          `<span>` +
+            ['a', 'b', 'c'].map(i => `<div class="test">${i}</div>`).join('') +
+            `<div class="test v-enter-active v-enter-to">d</div>` +
+            `<div class="test v-enter-active v-enter-to">e</div>` +
+          `</span>`
+        )
+      }).thenWaitFor(duration + buffer).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          `<span>` +
+            vm.items.map(i => `<div class="test">${i}</div>`).join('') +
+          `</span>`
+        )
+      }).then(done)
+    })
+
+    it('leave', done => {
+      const vm = createBasicVM()
+      vm.items = ['b']
+      waitForUpdate(() => {
+        expect(vm.$el.innerHTML).toBe(
+          `<span>` +
+            `<div class="test v-leave v-leave-active">a</div>` +
+            `<div class="test">b</div>` +
+            `<div class="test v-leave v-leave-active">c</div>` +
+          `</span>`
+        )
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          `<span>` +
+            `<div class="test v-leave-active v-leave-to">a</div>` +
+            `<div class="test">b</div>` +
+            `<div class="test v-leave-active v-leave-to">c</div>` +
+          `</span>`
+        )
+      }).thenWaitFor(duration + buffer).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          `<span>` +
+            vm.items.map(i => `<div class="test">${i}</div>`).join('') +
+          `</span>`
+        )
+      }).then(done)
+    })
+
+    it('enter + leave', done => {
+      const vm = createBasicVM()
+      vm.items = ['b', 'c', 'd']
+      waitForUpdate(() => {
+        expect(vm.$el.innerHTML).toBe(
+          `<span>` +
+            `<div class="test v-leave v-leave-active">a</div>` +
+            `<div class="test">b</div>` +
+            `<div class="test">c</div>` +
+            `<div class="test v-enter v-enter-active">d</div>` +
+          `</span>`
+        )
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          `<span>` +
+            `<div class="test v-leave-active v-leave-to">a</div>` +
+            `<div class="test">b</div>` +
+            `<div class="test">c</div>` +
+            `<div class="test v-enter-active v-enter-to">d</div>` +
+          `</span>`
+        )
+      }).thenWaitFor(duration + buffer).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          `<span>` +
+            vm.items.map(i => `<div class="test">${i}</div>`).join('') +
+          `</span>`
+        )
+      }).then(done)
+    })
+
+    it('use with "is" attribute', done => {
+      const vm = createBasicVM(true)
+      vm.items = ['b', 'c', 'd']
+      waitForUpdate(() => {
+        expect(vm.$el.innerHTML).toBe(
+          `<span>` +
+            `<div class="test v-leave v-leave-active">a</div>` +
+            `<div class="test">b</div>` +
+            `<div class="test">c</div>` +
+            `<div class="test v-enter v-enter-active">d</div>` +
+          `</span>`
+        )
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          `<span>` +
+            `<div class="test v-leave-active v-leave-to">a</div>` +
+            `<div class="test">b</div>` +
+            `<div class="test">c</div>` +
+            `<div class="test v-enter-active v-enter-to">d</div>` +
+          `</span>`
+        )
+      }).thenWaitFor(duration + buffer).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          `<span>` +
+            vm.items.map(i => `<div class="test">${i}</div>`).join('') +
+          `</span>`
+        )
+      }).then(done)
+    })
+
+    it('appear', done => {
+      const vm = createBasicVM(false, true /* appear */)
+      waitForUpdate(() => {
+        expect(vm.$el.innerHTML).toBe(
+          `<span>` +
+            vm.items.map(i => `<div class="test v-enter v-enter-active">${i}</div>`).join('') +
+          `</span>`
+        )
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          `<span>` +
+            vm.items.map(i => `<div class="test v-enter-active v-enter-to">${i}</div>`).join('') +
+          `</span>`
+        )
+      }).thenWaitFor(duration + buffer).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          `<span>` +
+            vm.items.map(i => `<div class="test">${i}</div>`).join('') +
+          `</span>`
+        )
+      }).then(done)
+    })
+
+    it('events', done => {
+      let next
+      const beforeEnterSpy = jasmine.createSpy()
+      const afterEnterSpy = jasmine.createSpy()
+      const afterLeaveSpy = jasmine.createSpy()
+      const vm = new Vue({
+        template: `
+          <div>
+            <transition-group @before-enter="beforeEnter" @after-enter="afterEnter" @after-leave="afterLeave">
+              <div v-for="item in items" :key="item" class="test">{{ item }}</div>
+            </transition-group>
+          </div>
+        `,
+        data: {
+          items: ['a', 'b', 'c']
+        },
+        methods: {
+          beforeEnter (el) {
+            expect(el.textContent).toBe('d')
+            beforeEnterSpy()
+          },
+          afterEnter (el) {
+            expect(el.textContent).toBe('d')
+            afterEnterSpy()
+            next()
+          },
+          afterLeave (el) {
+            expect(el.textContent).toBe('a')
+            afterLeaveSpy()
+            next()
+          }
+        }
+      }).$mount(el)
+
+      vm.items.push('d')
+      waitForUpdate(() => {
+        expect(vm.$el.innerHTML).toBe(
+          `<span>` +
+            `<div class="test">a</div>` +
+            `<div class="test">b</div>` +
+            `<div class="test">c</div>` +
+            `<div class="test v-enter v-enter-active">d</div>` +
+          `</span>`
+        )
+        expect(beforeEnterSpy.calls.count()).toBe(1)
+      }).thenWaitFor(_next => { next = _next }).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          `<span>` +
+            `<div class="test">a</div>` +
+            `<div class="test">b</div>` +
+            `<div class="test">c</div>` +
+            `<div class="test">d</div>` +
+          `</span>`
+        )
+        expect(afterEnterSpy.calls.count()).toBe(1)
+        vm.items.shift()
+      }).thenWaitFor(_next => { next = _next }).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          `<span>` +
+            `<div class="test">b</div>` +
+            `<div class="test">c</div>` +
+            `<div class="test">d</div>` +
+          `</span>`
+        )
+        expect(afterLeaveSpy.calls.count()).toBe(1)
+      }).then(done)
+    })
+
+    it('move', done => {
+      const vm = new Vue({
+        template: `
+          <div>
+            <transition-group name="group">
+              <div v-for="item in items" :key="item" class="test">{{ item }}</div>
+            </transition-group>
+          </div>
+        `,
+        data: {
+          items: ['a', 'b', 'c']
+        }
+      }).$mount(el)
+
+      vm.items = ['d', 'b', 'a']
+      waitForUpdate(() => {
+        expect(vm.$el.innerHTML.replace(/\s?style=""(\s?)/g, '$1')).toBe(
+          `<span>` +
+            `<div class="test group-enter group-enter-active">d</div>` +
+            `<div class="test">b</div>` +
+            `<div class="test group-move">a</div>` +
+            `<div class="test group-leave group-leave-active group-move">c</div>` +
+          `</span>`
+        )
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.innerHTML.replace(/\s?style=""(\s?)/g, '$1')).toBe(
+          `<span>` +
+            `<div class="test group-enter-active group-enter-to">d</div>` +
+            `<div class="test">b</div>` +
+            `<div class="test group-move">a</div>` +
+            `<div class="test group-leave-active group-move group-leave-to">c</div>` +
+          `</span>`
+        )
+      }).thenWaitFor(duration * 2).then(() => {
+        expect(vm.$el.innerHTML.replace(/\s?style=""(\s?)/g, '$1')).toBe(
+          `<span>` +
+            `<div class="test">d</div>` +
+            `<div class="test">b</div>` +
+            `<div class="test">a</div>` +
+          `</span>`
+        )
+      }).then(done)
+    })
+
+    it('warn unkeyed children', () => {
+      new Vue({
+        template: `<div><transition-group><div v-for="i in 3"></div></transition-group></div>`
+      }).$mount()
+      expect('<transition-group> children must be keyed: <div>').toHaveBeenWarned()
+    })
+
+    // GitHub issue #6006
+    it('should work with dynamic name', done => {
+      const vm = new Vue({
+        template: `
+          <div>
+            <transition-group :name="name">
+              <div v-for="item in items" :key="item">{{ item }}</div>
+            </transition-group>
+          </div>
+        `,
+        data: {
+          items: ['a', 'b', 'c'],
+          name: 'group'
+        }
+      }).$mount(el)
+
+      vm.name = 'invalid-name'
+      vm.items = ['b', 'c', 'a']
+      waitForUpdate(() => {
+        expect(vm.$el.innerHTML.replace(/\s?style=""(\s?)/g, '$1')).toBe(
+          `<span>` +
+            `<div>b</div>` +
+            `<div>c</div>` +
+            `<div>a</div>` +
+          `</span>`
+        )
+        vm.name = 'group'
+        vm.items = ['a', 'b', 'c']
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.innerHTML.replace(/\s?style=""(\s?)/g, '$1')).toBe(
+          `<span>` +
+            `<div class="group-move">a</div>` +
+            `<div class="group-move">b</div>` +
+            `<div class="group-move">c</div>` +
+          `</span>`
+        )
+      }).thenWaitFor(duration * 2 + buffer).then(() => {
+        expect(vm.$el.innerHTML.replace(/\s?style=""(\s?)/g, '$1')).toBe(
+          `<span>` +
+            `<div>a</div>` +
+            `<div>b</div>` +
+            `<div>c</div>` +
+          `</span>`
+        )
+      }).then(done)
+    })
+  })
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/features/transition/transition-mode.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/features/transition/transition-mode.spec.js
new file mode 100644 (file)
index 0000000..6e4f5be
--- /dev/null
@@ -0,0 +1,569 @@
+import Vue from 'vue'
+import injectStyles from './inject-styles'
+import { isIE9 } from 'core/util/env'
+import { nextFrame } from 'web/runtime/transition-util'
+
+if (!isIE9) {
+  describe('Transition mode', () => {
+    const { duration, buffer } = injectStyles()
+    const components = {
+      one: { template: '<div>one</div>' },
+      two: { template: '<div>two</div>' }
+    }
+
+    let el
+    beforeEach(() => {
+      el = document.createElement('div')
+      document.body.appendChild(el)
+    })
+
+    it('dynamic components, simultaneous', done => {
+      const vm = new Vue({
+        template: `<div>
+          <transition>
+            <component :is="view" class="test">
+            </component>
+          </transition>
+        </div>`,
+        data: { view: 'one' },
+        components
+      }).$mount(el)
+      expect(vm.$el.textContent).toBe('one')
+      vm.view = 'two'
+      waitForUpdate(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test v-leave v-leave-active">one</div>' +
+          '<div class="test v-enter v-enter-active">two</div>'
+        )
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test v-leave-active v-leave-to">one</div>' +
+          '<div class="test v-enter-active v-enter-to">two</div>'
+        )
+      }).thenWaitFor(duration + buffer).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test">two</div>'
+        )
+      }).then(done)
+    })
+
+    it('dynamic components, out-in', done => {
+      let next
+      const vm = new Vue({
+        template: `<div>
+          <transition name="test" mode="out-in" @after-leave="afterLeave">
+            <component :is="view" class="test">
+            </component>
+          </transition>
+        </div>`,
+        data: { view: 'one' },
+        components,
+        methods: {
+          afterLeave () {
+            next()
+          }
+        }
+      }).$mount(el)
+      expect(vm.$el.textContent).toBe('one')
+      vm.view = 'two'
+      waitForUpdate(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test test-leave test-leave-active">one</div><!---->'
+        )
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test test-leave-active test-leave-to">one</div><!---->'
+        )
+      }).thenWaitFor(_next => { next = _next }).then(() => {
+        expect(vm.$el.innerHTML).toBe('<!---->')
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test test-enter test-enter-active">two</div>'
+        )
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test test-enter-active test-enter-to">two</div>'
+        )
+      }).thenWaitFor(duration + buffer).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test">two</div>'
+        )
+      }).then(done)
+    })
+
+    // #3440
+    it('dynamic components, out-in (with extra re-render)', done => {
+      let next
+      const vm = new Vue({
+        template: `<div>
+          <transition name="test" mode="out-in" @after-leave="afterLeave">
+            <component :is="view" class="test">
+            </component>
+          </transition>
+        </div>`,
+        data: { view: 'one' },
+        components,
+        methods: {
+          afterLeave () {
+            next()
+          }
+        }
+      }).$mount(el)
+      expect(vm.$el.textContent).toBe('one')
+      vm.view = 'two'
+      waitForUpdate(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test test-leave test-leave-active">one</div><!---->'
+        )
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test test-leave-active test-leave-to">one</div><!---->'
+        )
+        // Force re-render before the element finishes leaving
+        // this should not cause the incoming element to enter early
+        vm.$forceUpdate()
+      }).thenWaitFor(_next => { next = _next }).then(() => {
+        expect(vm.$el.innerHTML).toBe('<!---->')
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test test-enter test-enter-active">two</div>'
+        )
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test test-enter-active test-enter-to">two</div>'
+        )
+      }).thenWaitFor(duration + buffer).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test">two</div>'
+        )
+      }).then(done)
+    })
+
+    it('dynamic components, in-out', done => {
+      let next
+      const vm = new Vue({
+        template: `<div>
+          <transition name="test" mode="in-out" @after-enter="afterEnter">
+            <component :is="view" class="test">
+            </component>
+          </transition>
+        </div>`,
+        data: { view: 'one' },
+        components,
+        methods: {
+          afterEnter () {
+            next()
+          }
+        }
+      }).$mount(el)
+      expect(vm.$el.textContent).toBe('one')
+      vm.view = 'two'
+      waitForUpdate(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test">one</div>' +
+          '<div class="test test-enter test-enter-active">two</div>'
+        )
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test">one</div>' +
+          '<div class="test test-enter-active test-enter-to">two</div>'
+        )
+      }).thenWaitFor(_next => { next = _next }).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test">one</div>' +
+          '<div class="test">two</div>'
+        )
+      }).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test test-leave test-leave-active">one</div>' +
+          '<div class="test">two</div>'
+        )
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test test-leave-active test-leave-to">one</div>' +
+          '<div class="test">two</div>'
+        )
+      }).thenWaitFor(duration + buffer).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test">two</div>'
+        )
+      }).then(done)
+    })
+
+    it('dynamic components, in-out with early cancel', done => {
+      let next
+      const vm = new Vue({
+        template: `<div>
+          <transition name="test" mode="in-out" @after-enter="afterEnter">
+            <component :is="view" class="test"></component>
+          </transition>
+        </div>`,
+        data: { view: 'one' },
+        components,
+        methods: {
+          afterEnter () {
+            next()
+          }
+        }
+      }).$mount(el)
+      expect(vm.$el.textContent).toBe('one')
+      vm.view = 'two'
+      waitForUpdate(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test">one</div>' +
+          '<div class="test test-enter test-enter-active">two</div>'
+        )
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test">one</div>' +
+          '<div class="test test-enter-active test-enter-to">two</div>'
+        )
+        // switch again before enter finishes,
+        // this cancels both enter and leave.
+        vm.view = 'one'
+      }).then(() => {
+        // 1. the pending leaving "one" should be removed instantly.
+        // 2. the entering "two" should be placed into its final state instantly.
+        // 3. a new "one" is created and entering
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test">two</div>' +
+          '<div class="test test-enter test-enter-active">one</div>'
+        )
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test">two</div>' +
+          '<div class="test test-enter-active test-enter-to">one</div>'
+        )
+      }).thenWaitFor(_next => { next = _next }).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test">two</div>' +
+          '<div class="test">one</div>'
+        )
+      }).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test test-leave test-leave-active">two</div>' +
+          '<div class="test">one</div>'
+        )
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test test-leave-active test-leave-to">two</div>' +
+          '<div class="test">one</div>'
+        )
+      }).thenWaitFor(duration + buffer).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test">one</div>'
+        )
+      }).then(done).then(done)
+    })
+
+    it('normal elements with different keys, simultaneous', done => {
+      const vm = new Vue({
+        template: `<div>
+          <transition>
+            <div :key="view" class="test">{{view}}</div>
+          </transition>
+        </div>`,
+        data: { view: 'one' },
+        components
+      }).$mount(el)
+      expect(vm.$el.textContent).toBe('one')
+      vm.view = 'two'
+      waitForUpdate(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test v-leave v-leave-active">one</div>' +
+          '<div class="test v-enter v-enter-active">two</div>'
+        )
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test v-leave-active v-leave-to">one</div>' +
+          '<div class="test v-enter-active v-enter-to">two</div>'
+        )
+      }).thenWaitFor(duration + buffer).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test">two</div>'
+        )
+      }).then(done)
+    })
+
+    it('normal elements with different keys, out-in', done => {
+      let next
+      const vm = new Vue({
+        template: `<div>
+          <transition name="test" mode="out-in" @after-leave="afterLeave">
+            <div :key="view" class="test">{{view}}</div>
+          </transition>
+        </div>`,
+        data: { view: 'one' },
+        components,
+        methods: {
+          afterLeave () {
+            next()
+          }
+        }
+      }).$mount(el)
+      expect(vm.$el.textContent).toBe('one')
+      vm.view = 'two'
+      waitForUpdate(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test test-leave test-leave-active">one</div><!---->'
+        )
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test test-leave-active test-leave-to">one</div><!---->'
+        )
+      }).thenWaitFor(_next => { next = _next }).then(() => {
+        expect(vm.$el.innerHTML).toBe('<!---->')
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test test-enter test-enter-active">two</div>'
+        )
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test test-enter-active test-enter-to">two</div>'
+        )
+      }).thenWaitFor(duration + buffer).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test">two</div>'
+        )
+      }).then(done)
+    })
+
+    it('normal elements with different keys, in-out', done => {
+      let next
+      const vm = new Vue({
+        template: `<div>
+          <transition name="test" mode="in-out" @after-enter="afterEnter">
+            <div :key="view" class="test">{{view}}</div>
+          </transition>
+        </div>`,
+        data: { view: 'one' },
+        components,
+        methods: {
+          afterEnter () {
+            next()
+          }
+        }
+      }).$mount(el)
+      expect(vm.$el.textContent).toBe('one')
+      vm.view = 'two'
+      waitForUpdate(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test">one</div>' +
+          '<div class="test test-enter test-enter-active">two</div>'
+        )
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test">one</div>' +
+          '<div class="test test-enter-active test-enter-to">two</div>'
+        )
+      }).thenWaitFor(_next => { next = _next }).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test">one</div>' +
+          '<div class="test">two</div>'
+        )
+      }).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test test-leave test-leave-active">one</div>' +
+          '<div class="test">two</div>'
+        )
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test test-leave-active test-leave-to">one</div>' +
+          '<div class="test">two</div>'
+        )
+      }).thenWaitFor(duration + buffer).then(() => {
+        expect(vm.$el.innerHTML).toBe(
+          '<div class="test">two</div>'
+        )
+      }).then(done)
+    })
+
+    it('transition out-in on async component (resolve before leave complete)', done => {
+      const vm = new Vue({
+        template: `
+          <div>
+            <transition name="test-anim" mode="out-in">
+              <component-a v-if="ok"></component-a>
+              <component-b v-else></component-b>
+            </transition>
+          </div>
+        `,
+        components: {
+          componentA: resolve => {
+            setTimeout(() => {
+              resolve({ template: '<div><h1>component A</h1></div>' })
+              next1()
+            }, duration / 2)
+          },
+          componentB: resolve => {
+            setTimeout(() => {
+              resolve({ template: '<div><h1>component B</h1></div>' })
+            }, duration / 2)
+          }
+        },
+        data: {
+          ok: true
+        }
+      }).$mount(el)
+
+      expect(vm.$el.innerHTML).toBe('<!---->')
+
+      function next1 () {
+        Vue.nextTick(() => {
+          expect(vm.$el.children.length).toBe(1)
+          expect(vm.$el.textContent).toBe('component A')
+          expect(vm.$el.children[0].className).toBe('test-anim-enter test-anim-enter-active')
+          nextFrame(() => {
+            expect(vm.$el.children[0].className).toBe('test-anim-enter-active test-anim-enter-to')
+            setTimeout(() => {
+              expect(vm.$el.children[0].className).toBe('')
+              vm.ok = false
+              next2()
+            }, duration + buffer)
+          })
+        })
+      }
+
+      function next2 () {
+        waitForUpdate(() => {
+          expect(vm.$el.children.length).toBe(1)
+          expect(vm.$el.textContent).toBe('component A')
+          expect(vm.$el.children[0].className).toBe('test-anim-leave test-anim-leave-active')
+        }).thenWaitFor(nextFrame).then(() => {
+          expect(vm.$el.children[0].className).toBe('test-anim-leave-active test-anim-leave-to')
+        }).thenWaitFor(duration + buffer).then(() => {
+          expect(vm.$el.children.length).toBe(1)
+          expect(vm.$el.textContent).toBe('component B')
+          expect(vm.$el.children[0].className).toMatch('test-anim-enter-active')
+        }).thenWaitFor(duration * 2).then(() => {
+          expect(vm.$el.children[0].className).toBe('')
+        }).then(done)
+      }
+    })
+
+    it('transition out-in on async component (resolve after leave complete)', done => {
+      const vm = new Vue({
+        template: `
+          <div>
+            <transition name="test-anim" mode="out-in">
+              <component-a v-if="ok"></component-a>
+              <component-b v-else></component-b>
+            </transition>
+          </div>
+        `,
+        components: {
+          componentA: { template: '<div><h1>component A</h1></div>' },
+          componentB: resolve => {
+            setTimeout(() => {
+              resolve({ template: '<div><h1>component B</h1></div>' })
+              Vue.nextTick(next)
+            }, (duration + buffer) * 1.5)
+          }
+        },
+        data: {
+          ok: true
+        }
+      }).$mount(el)
+
+      expect(vm.$el.innerHTML).toBe('<div><h1>component A</h1></div>')
+
+      let next
+
+      vm.ok = false
+      waitForUpdate(() => {
+        expect(vm.$el.children.length).toBe(1)
+        expect(vm.$el.textContent).toBe('component A')
+        expect(vm.$el.children[0].className).toBe('test-anim-leave test-anim-leave-active')
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.children[0].className).toBe('test-anim-leave-active test-anim-leave-to')
+      }).thenWaitFor(duration + buffer).then(() => {
+        expect(vm.$el.children.length).toBe(0)
+        expect(vm.$el.innerHTML).toBe('<!---->')
+      }).thenWaitFor(_next => { next = _next }).then(() => {
+        expect(vm.$el.children.length).toBe(1)
+        expect(vm.$el.textContent).toBe('component B')
+        expect(vm.$el.children[0].className).toBe('test-anim-enter test-anim-enter-active')
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.children[0].className).toBe('test-anim-enter-active test-anim-enter-to')
+      }).thenWaitFor(duration + buffer).then(() => {
+        expect(vm.$el.children.length).toBe(1)
+        expect(vm.$el.textContent).toBe('component B')
+        expect(vm.$el.children[0].className).toBe('')
+      }).then(done)
+    })
+
+    it('transition in-out on async component', done => {
+      const vm = new Vue({
+        template: `
+          <div>
+            <transition name="test-anim" mode="in-out">
+              <component-a v-if="ok"></component-a>
+              <component-b v-else></component-b>
+            </transition>
+          </div>
+        `,
+        components: {
+          componentA: resolve => {
+            setTimeout(() => {
+              resolve({ template: '<div><h1>component A</h1></div>' })
+              next1()
+            }, duration / 2)
+          },
+          componentB: resolve => {
+            setTimeout(() => {
+              resolve({ template: '<div><h1>component B</h1></div>' })
+              next2()
+            }, duration / 2)
+          }
+        },
+        data: {
+          ok: true
+        }
+      }).$mount(el)
+
+      expect(vm.$el.innerHTML).toBe('<!---->')
+
+      function next1 () {
+        Vue.nextTick(() => {
+          expect(vm.$el.children.length).toBe(1)
+          expect(vm.$el.textContent).toBe('component A')
+          expect(vm.$el.children[0].className).toBe('test-anim-enter test-anim-enter-active')
+          nextFrame(() => {
+            expect(vm.$el.children[0].className).toBe('test-anim-enter-active test-anim-enter-to')
+            setTimeout(() => {
+              expect(vm.$el.children[0].className).toBe('')
+              vm.ok = false
+            }, duration + buffer)
+          })
+        })
+      }
+
+      function next2 () {
+        waitForUpdate(() => {
+          expect(vm.$el.children.length).toBe(2)
+          expect(vm.$el.textContent).toBe('component Acomponent B')
+          expect(vm.$el.children[0].className).toBe('')
+          expect(vm.$el.children[1].className).toBe('test-anim-enter test-anim-enter-active')
+        }).thenWaitFor(nextFrame).then(() => {
+          expect(vm.$el.children[1].className).toBe('test-anim-enter-active test-anim-enter-to')
+        }).thenWaitFor(duration + buffer).then(() => {
+          expect(vm.$el.children.length).toBe(2)
+          expect(vm.$el.textContent).toBe('component Acomponent B')
+          expect(vm.$el.children[0].className).toMatch('test-anim-leave-active')
+          expect(vm.$el.children[1].className).toBe('')
+        }).thenWaitFor(duration + buffer).then(() => {
+          expect(vm.$el.children.length).toBe(1)
+          expect(vm.$el.textContent).toBe('component B')
+          expect(vm.$el.children[0].className).toBe('')
+        }).then(done)
+      }
+    })
+
+    it('warn invalid mode', () => {
+      new Vue({
+        template: '<transition mode="foo"><div>123</div></transition>'
+      }).$mount()
+      expect('invalid <transition> mode: foo').toHaveBeenWarned()
+    })
+  })
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/features/transition/transition.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/features/transition/transition.spec.js
new file mode 100644 (file)
index 0000000..f7b08e3
--- /dev/null
@@ -0,0 +1,1171 @@
+import Vue from 'vue'
+import injectStyles from './inject-styles'
+import { isIE9 } from 'core/util/env'
+import { nextFrame } from 'web/runtime/transition-util'
+
+if (!isIE9) {
+  describe('Transition basic', () => {
+    const { duration, buffer } = injectStyles()
+    const explicitDuration = duration * 2
+
+    let el
+    beforeEach(() => {
+      el = document.createElement('div')
+      document.body.appendChild(el)
+    })
+
+    it('basic transition', done => {
+      const vm = new Vue({
+        template: '<div><transition><div v-if="ok" class="test">foo</div></transition></div>',
+        data: { ok: true }
+      }).$mount(el)
+
+      // should not apply transition on initial render by default
+      expect(vm.$el.innerHTML).toBe('<div class="test">foo</div>')
+      vm.ok = false
+      waitForUpdate(() => {
+        expect(vm.$el.children[0].className).toBe('test v-leave v-leave-active')
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.children[0].className).toBe('test v-leave-active v-leave-to')
+      }).thenWaitFor(duration + buffer).then(() => {
+        expect(vm.$el.children.length).toBe(0)
+        vm.ok = true
+      }).then(() => {
+        expect(vm.$el.children[0].className).toBe('test v-enter v-enter-active')
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.children[0].className).toBe('test v-enter-active v-enter-to')
+      }).thenWaitFor(duration + buffer).then(() => {
+        expect(vm.$el.children[0].className).toBe('test')
+      }).then(done)
+    })
+
+    it('named transition', done => {
+      const vm = new Vue({
+        template: '<div><transition name="test"><div v-if="ok" class="test">foo</div></transition></div>',
+        data: { ok: true }
+      }).$mount(el)
+
+      // should not apply transition on initial render by default
+      expect(vm.$el.innerHTML).toBe('<div class="test">foo</div>')
+      vm.ok = false
+      waitForUpdate(() => {
+        expect(vm.$el.children[0].className).toBe('test test-leave test-leave-active')
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.children[0].className).toBe('test test-leave-active test-leave-to')
+      }).thenWaitFor(duration + buffer).then(() => {
+        expect(vm.$el.children.length).toBe(0)
+        vm.ok = true
+      }).then(() => {
+        expect(vm.$el.children[0].className).toBe('test test-enter test-enter-active')
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.children[0].className).toBe('test test-enter-active test-enter-to')
+      }).thenWaitFor(duration + buffer).then(() => {
+        expect(vm.$el.children[0].className).toBe('test')
+      }).then(done)
+    })
+
+    it('custom transition classes', done => {
+      const vm = new Vue({
+        template: `
+          <div>
+            <transition
+              enter-class="hello"
+              enter-active-class="hello-active"
+              enter-to-class="hello-to"
+              leave-class="bye"
+              leave-to-class="bye-to"
+              leave-active-class="byebye active more ">
+              <div v-if="ok" class="test">foo</div>
+            </transition>
+          </div>
+        `,
+        data: { ok: true }
+      }).$mount(el)
+
+      // should not apply transition on initial render by default
+      expect(vm.$el.innerHTML).toBe('<div class="test">foo</div>')
+      vm.ok = false
+      waitForUpdate(() => {
+        expect(vm.$el.children[0].className).toBe('test bye byebye active more')
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.children[0].className).toBe('test byebye active more bye-to')
+      }).thenWaitFor(duration + buffer).then(() => {
+        expect(vm.$el.children.length).toBe(0)
+        vm.ok = true
+      }).then(() => {
+        expect(vm.$el.children[0].className).toBe('test hello hello-active')
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.children[0].className).toBe('test hello-active hello-to')
+      }).thenWaitFor(duration + buffer).then(() => {
+        expect(vm.$el.children[0].className).toBe('test')
+      }).then(done)
+    })
+
+    it('dynamic transition', done => {
+      const vm = new Vue({
+        template: `
+          <div>
+            <transition :name="trans">
+              <div v-if="ok" class="test">foo</div>
+            </transition>
+          </div>
+        `,
+        data: {
+          ok: true,
+          trans: 'test'
+        }
+      }).$mount(el)
+
+      // should not apply transition on initial render by default
+      expect(vm.$el.innerHTML).toBe('<div class="test">foo</div>')
+      vm.ok = false
+      waitForUpdate(() => {
+        expect(vm.$el.children[0].className).toBe('test test-leave test-leave-active')
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.children[0].className).toBe('test test-leave-active test-leave-to')
+      }).thenWaitFor(duration + buffer).then(() => {
+        expect(vm.$el.children.length).toBe(0)
+        vm.ok = true
+        vm.trans = 'changed'
+      }).then(() => {
+        expect(vm.$el.children[0].className).toBe('test changed-enter changed-enter-active')
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.children[0].className).toBe('test changed-enter-active changed-enter-to')
+      }).thenWaitFor(duration + buffer).then(() => {
+        expect(vm.$el.children[0].className).toBe('test')
+      }).then(done)
+    })
+
+    it('inline transition object', done => {
+      const enter = jasmine.createSpy('enter')
+      const leave = jasmine.createSpy('leave')
+      const vm = new Vue({
+        render (h) {
+          return h('div', null, [
+            h('transition', {
+              props: {
+                name: 'inline',
+                enterClass: 'hello',
+                enterToClass: 'hello-to',
+                enterActiveClass: 'hello-active',
+                leaveClass: 'bye',
+                leaveToClass: 'bye-to',
+                leaveActiveClass: 'byebye active'
+              },
+              on: {
+                enter,
+                leave
+              }
+            }, this.ok ? [h('div', { class: 'test' }, 'foo')] : undefined)
+          ])
+        },
+        data: { ok: true }
+      }).$mount(el)
+
+      // should not apply transition on initial render by default
+      expect(vm.$el.innerHTML).toBe('<div class="test">foo</div>')
+      vm.ok = false
+      waitForUpdate(() => {
+        expect(vm.$el.children[0].className).toBe('test bye byebye active')
+        expect(leave).toHaveBeenCalled()
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.children[0].className).toBe('test byebye active bye-to')
+      }).thenWaitFor(duration + buffer).then(() => {
+        expect(vm.$el.children.length).toBe(0)
+        vm.ok = true
+      }).then(() => {
+        expect(vm.$el.children[0].className).toBe('test hello hello-active')
+        expect(enter).toHaveBeenCalled()
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.children[0].className).toBe('test hello-active hello-to')
+      }).thenWaitFor(duration + buffer).then(() => {
+        expect(vm.$el.children[0].className).toBe('test')
+      }).then(done)
+    })
+
+    it('transition events', done => {
+      const onLeaveSpy = jasmine.createSpy('leave')
+      const onEnterSpy = jasmine.createSpy('enter')
+      const beforeLeaveSpy = jasmine.createSpy('beforeLeave')
+      const beforeEnterSpy = jasmine.createSpy('beforeEnter')
+      const afterLeaveSpy = jasmine.createSpy('afterLeave')
+      const afterEnterSpy = jasmine.createSpy('afterEnter')
+
+      const vm = new Vue({
+        template: `
+          <div>
+            <transition
+              name="test"
+              @before-enter="beforeEnter"
+              @enter="enter"
+              @after-enter="afterEnter"
+              @before-leave="beforeLeave"
+              @leave="leave"
+              @after-leave="afterLeave">
+              <div v-if="ok" class="test">foo</div>
+            </transition>
+          </div>
+        `,
+        data: { ok: true },
+        methods: {
+          beforeLeave: (el) => {
+            expect(el).toBe(vm.$el.children[0])
+            expect(el.className).toBe('test')
+            beforeLeaveSpy(el)
+          },
+          leave: (el) => onLeaveSpy(el),
+          afterLeave: (el) => afterLeaveSpy(el),
+          beforeEnter: (el) => {
+            expect(vm.$el.contains(el)).toBe(false)
+            expect(el.className).toBe('test')
+            beforeEnterSpy(el)
+          },
+          enter: (el) => {
+            expect(vm.$el.contains(el)).toBe(true)
+            onEnterSpy(el)
+          },
+          afterEnter: (el) => afterEnterSpy(el)
+        }
+      }).$mount(el)
+
+      // should not apply transition on initial render by default
+      expect(vm.$el.innerHTML).toBe('<div class="test">foo</div>')
+
+      let _el = vm.$el.children[0]
+      vm.ok = false
+      waitForUpdate(() => {
+        expect(beforeLeaveSpy).toHaveBeenCalledWith(_el)
+        expect(onLeaveSpy).toHaveBeenCalledWith(_el)
+        expect(vm.$el.children[0].className).toBe('test test-leave test-leave-active')
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(afterLeaveSpy).not.toHaveBeenCalled()
+        expect(vm.$el.children[0].className).toBe('test test-leave-active test-leave-to')
+      }).thenWaitFor(duration + buffer).then(() => {
+        expect(afterLeaveSpy).toHaveBeenCalledWith(_el)
+        expect(vm.$el.children.length).toBe(0)
+        vm.ok = true
+      }).then(() => {
+        _el = vm.$el.children[0]
+        expect(beforeEnterSpy).toHaveBeenCalledWith(_el)
+        expect(onEnterSpy).toHaveBeenCalledWith(_el)
+        expect(vm.$el.children[0].className).toBe('test test-enter test-enter-active')
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(afterEnterSpy).not.toHaveBeenCalled()
+        expect(vm.$el.children[0].className).toBe('test test-enter-active test-enter-to')
+      }).thenWaitFor(duration + buffer).then(() => {
+        expect(afterEnterSpy).toHaveBeenCalledWith(_el)
+        expect(vm.$el.children[0].className).toBe('test')
+      }).then(done)
+    })
+
+    it('transition events (v-show)', done => {
+      const onLeaveSpy = jasmine.createSpy('leave')
+      const onEnterSpy = jasmine.createSpy('enter')
+      const beforeLeaveSpy = jasmine.createSpy('beforeLeave')
+      const beforeEnterSpy = jasmine.createSpy('beforeEnter')
+      const afterLeaveSpy = jasmine.createSpy('afterLeave')
+      const afterEnterSpy = jasmine.createSpy('afterEnter')
+
+      const vm = new Vue({
+        template: `
+          <div>
+            <transition
+              name="test"
+              @before-enter="beforeEnter"
+              @enter="enter"
+              @after-enter="afterEnter"
+              @before-leave="beforeLeave"
+              @leave="leave"
+              @after-leave="afterLeave">
+              <div v-show="ok" class="test">foo</div>
+            </transition>
+          </div>
+        `,
+        data: { ok: true },
+        methods: {
+          beforeLeave: (el) => {
+            expect(el.style.display).toBe('')
+            expect(el).toBe(vm.$el.children[0])
+            expect(el.className).toBe('test')
+            beforeLeaveSpy(el)
+          },
+          leave: (el) => {
+            expect(el.style.display).toBe('')
+            onLeaveSpy(el)
+          },
+          afterLeave: (el) => {
+            expect(el.style.display).toBe('none')
+            afterLeaveSpy(el)
+          },
+          beforeEnter: (el) => {
+            expect(el.className).toBe('test')
+            expect(el.style.display).toBe('none')
+            beforeEnterSpy(el)
+          },
+          enter: (el) => {
+            expect(el.style.display).toBe('')
+            onEnterSpy(el)
+          },
+          afterEnter: (el) => {
+            expect(el.style.display).toBe('')
+            afterEnterSpy(el)
+          }
+        }
+      }).$mount(el)
+
+      // should not apply transition on initial render by default
+      expect(vm.$el.innerHTML).toBe('<div class="test">foo</div>')
+
+      let _el = vm.$el.children[0]
+      vm.ok = false
+      waitForUpdate(() => {
+        expect(beforeLeaveSpy).toHaveBeenCalledWith(_el)
+        expect(onLeaveSpy).toHaveBeenCalledWith(_el)
+        expect(vm.$el.children[0].className).toBe('test test-leave test-leave-active')
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(afterLeaveSpy).not.toHaveBeenCalled()
+        expect(vm.$el.children[0].className).toBe('test test-leave-active test-leave-to')
+      }).thenWaitFor(duration + buffer).then(() => {
+        expect(afterLeaveSpy).toHaveBeenCalledWith(_el)
+        expect(vm.$el.children[0].style.display).toBe('none')
+        vm.ok = true
+      }).then(() => {
+        _el = vm.$el.children[0]
+        expect(beforeEnterSpy).toHaveBeenCalledWith(_el)
+        expect(onEnterSpy).toHaveBeenCalledWith(_el)
+        expect(vm.$el.children[0].className).toBe('test test-enter test-enter-active')
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(afterEnterSpy).not.toHaveBeenCalled()
+        expect(vm.$el.children[0].className).toBe('test test-enter-active test-enter-to')
+      }).thenWaitFor(duration + buffer).then(() => {
+        expect(afterEnterSpy).toHaveBeenCalledWith(_el)
+        expect(vm.$el.children[0].className).toBe('test')
+      }).then(done)
+    })
+
+    it('explicit user callback in JavaScript hooks', done => {
+      let next
+      const vm = new Vue({
+        template: `<div>
+          <transition name="test" @enter="enter" @leave="leave">
+            <div v-if="ok" class="test">foo</div>
+          </transition>
+        </div>`,
+        data: { ok: true },
+        methods: {
+          enter: (el, cb) => {
+            next = cb
+          },
+          leave: (el, cb) => {
+            next = cb
+          }
+        }
+      }).$mount(el)
+      vm.ok = false
+      waitForUpdate(() => {
+        expect(vm.$el.children[0].className).toBe('test test-leave test-leave-active')
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.children[0].className).toBe('test test-leave-active test-leave-to')
+      }).thenWaitFor(duration + buffer).then(() => {
+        expect(vm.$el.children[0].className).toBe('test test-leave-active test-leave-to')
+        expect(next).toBeTruthy()
+        next()
+        expect(vm.$el.children.length).toBe(0)
+      }).then(() => {
+        vm.ok = true
+      }).then(() => {
+        expect(vm.$el.children[0].className).toBe('test test-enter test-enter-active')
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.children[0].className).toBe('test test-enter-active test-enter-to')
+      }).thenWaitFor(duration + buffer).then(() => {
+        expect(vm.$el.children[0].className).toBe('test test-enter-active test-enter-to')
+        expect(next).toBeTruthy()
+        next()
+        expect(vm.$el.children[0].className).toBe('test')
+      }).then(done)
+    })
+
+    it('css: false', done => {
+      const enterSpy = jasmine.createSpy('enter')
+      const leaveSpy = jasmine.createSpy('leave')
+      const vm = new Vue({
+        template: `
+          <div>
+            <transition :css="false" name="test" @enter="enter" @leave="leave">
+              <div v-if="ok" class="test">foo</div>
+            </transition>
+          </div>
+        `,
+        data: { ok: true },
+        methods: {
+          enter: enterSpy,
+          leave: leaveSpy
+        }
+      }).$mount(el)
+
+      vm.ok = false
+      waitForUpdate(() => {
+        expect(leaveSpy).toHaveBeenCalled()
+        expect(vm.$el.innerHTML).toBe('<!---->')
+        vm.ok = true
+      }).then(() => {
+        expect(enterSpy).toHaveBeenCalled()
+        expect(vm.$el.innerHTML).toBe('<div class="test">foo</div>')
+      }).then(done)
+    })
+
+    it('no transition detected', done => {
+      const enterSpy = jasmine.createSpy('enter')
+      const leaveSpy = jasmine.createSpy('leave')
+      const vm = new Vue({
+        template: '<div><transition name="nope" @enter="enter" @leave="leave"><div v-if="ok">foo</div></transition></div>',
+        data: { ok: true },
+        methods: {
+          enter: enterSpy,
+          leave: leaveSpy
+        }
+      }).$mount(el)
+
+      vm.ok = false
+      waitForUpdate(() => {
+        expect(leaveSpy).toHaveBeenCalled()
+        expect(vm.$el.innerHTML).toBe('<div class="nope-leave nope-leave-active">foo</div><!---->')
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.innerHTML).toBe('<!---->')
+        vm.ok = true
+      }).then(() => {
+        expect(enterSpy).toHaveBeenCalled()
+        expect(vm.$el.innerHTML).toBe('<div class="nope-enter nope-enter-active">foo</div>')
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.innerHTML).toBe('<div>foo</div>')
+      }).then(done)
+    })
+
+    it('enterCancelled', done => {
+      const spy = jasmine.createSpy('enterCancelled')
+      const vm = new Vue({
+        template: `
+          <div>
+            <transition name="test" @enter-cancelled="enterCancelled">
+              <div v-if="ok" class="test">foo</div>
+            </transition>
+          </div>
+        `,
+        data: { ok: false },
+        methods: {
+          enterCancelled: spy
+        }
+      }).$mount(el)
+
+      expect(vm.$el.innerHTML).toBe('<!---->')
+      vm.ok = true
+      waitForUpdate(() => {
+        expect(vm.$el.children[0].className).toBe('test test-enter test-enter-active')
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.children[0].className).toBe('test test-enter-active test-enter-to')
+      }).thenWaitFor(duration / 2).then(() => {
+        vm.ok = false
+      }).then(() => {
+        expect(spy).toHaveBeenCalled()
+        expect(vm.$el.children[0].className).toBe('test test-leave test-leave-active')
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.children[0].className).toBe('test test-leave-active test-leave-to')
+      }).thenWaitFor(duration + buffer).then(() => {
+        expect(vm.$el.children.length).toBe(0)
+      }).then(done)
+    })
+
+    it('should remove stale leaving elements', done => {
+      const spy = jasmine.createSpy('afterLeave')
+      const vm = new Vue({
+        template: `
+          <div>
+            <transition name="test" @after-leave="afterLeave">
+              <div v-if="ok" class="test">foo</div>
+            </transition>
+          </div>
+        `,
+        data: { ok: true },
+        methods: {
+          afterLeave: spy
+        }
+      }).$mount(el)
+
+      expect(vm.$el.innerHTML).toBe('<div class="test">foo</div>')
+      vm.ok = false
+      waitForUpdate(() => {
+        expect(vm.$el.children[0].className).toBe('test test-leave test-leave-active')
+      }).thenWaitFor(duration / 2).then(() => {
+        vm.ok = true
+      }).then(() => {
+        expect(spy).toHaveBeenCalled()
+        expect(vm.$el.children.length).toBe(1) // should have removed leaving element
+        expect(vm.$el.children[0].className).toBe('test test-enter test-enter-active')
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.children[0].className).toBe('test test-enter-active test-enter-to')
+      }).thenWaitFor(duration + buffer).then(() => {
+        expect(vm.$el.innerHTML).toBe('<div class="test">foo</div>')
+      }).then(done)
+    })
+
+    it('transition with v-show', done => {
+      const vm = new Vue({
+        template: `
+          <div>
+            <transition name="test">
+              <div v-show="ok" class="test">foo</div>
+            </transition>
+          </div>
+        `,
+        data: { ok: true }
+      }).$mount(el)
+
+      // should not apply transition on initial render by default
+      expect(vm.$el.textContent).toBe('foo')
+      expect(vm.$el.children[0].style.display).toBe('')
+      expect(vm.$el.children[0].className).toBe('test')
+      vm.ok = false
+      waitForUpdate(() => {
+        expect(vm.$el.children[0].className).toBe('test test-leave test-leave-active')
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.children[0].className).toBe('test test-leave-active test-leave-to')
+      }).thenWaitFor(duration + buffer).then(() => {
+        expect(vm.$el.children[0].style.display).toBe('none')
+        vm.ok = true
+      }).then(() => {
+        expect(vm.$el.children[0].style.display).toBe('')
+        expect(vm.$el.children[0].className).toBe('test test-enter test-enter-active')
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.children[0].className).toBe('test test-enter-active test-enter-to')
+      }).thenWaitFor(duration + buffer).then(() => {
+        expect(vm.$el.children[0].className).toBe('test')
+      }).then(done)
+    })
+
+    it('transition with v-show, inside child component', done => {
+      const vm = new Vue({
+        template: `
+          <div>
+            <test v-show="ok"></test>
+          </div>
+        `,
+        data: { ok: true },
+        components: {
+          test: {
+            template: `<transition name="test"><div class="test">foo</div></transition>`
+          }
+        }
+      }).$mount(el)
+
+      // should not apply transition on initial render by default
+      expect(vm.$el.textContent).toBe('foo')
+      expect(vm.$el.children[0].style.display).toBe('')
+      vm.ok = false
+      waitForUpdate(() => {
+        expect(vm.$el.children[0].className).toBe('test test-leave test-leave-active')
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.children[0].className).toBe('test test-leave-active test-leave-to')
+      }).thenWaitFor(duration + buffer).then(() => {
+        expect(vm.$el.children[0].style.display).toBe('none')
+        vm.ok = true
+      }).then(() => {
+        expect(vm.$el.children[0].style.display).toBe('')
+        expect(vm.$el.children[0].className).toBe('test test-enter test-enter-active')
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.children[0].className).toBe('test test-enter-active test-enter-to')
+      }).thenWaitFor(duration + buffer).then(() => {
+        expect(vm.$el.children[0].className).toBe('test')
+      }).then(done)
+    })
+
+    it('leaveCancelled (v-show only)', done => {
+      const spy = jasmine.createSpy('leaveCancelled')
+      const vm = new Vue({
+        template: `
+          <div>
+            <transition name="test" @leave-cancelled="leaveCancelled">
+              <div v-show="ok" class="test">foo</div>
+            </transition>
+          </div>
+        `,
+        data: { ok: true },
+        methods: {
+          leaveCancelled: spy
+        }
+      }).$mount(el)
+
+      expect(vm.$el.children[0].style.display).toBe('')
+      vm.ok = false
+      waitForUpdate(() => {
+        expect(vm.$el.children[0].className).toBe('test test-leave test-leave-active')
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.children[0].className).toBe('test test-leave-active test-leave-to')
+      }).thenWaitFor(10).then(() => {
+        vm.ok = true
+      }).then(() => {
+        expect(spy).toHaveBeenCalled()
+        expect(vm.$el.children[0].className).toBe('test test-enter test-enter-active')
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.children[0].className).toBe('test test-enter-active test-enter-to')
+      }).thenWaitFor(duration + buffer).then(() => {
+        expect(vm.$el.children[0].style.display).toBe('')
+      }).then(done)
+    })
+
+    it('leave transition with v-show: cancelled on next frame', done => {
+      const vm = new Vue({
+        template: `
+          <div>
+            <transition name="test">
+              <div v-show="ok" class="test">foo</div>
+            </transition>
+          </div>
+        `,
+        data: { ok: true }
+      }).$mount(el)
+
+      vm.ok = false
+      waitForUpdate(() => {
+        vm.ok = true
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.children[0].className).toBe('test test-enter-active test-enter-to')
+      }).thenWaitFor(duration + buffer).then(() => {
+        expect(vm.$el.children[0].className).toBe('test')
+      }).then(done)
+    })
+
+    it('enter transition with v-show: cancelled on next frame', done => {
+      const vm = new Vue({
+        template: `
+          <div>
+            <transition name="test">
+              <div v-show="ok" class="test">foo</div>
+            </transition>
+          </div>
+        `,
+        data: { ok: false }
+      }).$mount(el)
+
+      vm.ok = true
+      waitForUpdate(() => {
+        vm.ok = false
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.children[0].className).toBe('test test-leave-active test-leave-to')
+      }).thenWaitFor(duration + buffer).then(() => {
+        expect(vm.$el.children[0].className).toBe('test')
+      }).then(done)
+    })
+
+    it('animations', done => {
+      const vm = new Vue({
+        template: `
+          <div>
+            <transition name="test-anim">
+              <div v-if="ok">foo</div>
+            </transition>
+          </div>
+        `,
+        data: { ok: true }
+      }).$mount(el)
+
+      // should not apply transition on initial render by default
+      expect(vm.$el.innerHTML).toBe('<div>foo</div>')
+      vm.ok = false
+      waitForUpdate(() => {
+        expect(vm.$el.children[0].className).toBe('test-anim-leave test-anim-leave-active')
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.children[0].className).toBe('test-anim-leave-active test-anim-leave-to')
+      }).thenWaitFor(duration + buffer).then(() => {
+        expect(vm.$el.children.length).toBe(0)
+        vm.ok = true
+      }).then(() => {
+        expect(vm.$el.children[0].className).toBe('test-anim-enter test-anim-enter-active')
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.children[0].className).toBe('test-anim-enter-active test-anim-enter-to')
+      }).thenWaitFor(duration + buffer).then(() => {
+        expect(vm.$el.children[0].className).toBe('')
+      }).then(done)
+    })
+
+    it('explicit transition type', done => {
+      const vm = new Vue({
+        template: `
+          <div>
+            <transition name="test-anim-long" type="animation">
+              <div v-if="ok" class="test">foo</div>
+            </transition>
+          </div>
+        `,
+        data: { ok: true }
+      }).$mount(el)
+
+      // should not apply transition on initial render by default
+      expect(vm.$el.innerHTML).toBe('<div class="test">foo</div>')
+      vm.ok = false
+      waitForUpdate(() => {
+        expect(vm.$el.children[0].className).toBe('test test-anim-long-leave test-anim-long-leave-active')
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.children[0].className).toBe('test test-anim-long-leave-active test-anim-long-leave-to')
+      }).thenWaitFor(duration + 5).then(() => {
+        // should not end early due to transition presence
+        expect(vm.$el.children[0].className).toBe('test test-anim-long-leave-active test-anim-long-leave-to')
+      }).thenWaitFor(duration + 5).then(() => {
+        expect(vm.$el.children.length).toBe(0)
+        vm.ok = true
+      }).then(() => {
+        expect(vm.$el.children[0].className).toBe('test test-anim-long-enter test-anim-long-enter-active')
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.children[0].className).toBe('test test-anim-long-enter-active test-anim-long-enter-to')
+      }).thenWaitFor(duration + 5).then(() => {
+        expect(vm.$el.children[0].className).toBe('test test-anim-long-enter-active test-anim-long-enter-to')
+      }).thenWaitFor(duration + 5).then(() => {
+        expect(vm.$el.children[0].className).toBe('test')
+      }).then(done)
+    })
+
+    it('transition on appear', done => {
+      const vm = new Vue({
+        template: `
+          <div>
+            <transition name="test"
+              appear
+              appear-class="test-appear"
+              appear-to-class="test-appear-to"
+              appear-active-class="test-appear-active">
+              <div v-if="ok" class="test">foo</div>
+            </transition>
+          </div>
+        `,
+        data: { ok: true }
+      }).$mount(el)
+
+      waitForUpdate(() => {
+        expect(vm.$el.children[0].className).toBe('test test-appear test-appear-active')
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.children[0].className).toBe('test test-appear-active test-appear-to')
+      }).thenWaitFor(duration + buffer).then(() => {
+        expect(vm.$el.children[0].className).toBe('test')
+      }).then(done)
+    })
+
+    it('transition on appear with v-show', done => {
+      const vm = new Vue({
+        template: `
+          <div>
+            <transition name="test" appear>
+              <div v-show="ok" class="test">foo</div>
+            </transition>
+          </div>
+        `,
+        data: { ok: true }
+      }).$mount(el)
+
+      waitForUpdate(() => {
+        expect(vm.$el.children[0].className).toBe('test test-enter test-enter-active')
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.children[0].className).toBe('test test-enter-active test-enter-to')
+      }).thenWaitFor(duration + buffer).then(() => {
+        expect(vm.$el.children[0].className).toBe('test')
+      }).then(done)
+    })
+
+    it('transition on SVG elements', done => {
+      const vm = new Vue({
+        template: `
+          <svg>
+            <transition>
+              <circle cx="0" cy="0" r="10" v-if="ok" class="test"></circle>
+            </transition>
+          </svg>
+        `,
+        data: { ok: true }
+      }).$mount(el)
+
+      // should not apply transition on initial render by default
+      expect(vm.$el.childNodes[0].getAttribute('class')).toBe('test')
+      vm.ok = false
+      waitForUpdate(() => {
+        expect(vm.$el.childNodes[0].getAttribute('class')).toBe('test v-leave v-leave-active')
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.childNodes[0].getAttribute('class')).toBe('test v-leave-active v-leave-to')
+      }).thenWaitFor(duration + buffer).then(() => {
+        expect(vm.$el.childNodes.length).toBe(1)
+        expect(vm.$el.childNodes[0].nodeType).toBe(8) // should be an empty comment node
+        expect(vm.$el.childNodes[0].textContent).toBe('')
+        vm.ok = true
+      }).then(() => {
+        expect(vm.$el.childNodes[0].getAttribute('class')).toBe('test v-enter v-enter-active')
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.childNodes[0].getAttribute('class')).toBe('test v-enter-active v-enter-to')
+      }).thenWaitFor(duration + buffer).then(() => {
+        expect(vm.$el.childNodes[0].getAttribute('class')).toBe('test')
+      }).then(done)
+    })
+
+    it('transition on child components', done => {
+      const vm = new Vue({
+        template: `
+          <div>
+            <transition>
+              <test v-if="ok" class="test"></test>
+            </transition>
+          </div>
+        `,
+        data: { ok: true },
+        components: {
+          test: {
+            template: `
+              <transition name="test">
+                <div>foo</div>
+              </transition>
+            ` // test transition override from parent
+          }
+        }
+      }).$mount(el)
+
+      // should not apply transition on initial render by default
+      expect(vm.$el.innerHTML).toBe('<div class="test">foo</div>')
+      vm.ok = false
+      waitForUpdate(() => {
+        expect(vm.$el.children[0].className).toBe('test v-leave v-leave-active')
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.children[0].className).toBe('test v-leave-active v-leave-to')
+      }).thenWaitFor(duration + buffer).then(() => {
+        expect(vm.$el.children.length).toBe(0)
+        vm.ok = true
+      }).then(() => {
+        expect(vm.$el.children[0].className).toBe('test v-enter v-enter-active')
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.children[0].className).toBe('test v-enter-active v-enter-to')
+      }).thenWaitFor(duration + buffer).then(() => {
+        expect(vm.$el.children[0].className).toBe('test')
+      }).then(done)
+    })
+
+    it('transition inside child component', done => {
+      const vm = new Vue({
+        template: `
+          <div>
+            <test v-if="ok" class="test"></test>
+          </div>
+        `,
+        data: { ok: true },
+        components: {
+          test: {
+            template: `
+              <transition>
+                <div>foo</div>
+              </transition>
+            `
+          }
+        }
+      }).$mount(el)
+
+      // should not apply transition on initial render by default
+      expect(vm.$el.innerHTML).toBe('<div class="test">foo</div>')
+      vm.ok = false
+      waitForUpdate(() => {
+        expect(vm.$el.children[0].className).toBe('test v-leave v-leave-active')
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.children[0].className).toBe('test v-leave-active v-leave-to')
+      }).thenWaitFor(duration + buffer).then(() => {
+        expect(vm.$el.children.length).toBe(0)
+        vm.ok = true
+      }).then(() => {
+        expect(vm.$el.children[0].className).toBe('test v-enter v-enter-active')
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.children[0].className).toBe('test v-enter-active v-enter-to')
+      }).thenWaitFor(duration + buffer).then(() => {
+        expect(vm.$el.children[0].className).toBe('test')
+      }).then(done)
+    })
+
+    it('custom transition higher-order component', done => {
+      const vm = new Vue({
+        template: '<div><my-transition><div v-if="ok" class="test">foo</div></my-transition></div>',
+        data: { ok: true },
+        components: {
+          'my-transition': {
+            functional: true,
+            render (h, { data, children }) {
+              (data.props || (data.props = {})).name = 'test'
+              return h('transition', data, children)
+            }
+          }
+        }
+      }).$mount(el)
+
+      // should not apply transition on initial render by default
+      expect(vm.$el.innerHTML).toBe('<div class="test">foo</div>')
+      vm.ok = false
+      waitForUpdate(() => {
+        expect(vm.$el.children[0].className).toBe('test test-leave test-leave-active')
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.children[0].className).toBe('test test-leave-active test-leave-to')
+      }).thenWaitFor(duration + buffer).then(() => {
+        expect(vm.$el.children.length).toBe(0)
+        vm.ok = true
+      }).then(() => {
+        expect(vm.$el.children[0].className).toBe('test test-enter test-enter-active')
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.children[0].className).toBe('test test-enter-active test-enter-to')
+      }).thenWaitFor(duration + buffer).then(() => {
+        expect(vm.$el.children[0].className).toBe('test')
+      }).then(done)
+    })
+
+    it('warn when used on multiple elements', () => {
+      new Vue({
+        template: `<transition><p>1</p><p>2</p></transition>`
+      }).$mount()
+      expect(`<transition> can only be used on a single element`).toHaveBeenWarned()
+    })
+
+    describe('explicit durations -', () => {
+      it('single value', done => {
+        const vm = new Vue({
+          template: `
+            <div>
+              <transition duration="${explicitDuration}">
+                <div v-if="ok" class="test">foo</div>
+              </transition>
+            </div>
+          `,
+          data: { ok: true }
+        }).$mount(el)
+
+        vm.ok = false
+
+        waitForUpdate(() => {
+          expect(vm.$el.children[0].className).toBe('test v-leave v-leave-active')
+        }).thenWaitFor(nextFrame).then(() => {
+          expect(vm.$el.children[0].className).toBe('test v-leave-active v-leave-to')
+        }).thenWaitFor(explicitDuration + buffer).then(() => {
+          expect(vm.$el.children.length).toBe(0)
+          vm.ok = true
+        }).then(() => {
+          expect(vm.$el.children[0].className).toBe('test v-enter v-enter-active')
+        }).thenWaitFor(nextFrame).then(() => {
+          expect(vm.$el.children[0].className).toBe('test v-enter-active v-enter-to')
+        }).thenWaitFor(explicitDuration + buffer).then(() => {
+          expect(vm.$el.children[0].className).toBe('test')
+        }).then(done)
+      })
+
+      it('enter and auto leave', done => {
+        const vm = new Vue({
+          template: `
+            <div>
+              <transition :duration="{ enter: ${explicitDuration} }">
+                <div v-if="ok" class="test">foo</div>
+              </transition>
+            </div>
+          `,
+          data: { ok: true }
+        }).$mount(el)
+
+        vm.ok = false
+
+        waitForUpdate(() => {
+          expect(vm.$el.children[0].className).toBe('test v-leave v-leave-active')
+        }).thenWaitFor(nextFrame).then(() => {
+          expect(vm.$el.children[0].className).toBe('test v-leave-active v-leave-to')
+        }).thenWaitFor(duration + buffer).then(() => {
+          expect(vm.$el.children.length).toBe(0)
+          vm.ok = true
+        }).then(() => {
+          expect(vm.$el.children[0].className).toBe('test v-enter v-enter-active')
+        }).thenWaitFor(nextFrame).then(() => {
+          expect(vm.$el.children[0].className).toBe('test v-enter-active v-enter-to')
+        }).thenWaitFor(explicitDuration + buffer).then(() => {
+          expect(vm.$el.children[0].className).toBe('test')
+        }).then(done)
+      })
+
+      it('leave and auto enter', done => {
+        const vm = new Vue({
+          template: `
+            <div>
+              <transition :duration="{ leave: ${explicitDuration} }">
+                <div v-if="ok" class="test">foo</div>
+              </transition>
+            </div>
+          `,
+          data: { ok: true }
+        }).$mount(el)
+
+        vm.ok = false
+
+        waitForUpdate(() => {
+          expect(vm.$el.children[0].className).toBe('test v-leave v-leave-active')
+        }).thenWaitFor(nextFrame).then(() => {
+          expect(vm.$el.children[0].className).toBe('test v-leave-active v-leave-to')
+        }).thenWaitFor(explicitDuration + buffer).then(() => {
+          expect(vm.$el.children.length).toBe(0)
+          vm.ok = true
+        }).then(() => {
+          expect(vm.$el.children[0].className).toBe('test v-enter v-enter-active')
+        }).thenWaitFor(nextFrame).then(() => {
+          expect(vm.$el.children[0].className).toBe('test v-enter-active v-enter-to')
+        }).thenWaitFor(duration + buffer).then(() => {
+          expect(vm.$el.children[0].className).toBe('test')
+        }).then(done)
+      })
+
+      it('separate enter and leave', done => {
+        const enter = explicitDuration
+        const leave = explicitDuration * 2
+
+        const vm = new Vue({
+          template: `
+            <div>
+              <transition :duration="{ enter: ${enter}, leave: ${leave} }">
+                <div v-if="ok" class="test">foo</div>
+              </transition>
+            </div>
+          `,
+          data: { ok: true }
+        }).$mount(el)
+
+        vm.ok = false
+
+        waitForUpdate(() => {
+          expect(vm.$el.children[0].className).toBe('test v-leave v-leave-active')
+        }).thenWaitFor(nextFrame).then(() => {
+          expect(vm.$el.children[0].className).toBe('test v-leave-active v-leave-to')
+        }).thenWaitFor(leave + buffer).then(() => {
+          expect(vm.$el.children.length).toBe(0)
+          vm.ok = true
+        }).then(() => {
+          expect(vm.$el.children[0].className).toBe('test v-enter v-enter-active')
+        }).thenWaitFor(nextFrame).then(() => {
+          expect(vm.$el.children[0].className).toBe('test v-enter-active v-enter-to')
+        }).thenWaitFor(enter + buffer).then(() => {
+          expect(vm.$el.children[0].className).toBe('test')
+        }).then(done)
+      })
+
+      it('enter and leave + duration change', done => {
+        const enter1 = explicitDuration * 2
+        const enter2 = explicitDuration
+        const leave1 = explicitDuration * 0.5
+        const leave2 = explicitDuration * 3
+
+        const vm = new Vue({
+          template: `
+            <div>
+              <transition :duration="{ enter: enter, leave: leave }">
+                <div v-if="ok" class="test">foo</div>
+              </transition>
+            </div>
+          `,
+          data: {
+            ok: true,
+            enter: enter1,
+            leave: leave1
+          }
+        }).$mount(el)
+
+        vm.ok = false
+
+        waitForUpdate(() => {
+          expect(vm.$el.children[0].className).toBe('test v-leave v-leave-active')
+        }).thenWaitFor(nextFrame).then(() => {
+          expect(vm.$el.children[0].className).toBe('test v-leave-active v-leave-to')
+        }).thenWaitFor(leave1 + buffer).then(() => {
+          expect(vm.$el.children.length).toBe(0)
+          vm.ok = true
+        }).then(() => {
+          expect(vm.$el.children[0].className).toBe('test v-enter v-enter-active')
+        }).thenWaitFor(nextFrame).then(() => {
+          expect(vm.$el.children[0].className).toBe('test v-enter-active v-enter-to')
+        }).thenWaitFor(enter1 + buffer).then(() => {
+          expect(vm.$el.children[0].className).toBe('test')
+          vm.enter = enter2
+          vm.leave = leave2
+        }).then(() => {
+          vm.ok = false
+        }).then(() => {
+          expect(vm.$el.children[0].className).toBe('test v-leave v-leave-active')
+        }).thenWaitFor(nextFrame).then(() => {
+          expect(vm.$el.children[0].className).toBe('test v-leave-active v-leave-to')
+        }).thenWaitFor(leave2 + buffer).then(() => {
+          expect(vm.$el.children.length).toBe(0)
+          vm.ok = true
+        }).then(() => {
+          expect(vm.$el.children[0].className).toBe('test v-enter v-enter-active')
+        }).thenWaitFor(nextFrame).then(() => {
+          expect(vm.$el.children[0].className).toBe('test v-enter-active v-enter-to')
+        }).thenWaitFor(enter2 + buffer).then(() => {
+          expect(vm.$el.children[0].className).toBe('test')
+        }).then(done)
+      }, 10000)
+
+      it('warn invalid durations', done => {
+        const vm = new Vue({
+          template: `
+            <div>
+              <transition :duration="{ enter: NaN, leave: 'foo' }">
+                <div v-if="ok" class="test">foo</div>
+              </transition>
+            </div>
+          `,
+          data: {
+            ok: true
+          }
+        }).$mount(el)
+
+        vm.ok = false
+        waitForUpdate(() => {
+          expect(`<transition> explicit leave duration is not a valid number - got "foo"`).toHaveBeenWarned()
+        }).thenWaitFor(duration + buffer).then(() => {
+          vm.ok = true
+        }).then(() => {
+          expect(`<transition> explicit enter duration is NaN`).toHaveBeenWarned()
+        }).then(done)
+      })
+    })
+
+    // #6687
+    it('transition on child components with empty root node', done => {
+      const vm = new Vue({
+        template: `
+          <div>
+            <transition mode="out-in">
+              <component class="test" :is="view"></component>
+            </transition>
+          </div>
+        `,
+        data: { view: 'one' },
+        components: {
+          'one': {
+            template: '<div v-if="false">one</div>'
+          },
+          'two': {
+            template: '<div>two</div>'
+          }
+        }
+      }).$mount(el)
+
+      // should not apply transition on initial render by default
+      expect(vm.$el.innerHTML).toBe('<!---->')
+      vm.view = 'two'
+      waitForUpdate(() => {
+        expect(vm.$el.innerHTML).toBe('<div class="test v-enter v-enter-active">two</div>')
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.children[0].className).toBe('test v-enter-active v-enter-to')
+      }).thenWaitFor(duration + buffer).then(() => {
+        expect(vm.$el.children[0].className).toBe('test')
+        vm.view = 'one'
+      }).then(() => {
+        // incoming comment node is appended instantly because it doesn't have
+        // data and therefore doesn't go through the transition module.
+        expect(vm.$el.innerHTML).toBe('<div class="test v-leave v-leave-active">two</div><!---->')
+      }).thenWaitFor(nextFrame).then(() => {
+        expect(vm.$el.children[0].className).toBe('test v-leave-active v-leave-to')
+      }).thenWaitFor(duration + buffer).then(() => {
+        expect(vm.$el.innerHTML).toBe('<!---->')
+      }).then(done)
+    })
+  })
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/index.js b/advancedcontentfilter/vendor/asset/vue/test/unit/index.js
new file mode 100644 (file)
index 0000000..35df6c9
--- /dev/null
@@ -0,0 +1,9 @@
+require('es6-promise/auto')
+
+// import all helpers
+const helpersContext = require.context('../helpers', true)
+helpersContext.keys().forEach(helpersContext)
+
+// require all test files
+const testsContext = require.context('./', true, /\.spec$/)
+testsContext.keys().forEach(testsContext)
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/karma.base.config.js b/advancedcontentfilter/vendor/asset/vue/test/unit/karma.base.config.js
new file mode 100644 (file)
index 0000000..b3f0df2
--- /dev/null
@@ -0,0 +1,49 @@
+var alias = require('../../scripts/alias')
+var webpack = require('webpack')
+
+var webpackConfig = {
+  resolve: {
+    alias: alias
+  },
+  module: {
+    rules: [
+      {
+        test: /\.js$/,
+        loader: 'babel-loader',
+        exclude: /node_modules/
+      }
+    ]
+  },
+  plugins: [
+    new webpack.DefinePlugin({
+      __WEEX__: false,
+      'process.env': {
+        NODE_ENV: '"development"',
+        TRANSITION_DURATION: process.env.CI ? 100 : 50,
+        TRANSITION_BUFFER: 10
+      }
+    })
+  ],
+  devtool: '#inline-source-map'
+}
+
+// shared config for all unit tests
+module.exports = {
+  frameworks: ['jasmine'],
+  files: [
+    './index.js'
+  ],
+  preprocessors: {
+    './index.js': ['webpack', 'sourcemap']
+  },
+  webpack: webpackConfig,
+  webpackMiddleware: {
+    noInfo: true
+  },
+  plugins: [
+    'karma-jasmine',
+    'karma-mocha-reporter',
+    'karma-sourcemap-loader',
+    'karma-webpack'
+  ]
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/karma.cover.config.js b/advancedcontentfilter/vendor/asset/vue/test/unit/karma.cover.config.js
new file mode 100644 (file)
index 0000000..360252a
--- /dev/null
@@ -0,0 +1,34 @@
+var base = require('./karma.base.config.js')
+
+module.exports = function (config) {
+  var options = Object.assign(base, {
+    browsers: ['PhantomJS'],
+    reporters: ['mocha', 'coverage'],
+    coverageReporter: {
+      reporters: [
+        { type: 'lcov', dir: '../../coverage', subdir: '.' },
+        { type: 'text-summary', dir: '../../coverage', subdir: '.' }
+      ]
+    },
+    singleRun: true,
+    plugins: base.plugins.concat([
+      'karma-coverage',
+      'karma-phantomjs-launcher'
+    ])
+  })
+
+  // add babel-plugin-istanbul for code instrumentation
+  options.webpack.module.rules[0].options = {
+    plugins: [['istanbul', {
+      exclude: [
+        'test/',
+        'src/compiler/parser/html-parser.js',
+        'src/core/instance/proxy.js',
+        'src/sfc/deindent.js',
+        'src/platforms/weex/'
+      ]
+    }]]
+  }
+
+  config.set(options)
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/karma.dev.config.js b/advancedcontentfilter/vendor/asset/vue/test/unit/karma.dev.config.js
new file mode 100644 (file)
index 0000000..9285861
--- /dev/null
@@ -0,0 +1,11 @@
+var base = require('./karma.base.config.js')
+
+module.exports = function (config) {
+  config.set(Object.assign(base, {
+    browsers: ['PhantomJS'],
+    reporters: ['progress'],
+    plugins: base.plugins.concat([
+      'karma-phantomjs-launcher'
+    ])
+  }))
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/karma.sauce.config.js b/advancedcontentfilter/vendor/asset/vue/test/unit/karma.sauce.config.js
new file mode 100644 (file)
index 0000000..55672b5
--- /dev/null
@@ -0,0 +1,106 @@
+var webpack = require('webpack')
+var base = require('./karma.base.config.js')
+
+base.webpack.plugins = [
+  new webpack.DefinePlugin({
+    __WEEX__: false,
+    'process.env': {
+      NODE_ENV: '"development"',
+      // sauce lab vms are slow!
+      TRANSITION_DURATION: 500,
+      TRANSITION_BUFFER: 50
+    }
+  })
+]
+
+/**
+ * Having too many tests running concurrently on saucelabs
+ * causes timeouts and errors, so we have to run them in
+ * smaller batches.
+ */
+
+var batches = [
+  // the cool kids
+  {
+    sl_chrome: {
+      base: 'SauceLabs',
+      browserName: 'chrome',
+      platform: 'Windows 7'
+    },
+    sl_firefox: {
+      base: 'SauceLabs',
+      browserName: 'firefox'
+    },
+    sl_mac_safari: {
+      base: 'SauceLabs',
+      browserName: 'safari',
+      platform: 'OS X 10.10'
+    }
+  },
+  // ie family
+  {
+    sl_ie_9: {
+      base: 'SauceLabs',
+      browserName: 'internet explorer',
+      platform: 'Windows 7',
+      version: '9'
+    },
+    sl_ie_10: {
+      base: 'SauceLabs',
+      browserName: 'internet explorer',
+      platform: 'Windows 8',
+      version: '10'
+    },
+    sl_ie_11: {
+      base: 'SauceLabs',
+      browserName: 'internet explorer',
+      platform: 'Windows 8.1',
+      version: '11'
+    },
+    sl_edge: {
+      base: 'SauceLabs',
+      browserName: 'MicrosoftEdge',
+      platform: 'Windows 10'
+    }
+  },
+  // mobile
+  {
+    sl_ios_safari_9: {
+      base: 'SauceLabs',
+      browserName: 'iphone',
+      version: '10.3'
+    },
+    sl_android_6_0: {
+      base: 'SauceLabs',
+      browserName: 'android',
+      version: '6.0'
+    }
+  }
+]
+
+module.exports = function (config) {
+  var batch = batches[process.argv[4] || 0]
+
+  config.set(Object.assign(base, {
+    singleRun: true,
+    browsers: Object.keys(batch),
+    customLaunchers: batch,
+    reporters: process.env.CI
+      ? ['dots', 'saucelabs'] // avoid spamming CI output
+      : ['progress', 'saucelabs'],
+    sauceLabs: {
+      testName: 'Vue.js unit tests',
+      recordScreenshots: false,
+      connectOptions: {
+        'no-ssl-bump-domains': 'all' // Ignore SSL error on Android emulator
+      },
+      build: process.env.CIRCLE_BUILD_NUM || process.env.SAUCE_BUILD_ID || Date.now()
+    },
+    // mobile emulators are really slow
+    captureTimeout: 300000,
+    browserNoActivityTimeout: 300000,
+    plugins: base.plugins.concat([
+      'karma-sauce-launcher'
+    ])
+  }))
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/karma.unit.config.js b/advancedcontentfilter/vendor/asset/vue/test/unit/karma.unit.config.js
new file mode 100644 (file)
index 0000000..7840df7
--- /dev/null
@@ -0,0 +1,14 @@
+var base = require('./karma.base.config.js')
+
+module.exports = function (config) {
+  config.set(Object.assign(base, {
+    browsers: ['Chrome', 'Firefox', 'Safari'],
+    reporters: ['progress'],
+    singleRun: true,
+    plugins: base.plugins.concat([
+      'karma-chrome-launcher',
+      'karma-firefox-launcher',
+      'karma-safari-launcher'
+    ])
+  }))
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/modules/compiler/codegen.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/modules/compiler/codegen.spec.js
new file mode 100644 (file)
index 0000000..93a27f3
--- /dev/null
@@ -0,0 +1,607 @@
+import { parse } from 'compiler/parser/index'
+import { optimize } from 'compiler/optimizer'
+import { generate } from 'compiler/codegen'
+import { isObject, extend } from 'shared/util'
+import { isReservedTag } from 'web/util/index'
+import { baseOptions } from 'web/compiler/options'
+
+function assertCodegen (template, generatedCode, ...args) {
+  let staticRenderFnCodes = []
+  let generateOptions = baseOptions
+  let proc = null
+  let len = args.length
+  while (len--) {
+    const arg = args[len]
+    if (Array.isArray(arg)) {
+      staticRenderFnCodes = arg
+    } else if (isObject(arg)) {
+      generateOptions = arg
+    } else if (typeof arg === 'function') {
+      proc = arg
+    }
+  }
+  const ast = parse(template, baseOptions)
+  optimize(ast, baseOptions)
+  proc && proc(ast)
+  const res = generate(ast, generateOptions)
+  expect(res.render).toBe(generatedCode)
+  expect(res.staticRenderFns).toEqual(staticRenderFnCodes)
+}
+
+/* eslint-disable quotes */
+describe('codegen', () => {
+  it('generate directive', () => {
+    assertCodegen(
+      '<p v-custom1:arg1.modifier="value1" v-custom2></p>',
+      `with(this){return _c('p',{directives:[{name:"custom1",rawName:"v-custom1:arg1.modifier",value:(value1),expression:"value1",arg:"arg1",modifiers:{"modifier":true}},{name:"custom2",rawName:"v-custom2"}]})}`
+    )
+  })
+
+  it('generate filters', () => {
+    assertCodegen(
+      '<div :id="a | b | c">{{ d | e | f }}</div>',
+      `with(this){return _c('div',{attrs:{"id":_f("c")(_f("b")(a))}},[_v(_s(_f("f")(_f("e")(d))))])}`
+    )
+  })
+
+  it('generate filters with no arguments', () => {
+    assertCodegen(
+      '<div>{{ d | e() }}</div>',
+      `with(this){return _c('div',[_v(_s(_f("e")(d)))])}`
+    )
+  })
+
+  it('generate v-for directive', () => {
+    assertCodegen(
+      '<div><li v-for="item in items" :key="item.uid"></li></div>',
+      `with(this){return _c('div',_l((items),function(item){return _c('li',{key:item.uid})}))}`
+    )
+    // iterator syntax
+    assertCodegen(
+      '<div><li v-for="(item, i) in items"></li></div>',
+      `with(this){return _c('div',_l((items),function(item,i){return _c('li')}))}`
+    )
+    assertCodegen(
+      '<div><li v-for="(item, key, index) in items"></li></div>',
+      `with(this){return _c('div',_l((items),function(item,key,index){return _c('li')}))}`
+    )
+    // destructuring
+    assertCodegen(
+      '<div><li v-for="{ a, b } in items"></li></div>',
+      `with(this){return _c('div',_l((items),function({ a, b }){return _c('li')}))}`
+    )
+    assertCodegen(
+      '<div><li v-for="({ a, b }, key, index) in items"></li></div>',
+      `with(this){return _c('div',_l((items),function({ a, b },key,index){return _c('li')}))}`
+    )
+    // v-for with extra element
+    assertCodegen(
+      '<div><p></p><li v-for="item in items"></li></div>',
+      `with(this){return _c('div',[_c('p'),_l((items),function(item){return _c('li')})],2)}`
+    )
+  })
+
+  it('generate v-if directive', () => {
+    assertCodegen(
+      '<p v-if="show">hello</p>',
+      `with(this){return (show)?_c('p',[_v("hello")]):_e()}`
+    )
+  })
+
+  it('generate v-else directive', () => {
+    assertCodegen(
+      '<div><p v-if="show">hello</p><p v-else>world</p></div>',
+      `with(this){return _c('div',[(show)?_c('p',[_v("hello")]):_c('p',[_v("world")])])}`
+    )
+  })
+
+  it('generate v-else-if directive', () => {
+    assertCodegen(
+      '<div><p v-if="show">hello</p><p v-else-if="hide">world</p></div>',
+      `with(this){return _c('div',[(show)?_c('p',[_v("hello")]):(hide)?_c('p',[_v("world")]):_e()])}`
+    )
+  })
+
+  it('generate v-else-if with v-else directive', () => {
+    assertCodegen(
+      '<div><p v-if="show">hello</p><p v-else-if="hide">world</p><p v-else>bye</p></div>',
+      `with(this){return _c('div',[(show)?_c('p',[_v("hello")]):(hide)?_c('p',[_v("world")]):_c('p',[_v("bye")])])}`
+    )
+  })
+
+  it('generate multi v-else-if with v-else directive', () => {
+    assertCodegen(
+      '<div><p v-if="show">hello</p><p v-else-if="hide">world</p><p v-else-if="3">elseif</p><p v-else>bye</p></div>',
+      `with(this){return _c('div',[(show)?_c('p',[_v("hello")]):(hide)?_c('p',[_v("world")]):(3)?_c('p',[_v("elseif")]):_c('p',[_v("bye")])])}`
+    )
+  })
+
+  it('generate ref', () => {
+    assertCodegen(
+      '<p ref="component1"></p>',
+      `with(this){return _c('p',{ref:"component1"})}`
+    )
+  })
+
+  it('generate ref on v-for', () => {
+    assertCodegen(
+      '<ul><li v-for="item in items" ref="component1"></li></ul>',
+      `with(this){return _c('ul',_l((items),function(item){return _c('li',{ref:"component1",refInFor:true})}))}`
+    )
+  })
+
+  it('generate v-bind directive', () => {
+    assertCodegen(
+      '<p v-bind="test"></p>',
+      `with(this){return _c('p',_b({},'p',test,false))}`
+    )
+  })
+
+  it('generate v-bind with prop directive', () => {
+    assertCodegen(
+      '<p v-bind.prop="test"></p>',
+      `with(this){return _c('p',_b({},'p',test,true))}`
+    )
+  })
+
+  it('generate v-bind directive with sync modifier', () => {
+    assertCodegen(
+      '<p v-bind.sync="test"></p>',
+      `with(this){return _c('p',_b({},'p',test,false,true))}`
+    )
+  })
+
+  it('generate template tag', () => {
+    assertCodegen(
+      '<div><template><p>{{hello}}</p></template></div>',
+      `with(this){return _c('div',[[_c('p',[_v(_s(hello))])]],2)}`
+    )
+  })
+
+  it('generate single slot', () => {
+    assertCodegen(
+      '<div><slot></slot></div>',
+      `with(this){return _c('div',[_t("default")],2)}`
+    )
+  })
+
+  it('generate named slot', () => {
+    assertCodegen(
+      '<div><slot name="one"></slot></div>',
+      `with(this){return _c('div',[_t("one")],2)}`
+    )
+  })
+
+  it('generate slot fallback content', () => {
+    assertCodegen(
+      '<div><slot><div>hi</div></slot></div>',
+      `with(this){return _c('div',[_t("default",[_c('div',[_v("hi")])])],2)}`
+    )
+  })
+
+  it('generate slot target', () => {
+    assertCodegen(
+      '<p slot="one">hello world</p>',
+      `with(this){return _c('p',{attrs:{"slot":"one"},slot:"one"},[_v("hello world")])}`
+    )
+  })
+
+  it('generate scoped slot', () => {
+    assertCodegen(
+      '<foo><template slot-scope="bar">{{ bar }}</template></foo>',
+      `with(this){return _c('foo',{scopedSlots:_u([{key:"default",fn:function(bar){return [_v(_s(bar))]}}])})}`
+    )
+    assertCodegen(
+      '<foo><div slot-scope="bar">{{ bar }}</div></foo>',
+      `with(this){return _c('foo',{scopedSlots:_u([{key:"default",fn:function(bar){return _c('div',{},[_v(_s(bar))])}}])})}`
+    )
+  })
+
+  it('generate named scoped slot', () => {
+    assertCodegen(
+      '<foo><template slot="foo" slot-scope="bar">{{ bar }}</template></foo>',
+      `with(this){return _c('foo',{scopedSlots:_u([{key:"foo",fn:function(bar){return [_v(_s(bar))]}}])})}`
+    )
+    assertCodegen(
+      '<foo><div slot="foo" slot-scope="bar">{{ bar }}</div></foo>',
+      `with(this){return _c('foo',{scopedSlots:_u([{key:"foo",fn:function(bar){return _c('div',{},[_v(_s(bar))])}}])})}`
+    )
+  })
+
+  it('generate class binding', () => {
+    // static
+    assertCodegen(
+      '<p class="class1">hello world</p>',
+      `with(this){return _c('p',{staticClass:"class1"},[_v("hello world")])}`,
+    )
+    // dynamic
+    assertCodegen(
+      '<p :class="class1">hello world</p>',
+      `with(this){return _c('p',{class:class1},[_v("hello world")])}`
+    )
+  })
+
+  it('generate style binding', () => {
+    assertCodegen(
+      '<p :style="error">hello world</p>',
+      `with(this){return _c('p',{style:(error)},[_v("hello world")])}`
+    )
+  })
+
+  it('generate v-show directive', () => {
+    assertCodegen(
+      '<p v-show="shown">hello world</p>',
+      `with(this){return _c('p',{directives:[{name:"show",rawName:"v-show",value:(shown),expression:"shown"}]},[_v("hello world")])}`
+    )
+  })
+
+  it('generate DOM props with v-bind directive', () => {
+    // input + value
+    assertCodegen(
+      '<input :value="msg">',
+      `with(this){return _c('input',{domProps:{"value":msg}})}`
+    )
+    // non input
+    assertCodegen(
+      '<p :value="msg"/>',
+      `with(this){return _c('p',{attrs:{"value":msg}})}`
+    )
+  })
+
+  it('generate attrs with v-bind directive', () => {
+    assertCodegen(
+      '<input :name="field1">',
+      `with(this){return _c('input',{attrs:{"name":field1}})}`
+    )
+  })
+
+  it('generate static attrs', () => {
+    assertCodegen(
+      '<input name="field1">',
+      `with(this){return _c('input',{attrs:{"name":"field1"}})}`
+    )
+  })
+
+  it('generate events with v-on directive', () => {
+    assertCodegen(
+      '<input @input="onInput">',
+      `with(this){return _c('input',{on:{"input":onInput}})}`
+    )
+  })
+
+  it('generate events with method call', () => {
+    assertCodegen(
+      '<input @input="onInput($event);">',
+      `with(this){return _c('input',{on:{"input":function($event){onInput($event);}}})}`
+    )
+    // empty arguments
+    assertCodegen(
+      '<input @input="onInput();">',
+      `with(this){return _c('input',{on:{"input":function($event){onInput();}}})}`
+    )
+    // without semicolon
+    assertCodegen(
+      '<input @input="onInput($event)">',
+      `with(this){return _c('input',{on:{"input":function($event){onInput($event)}}})}`
+    )
+    // multiple args
+    assertCodegen(
+      '<input @input="onInput($event, \'abc\', 5);">',
+      `with(this){return _c('input',{on:{"input":function($event){onInput($event, 'abc', 5);}}})}`
+    )
+    // expression in args
+    assertCodegen(
+      '<input @input="onInput($event, 2+2);">',
+      `with(this){return _c('input',{on:{"input":function($event){onInput($event, 2+2);}}})}`
+    )
+    // tricky symbols in args
+    assertCodegen(
+      '<input @input="onInput(\');[\'());\');">',
+      `with(this){return _c('input',{on:{"input":function($event){onInput(');[\'());');}}})}`
+    )
+  })
+
+  it('generate events with multiple statements', () => {
+    // normal function
+    assertCodegen(
+      '<input @input="onInput1();onInput2()">',
+      `with(this){return _c('input',{on:{"input":function($event){onInput1();onInput2()}}})}`
+    )
+    // function with multiple args
+    assertCodegen(
+      '<input @input="onInput1($event, \'text\');onInput2(\'text2\', $event)">',
+      `with(this){return _c('input',{on:{"input":function($event){onInput1($event, 'text');onInput2('text2', $event)}}})}`
+    )
+  })
+
+  it('generate events with keycode', () => {
+    assertCodegen(
+      '<input @input.enter="onInput">',
+      `with(this){return _c('input',{on:{"input":function($event){if(!('button' in $event)&&_k($event.keyCode,"enter",13,$event.key,"Enter"))return null;return onInput($event)}}})}`
+    )
+    // multiple keycodes (delete)
+    assertCodegen(
+      '<input @input.delete="onInput">',
+      `with(this){return _c('input',{on:{"input":function($event){if(!('button' in $event)&&_k($event.keyCode,"delete",[8,46],$event.key,["Backspace","Delete"]))return null;return onInput($event)}}})}`
+    )
+    // multiple keycodes (chained)
+    assertCodegen(
+      '<input @keydown.enter.delete="onInput">',
+      `with(this){return _c('input',{on:{"keydown":function($event){if(!('button' in $event)&&_k($event.keyCode,"enter",13,$event.key,"Enter")&&_k($event.keyCode,"delete",[8,46],$event.key,["Backspace","Delete"]))return null;return onInput($event)}}})}`
+    )
+    // number keycode
+    assertCodegen(
+      '<input @input.13="onInput">',
+      `with(this){return _c('input',{on:{"input":function($event){if(!('button' in $event)&&$event.keyCode!==13)return null;return onInput($event)}}})}`
+    )
+    // custom keycode
+    assertCodegen(
+      '<input @input.custom="onInput">',
+      `with(this){return _c('input',{on:{"input":function($event){if(!('button' in $event)&&_k($event.keyCode,"custom",undefined,$event.key,undefined))return null;return onInput($event)}}})}`
+    )
+  })
+
+  it('generate events with generic modifiers', () => {
+    assertCodegen(
+      '<input @input.stop="onInput">',
+      `with(this){return _c('input',{on:{"input":function($event){$event.stopPropagation();return onInput($event)}}})}`
+    )
+    assertCodegen(
+      '<input @input.prevent="onInput">',
+      `with(this){return _c('input',{on:{"input":function($event){$event.preventDefault();return onInput($event)}}})}`
+    )
+    assertCodegen(
+      '<input @input.self="onInput">',
+      `with(this){return _c('input',{on:{"input":function($event){if($event.target !== $event.currentTarget)return null;return onInput($event)}}})}`
+    )
+  })
+
+  // GitHub Issues #5146
+  it('generate events with generic modifiers and keycode correct order', () => {
+    assertCodegen(
+      '<input @keydown.enter.prevent="onInput">',
+      `with(this){return _c('input',{on:{"keydown":function($event){if(!('button' in $event)&&_k($event.keyCode,"enter",13,$event.key,"Enter"))return null;$event.preventDefault();return onInput($event)}}})}`
+    )
+
+    assertCodegen(
+      '<input @keydown.enter.stop="onInput">',
+      `with(this){return _c('input',{on:{"keydown":function($event){if(!('button' in $event)&&_k($event.keyCode,"enter",13,$event.key,"Enter"))return null;$event.stopPropagation();return onInput($event)}}})}`
+    )
+  })
+
+  it('generate events with mouse event modifiers', () => {
+    assertCodegen(
+      '<input @click.ctrl="onClick">',
+      `with(this){return _c('input',{on:{"click":function($event){if(!$event.ctrlKey)return null;return onClick($event)}}})}`
+    )
+    assertCodegen(
+      '<input @click.shift="onClick">',
+      `with(this){return _c('input',{on:{"click":function($event){if(!$event.shiftKey)return null;return onClick($event)}}})}`
+    )
+    assertCodegen(
+      '<input @click.alt="onClick">',
+      `with(this){return _c('input',{on:{"click":function($event){if(!$event.altKey)return null;return onClick($event)}}})}`
+    )
+    assertCodegen(
+      '<input @click.meta="onClick">',
+      `with(this){return _c('input',{on:{"click":function($event){if(!$event.metaKey)return null;return onClick($event)}}})}`
+    )
+    assertCodegen(
+      '<input @click.exact="onClick">',
+      `with(this){return _c('input',{on:{"click":function($event){if($event.ctrlKey||$event.shiftKey||$event.altKey||$event.metaKey)return null;return onClick($event)}}})}`
+    )
+    assertCodegen(
+      '<input @click.ctrl.exact="onClick">',
+      `with(this){return _c('input',{on:{"click":function($event){if(!$event.ctrlKey)return null;if($event.shiftKey||$event.altKey||$event.metaKey)return null;return onClick($event)}}})}`
+    )
+  })
+
+  it('generate events with multiple modifiers', () => {
+    assertCodegen(
+      '<input @input.stop.prevent.self="onInput">',
+      `with(this){return _c('input',{on:{"input":function($event){$event.stopPropagation();$event.preventDefault();if($event.target !== $event.currentTarget)return null;return onInput($event)}}})}`
+    )
+  })
+
+  it('generate events with capture modifier', () => {
+    assertCodegen(
+      '<input @input.capture="onInput">',
+      `with(this){return _c('input',{on:{"!input":function($event){return onInput($event)}}})}`
+    )
+  })
+
+  it('generate events with once modifier', () => {
+    assertCodegen(
+      '<input @input.once="onInput">',
+      `with(this){return _c('input',{on:{"~input":function($event){return onInput($event)}}})}`
+    )
+  })
+
+  it('generate events with capture and once modifier', () => {
+    assertCodegen(
+      '<input @input.capture.once="onInput">',
+      `with(this){return _c('input',{on:{"~!input":function($event){return onInput($event)}}})}`
+    )
+  })
+
+  it('generate events with once and capture modifier', () => {
+    assertCodegen(
+      '<input @input.once.capture="onInput">',
+      `with(this){return _c('input',{on:{"~!input":function($event){return onInput($event)}}})}`
+    )
+  })
+
+  it('generate events with inline statement', () => {
+    assertCodegen(
+      '<input @input="current++">',
+      `with(this){return _c('input',{on:{"input":function($event){current++}}})}`
+    )
+  })
+
+  it('generate events with inline function expression', () => {
+    // normal function
+    assertCodegen(
+      '<input @input="function () { current++ }">',
+      `with(this){return _c('input',{on:{"input":function () { current++ }}})}`
+    )
+    // arrow with no args
+    assertCodegen(
+      '<input @input="()=>current++">',
+      `with(this){return _c('input',{on:{"input":()=>current++}})}`
+    )
+    // arrow with parens, single arg
+    assertCodegen(
+      '<input @input="(e) => current++">',
+      `with(this){return _c('input',{on:{"input":(e) => current++}})}`
+    )
+    // arrow with parens, multi args
+    assertCodegen(
+      '<input @input="(a, b, c) => current++">',
+      `with(this){return _c('input',{on:{"input":(a, b, c) => current++}})}`
+    )
+    // arrow with destructuring
+    assertCodegen(
+      '<input @input="({ a, b }) => current++">',
+      `with(this){return _c('input',{on:{"input":({ a, b }) => current++}})}`
+    )
+    // arrow single arg no parens
+    assertCodegen(
+      '<input @input="e=>current++">',
+      `with(this){return _c('input',{on:{"input":e=>current++}})}`
+    )
+    // with modifiers
+    assertCodegen(
+      `<input @keyup.enter="e=>current++">`,
+      `with(this){return _c('input',{on:{"keyup":function($event){if(!('button' in $event)&&_k($event.keyCode,"enter",13,$event.key,"Enter"))return null;return (e=>current++)($event)}}})}`
+    )
+  })
+
+  // #3893
+  it('should not treat handler with unexpected whitespace as inline statement', () => {
+    assertCodegen(
+      '<input @input=" onInput ">',
+      `with(this){return _c('input',{on:{"input":onInput}})}`
+    )
+  })
+
+  it('generate unhandled events', () => {
+    assertCodegen(
+      '<input @input="current++">',
+      `with(this){return _c('input',{on:{"input":function(){}}})}`,
+      ast => {
+        ast.events.input = undefined
+      }
+    )
+  })
+
+  it('generate multiple event handlers', () => {
+    assertCodegen(
+      '<input @input="current++" @input.stop="onInput">',
+      `with(this){return _c('input',{on:{"input":[function($event){current++},function($event){$event.stopPropagation();return onInput($event)}]}})}`
+    )
+  })
+
+  it('generate component', () => {
+    assertCodegen(
+      '<my-component name="mycomponent1" :msg="msg" @notify="onNotify"><div>hi</div></my-component>',
+      `with(this){return _c('my-component',{attrs:{"name":"mycomponent1","msg":msg},on:{"notify":onNotify}},[_c('div',[_v("hi")])])}`
+    )
+  })
+
+  it('generate svg component with children', () => {
+    assertCodegen(
+      '<svg><my-comp><circle :r="10"></circle></my-comp></svg>',
+      `with(this){return _c('svg',[_c('my-comp',[_c('circle',{attrs:{"r":10}})])],1)}`
+    )
+  })
+
+  it('generate is attribute', () => {
+    assertCodegen(
+      '<div is="component1"></div>',
+      `with(this){return _c("component1",{tag:"div"})}`
+    )
+    assertCodegen(
+      '<div :is="component1"></div>',
+      `with(this){return _c(component1,{tag:"div"})}`
+    )
+  })
+
+  it('generate component with inline-template', () => {
+    // have "inline-template'"
+    assertCodegen(
+      '<my-component inline-template><p><span>hello world</span></p></my-component>',
+      `with(this){return _c('my-component',{inlineTemplate:{render:function(){with(this){return _m(0)}},staticRenderFns:[function(){with(this){return _c('p',[_c('span',[_v("hello world")])])}}]}})}`
+    )
+    // "have inline-template attrs, but not having exactly one child element
+    assertCodegen(
+      '<my-component inline-template><hr><hr></my-component>',
+      `with(this){return _c('my-component',{inlineTemplate:{render:function(){with(this){return _c('hr')}},staticRenderFns:[]}})}`
+    )
+    try {
+      assertCodegen(
+        '<my-component inline-template></my-component>',
+        ''
+      )
+    } catch (e) {}
+    expect('Inline-template components must have exactly one child element.').toHaveBeenWarned()
+    expect(console.error.calls.count()).toBe(2)
+  })
+
+  it('generate static trees inside v-for', () => {
+    assertCodegen(
+      `<div><div v-for="i in 10"><p><span></span></p></div></div>`,
+      `with(this){return _c('div',_l((10),function(i){return _c('div',[_m(0,true)])}))}`,
+      [`with(this){return _c('p',[_c('span')])}`]
+    )
+  })
+
+  it('generate component with v-for', () => {
+    // normalize type: 2
+    assertCodegen(
+      '<div><child></child><template v-for="item in list">{{ item }}</template></div>',
+      `with(this){return _c('div',[_c('child'),_l((list),function(item){return [_v(_s(item))]})],2)}`
+    )
+  })
+
+  it('generate component with comment', () => {
+    const options = extend({
+      comments: true
+    }, baseOptions)
+    const template = '<div><!--comment--></div>'
+    const generatedCode = `with(this){return _c('div',[_e("comment")])}`
+
+    const ast = parse(template, options)
+    optimize(ast, options)
+    const res = generate(ast, options)
+    expect(res.render).toBe(generatedCode)
+  })
+
+  // #6150
+  it('generate comments with special characters', () => {
+    const options = extend({
+      comments: true
+    }, baseOptions)
+    const template = '<div><!--\n\'comment\'\n--></div>'
+    const generatedCode = `with(this){return _c('div',[_e("\\n'comment'\\n")])}`
+
+    const ast = parse(template, options)
+    optimize(ast, options)
+    const res = generate(ast, options)
+    expect(res.render).toBe(generatedCode)
+  })
+
+  it('not specified ast type', () => {
+    const res = generate(null, baseOptions)
+    expect(res.render).toBe(`with(this){return _c("div")}`)
+    expect(res.staticRenderFns).toEqual([])
+  })
+
+  it('not specified directives option', () => {
+    assertCodegen(
+      '<p v-if="show">hello world</p>',
+      `with(this){return (show)?_c('p',[_v("hello world")]):_e()}`,
+      { isReservedTag }
+    )
+  })
+})
+/* eslint-enable quotes */
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/modules/compiler/compiler-options.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/modules/compiler/compiler-options.spec.js
new file mode 100644 (file)
index 0000000..0070c35
--- /dev/null
@@ -0,0 +1,130 @@
+import Vue from 'vue'
+import { compile } from 'web/compiler'
+import { getAndRemoveAttr } from 'compiler/helpers'
+
+describe('compile options', () => {
+  it('should be compiled', () => {
+    const { render, staticRenderFns, errors } = compile(`
+      <div>
+        <input type="text" v-model="msg" required max="8" v-validate:field1.group1.group2>
+      </div>
+    `, {
+      directives: {
+        validate (el, dir) {
+          if (dir.name === 'validate' && dir.arg) {
+            el.validate = {
+              field: dir.arg,
+              groups: dir.modifiers ? Object.keys(dir.modifiers) : []
+            }
+          }
+        }
+      },
+      modules: [
+        {
+          transformNode (el) {
+            el.validators = el.validators || []
+            const validators = ['required', 'min', 'max', 'pattern', 'maxlength', 'minlength']
+            validators.forEach(name => {
+              const rule = getAndRemoveAttr(el, name)
+              if (rule !== undefined) {
+                el.validators.push({ name, rule })
+              }
+            })
+          },
+          genData (el) {
+            let data = ''
+            if (el.validate) {
+              data += `validate:${JSON.stringify(el.validate)},`
+            }
+            if (el.validators) {
+              data += `validators:${JSON.stringify(el.validators)},`
+            }
+            return data
+          },
+          transformCode (el, code) {
+            // check
+            if (!el.validate || !el.validators) {
+              return code
+            }
+            // setup validation result props
+            const result = { dirty: false } // define something other prop
+            el.validators.forEach(validator => {
+              result[validator.name] = null
+            })
+            // generate code
+            return `_c('validate',{props:{
+              field:${JSON.stringify(el.validate.field)},
+              groups:${JSON.stringify(el.validate.groups)},
+              validators:${JSON.stringify(el.validators)},
+              result:${JSON.stringify(result)},
+              child:${code}}
+            })`
+          }
+        }
+      ]
+    })
+    expect(render).not.toBeUndefined()
+    expect(staticRenderFns).toEqual([])
+    expect(errors).toEqual([])
+
+    const renderFn = new Function(render)
+    const vm = new Vue({
+      data: {
+        msg: 'hello'
+      },
+      components: {
+        validate: {
+          props: ['field', 'groups', 'validators', 'result', 'child'],
+          render (h) {
+            return this.child
+          },
+          computed: {
+            valid () {
+              let ret = true
+              for (let i = 0; i > this.validators.length; i++) {
+                const { name } = this.validators[i]
+                if (!this.result[name]) {
+                  ret = false
+                  break
+                }
+              }
+              return ret
+            }
+          },
+          mounted () {
+            // initialize validation
+            const value = this.$el.value
+            this.validators.forEach(validator => {
+              const ret = this[validator.name](value, validator.rule)
+              this.result[validator.name] = ret
+            })
+          },
+          methods: {
+            // something validators logic
+            required (val) {
+              return val.length > 0
+            },
+            max (val, rule) {
+              return !(parseInt(val, 10) > parseInt(rule, 10))
+            }
+          }
+        }
+      },
+      render: renderFn,
+      staticRenderFns
+    }).$mount()
+    expect(vm.$el.innerHTML).toBe('<input type="text">')
+    expect(vm.$children[0].valid).toBe(true)
+  })
+
+  it('should collect errors', () => {
+    let compiled = compile('hello')
+    expect(compiled.errors.length).toBe(1)
+    expect(compiled.errors[0]).toContain('root element')
+
+    compiled = compile('<div v-if="a----">{{ b++++ }}</div>')
+    expect(compiled.errors.length).toBe(2)
+    expect(compiled.errors[0]).toContain('Raw expression: v-if="a----"')
+    expect(compiled.errors[1]).toContain('Raw expression: {{ b++++ }}')
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/modules/compiler/optimizer.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/modules/compiler/optimizer.spec.js
new file mode 100644 (file)
index 0000000..c807908
--- /dev/null
@@ -0,0 +1,257 @@
+import { parse } from 'compiler/parser/index'
+import { extend } from 'shared/util'
+import { optimize } from 'compiler/optimizer'
+import { baseOptions } from 'web/compiler/options'
+
+describe('optimizer', () => {
+  it('simple', () => {
+    const ast = parse('<h1 id="section1"><span>hello world</span></h1>', baseOptions)
+    optimize(ast, baseOptions)
+    expect(ast.static).toBe(true) // h1
+    expect(ast.staticRoot).toBe(true)
+    expect(ast.children[0].static).toBe(true) // span
+  })
+
+  it('simple with comment', () => {
+    const options = extend({
+      comments: true
+    }, baseOptions)
+    const ast = parse('<h1 id="section1"><span>hello world</span><!--comment--></h1>', options)
+    optimize(ast, options)
+    expect(ast.static).toBe(true) // h1
+    expect(ast.staticRoot).toBe(true)
+    expect(ast.children.length).toBe(2)
+    expect(ast.children[0].static).toBe(true) // span
+    expect(ast.children[1].static).toBe(true) // comment
+  })
+
+  it('skip simple nodes', () => {
+    const ast = parse('<h1 id="section1">hello</h1>', baseOptions)
+    optimize(ast, baseOptions)
+    expect(ast.static).toBe(true)
+    expect(ast.staticRoot).toBe(false) // this is too simple to warrant a static tree
+  })
+
+  it('interpolation', () => {
+    const ast = parse('<h1>{{msg}}</h1>', baseOptions)
+    optimize(ast, baseOptions)
+    expect(ast.static).toBe(false) // h1
+    expect(ast.children[0].static).toBe(false) // text node with interpolation
+  })
+
+  it('nested elements', () => {
+    const ast = parse('<ul><li>hello</li><li>world</li></ul>', baseOptions)
+    optimize(ast, baseOptions)
+    // ul
+    expect(ast.static).toBe(true)
+    expect(ast.staticRoot).toBe(true)
+    // li
+    expect(ast.children[0].static).toBe(true) // first
+    expect(ast.children[1].static).toBe(true) // second
+    // text node inside li
+    expect(ast.children[0].children[0].static).toBe(true) // first
+    expect(ast.children[1].children[0].static).toBe(true) // second
+  })
+
+  it('nested complex elements', () => {
+    const ast = parse('<ul><li>{{msg1}}</li><li>---</li><li>{{msg2}}</li></ul>', baseOptions)
+    optimize(ast, baseOptions)
+    // ul
+    expect(ast.static).toBe(false) // ul
+    // li
+    expect(ast.children[0].static).toBe(false) // first
+    expect(ast.children[1].static).toBe(true) // second
+    expect(ast.children[2].static).toBe(false) // third
+    // text node inside li
+    expect(ast.children[0].children[0].static).toBe(false) // first
+    expect(ast.children[1].children[0].static).toBe(true) // second
+    expect(ast.children[2].children[0].static).toBe(false) // third
+  })
+
+  it('v-if directive', () => {
+    const ast = parse('<div id="section1" v-if="show"><p><span>hello world</span></p></div>', baseOptions)
+    optimize(ast, baseOptions)
+    expect(ast.static).toBe(false)
+    expect(ast.children[0].static).toBe(true)
+  })
+
+  it('v-else directive', () => {
+    const ast = parse('<div><p v-if="show">hello world</p><div v-else><p><span>foo bar</span></p></div></div>', baseOptions)
+    optimize(ast, baseOptions)
+    expect(ast.static).toBe(false)
+    expect(ast.children[0].static).toBe(false)
+    expect(ast.children[0].ifConditions[0].block.static).toBe(false)
+    expect(ast.children[0].ifConditions[1].block.static).toBe(false)
+    expect(ast.children[0].ifConditions[0].block.children[0].static).toBe(true)
+    expect(ast.children[0].ifConditions[1].block.children[0].static).toBe(true)
+  })
+
+  it('v-pre directive', () => {
+    const ast = parse('<ul v-pre><li>{{msg}}</li><li>world</li></ul>', baseOptions)
+    optimize(ast, baseOptions)
+    expect(ast.static).toBe(true)
+    expect(ast.staticRoot).toBe(true)
+    expect(ast.children[0].static).toBe(true)
+    expect(ast.children[1].static).toBe(true)
+    expect(ast.children[0].children[0].static).toBe(true)
+    expect(ast.children[1].children[0].static).toBe(true)
+  })
+
+  it('v-for directive', () => {
+    const ast = parse('<ul><li v-for="item in items">hello world {{$index}}</li></ul>', baseOptions)
+    optimize(ast, baseOptions)
+    // ul
+    expect(ast.static).toBe(false)
+    // li with v-for
+    expect(ast.children[0].static).toBe(false)
+    expect(ast.children[0].children[0].static).toBe(false)
+  })
+
+  it('v-once directive', () => {
+    const ast = parse('<p v-once>{{msg}}</p>', baseOptions)
+    optimize(ast, baseOptions)
+    expect(ast.static).toBe(false) // p
+    expect(ast.children[0].static).toBe(false) // text node
+  })
+
+  it('single slot', () => {
+    const ast = parse('<div><slot>hello</slot></div>', baseOptions)
+    optimize(ast, baseOptions)
+    expect(ast.children[0].static).toBe(false) // slot
+    expect(ast.children[0].children[0].static).toBe(true) // text node
+  })
+
+  it('named slot', () => {
+    const ast = parse('<div><slot name="one">hello world</slot></div>', baseOptions)
+    optimize(ast, baseOptions)
+    expect(ast.children[0].static).toBe(false) // slot
+    expect(ast.children[0].children[0].static).toBe(true) // text node
+  })
+
+  it('slot target', () => {
+    const ast = parse('<p slot="one">hello world</p>', baseOptions)
+    optimize(ast, baseOptions)
+    expect(ast.static).toBe(false) // slot
+    expect(ast.children[0].static).toBe(true) // text node
+  })
+
+  it('component', () => {
+    const ast = parse('<my-component></my-component>', baseOptions)
+    optimize(ast, baseOptions)
+    expect(ast.static).toBe(false) // component
+  })
+
+  it('component for inline-template', () => {
+    const ast = parse('<my-component inline-template><p>hello world</p><p>{{msg}}</p></my-component>', baseOptions)
+    optimize(ast, baseOptions)
+    // component
+    expect(ast.static).toBe(false) // component
+    // p
+    expect(ast.children[0].static).toBe(true) // first
+    expect(ast.children[1].static).toBe(false) // second
+    // text node inside p
+    expect(ast.children[0].children[0].static).toBe(true) // first
+    expect(ast.children[1].children[0].static).toBe(false) // second
+  })
+
+  it('class binding', () => {
+    const ast = parse('<p :class="class1">hello world</p>', baseOptions)
+    optimize(ast, baseOptions)
+    expect(ast.static).toBe(false)
+    expect(ast.children[0].static).toBe(true)
+  })
+
+  it('style binding', () => {
+    const ast = parse('<p :style="error">{{msg}}</p>', baseOptions)
+    optimize(ast, baseOptions)
+    expect(ast.static).toBe(false)
+    expect(ast.children[0].static).toBe(false)
+  })
+
+  it('key', () => {
+    const ast = parse('<p key="foo">hello world</p>', baseOptions)
+    optimize(ast, baseOptions)
+    expect(ast.static).toBe(false)
+    expect(ast.children[0].static).toBe(true)
+  })
+
+  it('ref', () => {
+    const ast = parse('<p ref="foo">hello world</p>', baseOptions)
+    optimize(ast, baseOptions)
+    expect(ast.static).toBe(false)
+    expect(ast.children[0].static).toBe(true)
+  })
+
+  it('transition', () => {
+    const ast = parse('<p v-if="show" transition="expand">hello world</p>', baseOptions)
+    optimize(ast, baseOptions)
+    expect(ast.static).toBe(false)
+    expect(ast.children[0].static).toBe(true)
+  })
+
+  it('v-bind directive', () => {
+    const ast = parse('<input type="text" name="field1" :value="msg">', baseOptions)
+    optimize(ast, baseOptions)
+    expect(ast.static).toBe(false)
+  })
+
+  it('v-on directive', () => {
+    const ast = parse('<input type="text" name="field1" :value="msg" @input="onInput">', baseOptions)
+    optimize(ast, baseOptions)
+    expect(ast.static).toBe(false)
+  })
+
+  it('custom directive', () => {
+    const ast = parse('<form><input type="text" name="field1" :value="msg" v-validate:field1="required"></form>', baseOptions)
+    optimize(ast, baseOptions)
+    expect(ast.static).toBe(false)
+    expect(ast.children[0].static).toBe(false)
+  })
+
+  it('not root ast', () => {
+    const ast = null
+    optimize(ast, baseOptions)
+    expect(ast).toBe(null)
+  })
+
+  it('not specified isReservedTag option', () => {
+    const ast = parse('<h1 id="section1">hello world</h1>', baseOptions)
+    optimize(ast, {})
+    expect(ast.static).toBe(false)
+  })
+
+  it('mark static trees inside v-for', () => {
+    const ast = parse(`<div><div v-for="i in 10"><p><span>hi</span></p></div></div>`, baseOptions)
+    optimize(ast, baseOptions)
+    expect(ast.children[0].children[0].staticRoot).toBe(true)
+    expect(ast.children[0].children[0].staticInFor).toBe(true)
+  })
+
+  it('mark static trees inside v-for with nested v-else and v-once', () => {
+    const ast = parse(`
+      <div v-if="1"></div>
+      <div v-else-if="2">
+        <div v-for="i in 10" :key="i">
+          <div v-if="1">{{ i }}</div>
+          <div v-else-if="2" v-once>{{ i }}</div>
+          <div v-else v-once>{{ i }}</div>
+        </div>
+      </div>
+      <div v-else>
+        <div v-for="i in 10" :key="i">
+          <div v-if="1">{{ i }}</div>
+          <div v-else v-once>{{ i }}</div>
+        </div>
+      </div>
+      `, baseOptions)
+    optimize(ast, baseOptions)
+    expect(ast.ifConditions[1].block.children[0].children[0].ifConditions[1].block.staticRoot).toBe(false)
+    expect(ast.ifConditions[1].block.children[0].children[0].ifConditions[1].block.staticInFor).toBe(true)
+
+    expect(ast.ifConditions[1].block.children[0].children[0].ifConditions[2].block.staticRoot).toBe(false)
+    expect(ast.ifConditions[1].block.children[0].children[0].ifConditions[2].block.staticInFor).toBe(true)
+
+    expect(ast.ifConditions[2].block.children[0].children[0].ifConditions[1].block.staticRoot).toBe(false)
+    expect(ast.ifConditions[2].block.children[0].children[0].ifConditions[1].block.staticInFor).toBe(true)
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/modules/compiler/parser.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/modules/compiler/parser.spec.js
new file mode 100644 (file)
index 0000000..750e371
--- /dev/null
@@ -0,0 +1,720 @@
+import { parse } from 'compiler/parser/index'
+import { extend } from 'shared/util'
+import { baseOptions } from 'web/compiler/options'
+import { isIE, isEdge } from 'core/util/env'
+
+describe('parser', () => {
+  it('simple element', () => {
+    const ast = parse('<h1>hello world</h1>', baseOptions)
+    expect(ast.tag).toBe('h1')
+    expect(ast.plain).toBe(true)
+    expect(ast.children[0].text).toBe('hello world')
+  })
+
+  it('interpolation in element', () => {
+    const ast = parse('<h1>{{msg}}</h1>', baseOptions)
+    expect(ast.tag).toBe('h1')
+    expect(ast.plain).toBe(true)
+    expect(ast.children[0].expression).toBe('_s(msg)')
+  })
+
+  it('child elements', () => {
+    const ast = parse('<ul><li>hello world</li></ul>', baseOptions)
+    expect(ast.tag).toBe('ul')
+    expect(ast.plain).toBe(true)
+    expect(ast.children[0].tag).toBe('li')
+    expect(ast.children[0].plain).toBe(true)
+    expect(ast.children[0].children[0].text).toBe('hello world')
+    expect(ast.children[0].parent).toBe(ast)
+  })
+
+  it('unary element', () => {
+    const ast = parse('<hr>', baseOptions)
+    expect(ast.tag).toBe('hr')
+    expect(ast.plain).toBe(true)
+    expect(ast.children.length).toBe(0)
+  })
+
+  it('svg element', () => {
+    const ast = parse('<svg><text>hello world</text></svg>', baseOptions)
+    expect(ast.tag).toBe('svg')
+    expect(ast.ns).toBe('svg')
+    expect(ast.plain).toBe(true)
+    expect(ast.children[0].tag).toBe('text')
+    expect(ast.children[0].children[0].text).toBe('hello world')
+    expect(ast.children[0].parent).toBe(ast)
+  })
+
+  it('camelCase element', () => {
+    const ast = parse('<MyComponent><p>hello world</p></MyComponent>', baseOptions)
+    expect(ast.tag).toBe('MyComponent')
+    expect(ast.plain).toBe(true)
+    expect(ast.children[0].tag).toBe('p')
+    expect(ast.children[0].plain).toBe(true)
+    expect(ast.children[0].children[0].text).toBe('hello world')
+    expect(ast.children[0].parent).toBe(ast)
+  })
+
+  it('forbidden element', () => {
+    // style
+    const styleAst = parse('<style>error { color: red; }</style>', baseOptions)
+    expect(styleAst.tag).toBe('style')
+    expect(styleAst.plain).toBe(true)
+    expect(styleAst.forbidden).toBe(true)
+    expect(styleAst.children[0].text).toBe('error { color: red; }')
+    expect('Templates should only be responsible for mapping the state').toHaveBeenWarned()
+    // script
+    const scriptAst = parse('<script type="text/javascript">alert("hello world!")</script>', baseOptions)
+    expect(scriptAst.tag).toBe('script')
+    expect(scriptAst.plain).toBe(false)
+    expect(scriptAst.forbidden).toBe(true)
+    expect(scriptAst.children[0].text).toBe('alert("hello world!")')
+    expect('Templates should only be responsible for mapping the state').toHaveBeenWarned()
+  })
+
+  it('not contain root element', () => {
+    parse('hello world', baseOptions)
+    expect('Component template requires a root element, rather than just text').toHaveBeenWarned()
+  })
+
+  it('warn text before root element', () => {
+    parse('before root {{ interpolation }}<div></div>', baseOptions)
+    expect('text "before root {{ interpolation }}" outside root element will be ignored.').toHaveBeenWarned()
+  })
+
+  it('warn text after root element', () => {
+    parse('<div></div>after root {{ interpolation }}', baseOptions)
+    expect('text "after root {{ interpolation }}" outside root element will be ignored.').toHaveBeenWarned()
+  })
+
+  it('warn multiple root elements', () => {
+    parse('<div></div><div></div>', baseOptions)
+    expect('Component template should contain exactly one root element').toHaveBeenWarned()
+  })
+
+  it('remove duplicate whitespace text nodes caused by comments', () => {
+    const ast = parse(`<div><a></a> <!----> <a></a></div>`, baseOptions)
+    expect(ast.children.length).toBe(3)
+    expect(ast.children[0].tag).toBe('a')
+    expect(ast.children[1].text).toBe(' ')
+    expect(ast.children[2].tag).toBe('a')
+  })
+
+  it('remove text nodes between v-if conditions', () => {
+    const ast = parse(`<div><div v-if="1"></div> <div v-else-if="2"></div> <div v-else></div> <span></span></div>`, baseOptions)
+    expect(ast.children.length).toBe(3)
+    expect(ast.children[0].tag).toBe('div')
+    expect(ast.children[0].ifConditions.length).toBe(3)
+    expect(ast.children[1].text).toBe(' ') // text
+    expect(ast.children[2].tag).toBe('span')
+  })
+
+  it('warn non whitespace text between v-if conditions', () => {
+    parse(`<div><div v-if="1"></div> foo <div v-else></div></div>`, baseOptions)
+    expect(`text "foo" between v-if and v-else(-if) will be ignored`).toHaveBeenWarned()
+  })
+
+  it('not warn 2 root elements with v-if and v-else', () => {
+    parse('<div v-if="1"></div><div v-else></div>', baseOptions)
+    expect('Component template should contain exactly one root element')
+      .not.toHaveBeenWarned()
+  })
+
+  it('not warn 3 root elements with v-if, v-else-if and v-else', () => {
+    parse('<div v-if="1"></div><div v-else-if="2"></div><div v-else></div>', baseOptions)
+    expect('Component template should contain exactly one root element')
+      .not.toHaveBeenWarned()
+  })
+
+  it('not warn 2 root elements with v-if and v-else on separate lines', () => {
+    parse(`
+      <div v-if="1"></div>
+      <div v-else></div>
+    `, baseOptions)
+    expect('Component template should contain exactly one root element')
+      .not.toHaveBeenWarned()
+  })
+
+  it('not warn 3 or more root elements with v-if, v-else-if and v-else on separate lines', () => {
+    parse(`
+      <div v-if="1"></div>
+      <div v-else-if="2"></div>
+      <div v-else></div>
+    `, baseOptions)
+    expect('Component template should contain exactly one root element')
+      .not.toHaveBeenWarned()
+
+    parse(`
+      <div v-if="1"></div>
+      <div v-else-if="2"></div>
+      <div v-else-if="3"></div>
+      <div v-else-if="4"></div>
+      <div v-else></div>
+    `, baseOptions)
+    expect('Component template should contain exactly one root element')
+      .not.toHaveBeenWarned()
+  })
+
+  it('generate correct ast for 2 root elements with v-if and v-else on separate lines', () => {
+    const ast = parse(`
+      <div v-if="1"></div>
+      <p v-else></p>
+    `, baseOptions)
+    expect(ast.tag).toBe('div')
+    expect(ast.ifConditions[1].block.tag).toBe('p')
+  })
+
+  it('generate correct ast for 3 or more root elements with v-if and v-else on separate lines', () => {
+    const ast = parse(`
+      <div v-if="1"></div>
+      <span v-else-if="2"></span>
+      <p v-else></p>
+    `, baseOptions)
+    expect(ast.tag).toBe('div')
+    expect(ast.ifConditions[0].block.tag).toBe('div')
+    expect(ast.ifConditions[1].block.tag).toBe('span')
+    expect(ast.ifConditions[2].block.tag).toBe('p')
+
+    const astMore = parse(`
+      <div v-if="1"></div>
+      <span v-else-if="2"></span>
+      <div v-else-if="3"></div>
+      <span v-else-if="4"></span>
+      <p v-else></p>
+    `, baseOptions)
+    expect(astMore.tag).toBe('div')
+    expect(astMore.ifConditions[0].block.tag).toBe('div')
+    expect(astMore.ifConditions[1].block.tag).toBe('span')
+    expect(astMore.ifConditions[2].block.tag).toBe('div')
+    expect(astMore.ifConditions[3].block.tag).toBe('span')
+    expect(astMore.ifConditions[4].block.tag).toBe('p')
+  })
+
+  it('warn 2 root elements with v-if', () => {
+    parse('<div v-if="1"></div><div v-if="2"></div>', baseOptions)
+    expect('Component template should contain exactly one root element').toHaveBeenWarned()
+  })
+
+  it('warn 3 root elements with v-if and v-else on first 2', () => {
+    parse('<div v-if="1"></div><div v-else></div><div></div>', baseOptions)
+    expect('Component template should contain exactly one root element').toHaveBeenWarned()
+  })
+
+  it('warn 3 root elements with v-if and v-else-if on first 2', () => {
+    parse('<div v-if="1"></div><div v-else-if></div><div></div>', baseOptions)
+    expect('Component template should contain exactly one root element').toHaveBeenWarned()
+  })
+
+  it('warn 4 root elements with v-if, v-else-if and v-else on first 2', () => {
+    parse('<div v-if="1"></div><div v-else-if></div><div v-else></div><div></div>', baseOptions)
+    expect('Component template should contain exactly one root element').toHaveBeenWarned()
+  })
+
+  it('warn 2 root elements with v-if and v-else with v-for on 2nd', () => {
+    parse('<div v-if="1"></div><div v-else v-for="i in [1]"></div>', baseOptions)
+    expect('Cannot use v-for on stateful component root element because it renders multiple elements')
+      .toHaveBeenWarned()
+  })
+
+  it('warn 2 root elements with v-if and v-else-if with v-for on 2nd', () => {
+    parse('<div v-if="1"></div><div v-else-if="2" v-for="i in [1]"></div>', baseOptions)
+    expect('Cannot use v-for on stateful component root element because it renders multiple elements')
+      .toHaveBeenWarned()
+  })
+
+  it('warn <template> as root element', () => {
+    parse('<template></template>', baseOptions)
+    expect('Cannot use <template> as component root element').toHaveBeenWarned()
+  })
+
+  it('warn <slot> as root element', () => {
+    parse('<slot></slot>', baseOptions)
+    expect('Cannot use <slot> as component root element').toHaveBeenWarned()
+  })
+
+  it('warn v-for on root element', () => {
+    parse('<div v-for="item in items"></div>', baseOptions)
+    expect('Cannot use v-for on stateful component root element').toHaveBeenWarned()
+  })
+
+  it('warn <template> key', () => {
+    parse('<div><template v-for="i in 10" :key="i"></template></div>', baseOptions)
+    expect('<template> cannot be keyed').toHaveBeenWarned()
+  })
+
+  it('v-pre directive', () => {
+    const ast = parse('<div v-pre id="message1"><p>{{msg}}</p></div>', baseOptions)
+    expect(ast.pre).toBe(true)
+    expect(ast.attrs[0].name).toBe('id')
+    expect(ast.attrs[0].value).toBe('"message1"')
+    expect(ast.children[0].children[0].text).toBe('{{msg}}')
+  })
+
+  it('v-for directive basic syntax', () => {
+    const ast = parse('<ul><li v-for="item in items"></li></ul>', baseOptions)
+    const liAst = ast.children[0]
+    expect(liAst.for).toBe('items')
+    expect(liAst.alias).toBe('item')
+  })
+
+  it('v-for directive iteration syntax', () => {
+    const ast = parse('<ul><li v-for="(item, index) in items"></li></ul>', baseOptions)
+    const liAst = ast.children[0]
+    expect(liAst.for).toBe('items')
+    expect(liAst.alias).toBe('item')
+    expect(liAst.iterator1).toBe('index')
+    expect(liAst.iterator2).toBeUndefined()
+  })
+
+  it('v-for directive iteration syntax (multiple)', () => {
+    const ast = parse('<ul><li v-for="(item, key, index) in items"></li></ul>', baseOptions)
+    const liAst = ast.children[0]
+    expect(liAst.for).toBe('items')
+    expect(liAst.alias).toBe('item')
+    expect(liAst.iterator1).toBe('key')
+    expect(liAst.iterator2).toBe('index')
+  })
+
+  it('v-for directive key', () => {
+    const ast = parse('<ul><li v-for="item in items" :key="item.uid"></li></ul>', baseOptions)
+    const liAst = ast.children[0]
+    expect(liAst.for).toBe('items')
+    expect(liAst.alias).toBe('item')
+    expect(liAst.key).toBe('item.uid')
+  })
+
+  it('v-for directive destructuring', () => {
+    let ast = parse('<ul><li v-for="{ foo } in items"></li></ul>', baseOptions)
+    let liAst = ast.children[0]
+    expect(liAst.for).toBe('items')
+    expect(liAst.alias).toBe('{ foo }')
+
+    // with paren
+    ast = parse('<ul><li v-for="({ foo }) in items"></li></ul>', baseOptions)
+    liAst = ast.children[0]
+    expect(liAst.for).toBe('items')
+    expect(liAst.alias).toBe('{ foo }')
+
+    // multi-var destructuring
+    ast = parse('<ul><li v-for="{ foo, bar, baz } in items"></li></ul>', baseOptions)
+    liAst = ast.children[0]
+    expect(liAst.for).toBe('items')
+    expect(liAst.alias).toBe('{ foo, bar, baz }')
+
+    // multi-var destructuring with paren
+    ast = parse('<ul><li v-for="({ foo, bar, baz }) in items"></li></ul>', baseOptions)
+    liAst = ast.children[0]
+    expect(liAst.for).toBe('items')
+    expect(liAst.alias).toBe('{ foo, bar, baz }')
+
+    // with index
+    ast = parse('<ul><li v-for="({ foo }, i) in items"></li></ul>', baseOptions)
+    liAst = ast.children[0]
+    expect(liAst.for).toBe('items')
+    expect(liAst.alias).toBe('{ foo }')
+    expect(liAst.iterator1).toBe('i')
+
+    // with key + index
+    ast = parse('<ul><li v-for="({ foo }, i, j) in items"></li></ul>', baseOptions)
+    liAst = ast.children[0]
+    expect(liAst.for).toBe('items')
+    expect(liAst.alias).toBe('{ foo }')
+    expect(liAst.iterator1).toBe('i')
+    expect(liAst.iterator2).toBe('j')
+
+    // multi-var destructuring with index
+    ast = parse('<ul><li v-for="({ foo, bar, baz }, i) in items"></li></ul>', baseOptions)
+    liAst = ast.children[0]
+    expect(liAst.for).toBe('items')
+    expect(liAst.alias).toBe('{ foo, bar, baz }')
+    expect(liAst.iterator1).toBe('i')
+
+    // array
+    ast = parse('<ul><li v-for="[ foo ] in items"></li></ul>', baseOptions)
+    liAst = ast.children[0]
+    expect(liAst.for).toBe('items')
+    expect(liAst.alias).toBe('[ foo ]')
+
+    // multi-array
+    ast = parse('<ul><li v-for="[ foo, bar, baz ] in items"></li></ul>', baseOptions)
+    liAst = ast.children[0]
+    expect(liAst.for).toBe('items')
+    expect(liAst.alias).toBe('[ foo, bar, baz ]')
+
+    // array with paren
+    ast = parse('<ul><li v-for="([ foo ]) in items"></li></ul>', baseOptions)
+    liAst = ast.children[0]
+    expect(liAst.for).toBe('items')
+    expect(liAst.alias).toBe('[ foo ]')
+
+    // multi-array with paren
+    ast = parse('<ul><li v-for="([ foo, bar, baz ]) in items"></li></ul>', baseOptions)
+    liAst = ast.children[0]
+    expect(liAst.for).toBe('items')
+    expect(liAst.alias).toBe('[ foo, bar, baz ]')
+
+    // array with index
+    ast = parse('<ul><li v-for="([ foo ], i) in items"></li></ul>', baseOptions)
+    liAst = ast.children[0]
+    expect(liAst.for).toBe('items')
+    expect(liAst.alias).toBe('[ foo ]')
+    expect(liAst.iterator1).toBe('i')
+
+    // array with key + index
+    ast = parse('<ul><li v-for="([ foo ], i, j) in items"></li></ul>', baseOptions)
+    liAst = ast.children[0]
+    expect(liAst.for).toBe('items')
+    expect(liAst.alias).toBe('[ foo ]')
+    expect(liAst.iterator1).toBe('i')
+    expect(liAst.iterator2).toBe('j')
+
+    // multi-array with paren
+    ast = parse('<ul><li v-for="([ foo, bar, baz ]) in items"></li></ul>', baseOptions)
+    liAst = ast.children[0]
+    expect(liAst.for).toBe('items')
+    expect(liAst.alias).toBe('[ foo, bar, baz ]')
+
+    // multi-array with index
+    ast = parse('<ul><li v-for="([ foo, bar, baz ], i) in items"></li></ul>', baseOptions)
+    liAst = ast.children[0]
+    expect(liAst.for).toBe('items')
+    expect(liAst.alias).toBe('[ foo, bar, baz ]')
+    expect(liAst.iterator1).toBe('i')
+
+    // nested
+    ast = parse('<ul><li v-for="({ foo, bar: { baz }, qux: [ n ] }, i, j) in items"></li></ul>', baseOptions)
+    liAst = ast.children[0]
+    expect(liAst.for).toBe('items')
+    expect(liAst.alias).toBe('{ foo, bar: { baz }, qux: [ n ] }')
+    expect(liAst.iterator1).toBe('i')
+    expect(liAst.iterator2).toBe('j')
+
+    // array nested
+    ast = parse('<ul><li v-for="([ foo, { bar }, baz ], i, j) in items"></li></ul>', baseOptions)
+    liAst = ast.children[0]
+    expect(liAst.for).toBe('items')
+    expect(liAst.alias).toBe('[ foo, { bar }, baz ]')
+    expect(liAst.iterator1).toBe('i')
+    expect(liAst.iterator2).toBe('j')
+  })
+
+  it('v-for directive invalid syntax', () => {
+    parse('<ul><li v-for="item into items"></li></ul>', baseOptions)
+    expect('Invalid v-for expression').toHaveBeenWarned()
+  })
+
+  it('v-if directive syntax', () => {
+    const ast = parse('<p v-if="show">hello world</p>', baseOptions)
+    expect(ast.if).toBe('show')
+    expect(ast.ifConditions[0].exp).toBe('show')
+  })
+
+  it('v-else-if directive syntax', () => {
+    const ast = parse('<div><p v-if="show">hello</p><span v-else-if="2">elseif</span><p v-else>world</p></div>', baseOptions)
+    const ifAst = ast.children[0]
+    const conditionsAst = ifAst.ifConditions
+    expect(conditionsAst.length).toBe(3)
+    expect(conditionsAst[1].block.children[0].text).toBe('elseif')
+    expect(conditionsAst[1].block.parent).toBe(ast)
+    expect(conditionsAst[2].block.children[0].text).toBe('world')
+    expect(conditionsAst[2].block.parent).toBe(ast)
+  })
+
+  it('v-else directive syntax', () => {
+    const ast = parse('<div><p v-if="show">hello</p><p v-else>world</p></div>', baseOptions)
+    const ifAst = ast.children[0]
+    const conditionsAst = ifAst.ifConditions
+    expect(conditionsAst.length).toBe(2)
+    expect(conditionsAst[1].block.children[0].text).toBe('world')
+    expect(conditionsAst[1].block.parent).toBe(ast)
+  })
+
+  it('v-else-if directive invalid syntax', () => {
+    parse('<div><p v-else-if="1">world</p></div>', baseOptions)
+    expect('v-else-if="1" used on element').toHaveBeenWarned()
+  })
+
+  it('v-else directive invalid syntax', () => {
+    parse('<div><p v-else>world</p></div>', baseOptions)
+    expect('v-else used on element').toHaveBeenWarned()
+  })
+
+  it('v-once directive syntax', () => {
+    const ast = parse('<p v-once>world</p>', baseOptions)
+    expect(ast.once).toBe(true)
+  })
+
+  it('slot tag single syntax', () => {
+    const ast = parse('<div><slot></slot></div>', baseOptions)
+    expect(ast.children[0].tag).toBe('slot')
+    expect(ast.children[0].slotName).toBeUndefined()
+  })
+
+  it('slot tag named syntax', () => {
+    const ast = parse('<div><slot name="one">hello world</slot></div>', baseOptions)
+    expect(ast.children[0].tag).toBe('slot')
+    expect(ast.children[0].slotName).toBe('"one"')
+  })
+
+  it('slot target', () => {
+    const ast = parse('<p slot="one">hello world</p>', baseOptions)
+    expect(ast.slotTarget).toBe('"one"')
+  })
+
+  it('component properties', () => {
+    const ast = parse('<my-component :msg="hello"></my-component>', baseOptions)
+    expect(ast.attrs[0].name).toBe('msg')
+    expect(ast.attrs[0].value).toBe('hello')
+  })
+
+  it('component "is" attribute', () => {
+    const ast = parse('<my-component is="component1"></my-component>', baseOptions)
+    expect(ast.component).toBe('"component1"')
+  })
+
+  it('component "inline-template" attribute', () => {
+    const ast = parse('<my-component inline-template>hello world</my-component>', baseOptions)
+    expect(ast.inlineTemplate).toBe(true)
+  })
+
+  it('class binding', () => {
+    // static
+    const ast1 = parse('<p class="class1">hello world</p>', baseOptions)
+    expect(ast1.staticClass).toBe('"class1"')
+    // dynamic
+    const ast2 = parse('<p :class="class1">hello world</p>', baseOptions)
+    expect(ast2.classBinding).toBe('class1')
+    // interpolation warning
+    parse('<p class="{{error}}">hello world</p>', baseOptions)
+    expect('Interpolation inside attributes has been removed').toHaveBeenWarned()
+  })
+
+  it('style binding', () => {
+    const ast = parse('<p :style="error">hello world</p>', baseOptions)
+    expect(ast.styleBinding).toBe('error')
+  })
+
+  it('attribute with v-bind', () => {
+    const ast = parse('<input type="text" name="field1" :value="msg">', baseOptions)
+    expect(ast.attrsList[0].name).toBe('type')
+    expect(ast.attrsList[0].value).toBe('text')
+    expect(ast.attrsList[1].name).toBe('name')
+    expect(ast.attrsList[1].value).toBe('field1')
+    expect(ast.attrsMap['type']).toBe('text')
+    expect(ast.attrsMap['name']).toBe('field1')
+    expect(ast.attrs[0].name).toBe('type')
+    expect(ast.attrs[0].value).toBe('"text"')
+    expect(ast.attrs[1].name).toBe('name')
+    expect(ast.attrs[1].value).toBe('"field1"')
+    expect(ast.props[0].name).toBe('value')
+    expect(ast.props[0].value).toBe('msg')
+  })
+
+  // #6887
+  it('special case static attribute that must be props', () => {
+    const ast = parse('<video muted></video>', baseOptions)
+    expect(ast.attrs[0].name).toBe('muted')
+    expect(ast.attrs[0].value).toBe('""')
+    expect(ast.props[0].name).toBe('muted')
+    expect(ast.props[0].value).toBe('true')
+  })
+
+  it('attribute with v-on', () => {
+    const ast = parse('<input type="text" name="field1" :value="msg" @input="onInput">', baseOptions)
+    expect(ast.events.input.value).toBe('onInput')
+  })
+
+  it('attribute with directive', () => {
+    const ast = parse('<input type="text" name="field1" :value="msg" v-validate:field1="required">', baseOptions)
+    expect(ast.directives[0].name).toBe('validate')
+    expect(ast.directives[0].value).toBe('required')
+    expect(ast.directives[0].arg).toBe('field1')
+  })
+
+  it('attribute with modifiered directive', () => {
+    const ast = parse('<input type="text" name="field1" :value="msg" v-validate.on.off>', baseOptions)
+    expect(ast.directives[0].modifiers.on).toBe(true)
+    expect(ast.directives[0].modifiers.off).toBe(true)
+  })
+
+  it('literal attribute', () => {
+    // basic
+    const ast1 = parse('<input type="text" name="field1" value="hello world">', baseOptions)
+    expect(ast1.attrsList[0].name).toBe('type')
+    expect(ast1.attrsList[0].value).toBe('text')
+    expect(ast1.attrsList[1].name).toBe('name')
+    expect(ast1.attrsList[1].value).toBe('field1')
+    expect(ast1.attrsList[2].name).toBe('value')
+    expect(ast1.attrsList[2].value).toBe('hello world')
+    expect(ast1.attrsMap['type']).toBe('text')
+    expect(ast1.attrsMap['name']).toBe('field1')
+    expect(ast1.attrsMap['value']).toBe('hello world')
+    expect(ast1.attrs[0].name).toBe('type')
+    expect(ast1.attrs[0].value).toBe('"text"')
+    expect(ast1.attrs[1].name).toBe('name')
+    expect(ast1.attrs[1].value).toBe('"field1"')
+    expect(ast1.attrs[2].name).toBe('value')
+    expect(ast1.attrs[2].value).toBe('"hello world"')
+    // interpolation warning
+    parse('<input type="text" name="field1" value="{{msg}}">', baseOptions)
+    expect('Interpolation inside attributes has been removed').toHaveBeenWarned()
+  })
+
+  if (!isIE && !isEdge) {
+    it('duplicate attribute', () => {
+      parse('<p class="class1" class="class1">hello world</p>', baseOptions)
+      expect('duplicate attribute').toHaveBeenWarned()
+    })
+  }
+
+  it('custom delimiter', () => {
+    const ast = parse('<p>{msg}</p>', extend({ delimiters: ['{', '}'] }, baseOptions))
+    expect(ast.children[0].expression).toBe('_s(msg)')
+  })
+
+  it('not specified getTagNamespace option', () => {
+    const options = extend({}, baseOptions)
+    delete options.getTagNamespace
+    const ast = parse('<svg><text>hello world</text></svg>', options)
+    expect(ast.tag).toBe('svg')
+    expect(ast.ns).toBeUndefined()
+  })
+
+  it('not specified mustUseProp', () => {
+    const options = extend({}, baseOptions)
+    delete options.mustUseProp
+    const ast = parse('<input type="text" name="field1" :value="msg">', options)
+    expect(ast.props).toBeUndefined()
+  })
+
+  it('use prop when prop modifier was explicitly declared', () => {
+    const ast = parse('<component is="textarea" :value.prop="val" />', baseOptions)
+    expect(ast.attrs).toBeUndefined()
+    expect(ast.props.length).toBe(1)
+    expect(ast.props[0].name).toBe('value')
+    expect(ast.props[0].value).toBe('val')
+  })
+
+  it('pre/post transforms', () => {
+    const options = extend({}, baseOptions)
+    const spy1 = jasmine.createSpy('preTransform')
+    const spy2 = jasmine.createSpy('postTransform')
+    options.modules = options.modules.concat([{
+      preTransformNode (el) {
+        spy1(el.tag)
+      },
+      postTransformNode (el) {
+        expect(el.attrs.length).toBe(1)
+        spy2(el.tag)
+      }
+    }])
+    parse('<img v-pre src="hi">', options)
+    expect(spy1).toHaveBeenCalledWith('img')
+    expect(spy2).toHaveBeenCalledWith('img')
+  })
+
+  it('preserve whitespace in <pre> tag', function () {
+    const options = extend({}, baseOptions)
+    const ast = parse('<pre><code>  \n<span>hi</span>\n  </code><span> </span></pre>', options)
+    const code = ast.children[0]
+    expect(code.children[0].type).toBe(3)
+    expect(code.children[0].text).toBe('  \n')
+    expect(code.children[2].type).toBe(3)
+    expect(code.children[2].text).toBe('\n  ')
+
+    const span = ast.children[1]
+    expect(span.children[0].type).toBe(3)
+    expect(span.children[0].text).toBe(' ')
+  })
+
+  // #5992
+  it('ignore the first newline in <pre> tag', function () {
+    const options = extend({}, baseOptions)
+    const ast = parse('<div><pre>\nabc</pre>\ndef<pre>\n\nabc</pre></div>', options)
+    const pre = ast.children[0]
+    expect(pre.children[0].type).toBe(3)
+    expect(pre.children[0].text).toBe('abc')
+    const text = ast.children[1]
+    expect(text.type).toBe(3)
+    expect(text.text).toBe('\ndef')
+    const pre2 = ast.children[2]
+    expect(pre2.children[0].type).toBe(3)
+    expect(pre2.children[0].text).toBe('\nabc')
+  })
+
+  it('forgivingly handle < in plain text', () => {
+    const options = extend({}, baseOptions)
+    const ast = parse('<p>1 < 2 < 3</p>', options)
+    expect(ast.tag).toBe('p')
+    expect(ast.children.length).toBe(1)
+    expect(ast.children[0].type).toBe(3)
+    expect(ast.children[0].text).toBe('1 < 2 < 3')
+  })
+
+  it('IE conditional comments', () => {
+    const options = extend({}, baseOptions)
+    const ast = parse(`
+      <div>
+        <!--[if lte IE 8]>
+          <p>Test 1</p>
+        <![endif]-->
+      </div>
+    `, options)
+    expect(ast.tag).toBe('div')
+    expect(ast.children.length).toBe(0)
+  })
+
+  it('parse content in textarea as text', () => {
+    const options = extend({}, baseOptions)
+
+    const whitespace = parse(`
+      <textarea>
+        <p>Test 1</p>
+        test2
+      </textarea>
+    `, options)
+    expect(whitespace.tag).toBe('textarea')
+    expect(whitespace.children.length).toBe(1)
+    expect(whitespace.children[0].type).toBe(3)
+    // textarea is whitespace sensitive
+    expect(whitespace.children[0].text).toBe(`        <p>Test 1</p>
+        test2
+      `)
+
+    const comment = parse('<textarea><!--comment--></textarea>', options)
+    expect(comment.tag).toBe('textarea')
+    expect(comment.children.length).toBe(1)
+    expect(comment.children[0].type).toBe(3)
+    expect(comment.children[0].text).toBe('<!--comment-->')
+  })
+
+  // #5526
+  it('should not decode text in script tags', () => {
+    const options = extend({}, baseOptions)
+    const ast = parse(`<script type="x/template">&gt;<foo>&lt;</script>`, options)
+    expect(ast.children[0].text).toBe(`&gt;<foo>&lt;`)
+  })
+
+  it('should ignore comments', () => {
+    const options = extend({}, baseOptions)
+    const ast = parse(`<div>123<!--comment here--></div>`, options)
+    expect(ast.tag).toBe('div')
+    expect(ast.children.length).toBe(1)
+    expect(ast.children[0].type).toBe(3)
+    expect(ast.children[0].text).toBe('123')
+  })
+
+  it('should kept comments', () => {
+    const options = extend({
+      comments: true
+    }, baseOptions)
+    const ast = parse(`<div>123<!--comment here--></div>`, options)
+    expect(ast.tag).toBe('div')
+    expect(ast.children.length).toBe(2)
+    expect(ast.children[0].type).toBe(3)
+    expect(ast.children[0].text).toBe('123')
+    expect(ast.children[1].type).toBe(3) // parse comment with ASTText
+    expect(ast.children[1].isComment).toBe(true) // parse comment with ASTText
+    expect(ast.children[1].text).toBe('comment here')
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/modules/observer/dep.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/modules/observer/dep.spec.js
new file mode 100644 (file)
index 0000000..02809f8
--- /dev/null
@@ -0,0 +1,63 @@
+import Dep from 'core/observer/dep'
+
+describe('Dep', () => {
+  let dep
+
+  beforeEach(() => {
+    dep = new Dep()
+  })
+
+  describe('instance', () => {
+    it('should be created with correct properties', () => {
+      expect(dep.subs.length).toBe(0)
+      expect(new Dep().id).toBe(dep.id + 1)
+    })
+  })
+
+  describe('addSub()', () => {
+    it('should add sub', () => {
+      dep.addSub(null)
+      expect(dep.subs.length).toBe(1)
+      expect(dep.subs[0]).toBe(null)
+    })
+  })
+
+  describe('removeSub()', () => {
+    it('should remove sub', () => {
+      dep.subs.push(null)
+      dep.removeSub(null)
+      expect(dep.subs.length).toBe(0)
+    })
+  })
+
+  describe('depend()', () => {
+    let _target
+
+    beforeAll(() => {
+      _target = Dep.target
+    })
+
+    afterAll(() => {
+      Dep.target = _target
+    })
+
+    it('should do nothing if no target', () => {
+      Dep.target = null
+      dep.depend()
+    })
+
+    it('should add itself to target', () => {
+      Dep.target = jasmine.createSpyObj('TARGET', ['addDep'])
+      dep.depend()
+      expect(Dep.target.addDep).toHaveBeenCalledWith(dep)
+    })
+  })
+
+  describe('notify()', () => {
+    it('should notify subs', () => {
+      dep.subs.push(jasmine.createSpyObj('SUB', ['update']))
+      dep.notify()
+      expect(dep.subs[0].update).toHaveBeenCalled()
+    })
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/modules/observer/observer.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/modules/observer/observer.spec.js
new file mode 100644 (file)
index 0000000..5f075bc
--- /dev/null
@@ -0,0 +1,384 @@
+import Vue from 'vue'
+import {
+  Observer,
+  observe,
+  set as setProp,
+  del as delProp
+} from 'core/observer/index'
+import Dep from 'core/observer/dep'
+import { hasOwn } from 'core/util/index'
+
+describe('Observer', () => {
+  it('create on non-observables', () => {
+    // skip primitive value
+    const ob1 = observe(1)
+    expect(ob1).toBeUndefined()
+    // avoid vue instance
+    const ob2 = observe(new Vue())
+    expect(ob2).toBeUndefined()
+    // avoid frozen objects
+    const ob3 = observe(Object.freeze({}))
+    expect(ob3).toBeUndefined()
+  })
+
+  it('create on object', () => {
+    // on object
+    const obj = {
+      a: {},
+      b: {}
+    }
+    const ob1 = observe(obj)
+    expect(ob1 instanceof Observer).toBe(true)
+    expect(ob1.value).toBe(obj)
+    expect(obj.__ob__).toBe(ob1)
+    // should've walked children
+    expect(obj.a.__ob__ instanceof Observer).toBe(true)
+    expect(obj.b.__ob__ instanceof Observer).toBe(true)
+    // should return existing ob on already observed objects
+    const ob2 = observe(obj)
+    expect(ob2).toBe(ob1)
+  })
+
+  it('create on null', () => {
+    // on null
+    const obj = Object.create(null)
+    obj.a = {}
+    obj.b = {}
+    const ob1 = observe(obj)
+    expect(ob1 instanceof Observer).toBe(true)
+    expect(ob1.value).toBe(obj)
+    expect(obj.__ob__).toBe(ob1)
+    // should've walked children
+    expect(obj.a.__ob__ instanceof Observer).toBe(true)
+    expect(obj.b.__ob__ instanceof Observer).toBe(true)
+    // should return existing ob on already observed objects
+    const ob2 = observe(obj)
+    expect(ob2).toBe(ob1)
+  })
+
+  it('create on already observed object', () => {
+    // on object
+    const obj = {}
+    let val = 0
+    let getCount = 0
+    Object.defineProperty(obj, 'a', {
+      configurable: true,
+      enumerable: true,
+      get () {
+        getCount++
+        return val
+      },
+      set (v) { val = v }
+    })
+
+    const ob1 = observe(obj)
+    expect(ob1 instanceof Observer).toBe(true)
+    expect(ob1.value).toBe(obj)
+    expect(obj.__ob__).toBe(ob1)
+
+    getCount = 0
+    // Each read of 'a' should result in only one get underlying get call
+    obj.a
+    expect(getCount).toBe(1)
+    obj.a
+    expect(getCount).toBe(2)
+
+    // should return existing ob on already observed objects
+    const ob2 = observe(obj)
+    expect(ob2).toBe(ob1)
+
+    // should call underlying setter
+    obj.a = 10
+    expect(val).toBe(10)
+  })
+
+  it('create on property with only getter', () => {
+    // on object
+    const obj = {}
+    Object.defineProperty(obj, 'a', {
+      configurable: true,
+      enumerable: true,
+      get () { return 123 }
+    })
+
+    const ob1 = observe(obj)
+    expect(ob1 instanceof Observer).toBe(true)
+    expect(ob1.value).toBe(obj)
+    expect(obj.__ob__).toBe(ob1)
+
+    // should be able to read
+    expect(obj.a).toBe(123)
+
+    // should return existing ob on already observed objects
+    const ob2 = observe(obj)
+    expect(ob2).toBe(ob1)
+
+    // since there is no setter, you shouldn't be able to write to it
+    // PhantomJS throws when a property with no setter is set
+    // but other real browsers don't
+    try {
+      obj.a = 101
+    } catch (e) {}
+    expect(obj.a).toBe(123)
+  })
+
+  it('create on property with only setter', () => {
+    // on object
+    const obj = {}
+    let val = 10
+    Object.defineProperty(obj, 'a', { // eslint-disable-line accessor-pairs
+      configurable: true,
+      enumerable: true,
+      set (v) { val = v }
+    })
+
+    const ob1 = observe(obj)
+    expect(ob1 instanceof Observer).toBe(true)
+    expect(ob1.value).toBe(obj)
+    expect(obj.__ob__).toBe(ob1)
+
+    // reads should return undefined
+    expect(obj.a).toBe(undefined)
+
+    // should return existing ob on already observed objects
+    const ob2 = observe(obj)
+    expect(ob2).toBe(ob1)
+
+    // writes should call the set function
+    obj.a = 100
+    expect(val).toBe(100)
+  })
+
+  it('create on property which is marked not configurable', () => {
+    // on object
+    const obj = {}
+    Object.defineProperty(obj, 'a', {
+      configurable: false,
+      enumerable: true,
+      val: 10
+    })
+
+    const ob1 = observe(obj)
+    expect(ob1 instanceof Observer).toBe(true)
+    expect(ob1.value).toBe(obj)
+    expect(obj.__ob__).toBe(ob1)
+  })
+
+  it('create on array', () => {
+    // on object
+    const arr = [{}, {}]
+    const ob1 = observe(arr)
+    expect(ob1 instanceof Observer).toBe(true)
+    expect(ob1.value).toBe(arr)
+    expect(arr.__ob__).toBe(ob1)
+    // should've walked children
+    expect(arr[0].__ob__ instanceof Observer).toBe(true)
+    expect(arr[1].__ob__ instanceof Observer).toBe(true)
+  })
+
+  it('observing object prop change', () => {
+    const obj = { a: { b: 2 }, c: NaN }
+    observe(obj)
+    // mock a watcher!
+    const watcher = {
+      deps: [],
+      addDep (dep) {
+        this.deps.push(dep)
+        dep.addSub(this)
+      },
+      update: jasmine.createSpy()
+    }
+    // collect dep
+    Dep.target = watcher
+    obj.a.b
+    Dep.target = null
+    expect(watcher.deps.length).toBe(3) // obj.a + a + a.b
+    obj.a.b = 3
+    expect(watcher.update.calls.count()).toBe(1)
+    // swap object
+    obj.a = { b: 4 }
+    expect(watcher.update.calls.count()).toBe(2)
+    watcher.deps = []
+
+    Dep.target = watcher
+    obj.a.b
+    obj.c
+    Dep.target = null
+    expect(watcher.deps.length).toBe(4)
+    // set on the swapped object
+    obj.a.b = 5
+    expect(watcher.update.calls.count()).toBe(3)
+    // should not trigger on NaN -> NaN set
+    obj.c = NaN
+    expect(watcher.update.calls.count()).toBe(3)
+  })
+
+  it('observing object prop change on defined property', () => {
+    const obj = { val: 2 }
+    Object.defineProperty(obj, 'a', {
+      configurable: true,
+      enumerable: true,
+      get () { return this.val },
+      set (v) {
+        this.val = v
+        return this.val
+      }
+    })
+
+    observe(obj)
+    // mock a watcher!
+    const watcher = {
+      deps: [],
+      addDep: function (dep) {
+        this.deps.push(dep)
+        dep.addSub(this)
+      },
+      update: jasmine.createSpy()
+    }
+    // collect dep
+    Dep.target = watcher
+    expect(obj.a).toBe(2) // Make sure 'this' is preserved
+    Dep.target = null
+    obj.a = 3
+    expect(obj.val).toBe(3) // make sure 'setter' was called
+    obj.val = 5
+    expect(obj.a).toBe(5) // make sure 'getter' was called
+  })
+
+  it('observing set/delete', () => {
+    const obj1 = { a: 1 }
+    const ob1 = observe(obj1)
+    const dep1 = ob1.dep
+    spyOn(dep1, 'notify')
+    setProp(obj1, 'b', 2)
+    expect(obj1.b).toBe(2)
+    expect(dep1.notify.calls.count()).toBe(1)
+    delProp(obj1, 'a')
+    expect(hasOwn(obj1, 'a')).toBe(false)
+    expect(dep1.notify.calls.count()).toBe(2)
+    // set existing key, should be a plain set and not
+    // trigger own ob's notify
+    setProp(obj1, 'b', 3)
+    expect(obj1.b).toBe(3)
+    expect(dep1.notify.calls.count()).toBe(2)
+    // set non-existing key
+    setProp(obj1, 'c', 1)
+    expect(obj1.c).toBe(1)
+    expect(dep1.notify.calls.count()).toBe(3)
+    // should ignore deleting non-existing key
+    delProp(obj1, 'a')
+    expect(dep1.notify.calls.count()).toBe(3)
+    // should work on non-observed objects
+    const obj2 = { a: 1 }
+    delProp(obj2, 'a')
+    expect(hasOwn(obj2, 'a')).toBe(false)
+    // should work on Object.create(null)
+    const obj3 = Object.create(null)
+    obj3.a = 1
+    const ob3 = observe(obj3)
+    const dep3 = ob3.dep
+    spyOn(dep3, 'notify')
+    setProp(obj3, 'b', 2)
+    expect(obj3.b).toBe(2)
+    expect(dep3.notify.calls.count()).toBe(1)
+    delProp(obj3, 'a')
+    expect(hasOwn(obj3, 'a')).toBe(false)
+    expect(dep3.notify.calls.count()).toBe(2)
+    // set and delete non-numeric key on array
+    const arr2 = ['a']
+    const ob2 = observe(arr2)
+    const dep2 = ob2.dep
+    spyOn(dep2, 'notify')
+    setProp(arr2, 'b', 2)
+    expect(arr2.b).toBe(2)
+    expect(dep2.notify.calls.count()).toBe(1)
+    delProp(arr2, 'b')
+    expect(hasOwn(arr2, 'b')).toBe(false)
+    expect(dep2.notify.calls.count()).toBe(2)
+  })
+
+  it('warning set/delete on a Vue instance', done => {
+    const vm = new Vue({
+      template: '<div>{{a}}</div>',
+      data: { a: 1 }
+    }).$mount()
+    expect(vm.$el.outerHTML).toBe('<div>1</div>')
+    Vue.set(vm, 'a', 2)
+    waitForUpdate(() => {
+      expect(vm.$el.outerHTML).toBe('<div>2</div>')
+      expect('Avoid adding reactive properties to a Vue instance').not.toHaveBeenWarned()
+      Vue.delete(vm, 'a')
+    }).then(() => {
+      expect('Avoid deleting properties on a Vue instance').toHaveBeenWarned()
+      expect(vm.$el.outerHTML).toBe('<div>2</div>')
+      Vue.set(vm, 'b', 123)
+      expect('Avoid adding reactive properties to a Vue instance').toHaveBeenWarned()
+    }).then(done)
+  })
+
+  it('warning set/delete on Vue instance root $data', done => {
+    const data = { a: 1 }
+    const vm = new Vue({
+      template: '<div>{{a}}</div>',
+      data
+    }).$mount()
+    expect(vm.$el.outerHTML).toBe('<div>1</div>')
+    expect(Vue.set(data, 'a', 2)).toBe(2)
+    waitForUpdate(() => {
+      expect(vm.$el.outerHTML).toBe('<div>2</div>')
+      expect('Avoid adding reactive properties to a Vue instance').not.toHaveBeenWarned()
+      Vue.delete(data, 'a')
+    }).then(() => {
+      expect('Avoid deleting properties on a Vue instance').toHaveBeenWarned()
+      expect(vm.$el.outerHTML).toBe('<div>2</div>')
+      expect(Vue.set(data, 'b', 123)).toBe(123)
+      expect('Avoid adding reactive properties to a Vue instance').toHaveBeenWarned()
+    }).then(done)
+  })
+
+  it('observing array mutation', () => {
+    const arr = []
+    const ob = observe(arr)
+    const dep = ob.dep
+    spyOn(dep, 'notify')
+    const objs = [{}, {}, {}]
+    arr.push(objs[0])
+    arr.pop()
+    arr.unshift(objs[1])
+    arr.shift()
+    arr.splice(0, 0, objs[2])
+    arr.sort()
+    arr.reverse()
+    expect(dep.notify.calls.count()).toBe(7)
+    // inserted elements should be observed
+    objs.forEach(obj => {
+      expect(obj.__ob__ instanceof Observer).toBe(true)
+    })
+  })
+
+  it('warn set/delete on non valid values', () => {
+    try {
+      setProp(null, 'foo', 1)
+    } catch (e) {}
+    expect(`Cannot set reactive property on undefined, null, or primitive value`).toHaveBeenWarned()
+
+    try {
+      delProp(null, 'foo')
+    } catch (e) {}
+    expect(`Cannot delete reactive property on undefined, null, or primitive value`).toHaveBeenWarned()
+  })
+
+  it('should lazy invoke existing getters', () => {
+    const obj = {}
+    let called = false
+    Object.defineProperty(obj, 'getterProp', {
+      enumerable: true,
+      get: () => {
+        called = true
+        return 'some value'
+      }
+    })
+    observe(obj)
+    expect(called).toBe(false)
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/modules/observer/scheduler.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/modules/observer/scheduler.spec.js
new file mode 100644 (file)
index 0000000..1443375
--- /dev/null
@@ -0,0 +1,180 @@
+import Vue from 'vue'
+import {
+  MAX_UPDATE_COUNT,
+  queueWatcher as _queueWatcher
+} from 'core/observer/scheduler'
+
+function queueWatcher (watcher) {
+  watcher.vm = {} // mock vm
+  _queueWatcher(watcher)
+}
+
+describe('Scheduler', () => {
+  let spy
+  beforeEach(() => {
+    spy = jasmine.createSpy('scheduler')
+  })
+
+  it('queueWatcher', done => {
+    queueWatcher({
+      run: spy
+    })
+    waitForUpdate(() => {
+      expect(spy.calls.count()).toBe(1)
+    }).then(done)
+  })
+
+  it('dedup', done => {
+    queueWatcher({
+      id: 1,
+      run: spy
+    })
+    queueWatcher({
+      id: 1,
+      run: spy
+    })
+    waitForUpdate(() => {
+      expect(spy.calls.count()).toBe(1)
+    }).then(done)
+  })
+
+  it('allow duplicate when flushing', done => {
+    const job = {
+      id: 1,
+      run: spy
+    }
+    queueWatcher(job)
+    queueWatcher({
+      id: 2,
+      run () { queueWatcher(job) }
+    })
+    waitForUpdate(() => {
+      expect(spy.calls.count()).toBe(2)
+    }).then(done)
+  })
+
+  it('call user watchers before component re-render', done => {
+    const calls = []
+    const vm = new Vue({
+      data: {
+        a: 1
+      },
+      template: '<div>{{ a }}</div>',
+      watch: {
+        a () { calls.push(1) }
+      },
+      beforeUpdate () {
+        calls.push(2)
+      }
+    }).$mount()
+    vm.a = 2
+    waitForUpdate(() => {
+      expect(calls).toEqual([1, 2])
+    }).then(done)
+  })
+
+  it('call user watcher triggered by component re-render immediately', done => {
+    // this happens when a component re-render updates the props of a child
+    const calls = []
+    const vm = new Vue({
+      data: {
+        a: 1
+      },
+      watch: {
+        a () {
+          calls.push(1)
+        }
+      },
+      beforeUpdate () {
+        calls.push(2)
+      },
+      template: '<div><test :a="a"></test></div>',
+      components: {
+        test: {
+          props: ['a'],
+          template: '<div>{{ a }}</div>',
+          watch: {
+            a () {
+              calls.push(3)
+            }
+          },
+          beforeUpdate () {
+            calls.push(4)
+          }
+        }
+      }
+    }).$mount()
+    vm.a = 2
+    waitForUpdate(() => {
+      expect(calls).toEqual([1, 2, 3, 4])
+    }).then(done)
+  })
+
+  it('warn against infinite update loops', function (done) {
+    let count = 0
+    const job = {
+      id: 1,
+      run () {
+        count++
+        queueWatcher(job)
+      }
+    }
+    queueWatcher(job)
+    waitForUpdate(() => {
+      expect(count).toBe(MAX_UPDATE_COUNT + 1)
+      expect('infinite update loop').toHaveBeenWarned()
+    }).then(done)
+  })
+
+  it('should call newly pushed watcher after current watcher is done', done => {
+    const callOrder = []
+    queueWatcher({
+      id: 1,
+      user: true,
+      run () {
+        callOrder.push(1)
+        queueWatcher({
+          id: 2,
+          run () {
+            callOrder.push(3)
+          }
+        })
+        callOrder.push(2)
+      }
+    })
+    waitForUpdate(() => {
+      expect(callOrder).toEqual([1, 2, 3])
+    }).then(done)
+  })
+
+  // GitHub issue #5191
+  it('emit should work when updated hook called', done => {
+    const el = document.createElement('div')
+    const vm = new Vue({
+      template: `<div><child @change="bar" :foo="foo"></child></div>`,
+      data: {
+        foo: 0
+      },
+      methods: {
+        bar: spy
+      },
+      components: {
+        child: {
+          template: `<div>{{foo}}</div>`,
+          props: ['foo'],
+          updated () {
+            this.$emit('change')
+          }
+        }
+      }
+    }).$mount(el)
+    vm.$nextTick(() => {
+      vm.foo = 1
+      vm.$nextTick(() => {
+        expect(vm.$el.innerHTML).toBe('<div>1</div>')
+        expect(spy).toHaveBeenCalled()
+        done()
+      })
+    })
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/modules/observer/watcher.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/modules/observer/watcher.spec.js
new file mode 100644 (file)
index 0000000..724a3cc
--- /dev/null
@@ -0,0 +1,181 @@
+import Vue from 'vue'
+import Watcher from 'core/observer/watcher'
+
+describe('Watcher', () => {
+  let vm, spy
+  beforeEach(() => {
+    vm = new Vue({
+      template: '<div></div>',
+      data: {
+        a: 1,
+        b: {
+          c: 2,
+          d: 4
+        },
+        c: 'c',
+        msg: 'yo'
+      }
+    }).$mount()
+    spy = jasmine.createSpy('watcher')
+  })
+
+  it('path', done => {
+    const watcher = new Watcher(vm, 'b.c', spy)
+    expect(watcher.value).toBe(2)
+    vm.b.c = 3
+    waitForUpdate(() => {
+      expect(watcher.value).toBe(3)
+      expect(spy).toHaveBeenCalledWith(3, 2)
+      vm.b = { c: 4 } // swapping the object
+    }).then(() => {
+      expect(watcher.value).toBe(4)
+      expect(spy).toHaveBeenCalledWith(4, 3)
+    }).then(done)
+  })
+
+  it('non-existent path, set later', done => {
+    const watcher1 = new Watcher(vm, 'b.e', spy)
+    expect(watcher1.value).toBeUndefined()
+    // check $add should not affect isolated children
+    const child2 = new Vue({ parent: vm })
+    const watcher2 = new Watcher(child2, 'b.e', spy)
+    expect(watcher2.value).toBeUndefined()
+    Vue.set(vm.b, 'e', 123)
+    waitForUpdate(() => {
+      expect(watcher1.value).toBe(123)
+      expect(watcher2.value).toBeUndefined()
+      expect(spy.calls.count()).toBe(1)
+      expect(spy).toHaveBeenCalledWith(123, undefined)
+    }).then(done)
+  })
+
+  it('delete', done => {
+    const watcher = new Watcher(vm, 'b.c', spy)
+    expect(watcher.value).toBe(2)
+    Vue.delete(vm.b, 'c')
+    waitForUpdate(() => {
+      expect(watcher.value).toBeUndefined()
+      expect(spy).toHaveBeenCalledWith(undefined, 2)
+    }).then(done)
+  })
+
+  it('path containing $data', done => {
+    const watcher = new Watcher(vm, '$data.b.c', spy)
+    expect(watcher.value).toBe(2)
+    vm.b = { c: 3 }
+    waitForUpdate(() => {
+      expect(watcher.value).toBe(3)
+      expect(spy).toHaveBeenCalledWith(3, 2)
+      vm.$data.b.c = 4
+    }).then(() => {
+      expect(watcher.value).toBe(4)
+      expect(spy).toHaveBeenCalledWith(4, 3)
+    }).then(done)
+  })
+
+  it('deep watch', done => {
+    let oldB
+    new Watcher(vm, 'b', spy, {
+      deep: true
+    })
+    vm.b.c = { d: 4 }
+    waitForUpdate(() => {
+      expect(spy).toHaveBeenCalledWith(vm.b, vm.b)
+      oldB = vm.b
+      vm.b = { c: [{ a: 1 }] }
+    }).then(() => {
+      expect(spy).toHaveBeenCalledWith(vm.b, oldB)
+      expect(spy.calls.count()).toBe(2)
+      vm.b.c[0].a = 2
+    }).then(() => {
+      expect(spy).toHaveBeenCalledWith(vm.b, vm.b)
+      expect(spy.calls.count()).toBe(3)
+    }).then(done)
+  })
+
+  it('deep watch $data', done => {
+    new Watcher(vm, '$data', spy, {
+      deep: true
+    })
+    vm.b.c = 3
+    waitForUpdate(() => {
+      expect(spy).toHaveBeenCalledWith(vm.$data, vm.$data)
+    }).then(done)
+  })
+
+  it('deep watch with circular references', done => {
+    new Watcher(vm, 'b', spy, {
+      deep: true
+    })
+    Vue.set(vm.b, '_', vm.b)
+    waitForUpdate(() => {
+      expect(spy).toHaveBeenCalledWith(vm.b, vm.b)
+      expect(spy.calls.count()).toBe(1)
+      vm.b._.c = 1
+    }).then(() => {
+      expect(spy).toHaveBeenCalledWith(vm.b, vm.b)
+      expect(spy.calls.count()).toBe(2)
+    }).then(done)
+  })
+
+  it('fire change for prop addition/deletion in non-deep mode', done => {
+    new Watcher(vm, 'b', spy)
+    Vue.set(vm.b, 'e', 123)
+    waitForUpdate(() => {
+      expect(spy).toHaveBeenCalledWith(vm.b, vm.b)
+      expect(spy.calls.count()).toBe(1)
+      Vue.delete(vm.b, 'e')
+    }).then(() => {
+      expect(spy.calls.count()).toBe(2)
+    }).then(done)
+  })
+
+  it('watch function', done => {
+    const watcher = new Watcher(vm, function () {
+      return this.a + this.b.d
+    }, spy)
+    expect(watcher.value).toBe(5)
+    vm.a = 2
+    waitForUpdate(() => {
+      expect(spy).toHaveBeenCalledWith(6, 5)
+      vm.b = { d: 2 }
+    }).then(() => {
+      expect(spy).toHaveBeenCalledWith(4, 6)
+    }).then(done)
+  })
+
+  it('lazy mode', done => {
+    const watcher = new Watcher(vm, function () {
+      return this.a + this.b.d
+    }, null, { lazy: true })
+    expect(watcher.lazy).toBe(true)
+    expect(watcher.value).toBeUndefined()
+    expect(watcher.dirty).toBe(true)
+    watcher.evaluate()
+    expect(watcher.value).toBe(5)
+    expect(watcher.dirty).toBe(false)
+    vm.a = 2
+    waitForUpdate(() => {
+      expect(watcher.value).toBe(5)
+      expect(watcher.dirty).toBe(true)
+      watcher.evaluate()
+      expect(watcher.value).toBe(6)
+      expect(watcher.dirty).toBe(false)
+    }).then(done)
+  })
+
+  it('teardown', done => {
+    const watcher = new Watcher(vm, 'b.c', spy)
+    watcher.teardown()
+    vm.b.c = 3
+    waitForUpdate(() => {
+      expect(watcher.active).toBe(false)
+      expect(spy).not.toHaveBeenCalled()
+    }).then(done)
+  })
+
+  it('warn not support path', () => {
+    new Watcher(vm, 'd.e + c', spy)
+    expect('Failed watching path:').toHaveBeenWarned()
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/modules/server-compiler/optimizer.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/modules/server-compiler/optimizer.spec.js
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/modules/sfc/sfc-parser.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/modules/sfc/sfc-parser.spec.js
new file mode 100644 (file)
index 0000000..4cf6bad
--- /dev/null
@@ -0,0 +1,178 @@
+import { parseComponent } from 'sfc/parser'
+
+describe('Single File Component parser', () => {
+  it('should parse', () => {
+    const res = parseComponent(`
+      <template>
+        <div>hi</div>
+      </template>
+      <style src="./test.css"></style>
+      <style lang="stylus" scoped>
+        h1
+          color red
+        h2
+          color green
+      </style>
+      <style module>
+        h1 { font-weight: bold }
+      </style>
+      <style bool-attr val-attr="test"></style>
+      <script>
+        export default {}
+      </script>
+      <div>
+        <style>nested should be ignored</style>
+      </div>
+    `)
+    expect(res.template.content.trim()).toBe('<div>hi</div>')
+    expect(res.styles.length).toBe(4)
+    expect(res.styles[0].src).toBe('./test.css')
+    expect(res.styles[1].lang).toBe('stylus')
+    expect(res.styles[1].scoped).toBe(true)
+    expect(res.styles[1].content.trim()).toBe('h1\n  color red\nh2\n  color green')
+    expect(res.styles[2].module).toBe(true)
+    expect(res.styles[3].attrs['bool-attr']).toBe(true)
+    expect(res.styles[3].attrs['val-attr']).toBe('test')
+    expect(res.script.content.trim()).toBe('export default {}')
+  })
+
+  it('should parse template with closed input', () => {
+    const res = parseComponent(`
+      <template>
+        <input type="text"/>
+      </template>
+    `)
+
+    expect(res.template.content.trim()).toBe('<input type="text"/>')
+  })
+
+  it('should handle nested template', () => {
+    const res = parseComponent(`
+      <template>
+        <div><template v-if="ok">hi</template></div>
+      </template>
+    `)
+    expect(res.template.content.trim()).toBe('<div><template v-if="ok">hi</template></div>')
+  })
+
+  it('pad content', () => {
+    const content = `
+      <template>
+        <div></div>
+      </template>
+      <script>
+        export default {}
+      </script>
+      <style>
+        h1 { color: red }
+      </style>
+`
+    const padDefault = parseComponent(content.trim(), { pad: true })
+    const padLine = parseComponent(content.trim(), { pad: 'line' })
+    const padSpace = parseComponent(content.trim(), { pad: 'space' })
+
+    expect(padDefault.script.content).toBe(Array(3 + 1).join('//\n') + '\nexport default {}\n')
+    expect(padDefault.styles[0].content).toBe(Array(6 + 1).join('\n') + '\nh1 { color: red }\n')
+    expect(padLine.script.content).toBe(Array(3 + 1).join('//\n') + '\nexport default {}\n')
+    expect(padLine.styles[0].content).toBe(Array(6 + 1).join('\n') + '\nh1 { color: red }\n')
+    expect(padSpace.script.content).toBe(`<template>
+        <div></div>
+      </template>
+      <script>`.replace(/./g, ' ') + '\nexport default {}\n')
+    expect(padSpace.styles[0].content).toBe(`<template>
+        <div></div>
+      </template>
+      <script>
+        export default {}
+      </script>
+      <style>`.replace(/./g, ' ') + '\nh1 { color: red }\n')
+  })
+
+  it('should handle template blocks with lang as special text', () => {
+    const res = parseComponent(`
+      <template lang="pug">
+        div
+          h1(v-if='1 < 2') hello
+      </template>
+    `)
+    expect(res.template.content.trim()).toBe(`div\n  h1(v-if='1 < 2') hello`)
+  })
+
+  it('should handle component contains "<" only', () => {
+    const res = parseComponent(`
+      <template>
+        <span><</span>
+      </template>
+    `)
+    expect(res.template.content.trim()).toBe(`<span><</span>`)
+  })
+
+  it('should handle custom blocks without parsing them', () => {
+    const res = parseComponent(`
+      <template>
+        <div></div>
+      </template>
+      <example name="simple">
+        <my-button ref="button">Hello</my-button>
+      </example>
+      <example name="with props">
+        <my-button color="red">Hello</my-button>
+      </example>
+      <test name="simple" foo="bar">
+      export default function simple (vm) {
+        describe('Hello', () => {
+          it('should display Hello', () => {
+            this.vm.$refs.button.$el.innerText.should.equal('Hello')
+          }))
+        }))
+      }
+      </test>
+    `)
+    expect(res.customBlocks.length).toBe(3)
+
+    const simpleExample = res.customBlocks[0]
+    expect(simpleExample.type).toBe('example')
+    expect(simpleExample.content.trim()).toBe('<my-button ref="button">Hello</my-button>')
+    expect(simpleExample.attrs.name).toBe('simple')
+
+    const withProps = res.customBlocks[1]
+    expect(withProps.type).toBe('example')
+    expect(withProps.content.trim()).toBe('<my-button color="red">Hello</my-button>')
+    expect(withProps.attrs.name).toBe('with props')
+
+    const simpleTest = res.customBlocks[2]
+    expect(simpleTest.type).toBe('test')
+    expect(simpleTest.content.trim()).toBe(`export default function simple (vm) {
+  describe('Hello', () => {
+    it('should display Hello', () => {
+      this.vm.$refs.button.$el.innerText.should.equal('Hello')
+    }))
+  }))
+}`)
+    expect(simpleTest.attrs.name).toBe('simple')
+    expect(simpleTest.attrs.foo).toBe('bar')
+  })
+
+  // Regression #4289
+  it('accepts nested template tag', () => {
+    const raw = `<div>
+      <template v-if="true === true">
+        <section class="section">
+          <div class="container">
+            Should be shown
+          </div>
+        </section>
+      </template>
+      <template v-else>
+        <p>Should not be shown</p>
+      </template>
+    </div>`
+    const res = parseComponent(`<template>${raw}</template>`)
+    expect(res.template.content.trim()).toBe(raw)
+  })
+
+  it('should not hang on trailing text', () => {
+    const res = parseComponent(`<template>hi</`)
+    expect(res.template.content).toBe('hi')
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/modules/util/next-tick.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/modules/util/next-tick.spec.js
new file mode 100644 (file)
index 0000000..53f6124
--- /dev/null
@@ -0,0 +1,34 @@
+import { nextTick } from 'core/util/next-tick'
+
+describe('nextTick', () => {
+  it('accepts a callback', done => {
+    nextTick(done)
+  })
+
+  it('returns undefined when passed a callback', () => {
+    expect(nextTick(() => {})).toBeUndefined()
+  })
+
+  if (typeof Promise !== 'undefined') {
+    it('returns a Promise when provided no callback', done => {
+      nextTick().then(done)
+    })
+
+    it('returns a Promise with a context argument when provided a falsy callback and an object', done => {
+      const obj = {}
+      nextTick(undefined, obj).then(ctx => {
+        expect(ctx).toBe(obj)
+        done()
+      })
+    })
+
+    it('returned Promise should resolve correctly vs callback', done => {
+      const spy = jasmine.createSpy()
+      nextTick(spy)
+      nextTick().then(() => {
+        expect(spy).toHaveBeenCalled()
+        done()
+      })
+    })
+  }
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/modules/vdom/create-component.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/modules/vdom/create-component.spec.js
new file mode 100644 (file)
index 0000000..db0c59e
--- /dev/null
@@ -0,0 +1,114 @@
+import Vue from 'vue'
+import { createComponent } from 'core/vdom/create-component'
+
+describe('create-component', () => {
+  let vm
+  beforeEach(done => {
+    vm = new Vue({
+      template: '<p>{{msg}}</p>',
+      data () {
+        return { msg: 'hello, my children' }
+      }
+    }).$mount()
+    Vue.nextTick(done)
+  })
+
+  it('create a component basically', () => {
+    const child = {
+      name: 'child',
+      props: ['msg'],
+      render () {}
+    }
+    const data = {
+      props: { msg: 'hello world' },
+      attrs: { id: 1 },
+      staticAttrs: { class: 'foo' },
+      on: { notify: 'onNotify' }
+    }
+    const vnode = createComponent(child, data, vm, vm)
+    expect(vnode.tag).toMatch(/vue-component-[0-9]+-child/)
+    expect(vnode.data.attrs).toEqual({ id: 1 })
+    expect(vnode.data.staticAttrs).toEqual({ class: 'foo' })
+    expect(vnode.componentOptions.propsData).toEqual({ msg: 'hello world' })
+    expect(vnode.componentOptions.listeners).toEqual({ notify: 'onNotify' })
+    expect(vnode.children).toBeUndefined()
+    expect(vnode.text).toBeUndefined()
+    expect(vnode.elm).toBeUndefined()
+    expect(vnode.ns).toBeUndefined()
+    expect(vnode.context).toEqual(vm)
+  })
+
+  it('create a component when resolved with async loading', done => {
+    let vnode = null
+    const data = {
+      props: {},
+      staticAttrs: { class: 'foo' }
+    }
+    spyOn(vm, '$forceUpdate')
+    function async (resolve, reject) {
+      setTimeout(() => {
+        resolve({
+          name: 'child',
+          props: ['msg']
+        })
+        Vue.nextTick(loaded)
+      }, 0)
+    }
+    function go () {
+      vnode = createComponent(async, data, vm, vm)
+      expect(vnode.isComment).toBe(true) // not to be loaded yet.
+      expect(vnode.asyncFactory).toBe(async)
+    }
+    function loaded () {
+      vnode = createComponent(async, data, vm, vm)
+      expect(vnode.tag).toMatch(/vue-component-[0-9]+-child/)
+      expect(vnode.data.staticAttrs).toEqual({ class: 'foo' })
+      expect(vnode.children).toBeUndefined()
+      expect(vnode.text).toBeUndefined()
+      expect(vnode.elm).toBeUndefined()
+      expect(vnode.ns).toBeUndefined()
+      expect(vnode.context).toEqual(vm)
+      expect(vm.$forceUpdate).toHaveBeenCalled()
+      done()
+    }
+    go()
+  })
+
+  it('not create a component when rejected with async loading', done => {
+    let vnode = null
+    const data = {
+      props: { msg: 'hello world' },
+      attrs: { id: 1 }
+    }
+    const reason = 'failed!!'
+    function async (resolve, reject) {
+      setTimeout(() => {
+        reject(reason)
+        Vue.nextTick(failed)
+      }, 0)
+    }
+    function go () {
+      vnode = createComponent(async, data, vm, vm)
+      expect(vnode.isComment).toBe(true) // not to be loaded yet.
+    }
+    function failed () {
+      vnode = createComponent(async, data, vm, vm)
+      expect(vnode.isComment).toBe(true) // failed, still a comment node
+      expect(`Failed to resolve async component: ${async}\nReason: ${reason}`).toHaveBeenWarned()
+      done()
+    }
+    go()
+  })
+
+  it('not create a component when specified with falsy', () => {
+    const vnode = createComponent(null, {}, vm, vm)
+    expect(vnode).toBeUndefined()
+  })
+
+  it('warn component definition type', () => {
+    const Ctor = 'child'
+    const vnode = createComponent(Ctor, {}, vm, vm)
+    expect(vnode).toBeUndefined()
+    expect(`Invalid Component definition: ${Ctor}`).toHaveBeenWarned()
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/modules/vdom/create-element.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/modules/vdom/create-element.spec.js
new file mode 100644 (file)
index 0000000..6877385
--- /dev/null
@@ -0,0 +1,276 @@
+import Vue from 'vue'
+import { createEmptyVNode } from 'core/vdom/vnode'
+
+describe('create-element', () => {
+  it('render vnode with basic reserved tag using createElement', () => {
+    const vm = new Vue({
+      data: { msg: 'hello world' }
+    })
+    const h = vm.$createElement
+    const vnode = h('p', {})
+    expect(vnode.tag).toBe('p')
+    expect(vnode.data).toEqual({})
+    expect(vnode.children).toBeUndefined()
+    expect(vnode.text).toBeUndefined()
+    expect(vnode.elm).toBeUndefined()
+    expect(vnode.ns).toBeUndefined()
+    expect(vnode.context).toEqual(vm)
+  })
+
+  it('render vnode with component using createElement', () => {
+    const vm = new Vue({
+      data: { message: 'hello world' },
+      components: {
+        'my-component': {
+          props: ['msg']
+        }
+      }
+    })
+    const h = vm.$createElement
+    const vnode = h('my-component', { props: { msg: vm.message }})
+    expect(vnode.tag).toMatch(/vue-component-[0-9]+/)
+    expect(vnode.componentOptions.propsData).toEqual({ msg: vm.message })
+    expect(vnode.children).toBeUndefined()
+    expect(vnode.text).toBeUndefined()
+    expect(vnode.elm).toBeUndefined()
+    expect(vnode.ns).toBeUndefined()
+    expect(vnode.context).toEqual(vm)
+  })
+
+  it('render vnode with custom tag using createElement', () => {
+    const vm = new Vue({
+      data: { msg: 'hello world' }
+    })
+    const h = vm.$createElement
+    const tag = 'custom-tag'
+    const vnode = h(tag, {})
+    expect(vnode.tag).toBe('custom-tag')
+    expect(vnode.data).toEqual({})
+    expect(vnode.children).toBeUndefined()
+    expect(vnode.text).toBeUndefined()
+    expect(vnode.elm).toBeUndefined()
+    expect(vnode.ns).toBeUndefined()
+    expect(vnode.context).toEqual(vm)
+    expect(vnode.componentOptions).toBeUndefined()
+  })
+
+  it('render empty vnode with falsy tag using createElement', () => {
+    const vm = new Vue({
+      data: { msg: 'hello world' }
+    })
+    const h = vm.$createElement
+    const vnode = h(null, {})
+    expect(vnode).toEqual(createEmptyVNode())
+  })
+
+  it('render vnode with not string tag using createElement', () => {
+    const vm = new Vue({
+      data: { msg: 'hello world' }
+    })
+    const h = vm.$createElement
+    const vnode = h(Vue.extend({ // Component class
+      props: ['msg']
+    }), { props: { msg: vm.message }})
+    expect(vnode.tag).toMatch(/vue-component-[0-9]+/)
+    expect(vnode.componentOptions.propsData).toEqual({ msg: vm.message })
+    expect(vnode.children).toBeUndefined()
+    expect(vnode.text).toBeUndefined()
+    expect(vnode.elm).toBeUndefined()
+    expect(vnode.ns).toBeUndefined()
+    expect(vnode.context).toEqual(vm)
+  })
+
+  it('render vnode with createElement with children', () => {
+    const vm = new Vue({})
+    const h = vm.$createElement
+    const vnode = h('p', void 0, [h('br'), 'hello world', h('br')])
+    expect(vnode.children[0].tag).toBe('br')
+    expect(vnode.children[1].text).toBe('hello world')
+    expect(vnode.children[2].tag).toBe('br')
+  })
+
+  it('render vnode with children, omitting data', () => {
+    const vm = new Vue({})
+    const h = vm.$createElement
+    const vnode = h('p', [h('br'), 'hello world', h('br')])
+    expect(vnode.children[0].tag).toBe('br')
+    expect(vnode.children[1].text).toBe('hello world')
+    expect(vnode.children[2].tag).toBe('br')
+  })
+
+  it('render vnode with children, including boolean and null type', () => {
+    const vm = new Vue({})
+    const h = vm.$createElement
+    const vnode = h('p', [h('br'), true, 123, h('br'), 'abc', null])
+    expect(vnode.children.length).toBe(4)
+    expect(vnode.children[0].tag).toBe('br')
+    expect(vnode.children[1].text).toBe('123')
+    expect(vnode.children[2].tag).toBe('br')
+    expect(vnode.children[3].text).toBe('abc')
+  })
+
+  it('render svg elements with correct namespace', () => {
+    const vm = new Vue({})
+    const h = vm.$createElement
+    const vnode = h('svg', [h('a', [h('foo', [h('bar')])])])
+    expect(vnode.ns).toBe('svg')
+    // should apply ns to children recursively
+    expect(vnode.children[0].ns).toBe('svg')
+    expect(vnode.children[0].children[0].ns).toBe('svg')
+    expect(vnode.children[0].children[0].children[0].ns).toBe('svg')
+  })
+
+  it('render MathML elements with correct namespace', () => {
+    const vm = new Vue({})
+    const h = vm.$createElement
+    const vnode = h('math', [h('matrix')])
+    expect(vnode.ns).toBe('math')
+    // should apply ns to children
+    expect(vnode.children[0].ns).toBe('math')
+    // although not explicitly listed, elements nested under <math>
+    // should not be treated as component
+    expect(vnode.children[0].componentOptions).toBeUndefined()
+  })
+
+  it('render svg foreignObject with correct namespace', () => {
+    const vm = new Vue({})
+    const h = vm.$createElement
+    const vnode = h('svg', [h('foreignObject', [h('p'), h('svg')])])
+    expect(vnode.ns).toBe('svg')
+    expect(vnode.children[0].ns).toBe('svg')
+    expect(vnode.children[0].children[0].ns).toBeUndefined()
+    // #7330
+    expect(vnode.children[0].children[1].ns).toBe('svg')
+  })
+
+  // #6642
+  it('render svg foreignObject component with correct namespace', () => {
+    const vm = new Vue({
+      template: `
+        <svg>
+          <test></test>
+        </svg>
+      `,
+      components: {
+        test: {
+          template: `
+          <foreignObject>
+            <p xmlns="http://www.w3.org/1999/xhtml"></p>
+          </foreignObject>
+          `
+        }
+      }
+    }).$mount()
+    const testComp = vm.$children[0]
+    expect(testComp.$vnode.ns).toBe('svg')
+    expect(testComp._vnode.tag).toBe('foreignObject')
+    expect(testComp._vnode.ns).toBe('svg')
+    expect(testComp._vnode.children[0].tag).toBe('p')
+    expect(testComp._vnode.children[0].ns).toBeUndefined()
+  })
+
+  // #6506
+  it('render SVGAElement in a component correctly', () => {
+    const vm = new Vue({
+      template: `
+        <svg>
+          <test></test>
+        </svg>
+      `,
+      components: {
+        test: { render: h => h('a') }
+      }
+    }).$mount()
+    const testComp = vm.$children[0]
+    expect(testComp.$vnode.ns).toBe('svg')
+    expect(testComp._vnode.tag).toBe('a')
+    expect(testComp._vnode.ns).toBe('svg')
+  })
+
+  it('warn observed data objects', () => {
+    new Vue({
+      data: {
+        data: {}
+      },
+      render (h) {
+        return h('div', this.data)
+      }
+    }).$mount()
+    expect('Avoid using observed data object as vnode data').toHaveBeenWarned()
+  })
+
+  it('warn non-primitive key', () => {
+    new Vue({
+      render (h) {
+        return h('div', { key: {}})
+      }
+    }).$mount()
+    expect('Avoid using non-primitive value as key').toHaveBeenWarned()
+  })
+
+  it('doesn\'t warn boolean key', () => {
+    new Vue({
+      render (h) {
+        return h('div', { key: true })
+      }
+    }).$mount()
+    expect('Avoid using non-primitive value as key').not.toHaveBeenWarned()
+  })
+
+  it('doesn\'t warn symbol key', () => {
+    new Vue({
+      render (h) {
+        return h('div', { key: Symbol('symbol') })
+      }
+    }).$mount()
+    expect('Avoid using non-primitive value as key').not.toHaveBeenWarned()
+  })
+
+  it('nested child elements should be updated correctly', done => {
+    const vm = new Vue({
+      data: { n: 1 },
+      render (h) {
+        const list = []
+        for (let i = 0; i < this.n; i++) {
+          list.push(h('span', i))
+        }
+        const input = h('input', {
+          attrs: {
+            value: 'a',
+            type: 'text'
+          }
+        })
+        return h('div', [[...list, input]])
+      }
+    }).$mount()
+    expect(vm.$el.innerHTML).toContain('<span>0</span><input')
+    const el = vm.$el.querySelector('input')
+    el.value = 'b'
+    vm.n++
+    waitForUpdate(() => {
+      expect(vm.$el.innerHTML).toContain('<span>0</span><span>1</span><input')
+      expect(vm.$el.querySelector('input')).toBe(el)
+      expect(vm.$el.querySelector('input').value).toBe('b')
+    }).then(done)
+  })
+
+  // #7786
+  it('creates element with vnode reference in :class or :style', () => {
+    const vm = new Vue({
+      components: {
+        foo: {
+          render (h) {
+            return h('div', {
+              class: {
+                'has-vnode': this.$vnode
+              }
+            }, 'foo')
+          }
+        }
+      },
+      render: h => h('foo')
+    }).$mount()
+    expect(vm.$el.innerHTML).toContain('foo')
+    expect(vm.$el.classList.contains('has-vnode')).toBe(true)
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/modules/vdom/modules/attrs.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/modules/vdom/modules/attrs.spec.js
new file mode 100644 (file)
index 0000000..0ec1cc4
--- /dev/null
@@ -0,0 +1,102 @@
+import Vue from 'vue'
+import { patch } from 'web/runtime/patch'
+import VNode from 'core/vdom/vnode'
+import { xlinkNS } from 'web/util/index'
+
+describe('vdom attrs module', () => {
+  it('should create an element with attrs', () => {
+    const vnode = new VNode('p', { attrs: { id: 1, class: 'class1' }})
+    const elm = patch(null, vnode)
+    expect(elm.id).toBe('1')
+    expect(elm).toHaveClass('class1')
+  })
+
+  it('should change the elements attrs', () => {
+    const vnode1 = new VNode('i', { attrs: { id: '1', class: 'i am vdom' }})
+    const vnode2 = new VNode('i', { attrs: { id: '2', class: 'i am' }})
+    patch(null, vnode1)
+    const elm = patch(vnode1, vnode2)
+    expect(elm.id).toBe('2')
+    expect(elm).toHaveClass('i')
+    expect(elm).toHaveClass('am')
+    expect(elm).not.toHaveClass('vdom')
+  })
+
+  it('should remove the elements attrs', () => {
+    const vnode1 = new VNode('i', { attrs: { id: '1', class: 'i am vdom' }})
+    const vnode2 = new VNode('i', { attrs: { id: '1' }})
+    patch(null, vnode1)
+    const elm = patch(vnode1, vnode2)
+    expect(elm.id).toBe('1')
+    expect(elm.className).toBe('')
+  })
+
+  it('should remove the elements attrs for new nodes without attrs data', () => {
+    const vnode1 = new VNode('i', { attrs: { id: '1', class: 'i am vdom' }})
+    const vnode2 = new VNode('i', {})
+    patch(null, vnode1)
+    const elm = patch(vnode1, vnode2)
+    expect(elm.id).toBe('')
+    expect(elm.className).toBe('')
+  })
+
+  it('should remove the falsy value from boolean attr', () => {
+    const vnode = new VNode('option', { attrs: { disabled: null }})
+    const elm = patch(null, vnode)
+    expect(elm.getAttribute('disabled')).toBe(null)
+  })
+
+  it('should set the attr name to boolean attr', () => {
+    const vnode = new VNode('option', { attrs: { disabled: true }})
+    const elm = patch(null, vnode)
+    expect(elm.getAttribute('disabled')).toBe('disabled')
+  })
+
+  it('should set the falsy value to enumerated attr', () => {
+    const vnode = new VNode('div', { attrs: { contenteditable: null }})
+    const elm = patch(null, vnode)
+    expect(elm.getAttribute('contenteditable')).toBe('false')
+  })
+
+  it('should set the boolean string value to enumerated attr', () => {
+    const vnode = new VNode('div', { attrs: { contenteditable: 'true' }})
+    const elm = patch(null, vnode)
+    expect(elm.getAttribute('contenteditable')).toBe('true')
+  })
+
+  it('should set the xlink value to attr', () => {
+    const vnode = new VNode('a', { attrs: { 'xlink:href': '#id1' }})
+    const elm = patch(null, vnode)
+    expect(elm.getAttributeNS(xlinkNS, 'href')).toBe('#id1')
+  })
+
+  it('should set the xlink boolean string value to attr', () => {
+    const vnode = new VNode('option', { attrs: { 'xlink:disabled': true }})
+    const elm = patch(null, vnode)
+    expect(elm.getAttributeNS(xlinkNS, 'disabled')).toBe('true')
+  })
+
+  it('should handle mutating observed attrs object', done => {
+    const vm = new Vue({
+      data: {
+        attrs: {
+          id: 'foo'
+        }
+      },
+      render (h) {
+        return h('div', {
+          attrs: this.attrs
+        })
+      }
+    }).$mount()
+
+    expect(vm.$el.id).toBe('foo')
+    vm.attrs.id = 'bar'
+    waitForUpdate(() => {
+      expect(vm.$el.id).toBe('bar')
+      vm.attrs = { id: 'baz' }
+    }).then(() => {
+      expect(vm.$el.id).toBe('baz')
+    }).then(done)
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/modules/vdom/modules/class.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/modules/vdom/modules/class.spec.js
new file mode 100644 (file)
index 0000000..174e934
--- /dev/null
@@ -0,0 +1,107 @@
+import { patch } from 'web/runtime/patch'
+import VNode from 'core/vdom/vnode'
+
+describe('vdom class module', () => {
+  it('should create an element with staticClass', () => {
+    const vnode = new VNode('p', { staticClass: 'class1' })
+    const elm = patch(null, vnode)
+    expect(elm).toHaveClass('class1')
+  })
+
+  it('should create an element with class', () => {
+    const vnode = new VNode('p', { class: 'class1' })
+    const elm = patch(null, vnode)
+    expect(elm).toHaveClass('class1')
+  })
+
+  it('should create an element with array class', () => {
+    const vnode = new VNode('p', { class: ['class1', 'class2'] })
+    const elm = patch(null, vnode)
+    expect(elm).toHaveClass('class1')
+    expect(elm).toHaveClass('class2')
+  })
+
+  it('should create an element with object class', () => {
+    const vnode = new VNode('p', {
+      class: { class1: true, class2: false, class3: true }
+    })
+    const elm = patch(null, vnode)
+    expect(elm).toHaveClass('class1')
+    expect(elm).not.toHaveClass('class2')
+    expect(elm).toHaveClass('class3')
+  })
+
+  it('should create an element with mixed class', () => {
+    const vnode = new VNode('p', {
+      class: [{ class1: false, class2: true, class3: false }, 'class4', ['class5', 'class6']]
+    })
+    const elm = patch(null, vnode)
+    expect(elm).not.toHaveClass('class1')
+    expect(elm).toHaveClass('class2')
+    expect(elm).not.toHaveClass('class3')
+    expect(elm).toHaveClass('class4')
+    expect(elm).toHaveClass('class5')
+    expect(elm).toHaveClass('class6')
+  })
+
+  it('should create an element with staticClass and class', () => {
+    const vnode = new VNode('p', { staticClass: 'class1', class: 'class2' })
+    const elm = patch(null, vnode)
+    expect(elm).toHaveClass('class1')
+    expect(elm).toHaveClass('class2')
+  })
+
+  it('should handle transition class', () => {
+    const vnode1 = new VNode('p', {
+      class: { class1: true, class2: false, class3: true }
+    })
+    let elm = patch(null, vnode1)
+    elm._transitionClasses = ['class4']
+    const vnode2 = new VNode('p', {
+      class: { class1: true, class2: true, class3: true }
+    })
+    elm = patch(vnode1, vnode2)
+    expect(elm).toHaveClass('class1')
+    expect(elm).toHaveClass('class2')
+    expect(elm).toHaveClass('class3')
+    expect(elm).toHaveClass('class4')
+  })
+
+  it('should change the elements class', () => {
+    const vnode1 = new VNode('p', {
+      class: { class1: true, class2: false, class3: true }
+    })
+    const vnode2 = new VNode('p', { staticClass: 'foo bar' })
+    let elm = patch(null, vnode1)
+    elm = patch(vnode1, vnode2)
+    expect(elm).not.toHaveClass('class1')
+    expect(elm).not.toHaveClass('class2')
+    expect(elm).not.toHaveClass('class3')
+    expect(elm).toHaveClass('foo')
+    expect(elm).toHaveClass('bar')
+  })
+
+  it('should remove the elements class', () => {
+    const vnode1 = new VNode('p', {
+      class: { class1: true, class2: false, class3: true }
+    })
+    const vnode2 = new VNode('p', { class: {}})
+    let elm = patch(null, vnode1)
+    elm = patch(vnode1, vnode2)
+    expect(elm).not.toHaveClass('class1')
+    expect(elm).not.toHaveClass('class2')
+    expect(elm).not.toHaveClass('class3')
+  })
+
+  it('should remove class for new nodes without class data', () => {
+    const vnode1 = new VNode('p', {
+      class: { class1: true, class2: false, class3: true }
+    })
+    const vnode2 = new VNode('p', {})
+    let elm = patch(null, vnode1)
+    elm = patch(vnode1, vnode2)
+    expect(elm).not.toHaveClass('class1')
+    expect(elm).not.toHaveClass('class2')
+    expect(elm).not.toHaveClass('class3')
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/modules/vdom/modules/directive.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/modules/vdom/modules/directive.spec.js
new file mode 100644 (file)
index 0000000..38c5318
--- /dev/null
@@ -0,0 +1,38 @@
+import Vue from 'vue'
+import { patch } from 'web/runtime/patch'
+import VNode from 'core/vdom/vnode'
+
+describe('vdom directive module', () => {
+  it('should work', () => {
+    const directive1 = {
+      bind: jasmine.createSpy('bind'),
+      update: jasmine.createSpy('update'),
+      unbind: jasmine.createSpy('unbind')
+    }
+    const vm = new Vue({ directives: { directive1 }})
+    // create
+    const vnode1 = new VNode('div', {}, [
+      new VNode('p', {
+        directives: [{
+          name: 'directive1', value: 'hello', arg: 'arg1', modifiers: { modifier1: true }
+        }]
+      }, undefined, 'hello world', undefined, vm)
+    ])
+    patch(null, vnode1)
+    expect(directive1.bind).toHaveBeenCalled()
+    // update
+    const vnode2 = new VNode('div', {}, [
+      new VNode('p', {
+        directives: [{
+          name: 'directive1', value: 'world', arg: 'arg1', modifiers: { modifier1: true }
+        }]
+      }, undefined, 'hello world', undefined, vm)
+    ])
+    patch(vnode1, vnode2)
+    expect(directive1.update).toHaveBeenCalled()
+    // destroy
+    const vnode3 = new VNode('div')
+    patch(vnode2, vnode3)
+    expect(directive1.unbind).toHaveBeenCalled()
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/modules/vdom/modules/dom-props.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/modules/vdom/modules/dom-props.spec.js
new file mode 100644 (file)
index 0000000..9017675
--- /dev/null
@@ -0,0 +1,90 @@
+import Vue from 'vue'
+import { patch } from 'web/runtime/patch'
+import VNode from 'core/vdom/vnode'
+
+describe('vdom domProps module', () => {
+  it('should create an element with domProps', () => {
+    const vnode = new VNode('a', { domProps: { src: 'http://localhost/' }})
+    const elm = patch(null, vnode)
+    expect(elm.src).toBe('http://localhost/')
+  })
+
+  it('should change the elements domProps', () => {
+    const vnode1 = new VNode('a', { domProps: { src: 'http://localhost/' }})
+    const vnode2 = new VNode('a', { domProps: { src: 'https://vuejs.org/' }})
+    patch(null, vnode1)
+    const elm = patch(vnode1, vnode2)
+    expect(elm.src).toBe('https://vuejs.org/')
+  })
+
+  it('should remove the elements domProps', () => {
+    const vnode1 = new VNode('a', { domProps: { src: 'http://localhost/' }})
+    const vnode2 = new VNode('a', { domProps: {}})
+    patch(null, vnode1)
+    const elm = patch(vnode1, vnode2)
+    expect(elm.src).toBe('')
+  })
+
+  it('should initialize the elements value to zero', () => {
+    const vnode = new VNode('input', { domProps: { value: 0 }})
+    const elm = patch(null, vnode)
+    expect(elm.value).toBe('0')
+  })
+
+  it('should save raw value on element', () => {
+    const value = {}
+    const vnode = new VNode('input', { domProps: { value }})
+    const elm = patch(null, vnode)
+    expect(elm._value).toBe(value)
+  })
+
+  it('should discard vnode children if the node has innerHTML or textContent as a prop', () => {
+    const vnode = new VNode('div', { domProps: { innerHTML: 'hi' }}, [
+      new VNode('span'), new VNode('span')
+    ])
+    const elm = patch(null, vnode)
+    expect(elm.innerHTML).toBe('hi')
+    expect(vnode.children.length).toBe(0)
+
+    const vnode2 = new VNode('div', { domProps: { textContent: 'hi' }}, [
+      new VNode('span'), new VNode('span')
+    ])
+    const elm2 = patch(null, vnode2)
+    expect(elm2.textContent).toBe('hi')
+    expect(vnode2.children.length).toBe(0)
+
+    const vnode3 = new VNode('div', undefined, undefined, '123')
+    patch(null, vnode3)
+    const elm3 = patch(vnode3, vnode2)
+    expect(elm3.textContent).toBe('hi')
+
+    const vnode4 = new VNode('div', undefined, undefined, new VNode('span'))
+    patch(null, vnode4)
+    const elm4 = patch(vnode4, vnode)
+    expect(elm4.textContent).toBe('hi')
+  })
+
+  it('should handle mutating observed props object', done => {
+    const vm = new Vue({
+      data: {
+        props: {
+          id: 'foo'
+        }
+      },
+      render (h) {
+        return h('div', {
+          domProps: this.props
+        })
+      }
+    }).$mount()
+
+    expect(vm.$el.id).toBe('foo')
+    vm.props.id = 'bar'
+    waitForUpdate(() => {
+      expect(vm.$el.id).toBe('bar')
+      vm.props = { id: 'baz' }
+    }).then(() => {
+      expect(vm.$el.id).toBe('baz')
+    }).then(done)
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/modules/vdom/modules/events.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/modules/vdom/modules/events.spec.js
new file mode 100644 (file)
index 0000000..9dcd72c
--- /dev/null
@@ -0,0 +1,135 @@
+import { patch } from 'web/runtime/patch'
+import VNode from 'core/vdom/vnode'
+
+describe('vdom events module', () => {
+  it('should attach event handler to element', () => {
+    const click = jasmine.createSpy()
+    const vnode = new VNode('a', { on: { click }})
+
+    const elm = patch(null, vnode)
+    document.body.appendChild(elm)
+    triggerEvent(elm, 'click')
+    expect(click.calls.count()).toBe(1)
+  })
+
+  it('should not duplicate the same listener', () => {
+    const click = jasmine.createSpy()
+    const vnode1 = new VNode('a', { on: { click }})
+    const vnode2 = new VNode('a', { on: { click }})
+
+    const elm = patch(null, vnode1)
+    patch(vnode1, vnode2)
+    document.body.appendChild(elm)
+    triggerEvent(elm, 'click')
+    expect(click.calls.count()).toBe(1)
+  })
+
+  it('should update different listener', () => {
+    const click = jasmine.createSpy()
+    const click2 = jasmine.createSpy()
+    const vnode1 = new VNode('a', { on: { click }})
+    const vnode2 = new VNode('a', { on: { click: click2 }})
+
+    const elm = patch(null, vnode1)
+    document.body.appendChild(elm)
+    triggerEvent(elm, 'click')
+    expect(click.calls.count()).toBe(1)
+    expect(click2.calls.count()).toBe(0)
+
+    patch(vnode1, vnode2)
+    triggerEvent(elm, 'click')
+    expect(click.calls.count()).toBe(1)
+    expect(click2.calls.count()).toBe(1)
+  })
+
+  it('should attach Array of multiple handlers', () => {
+    const click = jasmine.createSpy()
+    const vnode = new VNode('a', { on: { click: [click, click] }})
+
+    const elm = patch(null, vnode)
+    document.body.appendChild(elm)
+    triggerEvent(elm, 'click')
+    expect(click.calls.count()).toBe(2)
+  })
+
+  it('should update Array of multiple handlers', () => {
+    const click = jasmine.createSpy()
+    const click2 = jasmine.createSpy()
+    const vnode1 = new VNode('a', { on: { click: [click, click2] }})
+    const vnode2 = new VNode('a', { on: { click: [click] }})
+
+    const elm = patch(null, vnode1)
+    document.body.appendChild(elm)
+    triggerEvent(elm, 'click')
+    expect(click.calls.count()).toBe(1)
+    expect(click2.calls.count()).toBe(1)
+
+    patch(vnode1, vnode2)
+    triggerEvent(elm, 'click')
+    expect(click.calls.count()).toBe(2)
+    expect(click2.calls.count()).toBe(1)
+  })
+
+  it('should remove handlers that are no longer present', () => {
+    const click = jasmine.createSpy()
+    const vnode1 = new VNode('a', { on: { click }})
+    const vnode2 = new VNode('a', {})
+
+    const elm = patch(null, vnode1)
+    document.body.appendChild(elm)
+    triggerEvent(elm, 'click')
+    expect(click.calls.count()).toBe(1)
+
+    patch(vnode1, vnode2)
+    triggerEvent(elm, 'click')
+    expect(click.calls.count()).toBe(1)
+  })
+
+  it('should remove Array handlers that are no longer present', () => {
+    const click = jasmine.createSpy()
+    const vnode1 = new VNode('a', { on: { click: [click, click] }})
+    const vnode2 = new VNode('a', {})
+
+    const elm = patch(null, vnode1)
+    document.body.appendChild(elm)
+    triggerEvent(elm, 'click')
+    expect(click.calls.count()).toBe(2)
+
+    patch(vnode1, vnode2)
+    triggerEvent(elm, 'click')
+    expect(click.calls.count()).toBe(2)
+  })
+
+  // #4650
+  it('should handle single -> array or array -> single handler changes', () => {
+    const click = jasmine.createSpy()
+    const click2 = jasmine.createSpy()
+    const click3 = jasmine.createSpy()
+    const vnode0 = new VNode('a', { on: { click: click }})
+    const vnode1 = new VNode('a', { on: { click: [click, click2] }})
+    const vnode2 = new VNode('a', { on: { click: click }})
+    const vnode3 = new VNode('a', { on: { click: [click2, click3] }})
+
+    const elm = patch(null, vnode0)
+    document.body.appendChild(elm)
+    triggerEvent(elm, 'click')
+    expect(click.calls.count()).toBe(1)
+    expect(click2.calls.count()).toBe(0)
+
+    patch(vnode0, vnode1)
+    triggerEvent(elm, 'click')
+    expect(click.calls.count()).toBe(2)
+    expect(click2.calls.count()).toBe(1)
+
+    patch(vnode1, vnode2)
+    triggerEvent(elm, 'click')
+    expect(click.calls.count()).toBe(3)
+    expect(click2.calls.count()).toBe(1)
+
+    patch(vnode2, vnode3)
+    triggerEvent(elm, 'click')
+    expect(click.calls.count()).toBe(3)
+    expect(click2.calls.count()).toBe(2)
+    expect(click3.calls.count()).toBe(1)
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/modules/vdom/modules/style.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/modules/vdom/modules/style.spec.js
new file mode 100644 (file)
index 0000000..13ee5fc
--- /dev/null
@@ -0,0 +1,35 @@
+import { patch } from 'web/runtime/patch'
+import VNode from 'core/vdom/vnode'
+
+describe('vdom style module', () => {
+  it('should create an element with style', () => {
+    const vnode = new VNode('p', { style: { fontSize: '12px' }})
+    const elm = patch(null, vnode)
+    expect(elm.style.fontSize).toBe('12px')
+  })
+
+  it('should create an element with array style', () => {
+    const vnode = new VNode('p', { style: [{ fontSize: '12px' }, { color: 'red' }] })
+    const elm = patch(null, vnode)
+    expect(elm.style.fontSize).toBe('12px')
+    expect(elm.style.color).toBe('red')
+  })
+
+  it('should change elements style', () => {
+    const vnode1 = new VNode('p', { style: { fontSize: '12px' }})
+    const vnode2 = new VNode('p', { style: { fontSize: '10px', display: 'block' }})
+    patch(null, vnode1)
+    const elm = patch(vnode1, vnode2)
+    expect(elm.style.fontSize).toBe('10px')
+    expect(elm.style.display).toBe('block')
+  })
+
+  it('should remove elements attrs', () => {
+    const vnode1 = new VNode('p', { style: { fontSize: '12px' }})
+    const vnode2 = new VNode('p', { style: { display: 'block' }})
+    patch(null, vnode1)
+    const elm = patch(vnode1, vnode2)
+    expect(elm.style.fontSize).toBe('')
+    expect(elm.style.display).toBe('block')
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/modules/vdom/patch/children.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/modules/vdom/patch/children.spec.js
new file mode 100644 (file)
index 0000000..ec4d521
--- /dev/null
@@ -0,0 +1,533 @@
+import { patch } from 'web/runtime/patch'
+import VNode, { createEmptyVNode } from 'core/vdom/vnode'
+
+function prop (name) {
+  return obj => { return obj[name] }
+}
+
+function map (fn, list) {
+  const ret = []
+  for (let i = 0; i < list.length; i++) {
+    ret[i] = fn(list[i])
+  }
+  return ret
+}
+
+function spanNum (n) {
+  if (typeof n === 'string') {
+    return new VNode('span', {}, undefined, n)
+  } else {
+    return new VNode('span', { key: n }, undefined, n.toString())
+  }
+}
+
+function shuffle (array) {
+  let currentIndex = array.length
+  let temporaryValue
+  let randomIndex
+
+  // while there remain elements to shuffle...
+  while (currentIndex !== 0) {
+    // pick a remaining element...
+    randomIndex = Math.floor(Math.random() * currentIndex)
+    currentIndex -= 1
+    // and swap it with the current element.
+    temporaryValue = array[currentIndex]
+    array[currentIndex] = array[randomIndex]
+    array[randomIndex] = temporaryValue
+  }
+  return array
+}
+
+const inner = prop('innerHTML')
+const tag = prop('tagName')
+
+describe('vdom patch: children', () => {
+  let vnode0
+  beforeEach(() => {
+    vnode0 = new VNode('p', { attrs: { id: '1' }}, [createTextVNode('hello world')])
+    patch(null, vnode0)
+  })
+
+  it('should appends elements', () => {
+    const vnode1 = new VNode('p', {}, [1].map(spanNum))
+    const vnode2 = new VNode('p', {}, [1, 2, 3].map(spanNum))
+    let elm = patch(vnode0, vnode1)
+    expect(elm.children.length).toBe(1)
+    elm = patch(vnode1, vnode2)
+    expect(elm.children.length).toBe(3)
+    expect(elm.children[1].innerHTML).toBe('2')
+    expect(elm.children[2].innerHTML).toBe('3')
+  })
+
+  it('should prepends elements', () => {
+    const vnode1 = new VNode('p', {}, [4, 5].map(spanNum))
+    const vnode2 = new VNode('p', {}, [1, 2, 3, 4, 5].map(spanNum))
+    let elm = patch(vnode0, vnode1)
+    expect(elm.children.length).toBe(2)
+    elm = patch(vnode1, vnode2)
+    expect(map(inner, elm.children)).toEqual(['1', '2', '3', '4', '5'])
+  })
+
+  it('should add elements in the middle', () => {
+    const vnode1 = new VNode('p', {}, [1, 2, 4, 5].map(spanNum))
+    const vnode2 = new VNode('p', {}, [1, 2, 3, 4, 5].map(spanNum))
+    let elm = patch(vnode0, vnode1)
+    expect(elm.children.length).toBe(4)
+    elm = patch(vnode1, vnode2)
+    expect(map(inner, elm.children)).toEqual(['1', '2', '3', '4', '5'])
+  })
+
+  it('should add elements at begin and end', () => {
+    const vnode1 = new VNode('p', {}, [2, 3, 4].map(spanNum))
+    const vnode2 = new VNode('p', {}, [1, 2, 3, 4, 5].map(spanNum))
+    let elm = patch(vnode0, vnode1)
+    expect(elm.children.length).toBe(3)
+    elm = patch(vnode1, vnode2)
+    expect(map(inner, elm.children)).toEqual(['1', '2', '3', '4', '5'])
+  })
+
+  it('should add children to parent with no children', () => {
+    const vnode1 = new VNode('p', { key: 'p' })
+    const vnode2 = new VNode('p', { key: 'p' }, [1, 2, 3].map(spanNum))
+    let elm = patch(vnode0, vnode1)
+    expect(elm.children.length).toBe(0)
+    elm = patch(vnode1, vnode2)
+    expect(map(inner, elm.children)).toEqual(['1', '2', '3'])
+  })
+
+  it('should remove all children from parent', () => {
+    const vnode1 = new VNode('p', { key: 'p' }, [1, 2, 3].map(spanNum))
+    const vnode2 = new VNode('p', { key: 'p' })
+    let elm = patch(vnode0, vnode1)
+    expect(map(inner, elm.children)).toEqual(['1', '2', '3'])
+    elm = patch(vnode1, vnode2)
+    expect(elm.children.length).toBe(0)
+  })
+
+  it('should remove elements from the beginning', () => {
+    const vnode1 = new VNode('p', {}, [1, 2, 3, 4, 5].map(spanNum))
+    const vnode2 = new VNode('p', {}, [3, 4, 5].map(spanNum))
+    let elm = patch(vnode0, vnode1)
+    expect(elm.children.length).toBe(5)
+    elm = patch(vnode1, vnode2)
+    expect(map(inner, elm.children)).toEqual(['3', '4', '5'])
+  })
+
+  it('should removes elements from end', () => {
+    const vnode1 = new VNode('p', {}, [1, 2, 3, 4, 5].map(spanNum))
+    const vnode2 = new VNode('p', {}, [1, 2, 3].map(spanNum))
+    let elm = patch(vnode0, vnode1)
+    expect(elm.children.length).toBe(5)
+    elm = patch(vnode1, vnode2)
+    expect(elm.children.length).toBe(3)
+    expect(map(inner, elm.children)).toEqual(['1', '2', '3'])
+  })
+
+  it('should remove elements from the middle', () => {
+    const vnode1 = new VNode('p', {}, [1, 2, 3, 4, 5].map(spanNum))
+    const vnode2 = new VNode('p', {}, [1, 2, 4, 5].map(spanNum))
+    let elm = patch(vnode0, vnode1)
+    expect(elm.children.length).toBe(5)
+    elm = patch(vnode1, vnode2)
+    expect(elm.children.length).toBe(4)
+    expect(map(inner, elm.children)).toEqual(['1', '2', '4', '5'])
+  })
+
+  it('should moves element forward', () => {
+    const vnode1 = new VNode('p', {}, [1, 2, 3, 4].map(spanNum))
+    const vnode2 = new VNode('p', {}, [2, 3, 1, 4].map(spanNum))
+    let elm = patch(vnode0, vnode1)
+    expect(elm.children.length).toBe(4)
+    elm = patch(vnode1, vnode2)
+    expect(elm.children.length).toBe(4)
+    expect(map(inner, elm.children)).toEqual(['2', '3', '1', '4'])
+  })
+
+  it('should move elements to end', () => {
+    const vnode1 = new VNode('p', {}, [1, 2, 3].map(spanNum))
+    const vnode2 = new VNode('p', {}, [2, 3, 1].map(spanNum))
+    let elm = patch(vnode0, vnode1)
+    expect(elm.children.length).toBe(3)
+    elm = patch(vnode1, vnode2)
+    expect(elm.children.length).toBe(3)
+    expect(map(inner, elm.children)).toEqual(['2', '3', '1'])
+  })
+
+  it('should move element backwards', () => {
+    const vnode1 = new VNode('p', {}, [1, 2, 3, 4].map(spanNum))
+    const vnode2 = new VNode('p', {}, [1, 4, 2, 3].map(spanNum))
+    let elm = patch(vnode0, vnode1)
+    expect(elm.children.length).toBe(4)
+    elm = patch(vnode1, vnode2)
+    expect(elm.children.length).toBe(4)
+    expect(map(inner, elm.children)).toEqual(['1', '4', '2', '3'])
+  })
+
+  it('should swap first and last', () => {
+    const vnode1 = new VNode('p', {}, [1, 2, 3, 4].map(spanNum))
+    const vnode2 = new VNode('p', {}, [4, 2, 3, 1].map(spanNum))
+    let elm = patch(vnode0, vnode1)
+    expect(elm.children.length).toBe(4)
+    elm = patch(vnode1, vnode2)
+    expect(elm.children.length).toBe(4)
+    expect(map(inner, elm.children)).toEqual(['4', '2', '3', '1'])
+  })
+
+  it('should move to left and replace', () => {
+    const vnode1 = new VNode('p', {}, [1, 2, 3, 4, 5].map(spanNum))
+    const vnode2 = new VNode('p', {}, [4, 1, 2, 3, 6].map(spanNum))
+    let elm = patch(vnode0, vnode1)
+    expect(elm.children.length).toBe(5)
+    elm = patch(vnode1, vnode2)
+    expect(elm.children.length).toBe(5)
+    expect(map(inner, elm.children)).toEqual(['4', '1', '2', '3', '6'])
+  })
+
+  it('should move to left and leaves hold', () => {
+    const vnode1 = new VNode('p', {}, [1, 4, 5].map(spanNum))
+    const vnode2 = new VNode('p', {}, [4, 6].map(spanNum))
+    let elm = patch(vnode0, vnode1)
+    expect(elm.children.length).toBe(3)
+    elm = patch(vnode1, vnode2)
+    expect(map(inner, elm.children)).toEqual(['4', '6'])
+  })
+
+  it('should handle moved and set to undefined element ending at the end', () => {
+    const vnode1 = new VNode('p', {}, [2, 4, 5].map(spanNum))
+    const vnode2 = new VNode('p', {}, [4, 5, 3].map(spanNum))
+    let elm = patch(vnode0, vnode1)
+    expect(elm.children.length).toBe(3)
+    elm = patch(vnode1, vnode2)
+    expect(elm.children.length).toBe(3)
+    expect(map(inner, elm.children)).toEqual(['4', '5', '3'])
+  })
+
+  it('should move a key in non-keyed nodes with a size up', () => {
+    const vnode1 = new VNode('p', {}, [1, 'a', 'b', 'c'].map(spanNum))
+    const vnode2 = new VNode('p', {}, ['d', 'a', 'b', 'c', 1, 'e'].map(spanNum))
+    let elm = patch(vnode0, vnode1)
+    expect(elm.children.length).toBe(4)
+    expect(elm.textContent, '1abc')
+    elm = patch(vnode1, vnode2)
+    expect(elm.children.length).toBe(6)
+    expect(elm.textContent, 'dabc1e')
+  })
+
+  it('should reverse element', () => {
+    const vnode1 = new VNode('p', {}, [1, 2, 3, 4, 5, 6, 7, 8].map(spanNum))
+    const vnode2 = new VNode('p', {}, [8, 7, 6, 5, 4, 3, 2, 1].map(spanNum))
+    let elm = patch(vnode0, vnode1)
+    expect(elm.children.length).toBe(8)
+    elm = patch(vnode1, vnode2)
+    expect(map(inner, elm.children)).toEqual(['8', '7', '6', '5', '4', '3', '2', '1'])
+  })
+
+  it('something', () => {
+    const vnode1 = new VNode('p', {}, [0, 1, 2, 3, 4, 5].map(spanNum))
+    const vnode2 = new VNode('p', {}, [4, 3, 2, 1, 5, 0].map(spanNum))
+    let elm = patch(vnode0, vnode1)
+    expect(elm.children.length).toBe(6)
+    elm = patch(vnode1, vnode2)
+    expect(map(inner, elm.children)).toEqual(['4', '3', '2', '1', '5', '0'])
+  })
+
+  it('should handle random shuffle', () => {
+    let n
+    let i
+    const arr = []
+    const opacities = []
+    const elms = 14
+    const samples = 5
+    function spanNumWithOpacity (n, o) {
+      return new VNode('span', { key: n, style: { opacity: o }}, undefined, n.toString())
+    }
+
+    for (n = 0; n < elms; ++n) { arr[n] = n }
+    for (n = 0; n < samples; ++n) {
+      const vnode1 = new VNode('span', {}, arr.map(n => {
+        return spanNumWithOpacity(n, '1')
+      }))
+      const shufArr = shuffle(arr.slice(0))
+      let elm = patch(vnode0, vnode1)
+      for (i = 0; i < elms; ++i) {
+        expect(elm.children[i].innerHTML).toBe(i.toString())
+        opacities[i] = Math.random().toFixed(5).toString()
+      }
+      const vnode2 = new VNode('span', {}, arr.map(n => {
+        return spanNumWithOpacity(shufArr[n], opacities[n])
+      }))
+      elm = patch(vnode1, vnode2)
+      for (i = 0; i < elms; ++i) {
+        expect(elm.children[i].innerHTML).toBe(shufArr[i].toString())
+        expect(opacities[i].indexOf(elm.children[i].style.opacity)).toBe(0)
+      }
+    }
+  })
+
+  it('should append elements with updating children without keys', () => {
+    const vnode1 = new VNode('div', {}, [
+      new VNode('span', {}, undefined, 'hello')
+    ])
+    const vnode2 = new VNode('div', {}, [
+      new VNode('span', {}, undefined, 'hello'),
+      new VNode('span', {}, undefined, 'world')
+    ])
+    let elm = patch(vnode0, vnode1)
+    expect(map(inner, elm.children)).toEqual(['hello'])
+    elm = patch(vnode1, vnode2)
+    expect(map(inner, elm.children)).toEqual(['hello', 'world'])
+  })
+
+  it('should handle unmoved text nodes with updating children without keys', () => {
+    const vnode1 = new VNode('div', {}, [
+      createTextVNode('text'),
+      new VNode('span', {}, undefined, 'hello')
+    ])
+    const vnode2 = new VNode('div', {}, [
+      createTextVNode('text'),
+      new VNode('span', {}, undefined, 'hello')
+    ])
+    let elm = patch(vnode0, vnode1)
+    expect(elm.childNodes[0].textContent).toBe('text')
+    elm = patch(vnode1, vnode2)
+    expect(elm.childNodes[0].textContent).toBe('text')
+  })
+
+  it('should handle changing text children with updating children without keys', () => {
+    const vnode1 = new VNode('div', {}, [
+      createTextVNode('text'),
+      new VNode('span', {}, undefined, 'hello')
+    ])
+    const vnode2 = new VNode('div', {}, [
+      createTextVNode('text2'),
+      new VNode('span', {}, undefined, 'hello')
+    ])
+    let elm = patch(vnode0, vnode1)
+    expect(elm.childNodes[0].textContent).toBe('text')
+    elm = patch(vnode1, vnode2)
+    expect(elm.childNodes[0].textContent).toBe('text2')
+  })
+
+  it('should prepend element with updating children without keys', () => {
+    const vnode1 = new VNode('div', {}, [
+      new VNode('span', {}, undefined, 'world')
+    ])
+    const vnode2 = new VNode('div', {}, [
+      new VNode('span', {}, undefined, 'hello'),
+      new VNode('span', {}, undefined, 'world')
+    ])
+    let elm = patch(vnode0, vnode1)
+    expect(map(inner, elm.children)).toEqual(['world'])
+    elm = patch(vnode1, vnode2)
+    expect(map(inner, elm.children)).toEqual(['hello', 'world'])
+  })
+
+  it('should prepend element of different tag type with updating children without keys', () => {
+    const vnode1 = new VNode('div', {}, [
+      new VNode('span', {}, undefined, 'world')
+    ])
+    const vnode2 = new VNode('div', {}, [
+      new VNode('div', {}, undefined, 'hello'),
+      new VNode('span', {}, undefined, 'world')
+    ])
+    let elm = patch(vnode0, vnode1)
+    expect(map(inner, elm.children)).toEqual(['world'])
+    elm = patch(vnode1, vnode2)
+    expect(map(prop('tagName'), elm.children)).toEqual(['DIV', 'SPAN'])
+    expect(map(inner, elm.children)).toEqual(['hello', 'world'])
+  })
+
+  it('should remove elements with updating children without keys', () => {
+    const vnode1 = new VNode('div', {}, [
+      new VNode('span', {}, undefined, 'one'),
+      new VNode('span', {}, undefined, 'two'),
+      new VNode('span', {}, undefined, 'three')
+    ])
+    const vnode2 = new VNode('div', {}, [
+      new VNode('span', {}, undefined, 'one'),
+      new VNode('span', {}, undefined, 'three')
+    ])
+    let elm = patch(vnode0, vnode1)
+    expect(map(inner, elm.children)).toEqual(['one', 'two', 'three'])
+    elm = patch(vnode1, vnode2)
+    expect(map(inner, elm.children)).toEqual(['one', 'three'])
+  })
+
+  it('should remove a single text node with updating children without keys', () => {
+    const vnode1 = new VNode('div', {}, undefined, 'one')
+    const vnode2 = new VNode('div', {})
+    let elm = patch(vnode0, vnode1)
+    expect(elm.textContent).toBe('one')
+    elm = patch(vnode1, vnode2)
+    expect(elm.textContent).toBe('')
+  })
+
+  it('should remove a single text node when children are updated', () => {
+    const vnode1 = new VNode('div', {}, undefined, 'one')
+    const vnode2 = new VNode('div', {}, [
+      new VNode('div', {}, undefined, 'two'),
+      new VNode('span', {}, undefined, 'three')
+    ])
+    let elm = patch(vnode0, vnode1)
+    expect(elm.textContent).toBe('one')
+    elm = patch(vnode1, vnode2)
+    expect(map(prop('textContent'), elm.childNodes)).toEqual(['two', 'three'])
+  })
+
+  it('should remove a text node among other elements', () => {
+    const vnode1 = new VNode('div', {}, [
+      createTextVNode('one'),
+      new VNode('span', {}, undefined, 'two')
+    ])
+    const vnode2 = new VNode('div', {}, [
+      new VNode('div', {}, undefined, 'three')
+    ])
+    let elm = patch(vnode0, vnode1)
+    expect(map(prop('textContent'), elm.childNodes)).toEqual(['one', 'two'])
+    elm = patch(vnode1, vnode2)
+    expect(elm.childNodes.length).toBe(1)
+    expect(elm.childNodes[0].tagName).toBe('DIV')
+    expect(elm.childNodes[0].textContent).toBe('three')
+  })
+
+  it('should reorder elements', () => {
+    const vnode1 = new VNode('div', {}, [
+      new VNode('span', {}, undefined, 'one'),
+      new VNode('div', {}, undefined, 'two'),
+      new VNode('b', {}, undefined, 'three')
+    ])
+    const vnode2 = new VNode('div', {}, [
+      new VNode('b', {}, undefined, 'three'),
+      new VNode('span', {}, undefined, 'two'),
+      new VNode('div', {}, undefined, 'one')
+    ])
+    let elm = patch(vnode0, vnode1)
+    expect(map(inner, elm.children)).toEqual(['one', 'two', 'three'])
+    elm = patch(vnode1, vnode2)
+    expect(map(inner, elm.children)).toEqual(['three', 'two', 'one'])
+  })
+
+  it('should handle children with the same key but with different tag', () => {
+    const vnode1 = new VNode('div', {}, [
+      new VNode('div', { key: 1 }, undefined, 'one'),
+      new VNode('div', { key: 2 }, undefined, 'two'),
+      new VNode('div', { key: 3 }, undefined, 'three'),
+      new VNode('div', { key: 4 }, undefined, 'four')
+    ])
+    const vnode2 = new VNode('div', {}, [
+      new VNode('div', { key: 4 }, undefined, 'four'),
+      new VNode('span', { key: 3 }, undefined, 'three'),
+      new VNode('span', { key: 2 }, undefined, 'two'),
+      new VNode('div', { key: 1 }, undefined, 'one')
+    ])
+    let elm = patch(vnode0, vnode1)
+    expect(map(tag, elm.children)).toEqual(['DIV', 'DIV', 'DIV', 'DIV'])
+    expect(map(inner, elm.children)).toEqual(['one', 'two', 'three', 'four'])
+    elm = patch(vnode1, vnode2)
+    expect(map(tag, elm.children)).toEqual(['DIV', 'SPAN', 'SPAN', 'DIV'])
+    expect(map(inner, elm.children)).toEqual(['four', 'three', 'two', 'one'])
+  })
+
+  it('should handle children with the same tag, same key, but one with data and one without data', () => {
+    const vnode1 = new VNode('div', {}, [
+      new VNode('div', { class: 'hi' }, undefined, 'one')
+    ])
+    const vnode2 = new VNode('div', {}, [
+      new VNode('div', undefined, undefined, 'four')
+    ])
+    let elm = patch(vnode0, vnode1)
+    const child1 = elm.children[0]
+    expect(child1.className).toBe('hi')
+    elm = patch(vnode1, vnode2)
+    const child2 = elm.children[0]
+    expect(child1).not.toBe(child2)
+    expect(child2.className).toBe('')
+  })
+
+  it('should handle static vnodes properly', () => {
+    function makeNode (text) {
+      return new VNode('div', undefined, [
+        new VNode(undefined, undefined, undefined, text)
+      ])
+    }
+    const b = makeNode('B')
+    b.isStatic = true
+    b.key = `__static__1`
+    const vnode1 = new VNode('div', {}, [makeNode('A'), b, makeNode('C')])
+    const vnode2 = new VNode('div', {}, [b])
+    const vnode3 = new VNode('div', {}, [makeNode('A'), b, makeNode('C')])
+
+    let elm = patch(vnode0, vnode1)
+    expect(elm.textContent).toBe('ABC')
+    elm = patch(vnode1, vnode2)
+    expect(elm.textContent).toBe('B')
+    elm = patch(vnode2, vnode3)
+    expect(elm.textContent).toBe('ABC')
+  })
+
+  it('should handle static vnodes inside ', () => {
+    function makeNode (text) {
+      return new VNode('div', undefined, [
+        new VNode(undefined, undefined, undefined, text)
+      ])
+    }
+    const b = makeNode('B')
+    b.isStatic = true
+    b.key = `__static__1`
+    const vnode1 = new VNode('div', {}, [makeNode('A'), b, makeNode('C')])
+    const vnode2 = new VNode('div', {}, [b])
+    const vnode3 = new VNode('div', {}, [makeNode('A'), b, makeNode('C')])
+
+    let elm = patch(vnode0, vnode1)
+    expect(elm.textContent).toBe('ABC')
+    elm = patch(vnode1, vnode2)
+    expect(elm.textContent).toBe('B')
+    elm = patch(vnode2, vnode3)
+    expect(elm.textContent).toBe('ABC')
+  })
+
+  // #6502
+  it('should not de-opt when both head and tail are changed', () => {
+    const vnode1 = new VNode('div', {}, [
+      createEmptyVNode(),
+      new VNode('div'),
+      createEmptyVNode()
+    ])
+    const vnode2 = new VNode('div', {}, [
+      new VNode('p'),
+      new VNode('div'),
+      new VNode('p')
+    ])
+    let root = patch(null, vnode1)
+    const original = root.childNodes[1]
+
+    root = patch(vnode1, vnode2)
+    const postPatch = root.childNodes[1]
+
+    expect(postPatch).toBe(original)
+  })
+
+  it('should warn with duplicate keys: createChildren', () => {
+    function makeNode (key) {
+      return new VNode('div', { key: key })
+    }
+
+    const vnode = new VNode('p', {}, ['b', 'a', 'c', 'b'].map(makeNode))
+    patch(null, vnode)
+    expect(`Duplicate keys detected: 'b'`).toHaveBeenWarned()
+  })
+
+  it('should warn with duplicate keys: updateChildren', () => {
+    function makeNode (key) {
+      return new VNode('div', { key: key })
+    }
+
+    const vnode2 = new VNode('p', {}, ['b', 'a', 'c', 'b'].map(makeNode))
+    const vnode3 = new VNode('p', {}, ['b', 'x', 'd', 'b'].map(makeNode))
+    patch(vnode0, vnode2)
+    expect(`Duplicate keys detected: 'b'`).toHaveBeenWarned()
+    patch(vnode2, vnode3)
+    expect(`Duplicate keys detected: 'b'`).toHaveBeenWarned()
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/modules/vdom/patch/edge-cases.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/modules/vdom/patch/edge-cases.spec.js
new file mode 100644 (file)
index 0000000..7555833
--- /dev/null
@@ -0,0 +1,409 @@
+import Vue from 'vue'
+
+describe('vdom patch: edge cases', () => {
+  // exposed by #3406
+  // When a static vnode is inside v-for, it's possible for the same vnode
+  // to be used in multiple places, and its element will be replaced. This
+  // causes patch errors when node ops depend on the vnode's element position.
+  it('should handle static vnodes by key', done => {
+    const vm = new Vue({
+      data: {
+        ok: true
+      },
+      template: `
+        <div>
+          <div v-for="i in 2">
+            <div v-if="ok">a</div><div>b</div><div v-if="!ok">c</div><div>d</div>
+          </div>
+        </div>
+      `
+    }).$mount()
+    expect(vm.$el.textContent).toBe('abdabd')
+    vm.ok = false
+    waitForUpdate(() => {
+      expect(vm.$el.textContent).toBe('bcdbcd')
+    }).then(done)
+  })
+
+  // exposed by #7705
+  // methods and function expressions with modifiers should return result instead of undefined
+  // skipped odd children[1,3, ...] because they are rendered as text nodes with undefined value
+  it('should return listener\'s result for method name and function expression with and w/o modifiers', done => {
+    const dummyEvt = { preventDefault: () => {} }
+    new Vue({
+      template: `
+        <div v-test>
+          <div @click="addFive"></div>
+          <div @click.prevent="addFive"></div>
+          <div @click="addFive($event, 5)"></div>
+          <div @click.prevent="addFive($event, 5)"></div>
+        </div>
+      `,
+      methods: {
+        addFive ($event, toAdd = 0) {
+          return toAdd + 5
+        }
+      },
+      directives: {
+        test: {
+          bind (el, binding, vnode) {
+            waitForUpdate(() => {
+              expect(vnode.children[0].data.on.click()).toBe(5)
+            }).then(() => {
+              expect(vnode.children[2].data.on.click(dummyEvt)).toBe(5)
+            }).then(() => {
+              expect(vnode.children[4].data.on.click()).not.toBeDefined()
+            }).then(() => {
+              expect(vnode.children[6].data.on.click(dummyEvt)).not.toBeDefined()
+            }).then(done)
+          }
+        }
+      }
+    }).$mount()
+  })
+
+  // #3533
+  // a static node is reused in createElm, which changes its elm reference
+  // and is inserted into a different parent.
+  // later when patching the next element a DOM insertion uses it as the
+  // reference node, causing a parent mismatch.
+  it('should handle static node edge case when it\'s reused AND used as a reference node for insertion', done => {
+    const vm = new Vue({
+      data: {
+        ok: true
+      },
+      template: `
+        <div>
+          <button @click="ok = !ok">toggle</button>
+          <div class="b" v-if="ok">123</div>
+          <div class="c">
+            <div><span/></div><p>{{ 1 }}</p>
+          </div>
+          <div class="d">
+            <label>{{ 2 }}</label>
+          </div>
+          <div class="b" v-if="ok">123</div>
+        </div>
+      `
+    }).$mount()
+
+    expect(vm.$el.querySelector('.c').textContent).toBe('1')
+    expect(vm.$el.querySelector('.d').textContent).toBe('2')
+    vm.ok = false
+    waitForUpdate(() => {
+      expect(vm.$el.querySelector('.c').textContent).toBe('1')
+      expect(vm.$el.querySelector('.d').textContent).toBe('2')
+    }).then(done)
+  })
+
+  it('should handle slot nodes being reused across render', done => {
+    const vm = new Vue({
+      template: `
+        <foo ref="foo">
+          <div>slot</div>
+        </foo>
+      `,
+      components: {
+        foo: {
+          data () {
+            return { ok: true }
+          },
+          render (h) {
+            const children = [
+              this.ok ? h('div', 'toggler ') : null,
+              h('div', [this.$slots.default, h('span', ' 1')]),
+              h('div', [h('label', ' 2')])
+            ]
+            return h('div', children)
+          }
+        }
+      }
+    }).$mount()
+    expect(vm.$el.textContent).toContain('toggler slot 1 2')
+    vm.$refs.foo.ok = false
+    waitForUpdate(() => {
+      expect(vm.$el.textContent).toContain('slot 1 2')
+      vm.$refs.foo.ok = true
+    }).then(() => {
+      expect(vm.$el.textContent).toContain('toggler slot 1 2')
+      vm.$refs.foo.ok = false
+    }).then(() => {
+      expect(vm.$el.textContent).toContain('slot 1 2')
+      vm.$refs.foo.ok = true
+    }).then(done)
+  })
+
+  it('should synchronize vm\' vnode', done => {
+    const comp = {
+      data: () => ({ swap: true }),
+      render (h) {
+        return this.swap
+          ? h('a', 'atag')
+          : h('span', 'span')
+      }
+    }
+
+    const wrapper = {
+      render: h => h('comp'),
+      components: { comp }
+    }
+
+    const vm = new Vue({
+      render (h) {
+        const children = [
+          h('wrapper'),
+          h('div', 'row')
+        ]
+        if (this.swap) {
+          children.reverse()
+        }
+        return h('div', children)
+      },
+      data: () => ({ swap: false }),
+      components: { wrapper }
+    }).$mount()
+
+    expect(vm.$el.innerHTML).toBe('<a>atag</a><div>row</div>')
+    const wrapperVm = vm.$children[0]
+    const compVm = wrapperVm.$children[0]
+    vm.swap = true
+    waitForUpdate(() => {
+      expect(compVm.$vnode.parent).toBe(wrapperVm.$vnode)
+      expect(vm.$el.innerHTML).toBe('<div>row</div><a>atag</a>')
+      vm.swap = false
+    }).then(() => {
+      expect(compVm.$vnode.parent).toBe(wrapperVm.$vnode)
+      expect(vm.$el.innerHTML).toBe('<a>atag</a><div>row</div>')
+      compVm.swap = false
+    }).then(() => {
+      expect(vm.$el.innerHTML).toBe('<span>span</span><div>row</div>')
+      expect(compVm.$vnode.parent).toBe(wrapperVm.$vnode)
+      vm.swap = true
+    }).then(() => {
+      expect(vm.$el.innerHTML).toBe('<div>row</div><span>span</span>')
+      expect(compVm.$vnode.parent).toBe(wrapperVm.$vnode)
+      vm.swap = true
+    }).then(done)
+  })
+
+  // #4530
+  it('should not reset value when patching between dynamic/static bindings', done => {
+    const vm = new Vue({
+      data: { ok: true },
+      template: `
+        <div>
+          <input type="button" v-if="ok" value="a">
+          <input type="button" :value="'b'">
+        </div>
+      `
+    }).$mount()
+    expect(vm.$el.children[0].value).toBe('a')
+    vm.ok = false
+    waitForUpdate(() => {
+      expect(vm.$el.children[0].value).toBe('b')
+      vm.ok = true
+    }).then(() => {
+      expect(vm.$el.children[0].value).toBe('a')
+    }).then(done)
+  })
+
+  // #6313
+  it('should not replace node when switching between text-like inputs', done => {
+    const vm = new Vue({
+      data: { show: false },
+      template: `
+        <div>
+          <input :type="show ? 'text' : 'password'">
+        </div>
+      `
+    }).$mount()
+    const node = vm.$el.children[0]
+    expect(vm.$el.children[0].type).toBe('password')
+    vm.$el.children[0].value = 'test'
+    vm.show = true
+    waitForUpdate(() => {
+      expect(vm.$el.children[0]).toBe(node)
+      expect(vm.$el.children[0].value).toBe('test')
+      expect(vm.$el.children[0].type).toBe('text')
+      vm.show = false
+    }).then(() => {
+      expect(vm.$el.children[0]).toBe(node)
+      expect(vm.$el.children[0].value).toBe('test')
+      expect(vm.$el.children[0].type).toBe('password')
+    }).then(done)
+  })
+
+  it('should properly patch nested HOC when root element is replaced', done => {
+    const vm = new Vue({
+      template: `<foo class="hello" ref="foo" />`,
+      components: {
+        foo: {
+          template: `<bar ref="bar" />`,
+          components: {
+            bar: {
+              template: `<div v-if="ok"></div><span v-else></span>`,
+              data () {
+                return { ok: true }
+              }
+            }
+          }
+        }
+      }
+    }).$mount()
+
+    expect(vm.$refs.foo.$refs.bar.$el.tagName).toBe('DIV')
+    expect(vm.$refs.foo.$refs.bar.$el.className).toBe(`hello`)
+
+    vm.$refs.foo.$refs.bar.ok = false
+    waitForUpdate(() => {
+      expect(vm.$refs.foo.$refs.bar.$el.tagName).toBe('SPAN')
+      expect(vm.$refs.foo.$refs.bar.$el.className).toBe(`hello`)
+    }).then(done)
+  })
+
+  // #6790
+  it('should not render undefined for empty nested arrays', () => {
+    const vm = new Vue({
+      template: `<div><template v-for="i in emptyArr"></template></div>`,
+      data: { emptyArr: [] }
+    }).$mount()
+    expect(vm.$el.textContent).toBe('')
+  })
+
+  // #6803
+  it('backwards compat with checkbox code generated before 2.4', () => {
+    const spy = jasmine.createSpy()
+    const vm = new Vue({
+      data: {
+        label: 'foobar',
+        name: 'foobar'
+      },
+      computed: {
+        value: {
+          get () {
+            return 1
+          },
+          set: spy
+        }
+      },
+      render (h) {
+        const _vm = this
+        return h('div', {},
+          [h('input', {
+            directives: [{
+              name: 'model',
+              rawName: 'v-model',
+              value: (_vm.value),
+              expression: 'value'
+            }],
+            attrs: {
+              'type': 'radio',
+              'name': _vm.name
+            },
+            domProps: {
+              'value': _vm.label,
+              'checked': _vm._q(_vm.value, _vm.label)
+            },
+            on: {
+              '__c': function ($event) {
+                _vm.value = _vm.label
+              }
+            }
+          })])
+      }
+    }).$mount()
+
+    document.body.appendChild(vm.$el)
+    vm.$el.children[0].click()
+    expect(spy).toHaveBeenCalled()
+  })
+
+  // #7041
+  it('transition children with only deep bindings should be patched on update', done => {
+    const vm = new Vue({
+      template: `
+      <div>
+        <transition>
+          <div :style="style"></div>
+        </transition>
+      </div>
+      `,
+      data: () => ({
+        style: { color: 'red' }
+      })
+    }).$mount()
+    expect(vm.$el.children[0].style.color).toBe('red')
+    vm.style.color = 'green'
+    waitForUpdate(() => {
+      expect(vm.$el.children[0].style.color).toBe('green')
+    }).then(done)
+  })
+
+  // #7294
+  it('should cleanup component inline events on patch when no events are present', done => {
+    const log = jasmine.createSpy()
+    const vm = new Vue({
+      data: { ok: true },
+      template: `
+        <div>
+          <foo v-if="ok" @custom="log"/>
+          <foo v-else/>
+        </div>
+      `,
+      components: {
+        foo: {
+          render () {}
+        }
+      },
+      methods: { log }
+    }).$mount()
+
+    vm.ok = false
+    waitForUpdate(() => {
+      vm.$children[0].$emit('custom')
+      expect(log).not.toHaveBeenCalled()
+    }).then(done)
+  })
+
+  // #6864
+  it('should not special-case boolean attributes for custom elements', () => {
+    Vue.config.ignoredElements = [/^custom-/]
+    const vm = new Vue({
+      template: `<div><custom-foo selected="1"/></div>`
+    }).$mount()
+    expect(vm.$el.querySelector('custom-foo').getAttribute('selected')).toBe('1')
+    Vue.config.ignoredElements = []
+  })
+
+  // #7805
+  it('should not cause duplicate init when components share data object', () => {
+    const Base = {
+      render (h) {
+        return h('div', this.$options.name)
+      }
+    }
+
+    const Foo = {
+      name: 'Foo',
+      extends: Base
+    }
+
+    const Bar = {
+      name: 'Bar',
+      extends: Base
+    }
+
+    const vm = new Vue({
+      render (h) {
+        const data = { staticClass: 'text-red' }
+
+        return h('div', [
+          h(Foo, data),
+          h(Bar, data)
+        ])
+      }
+    }).$mount()
+
+    expect(vm.$el.textContent).toBe('FooBar')
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/modules/vdom/patch/element.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/modules/vdom/patch/element.spec.js
new file mode 100644 (file)
index 0000000..09bf3fa
--- /dev/null
@@ -0,0 +1,60 @@
+import Vue from 'vue'
+import { patch } from 'web/runtime/patch'
+import VNode from 'core/vdom/vnode'
+
+describe('vdom patch: element', () => {
+  it('should create an element', () => {
+    const vnode = new VNode('p', { attrs: { id: '1' }}, [createTextVNode('hello world')])
+    const elm = patch(null, vnode)
+    expect(elm.tagName).toBe('P')
+    expect(elm.outerHTML).toBe('<p id="1">hello world</p>')
+  })
+
+  it('should create an element which having the namespace', () => {
+    const vnode = new VNode('svg', {})
+    vnode.ns = 'svg'
+    const elm = patch(null, vnode)
+    expect(elm.namespaceURI).toBe('http://www.w3.org/2000/svg')
+  })
+
+  const el = document.createElement('unknown')
+  // Android Browser <= 4.2 doesn't use correct class name,
+  // but it doesn't matter because no one's gonna use it as their primary
+  // development browser.
+  if (/HTMLUnknownElement/.test(el.toString())) {
+    it('should warn unknown element', () => {
+      const vnode = new VNode('unknown')
+      patch(null, vnode)
+      expect(`Unknown custom element: <unknown>`).toHaveBeenWarned()
+    })
+  }
+
+  it('should warn unknown element with hyphen', () => {
+    const vnode = new VNode('unknown-foo')
+    patch(null, vnode)
+    expect(`Unknown custom element: <unknown-foo>`).toHaveBeenWarned()
+  })
+
+  it('should create an elements which having text content', () => {
+    const vnode = new VNode('div', {}, [createTextVNode('hello world')])
+    const elm = patch(null, vnode)
+    expect(elm.innerHTML).toBe('hello world')
+  })
+
+  it('should create create an elements which having span and text content', () => {
+    const vnode = new VNode('div', {}, [
+      new VNode('span'),
+      createTextVNode('hello world')
+    ])
+    const elm = patch(null, vnode)
+    expect(elm.childNodes[0].tagName).toBe('SPAN')
+    expect(elm.childNodes[1].textContent).toBe('hello world')
+  })
+
+  it('should create element with scope attribute', () => {
+    const vnode = new VNode('div')
+    vnode.context = new Vue({ _scopeId: 'foo' })
+    const elm = patch(null, vnode)
+    expect(elm.hasAttribute('foo')).toBe(true)
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/modules/vdom/patch/hooks.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/modules/vdom/patch/hooks.spec.js
new file mode 100644 (file)
index 0000000..dbb7ee3
--- /dev/null
@@ -0,0 +1,321 @@
+import { patch } from 'web/runtime/patch'
+import { createPatchFunction } from 'core/vdom/patch'
+import baseModules from 'core/vdom/modules/index'
+import * as nodeOps from 'web/runtime/node-ops'
+import platformModules from 'web/runtime/modules/index'
+import VNode from 'core/vdom/vnode'
+
+const modules = baseModules.concat(platformModules)
+
+describe('vdom patch: hooks', () => {
+  let vnode0
+  beforeEach(() => {
+    vnode0 = new VNode('p', { attrs: { id: '1' }}, [createTextVNode('hello world')])
+    patch(null, vnode0)
+  })
+
+  it('should call `insert` listener after both parents, siblings and children have been inserted', () => {
+    const result = []
+    function insert (vnode) {
+      expect(vnode.elm.children.length).toBe(2)
+      expect(vnode.elm.parentNode.children.length).toBe(3)
+      result.push(vnode)
+    }
+    const vnode1 = new VNode('div', {}, [
+      new VNode('span', {}, undefined, 'first sibling'),
+      new VNode('div', { hook: { insert }}, [
+        new VNode('span', {}, undefined, 'child 1'),
+        new VNode('span', {}, undefined, 'child 2')
+      ]),
+      new VNode('span', {}, undefined, 'can touch me')
+    ])
+    patch(vnode0, vnode1)
+    expect(result.length).toBe(1)
+  })
+
+  it('should call `prepatch` listener', () => {
+    const result = []
+    function prepatch (oldVnode, newVnode) {
+      expect(oldVnode).toEqual(vnode1.children[1])
+      expect(newVnode).toEqual(vnode2.children[1])
+      result.push(newVnode)
+    }
+    const vnode1 = new VNode('div', {}, [
+      new VNode('span', {}, undefined, 'first sibling'),
+      new VNode('div', { hook: { prepatch }}, [
+        new VNode('span', {}, undefined, 'child 1'),
+        new VNode('span', {}, undefined, 'child 2')
+      ])
+    ])
+    const vnode2 = new VNode('div', {}, [
+      new VNode('span', {}, undefined, 'first sibling'),
+      new VNode('div', { hook: { prepatch }}, [
+        new VNode('span', {}, undefined, 'child 1'),
+        new VNode('span', {}, undefined, 'child 2')
+      ])
+    ])
+    patch(vnode0, vnode1)
+    patch(vnode1, vnode2)
+    expect(result.length).toBe(1)
+  })
+
+  it('should call `postpatch` after `prepatch` listener', () => {
+    const pre = []
+    const post = []
+    function prepatch (oldVnode, newVnode) {
+      pre.push(pre)
+    }
+    function postpatch (oldVnode, newVnode) {
+      expect(pre.length).toBe(post.length + 1)
+      post.push(post)
+    }
+    const vnode1 = new VNode('div', {}, [
+      new VNode('span', {}, undefined, 'first sibling'),
+      new VNode('div', { hook: { prepatch, postpatch }}, [
+        new VNode('span', {}, undefined, 'child 1'),
+        new VNode('span', {}, undefined, 'child 2')
+      ])
+    ])
+    const vnode2 = new VNode('div', {}, [
+      new VNode('span', {}, undefined, 'first sibling'),
+      new VNode('div', { hook: { prepatch, postpatch }}, [
+        new VNode('span', {}, undefined, 'child 1'),
+        new VNode('span', {}, undefined, 'child 2')
+      ])
+    ])
+    patch(vnode0, vnode1)
+    patch(vnode1, vnode2)
+    expect(pre.length).toBe(1)
+    expect(post.length).toBe(1)
+  })
+
+  it('should call `update` listener', () => {
+    const result1 = []
+    const result2 = []
+    function cb (result, oldVnode, newVnode) {
+      if (result.length > 1) {
+        expect(result[result.length - 1]).toEqual(oldVnode)
+      }
+      result.push(newVnode)
+    }
+    const vnode1 = new VNode('div', {}, [
+      new VNode('span', {}, undefined, 'first sibling'),
+      new VNode('div', { hook: { update: cb.bind(null, result1) }}, [
+        new VNode('span', {}, undefined, 'child 1'),
+        new VNode('span', { hook: { update: cb.bind(null, result2) }}, undefined, 'child 2')
+      ])
+    ])
+    const vnode2 = new VNode('div', {}, [
+      new VNode('span', {}, undefined, 'first sibling'),
+      new VNode('div', { hook: { update: cb.bind(null, result1) }}, [
+        new VNode('span', {}, undefined, 'child 1'),
+        new VNode('span', { hook: { update: cb.bind(null, result2) }}, undefined, 'child 2')
+      ])
+    ])
+    patch(vnode0, vnode1)
+    patch(vnode1, vnode2)
+    expect(result1.length).toBe(1)
+    expect(result2.length).toBe(1)
+  })
+
+  it('should call `remove` listener', () => {
+    const result = []
+    function remove (vnode, rm) {
+      const parent = vnode.elm.parentNode
+      expect(vnode.elm.children.length).toBe(2)
+      expect(vnode.elm.children.length).toBe(2)
+      result.push(vnode)
+      rm()
+      expect(parent.children.length).toBe(1)
+    }
+    const vnode1 = new VNode('div', {}, [
+      new VNode('span', {}, undefined, 'first sibling'),
+      new VNode('div', { hook: { remove }}, [
+        new VNode('span', {}, undefined, 'child 1'),
+        new VNode('span', {}, undefined, 'child 2')
+      ])
+    ])
+    const vnode2 = new VNode('div', {}, [
+      new VNode('span', {}, undefined, 'first sibling')
+    ])
+    patch(vnode0, vnode1)
+    patch(vnode1, vnode2)
+    expect(result.length).toBe(1)
+  })
+
+  it('should call `init` and `prepatch` listeners on root', () => {
+    let count = 0
+    function init (vnode) { count++ }
+    function prepatch (oldVnode, newVnode) { count++ }
+    const vnode1 = new VNode('div', { hook: { init, prepatch }})
+    patch(vnode0, vnode1)
+    expect(count).toBe(1)
+    const vnode2 = new VNode('span', { hook: { init, prepatch }})
+    patch(vnode1, vnode2)
+    expect(count).toBe(2)
+  })
+
+  it('should remove element when all remove listeners are done', () => {
+    let rm1, rm2, rm3
+    const patch1 = createPatchFunction({
+      nodeOps,
+      modules: modules.concat([
+        { remove (_, rm) { rm1 = rm } },
+        { remove (_, rm) { rm2 = rm } }
+      ])
+    })
+    const vnode1 = new VNode('div', {}, [
+      new VNode('a', { hook: { remove (_, rm) { rm3 = rm } }})
+    ])
+    const vnode2 = new VNode('div', {}, [])
+    let elm = patch1(vnode0, vnode1)
+    expect(elm.children.length).toBe(1)
+    elm = patch1(vnode1, vnode2)
+    expect(elm.children.length).toBe(1)
+    rm1()
+    expect(elm.children.length).toBe(1)
+    rm3()
+    expect(elm.children.length).toBe(1)
+    rm2()
+    expect(elm.children.length).toBe(0)
+  })
+
+  it('should invoke the remove hook on replaced root', () => {
+    const result = []
+    const parent = nodeOps.createElement('div')
+    vnode0 = nodeOps.createElement('div')
+    parent.appendChild(vnode0)
+    function remove (vnode, rm) {
+      result.push(vnode)
+      rm()
+    }
+    const vnode1 = new VNode('div', { hook: { remove }}, [
+      new VNode('b', {}, undefined, 'child 1'),
+      new VNode('i', {}, undefined, 'child 2')
+    ])
+    const vnode2 = new VNode('span', {}, [
+      new VNode('b', {}, undefined, 'child 1'),
+      new VNode('i', {}, undefined, 'child 2')
+    ])
+    patch(vnode0, vnode1)
+    patch(vnode1, vnode2)
+    expect(result.length).toBe(1)
+  })
+
+  it('should invoke global `destroy` hook for all removed children', () => {
+    const result = []
+    function destroy (vnode) { result.push(vnode) }
+    const vnode1 = new VNode('div', {}, [
+      new VNode('span', {}, undefined, 'first sibling'),
+      new VNode('div', {}, [
+        new VNode('span', { hook: { destroy }}, undefined, 'child 1'),
+        new VNode('span', {}, undefined, 'child 2')
+      ])
+    ])
+    const vnode2 = new VNode('div')
+    patch(vnode0, vnode1)
+    patch(vnode1, vnode2)
+    expect(result.length).toBe(1)
+  })
+
+  it('should handle text vnodes with `undefined` `data` property', () => {
+    const vnode1 = new VNode('div', {}, [createTextVNode(' ')])
+    const vnode2 = new VNode('div', {}, [])
+    patch(vnode0, vnode1)
+    patch(vnode1, vnode2)
+  })
+
+  it('should invoke `destroy` module hook for all removed children', () => {
+    let created = 0
+    let destroyed = 0
+    const patch1 = createPatchFunction({
+      nodeOps,
+      modules: modules.concat([
+        { create () { created++ } },
+        { destroy () { destroyed++ } }
+      ])
+    })
+    const vnode1 = new VNode('div', {}, [
+      new VNode('span', {}, undefined, 'first sibling'),
+      new VNode('div', {}, [
+        new VNode('span', {}, undefined, 'child 1'),
+        new VNode('span', {}, undefined, 'child 2')
+      ])
+    ])
+    const vnode2 = new VNode('div', {})
+    patch1(vnode0, vnode1)
+    expect(destroyed).toBe(1) // should invoke for replaced root nodes too
+    patch1(vnode1, vnode2)
+    expect(created).toBe(5)
+    expect(destroyed).toBe(5)
+  })
+
+  it('should not invoke `create` and `remove` module hook for text nodes', () => {
+    let created = 0
+    let removed = 0
+    const patch1 = createPatchFunction({
+      nodeOps,
+      modules: modules.concat([
+        { create () { created++ } },
+        { remove () { removed++ } }
+      ])
+    })
+    const vnode1 = new VNode('div', {}, [
+      new VNode('span', {}, undefined, 'first child'),
+      createTextVNode(''),
+      new VNode('span', {}, undefined, 'third child')
+    ])
+    const vnode2 = new VNode('div', {})
+    patch1(vnode0, vnode1)
+    patch1(vnode1, vnode2)
+    expect(created).toBe(3)
+    expect(removed).toBe(2)
+  })
+
+  it('should not invoke `destroy` module hook for text nodes', () => {
+    let created = 0
+    let destroyed = 0
+    const patch1 = createPatchFunction({
+      nodeOps,
+      modules: modules.concat([
+        { create () { created++ } },
+        { destroy () { destroyed++ } }
+      ])
+    })
+    const vnode1 = new VNode('div', {}, [
+      new VNode('span', {}, undefined, 'first sibling'),
+      new VNode('div', {}, [
+        new VNode('span', {}, undefined, 'child 1'),
+        new VNode('span', {}, [
+          createTextVNode('text1'),
+          createTextVNode('text2')
+        ])
+      ])
+    ])
+    const vnode2 = new VNode('div', {})
+    patch1(vnode0, vnode1)
+    expect(destroyed).toBe(1) // should invoke for replaced root nodes too
+    patch1(vnode1, vnode2)
+    expect(created).toBe(5)
+    expect(destroyed).toBe(5)
+  })
+
+  it('should call `create` listener before inserted into parent but after children', () => {
+    const result = []
+    function create (empty, vnode) {
+      expect(vnode.elm.children.length).toBe(2)
+      expect(vnode.elm.parentNode).toBe(null)
+      result.push(vnode)
+    }
+    const vnode1 = new VNode('div', {}, [
+      new VNode('span', {}, undefined, 'first sibling'),
+      new VNode('div', { hook: { create }}, [
+        new VNode('span', {}, undefined, 'child 1'),
+        new VNode('span', {}, undefined, 'child 2')
+      ]),
+      new VNode('span', {}, undefined, 'can\'t touch me')
+    ])
+    patch(vnode0, vnode1)
+    expect(result.length).toBe(1)
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/unit/modules/vdom/patch/hydration.spec.js b/advancedcontentfilter/vendor/asset/vue/test/unit/modules/vdom/patch/hydration.spec.js
new file mode 100644 (file)
index 0000000..930ad47
--- /dev/null
@@ -0,0 +1,391 @@
+import Vue from 'vue'
+import VNode from 'core/vdom/vnode'
+import { patch } from 'web/runtime/patch'
+import { SSR_ATTR } from 'shared/constants'
+
+function createMockSSRDOM (innerHTML) {
+  const dom = document.createElement('div')
+  dom.setAttribute(SSR_ATTR, 'true')
+  dom.innerHTML = innerHTML
+  return dom
+}
+
+describe('vdom patch: hydration', () => {
+  let vnode0
+  beforeEach(() => {
+    vnode0 = new VNode('p', { attrs: { id: '1' }}, [createTextVNode('hello world')])
+    patch(null, vnode0)
+  })
+
+  it('should hydrate elements when server-rendered DOM tree is same as virtual DOM tree', () => {
+    const result = []
+    function init (vnode) { result.push(vnode) }
+    function createServerRenderedDOM () {
+      const root = document.createElement('div')
+      root.setAttribute(SSR_ATTR, 'true')
+      const span = document.createElement('span')
+      root.appendChild(span)
+      const div = document.createElement('div')
+      const child1 = document.createElement('span')
+      const child2 = document.createElement('span')
+      child1.textContent = 'hi'
+      child2.textContent = 'ho'
+      div.appendChild(child1)
+      div.appendChild(child2)
+      root.appendChild(div)
+      return root
+    }
+    const node0 = createServerRenderedDOM()
+    const vnode1 = new VNode('div', {}, [
+      new VNode('span', {}),
+      new VNode('div', { hook: { init }}, [
+        new VNode('span', {}, [new VNode(undefined, undefined, undefined, 'hi')]),
+        new VNode('span', {}, [new VNode(undefined, undefined, undefined, 'ho')])
+      ])
+    ])
+    patch(node0, vnode1)
+    expect(result.length).toBe(1)
+
+    function traverseAndAssert (vnode, element) {
+      expect(vnode.elm).toBe(element)
+      if (vnode.children) {
+        vnode.children.forEach((node, i) => {
+          traverseAndAssert(node, element.childNodes[i])
+        })
+      }
+    }
+    // ensure vnodes are correctly associated with actual DOM
+    traverseAndAssert(vnode1, node0)
+
+    // check update
+    const vnode2 = new VNode('div', { attrs: { id: 'foo' }}, [
+      new VNode('span', { attrs: { id: 'bar' }}),
+      new VNode('div', { hook: { init }}, [
+        new VNode('span', {}),
+        new VNode('span', {})
+      ])
+    ])
+    patch(vnode1, vnode2)
+    expect(node0.id).toBe('foo')
+    expect(node0.children[0].id).toBe('bar')
+  })
+
+  it('should warn message that virtual DOM tree is not matching when hydrate element', () => {
+    function createServerRenderedDOM () {
+      const root = document.createElement('div')
+      root.setAttribute(SSR_ATTR, 'true')
+      const span = document.createElement('span')
+      root.appendChild(span)
+      const div = document.createElement('div')
+      const child1 = document.createElement('span')
+      div.appendChild(child1)
+      root.appendChild(div)
+      return root
+    }
+    const node0 = createServerRenderedDOM()
+    const vnode1 = new VNode('div', {}, [
+      new VNode('span', {}),
+      new VNode('div', {}, [
+        new VNode('span', {}),
+        new VNode('span', {})
+      ])
+    ])
+    patch(node0, vnode1)
+    expect('The client-side rendered virtual DOM tree is not matching').toHaveBeenWarned()
+  })
+
+  // component hydration is better off with a more e2e approach
+  it('should hydrate components when server-rendered DOM tree is same as virtual DOM tree', done => {
+    const dom = createMockSSRDOM('<span>foo</span><div class="b a"><span>foo qux</span></div><!---->')
+    const originalNode1 = dom.children[0]
+    const originalNode2 = dom.children[1]
+
+    const vm = new Vue({
+      template: '<div><span>{{msg}}</span><test class="a" :msg="msg"></test><p v-if="ok"></p></div>',
+      data: {
+        msg: 'foo',
+        ok: false
+      },
+      components: {
+        test: {
+          props: ['msg'],
+          data () {
+            return { a: 'qux' }
+          },
+          template: '<div class="b"><span>{{msg}} {{a}}</span></div>'
+        }
+      }
+    })
+
+    expect(() => { vm.$mount(dom) }).not.toThrow()
+    expect('not matching server-rendered content').not.toHaveBeenWarned()
+    expect(vm.$el).toBe(dom)
+    expect(vm.$children[0].$el).toBe(originalNode2)
+    expect(vm.$el.children[0]).toBe(originalNode1)
+    expect(vm.$el.children[1]).toBe(originalNode2)
+    vm.msg = 'bar'
+    waitForUpdate(() => {
+      expect(vm.$el.innerHTML).toBe('<span>bar</span><div class="b a"><span>bar qux</span></div><!---->')
+      vm.$children[0].a = 'ququx'
+    }).then(() => {
+      expect(vm.$el.innerHTML).toBe('<span>bar</span><div class="b a"><span>bar ququx</span></div><!---->')
+      vm.ok = true
+    }).then(() => {
+      expect(vm.$el.innerHTML).toBe('<span>bar</span><div class="b a"><span>bar ququx</span></div><p></p>')
+    }).then(done)
+  })
+
+  it('should warn failed hydration for non-matching DOM in child component', () => {
+    const dom = createMockSSRDOM('<div><span></span></div>')
+
+    new Vue({
+      template: '<div><test></test></div>',
+      components: {
+        test: {
+          template: '<div><a></a></div>'
+        }
+      }
+    }).$mount(dom)
+
+    expect('not matching server-rendered content').toHaveBeenWarned()
+  })
+
+  it('should warn failed hydration when component is not properly registered', () => {
+    const dom = createMockSSRDOM('<div><foo></foo></div>')
+
+    new Vue({
+      template: '<div><foo></foo></div>'
+    }).$mount(dom)
+
+    expect('not matching server-rendered content').toHaveBeenWarned()
+    expect('Unknown custom element: <foo>').toHaveBeenWarned()
+  })
+
+  it('should overwrite textNodes in the correct position but with mismatching text without warning', () => {
+    const dom = createMockSSRDOM('<div><span>foo</span></div>')
+
+    new Vue({
+      template: '<div><test></test></div>',
+      components: {
+        test: {
+          data () {
+            return { a: 'qux' }
+          },
+          template: '<div><span>{{a}}</span></div>'
+        }
+      }
+    }).$mount(dom)
+
+    expect('not matching server-rendered content').not.toHaveBeenWarned()
+    expect(dom.querySelector('span').textContent).toBe('qux')
+  })
+
+  it('should pick up elements with no children and populate without warning', done => {
+    const dom = createMockSSRDOM('<div><span></span></div>')
+    const span = dom.querySelector('span')
+
+    const vm = new Vue({
+      template: '<div><test></test></div>',
+      components: {
+        test: {
+          data () {
+            return { a: 'qux' }
+          },
+          template: '<div><span>{{a}}</span></div>'
+        }
+      }
+    }).$mount(dom)
+
+    expect('not matching server-rendered content').not.toHaveBeenWarned()
+    expect(span).toBe(vm.$el.querySelector('span'))
+    expect(vm.$el.innerHTML).toBe('<div><span>qux</span></div>')
+
+    vm.$children[0].a = 'foo'
+    waitForUpdate(() => {
+      expect(vm.$el.innerHTML).toBe('<div><span>foo</span></div>')
+    }).then(done)
+  })
+
+  it('should hydrate async component', done => {
+    const dom = createMockSSRDOM('<span>foo</span>')
+    const span = dom.querySelector('span')
+
+    const Foo = resolve => setTimeout(() => {
+      resolve({
+        data: () => ({ msg: 'foo' }),
+        template: `<span>{{ msg }}</span>`
+      })
+    }, 0)
+
+    const vm = new Vue({
+      template: '<div><foo ref="foo" /></div>',
+      components: { Foo }
+    }).$mount(dom)
+
+    expect('not matching server-rendered content').not.toHaveBeenWarned()
+    expect(dom.innerHTML).toBe('<span>foo</span>')
+    expect(vm.$refs.foo).toBeUndefined()
+
+    setTimeout(() => {
+      expect(dom.innerHTML).toBe('<span>foo</span>')
+      expect(vm.$refs.foo).not.toBeUndefined()
+      vm.$refs.foo.msg = 'bar'
+      waitForUpdate(() => {
+        expect(dom.innerHTML).toBe('<span>bar</span>')
+        expect(dom.querySelector('span')).toBe(span)
+      }).then(done)
+    }, 50)
+  })
+
+  it('should hydrate async component without showing loading', done => {
+    const dom = createMockSSRDOM('<span>foo</span>')
+    const span = dom.querySelector('span')
+
+    const Foo = () => ({
+      component: new Promise(resolve => {
+        setTimeout(() => {
+          resolve({
+            data: () => ({ msg: 'foo' }),
+            template: `<span>{{ msg }}</span>`
+          })
+        }, 10)
+      }),
+      delay: 1,
+      loading: {
+        render: h => h('span', 'loading')
+      }
+    })
+
+    const vm = new Vue({
+      template: '<div><foo ref="foo" /></div>',
+      components: { Foo }
+    }).$mount(dom)
+
+    expect('not matching server-rendered content').not.toHaveBeenWarned()
+    expect(dom.innerHTML).toBe('<span>foo</span>')
+    expect(vm.$refs.foo).toBeUndefined()
+
+    setTimeout(() => {
+      expect(dom.innerHTML).toBe('<span>foo</span>')
+    }, 2)
+
+    setTimeout(() => {
+      expect(dom.innerHTML).toBe('<span>foo</span>')
+      expect(vm.$refs.foo).not.toBeUndefined()
+      vm.$refs.foo.msg = 'bar'
+      waitForUpdate(() => {
+        expect(dom.innerHTML).toBe('<span>bar</span>')
+        expect(dom.querySelector('span')).toBe(span)
+      }).then(done)
+    }, 50)
+  })
+
+  it('should hydrate async component by replacing DOM if error occurs', done => {
+    const dom = createMockSSRDOM('<span>foo</span>')
+
+    const Foo = () => ({
+      component: new Promise((resolve, reject) => {
+        setTimeout(() => {
+          reject('something went wrong')
+        }, 10)
+      }),
+      error: {
+        render: h => h('span', 'error')
+      }
+    })
+
+    new Vue({
+      template: '<div><foo ref="foo" /></div>',
+      components: { Foo }
+    }).$mount(dom)
+
+    expect('not matching server-rendered content').not.toHaveBeenWarned()
+    expect(dom.innerHTML).toBe('<span>foo</span>')
+
+    setTimeout(() => {
+      expect('Failed to resolve async').toHaveBeenWarned()
+      expect(dom.innerHTML).toBe('<span>error</span>')
+      done()
+    }, 50)
+  })
+
+  it('should hydrate v-html with children', () => {
+    const dom = createMockSSRDOM('<span>foo</span>')
+
+    new Vue({
+      data: {
+        html: `<span>foo</span>`
+      },
+      template: `<div v-html="html">hello</div>`
+    }).$mount(dom)
+
+    expect('not matching server-rendered content').not.toHaveBeenWarned()
+  })
+
+  it('should warn mismatching v-html', () => {
+    const dom = createMockSSRDOM('<span>bar</span>')
+
+    new Vue({
+      data: {
+        html: `<span>foo</span>`
+      },
+      template: `<div v-html="html">hello</div>`
+    }).$mount(dom)
+
+    expect('not matching server-rendered content').toHaveBeenWarned()
+  })
+
+  it('should hydrate with adjacent text nodes from array children (e.g. slots)', () => {
+    const dom = createMockSSRDOM('<div>foo</div> hello')
+
+    new Vue({
+      template: `<test>hello</test>`,
+      components: {
+        test: {
+          template: `
+            <div>
+              <div>foo</div>
+              <slot/>
+            </div>
+          `
+        }
+      }
+    }).$mount(dom)
+    expect('not matching server-rendered content').not.toHaveBeenWarned()
+  })
+
+  // #7063
+  it('should properly initialize dynamic style bindings for future updates', done => {
+    const dom = createMockSSRDOM('<div style="padding-left:0px"></div>')
+
+    const vm = new Vue({
+      data: {
+        style: { paddingLeft: '0px' }
+      },
+      template: `<div><div :style="style"></div></div>`
+    }).$mount(dom)
+
+    // should update
+    vm.style.paddingLeft = '100px'
+    waitForUpdate(() => {
+      expect(dom.children[0].style.paddingLeft).toBe('100px')
+    }).then(done)
+  })
+
+  it('should properly initialize dynamic class bindings for future updates', done => {
+    const dom = createMockSSRDOM('<div class="foo bar"></div>')
+
+    const vm = new Vue({
+      data: {
+        cls: [{ foo: true }, 'bar']
+      },
+      template: `<div><div :class="cls"></div></div>`
+    }).$mount(dom)
+
+    // should update
+    vm.cls[0].foo = false
+    waitForUpdate(() => {
+      expect(dom.children[0].className).toBe('bar')
+    }).then(done)
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/weex/.eslintrc b/advancedcontentfilter/vendor/asset/vue/test/weex/.eslintrc
new file mode 100644 (file)
index 0000000..dab5d0e
--- /dev/null
@@ -0,0 +1,9 @@
+{
+  "env": {
+    "jasmine": true
+  },
+  "plugins": ["jasmine"],
+  "rules": {
+    "jasmine/no-focused-tests": 2
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/test/weex/cases/cases.spec.js b/advancedcontentfilter/vendor/asset/vue/test/weex/cases/cases.spec.js
new file mode 100644 (file)
index 0000000..ad7ff73
--- /dev/null
@@ -0,0 +1,237 @@
+import {
+  readFile,
+  readObject,
+  compileVue,
+  compileWithDeps,
+  createInstance,
+  addTaskHook,
+  resetTaskHook,
+  getRoot,
+  getEvents,
+  fireEvent
+} from '../helpers'
+
+// Create one-off render test case
+function createRenderTestCase (name) {
+  const source = readFile(`${name}.vue`)
+  const target = readObject(`${name}.vdom.js`)
+  return done => {
+    compileVue(source).then(code => {
+      const id = String(Date.now() * Math.random())
+      const instance = createInstance(id, code)
+      setTimeout(() => {
+        expect(getRoot(instance)).toEqual(target)
+        instance.$destroy()
+        done()
+      }, 50)
+    }).catch(done.fail)
+  }
+}
+
+// Create event test case, will trigger the first bind event
+function createEventTestCase (name) {
+  const source = readFile(`${name}.vue`)
+  const before = readObject(`${name}.before.vdom.js`)
+  const after = readObject(`${name}.after.vdom.js`)
+  return done => {
+    compileVue(source).then(code => {
+      const id = String(Date.now() * Math.random())
+      const instance = createInstance(id, code)
+      setTimeout(() => {
+        expect(getRoot(instance)).toEqual(before)
+        const event = getEvents(instance)[0]
+        fireEvent(instance, event.ref, event.type, {})
+        setTimeout(() => {
+          expect(getRoot(instance)).toEqual(after)
+          instance.$destroy()
+          done()
+        }, 50)
+      }, 50)
+    }).catch(done.fail)
+  }
+}
+
+describe('Usage', () => {
+  describe('render', () => {
+    it('sample', createRenderTestCase('render/sample'))
+  })
+
+  describe('event', () => {
+    it('click', createEventTestCase('event/click'))
+  })
+
+  describe('recycle-list', () => {
+    it('text node', createRenderTestCase('recycle-list/text-node'))
+    it('attributes', createRenderTestCase('recycle-list/attrs'))
+    // it('class name', createRenderTestCase('recycle-list/classname'))
+    it('inline style', createRenderTestCase('recycle-list/inline-style'))
+    it('v-if', createRenderTestCase('recycle-list/v-if'))
+    it('v-else', createRenderTestCase('recycle-list/v-else'))
+    it('v-else-if', createRenderTestCase('recycle-list/v-else-if'))
+    it('v-for', createRenderTestCase('recycle-list/v-for'))
+    it('v-for-iterator', createRenderTestCase('recycle-list/v-for-iterator'))
+    it('v-on', createRenderTestCase('recycle-list/v-on'))
+    it('v-on-inline', createRenderTestCase('recycle-list/v-on-inline'))
+    it('v-once', createRenderTestCase('recycle-list/v-once'))
+
+    it('stateless component', done => {
+      compileWithDeps('recycle-list/components/stateless.vue', [{
+        name: 'banner',
+        path: 'recycle-list/components/banner.vue'
+      }]).then(code => {
+        const id = String(Date.now() * Math.random())
+        const instance = createInstance(id, code)
+        setTimeout(() => {
+          const target = readObject('recycle-list/components/stateless.vdom.js')
+          expect(getRoot(instance)).toEqual(target)
+          instance.$destroy()
+          done()
+        }, 50)
+      }).catch(done.fail)
+    })
+
+    it('stateless component with props', done => {
+      compileWithDeps('recycle-list/components/stateless-with-props.vue', [{
+        name: 'poster',
+        path: 'recycle-list/components/poster.vue'
+      }]).then(code => {
+        const id = String(Date.now() * Math.random())
+        const instance = createInstance(id, code)
+        setTimeout(() => {
+          const target = readObject('recycle-list/components/stateless-with-props.vdom.js')
+          expect(getRoot(instance)).toEqual(target)
+          instance.$destroy()
+          done()
+        }, 50)
+      }).catch(done.fail)
+    })
+
+    it('multi stateless components', done => {
+      compileWithDeps('recycle-list/components/stateless-multi-components.vue', [{
+        name: 'banner',
+        path: 'recycle-list/components/banner.vue'
+      }, {
+        name: 'poster',
+        path: 'recycle-list/components/poster.vue'
+      }, {
+        name: 'footer',
+        path: 'recycle-list/components/footer.vue'
+      }]).then(code => {
+        const id = String(Date.now() * Math.random())
+        const instance = createInstance(id, code)
+        setTimeout(() => {
+          const target = readObject('recycle-list/components/stateless-multi-components.vdom.js')
+          expect(getRoot(instance)).toEqual(target)
+          instance.$destroy()
+          done()
+        }, 50)
+      }).catch(done.fail)
+    })
+
+    it('stateful component', done => {
+      const tasks = []
+      addTaskHook((_, task) => tasks.push(task))
+      compileWithDeps('recycle-list/components/stateful.vue', [{
+        name: 'counter',
+        path: 'recycle-list/components/counter.vue'
+      }]).then(code => {
+        const id = String(Date.now() * Math.random())
+        const instance = createInstance(id, code)
+        // expect(tasks.length).toEqual(3)
+        setTimeout(() => {
+          // check the render results
+          const target = readObject('recycle-list/components/stateful.vdom.js')
+          expect(getRoot(instance)).toEqual(target)
+          tasks.length = 0
+
+          // // trigger component hooks
+          // instance.$triggerHook(
+          //   2, // cid of the virtual component template
+          //   'create', // lifecycle hook name
+
+          //   // arguments for the callback
+          //   [
+          //     'x-1', // componentId of the virtual component
+          //     { start: 3 } // propsData of the virtual component
+          //   ]
+          // )
+          // instance.$triggerHook(2, 'create', ['x-2', { start: 11 }])
+
+          // // the state (_data) of the virtual component should be sent to native
+          // expect(tasks.length).toEqual(2)
+          // expect(tasks[0].method).toEqual('updateComponentData')
+          // expect(tasks[0].args).toEqual(['x-1', { count: 6 }, ''])
+          // expect(tasks[1].method).toEqual('updateComponentData')
+          // expect(tasks[1].args).toEqual(['x-2', { count: 22 }, ''])
+
+          // instance.$triggerHook('x-1', 'attach')
+          // instance.$triggerHook('x-2', 'attach')
+          // tasks.length = 0
+
+          // // simulate a click event
+          // // the event will be caught by the virtual component template and
+          // // should be dispatched to virtual component according to the componentId
+          // const event = getEvents(instance)[0]
+          // fireEvent(instance, event.ref, 'click', { componentId: 'x-1' })
+          setTimeout(() => {
+            // expect(tasks.length).toEqual(1)
+            // expect(tasks[0].method).toEqual('updateComponentData')
+            // expect(tasks[0].args).toEqual([{ count: 7 }])
+            instance.$destroy()
+            resetTaskHook()
+            done()
+          })
+        }, 50)
+      }).catch(done.fail)
+    })
+
+    // it('component lifecycle', done => {
+    //   global.__lifecycles = []
+    //   compileWithDeps('recycle-list/components/stateful-lifecycle.vue', [{
+    //     name: 'lifecycle',
+    //     path: 'recycle-list/components/lifecycle.vue'
+    //   }]).then(code => {
+    //     const id = String(Date.now() * Math.random())
+    //     const instance = createInstance(id, code)
+    //     setTimeout(() => {
+    //       const target = readObject('recycle-list/components/stateful-lifecycle.vdom.js')
+    //       expect(getRoot(instance)).toEqual(target)
+
+    //       instance.$triggerHook(2, 'create', ['y-1'])
+    //       instance.$triggerHook('y-1', 'attach')
+    //       instance.$triggerHook('y-1', 'detach')
+    //       expect(global.__lifecycles).toEqual([
+    //         'beforeCreate undefined',
+    //         'created 0',
+    //         'beforeMount 1',
+    //         'mounted 1',
+    //         'beforeUpdate 2',
+    //         'updated 2',
+    //         'beforeDestroy 2',
+    //         'destroyed 2'
+    //       ])
+
+    //       delete global.__lifecycles
+    //       instance.$destroy()
+    //       done()
+    //     }, 50)
+    //   }).catch(done.fail)
+    // })
+
+    it('stateful component with v-model', done => {
+      compileWithDeps('recycle-list/components/stateful-v-model.vue', [{
+        name: 'editor',
+        path: 'recycle-list/components/editor.vue'
+      }]).then(code => {
+        const id = String(Date.now() * Math.random())
+        const instance = createInstance(id, code)
+        setTimeout(() => {
+          const target = readObject('recycle-list/components/stateful-v-model.vdom.js')
+          expect(getRoot(instance)).toEqual(target)
+          instance.$destroy()
+          done()
+        }, 50)
+      }).catch(done.fail)
+    })
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/weex/cases/event/click.after.vdom.js b/advancedcontentfilter/vendor/asset/vue/test/weex/cases/event/click.after.vdom.js
new file mode 100644 (file)
index 0000000..eab1a36
--- /dev/null
@@ -0,0 +1,10 @@
+({
+  type: 'div',
+  event: ['click'],
+  children: [{
+    type: 'text',
+    attr: {
+      value: '43'
+    }
+  }]
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/weex/cases/event/click.before.vdom.js b/advancedcontentfilter/vendor/asset/vue/test/weex/cases/event/click.before.vdom.js
new file mode 100644 (file)
index 0000000..de278b3
--- /dev/null
@@ -0,0 +1,10 @@
+({
+  type: 'div',
+  event: ['click'],
+  children: [{
+    type: 'text',
+    attr: {
+      value: '42'
+    }
+  }]
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/weex/cases/event/click.vue b/advancedcontentfilter/vendor/asset/vue/test/weex/cases/event/click.vue
new file mode 100644 (file)
index 0000000..508782c
--- /dev/null
@@ -0,0 +1,20 @@
+<template>
+  <div @click="inc">
+    <text>{{count}}</text>
+  </div>
+</template>
+
+<script>
+  module.exports = {
+    data () {
+      return {
+        count: 42
+      }
+    },
+    methods: {
+      inc () {
+        this.count++
+      }
+    }
+  }
+</script>
diff --git a/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/attrs.vdom.js b/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/attrs.vdom.js
new file mode 100644 (file)
index 0000000..ccce367
--- /dev/null
@@ -0,0 +1,34 @@
+({
+  type: 'recycle-list',
+  attr: {
+    append: 'tree',
+    listData: [
+      { type: 'A', count: 1, source: 'http://whatever.com/x.png' },
+      { type: 'A', count: 2, source: 'http://whatever.com/y.png' },
+      { type: 'A', count: 3, source: 'http://whatever.com/z.png' }
+    ],
+    switch: 'type',
+    alias: 'item'
+  },
+  children: [{
+    type: 'cell-slot',
+    attr: { append: 'tree', case: 'A' },
+    children: [{
+      type: 'image',
+      attr: {
+        resize: 'cover',
+        src: {
+          '@binding': 'item.source'
+        }
+      }
+    }, {
+      type: 'text',
+      attr: {
+        lines: '3',
+        count: {
+          '@binding': 'item.count'
+        }
+      }
+    }]
+  }]
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/attrs.vue b/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/attrs.vue
new file mode 100644 (file)
index 0000000..1e2d031
--- /dev/null
@@ -0,0 +1,23 @@
+<template>
+  <recycle-list for="item in longList" switch="type">
+    <cell-slot case="A">
+      <image resize="cover" :src="item.source">
+      <text lines="3" v-bind:count="item.count"></text>
+    </cell-slot>
+  </recycle-list>
+</template>
+
+<script>
+  module.exports = {
+    data () {
+      return {
+        longList: [
+          { type: 'A', count: 1, source: 'http://whatever.com/x.png' },
+          { type: 'A', count: 2, source: 'http://whatever.com/y.png' },
+          { type: 'A', count: 3, source: 'http://whatever.com/z.png' }
+        ]
+      }
+    }
+  }
+</script>
+
diff --git a/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/classname.vdom.js b/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/classname.vdom.js
new file mode 100644 (file)
index 0000000..e9280e0
--- /dev/null
@@ -0,0 +1,27 @@
+({
+  type: 'recycle-list',
+  attr: {
+    append: 'tree',
+    listData: [
+      { type: 'A', color: 'red' },
+      { type: 'A', color: 'blue' }
+    ],
+    switch: 'type',
+    alias: 'item'
+  },
+  children: [{
+    type: 'cell-slot',
+    attr: { append: 'tree', case: 'A' },
+    style: {
+      backgroundColor: '#FF6600'
+    },
+    children: [{
+      type: 'text',
+      attr: {
+        // not supported yet
+        // classList: ['text', { '@binding': 'item.color' }],
+        value: 'content'
+      }
+    }]
+  }]
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/classname.vue b/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/classname.vue
new file mode 100644 (file)
index 0000000..beca441
--- /dev/null
@@ -0,0 +1,37 @@
+<template>
+  <recycle-list for="item in longList" switch="type">
+    <cell-slot case="A" class="cell">
+      <text :class="['text', item.color]">content</text>
+    </cell-slot>
+  </recycle-list>
+</template>
+
+<style scoped>
+  .cell {
+    background-color: #FF6600;
+  }
+  .text {
+    font-size: 100px;
+    text-align: center;
+  }
+  .red {
+    color: #FF0000;
+  }
+  .blue {
+    color: #0000FF;
+  }
+</style>
+
+<script>
+  module.exports = {
+    data () {
+      return {
+        longList: [
+          { type: 'A', color: 'red' },
+          { type: 'A', color: 'blue' }
+        ]
+      }
+    }
+  }
+</script>
+
diff --git a/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/components/banner.vue b/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/components/banner.vue
new file mode 100644 (file)
index 0000000..a6c2f75
--- /dev/null
@@ -0,0 +1,19 @@
+<template recyclable="true">
+  <div class="banner">
+    <text class="title">BANNER</text>
+  </div>
+</template>
+
+<style scoped>
+  .banner {
+    height: 120px;
+    justify-content: center;
+    align-items: center;
+    background-color: rgb(162, 217, 192);
+  }
+  .title {
+    font-weight: bold;
+    color: #41B883;
+    font-size: 60px;
+  }
+</style>
diff --git a/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/components/counter.vue b/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/components/counter.vue
new file mode 100644 (file)
index 0000000..79b8189
--- /dev/null
@@ -0,0 +1,36 @@
+<template recyclable="true">
+  <div>
+    <text class="output">{{count}}</text>
+    <text class="button" @click="inc">+</text>
+  </div>
+</template>
+
+<script>
+  module.exports = {
+    props: ['start'],
+    data () {
+      return {
+        count: parseInt(this.start, 10) * 2 || 42
+      }
+    },
+    methods: {
+      inc () {
+        this.count++
+      }
+    }
+  }
+</script>
+
+<style scoped>
+  .output {
+    font-size: 150px;
+    text-align: center;
+  }
+  .button {
+    font-size: 100px;
+    text-align: center;
+    border-width: 2px;
+    border-color: #DDD;
+    background-color: #F5F5F5;
+  }
+</style>
diff --git a/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/components/editor.vue b/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/components/editor.vue
new file mode 100644 (file)
index 0000000..9ab63e7
--- /dev/null
@@ -0,0 +1,31 @@
+<template recyclable="true">
+  <div>
+    <text class="output">{{output}}</text>
+    <input class="input" type="text" v-model="output" />
+  </div>
+</template>
+
+<script>
+  module.exports = {
+    props: ['message'],
+    data () {
+      return {
+        output: this.message || ''
+      }
+    }
+  }
+</script>
+
+<style scoped>
+  .output {
+    height: 80px;
+    font-size: 60px;
+    color: #41B883;
+  }
+  .input {
+    font-size: 50px;
+    color: #666666;
+    border-width: 2px;
+    border-color: #41B883;
+  }
+</style>
diff --git a/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/components/footer.vue b/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/components/footer.vue
new file mode 100644 (file)
index 0000000..b3fe0c8
--- /dev/null
@@ -0,0 +1,18 @@
+<template recyclable="true">
+  <div class="footer">
+    <text class="copyright">All rights reserved.</text>
+  </div>
+</template>
+
+<style scoped>
+  .footer {
+    height: 80px;
+    justify-content: center;
+    background-color: #EEEEEE;
+  }
+  .copyright {
+    color: #AAAAAA;
+    font-size: 32px;
+    text-align: center;
+  }
+</style>
diff --git a/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/components/lifecycle.vue b/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/components/lifecycle.vue
new file mode 100644 (file)
index 0000000..03ee65a
--- /dev/null
@@ -0,0 +1,39 @@
+<template recyclable="true">
+  <div>
+    <text>{{number}}</text>
+  </div>
+</template>
+
+<script>
+  module.exports = {
+    data () {
+      return { number: 0 }
+    },
+    beforeCreate () {
+      try { __lifecycles.push('beforeCreate ' + this.number) } catch (e) {}
+    },
+    created () {
+      try { __lifecycles.push('created ' + this.number) } catch (e) {}
+      this.number++
+    },
+    beforeMount () {
+      try { __lifecycles.push('beforeMount ' + this.number) } catch (e) {}
+    },
+    mounted () {
+      try { __lifecycles.push('mounted ' + this.number) } catch (e) {}
+      this.number++
+    },
+    beforeUpdate () {
+      try { __lifecycles.push('beforeUpdate ' + this.number) } catch (e) {}
+    },
+    updated () {
+      try { __lifecycles.push('updated ' + this.number) } catch (e) {}
+    },
+    beforeDestroy () {
+      try { __lifecycles.push('beforeDestroy ' + this.number) } catch (e) {}
+    },
+    destroyed () {
+      try { __lifecycles.push('destroyed ' + this.number) } catch (e) {}
+    }
+  }
+</script>
diff --git a/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/components/poster.vue b/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/components/poster.vue
new file mode 100644 (file)
index 0000000..6157185
--- /dev/null
@@ -0,0 +1,33 @@
+<template recyclable="true">
+  <div>
+    <image class="image" :src="imageUrl"></image>
+    <text class="title">{{title}}</text>
+  </div>
+</template>
+
+<script>
+  module.exports = {
+    props: {
+      imageUrl: {
+        type: String,
+        default: 'https://gw.alicdn.com/tfs/TB1KF_ybRTH8KJjy0FiXXcRsXXa-890-1186.png'
+      },
+      title: {
+        type: String,
+        default: 'I WANT YOU!'
+      }
+    }
+  }
+</script>
+
+<style scoped>
+  .image {
+    width: 750px;
+    height: 1000px;
+  }
+  .title {
+    font-size: 80px;
+    text-align: center;
+    color: #E95659;
+  }
+</style>
diff --git a/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/components/stateful-lifecycle.vdom.js b/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/components/stateful-lifecycle.vdom.js
new file mode 100644 (file)
index 0000000..45268ff
--- /dev/null
@@ -0,0 +1,29 @@
+({
+  type: 'recycle-list',
+  attr: {
+    append: 'tree',
+    listData: [
+      { type: 'X' },
+      { type: 'X' }
+    ],
+    switch: 'type',
+    alias: 'item'
+  },
+  children: [{
+    type: 'cell-slot',
+    attr: { append: 'tree', case: 'X' },
+    children: [{
+      type: 'div',
+      attr: {
+        '@isComponentRoot': true,
+        '@componentProps': {}
+      },
+      children: [{
+        type: 'text',
+        attr: {
+          value: { '@binding': 'number' }
+        }
+      }]
+    }]
+  }]
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/components/stateful-lifecycle.vue b/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/components/stateful-lifecycle.vue
new file mode 100644 (file)
index 0000000..97673b7
--- /dev/null
@@ -0,0 +1,21 @@
+<template>
+  <recycle-list for="item in longList" switch="type">
+    <cell-slot case="X">
+      <lifecycle></lifecycle>
+    </cell-slot>
+  </recycle-list>
+</template>
+
+<script>
+  // require('./lifecycle.vue')
+  module.exports = {
+    data () {
+      return {
+        longList: [
+          { type: 'X' },
+          { type: 'X' }
+        ]
+      }
+    }
+  }
+</script>
diff --git a/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/components/stateful-v-model.vdom.js b/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/components/stateful-v-model.vdom.js
new file mode 100644 (file)
index 0000000..f2d0d96
--- /dev/null
@@ -0,0 +1,40 @@
+({
+  type: 'recycle-list',
+  attr: {
+    append: 'tree',
+    listData: [
+      { type: 'A' },
+      { type: 'A' }
+    ],
+    switch: 'type',
+    alias: 'item'
+  },
+  children: [{
+    type: 'cell-slot',
+    attr: { append: 'tree', case: 'A' },
+    children: [{
+      type: 'div',
+      attr: {
+        '@isComponentRoot': true,
+        '@componentProps': {
+          message: 'No binding'
+        }
+      },
+      children: [{
+        type: 'text',
+        classList: ['output'],
+        attr: {
+          value: { '@binding': 'output' }
+        }
+      }, {
+        type: 'input',
+        event: ['input'],
+        classList: ['input'],
+        attr: {
+          type: 'text',
+          value: 'No binding'
+        }
+      }]
+    }]
+  }]
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/components/stateful-v-model.vue b/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/components/stateful-v-model.vue
new file mode 100644 (file)
index 0000000..3b7cc61
--- /dev/null
@@ -0,0 +1,21 @@
+<template>
+  <recycle-list for="item in longList" switch="type">
+    <cell-slot case="A">
+      <editor message="No binding"></editor>
+    </cell-slot>
+  </recycle-list>
+</template>
+
+<script>
+  // require('./editor.vue')
+  module.exports = {
+    data () {
+      return {
+        longList: [
+          { type: 'A' },
+          { type: 'A' }
+        ]
+      }
+    }
+  }
+</script>
diff --git a/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/components/stateful.vdom.js b/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/components/stateful.vdom.js
new file mode 100644 (file)
index 0000000..6a2bddc
--- /dev/null
@@ -0,0 +1,40 @@
+({
+  type: 'recycle-list',
+  attr: {
+    append: 'tree',
+    listData: [
+      { type: 'A', number: 24 },
+      { type: 'A', number: 42 }
+    ],
+    switch: 'type',
+    alias: 'item'
+  },
+  children: [{
+    type: 'cell-slot',
+    attr: { append: 'tree', case: 'A' },
+    children: [{
+      type: 'div',
+      attr: {
+        '@isComponentRoot': true,
+        '@componentProps': {
+          start: { '@binding': 'item.number' }
+        }
+      },
+      children: [{
+        type: 'text',
+        classList: ['output'],
+        attr: {
+          value: { '@binding': 'count' } // need confirm
+        }
+      }, {
+        type: 'text',
+        event: ['click'],
+        classList: ['button'],
+        attr: { value: '+' }
+      }]
+    }, {
+      type: 'text',
+      attr: { value: 'other' }
+    }]
+  }]
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/components/stateful.vue b/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/components/stateful.vue
new file mode 100644 (file)
index 0000000..797f3f5
--- /dev/null
@@ -0,0 +1,22 @@
+<template>
+  <recycle-list for="item in longList" switch="type">
+    <cell-slot case="A">
+      <counter :start="item.number"></counter>
+      <text>other</text>
+    </cell-slot>
+  </recycle-list>
+</template>
+
+<script>
+  // require('./counter.vue')
+  module.exports = {
+    data () {
+      return {
+        longList: [
+          { type: 'A', number: 24 },
+          { type: 'A', number: 42 }
+        ]
+      }
+    }
+  }
+</script>
diff --git a/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/components/stateless-multi-components.vdom.js b/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/components/stateless-multi-components.vdom.js
new file mode 100644 (file)
index 0000000..2e4b4d9
--- /dev/null
@@ -0,0 +1,83 @@
+({
+  type: 'recycle-list',
+  attr: {
+    append: 'tree',
+    listData: [
+      { type: 'A' },
+      { type: 'B', poster: 'yy', title: 'y' },
+      { type: 'A' }
+    ],
+    switch: 'type',
+    alias: 'item'
+  },
+  children: [{
+    type: 'cell-slot',
+    attr: { append: 'tree', case: 'A' },
+    children: [{
+      type: 'div',
+      attr: {
+        '@isComponentRoot': true,
+        '@componentProps': {}
+      },
+      classList: ['banner'],
+      children: [{
+        type: 'text',
+        classList: ['title'],
+        attr: { value: 'BANNER' }
+      }]
+    }, {
+      type: 'text',
+      attr: { value: '----' }
+    }, {
+      type: 'div',
+      attr: {
+        '@isComponentRoot': true,
+        '@componentProps': {}
+      },
+      classList: ['footer'],
+      children: [{
+        type: 'text',
+        classList: ['copyright'],
+        attr: { value: 'All rights reserved.' }
+      }]
+    }]
+  }, {
+    type: 'cell-slot',
+    attr: { append: 'tree', case: 'B' },
+    children: [{
+      type: 'div',
+      attr: {
+        '@isComponentRoot': true,
+        '@componentProps': {}
+      },
+      classList: ['banner'],
+      children: [{
+        type: 'text',
+        classList: ['title'],
+        attr: { value: 'BANNER' }
+      }]
+    }, {
+      type: 'div',
+      attr: {
+        '@isComponentRoot': true,
+        '@componentProps': {
+          imageUrl: { '@binding': 'item.poster' },
+          title: { '@binding': 'item.title' }
+        }
+      },
+      children: [{
+        type: 'image',
+        classList: ['image'],
+        attr: {
+          src: { '@binding': 'imageUrl' }
+        }
+      }, {
+        type: 'text',
+        classList: ['title'],
+        attr: {
+          value: { '@binding': 'title' }
+        }
+      }]
+    }]
+  }]
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/components/stateless-multi-components.vue b/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/components/stateless-multi-components.vue
new file mode 100644 (file)
index 0000000..9a6d6bf
--- /dev/null
@@ -0,0 +1,30 @@
+<template>
+  <recycle-list for="item in longList" switch="type">
+    <cell-slot case="A">
+      <banner></banner>
+      <text>----</text>
+      <footer></footer>
+    </cell-slot>
+    <cell-slot case="B">
+      <banner></banner>
+      <poster :image-url="item.poster" :title="item.title"></poster>
+    </cell-slot>
+  </recycle-list>
+</template>
+
+<script>
+  // require('./banner.vue')
+  // require('./footer.vue')
+  // require('./poster.vue')
+  module.exports = {
+    data () {
+      return {
+        longList: [
+          { type: 'A' },
+          { type: 'B', poster: 'yy', title: 'y' },
+          { type: 'A' }
+        ]
+      }
+    }
+  }
+</script>
diff --git a/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/components/stateless-with-props.vdom.js b/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/components/stateless-with-props.vdom.js
new file mode 100644 (file)
index 0000000..3fc18dc
--- /dev/null
@@ -0,0 +1,44 @@
+({
+  type: 'recycle-list',
+  attr: {
+    append: 'tree',
+    listData: [
+      { type: 'A', poster: 'xx', title: 'x' },
+      { type: 'A', poster: 'yy', title: 'y' }
+    ],
+    switch: 'type',
+    alias: 'item'
+  },
+  children: [{
+    type: 'cell-slot',
+    attr: { append: 'tree', case: 'A' },
+    children: [{
+      type: 'div',
+      attr: {
+        '@isComponentRoot': true,
+        '@componentProps': {
+          imageUrl: { '@binding': 'item.poster' },
+          title: { '@binding': 'item.title' }
+        }
+      },
+      children: [{
+        type: 'image',
+        classList: ['image'],
+        attr: {
+          src: { '@binding': 'imageUrl' }
+        }
+      }, {
+        type: 'text',
+        classList: ['title'],
+        attr: {
+          value: { '@binding': 'title' }
+        }
+      }]
+    }, {
+      type: 'text',
+      attr: {
+        value: 'content'
+      }
+    }]
+  }]
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/components/stateless-with-props.vue b/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/components/stateless-with-props.vue
new file mode 100644 (file)
index 0000000..e1d3d8c
--- /dev/null
@@ -0,0 +1,22 @@
+<template>
+  <recycle-list for="item in longList" switch="type">
+    <cell-slot case="A">
+      <poster :image-url="item.poster" :title="item.title"></poster>
+      <text>content</text>
+    </cell-slot>
+  </recycle-list>
+</template>
+
+<script>
+  // require('./poster.vue')
+  module.exports = {
+    data () {
+      return {
+        longList: [
+          { type: 'A', poster: 'xx', title: 'x' },
+          { type: 'A', poster: 'yy', title: 'y' }
+        ]
+      }
+    }
+  }
+</script>
diff --git a/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/components/stateless.vdom.js b/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/components/stateless.vdom.js
new file mode 100644 (file)
index 0000000..3ae12d0
--- /dev/null
@@ -0,0 +1,36 @@
+({
+  type: 'recycle-list',
+  attr: {
+    append: 'tree',
+    listData: [
+      { type: 'A' },
+      { type: 'A' }
+    ],
+    switch: 'type',
+    alias: 'item'
+  },
+  children: [{
+    type: 'cell-slot',
+    attr: { append: 'tree', case: 'A' },
+    children: [{
+      type: 'div',
+      attr: {
+        '@isComponentRoot': true,
+        '@componentProps': {}
+      },
+      classList: ['banner'],
+      children: [{
+        type: 'text',
+        classList: ['title'],
+        attr: {
+          value: 'BANNER'
+        }
+      }]
+    }, {
+      type: 'text',
+      attr: {
+        value: 'content'
+      }
+    }]
+  }]
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/components/stateless.vue b/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/components/stateless.vue
new file mode 100644 (file)
index 0000000..3ad942d
--- /dev/null
@@ -0,0 +1,22 @@
+<template>
+  <recycle-list for="item in longList" switch="type">
+    <cell-slot case="A">
+      <banner></banner>
+      <text>content</text>
+    </cell-slot>
+  </recycle-list>
+</template>
+
+<script>
+  // require('./banner.vue')
+  module.exports = {
+    data () {
+      return {
+        longList: [
+          { type: 'A' },
+          { type: 'A' }
+        ]
+      }
+    }
+  }
+</script>
diff --git a/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/inline-style.vdom.js b/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/inline-style.vdom.js
new file mode 100644 (file)
index 0000000..c29bcf9
--- /dev/null
@@ -0,0 +1,29 @@
+({
+  type: 'recycle-list',
+  attr: {
+    append: 'tree',
+    listData: [
+      { type: 'A', color: '#606060' },
+      { type: 'A', color: '#E5E5E5' }
+    ],
+    switch: 'type',
+    alias: 'item'
+  },
+  children: [{
+    type: 'cell-slot',
+    attr: { append: 'tree', case: 'A' },
+    style: {
+      backgroundColor: '#FF6600'
+    },
+    children: [{
+      type: 'text',
+      style: {
+        fontSize: '100px',
+        color: { '@binding': 'item.color' }
+      },
+      attr: {
+        value: 'content'
+      }
+    }]
+  }]
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/inline-style.vue b/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/inline-style.vue
new file mode 100644 (file)
index 0000000..af9da5b
--- /dev/null
@@ -0,0 +1,21 @@
+<template>
+  <recycle-list for="item in longList" switch="type">
+    <cell-slot case="A" style="background-color:#FF6600">
+      <text :style="{ fontSize: '100px', color: item.color }">content</text>
+    </cell-slot>
+  </recycle-list>
+</template>
+
+<script>
+  module.exports = {
+    data () {
+      return {
+        longList: [
+          { type: 'A', color: '#606060' },
+          { type: 'A', color: '#E5E5E5' }
+        ]
+      }
+    }
+  }
+</script>
+
diff --git a/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/text-node.vdom.js b/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/text-node.vdom.js
new file mode 100644 (file)
index 0000000..6ab5d1e
--- /dev/null
@@ -0,0 +1,38 @@
+({
+  type: 'recycle-list',
+  attr: {
+    append: 'tree',
+    listData: [
+      { type: 'A', dynamic: 'decimal', two: '2', four: '4' },
+      { type: 'A', dynamic: 'binary', two: '10', four: '100' }
+    ],
+    switch: 'type',
+    alias: 'item'
+  },
+  children: [{
+    type: 'cell-slot',
+    attr: { append: 'tree', case: 'A' },
+    children: [{
+      type: 'text',
+      attr: {
+        value: 'static'
+      }
+    }, {
+      type: 'text',
+      attr: {
+        value: { '@binding': 'item.dynamic' }
+      }
+    }, {
+      type: 'text',
+      attr: {
+        value: [
+          'one ',
+          { '@binding': 'item.two' },
+          ' three ',
+          { '@binding': 'item.four' },
+          ' five'
+        ]
+      }
+    }]
+  }]
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/text-node.vue b/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/text-node.vue
new file mode 100644 (file)
index 0000000..56b21ca
--- /dev/null
@@ -0,0 +1,23 @@
+<template>
+  <recycle-list for="item in longList" switch="type">
+    <cell-slot case="A">
+      <text>static</text>
+      <text>{{item.dynamic}}</text>
+      <text>one {{item.two}} three {{ item.four }} five</text>
+    </cell-slot>
+  </recycle-list>
+</template>
+
+<script>
+  module.exports = {
+    data () {
+      return {
+        longList: [
+          { type: 'A', dynamic: 'decimal', two: '2', four: '4' },
+          { type: 'A', dynamic: 'binary', two: '10', four: '100' }
+        ]
+      }
+    }
+  }
+</script>
+
diff --git a/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/v-else-if.vdom.js b/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/v-else-if.vdom.js
new file mode 100644 (file)
index 0000000..1181e26
--- /dev/null
@@ -0,0 +1,35 @@
+({
+  type: 'recycle-list',
+  attr: {
+    append: 'tree',
+    listData: [
+      { type: 'A' },
+      { type: 'A' }
+    ],
+    switch: 'type',
+    alias: 'item'
+  },
+  children: [{
+    type: 'cell-slot',
+    attr: { append: 'tree', case: 'A' },
+    children: [{
+      type: 'image',
+      attr: {
+        '[[match]]': 'item.sourceA',
+        src: { '@binding': 'item.sourceA' }
+      }
+    }, {
+      type: 'image',
+      attr: {
+        '[[match]]': '!(item.sourceA) && (item.sourceB)',
+        src: { '@binding': 'item.sourceB' }
+      }
+    }, {
+      type: 'image',
+      attr: {
+        '[[match]]': '!(item.sourceA || item.sourceB)',
+        src: { '@binding': 'item.placeholder' }
+      }
+    }]
+  }]
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/v-else-if.vue b/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/v-else-if.vue
new file mode 100644 (file)
index 0000000..6078450
--- /dev/null
@@ -0,0 +1,23 @@
+<template>
+  <recycle-list for="item in longList" switch="type">
+    <cell-slot case="A">
+      <image v-if="item.sourceA" :src="item.sourceA"></image>
+      <image v-else-if="item.sourceB" :src="item.sourceB"></image>
+      <image v-else :src="item.placeholder"></image>
+    </cell-slot>
+  </recycle-list>
+</template>
+
+<script>
+  module.exports = {
+    data () {
+      return {
+        longList: [
+          { type: 'A' },
+          { type: 'A' }
+        ]
+      }
+    }
+  }
+</script>
+
diff --git a/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/v-else.vdom.js b/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/v-else.vdom.js
new file mode 100644 (file)
index 0000000..dc37e1d
--- /dev/null
@@ -0,0 +1,29 @@
+({
+  type: 'recycle-list',
+  attr: {
+    append: 'tree',
+    listData: [
+      { type: 'A' },
+      { type: 'A' }
+    ],
+    switch: 'type',
+    alias: 'item'
+  },
+  children: [{
+    type: 'cell-slot',
+    attr: { append: 'tree', case: 'A' },
+    children: [{
+      type: 'image',
+      attr: {
+        '[[match]]': 'item.source',
+        src: { '@binding': 'item.source' }
+      }
+    }, {
+      type: 'image',
+      attr: {
+        '[[match]]': '!(item.source)',
+        src: { '@binding': 'item.placeholder' }
+      }
+    }]
+  }]
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/v-else.vue b/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/v-else.vue
new file mode 100644 (file)
index 0000000..48e85fd
--- /dev/null
@@ -0,0 +1,22 @@
+<template>
+  <recycle-list for="item in longList" switch="type">
+    <cell-slot case="A">
+      <image v-if="item.source" :src="item.source"></image>
+      <image v-else v-bind:src="item.placeholder"></image>
+    </cell-slot>
+  </recycle-list>
+</template>
+
+<script>
+  module.exports = {
+    data () {
+      return {
+        longList: [
+          { type: 'A' },
+          { type: 'A' }
+        ]
+      }
+    }
+  }
+</script>
+
diff --git a/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/v-for-iterator.vdom.js b/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/v-for-iterator.vdom.js
new file mode 100644 (file)
index 0000000..5507403
--- /dev/null
@@ -0,0 +1,47 @@
+({
+  type: 'recycle-list',
+  attr: {
+    append: 'tree',
+    listData: [
+      { type: 'A' },
+      { type: 'A' }
+    ],
+    switch: 'type',
+    alias: 'item'
+  },
+  children: [{
+    type: 'cell-slot',
+    attr: { append: 'tree', case: 'A' },
+    children: [{
+      type: 'div',
+      attr: {
+        '[[repeat]]': {
+          '@expression': 'item.list',
+          '@index': 'index',
+          '@alias': 'object'
+        }
+      },
+      children: [{
+        type: 'text',
+        attr: {
+          value: {
+            '@binding': 'object.name'
+          }
+        }
+      }, {
+        type: 'text',
+        attr: {
+          '[[repeat]]': {
+            '@expression': 'object',
+            '@alias': 'v',
+            '@key': 'k',
+            '@index': 'i'
+          },
+          value: {
+            '@binding': 'v'
+          }
+        }
+      }]
+    }]
+  }]
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/v-for-iterator.vue b/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/v-for-iterator.vue
new file mode 100644 (file)
index 0000000..ed424a2
--- /dev/null
@@ -0,0 +1,24 @@
+<template>
+  <recycle-list for="item in longList" switch="type">
+    <cell-slot case="A">
+      <div v-for="(object, index) in item.list" :key="index">
+        <text>{{object.name}}</text>
+        <text v-for="(v, k, i) in object" :key="k">{{v}}</text>
+      </div>
+    </cell-slot>
+  </recycle-list>
+</template>
+
+<script>
+  module.exports = {
+    data () {
+      return {
+        longList: [
+          { type: 'A' },
+          { type: 'A' }
+        ]
+      }
+    }
+  }
+</script>
+
diff --git a/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/v-for.vdom.js b/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/v-for.vdom.js
new file mode 100644 (file)
index 0000000..bbae2d5
--- /dev/null
@@ -0,0 +1,33 @@
+({
+  type: 'recycle-list',
+  attr: {
+    append: 'tree',
+    listData: [
+      { type: 'A' },
+      { type: 'A' }
+    ],
+    switch: 'type',
+    alias: 'item'
+  },
+  children: [{
+    type: 'cell-slot',
+    attr: { append: 'tree', case: 'A' },
+    children: [{
+      type: 'div',
+      attr: {
+        '[[repeat]]': {
+          '@expression': 'item.list',
+          '@alias': 'panel'
+        }
+      },
+      children: [{
+        type: 'text',
+        attr: {
+          value: {
+            '@binding': 'panel.label'
+          }
+        }
+      }]
+    }]
+  }]
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/v-for.vue b/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/v-for.vue
new file mode 100644 (file)
index 0000000..57a6890
--- /dev/null
@@ -0,0 +1,23 @@
+<template>
+  <recycle-list for="item in longList" switch="type">
+    <cell-slot case="A">
+      <div v-for="panel in item.list" :key="panel.id">
+        <text>{{panel.label}}</text>
+      </div>
+    </cell-slot>
+  </recycle-list>
+</template>
+
+<script>
+  module.exports = {
+    data () {
+      return {
+        longList: [
+          { type: 'A' },
+          { type: 'A' }
+        ]
+      }
+    }
+  }
+</script>
+
diff --git a/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/v-if.vdom.js b/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/v-if.vdom.js
new file mode 100644 (file)
index 0000000..fe5339b
--- /dev/null
@@ -0,0 +1,29 @@
+({
+  type: 'recycle-list',
+  attr: {
+    append: 'tree',
+    listData: [
+      { type: 'A' },
+      { type: 'A' }
+    ],
+    switch: 'type',
+    alias: 'item'
+  },
+  children: [{
+    type: 'cell-slot',
+    attr: { append: 'tree', case: 'A' },
+    children: [{
+      type: 'image',
+      attr: {
+        '[[match]]': 'item.source',
+        src: { '@binding': 'item.source' }
+      }
+    }, {
+      type: 'text',
+      attr: {
+        '[[match]]': '!item.source',
+        value: 'Title'
+      }
+    }]
+  }]
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/v-if.vue b/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/v-if.vue
new file mode 100644 (file)
index 0000000..ab2e047
--- /dev/null
@@ -0,0 +1,22 @@
+<template>
+  <recycle-list for="item in longList" switch="type">
+    <cell-slot case="A">
+      <image v-if="item.source" :src="item.source"></image>
+      <text v-if="!item.source">Title</text>
+    </cell-slot>
+  </recycle-list>
+</template>
+
+<script>
+  module.exports = {
+    data () {
+      return {
+        longList: [
+          { type: 'A' },
+          { type: 'A' }
+        ]
+      }
+    }
+  }
+</script>
+
diff --git a/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/v-on-inline.vdom.js b/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/v-on-inline.vdom.js
new file mode 100644 (file)
index 0000000..461fb99
--- /dev/null
@@ -0,0 +1,37 @@
+({
+  type: 'recycle-list',
+  attr: {
+    append: 'tree',
+    listData: [
+      { type: 'A' },
+      { type: 'A' }
+    ],
+    switch: 'type',
+    alias: 'item'
+  },
+  children: [{
+    type: 'cell-slot',
+    attr: { append: 'tree', case: 'A' },
+    children: [{
+      type: 'text',
+      event: ['click', {
+        type: 'longpress',
+        params: [{ '@binding': 'item.key' }]
+      }]
+    }, {
+      type: 'text',
+      event: [{
+        type: 'appear',
+        params: [
+          { '@binding': 'item.index' },
+          { '@binding': 'item.type' }
+        ]
+      }],
+      attr: { value: 'Button' }
+    }, {
+      type: 'text',
+      event: [{ type: 'disappear' }],
+      attr: { value: 'Tips' }
+    }]
+  }]
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/v-on-inline.vue b/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/v-on-inline.vue
new file mode 100644 (file)
index 0000000..ae909b2
--- /dev/null
@@ -0,0 +1,28 @@
+<template>
+  <recycle-list for="item in longList" switch="type">
+    <cell-slot case="A">
+      <text v-on:click="toggle()" @longpress="toggle(item.key)"></text>
+      <text @appear="onappear(item.index, 'static', item.type, $event)">Button</text>
+      <text @disappear="onappear(25, 'static')">Tips</text>
+    </cell-slot>
+  </recycle-list>
+</template>
+
+<script>
+  module.exports = {
+    data () {
+      return {
+        longList: [
+          { type: 'A' },
+          { type: 'A' }
+        ]
+      }
+    },
+    methods: {
+      hide () {},
+      toggle () {},
+      onappear () {}
+    }
+  }
+</script>
+
diff --git a/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/v-on.vdom.js b/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/v-on.vdom.js
new file mode 100644 (file)
index 0000000..3da8209
--- /dev/null
@@ -0,0 +1,25 @@
+({
+  type: 'recycle-list',
+  attr: {
+    append: 'tree',
+    listData: [
+      { type: 'A' },
+      { type: 'A' }
+    ],
+    switch: 'type',
+    alias: 'item'
+  },
+  children: [{
+    type: 'cell-slot',
+    attr: { append: 'tree', case: 'A' },
+    children: [{
+      type: 'text',
+      event: ['click', 'longpress'],
+      attr: { value: 'A' }
+    }, {
+      type: 'text',
+      event: ['touchend'],
+      attr: { value: 'B' }
+    }]
+  }]
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/v-on.vue b/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/v-on.vue
new file mode 100644 (file)
index 0000000..fb40f15
--- /dev/null
@@ -0,0 +1,26 @@
+<template>
+  <recycle-list for="item in longList" switch="type">
+    <cell-slot case="A">
+      <text v-on:click="handler" @longpress="move">A</text>
+      <text @touchend="move">B</text>
+    </cell-slot>
+  </recycle-list>
+</template>
+
+<script>
+  module.exports = {
+    data () {
+      return {
+        longList: [
+          { type: 'A' },
+          { type: 'A' }
+        ]
+      }
+    },
+    methods: {
+      handler () {},
+      move () {}
+    }
+  }
+</script>
+
diff --git a/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/v-once.vdom.js b/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/v-once.vdom.js
new file mode 100644 (file)
index 0000000..07e6419
--- /dev/null
@@ -0,0 +1,22 @@
+({
+  type: 'recycle-list',
+  attr: {
+    append: 'tree',
+    listData: [
+      { type: 'A' },
+      { type: 'A' }
+    ],
+    alias: 'item'
+  },
+  children: [{
+    type: 'cell-slot',
+    attr: { append: 'tree' },
+    children: [{
+      type: 'text',
+      attr: {
+        '[[once]]': true,
+        value: { '@binding': 'item.type' }
+      }
+    }]
+  }]
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/v-once.vue b/advancedcontentfilter/vendor/asset/vue/test/weex/cases/recycle-list/v-once.vue
new file mode 100644 (file)
index 0000000..f1e3a36
--- /dev/null
@@ -0,0 +1,21 @@
+<template>
+  <recycle-list for="item in list">
+    <cell-slot>
+      <text v-once>{{item.type}}</text>
+    </cell-slot>
+  </recycle-list>
+</template>
+
+<script>
+  module.exports = {
+    data () {
+      return {
+        list: [
+          { type: 'A' },
+          { type: 'A' }
+        ]
+      }
+    }
+  }
+</script>
+
diff --git a/advancedcontentfilter/vendor/asset/vue/test/weex/cases/render/sample.vdom.js b/advancedcontentfilter/vendor/asset/vue/test/weex/cases/render/sample.vdom.js
new file mode 100644 (file)
index 0000000..1d9b198
--- /dev/null
@@ -0,0 +1,13 @@
+({
+  type: 'div',
+  style: {
+    justifyContent: 'center'
+  },
+  children: [{
+    type: 'text',
+    attr: {
+      value: 'Yo'
+    },
+    classList: ['freestyle']
+  }]
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/weex/cases/render/sample.vue b/advancedcontentfilter/vendor/asset/vue/test/weex/cases/render/sample.vue
new file mode 100644 (file)
index 0000000..0251b3d
--- /dev/null
@@ -0,0 +1,23 @@
+<template>
+  <div style="justify-content:center">
+    <text class="freestyle">{{string}}</text>
+  </div>
+</template>
+
+<style scoped>
+  .freestyle {
+    color: #41B883;
+    font-size: 233px;
+    text-align: center;
+  }
+</style>
+
+<script>
+  module.exports = {
+    data () {
+      return {
+        string: 'Yo'
+      }
+    }
+  }
+</script>
diff --git a/advancedcontentfilter/vendor/asset/vue/test/weex/compiler/append.spec.js b/advancedcontentfilter/vendor/asset/vue/test/weex/compiler/append.spec.js
new file mode 100644 (file)
index 0000000..c75267c
--- /dev/null
@@ -0,0 +1,47 @@
+import { compile } from '../../../packages/weex-template-compiler'
+import { strToRegExp } from '../helpers/index'
+
+describe('append props', () => {
+  it('add append="tree" on <cell>', () => {
+    const { render, staticRenderFns, errors } = compile(`<list><cell></cell></list>`)
+    expect(render).not.toBeUndefined()
+    expect(staticRenderFns).not.toBeUndefined()
+    expect(staticRenderFns.length).toEqual(1)
+    expect(staticRenderFns).toMatch(strToRegExp(`appendAsTree:true`))
+    expect(staticRenderFns).toMatch(strToRegExp(`attrs:{"append":"tree"}`))
+    expect(errors).toEqual([])
+  })
+
+  it('override append="node" on <cell>', () => {
+    const { render, staticRenderFns, errors } = compile(`<list><cell append="node"></cell></list>`)
+    expect(render + staticRenderFns).toMatch(strToRegExp(`attrs:{"append":"node"}`))
+    expect(errors).toEqual([])
+  })
+
+  it('add append="tree" on <header>', () => {
+    const { render, staticRenderFns, errors } = compile(`<list><header></header></list>`)
+    expect(render + staticRenderFns).toMatch(strToRegExp(`appendAsTree:true`))
+    expect(render + staticRenderFns).toMatch(strToRegExp(`attrs:{"append":"tree"}`))
+    expect(errors).toEqual([])
+  })
+
+  it('add append="tree" on <recycle-list>', () => {
+    const { render, staticRenderFns, errors } = compile(`<recycle-list for="item in list"><div></div></recycle-list>`)
+    expect(render + staticRenderFns).toMatch(strToRegExp(`appendAsTree:true`))
+    expect(render + staticRenderFns).toMatch(strToRegExp(`"append":"tree"`))
+    expect(errors).toEqual([])
+  })
+
+  it('add append="tree" on <cell-slot>', () => {
+    const { render, staticRenderFns, errors } = compile(`<list><cell-slot></cell-slot></list>`)
+    expect(render + staticRenderFns).toMatch(strToRegExp(`appendAsTree:true`))
+    expect(render + staticRenderFns).toMatch(strToRegExp(`attrs:{"append":"tree"}`))
+    expect(errors).toEqual([])
+  })
+
+  it('override append="node" on <cell-slot>', () => {
+    const { render, staticRenderFns, errors } = compile(`<list><cell-slot append="node"></cell-slot></list>`)
+    expect(render + staticRenderFns).toMatch(strToRegExp(`attrs:{"append":"node"}`))
+    expect(errors).toEqual([])
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/weex/compiler/class.spec.js b/advancedcontentfilter/vendor/asset/vue/test/weex/compiler/class.spec.js
new file mode 100644 (file)
index 0000000..a7e88ab
--- /dev/null
@@ -0,0 +1,56 @@
+import { compile } from '../../../packages/weex-template-compiler'
+import { strToRegExp } from '../helpers/index'
+
+describe('compile class', () => {
+  it('should be compiled', () => {
+    const { render, staticRenderFns, errors } = compile(`<div class="a b c"></div>`)
+    expect(render).not.toBeUndefined()
+    expect(staticRenderFns).not.toBeUndefined()
+    expect(staticRenderFns.length).toEqual(0)
+    expect(render).toMatch(strToRegExp(`staticClass:["a","b","c"]`))
+    expect(errors).toEqual([])
+  })
+
+  it('should compile dynamic class', () => {
+    const { render, staticRenderFns, errors } = compile(`<div class="a {{b}} c"></div>`)
+    expect(render).not.toBeUndefined()
+    expect(staticRenderFns).toEqual([])
+    expect(render).toMatch(strToRegExp(`class:["a",_s(b),"c"]`))
+    expect(errors).not.toBeUndefined()
+    expect(errors.length).toEqual(1)
+    expect(errors[0]).toMatch(strToRegExp(`a {{b}} c`))
+    expect(errors[0]).toMatch(strToRegExp(`v-bind`))
+  })
+
+  it('should compile class binding of array', () => {
+    const { render, staticRenderFns, errors } = compile(`<div v-bind:class="['a', 'b', c]"></div>`)
+    expect(render).not.toBeUndefined()
+    expect(staticRenderFns).toEqual([])
+    expect(render).toMatch(strToRegExp(`class:['a', 'b', c]`))
+    expect(errors).toEqual([])
+  })
+
+  it('should compile class binding of map', () => {
+    const { render, staticRenderFns, errors } = compile(`<div v-bind:class="{ a: true, b: x }"></div>`)
+    expect(render).not.toBeUndefined()
+    expect(staticRenderFns).toEqual([])
+    expect(render).toMatch(strToRegExp(`class:{ a: true, b: x }`))
+    expect(errors).toEqual([])
+  })
+
+  it('should compile class binding of a variable', () => {
+    const { render, staticRenderFns, errors } = compile(`<div v-bind:class="x"></div>`)
+    expect(render).not.toBeUndefined()
+    expect(staticRenderFns).toEqual([])
+    expect(render).toMatch(strToRegExp(`class:x`))
+    expect(errors).toEqual([])
+  })
+
+  it('should compile class binding by shorthand', () => {
+    const { render, staticRenderFns, errors } = compile(`<div :class="['a', 'b', c]"></div>`)
+    expect(render).not.toBeUndefined()
+    expect(staticRenderFns).toEqual([])
+    expect(render).toMatch(strToRegExp(`class:['a', 'b', c]`))
+    expect(errors).toEqual([])
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/weex/compiler/compile.spec.js b/advancedcontentfilter/vendor/asset/vue/test/weex/compiler/compile.spec.js
new file mode 100644 (file)
index 0000000..7a717f1
--- /dev/null
@@ -0,0 +1,76 @@
+import { compile } from '../../../packages/weex-template-compiler'
+import { strToRegExp } from '../helpers/index'
+
+describe('compile basic', () => {
+  it('should be compiled', () => {
+    const { render, staticRenderFns, errors } = compile(`<div>{{hi}}</div>`)
+    expect(render).toEqual(`with(this){return _c('div',[_v(_s(hi))])}`)
+    expect(staticRenderFns.length).toBe(0)
+    expect(errors).toEqual([])
+  })
+
+  it('should compile data bindings', () => {
+    const { render, staticRenderFns, errors } = compile(`<div :a="b"></div>`)
+    expect(render).toEqual(`with(this){return _c('div',{attrs:{"a":b}})}`)
+    expect(staticRenderFns).toEqual([])
+    expect(errors).toEqual([])
+  })
+
+  it('should compile event bindings', () => {
+    const { render, staticRenderFns, errors } = compile(`<div @click="x"></div>`)
+    expect(render).toEqual(`with(this){return _c('div',{on:{"click":x}})}`)
+    expect(staticRenderFns).toEqual([])
+    expect(errors).toEqual([])
+  })
+
+  it('should compile data bindings with children', () => {
+    const { render, staticRenderFns, errors } = compile(`<foo :a="b"><text>Hello</text></foo>`)
+    expect(render).toEqual(`with(this){return _c('foo',{attrs:{"a":b}},[_c('text',[_v("Hello")])])}`)
+    expect(staticRenderFns).toEqual([])
+    expect(errors).toEqual([])
+  })
+
+  it('should compile unary tag', () => {
+    const inputCase = compile(`<div><input><text>abc</text></div>`)
+    expect(inputCase.render).toMatch(strToRegExp(`return _m(0)`))
+    expect(inputCase.staticRenderFns).toMatch(strToRegExp(`_c('div',[_c('input'),_c('text',[_v("abc")])])`))
+    expect(inputCase.errors).toEqual([])
+
+    const imageCase = compile(`<div><image src="path"><text>abc</text></div>`)
+    expect(imageCase.render).toMatch(strToRegExp(`return _m(0)`))
+    expect(imageCase.staticRenderFns).toMatch(strToRegExp(`_c('div',[_c('image',{attrs:{"src":"path"}}),_c('text',[_v("abc")])])`))
+    expect(imageCase.errors).toEqual([])
+
+    const complexCase = compile(`
+      <div>
+        <image src="path">
+        <image></image>
+        <div>
+          <embed>
+          <text>start</text>
+          <input type="text">
+          <input type="url" />
+          <text>end</text>
+        </div>
+      </div>
+    `)
+    expect(complexCase.render).toMatch(strToRegExp(`return _m(0)`))
+    expect(complexCase.staticRenderFns).toMatch(strToRegExp(`_c('image',{attrs:{"src":"path"}}),_c('image'),_c('div'`))
+    expect(complexCase.staticRenderFns).toMatch(strToRegExp(`_c('div',[_c('embed'),_c('text',[_v("start")]),_c('input',{attrs:{"type":"text"}}),_c('input',{attrs:{"type":"url"}}),_c('text',[_v("end")])]`))
+    expect(complexCase.errors).toEqual([])
+  })
+
+  it('should compile more complex situation', () => {
+    // from examples of https://github.com/alibaba/weex
+    const { render, staticRenderFns, errors } = compile(`
+      <refresh class="refresh" @refresh="handleRefresh" :display="displayRefresh"
+        style="flex-direction:row;">
+        <loading-indicator></loading-indicator>
+        <text style="margin-left:36px;color:#eee;">Load more...</text>
+      </refresh>
+    `)
+    expect(render).toEqual(`with(this){return _c('refresh',{staticClass:["refresh"],staticStyle:{flexDirection:"row"},attrs:{"display":displayRefresh},on:{"refresh":handleRefresh}},[_c('loading-indicator'),_c('text',{staticStyle:{marginLeft:"36px",color:"#eee"}},[_v("Load more...")])])}`)
+    expect(staticRenderFns).toEqual([])
+    expect(errors).toEqual([])
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/weex/compiler/parser.spec.js b/advancedcontentfilter/vendor/asset/vue/test/weex/compiler/parser.spec.js
new file mode 100644 (file)
index 0000000..1d560b5
--- /dev/null
@@ -0,0 +1,105 @@
+import { generateBinding } from '../../../src/platforms/weex/util/parser'
+
+describe('expression parser', () => {
+  describe('generateBinding', () => {
+    it('primitive literal', () => {
+      expect(generateBinding('15')).toEqual(15)
+      expect(generateBinding('"xxx"')).toEqual('xxx')
+    })
+
+    it('identifiers', () => {
+      expect(generateBinding('x')).toEqual({ '@binding': 'x' })
+      expect(generateBinding('x.y')).toEqual({ '@binding': 'x.y' })
+      expect(generateBinding(`x.y['z']`)).toEqual({ '@binding': `x.y['z']` })
+    })
+
+    it('object literal', () => {
+      expect(generateBinding('{}')).toEqual({})
+      expect(generateBinding('{ abc: 25 }')).toEqual({ abc: 25 })
+      expect(generateBinding('{ abc: 25, def: "xxx" }')).toEqual({ abc: 25, def: 'xxx' })
+      expect(generateBinding('{ a: 3, b: { bb: "bb", bbb: { bbc: "BBC" } } }'))
+        .toEqual({ a: 3, b: { bb: 'bb', bbb: { bbc: 'BBC' }}})
+    })
+
+    it('array literal', () => {
+      expect(generateBinding('[]')).toEqual([])
+      expect(generateBinding('[{ abc: 25 }]')).toEqual([{ abc: 25 }])
+      expect(generateBinding('[{ abc: 25, def: ["xxx"] }]')).toEqual([{ abc: 25, def: ['xxx'] }])
+      expect(generateBinding('{ a: [3,16], b: [{ bb: ["aa","bb"], bbb: [{bbc:"BBC"}] }] }'))
+        .toEqual({ a: [3, 16], b: [{ bb: ['aa', 'bb'], bbb: [{ bbc: 'BBC' }] }] })
+    })
+
+    it('expressions', () => {
+      expect(generateBinding(`3 + 5`)).toEqual({ '@binding': `3 + 5` })
+      expect(generateBinding(`'x' + 2`)).toEqual({ '@binding': `'x' + 2` })
+      expect(generateBinding(`\`xx\` + 2`)).toEqual({ '@binding': `\`xx\` + 2` })
+      expect(generateBinding(`item.size * 23 + 'px'`)).toEqual({ '@binding': `item.size * 23 + 'px'` })
+    })
+
+    it('object bindings', () => {
+      expect(generateBinding(`{ color: textColor }`)).toEqual({
+        color: { '@binding': 'textColor' }
+      })
+      expect(generateBinding(`{ color: '#FF' + 66 * 100, fontSize: item.size }`)).toEqual({
+        color: { '@binding': `'#FF' + 66 * 100` },
+        fontSize: { '@binding': 'item.size' }
+      })
+      expect(generateBinding(`{
+        x: { xx: obj, xy: -2 + 5 },
+        y: {
+          yy: { yyy: obj.y || yy },
+          yz: typeof object.yz === 'string' ? object.yz : ''
+        }
+      }`)).toEqual({
+        x: { xx: { '@binding': 'obj' }, xy: { '@binding': '-2 + 5' }},
+        y: {
+          yy: { yyy: { '@binding': 'obj.y || yy' }},
+          yz: { '@binding': `typeof object.yz === 'string' ? object.yz : ''` }
+        }
+      })
+    })
+
+    it('array bindings', () => {
+      expect(generateBinding(`[textColor, 3 + 5, 'string']`)).toEqual([
+        { '@binding': 'textColor' },
+        { '@binding': '3 + 5' },
+        'string'
+      ])
+      expect(generateBinding(`[
+        { color: '#FF' + 66 * -100 },
+        item && item.style,
+        { fontSize: item.size | 0 }
+      ]`)).toEqual([
+        { color: { '@binding': `'#FF' + 66 * -100` }},
+        { '@binding': 'item && item.style' },
+        { fontSize: { '@binding': 'item.size | 0' }}
+      ])
+      expect(generateBinding(`[{
+        x: [{ xx: [fn instanceof Function ? 'function' : '' , 25] }],
+        y: {
+          yy: [{ yyy: [obj.yy.y, obj.y.yy] }],
+          yz: [object.yz, void 0]
+        }
+      }]`)).toEqual([{
+        x: [{ xx: [{ '@binding': `fn instanceof Function ? 'function' : ''` }, 25] }],
+        y: {
+          yy: [{ yyy: [{ '@binding': 'obj.yy.y' }, { '@binding': 'obj.y.yy' }] }],
+          yz: [{ '@binding': 'object.yz' }, { '@binding': 'void 0' }]
+        }
+      }])
+    })
+
+    it('unsupported bindings', () => {
+      expect(generateBinding('() => {}')).toEqual('')
+      expect(generateBinding('function(){}')).toEqual('')
+      expect(generateBinding('(function(){})()')).toEqual('')
+      expect(generateBinding('var abc = 35')).toEqual('')
+      expect(generateBinding('abc++')).toEqual('')
+      expect(generateBinding('x.y(0)')).toEqual('')
+      expect(generateBinding('class X {}')).toEqual('')
+      expect(generateBinding('if (typeof x == null) { 35 }')).toEqual('')
+      expect(generateBinding('while (x == null)')).toEqual('')
+      expect(generateBinding('new Function()')).toEqual('')
+    })
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/weex/compiler/props.spec.js b/advancedcontentfilter/vendor/asset/vue/test/weex/compiler/props.spec.js
new file mode 100644 (file)
index 0000000..85f4e10
--- /dev/null
@@ -0,0 +1,22 @@
+import { compile } from '../../../packages/weex-template-compiler'
+import { strToRegExp } from '../helpers/index'
+
+describe('compile props', () => {
+  it('custom props', () => {
+    const { render, staticRenderFns, errors } = compile(`<div custom="whatever"></div>`)
+    expect(render).not.toBeUndefined()
+    expect(staticRenderFns).not.toBeUndefined()
+    expect(staticRenderFns.length).toEqual(0)
+    expect(render).toMatch(strToRegExp(`attrs:{"custom":"whatever"}`))
+    expect(errors).toEqual([])
+  })
+
+  it('camelize props', () => {
+    const { render, staticRenderFns, errors } = compile(`<div kebab-case="whatever"></div>`)
+    expect(render).not.toBeUndefined()
+    expect(staticRenderFns).not.toBeUndefined()
+    expect(staticRenderFns.length).toEqual(0)
+    expect(render).toMatch(strToRegExp(`attrs:{"kebabCase":"whatever"}`))
+    expect(errors).toEqual([])
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/weex/compiler/style.spec.js b/advancedcontentfilter/vendor/asset/vue/test/weex/compiler/style.spec.js
new file mode 100644 (file)
index 0000000..efde3c3
--- /dev/null
@@ -0,0 +1,83 @@
+import { compile } from '../../../packages/weex-template-compiler'
+import { strToRegExp } from '../helpers/index'
+
+describe('compile style', () => {
+  it('should be compiled', () => {
+    const { render, staticRenderFns, errors } = compile(`<div style="a: x; b: y"></div>`)
+    expect(render).not.toBeUndefined()
+    expect(staticRenderFns).not.toBeUndefined()
+    expect(staticRenderFns.length).toEqual(0)
+    expect(render).toMatch(strToRegExp(`staticStyle:{a:"x",b:"y"}`))
+    expect(errors).toEqual([])
+  })
+
+  it('should compile empty style value', () => {
+    const { render, staticRenderFns, errors } = compile(`<div style=""></div>`)
+    expect(render).not.toBeUndefined()
+    expect(staticRenderFns).not.toBeUndefined()
+    expect(staticRenderFns.length).toEqual(0)
+    expect(render).toMatch(/[(^style|^staticStyle)]/)
+    expect(errors).toEqual([])
+  })
+
+  it('should compile style value with trailing semicolon', () => {
+    const { render, staticRenderFns, errors } = compile(`<div style="a: x; b: y;"></div>`)
+    expect(render).not.toBeUndefined()
+    expect(staticRenderFns).not.toBeUndefined()
+    expect(staticRenderFns.length).toEqual(0)
+    expect(render).toMatch(strToRegExp(`staticStyle:{a:"x",b:"y"}`))
+    expect(errors).toEqual([])
+  })
+
+  it('should compile hyphenated style name & value', () => {
+    const { render, staticRenderFns, errors } = compile(`<div style="-abc-def: x-y; abc-def: x-y"></div>`)
+    expect(render).not.toBeUndefined()
+    expect(staticRenderFns).not.toBeUndefined()
+    expect(staticRenderFns.length).toEqual(0)
+    expect(render).toMatch(strToRegExp(`staticStyle:{AbcDef:"x-y",abcDef:"x-y"}`))
+    expect(errors).toEqual([])
+  })
+
+  it('should compile dynamic style', () => {
+    const { render, staticRenderFns, errors } = compile(`<div style="a: x; b: {{y}}"></div>`)
+    expect(render).not.toBeUndefined()
+    expect(staticRenderFns).toEqual([])
+    expect(render).toMatch(strToRegExp(`style:{a:"x",b:_s(y)}`))
+    expect(errors).not.toBeUndefined()
+    expect(errors.length).toEqual(1)
+    expect(errors[0]).toMatch(strToRegExp(`b: {{y}}`))
+    expect(errors[0]).toMatch(strToRegExp(`v-bind`))
+  })
+
+  it('should compile style binding of array', () => {
+    const { render, staticRenderFns, errors } = compile(`<div v-bind:style="[a, b, c]"></div>`)
+    expect(render).not.toBeUndefined()
+    expect(staticRenderFns).toEqual([])
+    expect(render).toMatch(strToRegExp(`style:[a, b, c]`))
+    expect(errors).toEqual([])
+  })
+
+  it('should compile style binding of map', () => {
+    const { render, staticRenderFns, errors } = compile(`<div v-bind:style="{ a: x, b: 'y' + z }"></div>`)
+    expect(render).not.toBeUndefined()
+    expect(staticRenderFns).toEqual([])
+    expect(render).toMatch(strToRegExp(`style:{ a: x, b: 'y' + z }`))
+    expect(errors).toEqual([])
+  })
+
+  it('should compile style binding of a variable', () => {
+    const { render, staticRenderFns, errors } = compile(`<div v-bind:style="x"></div>`)
+    expect(render).not.toBeUndefined()
+    expect(staticRenderFns).toEqual([])
+    expect(render).toMatch(strToRegExp(`style:x`))
+    expect(errors).toEqual([])
+  })
+
+  it('should compile style binding by shorthand', () => {
+    const { render, staticRenderFns, errors } = compile(`<div :style="[a, b, c]"></div>`)
+    expect(render).not.toBeUndefined()
+    expect(staticRenderFns).toEqual([])
+    expect(render).toMatch(strToRegExp(`style:[a, b, c]`))
+    expect(errors).toEqual([])
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/weex/compiler/v-model.spec.js b/advancedcontentfilter/vendor/asset/vue/test/weex/compiler/v-model.spec.js
new file mode 100644 (file)
index 0000000..c5f0401
--- /dev/null
@@ -0,0 +1,41 @@
+import { compile } from '../../../packages/weex-template-compiler'
+import { strToRegExp } from '../helpers/index'
+
+describe('compile v-model', () => {
+  it('should compile modelable native component', () => {
+    const { render, staticRenderFns, errors } = compile(`<div><input v-model="x" /></div>`)
+    expect(render).not.toBeUndefined()
+    expect(render).toMatch(strToRegExp(`attrs:{"value":(x)}`))
+    expect(render).toMatch(strToRegExp(`on:{"input":function($event){x=$event.target.attr.value}}`))
+    expect(staticRenderFns).toEqual([])
+    expect(errors).toEqual([])
+  })
+
+  it('should compile other component with whole $event as the value', () => {
+    const { render, staticRenderFns, errors } = compile(`<div><foo v-model="x" /></div>`)
+    expect(render).not.toBeUndefined()
+    expect(render).toMatch(strToRegExp(`model:{value:(x),callback:function ($$v) {x=$$v},expression:"x"}`))
+    expect(staticRenderFns).toEqual([])
+    expect(errors).toEqual([])
+  })
+
+  it('should compile with trim modifier for modelable native component', () => {
+    const { render, staticRenderFns, errors } = compile(`<div><input v-model.trim="x" /></div>`)
+    expect(render).not.toBeUndefined()
+    expect(render).toMatch(strToRegExp(`attrs:{"value":(x)}`))
+    expect(render).toMatch(strToRegExp(`on:{"input":function($event){x=$event.target.attr.value.trim()}}`))
+    expect(staticRenderFns).toEqual([])
+    expect(errors).toEqual([])
+  })
+
+  it('should compile with trim & lazy modifier', () => {
+    const { render, staticRenderFns, errors } = compile(`<div><input v-model.trim.lazy="x" /><input v-model.lazy.trim="y" /></div>`)
+    expect(render).not.toBeUndefined()
+    expect(render).toMatch(strToRegExp(`attrs:{"value":(x)}`))
+    expect(render).toMatch(strToRegExp(`attrs:{"value":(y)}`))
+    expect(render).toMatch(strToRegExp(`on:{"change":function($event){x=$event.target.attr.value.trim()}}`))
+    expect(render).toMatch(strToRegExp(`on:{"change":function($event){y=$event.target.attr.value.trim()}}`))
+    expect(staticRenderFns).toEqual([])
+    expect(errors).toEqual([])
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/weex/helpers/index.js b/advancedcontentfilter/vendor/asset/vue/test/weex/helpers/index.js
new file mode 100644 (file)
index 0000000..ce74bf8
--- /dev/null
@@ -0,0 +1,233 @@
+import fs from 'fs'
+import path from 'path'
+import * as Vue from '../../../packages/weex-vue-framework'
+import { compile } from '../../../packages/weex-template-compiler'
+import WeexRuntime from 'weex-js-runtime'
+import styler from 'weex-styler'
+
+const styleRE = /<\s*style\s*\w*>([^(<\/)]*)<\/\s*style\s*>/g
+const scriptRE = /<\s*script.*>([^]*)<\/\s*script\s*>/
+const templateRE = /<\s*template\s*([^>]*)>([^]*)<\/\s*template\s*>/
+
+export function readFile (filename) {
+  return fs.readFileSync(path.resolve(__dirname, '../cases/', filename), 'utf8')
+}
+
+export function readObject (filename) {
+  return (new Function(`return ${readFile(filename)}`))()
+}
+
+console.debug = () => {}
+
+// http://stackoverflow.com/a/35478115
+const matchOperatorsRe = /[|\\{}()[\]^$+*?.]/g
+export function strToRegExp (str) {
+  return new RegExp(str.replace(matchOperatorsRe, '\\$&'))
+}
+
+function parseStatic (fns) {
+  return '[' + fns.map(fn => `function () { ${fn} }`).join(',') + ']'
+}
+
+export function compileAndStringify (template) {
+  const { render, staticRenderFns } = compile(template)
+  return {
+    render: `function () { ${render} }`,
+    staticRenderFns: parseStatic(staticRenderFns)
+  }
+}
+
+/**
+ * Compile *.vue file into js code
+ * @param {string} source raw text of *.vue file
+ * @param {string} componentName whether compile to a component
+ */
+export function compileVue (source, componentName) {
+  return new Promise((resolve, reject) => {
+    if (!templateRE.test(source)) {
+      return reject('No Template!')
+    }
+    const scriptMatch = scriptRE.exec(source)
+    const script = scriptMatch ? scriptMatch[1] : ''
+    const templateMatch = templateRE.exec(source)
+    const compileOptions = {}
+    if (/\s*recyclable\=?/i.test(templateMatch[1])) {
+      compileOptions.recyclable = true
+    }
+    const res = compile(templateMatch[2], compileOptions)
+
+    const name = 'test_case_' + (Math.random() * 99999999).toFixed(0)
+    const generateCode = styles => (`
+      try { weex.document.registerStyleSheets("${name}", [${JSON.stringify(styles)}]) } catch(e) {};
+      var ${name} = Object.assign({
+        _scopeId: "${name}",
+        style: ${JSON.stringify(styles)},
+        render: function () { ${res.render} },
+        ${res['@render'] ? ('"@render": function () {' + res['@render'] + '},') : ''}
+        staticRenderFns: ${parseStatic(res.staticRenderFns)},
+      }, (function(){
+        var module = { exports: {} };
+        ${script};
+        return module.exports;
+      })());
+    ` + (componentName
+        ? `Vue.component('${componentName}', ${name});\n`
+        : `${name}.el = 'body';new Vue(${name});`)
+    )
+
+    let cssText = ''
+    let styleMatch = null
+    while ((styleMatch = styleRE.exec(source))) {
+      cssText += `\n${styleMatch[1]}\n`
+    }
+    styler.parse(cssText, (error, result) => {
+      if (error) {
+        return reject(error)
+      }
+      resolve(generateCode(result.jsonStyle))
+    })
+    resolve(generateCode({}))
+  })
+}
+
+export function compileWithDeps (entryPath, deps) {
+  return new Promise((resolve, reject) => {
+    if (Array.isArray(deps)) {
+      Promise.all(deps.map(dep => {
+        return compileVue(readFile(dep.path), dep.name).catch(reject)
+      })).then(depCodes => {
+        compileVue(readFile(entryPath)).then(entryCode => {
+          resolve(depCodes.join('\n') + entryCode)
+        }).catch(reject)
+      }).catch(reject)
+    }
+  })
+}
+
+function isObject (object) {
+  return object !== null && typeof object === 'object'
+}
+
+function isEmptyObject (object) {
+  return isObject(object) && Object.keys(object).length < 1
+}
+
+function omitUseless (object) {
+  if (isObject(object)) {
+    delete object.ref
+    for (const key in object) {
+      omitUseless(object[key])
+      if (key === '@styleScope' ||
+        key === '@templateId' ||
+        key === 'bindingExpression') {
+        delete object[key]
+      }
+      if (key.charAt(0) !== '@' &&
+        (isEmptyObject(object[key]) || object[key] === undefined)) {
+        delete object[key]
+      }
+    }
+  }
+  return object
+}
+
+export function getRoot (instance) {
+  return omitUseless(instance.$getRoot())
+}
+
+// Get all binding events in the instance
+export function getEvents (instance) {
+  const events = []
+  const recordEvent = node => {
+    if (!node) { return }
+    if (Array.isArray(node.event)) {
+      node.event.forEach(type => {
+        events.push({ ref: node.ref, type })
+      })
+    }
+    if (Array.isArray(node.children)) {
+      node.children.forEach(recordEvent)
+    }
+  }
+  recordEvent(instance.$getRoot())
+  return events
+}
+
+export function fireEvent (instance, ref, type, event = {}) {
+  const el = instance.document.getRef(ref)
+  if (el) {
+    instance.document.fireEvent(el, type, event)
+  }
+}
+
+export function createInstance (id, code, ...args) {
+  WeexRuntime.config.frameworks = { Vue }
+  const context = WeexRuntime.init(WeexRuntime.config)
+  context.registerModules({
+    timer: ['setTimeout', 'setInterval']
+  })
+  const instance = context.createInstance(id, `// { "framework": "Vue" }\n${code}`, ...args) || {}
+  instance.document = context.getDocument(id)
+  instance.$getRoot = () => context.getRoot(id)
+  instance.$refresh = (data) => context.refreshInstance(id, data)
+  instance.$destroy = () => {
+    delete instance.document
+    context.destroyInstance(id)
+  }
+  instance.$triggerHook = (id, hook, args) => {
+    instance.document.taskCenter.triggerHook(id, 'lifecycle', hook, { args })
+  }
+  return instance
+}
+
+export function compileAndExecute (template, additional = '') {
+  return new Promise(resolve => {
+    const id = String(Date.now() * Math.random())
+    const { render, staticRenderFns } = compile(template)
+    const instance = createInstance(id, `
+      new Vue({
+        el: '#whatever',
+        render: function () { ${render} },
+        staticRenderFns: ${parseStatic(staticRenderFns)},
+        ${additional}
+      })
+    `)
+    setTimeout(() => resolve(instance), 10)
+  })
+}
+
+export function syncPromise (arr) {
+  let p = Promise.resolve()
+  arr.forEach(item => {
+    p = p.then(item)
+  })
+  return p
+}
+
+export function checkRefresh (instance, data, checker) {
+  return () => new Promise(res => {
+    instance.$refresh(data)
+    setTimeout(() => {
+      checker(getRoot(instance))
+      res()
+    })
+  })
+}
+
+export function addTaskHook (hook) {
+  global.callNative = function callNative (id, tasks) {
+    if (Array.isArray(tasks) && typeof hook === 'function') {
+      tasks.forEach(task => {
+        hook(id, {
+          module: task.module,
+          method: task.method,
+          args: Array.from(task.args)
+        })
+      })
+    }
+  }
+}
+
+export function resetTaskHook () {
+  delete global.callNative
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/test/weex/jasmine.json b/advancedcontentfilter/vendor/asset/vue/test/weex/jasmine.json
new file mode 100644 (file)
index 0000000..1dba693
--- /dev/null
@@ -0,0 +1,9 @@
+{
+  "spec_dir": "test/weex",
+  "spec_files": [
+    "**/*[sS]pec.js"
+  ],
+  "helpers": [
+    "../../node_modules/babel-register/lib/node.js"
+  ]
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/test/weex/runtime/attrs.spec.js b/advancedcontentfilter/vendor/asset/vue/test/weex/runtime/attrs.spec.js
new file mode 100644 (file)
index 0000000..037067a
--- /dev/null
@@ -0,0 +1,89 @@
+import { getRoot, fireEvent, compileAndExecute } from '../helpers/index'
+
+describe('generate attribute', () => {
+  it('should be generated', (done) => {
+    compileAndExecute(`
+      <div>
+        <text value="Hello World" style="font-size: 100"></text>
+      </div>
+    `).then(instance => {
+      expect(getRoot(instance)).toEqual({
+        type: 'div',
+        children: [{
+          type: 'text',
+          style: { fontSize: '100' },
+          attr: { value: 'Hello World' }
+        }]
+      })
+      done()
+    }).catch(e => done.fail(e))
+  })
+
+  it('should be updated', (done) => {
+    compileAndExecute(`
+      <div @click="foo">
+        <text :value="x"></text>
+      </div>
+    `, `
+      data: { x: 'Hello World' },
+      methods: {
+        foo: function () {
+          this.x = 'Hello Vue'
+        }
+      }
+    `).then(instance => {
+      expect(getRoot(instance)).toEqual({
+        type: 'div',
+        event: ['click'],
+        children: [
+          { type: 'text', attr: { value: 'Hello World' }}
+        ]
+      })
+      fireEvent(instance, '_root', 'click')
+      return instance
+    }).then(instance => {
+      expect(getRoot(instance)).toEqual({
+        type: 'div',
+        event: ['click'],
+        children: [
+          { type: 'text', attr: { value: 'Hello Vue' }}
+        ]
+      })
+      done()
+    }).catch(e => done.fail(e))
+  })
+
+  it('should be cleared', (done) => {
+    compileAndExecute(`
+      <div @click="foo">
+        <text :value="x"></text>
+      </div>
+    `, `
+      data: { x: 'Hello World' },
+      methods: {
+        foo: function () {
+          this.x = ''
+        }
+      }
+    `).then(instance => {
+      expect(getRoot(instance)).toEqual({
+        type: 'div',
+        event: ['click'],
+        children: [
+          { type: 'text', attr: { value: 'Hello World' }}
+        ]
+      })
+      fireEvent(instance, '_root', 'click')
+      return instance
+    }).then(instance => {
+      expect(getRoot(instance)).toEqual({
+        type: 'div',
+        event: ['click'],
+        children: [
+          { type: 'text', attr: { value: '' }}
+        ]
+      })
+      done()
+    })
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/weex/runtime/class.spec.js b/advancedcontentfilter/vendor/asset/vue/test/weex/runtime/class.spec.js
new file mode 100644 (file)
index 0000000..ec704f7
--- /dev/null
@@ -0,0 +1,161 @@
+import { getRoot, fireEvent, compileAndExecute } from '../helpers/index'
+
+describe('generate class', () => {
+  it('should be generated', () => {
+    compileAndExecute(`
+      <div>
+        <text class="a b c">Hello World</text>
+      </div>
+    `, `
+      style: {
+        a: { fontSize: '100' },
+        b: { color: '#ff0000' },
+        c: { fontWeight: 'bold' }
+      }
+    `).then(instance => {
+      expect(getRoot(instance)).toEqual({
+        type: 'div',
+        children: [{
+          type: 'text',
+          classList: ['a', 'b', 'c'],
+          attr: { value: 'Hello World' }
+        }]
+      })
+    })
+  })
+
+  it('should be updated', (done) => {
+    compileAndExecute(`
+      <div @click="foo">
+        <text :class="['a', x]">Hello World</text>
+      </div>
+    `, `
+      data: { x: 'b' },
+      style: {
+        a: { fontSize: '100' },
+        b: { color: '#ff0000' },
+        c: { fontWeight: 'bold' },
+        d: {
+          color: '#0000ff',
+          fontWeight: 'bold'
+        }
+      },
+      methods: {
+        foo: function () {
+          this.x = 'd'
+        }
+      }
+    `).then(instance => {
+      expect(getRoot(instance)).toEqual({
+        type: 'div',
+        event: ['click'],
+        children: [{
+          type: 'text',
+          classList: ['a', 'b'],
+          attr: { value: 'Hello World' }
+        }]
+      })
+      fireEvent(instance, '_root', 'click')
+      return instance
+    }).then(instance => {
+      expect(getRoot(instance)).toEqual({
+        type: 'div',
+        event: ['click'],
+        children: [{
+          type: 'text',
+          classList: ['a', 'd'],
+          attr: { value: 'Hello World' }
+        }]
+      })
+      done()
+    })
+  })
+
+  it('should be applied in order', (done) => {
+    compileAndExecute(`
+      <div @click="foo">
+        <text :class="arr">Hello World</text>
+      </div>
+    `, `
+      data: {
+        arr: ['b', 'a']
+      },
+      style: {
+        a: { color: '#ff0000' },
+        b: { color: '#00ff00' },
+        c: { color: '#0000ff' }
+      },
+      methods: {
+        foo: function () {
+          this.arr.push('c')
+        }
+      }
+    `).then(instance => {
+      expect(getRoot(instance)).toEqual({
+        type: 'div',
+        event: ['click'],
+        children: [{
+          type: 'text',
+          classList: ['b', 'a'],
+          attr: { value: 'Hello World' }
+        }]
+      })
+      fireEvent(instance, '_root', 'click')
+      return instance
+    }).then(instance => {
+      expect(getRoot(instance)).toEqual({
+        type: 'div',
+        event: ['click'],
+        children: [{
+          type: 'text',
+          classList: ['b', 'a', 'c'],
+          attr: { value: 'Hello World' }
+        }]
+      })
+      done()
+    })
+  })
+
+  it('should be cleared', (done) => {
+    compileAndExecute(`
+      <div @click="foo">
+        <text :class="['a', x]">Hello World</text>
+      </div>
+    `, `
+      data: { x: 'b' },
+      style: {
+        a: { fontSize: '100' },
+        b: { color: '#ff0000' },
+        c: { fontWeight: 'bold' }
+      },
+      methods: {
+        foo: function () {
+          this.x = 'c'
+        }
+      }
+    `).then(instance => {
+      expect(getRoot(instance)).toEqual({
+        type: 'div',
+        event: ['click'],
+        children: [{
+          type: 'text',
+          classList: ['a', 'b'],
+          attr: { value: 'Hello World' }
+        }]
+      })
+      fireEvent(instance, '_root', 'click')
+      return instance
+    }).then(instance => {
+      expect(getRoot(instance)).toEqual({
+        type: 'div',
+        event: ['click'],
+        children: [{
+          type: 'text',
+          classList: ['a', 'c'],
+          attr: { value: 'Hello World' }
+        }]
+      })
+      done()
+    })
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/weex/runtime/components/richtext.spec.js b/advancedcontentfilter/vendor/asset/vue/test/weex/runtime/components/richtext.spec.js
new file mode 100644 (file)
index 0000000..7d10498
--- /dev/null
@@ -0,0 +1,692 @@
+import {
+  compileAndStringify,
+  getRoot,
+  fireEvent,
+  createInstance
+} from '../../helpers/index'
+
+function compileSnippet (snippet, additional) {
+  const { render, staticRenderFns } = compileAndStringify(`<div>${snippet}</div>`)
+  const id = String(Date.now() * Math.random())
+  const instance = createInstance(id, `
+    new Vue({
+      el: 'body',
+      render: ${render},
+      staticRenderFns: ${staticRenderFns},
+      ${additional}
+    })
+  `)
+  return getRoot(instance).children[0]
+}
+
+describe('richtext component', () => {
+  it('with no child', () => {
+    expect(compileSnippet(`
+      <richtext></richtext>
+    `)).toEqual({
+      type: 'richtext'
+    })
+  })
+
+  it('with single text node', () => {
+    expect(compileSnippet(`
+      <richtext>single</richtext>
+    `)).toEqual({
+      type: 'richtext',
+      attr: {
+        value: [{
+          type: 'span',
+          attr: {
+            value: 'single'
+          }
+        }]
+      }
+    })
+  })
+
+  describe('span', () => {
+    it('single node', () => {
+      expect(compileSnippet(`
+        <richtext>
+          <span>single</span>
+        </richtext>
+      `)).toEqual({
+        type: 'richtext',
+        attr: {
+          value: [{
+            type: 'span',
+            attr: {
+              value: 'single'
+            }
+          }]
+        }
+      })
+    })
+
+    it('multiple node', () => {
+      expect(compileSnippet(`
+        <richtext>
+          <span>AAA</span>
+          <span>BBB</span>
+        </richtext>
+      `)).toEqual({
+        type: 'richtext',
+        attr: {
+          value: [{
+            type: 'span',
+            attr: { value: 'AAA' }
+          }, {
+            type: 'span',
+            attr: { value: 'BBB' }
+          }]
+        }
+      })
+    })
+
+    it('with raw text', () => {
+      expect(compileSnippet(`
+        <richtext>
+          AAA
+          <span>BBB</span>CCC
+          <span>DDD</span>
+        </richtext>
+      `)).toEqual({
+        type: 'richtext',
+        attr: {
+          value: [{
+            type: 'span',
+            attr: { value: 'AAA' }
+          }, {
+            type: 'span',
+            attr: { value: 'BBB' }
+          }, {
+            type: 'span',
+            attr: { value: 'CCC' }
+          }, {
+            type: 'span',
+            attr: { value: 'DDD' }
+          }]
+        }
+      })
+    })
+  })
+
+  describe('a', () => {
+    it('single node', () => {
+      expect(compileSnippet(`
+        <richtext>
+          <a href="http://whatever.com"></a>
+        </richtext>
+      `)).toEqual({
+        type: 'richtext',
+        attr: {
+          value: [{
+            type: 'a',
+            attr: { href: 'http://whatever.com' }
+          }]
+        }
+      })
+    })
+
+    it('multiple node', () => {
+      expect(compileSnippet(`
+        <richtext>
+          <a href="http://a.whatever.com"></a>
+          <a href="http://b.whatever.com"></a>
+        </richtext>
+      `)).toEqual({
+        type: 'richtext',
+        attr: {
+          value: [{
+            type: 'a',
+            attr: { href: 'http://a.whatever.com' }
+          }, {
+            type: 'a',
+            attr: { href: 'http://b.whatever.com' }
+          }]
+        }
+      })
+    })
+  })
+
+  describe('image', () => {
+    it('single node', () => {
+      expect(compileSnippet(`
+        <richtext>
+          <image src="path/to/profile.png"></image>
+        </richtext>
+      `)).toEqual({
+        type: 'richtext',
+        attr: {
+          value: [{
+            type: 'image',
+            attr: { src: 'path/to/profile.png' }
+          }]
+        }
+      })
+    })
+
+    it('multiple node', () => {
+      expect(compileSnippet(`
+        <richtext>
+          <image src="path/to/A.png"></image>
+          <image src="path/to/B.png"></image>
+        </richtext>
+      `)).toEqual({
+        type: 'richtext',
+        attr: {
+          value: [{
+            type: 'image',
+            attr: { src: 'path/to/A.png' }
+          }, {
+            type: 'image',
+            attr: { src: 'path/to/B.png' }
+          }]
+        }
+      })
+    })
+
+    it('with width and height', () => {
+      expect(compileSnippet(`
+        <richtext>
+          <image
+            style="width:150px;height:150px;"
+            src="path/to/profile.png">
+          </image>
+        </richtext>
+      `)).toEqual({
+        type: 'richtext',
+        attr: {
+          value: [{
+            type: 'image',
+            style: { width: '150px', height: '150px' },
+            attr: { src: 'path/to/profile.png' }
+          }]
+        }
+      })
+    })
+  })
+
+  describe('nested', () => {
+    it('span', () => {
+      expect(compileSnippet(`
+        <richtext>
+          <span>AAA
+            <span>
+              <span>BBB</span>
+              <span><span>CCC</span>DDD</span>
+            </span>
+          </span>
+        </richtext>
+      `)).toEqual({
+        type: 'richtext',
+        attr: {
+          value: [{
+            type: 'span',
+            children: [{
+              type: 'span',
+              attr: { value: 'AAA' }
+            }, {
+              type: 'span',
+              children: [{
+                type: 'span',
+                attr: { value: 'BBB' }
+              }, {
+                type: 'span',
+                children: [{
+                  type: 'span',
+                  attr: { value: 'CCC' }
+                }, {
+                  type: 'span',
+                  attr: { value: 'DDD' }
+                }]
+              }]
+            }]
+          }]
+        }
+      })
+    })
+
+    it('image and a', () => {
+      expect(compileSnippet(`
+        <richtext>
+          <span>title</span>
+          <a href="http://remote.com/xx.js">
+            <span><span>name</span></span>
+            <image src="path/to/yy.gif"></image>
+          </a>
+        </richtext>
+      `)).toEqual({
+        type: 'richtext',
+        attr: {
+          value: [{
+            type: 'span',
+            attr: { value: 'title' }
+          }, {
+            type: 'a',
+            attr: { href: 'http://remote.com/xx.js' },
+            children: [{
+              type: 'span',
+              children: [{
+                type: 'span',
+                attr: { value: 'name' }
+              }]
+            }, {
+              type: 'image',
+              attr: { src: 'path/to/yy.gif' }
+            }]
+          }]
+        }
+      })
+    })
+  })
+
+  describe('with styles', () => {
+    it('inline', () => {
+      expect(compileSnippet(`
+        <richtext>
+          <span style="font-size:16px;color:#FF6600;">ABCD</span>
+          <image style="width:33.33px;height:66.67px" src="path/to/A.png"></image>
+        </richtext>
+      `)).toEqual({
+        type: 'richtext',
+        attr: {
+          value: [{
+            type: 'span',
+            style: { fontSize: '16px', color: '#FF6600' },
+            attr: { value: 'ABCD' }
+          }, {
+            type: 'image',
+            style: { width: '33.33px', height: '66.67px' },
+            attr: { src: 'path/to/A.png' }
+          }]
+        }
+      })
+    })
+
+    it('class list', () => {
+      expect(compileSnippet(`
+        <richtext>
+          <image class="icon" src="path/to/A.png"></image>
+          <span class="title large">ABCD</span>
+        </richtext>
+      `, `
+        style: {
+          title: { color: '#FF6600' },
+          large: { fontSize: 24 },
+          icon: { width: 40, height: 60 }
+        }
+      `)).toEqual({
+        type: 'richtext',
+        attr: {
+          value: [{
+            type: 'image',
+            style: { width: 40, height: 60 },
+            attr: { src: 'path/to/A.png' }
+          }, {
+            type: 'span',
+            style: { fontSize: 24, color: '#FF6600' },
+            attr: { value: 'ABCD' }
+          }]
+        }
+      })
+    })
+  })
+
+  describe('data binding', () => {
+    it('simple', () => {
+      expect(compileSnippet(`
+        <richtext>
+          <span>{{name}}</span>
+        </richtext>
+      `, `data: { name: 'ABCDEFG' }`)).toEqual({
+        type: 'richtext',
+        attr: {
+          value: [{
+            type: 'span',
+            attr: { value: 'ABCDEFG' }
+          }]
+        }
+      })
+    })
+
+    it('nested', () => {
+      expect(compileSnippet(`
+        <richtext>
+          <span>{{a}}</span>
+          <span>{{b}}<span>{{c.d}}</span></span>
+          <span>{{e}}</span>
+        </richtext>
+      `, `
+        data: { a: 'A', b: 'B', c: { d: 'CD' }, e: 'E' }
+      `)).toEqual({
+        type: 'richtext',
+        attr: {
+          value: [{
+            type: 'span',
+            attr: { value: 'A' }
+          }, {
+            type: 'span',
+            children: [{
+              type: 'span',
+              attr: { value: 'B' }
+            }, {
+              type: 'span',
+              attr: { value: 'CD' }
+            }]
+          }, {
+            type: 'span',
+            attr: { value: 'E' }
+          }]
+        }
+      })
+    })
+
+    it('update', () => {
+      expect(compileSnippet(`
+        <richtext>
+          <span>{{name}}</span>
+        </richtext>
+      `, `
+        data: { name: 'default' },
+        created: function () {
+          this.name = 'updated'
+        }
+      `)).toEqual({
+        type: 'richtext',
+        attr: {
+          value: [{
+            type: 'span',
+            attr: { value: 'updated' }
+          }]
+        }
+      })
+    })
+
+    it('attribute', () => {
+      expect(compileSnippet(`
+        <richtext>
+          <span :label="label">{{name}}</span>
+        </richtext>
+      `, `
+        data: {
+          label: 'uid',
+          name: '10100'
+        }
+      `)).toEqual({
+        type: 'richtext',
+        attr: {
+          value: [{
+            type: 'span',
+            attr: {
+              label: 'uid',
+              value: '10100'
+            }
+          }]
+        }
+      })
+    })
+
+    it('update attribute', () => {
+      expect(compileSnippet(`
+        <richtext>
+          <span :label="label">{{name}}</span>
+        </richtext>
+      `, `
+        data: {
+          label: 'name',
+          name: 'Hanks'
+        },
+        created: function () {
+          this.label = 'uid';
+          this.name = '10100';
+        }
+      `)).toEqual({
+        type: 'richtext',
+        attr: {
+          value: [{
+            type: 'span',
+            attr: {
+              label: 'uid',
+              value: '10100'
+            }
+          }]
+        }
+      })
+    })
+
+    it('inline style', () => {
+      expect(compileSnippet(`
+        <richtext>
+          <span :style="styleObject">ABCD</span>
+          <span :style="{ textAlign: align, color: 'red' }">EFGH</span>
+        </richtext>
+      `, `
+        data: {
+          styleObject: { fontSize: '32px', color: '#F6F660' },
+          align: 'center'
+        }
+      `)).toEqual({
+        type: 'richtext',
+        attr: {
+          value: [{
+            type: 'span',
+            style: { fontSize: '32px', color: '#F6F660' },
+            attr: { value: 'ABCD' }
+          }, {
+            type: 'span',
+            style: { textAlign: 'center', color: 'red' },
+            attr: { value: 'EFGH' }
+          }]
+        }
+      })
+    })
+
+    it('class list', () => {
+      expect(compileSnippet(`
+        <richtext>
+          <image :class="classList" src="path/to/A.png"></image>
+          <span :class="['title', size]">ABCD</span>
+          <span class="large" style="color:#F6F0F4">EFGH</span>
+        </richtext>
+      `, `
+        style: {
+          title: { color: '#FF6600' },
+          large: { fontSize: 24 },
+          icon: { width: 40, height: 60 }
+        },
+        data: {
+          classList: ['unknown'],
+          size: 'small'
+        },
+        created: function () {
+          this.classList = ['icon'];
+          this.size = 'large';
+        }
+      `)).toEqual({
+        type: 'richtext',
+        attr: {
+          value: [{
+            type: 'image',
+            style: { width: 40, height: 60 },
+            attr: { src: 'path/to/A.png' }
+          }, {
+            type: 'span',
+            style: { fontSize: 24, color: '#FF6600' },
+            attr: { value: 'ABCD' }
+          }, {
+            type: 'span',
+            style: { fontSize: 24, color: '#F6F0F4' },
+            attr: { value: 'EFGH' }
+          }]
+        }
+      })
+    })
+
+    it('update inline style', () => {
+      expect(compileSnippet(`
+        <richtext>
+          <span :style="styleObject">ABCD</span>
+          <span :style="{ textAlign: align, color: 'red' }">EFGH</span>
+        </richtext>
+      `, `
+        data: {
+          styleObject: { fontSize: '32px', color: '#F6F660' }
+        },
+        created: function () {
+          this.styleObject = { fontSize: '24px', color: 'blue' }
+          this.styleObject.color = '#ABCDEF'
+          this.align = 'left'
+        }
+      `)).toEqual({
+        type: 'richtext',
+        attr: {
+          value: [{
+            type: 'span',
+            style: { fontSize: '24px', color: '#ABCDEF' },
+            attr: { value: 'ABCD' }
+          }, {
+            type: 'span',
+            style: { textAlign: 'left', color: 'red' },
+            attr: { value: 'EFGH' }
+          }]
+        }
+      })
+    })
+  })
+
+  describe('itself', () => {
+    it('inline styles', () => {
+      expect(compileSnippet(`
+        <richtext style="background-color:red">
+          <span>empty</span>
+        </richtext>
+      `)).toEqual({
+        type: 'richtext',
+        style: { backgroundColor: 'red' },
+        attr: {
+          value: [{
+            type: 'span',
+            attr: { value: 'empty' }
+          }]
+        }
+      })
+    })
+
+    it('class list', () => {
+      expect(compileSnippet(`
+        <richtext class="title">
+          <span class="large">ABCD</span>
+        </richtext>
+      `, `
+        style: {
+          title: { backgroundColor: '#FF6600', height: 200 },
+          large: { fontSize: 24 }
+        }
+      `)).toEqual({
+        type: 'richtext',
+        classList: ['title'],
+        attr: {
+          value: [{
+            type: 'span',
+            style: { fontSize: 24 },
+            attr: { value: 'ABCD' }
+          }]
+        }
+      })
+    })
+
+    it('update styles', () => {
+      expect(compileSnippet(`
+        <richtext :class="classList" :style="{ backgroundColor: color }">
+          <span class="large">ABCD</span>
+        </richtext>
+      `, `
+        data: { classList: ['unknow'], color: '#FF6600' },
+        style: {
+          title: { height: 200 },
+          large: { fontSize: 24 }
+        },
+        created: function () {
+          this.classList = ['title']
+        }
+      `)).toEqual({
+        type: 'richtext',
+        classList: ['title'],
+        style: { backgroundColor: '#FF6600' },
+        attr: {
+          value: [{
+            type: 'span',
+            style: { fontSize: 24 },
+            attr: { value: 'ABCD' }
+          }]
+        }
+      })
+    })
+
+    it('bind events', (done) => {
+      const { render, staticRenderFns } = compileAndStringify(`
+        <div>
+          <richtext @click="handler">
+            <span>Label: {{label}}</span>
+          </richtext>
+        </div>
+      `)
+      const id = String(Date.now() * Math.random())
+      const instance = createInstance(id, `
+        new Vue({
+          el: 'body',
+          render: ${render},
+          staticRenderFns: ${staticRenderFns},
+          data: { label: 'AAA' },
+          methods: {
+            handler: function () {
+              this.label = 'BBB'
+            }
+          }
+        })
+      `)
+      const richtext = instance.document.body.children[0]
+      fireEvent(instance, richtext.ref, 'click')
+      setTimeout(() => {
+        expect(getRoot(instance).children[0]).toEqual({
+          type: 'richtext',
+          event: ['click'],
+          attr: {
+            value: [{
+              type: 'span',
+              attr: { value: 'Label: BBB' }
+            }]
+          }
+        })
+        done()
+      }, 0)
+    })
+
+    it('v-for', () => {
+      expect(compileSnippet(`
+        <div>
+          <richtext v-for="k in labels">
+            <span>{{k}}</span>
+          </richtext>
+        </div>
+      `, `
+        data: {
+          labels: ['A', 'B', 'C']
+        }
+      `)).toEqual({
+        type: 'div',
+        children: [{
+          type: 'richtext',
+          attr: { value: [{ type: 'span', attr: { value: 'A' }}] }
+        }, {
+          type: 'richtext',
+          attr: { value: [{ type: 'span', attr: { value: 'B' }}] }
+        }, {
+          type: 'richtext',
+          attr: { value: [{ type: 'span', attr: { value: 'C' }}] }
+        }]
+      })
+    })
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/weex/runtime/events.spec.js b/advancedcontentfilter/vendor/asset/vue/test/weex/runtime/events.spec.js
new file mode 100644 (file)
index 0000000..79ddbdb
--- /dev/null
@@ -0,0 +1,98 @@
+import { getRoot, fireEvent, compileAndStringify, compileAndExecute } from '../helpers/index'
+
+describe('generate events', () => {
+  it('should be bound and fired for native component', (done) => {
+    compileAndExecute(`
+      <div @click="foo">
+        <text>Hello {{x}}</text>
+      </div>
+    `, `
+      data: { x: 'World' },
+      methods: {
+        foo: function () {
+          this.x = 'Weex'
+        }
+      }
+    `).then(instance => {
+      expect(getRoot(instance)).toEqual({
+        type: 'div',
+        event: ['click'],
+        children: [{
+          type: 'text',
+          attr: { value: 'Hello World' }
+        }]
+      })
+      fireEvent(instance, '_root', 'click')
+      return instance
+    }).then(instance => {
+      expect(getRoot(instance)).toEqual({
+        type: 'div',
+        event: ['click'],
+        children: [{
+          type: 'text',
+          attr: { value: 'Hello Weex' }
+        }]
+      })
+      done()
+    })
+  })
+
+  it('should be bound and fired by custom component', (done) => {
+    const { render, staticRenderFns } = compileAndStringify(`<text>Hello {{x}}</text>`)
+    compileAndExecute(`
+      <div>
+        <text>Hello {{x}}</text>
+        <sub @click="foo" @click.native="bar"></sub>
+      </div>
+    `, `
+      data: { x: 'World' },
+      components: {
+        sub: {
+          data: function () {
+            return { x: 'Sub' }
+          },
+          render: ${render},
+          staticRenderFns: ${staticRenderFns},
+          created: function () {
+            this.$emit('click')
+          }
+        }
+      },
+      methods: {
+        foo: function () {
+          this.x = 'Foo'
+        },
+        bar: function () {
+          this.x = 'Bar'
+        }
+      }
+    `).then(instance => {
+      expect(getRoot(instance)).toEqual({
+        type: 'div',
+        children: [{
+          type: 'text',
+          attr: { value: 'Hello Foo' }
+        }, {
+          type: 'text',
+          event: ['click'],
+          attr: { value: 'Hello Sub' }
+        }]
+      })
+      fireEvent(instance, instance.document.body.children[1].ref, 'click')
+      return instance
+    }).then(instance => {
+      expect(getRoot(instance)).toEqual({
+        type: 'div',
+        children: [{
+          type: 'text',
+          attr: { value: 'Hello Bar' }
+        }, {
+          type: 'text',
+          event: ['click'],
+          attr: { value: 'Hello Sub' }
+        }]
+      })
+      done()
+    })
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/weex/runtime/framework.spec.js b/advancedcontentfilter/vendor/asset/vue/test/weex/runtime/framework.spec.js
new file mode 100644 (file)
index 0000000..ac74680
--- /dev/null
@@ -0,0 +1,194 @@
+import { getRoot, createInstance } from '../helpers/index'
+
+describe('framework APIs', () => {
+  it('createInstance', () => {
+    const id = String(Date.now() * Math.random())
+    const instance = createInstance(id, `
+      new Vue({
+        render: function (createElement) {
+          return createElement('div', {}, [
+            createElement('text', { attrs: { value: 'Hello' }}, [])
+          ])
+        },
+        el: "body"
+      })
+    `)
+    expect(getRoot(instance)).toEqual({
+      type: 'div',
+      children: [{ type: 'text', attr: { value: 'Hello' }}]
+    })
+  })
+
+  it('createInstance with config', () => {
+    const id = String(Date.now() * Math.random())
+    const instance = createInstance(id, `
+      new Vue({
+        render: function (createElement) {
+          return createElement('div', {}, [
+            createElement('text', { attrs: { value: JSON.stringify(weex.config) }}, [])
+          ])
+        },
+        el: "body"
+      })
+    `, { bundleType: 'Vue', bundleUrl: 'http://example.com/', a: 1, b: 2 })
+    expect(getRoot(instance)).toEqual({
+      type: 'div',
+      children: [{
+        type: 'text',
+        attr: { value: '{"bundleType":"Vue","bundleUrl":"http://example.com/","a":1,"b":2,"env":{}}' }
+      }]
+    })
+  })
+
+  it('createInstance with external data', () => {
+    const id = String(Date.now() * Math.random())
+    const instance = createInstance(id, `
+      new Vue({
+        data: {
+          a: 1,
+          b: 2
+        },
+        render: function (createElement) {
+          return createElement('div', {}, [
+            createElement('text', { attrs: { value: this.a + '-' + this.b }}, [])
+          ])
+        },
+        el: "body"
+      })
+    `, undefined, { a: 111 })
+    expect(getRoot(instance)).toEqual({
+      type: 'div',
+      children: [{ type: 'text', attr: { value: '111-2' }}]
+    })
+  })
+
+  it('destroyInstance', (done) => {
+    const id = String(Date.now() * Math.random())
+    const instance = createInstance(id, `
+      new Vue({
+        data: {
+          x: 'Hello'
+        },
+        render: function (createElement) {
+          return createElement('div', {}, [
+            createElement('text', { attrs: { value: this.x }}, [])
+          ])
+        },
+        el: "body"
+      })
+    `)
+    expect(getRoot(instance)).toEqual({
+      type: 'div',
+      children: [{ type: 'text', attr: { value: 'Hello' }}]
+    })
+    instance.$destroy()
+    setTimeout(() => {
+      expect(instance.document).toBeUndefined()
+      expect(instance.app).toBeUndefined()
+      done()
+    }, 0)
+  })
+
+  it('refreshInstance', (done) => {
+    const id = String(Date.now() * Math.random())
+    const instance = createInstance(id, `
+      new Vue({
+        data: {
+          x: 'Hello'
+        },
+        render: function (createElement) {
+          return createElement('div', {}, [
+            createElement('text', { attrs: { value: this.x }}, [])
+          ])
+        },
+        el: "body"
+      })
+    `)
+    expect(getRoot(instance)).toEqual({
+      type: 'div',
+      children: [{ type: 'text', attr: { value: 'Hello' }}]
+    })
+    instance.$refresh({ x: 'World' })
+    setTimeout(() => {
+      expect(getRoot(instance)).toEqual({
+        type: 'div',
+        children: [{ type: 'text', attr: { value: 'World' }}]
+      })
+      instance.$destroy()
+      const result = instance.$refresh({ x: 'World' })
+      expect(result instanceof Error).toBe(true)
+      done()
+    })
+  })
+
+  it('registering global assets', () => {
+    const id = String(Date.now() * Math.random())
+    const instance = createInstance(id, `
+      Vue.component('test', {
+        render (h) {
+          return h('div', 'Hello')
+        }
+      })
+      new Vue({
+        render (h) {
+          return h('test')
+        },
+        el: 'body'
+      })
+    `)
+    expect(getRoot(instance)).toEqual({
+      type: 'div',
+      children: [{ type: 'text', attr: { value: 'Hello' }}]
+    })
+  })
+
+  it('adding prototype methods', () => {
+    const id = String(Date.now() * Math.random())
+    const instance = createInstance(id, `
+      Vue.prototype.$test = () => 'Hello'
+      const Test = {
+        render (h) {
+          return h('div', this.$test())
+        }
+      }
+      new Vue({
+        render (h) {
+          return h(Test)
+        },
+        el: 'body'
+      })
+    `)
+    expect(getRoot(instance)).toEqual({
+      type: 'div',
+      children: [{ type: 'text', attr: { value: 'Hello' }}]
+    })
+  })
+
+  it('using global mixins', () => {
+    const id = String(Date.now() * Math.random())
+    const instance = createInstance(id, `
+      Vue.mixin({
+        created () {
+          this.test = true
+        }
+      })
+      const Test = {
+        data: () => ({ test: false }),
+        render (h) {
+          return h('div', this.test ? 'Hello' : 'nope')
+        }
+      }
+      new Vue({
+        data: { test: false },
+        render (h) {
+          return this.test ? h(Test) : h('p')
+        },
+        el: 'body'
+      })
+    `)
+    expect(getRoot(instance)).toEqual({
+      type: 'div',
+      children: [{ type: 'text', attr: { value: 'Hello' }}]
+    })
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/weex/runtime/node.spec.js b/advancedcontentfilter/vendor/asset/vue/test/weex/runtime/node.spec.js
new file mode 100644 (file)
index 0000000..06a20c6
--- /dev/null
@@ -0,0 +1,513 @@
+import {
+  compileAndStringify,
+  createInstance,
+  getRoot,
+  syncPromise,
+  checkRefresh
+} from '../helpers/index'
+
+describe('node in render function', () => {
+  it('should be generated', () => {
+    const id = String(Date.now() * Math.random())
+    const instance = createInstance(id, `
+      new Vue({
+        render: function (createElement) {
+          return createElement('div', {}, [
+            createElement('text', { attrs: { value: 'Hello' }}, [])
+          ])
+        },
+        el: "body"
+      })
+    `)
+    expect(getRoot(instance)).toEqual({
+      type: 'div',
+      children: [
+        { type: 'text', attr: { value: 'Hello' }}
+      ]
+    })
+  })
+
+  it('should be generated with all types of text', () => {
+    const id = String(Date.now() * Math.random())
+    const instance = createInstance(id, `
+      new Vue({
+        render: function (createElement) {
+          return createElement('div', {}, [
+            createElement('text', { attrs: { value: 'Hello' }}, []),
+            'World',
+            createElement('text', {}, ['Weex'])
+          ])
+        },
+        el: "body"
+      })
+    `)
+    expect(getRoot(instance)).toEqual({
+      type: 'div',
+      children: [
+        { type: 'text', attr: { value: 'Hello' }},
+        { type: 'text', attr: { value: 'World' }},
+        { type: 'text', attr: { value: 'Weex' }}
+      ]
+    })
+  })
+
+  it('should be generated with comments', () => {
+    // todo
+  })
+
+  it('should be generated with module diff', (done) => {
+    const id = String(Date.now() * Math.random())
+    const instance = createInstance(id, `
+      new Vue({
+        data: {
+          counter: 0
+        },
+        methods: {
+          foo: function () {}
+        },
+        render: function (createElement) {
+          switch (this.counter) {
+            case 1:
+            return createElement('div', {}, [
+              createElement('text', { attrs: { value: 'World' }}, [])
+            ])
+
+            case 2:
+            return createElement('div', {}, [
+              createElement('text', { attrs: { value: 'World' }, style: { fontSize: 100 }}, [])
+            ])
+
+            case 3:
+            return createElement('div', {}, [
+              createElement('text', {
+                attrs: { value: 'World' },
+                style: { fontSize: 100 },
+                on: { click: this.foo }
+              }, [])
+            ])
+
+            case 4:
+            return createElement('div', {}, [
+              createElement('text', {
+                attrs: { value: 'Weex' },
+                style: { color: '#ff0000' }
+              }, [])
+            ])
+
+            default:
+            return createElement('div', {}, [
+              createElement('text', { attrs: { value: 'Hello' }}, [])
+            ])
+          }
+        },
+        el: "body"
+      })
+    `)
+    expect(getRoot(instance)).toEqual({
+      type: 'div',
+      children: [
+        { type: 'text', attr: { value: 'Hello' }}
+      ]
+    })
+
+    syncPromise([
+      checkRefresh(instance, { counter: 1 }, result => {
+        expect(result).toEqual({
+          type: 'div',
+          children: [
+            { type: 'text', attr: { value: 'World' }}
+          ]
+        })
+      }),
+      checkRefresh(instance, { counter: 2 }, result => {
+        expect(result).toEqual({
+          type: 'div',
+          children: [
+            { type: 'text', attr: { value: 'World' }, style: { fontSize: 100 }}
+          ]
+        })
+      }),
+      checkRefresh(instance, { counter: 3 }, result => {
+        expect(result).toEqual({
+          type: 'div',
+          children: [
+            { type: 'text', attr: { value: 'World' }, style: { fontSize: 100 }, event: ['click'] }
+          ]
+        })
+      }),
+      checkRefresh(instance, { counter: 4 }, result => {
+        expect(result).toEqual({
+          type: 'div',
+          children: [
+            { type: 'text', attr: { value: 'Weex' }, style: { fontSize: '', color: '#ff0000' }}
+          ]
+        })
+        done()
+      })
+    ])
+  })
+
+  it('should be generated with sub components', () => {
+    const id = String(Date.now() * Math.random())
+    const instance = createInstance(id, `
+      new Vue({
+        render: function (createElement) {
+          return createElement('div', {}, [
+            createElement('text', { attrs: { value: 'Hello' }}, []),
+            createElement('foo', { props: { x: 'Weex' }})
+          ])
+        },
+        components: {
+          foo: {
+            props: {
+              x: { default: 'World' }
+            },
+            render: function (createElement) {
+              return createElement('text', { attrs: { value: this.x }}, [])
+            }
+          }
+        },
+        el: "body"
+      })
+    `)
+    expect(getRoot(instance)).toEqual({
+      type: 'div',
+      children: [
+        { type: 'text', attr: { value: 'Hello' }},
+        { type: 'text', attr: { value: 'Weex' }}
+      ]
+    })
+  })
+
+  it('should be generated with if/for diff', (done) => {
+    const { render, staticRenderFns } = compileAndStringify(`
+      <div>
+        <text v-for="item in list" v-if="item.x">{{item.v}}</text>
+      </div>
+    `)
+    const id = String(Date.now() * Math.random())
+    const instance = createInstance(id, `
+      new Vue({
+        data: {
+          list: [
+            { v: 'Hello', x: true },
+            { v: 'World', x: false },
+            { v: 'Weex', x: true }
+          ]
+        },
+        computed: {
+          x: {
+            get: function () { return 0 },
+            set: function (v) {
+              switch (v) {
+                case 1:
+                this.list[1].x = true
+                break
+                case 2:
+                this.list.push({ v: 'v-if' })
+                break
+                case 3:
+                this.list.push({ v: 'v-for', x: true })
+                break
+                case 4:
+                this.list.splice(1, 2)
+                break
+              }
+            }
+          }
+        },
+        render: ${render},
+        staticRenderFns: ${staticRenderFns},
+        el: "body"
+      })
+    `)
+    expect(getRoot(instance)).toEqual({
+      type: 'div',
+      children: [
+        { type: 'text', attr: { value: 'Hello' }},
+        { type: 'text', attr: { value: 'Weex' }}
+      ]
+    })
+
+    syncPromise([
+      checkRefresh(instance, { x: 1 }, result => {
+        expect(result).toEqual({
+          type: 'div',
+          children: [
+            { type: 'text', attr: { value: 'Hello' }},
+            { type: 'text', attr: { value: 'World' }},
+            { type: 'text', attr: { value: 'Weex' }}
+          ]
+        })
+      }),
+      checkRefresh(instance, { x: 2 }, result => {
+        expect(result).toEqual({
+          type: 'div',
+          children: [
+            { type: 'text', attr: { value: 'Hello' }},
+            { type: 'text', attr: { value: 'World' }},
+            { type: 'text', attr: { value: 'Weex' }}
+          ]
+        })
+      }),
+      checkRefresh(instance, { x: 3 }, result => {
+        expect(result).toEqual({
+          type: 'div',
+          children: [
+            { type: 'text', attr: { value: 'Hello' }},
+            { type: 'text', attr: { value: 'World' }},
+            { type: 'text', attr: { value: 'Weex' }},
+            { type: 'text', attr: { value: 'v-for' }}
+          ]
+        })
+      }),
+      checkRefresh(instance, { x: 4 }, result => {
+        expect(result).toEqual({
+          type: 'div',
+          children: [
+            { type: 'text', attr: { value: 'Hello' }},
+            { type: 'text', attr: { value: 'v-for' }}
+          ]
+        })
+        done()
+      })
+    ])
+  })
+
+  it('should be generated with node structure diff', (done) => {
+    const id = String(Date.now() * Math.random())
+    const instance = createInstance(id, `
+      new Vue({
+        data: {
+          counter: 0
+        },
+        render: function (createElement) {
+          switch (this.counter) {
+            case 1:
+            return createElement('div', {}, [
+              createElement('text', { attrs: { value: 'Hello' }}, []),
+              createElement('text', { attrs: { value: 'World' }}, [])
+            ])
+
+            case 2:
+            return createElement('div', {}, [
+              createElement('text', { attrs: { value: 'Hello' }}, []),
+              createElement('text', { attrs: { value: 'World' }}, []),
+              createElement('text', { attrs: { value: 'Weex' }}, [])
+            ])
+
+            case 3:
+            return createElement('div', {}, [
+              createElement('text', { attrs: { value: 'Hello' }}, []),
+              createElement('text', { attrs: { value: 'Weex' }}, [])
+            ])
+
+            case 4:
+            return createElement('div', {}, [
+              createElement('text', { attrs: { value: 'Weex' }}, [])
+            ])
+
+            case 5:
+            return createElement('div', {}, [
+              createElement('text', { attrs: { value: 'Hello' }}, []),
+              createElement('text', { attrs: { value: 'Weex' }}, [])
+            ])
+
+            case 6:
+            return createElement('div', {}, [
+              createElement('input', { attrs: { value: 'Hello' }}, []),
+              createElement('text', { attrs: { value: 'Weex' }}, [])
+            ])
+
+            default:
+            return createElement('div', {}, [
+              createElement('text', { attrs: { value: 'Hello' }}, []),
+            ])
+          }
+        },
+        el: "body"
+      })
+    `)
+    expect(getRoot(instance)).toEqual({
+      type: 'div',
+      children: [
+        { type: 'text', attr: { value: 'Hello' }}
+      ]
+    })
+
+    syncPromise([
+      checkRefresh(instance, { counter: 1 }, result => {
+        expect(result).toEqual({
+          type: 'div',
+          children: [
+            { type: 'text', attr: { value: 'Hello' }},
+            { type: 'text', attr: { value: 'World' }}
+          ]
+        })
+      }),
+      checkRefresh(instance, { counter: 2 }, result => {
+        expect(result).toEqual({
+          type: 'div',
+          children: [
+            { type: 'text', attr: { value: 'Hello' }},
+            { type: 'text', attr: { value: 'World' }},
+            { type: 'text', attr: { value: 'Weex' }}
+          ]
+        })
+      }),
+      checkRefresh(instance, { counter: 3 }, result => {
+        expect(result).toEqual({
+          type: 'div',
+          children: [
+            { type: 'text', attr: { value: 'Hello' }},
+            { type: 'text', attr: { value: 'Weex' }}
+          ]
+        })
+      }),
+      checkRefresh(instance, { counter: 4 }, result => {
+        expect(result).toEqual({
+          type: 'div',
+          children: [
+            { type: 'text', attr: { value: 'Weex' }}
+          ]
+        })
+      }),
+      checkRefresh(instance, { counter: 5 }, result => {
+        expect(result).toEqual({
+          type: 'div',
+          children: [
+            { type: 'text', attr: { value: 'Hello' }},
+            { type: 'text', attr: { value: 'Weex' }}
+          ]
+        })
+      }),
+      checkRefresh(instance, { counter: 6 }, result => {
+        expect(result).toEqual({
+          type: 'div',
+          children: [
+            { type: 'input', attr: { value: 'Hello' }},
+            { type: 'text', attr: { value: 'Weex' }}
+          ]
+        })
+        done()
+      })
+    ])
+  })
+
+  it('should be generated with component diff', (done) => {
+    const id = String(Date.now() * Math.random())
+    const instance = createInstance(id, `
+      new Vue({
+        data: {
+          counter: 0
+        },
+        components: {
+          foo: {
+            props: { a: { default: '1' }, b: { default: '2' }},
+            render: function (createElement) {
+              return createElement('text', { attrs: { value: this.a + '-' + this.b }}, [])
+            }
+          },
+          bar: {
+            render: function (createElement) {
+              return createElement('text', { attrs: { value: 'Bar' }, style: { fontSize: 100 }})
+            }
+          },
+          baz: {
+            render: function (createElement) {
+              return createElement('image', { attrs: { src: 'http://example.com/favicon.ico' }})
+            }
+          }
+        },
+        render: function (createElement) {
+          switch (this.counter) {
+            case 1:
+            return createElement('div', {}, [
+              createElement('foo', { props: { a: '111', b: '222' }}, [])
+            ])
+
+            case 2:
+            return createElement('div', {}, [
+              createElement('foo', {}, [])
+            ])
+
+            case 3:
+            return createElement('div', {}, [
+              createElement('bar', {}, [])
+            ])
+
+            case 4:
+            return createElement('div', {}, [
+              createElement('baz', {}, [])
+            ])
+
+            case 5:
+            return createElement('div', {}, [
+              createElement('foo', {}, []),
+              createElement('bar', {}, []),
+              createElement('baz', {}, [])
+            ])
+
+            default:
+            return createElement('div', {}, [
+              createElement('foo', { props: { a: '111' }}, [])
+            ])
+          }
+        },
+        el: "body"
+      })
+    `)
+    expect(getRoot(instance)).toEqual({
+      type: 'div',
+      children: [
+        { type: 'text', attr: { value: '111-2' }}
+      ]
+    })
+
+    syncPromise([
+      checkRefresh(instance, { counter: 1 }, result => {
+        expect(result).toEqual({
+          type: 'div',
+          children: [
+            { type: 'text', attr: { value: '111-222' }}
+          ]
+        })
+      }),
+      checkRefresh(instance, { counter: 2 }, result => {
+        expect(result).toEqual({
+          type: 'div',
+          children: [
+            { type: 'text', attr: { value: '1-2' }}
+          ]
+        })
+      }),
+      checkRefresh(instance, { counter: 3 }, result => {
+        expect(result).toEqual({
+          type: 'div',
+          children: [
+            { type: 'text', attr: { value: 'Bar' }, style: { fontSize: 100 }}
+          ]
+        })
+      }),
+      checkRefresh(instance, { counter: 4 }, result => {
+        expect(result).toEqual({
+          type: 'div',
+          children: [
+            { type: 'image', attr: { src: 'http://example.com/favicon.ico' }}
+          ]
+        })
+      }),
+      checkRefresh(instance, { counter: 5 }, result => {
+        expect(result).toEqual({
+          type: 'div',
+          children: [
+            { type: 'text', attr: { value: '1-2' }},
+            { type: 'text', attr: { value: 'Bar' }, style: { fontSize: 100 }},
+            { type: 'image', attr: { src: 'http://example.com/favicon.ico' }}
+          ]
+        })
+        done()
+      })
+    ])
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/test/weex/runtime/style.spec.js b/advancedcontentfilter/vendor/asset/vue/test/weex/runtime/style.spec.js
new file mode 100644 (file)
index 0000000..752f575
--- /dev/null
@@ -0,0 +1,129 @@
+import { getRoot, fireEvent, compileAndExecute } from '../helpers/index'
+
+describe('generate style', () => {
+  it('should be generated', () => {
+    compileAndExecute(`
+      <div>
+        <text style="font-size: 100">Hello World</text>
+      </div>
+    `).then(instance => {
+      expect(getRoot(instance)).toEqual({
+        type: 'div',
+        children: [{
+          type: 'text',
+          style: { fontSize: '100' },
+          attr: { value: 'Hello World' }
+        }]
+      })
+    })
+  })
+
+  it('should be generated by array binding', (done) => {
+    compileAndExecute(`
+      <div>
+        <text :style="[x, y]" @click="foo">Hello {{z}}</text>
+      </div>
+    `, `
+      data: {
+        x: { fontSize: 100, color: '#00ff00' },
+        y: { color: '#ff0000', fontWeight: 'bold' },
+        z: 'World'
+      },
+      methods: {
+        foo: function () {
+          this.x.fontSize = 200
+          this.x.color = '#0000ff'
+          Vue.delete(this.y, 'fontWeight')
+          this.z = 'Weex'
+        }
+      }
+    `).then(instance => {
+      expect(getRoot(instance)).toEqual({
+        type: 'div',
+        children: [
+          {
+            type: 'text',
+            event: ['click'],
+            style: { fontSize: 100, color: '#ff0000', fontWeight: 'bold' },
+            attr: { value: 'Hello World' }
+          }
+        ]
+      })
+      fireEvent(instance, instance.document.body.children[0].ref, 'click')
+      return instance
+    }).then(instance => {
+      expect(getRoot(instance)).toEqual({
+        type: 'div',
+        children: [
+          {
+            type: 'text',
+            event: ['click'],
+            style: { fontSize: 200, color: '#ff0000', fontWeight: '' },
+            attr: { value: 'Hello Weex' }
+          }
+        ]
+      })
+      done()
+    })
+  })
+
+  it('should be generated by map binding', (done) => {
+    compileAndExecute(`
+      <div>
+        <text :style="{ fontSize: x, color: '#00ff00' }" @click="foo">Hello</text>
+        <text :style="y">{{z}}</text>
+      </div>
+    `, `
+      data: {
+        x: 100,
+        y: { color: '#ff0000', fontWeight: 'bold' },
+        z: 'World'
+      },
+      methods: {
+        foo: function () {
+          this.x = 200
+          this.y.color = '#0000ff'
+          Vue.delete(this.y, 'fontWeight')
+          this.z = 'Weex'
+        }
+      }
+    `).then(instance => {
+      expect(getRoot(instance)).toEqual({
+        type: 'div',
+        children: [
+          {
+            type: 'text',
+            event: ['click'],
+            style: { fontSize: 100, color: '#00ff00' },
+            attr: { value: 'Hello' }
+          },
+          {
+            type: 'text',
+            style: { color: '#ff0000', fontWeight: 'bold' },
+            attr: { value: 'World' }
+          }
+        ]
+      })
+      fireEvent(instance, instance.document.body.children[0].ref, 'click')
+      return instance
+    }).then(instance => {
+      expect(getRoot(instance)).toEqual({
+        type: 'div',
+        children: [
+          {
+            type: 'text',
+            event: ['click'],
+            style: { fontSize: 200, color: '#00ff00' },
+            attr: { value: 'Hello' }
+          },
+          {
+            type: 'text',
+            style: { color: '#0000ff', fontWeight: '' },
+            attr: { value: 'Weex' }
+          }
+        ]
+      })
+      done()
+    })
+  })
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/types/index.d.ts b/advancedcontentfilter/vendor/asset/vue/types/index.d.ts
new file mode 100644 (file)
index 0000000..720180d
--- /dev/null
@@ -0,0 +1,37 @@
+import { Vue } from "./vue";
+
+export default Vue;
+
+export {
+  CreateElement,
+  VueConstructor
+} from "./vue";
+
+export {
+  Component,
+  AsyncComponent,
+  ComponentOptions,
+  FunctionalComponentOptions,
+  RenderContext,
+  PropOptions,
+  ComputedOptions,
+  WatchHandler,
+  WatchOptions,
+  WatchOptionsWithHandler,
+  DirectiveFunction,
+  DirectiveOptions
+} from "./options";
+
+export {
+  PluginFunction,
+  PluginObject
+} from "./plugin";
+
+export {
+  VNodeChildren,
+  VNodeChildrenArrayContents,
+  VNode,
+  VNodeComponentOptions,
+  VNodeData,
+  VNodeDirective
+} from "./vnode";
diff --git a/advancedcontentfilter/vendor/asset/vue/types/options.d.ts b/advancedcontentfilter/vendor/asset/vue/types/options.d.ts
new file mode 100644 (file)
index 0000000..cc58aff
--- /dev/null
@@ -0,0 +1,182 @@
+import { Vue, CreateElement, CombinedVueInstance } from "./vue";
+import { VNode, VNodeData, VNodeDirective } from "./vnode";
+
+type Constructor = {
+  new (...args: any[]): any;
+}
+
+// we don't support infer props in async component
+// N.B. ComponentOptions<V> is contravariant, the default generic should be bottom type
+export type Component<Data=DefaultData<never>, Methods=DefaultMethods<never>, Computed=DefaultComputed, Props=DefaultProps> =
+  | typeof Vue
+  | FunctionalComponentOptions<Props>
+  | ComponentOptions<never, Data, Methods, Computed, Props>
+
+interface EsModuleComponent {
+  default: Component
+}
+
+export type AsyncComponent<Data=DefaultData<never>, Methods=DefaultMethods<never>, Computed=DefaultComputed, Props=DefaultProps> = (
+  resolve: (component: Component<Data, Methods, Computed, Props>) => void,
+  reject: (reason?: any) => void
+) => Promise<Component | EsModuleComponent> | void;
+
+/**
+ * When the `Computed` type parameter on `ComponentOptions` is inferred,
+ * it should have a property with the return type of every get-accessor.
+ * Since there isn't a way to query for the return type of a function, we allow TypeScript
+ * to infer from the shape of `Accessors<Computed>` and work backwards.
+ */
+export type Accessors<T> = {
+  [K in keyof T]: (() => T[K]) | ComputedOptions<T[K]>
+}
+
+type DataDef<Data, Props, V> = Data | ((this: Readonly<Props> & V) => Data)
+/**
+ * This type should be used when an array of strings is used for a component's `props` value.
+ */
+export type ThisTypedComponentOptionsWithArrayProps<V extends Vue, Data, Methods, Computed, PropNames extends string> =
+  object &
+  ComponentOptions<V, DataDef<Data, Record<PropNames, any>, V>, Methods, Computed, PropNames[], Record<PropNames, any>> &
+  ThisType<CombinedVueInstance<V, Data, Methods, Computed, Readonly<Record<PropNames, any>>>>;
+
+/**
+ * This type should be used when an object mapped to `PropOptions` is used for a component's `props` value.
+ */
+export type ThisTypedComponentOptionsWithRecordProps<V extends Vue, Data, Methods, Computed, Props> =
+  object &
+  ComponentOptions<V, DataDef<Data, Props, V>, Methods, Computed, RecordPropsDefinition<Props>, Props> &
+  ThisType<CombinedVueInstance<V, Data, Methods, Computed, Readonly<Props>>>;
+
+type DefaultData<V> =  object | ((this: V) => object);
+type DefaultProps = Record<string, any>;
+type DefaultMethods<V> =  { [key: string]: (this: V, ...args: any[]) => any };
+type DefaultComputed = { [key: string]: any };
+export interface ComponentOptions<
+  V extends Vue,
+  Data=DefaultData<V>,
+  Methods=DefaultMethods<V>,
+  Computed=DefaultComputed,
+  PropsDef=PropsDefinition<DefaultProps>,
+  Props=DefaultProps> {
+  data?: Data;
+  props?: PropsDef;
+  propsData?: object;
+  computed?: Accessors<Computed>;
+  methods?: Methods;
+  watch?: Record<string, WatchOptionsWithHandler<any> | WatchHandler<any> | string>;
+
+  el?: Element | string;
+  template?: string;
+  // hack is for funcitonal component type inference, should not used in user code
+  render?(createElement: CreateElement, hack: RenderContext<Props>): VNode;
+  renderError?: (h: () => VNode, err: Error) => VNode;
+  staticRenderFns?: ((createElement: CreateElement) => VNode)[];
+
+  beforeCreate?(this: V): void;
+  created?(): void;
+  beforeDestroy?(): void;
+  destroyed?(): void;
+  beforeMount?(): void;
+  mounted?(): void;
+  beforeUpdate?(): void;
+  updated?(): void;
+  activated?(): void;
+  deactivated?(): void;
+  errorCaptured?(err: Error, vm: Vue, info: string): boolean | void;
+
+  directives?: { [key: string]: DirectiveFunction | DirectiveOptions };
+  components?: { [key: string]: Component<any, any, any, any> | AsyncComponent<any, any, any, any> };
+  transitions?: { [key: string]: object };
+  filters?: { [key: string]: Function };
+
+  provide?: object | (() => object);
+  inject?: InjectOptions;
+
+  model?: {
+    prop?: string;
+    event?: string;
+  };
+
+  parent?: Vue;
+  mixins?: (ComponentOptions<Vue> | typeof Vue)[];
+  name?: string;
+  // TODO: support properly inferred 'extends'
+  extends?: ComponentOptions<Vue> | typeof Vue;
+  delimiters?: [string, string];
+  comments?: boolean;
+  inheritAttrs?: boolean;
+}
+
+export interface FunctionalComponentOptions<Props = DefaultProps, PropDefs = PropsDefinition<Props>> {
+  name?: string;
+  props?: PropDefs;
+  inject?: InjectOptions;
+  functional: boolean;
+  render?(this: undefined, createElement: CreateElement, context: RenderContext<Props>): VNode;
+}
+
+export interface RenderContext<Props=DefaultProps> {
+  props: Props;
+  children: VNode[];
+  slots(): any;
+  data: VNodeData;
+  parent: Vue;
+  listeners: { [key: string]: Function | Function[] };
+  injections: any
+}
+
+export type Prop<T> = { (): T } | { new (...args: any[]): T & object }
+
+export type PropValidator<T> = PropOptions<T> | Prop<T> | Prop<T>[];
+
+export interface PropOptions<T=any> {
+  type?: Prop<T> | Prop<T>[];
+  required?: boolean;
+  default?: T | null | undefined | (() => object);
+  validator?(value: T): boolean;
+}
+
+export type RecordPropsDefinition<T> = {
+  [K in keyof T]: PropValidator<T[K]>
+}
+export type ArrayPropsDefinition<T> = (keyof T)[];
+export type PropsDefinition<T> = ArrayPropsDefinition<T> | RecordPropsDefinition<T>;
+
+export interface ComputedOptions<T> {
+  get?(): T;
+  set?(value: T): void;
+  cache?: boolean;
+}
+
+export type WatchHandler<T> = (val: T, oldVal: T) => void;
+
+export interface WatchOptions {
+  deep?: boolean;
+  immediate?: boolean;
+}
+
+export interface WatchOptionsWithHandler<T> extends WatchOptions {
+  handler: WatchHandler<T>;
+}
+
+export type DirectiveFunction = (
+  el: HTMLElement,
+  binding: VNodeDirective,
+  vnode: VNode,
+  oldVnode: VNode
+) => void;
+
+export interface DirectiveOptions {
+  bind?: DirectiveFunction;
+  inserted?: DirectiveFunction;
+  update?: DirectiveFunction;
+  componentUpdated?: DirectiveFunction;
+  unbind?: DirectiveFunction;
+}
+
+export type InjectKey = string | symbol;
+
+export type InjectOptions = {
+  [key: string]: InjectKey | { from?: InjectKey, default?: any }
+} | string[];
diff --git a/advancedcontentfilter/vendor/asset/vue/types/plugin.d.ts b/advancedcontentfilter/vendor/asset/vue/types/plugin.d.ts
new file mode 100644 (file)
index 0000000..5741f86
--- /dev/null
@@ -0,0 +1,8 @@
+import { Vue as _Vue } from "./vue";
+
+export type PluginFunction<T> = (Vue: typeof _Vue, options?: T) => void;
+
+export interface PluginObject<T> {
+  install: PluginFunction<T>;
+  [key: string]: any;
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/types/test/augmentation-test.ts b/advancedcontentfilter/vendor/asset/vue/types/test/augmentation-test.ts
new file mode 100644 (file)
index 0000000..bb77672
--- /dev/null
@@ -0,0 +1,46 @@
+import Vue from "../index";
+
+declare module "../vue" {
+  // add instance property and method
+  interface Vue {
+    $instanceProperty: string;
+    $instanceMethod(): void;
+  }
+
+  // add static property and method
+  interface VueConstructor {
+    staticProperty: string;
+    staticMethod(): void;
+  }
+}
+
+// augment ComponentOptions
+declare module "../options" {
+  interface ComponentOptions<V extends Vue> {
+    foo?: string;
+  }
+}
+
+const vm = new Vue({
+  props: ["bar"],
+  data: {
+    a: true
+  },
+  foo: "foo",
+  methods: {
+    foo() {
+      this.a = false;
+    }
+  },
+  computed: {
+    BAR(): string {
+      return this.bar.toUpperCase();
+    }
+  }
+});
+
+vm.$instanceProperty;
+vm.$instanceMethod();
+
+Vue.staticProperty;
+Vue.staticMethod();
diff --git a/advancedcontentfilter/vendor/asset/vue/types/test/es-module.ts b/advancedcontentfilter/vendor/asset/vue/types/test/es-module.ts
new file mode 100644 (file)
index 0000000..f124374
--- /dev/null
@@ -0,0 +1,5 @@
+export default {
+  data() {
+    return {}
+  }
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/types/test/options-test.ts b/advancedcontentfilter/vendor/asset/vue/types/test/options-test.ts
new file mode 100644 (file)
index 0000000..6fc9e35
--- /dev/null
@@ -0,0 +1,353 @@
+import Vue, { VNode } from "../index";
+import { AsyncComponent, ComponentOptions, FunctionalComponentOptions, Component } from "../index";
+import { CreateElement } from "../vue";
+
+interface MyComponent extends Vue {
+  a: number;
+}
+
+const option: ComponentOptions<MyComponent> = {
+  data() {
+    return {
+      a: 123
+    }
+  }
+}
+
+// contravariant generic should use never
+const anotherOption: ComponentOptions<never> = option
+const componentType: Component = option
+
+Vue.component('sub-component', {
+  components: {
+    a: Vue.component(""),
+    b: {}
+  }
+});
+
+Vue.component('prop-component', {
+  props: {
+    size: Number,
+    name: {
+      type: String,
+      default: '0',
+      required: true,
+    }
+  },
+  data() {
+    return {
+      fixedSize: this.size.toFixed(),
+      capName: this.name.toUpperCase()
+    }
+  }
+});
+
+Vue.component('string-prop', {
+  props: ['size', 'name'],
+  data() {
+    return {
+      fixedSize: this.size.whatever,
+      capName: this.name.isany
+    }
+  }
+});
+
+class User {
+  private u = 1
+}
+class Cat {
+  private u = 1
+}
+
+Vue.component('union-prop', {
+  props: {
+    primitive: [String, Number],
+    object: [Cat, User],
+    regex: RegExp,
+    mixed: [RegExp, Array],
+    union: [User, Number] as {new(): User | Number}[] // requires annotation
+  },
+  data() {
+    this.primitive;
+    this.object;
+    this.union;
+    this.regex.compile;
+    this.mixed;
+    return {
+      fixedSize: this.union,
+    }
+  }
+});
+
+Vue.component('component', {
+  data() {
+    this.$mount
+    this.size
+    return {
+      a: 1
+    }
+  },
+  props: {
+    size: Number,
+    name: {
+      type: String,
+      default: '0',
+      required: true,
+    }
+  },
+  propsData: {
+    msg: "Hello"
+  },
+  computed: {
+    aDouble(): number {
+      return this.a * 2;
+    },
+    aPlus: {
+      get(): number {
+        return this.a + 1;
+      },
+      set(v: number) {
+        this.a = v - 1;
+      },
+      cache: false
+    }
+  },
+  methods: {
+    plus() {
+      this.a++;
+      this.aDouble.toFixed();
+      this.aPlus = 1;
+      this.size.toFixed();
+    }
+  },
+  watch: {
+    'a': function(val: number, oldVal: number) {
+      console.log(`new: ${val}, old: ${oldVal}`);
+    },
+    'b': 'someMethod',
+    'c': {
+      handler(val, oldVal) {
+        this.a = val
+      },
+      deep: true
+    }
+  },
+  el: "#app",
+  template: "<div>{{ message }}</div>",
+  render(createElement) {
+    return createElement("div", {
+      attrs: {
+        id: "foo"
+      },
+      props: {
+        myProp: "bar"
+      },
+      domProps: {
+        innerHTML: "baz"
+      },
+      on: {
+        click: new Function
+      },
+      nativeOn: {
+        click: new Function
+      },
+      class: {
+        foo: true,
+        bar: false
+      },
+      style: {
+        color: 'red',
+        fontSize: '14px'
+      },
+      key: 'myKey',
+      ref: 'myRef'
+    }, [
+      createElement(),
+      createElement("div", "message"),
+      createElement(Vue.component("component")),
+      createElement({} as ComponentOptions<Vue>),
+      createElement({
+        functional: true,
+        render(c: CreateElement) {
+          return createElement()
+        }
+      }),
+
+      createElement(() => Vue.component("component")),
+      createElement(() => ( {} as ComponentOptions<Vue> )),
+      createElement((resolve, reject) => {
+        resolve({} as ComponentOptions<Vue>);
+        reject();
+      }),
+
+      "message",
+
+      [createElement("div", "message")]
+    ]);
+  },
+  staticRenderFns: [],
+
+  beforeCreate() {
+    (this as any).a = 1;
+  },
+  created() {},
+  beforeDestroy() {},
+  destroyed() {},
+  beforeMount() {},
+  mounted() {},
+  beforeUpdate() {},
+  updated() {},
+  activated() {},
+  deactivated() {},
+  errorCaptured(err, vm, info) {
+    err.message
+    vm.$emit('error')
+    info.toUpperCase()
+    return true
+  },
+
+  directives: {
+    a: {
+      bind() {},
+      inserted() {},
+      update() {},
+      componentUpdated() {},
+      unbind() {}
+    },
+    b(el, binding, vnode, oldVnode) {
+      el.textContent;
+
+      binding.name;
+      binding.value;
+      binding.oldValue;
+      binding.expression;
+      binding.arg;
+      binding.modifiers["modifier"];
+    }
+  },
+  components: {
+    a: Vue.component(""),
+    b: {} as ComponentOptions<Vue>
+  },
+  transitions: {},
+  filters: {
+    double(value: number) {
+      return value * 2;
+    }
+  },
+  parent: new Vue,
+  mixins: [Vue.component(""), ({} as ComponentOptions<Vue>)],
+  name: "Component",
+  extends: {} as ComponentOptions<Vue>,
+  delimiters: ["${", "}"]
+});
+
+Vue.component('provide-inject', {
+  provide: {
+    foo: 1
+  },
+  inject: {
+    injectFoo: 'foo',
+    injectBar: Symbol(),
+    injectBaz: { from: 'baz' },
+    injectQux: { default: 1 },
+    injectQuux: { from: 'quuz', default: () => ({ value: 1 })}
+  }
+})
+
+Vue.component('provide-function', {
+  provide: () => ({
+    foo: 1
+  })
+})
+
+Vue.component('component-with-scoped-slot', {
+  render (h) {
+    interface ScopedSlotProps {
+      msg: string
+    }
+
+    return h('div', [
+      h('child', [
+        // default scoped slot as children
+        (props: ScopedSlotProps) => [h('span', [props.msg])]
+      ]),
+      h('child', {
+        scopedSlots: {
+          // named scoped slot as vnode data
+          item: (props: ScopedSlotProps) => [h('span', [props.msg])]
+        }
+      })
+    ])
+  },
+  components: {
+    child: {
+      render (this: Vue, h: CreateElement) {
+        return h('div', [
+          this.$scopedSlots['default']({ msg: 'hi' }),
+          this.$scopedSlots['item']({ msg: 'hello' })
+        ])
+      }
+    }
+  }
+})
+
+Vue.component('narrow-array-of-vnode-type', {
+  render (h): VNode {
+    const slot = this.$scopedSlots.default({})
+    if (typeof slot !== 'string') {
+      const first = slot[0]
+      if (!Array.isArray(first) && typeof first !== 'string') {
+        return first;
+      }
+    }
+    return h();
+  }
+})
+
+Vue.component('functional-component', {
+  props: ['prop'],
+  functional: true,
+  inject: ['foo'],
+  render(createElement, context) {
+    context.props;
+    context.children;
+    context.slots();
+    context.data;
+    context.parent;
+    context.listeners.click;
+    return createElement("div", {}, context.children);
+  }
+});
+
+Vue.component('functional-component-object-inject', {
+  functional: true,
+  inject: {
+    foo: 'foo',
+    bar: Symbol(),
+    baz: { from: 'baz' },
+    qux: { default: 1 },
+    quux: { from: 'quuz', default: () => ({ value: 1 })}
+  },
+  render(h) {
+    return h('div')
+  }
+})
+
+Vue.component('functional-component-check-optional', {
+  functional: true
+})
+
+Vue.component("async-component", ((resolve, reject) => {
+  setTimeout(() => {
+    resolve(Vue.component("component"));
+  }, 0);
+  return new Promise((resolve) => {
+    resolve({
+      functional: true,
+      render(h: CreateElement) { return h('div') }
+    });
+  })
+}));
+
+Vue.component('async-es-module-component', () => import('./es-module'))
diff --git a/advancedcontentfilter/vendor/asset/vue/types/test/plugin-test.ts b/advancedcontentfilter/vendor/asset/vue/types/test/plugin-test.ts
new file mode 100644 (file)
index 0000000..ebb352e
--- /dev/null
@@ -0,0 +1,20 @@
+import Vue from "../index";
+import { PluginFunction, PluginObject } from "../index";
+
+class Option {
+  prefix: string = "";
+  suffix: string = "";
+}
+
+const plugin: PluginObject<Option> = {
+  install(Vue, option) {
+    if (typeof option !== "undefined") {
+      const {prefix, suffix} = option;
+    }
+  }
+}
+const installer: PluginFunction<Option> = function(Vue, option) { }
+
+Vue.use(plugin, new Option);
+Vue.use(installer, new Option);
+Vue.use(installer, new Option, new Option, new Option);
diff --git a/advancedcontentfilter/vendor/asset/vue/types/test/ssr-test.ts b/advancedcontentfilter/vendor/asset/vue/types/test/ssr-test.ts
new file mode 100644 (file)
index 0000000..ed6409a
--- /dev/null
@@ -0,0 +1,128 @@
+import Vue, { VNode, VNodeDirective } from '../index';
+import VueSSRClientPlugin = require('../../packages/vue-server-renderer/client-plugin');
+import VueSSRServerPlugin = require('../../packages/vue-server-renderer/server-plugin');
+import webpack = require('webpack');
+import { readFileSync } from 'fs';
+import { createRenderer, createBundleRenderer } from '../../packages/vue-server-renderer';
+
+function createApp (context: any) {
+  return new Vue({
+    data: {
+      url: context.url
+    },
+    template: `<div>The visited URL is: {{ url }}</div>`
+  });
+}
+
+// Renderer test
+const app = createApp({ url: 'http://localhost:8000/' });
+
+const renderer = createRenderer({
+  template: readFileSync('./index.template.html', 'utf-8')
+});
+
+const context = {
+  title: 'Hello',
+  meta: `
+    <meta name="description" content="Vue.js SSR Example">
+  `
+};
+
+renderer.renderToString(app, (err, html) => {
+  if (err) throw err;
+  const res: string = html;
+});
+
+renderer.renderToString(app, context, (err, html) => {
+  if (err) throw err;
+  const res: string = html;
+});
+
+renderer.renderToString(app)
+  .then(html => {
+    const res: string = html;
+  })
+  .catch(err => {
+    throw err;
+  });
+
+renderer.renderToString(app, context)
+  .then(html => {
+    const res: string = html;
+  })
+  .catch(err => {
+    throw err;
+  });
+
+renderer.renderToStream(app, context).on('data', chunk => {
+  const html = chunk.toString();
+});
+
+// Bundle renderer test
+declare const cacheClient: { [key: string]: string };
+
+const bundleRenderer = createBundleRenderer('/path/to/vue-ssr-server-bundle.json', {
+  inject: false,
+  runInNewContext: 'once',
+  basedir: '/path/to/base',
+
+  shouldPreload: (file, type) => {
+    if (type === 'script' || type === 'style') {
+      return true;
+    }
+    if (type === 'font') {
+      return /\.woff2$/.test(file);
+    }
+    if (type === 'image') {
+      return file === 'hero.jpg';
+    }
+    return false;
+  },
+
+  cache: {
+    get: key => {
+      return cacheClient[key];
+    },
+    set: (key, val) => {
+      cacheClient[key] = val;
+    },
+    has: key => {
+      return !!cacheClient[key];
+    }
+  },
+
+  directives: {
+    example (vnode: VNode, directiveMeta: VNodeDirective) {
+      // transform vnode based on directive binding metadata
+    }
+  }
+});
+
+bundleRenderer.renderToString(context, (err, html) => {
+  if (err) throw err;
+  const res: string = html;
+});
+
+bundleRenderer.renderToString().then(html => {
+  const res: string = html;
+});
+
+bundleRenderer.renderToString(context).then(html => {
+  const res: string = html;
+});
+
+bundleRenderer.renderToStream(context).on('data', chunk => {
+  const html = chunk.toString();
+});
+
+// webpack plugins
+webpack({
+  plugins: [
+    new VueSSRClientPlugin({
+      filename: 'client-manifest.json'
+    }),
+    new VueSSRServerPlugin({
+      filename: 'server-bundle.json'
+    })
+  ]
+});
diff --git a/advancedcontentfilter/vendor/asset/vue/types/test/tsconfig.json b/advancedcontentfilter/vendor/asset/vue/types/test/tsconfig.json
new file mode 100644 (file)
index 0000000..15809b5
--- /dev/null
@@ -0,0 +1,29 @@
+{
+  "compilerOptions": {
+    "target": "es5",
+    "lib": [
+      "dom",
+      "es2015"
+    ],
+    "module": "commonjs",
+    "strict": true,
+    "noEmit": true,
+    "baseUrl": ".",
+    "paths": {
+      "vue": ["../index.d.ts"]
+    }
+  },
+  "files": [
+    "../index.d.ts",
+    "../options.d.ts",
+    "../plugin.d.ts",
+    "../vnode.d.ts",
+    "../vue.d.ts",
+    "options-test.ts",
+    "plugin-test.ts",
+    "vue-test.ts",
+    "augmentation-test.ts",
+    "ssr-test.ts"
+  ],
+  "compileOnSave": false
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/types/test/vue-test.ts b/advancedcontentfilter/vendor/asset/vue/types/test/vue-test.ts
new file mode 100644 (file)
index 0000000..9694937
--- /dev/null
@@ -0,0 +1,182 @@
+import Vue, { VNode } from "../index";
+import { ComponentOptions } from "../options";
+
+class Test extends Vue {
+  a: number = 0;
+
+  testProperties() {
+    this.$data;
+    this.$el;
+    this.$options;
+    this.$parent;
+    this.$root;
+    this.$children;
+    this.$refs;
+    this.$slots;
+    this.$isServer;
+    this.$ssrContext;
+    this.$vnode;
+  }
+
+  // test property reification
+  $refs!: {
+    vue: Vue,
+    element: HTMLInputElement,
+    vues: Vue[],
+    elements: HTMLInputElement[]
+  }
+  testReification() {
+    this.$refs.vue.$data;
+    this.$refs.element.value;
+    this.$refs.vues[0].$data;
+    this.$refs.elements[0].value;
+  }
+
+  testMethods() {
+    this.$mount("#app", false);
+    this.$forceUpdate();
+    this.$destroy();
+    this.$set({}, "key", "value");
+    this.$delete({}, "key");
+    this.$watch("a", (val: number, oldVal: number) => {}, {
+      immediate: true,
+      deep: false
+    })();
+    this.$watch(() => this.a, (val: number) => {});
+    this.$on("", () => {});
+    this.$once("", () => {});
+    this.$off("", () => {});
+    this.$emit("", 1, 2, 3);
+    this.$nextTick(function() {
+      this.$nextTick;
+    });
+    this.$nextTick().then(() => {});
+    this.$createElement("div", {}, "message");
+  }
+
+  static testConfig() {
+    const { config } = this;
+    config.silent;
+    config.optionMergeStrategies;
+    config.devtools;
+    config.errorHandler = (err, vm) => {
+      if (vm instanceof Test) {
+        vm.testProperties();
+        vm.testMethods();
+      }
+    };
+    config.warnHandler = (msg, vm) => {
+      if (vm instanceof Test) {
+        vm.testProperties();
+        vm.testMethods();
+      }
+    };
+    config.keyCodes = { esc: 27 };
+    config.ignoredElements = ['foo', /^ion-/];
+  }
+
+  static testMethods() {
+    this.extend({
+      data() {
+        return {
+          msg: ""
+        };
+      }
+    });
+    this.nextTick(() => {});
+    this.nextTick().then(() => {});
+    this.set({}, "", "");
+    this.set([true, false, true], 1, true);
+    this.delete({}, "");
+    this.delete([true, false], 0);
+    this.directive("", {bind() {}});
+    this.filter("", (value: number) => value);
+    this.component("", { data: () => ({}) });
+    this.component("", { functional: true, render(h) { return h("div", "hello!") } });
+    this.use;
+    this.mixin(Test);
+    this.compile("<div>{{ message }}</div>");
+  }
+}
+
+const HelloWorldComponent = Vue.extend({
+  props: ["name"],
+  data() {
+    return {
+      message: "Hello " + this.name,
+    }
+  },
+  computed: {
+    shouted(): string {
+      return this.message.toUpperCase();
+    }
+  },
+  methods: {
+    getMoreExcited() {
+      this.message += "!";
+    }
+  },
+  watch: {
+    message(a: string) {
+      console.log(`Message ${this.message} was changed!`);
+    }
+  }
+});
+
+const FunctionalHelloWorldComponent = Vue.extend({
+  functional: true,
+  props: ["name"],
+  render(createElement, ctxt) {
+    return createElement("div", "Hello " + ctxt.props.name)
+  }
+});
+
+const Parent = Vue.extend({
+  data() {
+    return { greeting: 'Hello' }
+  }
+});
+
+const Child = Parent.extend({
+  methods: {
+    foo() {
+      console.log(this.greeting.toLowerCase());
+    }
+  }
+});
+
+const GrandChild = Child.extend({
+  computed: {
+    lower(): string {
+      return this.greeting.toLowerCase();
+    }
+  }
+});
+
+new GrandChild().lower.toUpperCase();
+for (let _ in (new Test()).$options) {
+}
+declare const options: ComponentOptions<Vue>;
+Vue.extend(options);
+Vue.component('test-comp', options);
+new Vue(options);
+
+// cyclic example
+Vue.extend({
+  props: {
+    bar: {
+      type: String
+    }
+  },
+  methods: {
+    foo() {}
+  },
+  mounted () {
+    this.foo()
+  },
+  // manual annotation
+  render (h): VNode {
+    const a = this.bar
+    return h('canvas', {}, [a])
+  }
+})
diff --git a/advancedcontentfilter/vendor/asset/vue/types/tsconfig.json b/advancedcontentfilter/vendor/asset/vue/types/tsconfig.json
new file mode 100644 (file)
index 0000000..dc2f045
--- /dev/null
@@ -0,0 +1,11 @@
+{\r
+    "compilerOptions": {\r
+        "strict": true,\r
+        "lib": [\r
+            "es2015", "dom"\r
+        ]\r
+    },\r
+    "include": [\r
+        "./*.ts"\r
+    ]\r
+}
\ No newline at end of file
diff --git a/advancedcontentfilter/vendor/asset/vue/types/typings.json b/advancedcontentfilter/vendor/asset/vue/types/typings.json
new file mode 100644 (file)
index 0000000..78df1c7
--- /dev/null
@@ -0,0 +1,4 @@
+{
+  "name": "vue",
+  "main": "index.d.ts"
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/types/vnode.d.ts b/advancedcontentfilter/vendor/asset/vue/types/vnode.d.ts
new file mode 100644 (file)
index 0000000..5754c43
--- /dev/null
@@ -0,0 +1,67 @@
+import { Vue } from "./vue";
+
+export type ScopedSlot = (props: any) => VNodeChildrenArrayContents | string;
+
+export type VNodeChildren = VNodeChildrenArrayContents | [ScopedSlot] | string;
+export interface VNodeChildrenArrayContents extends Array<VNode | string | VNodeChildrenArrayContents> {}
+
+export interface VNode {
+  tag?: string;
+  data?: VNodeData;
+  children?: VNode[];
+  text?: string;
+  elm?: Node;
+  ns?: string;
+  context?: Vue;
+  key?: string | number;
+  componentOptions?: VNodeComponentOptions;
+  componentInstance?: Vue;
+  parent?: VNode;
+  raw?: boolean;
+  isStatic?: boolean;
+  isRootInsert: boolean;
+  isComment: boolean;
+}
+
+export interface VNodeComponentOptions {
+  Ctor: typeof Vue;
+  propsData?: object;
+  listeners?: object;
+  children?: VNodeChildren;
+  tag?: string;
+}
+
+export interface VNodeData {
+  key?: string | number;
+  slot?: string;
+  scopedSlots?: { [key: string]: ScopedSlot };
+  ref?: string;
+  tag?: string;
+  staticClass?: string;
+  class?: any;
+  staticStyle?: { [key: string]: any };
+  style?: object[] | object;
+  props?: { [key: string]: any };
+  attrs?: { [key: string]: any };
+  domProps?: { [key: string]: any };
+  hook?: { [key: string]: Function };
+  on?: { [key: string]: Function | Function[] };
+  nativeOn?: { [key: string]: Function | Function[] };
+  transition?: object;
+  show?: boolean;
+  inlineTemplate?: {
+    render: Function;
+    staticRenderFns: Function[];
+  };
+  directives?: VNodeDirective[];
+  keepAlive?: boolean;
+}
+
+export interface VNodeDirective {
+  readonly name: string;
+  readonly value: any;
+  readonly oldValue: any;
+  readonly expression: any;
+  readonly arg: string;
+  readonly modifiers: { [key: string]: boolean };
+}
diff --git a/advancedcontentfilter/vendor/asset/vue/types/vue.d.ts b/advancedcontentfilter/vendor/asset/vue/types/vue.d.ts
new file mode 100644 (file)
index 0000000..e0b2915
--- /dev/null
@@ -0,0 +1,124 @@
+import {
+  Component,
+  AsyncComponent,
+  ComponentOptions,
+  FunctionalComponentOptions,
+  WatchOptionsWithHandler,
+  WatchHandler,
+  DirectiveOptions,
+  DirectiveFunction,
+  RecordPropsDefinition,
+  ThisTypedComponentOptionsWithArrayProps,
+  ThisTypedComponentOptionsWithRecordProps,
+  WatchOptions,
+} from "./options";
+import { VNode, VNodeData, VNodeChildren, ScopedSlot } from "./vnode";
+import { PluginFunction, PluginObject } from "./plugin";
+
+export interface CreateElement {
+  (tag?: string | Component<any, any, any, any> | AsyncComponent<any, any, any, any> | (() => Component), children?: VNodeChildren): VNode;
+  (tag?: string | Component<any, any, any, any> | AsyncComponent<any, any, any, any> | (() => Component), data?: VNodeData, children?: VNodeChildren): VNode;
+}
+
+export interface Vue {
+  readonly $el: HTMLElement;
+  readonly $options: ComponentOptions<Vue>;
+  readonly $parent: Vue;
+  readonly $root: Vue;
+  readonly $children: Vue[];
+  readonly $refs: { [key: string]: Vue | Element | Vue[] | Element[] };
+  readonly $slots: { [key: string]: VNode[] };
+  readonly $scopedSlots: { [key: string]: ScopedSlot };
+  readonly $isServer: boolean;
+  readonly $data: Record<string, any>;
+  readonly $props: Record<string, any>;
+  readonly $ssrContext: any;
+  readonly $vnode: VNode;
+  readonly $attrs: Record<string, string>;
+  readonly $listeners: Record<string, Function | Function[]>;
+
+  $mount(elementOrSelector?: Element | string, hydrating?: boolean): this;
+  $forceUpdate(): void;
+  $destroy(): void;
+  $set: typeof Vue.set;
+  $delete: typeof Vue.delete;
+  $watch(
+    expOrFn: string,
+    callback: (this: this, n: any, o: any) => void,
+    options?: WatchOptions
+  ): (() => void);
+  $watch<T>(
+    expOrFn: (this: this) => T,
+    callback: (this: this, n: T, o: T) => void,
+    options?: WatchOptions
+  ): (() => void);
+  $on(event: string | string[], callback: Function): this;
+  $once(event: string, callback: Function): this;
+  $off(event?: string | string[], callback?: Function): this;
+  $emit(event: string, ...args: any[]): this;
+  $nextTick(callback: (this: this) => void): void;
+  $nextTick(): Promise<void>;
+  $createElement: CreateElement;
+}
+
+export type CombinedVueInstance<Instance extends Vue, Data, Methods, Computed, Props> =  Data & Methods & Computed & Props & Instance;
+export type ExtendedVue<Instance extends Vue, Data, Methods, Computed, Props> = VueConstructor<CombinedVueInstance<Instance, Data, Methods, Computed, Props> & Vue>;
+
+export interface VueConfiguration {
+  silent: boolean;
+  optionMergeStrategies: any;
+  devtools: boolean;
+  productionTip: boolean;
+  performance: boolean;
+  errorHandler(err: Error, vm: Vue, info: string): void;
+  warnHandler(msg: string, vm: Vue, trace: string): void;
+  ignoredElements: (string | RegExp)[];
+  keyCodes: { [key: string]: number | number[] };
+}
+
+export interface VueConstructor<V extends Vue = Vue> {
+  new <Data = object, Methods = object, Computed = object, PropNames extends string = never>(options?: ThisTypedComponentOptionsWithArrayProps<V, Data, Methods, Computed, PropNames>): CombinedVueInstance<V, Data, Methods, Computed, Record<PropNames, any>>;
+  // ideally, the return type should just contains Props, not Record<keyof Props, any>. But TS requires Base constructors must all have the same return type.
+  new <Data = object, Methods = object, Computed = object, Props = object>(options?: ThisTypedComponentOptionsWithRecordProps<V, Data, Methods, Computed, Props>): CombinedVueInstance<V, Data, Methods, Computed, Record<keyof Props, any>>;
+  new (options?: ComponentOptions<V>): CombinedVueInstance<V, object, object, object, Record<keyof object, any>>;
+
+  extend<Data, Methods, Computed, PropNames extends string = never>(options?: ThisTypedComponentOptionsWithArrayProps<V, Data, Methods, Computed, PropNames>): ExtendedVue<V, Data, Methods, Computed, Record<PropNames, any>>;
+  extend<Data, Methods, Computed, Props>(options?: ThisTypedComponentOptionsWithRecordProps<V, Data, Methods, Computed, Props>): ExtendedVue<V, Data, Methods, Computed, Props>;
+  extend<PropNames extends string = never>(definition: FunctionalComponentOptions<Record<PropNames, any>, PropNames[]>): ExtendedVue<V, {}, {}, {}, Record<PropNames, any>>;
+  extend<Props>(definition: FunctionalComponentOptions<Props, RecordPropsDefinition<Props>>): ExtendedVue<V, {}, {}, {}, Props>;
+  extend(options?: ComponentOptions<V>): ExtendedVue<V, {}, {}, {}, {}>;
+
+  nextTick(callback: () => void, context?: any[]): void;
+  nextTick(): Promise<void>
+  set<T>(object: object, key: string, value: T): T;
+  set<T>(array: T[], key: number, value: T): T;
+  delete(object: object, key: string): void;
+  delete<T>(array: T[], key: number): void;
+
+  directive(
+    id: string,
+    definition?: DirectiveOptions | DirectiveFunction
+  ): DirectiveOptions;
+  filter(id: string, definition?: Function): Function;
+
+  component(id: string): VueConstructor;
+  component<VC extends VueConstructor>(id: string, constructor: VC): VC;
+  component<Data, Methods, Computed, Props>(id: string, definition: AsyncComponent<Data, Methods, Computed, Props>): ExtendedVue<V, Data, Methods, Computed, Props>;
+  component<Data, Methods, Computed, PropNames extends string = never>(id: string, definition?: ThisTypedComponentOptionsWithArrayProps<V, Data, Methods, Computed, PropNames>): ExtendedVue<V, Data, Methods, Computed, Record<PropNames, any>>;
+  component<Data, Methods, Computed, Props>(id: string, definition?: ThisTypedComponentOptionsWithRecordProps<V, Data, Methods, Computed, Props>): ExtendedVue<V, Data, Methods, Computed, Props>;
+  component<PropNames extends string>(id: string, definition: FunctionalComponentOptions<Record<PropNames, any>, PropNames[]>): ExtendedVue<V, {}, {}, {}, Record<PropNames, any>>;
+  component<Props>(id: string, definition: FunctionalComponentOptions<Props, RecordPropsDefinition<Props>>): ExtendedVue<V, {}, {}, {}, Props>;
+  component(id: string, definition?: ComponentOptions<V>): ExtendedVue<V, {}, {}, {}, {}>;
+
+  use<T>(plugin: PluginObject<T> | PluginFunction<T>, options?: T): void;
+  use(plugin: PluginObject<any> | PluginFunction<any>, ...options: any[]): void;
+  mixin(mixin: VueConstructor | ComponentOptions<Vue>): void;
+  compile(template: string): {
+    render(createElement: typeof Vue.prototype.$createElement): VNode;
+    staticRenderFns: (() => VNode)[];
+  };
+
+  config: VueConfiguration;
+}
+
+export const Vue: VueConstructor;
diff --git a/advancedcontentfilter/vendor/asset/vue/yarn.lock b/advancedcontentfilter/vendor/asset/vue/yarn.lock
new file mode 100644 (file)
index 0000000..e8cb628
--- /dev/null
@@ -0,0 +1,8114 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@babel/code-frame@7.0.0-beta.40", "@babel/code-frame@^7.0.0-beta.35", "@babel/code-frame@^7.0.0-beta.40":
+  version "7.0.0-beta.40"
+  resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-beta.40.tgz#37e2b0cf7c56026b4b21d3927cadf81adec32ac6"
+  dependencies:
+    "@babel/highlight" "7.0.0-beta.40"
+
+"@babel/generator@7.0.0-beta.40":
+  version "7.0.0-beta.40"
+  resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.0.0-beta.40.tgz#ab61f9556f4f71dbd1138949c795bb9a21e302ea"
+  dependencies:
+    "@babel/types" "7.0.0-beta.40"
+    jsesc "^2.5.1"
+    lodash "^4.2.0"
+    source-map "^0.5.0"
+    trim-right "^1.0.1"
+
+"@babel/helper-function-name@7.0.0-beta.40":
+  version "7.0.0-beta.40"
+  resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.40.tgz#9d033341ab16517f40d43a73f2d81fc431ccd7b6"
+  dependencies:
+    "@babel/helper-get-function-arity" "7.0.0-beta.40"
+    "@babel/template" "7.0.0-beta.40"
+    "@babel/types" "7.0.0-beta.40"
+
+"@babel/helper-get-function-arity@7.0.0-beta.40":
+  version "7.0.0-beta.40"
+  resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.40.tgz#ac0419cf067b0ec16453e1274f03878195791c6e"
+  dependencies:
+    "@babel/types" "7.0.0-beta.40"
+
+"@babel/highlight@7.0.0-beta.40":
+  version "7.0.0-beta.40"
+  resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0-beta.40.tgz#b43d67d76bf46e1d10d227f68cddcd263786b255"
+  dependencies:
+    chalk "^2.0.0"
+    esutils "^2.0.2"
+    js-tokens "^3.0.0"
+
+"@babel/template@7.0.0-beta.40":
+  version "7.0.0-beta.40"
+  resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.0.0-beta.40.tgz#034988c6424eb5c3268fe6a608626de1f4410fc8"
+  dependencies:
+    "@babel/code-frame" "7.0.0-beta.40"
+    "@babel/types" "7.0.0-beta.40"
+    babylon "7.0.0-beta.40"
+    lodash "^4.2.0"
+
+"@babel/traverse@^7.0.0-beta.40":
+  version "7.0.0-beta.40"
+  resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.0.0-beta.40.tgz#d140e449b2e093ef9fe1a2eecc28421ffb4e521e"
+  dependencies:
+    "@babel/code-frame" "7.0.0-beta.40"
+    "@babel/generator" "7.0.0-beta.40"
+    "@babel/helper-function-name" "7.0.0-beta.40"
+    "@babel/types" "7.0.0-beta.40"
+    babylon "7.0.0-beta.40"
+    debug "^3.0.1"
+    globals "^11.1.0"
+    invariant "^2.2.0"
+    lodash "^4.2.0"
+
+"@babel/types@7.0.0-beta.40", "@babel/types@^7.0.0-beta.40":
+  version "7.0.0-beta.40"
+  resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0-beta.40.tgz#25c3d7aae14126abe05fcb098c65a66b6d6b8c14"
+  dependencies:
+    esutils "^2.0.2"
+    lodash "^4.2.0"
+    to-fast-properties "^2.0.0"
+
+"@types/node@*":
+  version "9.4.6"
+  resolved "https://registry.yarnpkg.com/@types/node/-/node-9.4.6.tgz#d8176d864ee48753d053783e4e463aec86b8d82e"
+
+"@types/node@^8.0.33":
+  version "8.9.4"
+  resolved "https://registry.yarnpkg.com/@types/node/-/node-8.9.4.tgz#dfd327582a06c114eb6e0441fa3d6fab35edad48"
+
+"@types/tapable@*":
+  version "0.2.4"
+  resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-0.2.4.tgz#8181a228da46185439300e600c5ae3b3b3982585"
+
+"@types/uglify-js@*":
+  version "2.6.30"
+  resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-2.6.30.tgz#257d2b6dd86673d60da476680fba90f2e30c6eef"
+  dependencies:
+    source-map "^0.6.1"
+
+"@types/webpack@^3.0.13":
+  version "3.8.9"
+  resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-3.8.9.tgz#c420c9428ba18e20e4fe8eff7bee4d04bace9182"
+  dependencies:
+    "@types/node" "*"
+    "@types/tapable" "*"
+    "@types/uglify-js" "*"
+    source-map "^0.6.0"
+
+JSONStream@^1.0.3, JSONStream@^1.0.4:
+  version "1.3.2"
+  resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.2.tgz#c102371b6ec3a7cf3b847ca00c20bb0fce4c6dea"
+  dependencies:
+    jsonparse "^1.2.0"
+    through ">=2.2.7 <3"
+
+abab@^1.0.4:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e"
+
+abbrev@1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
+
+abbrev@1.0.x:
+  version "1.0.9"
+  resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135"
+
+accepts@~1.3.4:
+  version "1.3.5"
+  resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2"
+  dependencies:
+    mime-types "~2.1.18"
+    negotiator "0.6.1"
+
+acorn-dynamic-import@^2.0.0:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz#c752bd210bef679501b6c6cb7fc84f8f47158cc4"
+  dependencies:
+    acorn "^4.0.3"
+
+acorn-dynamic-import@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz#901ceee4c7faaef7e07ad2a47e890675da50a278"
+  dependencies:
+    acorn "^5.0.0"
+
+acorn-globals@^4.1.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.1.0.tgz#ab716025dbe17c54d3ef81d32ece2b2d99fe2538"
+  dependencies:
+    acorn "^5.0.0"
+
+acorn-jsx@^3.0.0:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b"
+  dependencies:
+    acorn "^3.0.4"
+
+acorn-jsx@^4.1.1:
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-4.1.1.tgz#e8e41e48ea2fe0c896740610ab6a4ffd8add225e"
+  dependencies:
+    acorn "^5.0.3"
+
+acorn-node@^1.2.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/acorn-node/-/acorn-node-1.3.0.tgz#5f86d73346743810ef1269b901dbcbded020861b"
+  dependencies:
+    acorn "^5.4.1"
+    xtend "^4.0.1"
+
+acorn@^3.0.4:
+  version "3.3.0"
+  resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a"
+
+acorn@^4.0.3:
+  version "4.0.13"
+  resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787"
+
+acorn@^5.0.0, acorn@^5.0.3, acorn@^5.2.1, acorn@^5.3.0, acorn@^5.4.1, acorn@^5.5.0:
+  version "5.5.1"
+  resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.5.1.tgz#84e05a9ea0acbe131227da50301e62464dc9c1d8"
+
+addressparser@1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/addressparser/-/addressparser-1.0.1.tgz#47afbe1a2a9262191db6838e4fd1d39b40821746"
+
+adm-zip@~0.4.3:
+  version "0.4.7"
+  resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.7.tgz#8606c2cbf1c426ce8c8ec00174447fd49b6eafc1"
+
+after@0.8.2:
+  version "0.8.2"
+  resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f"
+
+agent-base@2:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-2.1.1.tgz#d6de10d5af6132d5bd692427d46fc538539094c7"
+  dependencies:
+    extend "~3.0.0"
+    semver "~5.0.1"
+
+ajv-keywords@^2.1.0:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762"
+
+ajv-keywords@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.1.0.tgz#ac2b27939c543e95d2c06e7f7f5c27be4aa543be"
+
+ajv@^4.9.1:
+  version "4.11.8"
+  resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536"
+  dependencies:
+    co "^4.6.0"
+    json-stable-stringify "^1.0.1"
+
+ajv@^5.1.0, ajv@^5.2.3, ajv@^5.3.0:
+  version "5.5.2"
+  resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965"
+  dependencies:
+    co "^4.6.0"
+    fast-deep-equal "^1.0.0"
+    fast-json-stable-stringify "^2.0.0"
+    json-schema-traverse "^0.3.0"
+
+ajv@^6.1.0:
+  version "6.2.1"
+  resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.2.1.tgz#28a6abc493a2abe0fb4c8507acaedb43fa550671"
+  dependencies:
+    fast-deep-equal "^1.0.0"
+    fast-json-stable-stringify "^2.0.0"
+    json-schema-traverse "^0.3.0"
+
+align-text@^0.1.1, align-text@^0.1.3:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117"
+  dependencies:
+    kind-of "^3.0.2"
+    longest "^1.0.1"
+    repeat-string "^1.5.2"
+
+amdefine@>=0.0.4:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5"
+
+amqplib@^0.5.2:
+  version "0.5.2"
+  resolved "https://registry.yarnpkg.com/amqplib/-/amqplib-0.5.2.tgz#d2d7313c7ffaa4d10bcf1e6252de4591b6cc7b63"
+  dependencies:
+    bitsyntax "~0.0.4"
+    bluebird "^3.4.6"
+    buffer-more-ints "0.0.2"
+    readable-stream "1.x >=1.1.9"
+    safe-buffer "^5.0.1"
+
+ansi-escapes@^1.0.0, ansi-escapes@^1.1.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e"
+
+ansi-escapes@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.0.0.tgz#ec3e8b4e9f8064fc02c3ac9b65f1c275bda8ef92"
+
+ansi-regex@^2.0.0:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
+
+ansi-regex@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998"
+
+ansi-styles@^2.2.1:
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
+
+ansi-styles@^3.2.0, ansi-styles@^3.2.1:
+  version "3.2.1"
+  resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
+  dependencies:
+    color-convert "^1.9.0"
+
+any-observable@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/any-observable/-/any-observable-0.2.0.tgz#c67870058003579009083f54ac0abafb5c33d242"
+
+anymatch@^1.3.0:
+  version "1.3.2"
+  resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a"
+  dependencies:
+    micromatch "^2.1.5"
+    normalize-path "^2.0.0"
+
+anymatch@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb"
+  dependencies:
+    micromatch "^3.1.4"
+    normalize-path "^2.1.1"
+
+app-root-path@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/app-root-path/-/app-root-path-2.0.1.tgz#cd62dcf8e4fd5a417efc664d2e5b10653c651b46"
+
+aproba@^1.0.3:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
+
+archiver-utils@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/archiver-utils/-/archiver-utils-1.3.0.tgz#e50b4c09c70bf3d680e32ff1b7994e9f9d895174"
+  dependencies:
+    glob "^7.0.0"
+    graceful-fs "^4.1.0"
+    lazystream "^1.0.0"
+    lodash "^4.8.0"
+    normalize-path "^2.0.0"
+    readable-stream "^2.0.0"
+
+archiver@1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/archiver/-/archiver-1.3.0.tgz#4f2194d6d8f99df3f531e6881f14f15d55faaf22"
+  dependencies:
+    archiver-utils "^1.3.0"
+    async "^2.0.0"
+    buffer-crc32 "^0.2.1"
+    glob "^7.0.0"
+    lodash "^4.8.0"
+    readable-stream "^2.0.0"
+    tar-stream "^1.5.0"
+    walkdir "^0.0.11"
+    zip-stream "^1.1.0"
+
+are-we-there-yet@~1.1.2:
+  version "1.1.4"
+  resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d"
+  dependencies:
+    delegates "^1.0.0"
+    readable-stream "^2.0.6"
+
+argparse@^1.0.7:
+  version "1.0.10"
+  resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
+  dependencies:
+    sprintf-js "~1.0.2"
+
+arr-diff@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf"
+  dependencies:
+    arr-flatten "^1.0.1"
+
+arr-diff@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520"
+
+arr-flatten@^1.0.1, arr-flatten@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1"
+
+arr-union@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4"
+
+array-equal@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93"
+
+array-filter@~0.0.0:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec"
+
+array-find-index@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1"
+
+array-ify@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece"
+
+array-map@~0.0.0:
+  version "0.0.0"
+  resolved "https://registry.yarnpkg.com/array-map/-/array-map-0.0.0.tgz#88a2bab73d1cf7bcd5c1b118a003f66f665fa662"
+
+array-reduce@~0.0.0:
+  version "0.0.0"
+  resolved "https://registry.yarnpkg.com/array-reduce/-/array-reduce-0.0.0.tgz#173899d3ffd1c7d9383e4479525dbe278cab5f2b"
+
+array-slice@^0.2.3:
+  version "0.2.3"
+  resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5"
+
+array-union@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39"
+  dependencies:
+    array-uniq "^1.0.1"
+
+array-uniq@^1.0.1:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6"
+
+array-unique@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53"
+
+array-unique@^0.3.2:
+  version "0.3.2"
+  resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"
+
+arraybuffer.slice@~0.0.7:
+  version "0.0.7"
+  resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz#3bbc4275dd584cc1b10809b89d4e8b63a69e7675"
+
+arrify@^1.0.0, arrify@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
+
+asn1.js@^4.0.0:
+  version "4.10.1"
+  resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0"
+  dependencies:
+    bn.js "^4.0.0"
+    inherits "^2.0.1"
+    minimalistic-assert "^1.0.0"
+
+asn1@0.1.11:
+  version "0.1.11"
+  resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.1.11.tgz#559be18376d08a4ec4dbe80877d27818639b2df7"
+
+asn1@~0.2.3:
+  version "0.2.3"
+  resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86"
+
+assert-plus@1.0.0, assert-plus@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
+
+assert-plus@^0.1.5:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.1.5.tgz#ee74009413002d84cec7219c6ac811812e723160"
+
+assert-plus@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234"
+
+assert@^1.1.1, assert@^1.4.0:
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91"
+  dependencies:
+    util "0.10.3"
+
+assertion-error@1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.0.0.tgz#c7f85438fdd466bc7ca16ab90c81513797a5d23b"
+
+assign-symbols@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
+
+ast-types@0.x.x:
+  version "0.11.2"
+  resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.11.2.tgz#cc4e1d15a36b39979a1986fe1e91321cbfae7783"
+
+astw@^2.0.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/astw/-/astw-2.2.0.tgz#7bd41784d32493987aeb239b6b4e1c57a873b917"
+  dependencies:
+    acorn "^4.0.3"
+
+async-each@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d"
+
+async-limiter@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8"
+
+async@1.x, async@^1.4.0, async@^1.5.2:
+  version "1.5.2"
+  resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
+
+async@2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/async/-/async-2.0.1.tgz#b709cc0280a9c36f09f4536be823c838a9049e25"
+  dependencies:
+    lodash "^4.8.0"
+
+async@^2.0.0, async@^2.1.2:
+  version "2.6.0"
+  resolved "https://registry.yarnpkg.com/async/-/async-2.6.0.tgz#61a29abb6fcc026fea77e56d1c6ec53a795951f4"
+  dependencies:
+    lodash "^4.14.0"
+
+async@~0.9.0:
+  version "0.9.2"
+  resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d"
+
+async@~2.1.2:
+  version "2.1.5"
+  resolved "https://registry.yarnpkg.com/async/-/async-2.1.5.tgz#e587c68580994ac67fc56ff86d3ac56bdbe810bc"
+  dependencies:
+    lodash "^4.14.0"
+
+asynckit@^0.4.0:
+  version "0.4.0"
+  resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
+
+atob@^2.0.0:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/atob/-/atob-2.0.3.tgz#19c7a760473774468f20b2d2d03372ad7d4cbf5d"
+
+atob@~1.1.0:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/atob/-/atob-1.1.3.tgz#95f13629b12c3a51a5d215abdce2aa9f32f80773"
+
+aws-sign2@~0.5.0:
+  version "0.5.0"
+  resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.5.0.tgz#c57103f7a17fc037f02d7c2e64b602ea223f7d63"
+
+aws-sign2@~0.6.0:
+  version "0.6.0"
+  resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f"
+
+aws-sign2@~0.7.0:
+  version "0.7.0"
+  resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8"
+
+aws4@^1.2.1, aws4@^1.6.0:
+  version "1.6.0"
+  resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e"
+
+axios@^0.15.3:
+  version "0.15.3"
+  resolved "https://registry.yarnpkg.com/axios/-/axios-0.15.3.tgz#2c9d638b2e191a08ea1d6cc988eadd6ba5bdc053"
+  dependencies:
+    follow-redirects "1.0.0"
+
+babel-code-frame@^6.22.0, babel-code-frame@^6.26.0:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b"
+  dependencies:
+    chalk "^1.1.3"
+    esutils "^2.0.2"
+    js-tokens "^3.0.2"
+
+babel-core@^6.25.0, babel-core@^6.26.0:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.0.tgz#af32f78b31a6fcef119c87b0fd8d9753f03a0bb8"
+  dependencies:
+    babel-code-frame "^6.26.0"
+    babel-generator "^6.26.0"
+    babel-helpers "^6.24.1"
+    babel-messages "^6.23.0"
+    babel-register "^6.26.0"
+    babel-runtime "^6.26.0"
+    babel-template "^6.26.0"
+    babel-traverse "^6.26.0"
+    babel-types "^6.26.0"
+    babylon "^6.18.0"
+    convert-source-map "^1.5.0"
+    debug "^2.6.8"
+    json5 "^0.5.1"
+    lodash "^4.17.4"
+    minimatch "^3.0.4"
+    path-is-absolute "^1.0.1"
+    private "^0.1.7"
+    slash "^1.0.0"
+    source-map "^0.5.6"
+
+babel-eslint@^8.0.3:
+  version "8.2.2"
+  resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-8.2.2.tgz#1102273354c6f0b29b4ea28a65f97d122296b68b"
+  dependencies:
+    "@babel/code-frame" "^7.0.0-beta.40"
+    "@babel/traverse" "^7.0.0-beta.40"
+    "@babel/types" "^7.0.0-beta.40"
+    babylon "^7.0.0-beta.40"
+    eslint-scope "~3.7.1"
+    eslint-visitor-keys "^1.0.0"
+
+babel-generator@^6.18.0, babel-generator@^6.26.0:
+  version "6.26.1"
+  resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90"
+  dependencies:
+    babel-messages "^6.23.0"
+    babel-runtime "^6.26.0"
+    babel-types "^6.26.0"
+    detect-indent "^4.0.0"
+    jsesc "^1.3.0"
+    lodash "^4.17.4"
+    source-map "^0.5.7"
+    trim-right "^1.0.1"
+
+babel-helper-call-delegate@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d"
+  dependencies:
+    babel-helper-hoist-variables "^6.24.1"
+    babel-runtime "^6.22.0"
+    babel-traverse "^6.24.1"
+    babel-types "^6.24.1"
+
+babel-helper-define-map@^6.24.1:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f"
+  dependencies:
+    babel-helper-function-name "^6.24.1"
+    babel-runtime "^6.26.0"
+    babel-types "^6.26.0"
+    lodash "^4.17.4"
+
+babel-helper-function-name@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9"
+  dependencies:
+    babel-helper-get-function-arity "^6.24.1"
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+    babel-traverse "^6.24.1"
+    babel-types "^6.24.1"
+
+babel-helper-get-function-arity@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d"
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+
+babel-helper-hoist-variables@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76"
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+
+babel-helper-optimise-call-expression@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257"
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+
+babel-helper-regex@^6.24.1:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72"
+  dependencies:
+    babel-runtime "^6.26.0"
+    babel-types "^6.26.0"
+    lodash "^4.17.4"
+
+babel-helper-replace-supers@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a"
+  dependencies:
+    babel-helper-optimise-call-expression "^6.24.1"
+    babel-messages "^6.23.0"
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+    babel-traverse "^6.24.1"
+    babel-types "^6.24.1"
+
+babel-helper-vue-jsx-merge-props@^2.0.2:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-2.0.3.tgz#22aebd3b33902328e513293a8e4992b384f9f1b6"
+
+babel-helpers@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2"
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+
+babel-loader@^7.0.0:
+  version "7.1.4"
+  resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-7.1.4.tgz#e3463938bd4e6d55d1c174c5485d406a188ed015"
+  dependencies:
+    find-cache-dir "^1.0.0"
+    loader-utils "^1.0.2"
+    mkdirp "^0.5.1"
+
+babel-messages@^6.23.0:
+  version "6.23.0"
+  resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e"
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-check-es2015-constants@^6.22.0:
+  version "6.22.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a"
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-istanbul@^4.1.4:
+  version "4.1.5"
+  resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.5.tgz#6760cdd977f411d3e175bb064f2bc327d99b2b6e"
+  dependencies:
+    find-up "^2.1.0"
+    istanbul-lib-instrument "^1.7.5"
+    test-exclude "^4.1.1"
+
+babel-plugin-syntax-class-properties@^6.8.0:
+  version "6.13.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz#d7eb23b79a317f8543962c505b827c7d6cac27de"
+
+babel-plugin-syntax-dynamic-import@^6.18.0:
+  version "6.18.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz#8d6a26229c83745a9982a441051572caa179b1da"
+
+babel-plugin-syntax-flow@^6.18.0, babel-plugin-syntax-flow@^6.8.0:
+  version "6.18.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz#4c3ab20a2af26aa20cd25995c398c4eb70310c8d"
+
+babel-plugin-syntax-jsx@^6.18.0:
+  version "6.18.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946"
+
+babel-plugin-transform-class-properties@^6.8.0:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz#6a79763ea61d33d36f37b611aa9def81a81b46ac"
+  dependencies:
+    babel-helper-function-name "^6.24.1"
+    babel-plugin-syntax-class-properties "^6.8.0"
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-arrow-functions@^6.22.0:
+  version "6.22.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221"
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-block-scoped-functions@^6.22.0:
+  version "6.22.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141"
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-block-scoping@^6.24.1:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f"
+  dependencies:
+    babel-runtime "^6.26.0"
+    babel-template "^6.26.0"
+    babel-traverse "^6.26.0"
+    babel-types "^6.26.0"
+    lodash "^4.17.4"
+
+babel-plugin-transform-es2015-classes@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db"
+  dependencies:
+    babel-helper-define-map "^6.24.1"
+    babel-helper-function-name "^6.24.1"
+    babel-helper-optimise-call-expression "^6.24.1"
+    babel-helper-replace-supers "^6.24.1"
+    babel-messages "^6.23.0"
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+    babel-traverse "^6.24.1"
+    babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-computed-properties@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3"
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-destructuring@^6.22.0:
+  version "6.23.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d"
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-duplicate-keys@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e"
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-for-of@^6.22.0:
+  version "6.23.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691"
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-function-name@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b"
+  dependencies:
+    babel-helper-function-name "^6.24.1"
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-literals@^6.22.0:
+  version "6.22.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e"
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-modules-amd@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154"
+  dependencies:
+    babel-plugin-transform-es2015-modules-commonjs "^6.24.1"
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-modules-commonjs@^6.24.1:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz#0d8394029b7dc6abe1a97ef181e00758dd2e5d8a"
+  dependencies:
+    babel-plugin-transform-strict-mode "^6.24.1"
+    babel-runtime "^6.26.0"
+    babel-template "^6.26.0"
+    babel-types "^6.26.0"
+
+babel-plugin-transform-es2015-modules-systemjs@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23"
+  dependencies:
+    babel-helper-hoist-variables "^6.24.1"
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-modules-umd@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468"
+  dependencies:
+    babel-plugin-transform-es2015-modules-amd "^6.24.1"
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-object-super@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d"
+  dependencies:
+    babel-helper-replace-supers "^6.24.1"
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-parameters@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b"
+  dependencies:
+    babel-helper-call-delegate "^6.24.1"
+    babel-helper-get-function-arity "^6.24.1"
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+    babel-traverse "^6.24.1"
+    babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-shorthand-properties@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0"
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-spread@^6.22.0:
+  version "6.22.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1"
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-sticky-regex@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc"
+  dependencies:
+    babel-helper-regex "^6.24.1"
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-template-literals@^6.22.0:
+  version "6.22.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d"
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-typeof-symbol@^6.22.0:
+  version "6.23.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372"
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-unicode-regex@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9"
+  dependencies:
+    babel-helper-regex "^6.24.1"
+    babel-runtime "^6.22.0"
+    regexpu-core "^2.0.0"
+
+babel-plugin-transform-flow-strip-types@^6.8.0:
+  version "6.22.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz#84cb672935d43714fdc32bce84568d87441cf7cf"
+  dependencies:
+    babel-plugin-syntax-flow "^6.18.0"
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-regenerator@^6.24.1:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f"
+  dependencies:
+    regenerator-transform "^0.10.0"
+
+babel-plugin-transform-strict-mode@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758"
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+
+babel-plugin-transform-vue-jsx@^3.4.3:
+  version "3.7.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-vue-jsx/-/babel-plugin-transform-vue-jsx-3.7.0.tgz#d40492e6692a36b594f7e9a1928f43e969740960"
+  dependencies:
+    esutils "^2.0.2"
+
+babel-preset-es2015@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz#d44050d6bc2c9feea702aaf38d727a0210538939"
+  dependencies:
+    babel-plugin-check-es2015-constants "^6.22.0"
+    babel-plugin-transform-es2015-arrow-functions "^6.22.0"
+    babel-plugin-transform-es2015-block-scoped-functions "^6.22.0"
+    babel-plugin-transform-es2015-block-scoping "^6.24.1"
+    babel-plugin-transform-es2015-classes "^6.24.1"
+    babel-plugin-transform-es2015-computed-properties "^6.24.1"
+    babel-plugin-transform-es2015-destructuring "^6.22.0"
+    babel-plugin-transform-es2015-duplicate-keys "^6.24.1"
+    babel-plugin-transform-es2015-for-of "^6.22.0"
+    babel-plugin-transform-es2015-function-name "^6.24.1"
+    babel-plugin-transform-es2015-literals "^6.22.0"
+    babel-plugin-transform-es2015-modules-amd "^6.24.1"
+    babel-plugin-transform-es2015-modules-commonjs "^6.24.1"
+    babel-plugin-transform-es2015-modules-systemjs "^6.24.1"
+    babel-plugin-transform-es2015-modules-umd "^6.24.1"
+    babel-plugin-transform-es2015-object-super "^6.24.1"
+    babel-plugin-transform-es2015-parameters "^6.24.1"
+    babel-plugin-transform-es2015-shorthand-properties "^6.24.1"
+    babel-plugin-transform-es2015-spread "^6.22.0"
+    babel-plugin-transform-es2015-sticky-regex "^6.24.1"
+    babel-plugin-transform-es2015-template-literals "^6.22.0"
+    babel-plugin-transform-es2015-typeof-symbol "^6.22.0"
+    babel-plugin-transform-es2015-unicode-regex "^6.24.1"
+    babel-plugin-transform-regenerator "^6.24.1"
+
+babel-preset-flow-vue@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/babel-preset-flow-vue/-/babel-preset-flow-vue-1.0.0.tgz#bd28eb64b53d65f9c47262b32ce6c6033fe70671"
+  dependencies:
+    babel-plugin-syntax-flow "^6.8.0"
+    babel-plugin-transform-class-properties "^6.8.0"
+    babel-plugin-transform-flow-strip-types "^6.8.0"
+
+babel-register@^6.26.0:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071"
+  dependencies:
+    babel-core "^6.26.0"
+    babel-runtime "^6.26.0"
+    core-js "^2.5.0"
+    home-or-tmp "^2.0.0"
+    lodash "^4.17.4"
+    mkdirp "^0.5.1"
+    source-map-support "^0.4.15"
+
+babel-runtime@^6.0.0, babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
+  dependencies:
+    core-js "^2.4.0"
+    regenerator-runtime "^0.11.0"
+
+babel-template@^6.16.0, babel-template@^6.24.1, babel-template@^6.26.0:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02"
+  dependencies:
+    babel-runtime "^6.26.0"
+    babel-traverse "^6.26.0"
+    babel-types "^6.26.0"
+    babylon "^6.18.0"
+    lodash "^4.17.4"
+
+babel-traverse@^6.18.0, babel-traverse@^6.24.1, babel-traverse@^6.26.0:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee"
+  dependencies:
+    babel-code-frame "^6.26.0"
+    babel-messages "^6.23.0"
+    babel-runtime "^6.26.0"
+    babel-types "^6.26.0"
+    babylon "^6.18.0"
+    debug "^2.6.8"
+    globals "^9.18.0"
+    invariant "^2.2.2"
+    lodash "^4.17.4"
+
+babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497"
+  dependencies:
+    babel-runtime "^6.26.0"
+    esutils "^2.0.2"
+    lodash "^4.17.4"
+    to-fast-properties "^1.0.3"
+
+babylon@7.0.0-beta.40, babylon@^7.0.0-beta.40:
+  version "7.0.0-beta.40"
+  resolved "https://registry.yarnpkg.com/babylon/-/babylon-7.0.0-beta.40.tgz#91fc8cd56d5eb98b28e6fde41045f2957779940a"
+
+babylon@^6.18.0, babylon@^6.8.4:
+  version "6.18.0"
+  resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3"
+
+backo2@1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947"
+
+balanced-match@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
+
+base64-arraybuffer@0.1.5:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8"
+
+base64-js@^1.0.2:
+  version "1.2.3"
+  resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.3.tgz#fb13668233d9614cf5fb4bce95a9ba4096cdf801"
+
+base64id@1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/base64id/-/base64id-1.0.0.tgz#47688cb99bb6804f0e06d3e763b1c32e57d8e6b6"
+
+base@^0.11.1:
+  version "0.11.2"
+  resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f"
+  dependencies:
+    cache-base "^1.0.1"
+    class-utils "^0.3.5"
+    component-emitter "^1.2.1"
+    define-property "^1.0.0"
+    isobject "^3.0.1"
+    mixin-deep "^1.2.0"
+    pascalcase "^0.1.1"
+
+bcrypt-pbkdf@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d"
+  dependencies:
+    tweetnacl "^0.14.3"
+
+better-assert@~1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/better-assert/-/better-assert-1.0.2.tgz#40866b9e1b9e0b55b481894311e68faffaebc522"
+  dependencies:
+    callsite "1.0.0"
+
+big.js@^3.1.3:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e"
+
+binary-extensions@^1.0.0:
+  version "1.11.0"
+  resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205"
+
+bitsyntax@~0.0.4:
+  version "0.0.4"
+  resolved "https://registry.yarnpkg.com/bitsyntax/-/bitsyntax-0.0.4.tgz#eb10cc6f82b8c490e3e85698f07e83d46e0cba82"
+  dependencies:
+    buffer-more-ints "0.0.2"
+
+bl@^1.0.0:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.1.tgz#cac328f7bee45730d404b692203fcb590e172d5e"
+  dependencies:
+    readable-stream "^2.0.5"
+
+bl@~0.9.0:
+  version "0.9.5"
+  resolved "https://registry.yarnpkg.com/bl/-/bl-0.9.5.tgz#c06b797af085ea00bc527afc8efcf11de2232054"
+  dependencies:
+    readable-stream "~1.0.26"
+
+bl@~1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/bl/-/bl-1.1.2.tgz#fdca871a99713aa00d19e3bbba41c44787a65398"
+  dependencies:
+    readable-stream "~2.0.5"
+
+blob@0.0.4:
+  version "0.0.4"
+  resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.4.tgz#bcf13052ca54463f30f9fc7e95b9a47630a94921"
+
+block-stream@*:
+  version "0.0.9"
+  resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a"
+  dependencies:
+    inherits "~2.0.0"
+
+bluebird@^3.3.0, bluebird@^3.4.6:
+  version "3.5.1"
+  resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9"
+
+bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0:
+  version "4.11.8"
+  resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f"
+
+body-parser@^1.16.1:
+  version "1.18.2"
+  resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.2.tgz#87678a19d84b47d859b83199bd59bce222b10454"
+  dependencies:
+    bytes "3.0.0"
+    content-type "~1.0.4"
+    debug "2.6.9"
+    depd "~1.1.1"
+    http-errors "~1.6.2"
+    iconv-lite "0.4.19"
+    on-finished "~2.3.0"
+    qs "6.5.1"
+    raw-body "2.3.2"
+    type-is "~1.6.15"
+
+boom@0.4.x:
+  version "0.4.2"
+  resolved "https://registry.yarnpkg.com/boom/-/boom-0.4.2.tgz#7a636e9ded4efcefb19cef4947a3c67dfaee911b"
+  dependencies:
+    hoek "0.9.x"
+
+boom@2.x.x:
+  version "2.10.1"
+  resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f"
+  dependencies:
+    hoek "2.x.x"
+
+boom@4.x.x:
+  version "4.3.1"
+  resolved "https://registry.yarnpkg.com/boom/-/boom-4.3.1.tgz#4f8a3005cb4a7e3889f749030fd25b96e01d2e31"
+  dependencies:
+    hoek "4.x.x"
+
+boom@5.x.x:
+  version "5.2.0"
+  resolved "https://registry.yarnpkg.com/boom/-/boom-5.2.0.tgz#5dd9da6ee3a5f302077436290cb717d3f4a54e02"
+  dependencies:
+    hoek "4.x.x"
+
+brace-expansion@^1.0.0, brace-expansion@^1.1.7:
+  version "1.1.11"
+  resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
+  dependencies:
+    balanced-match "^1.0.0"
+    concat-map "0.0.1"
+
+braces@^0.1.2:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/braces/-/braces-0.1.5.tgz#c085711085291d8b75fdd74eab0f8597280711e6"
+  dependencies:
+    expand-range "^0.1.0"
+
+braces@^1.8.2:
+  version "1.8.5"
+  resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7"
+  dependencies:
+    expand-range "^1.8.1"
+    preserve "^0.2.0"
+    repeat-element "^1.1.2"
+
+braces@^2.3.0, braces@^2.3.1:
+  version "2.3.1"
+  resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.1.tgz#7086c913b4e5a08dbe37ac0ee6a2500c4ba691bb"
+  dependencies:
+    arr-flatten "^1.1.0"
+    array-unique "^0.3.2"
+    define-property "^1.0.0"
+    extend-shallow "^2.0.1"
+    fill-range "^4.0.0"
+    isobject "^3.0.1"
+    kind-of "^6.0.2"
+    repeat-element "^1.1.2"
+    snapdragon "^0.8.1"
+    snapdragon-node "^2.0.1"
+    split-string "^3.0.2"
+    to-regex "^3.0.1"
+
+brorand@^1.0.1:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
+
+browser-pack@^6.0.1:
+  version "6.0.4"
+  resolved "https://registry.yarnpkg.com/browser-pack/-/browser-pack-6.0.4.tgz#9a73beb3b48f9e36868be007b64400102c04a99f"
+  dependencies:
+    JSONStream "^1.0.3"
+    combine-source-map "~0.8.0"
+    defined "^1.0.0"
+    safe-buffer "^5.1.1"
+    through2 "^2.0.0"
+    umd "^3.0.0"
+
+browser-process-hrtime@^0.1.2:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz#425d68a58d3447f02a04aa894187fce8af8b7b8e"
+
+browser-resolve@^1.11.0, browser-resolve@^1.11.2, browser-resolve@^1.7.0:
+  version "1.11.2"
+  resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b32e48f442938ce"
+  dependencies:
+    resolve "1.1.7"
+
+browser-stdout@1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.0.tgz#f351d32969d32fa5d7a5567154263d928ae3bd1f"
+
+browserify-aes@^1.0.0, browserify-aes@^1.0.4:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.1.1.tgz#38b7ab55edb806ff2dcda1a7f1620773a477c49f"
+  dependencies:
+    buffer-xor "^1.0.3"
+    cipher-base "^1.0.0"
+    create-hash "^1.1.0"
+    evp_bytestokey "^1.0.3"
+    inherits "^2.0.1"
+    safe-buffer "^5.0.1"
+
+browserify-cipher@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.0.tgz#9988244874bf5ed4e28da95666dcd66ac8fc363a"
+  dependencies:
+    browserify-aes "^1.0.4"
+    browserify-des "^1.0.0"
+    evp_bytestokey "^1.0.0"
+
+browserify-des@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.0.tgz#daa277717470922ed2fe18594118a175439721dd"
+  dependencies:
+    cipher-base "^1.0.1"
+    des.js "^1.0.0"
+    inherits "^2.0.1"
+
+browserify-rsa@^4.0.0:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524"
+  dependencies:
+    bn.js "^4.1.0"
+    randombytes "^2.0.1"
+
+browserify-sign@^4.0.0:
+  version "4.0.4"
+  resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298"
+  dependencies:
+    bn.js "^4.1.1"
+    browserify-rsa "^4.0.0"
+    create-hash "^1.1.0"
+    create-hmac "^1.1.2"
+    elliptic "^6.0.0"
+    inherits "^2.0.1"
+    parse-asn1 "^5.0.0"
+
+browserify-zlib@^0.2.0, browserify-zlib@~0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f"
+  dependencies:
+    pako "~1.0.5"
+
+browserify@^14.5.0:
+  version "14.5.0"
+  resolved "https://registry.yarnpkg.com/browserify/-/browserify-14.5.0.tgz#0bbbce521acd6e4d1d54d8e9365008efb85a9cc5"
+  dependencies:
+    JSONStream "^1.0.3"
+    assert "^1.4.0"
+    browser-pack "^6.0.1"
+    browser-resolve "^1.11.0"
+    browserify-zlib "~0.2.0"
+    buffer "^5.0.2"
+    cached-path-relative "^1.0.0"
+    concat-stream "~1.5.1"
+    console-browserify "^1.1.0"
+    constants-browserify "~1.0.0"
+    crypto-browserify "^3.0.0"
+    defined "^1.0.0"
+    deps-sort "^2.0.0"
+    domain-browser "~1.1.0"
+    duplexer2 "~0.1.2"
+    events "~1.1.0"
+    glob "^7.1.0"
+    has "^1.0.0"
+    htmlescape "^1.1.0"
+    https-browserify "^1.0.0"
+    inherits "~2.0.1"
+    insert-module-globals "^7.0.0"
+    labeled-stream-splicer "^2.0.0"
+    module-deps "^4.0.8"
+    os-browserify "~0.3.0"
+    parents "^1.0.1"
+    path-browserify "~0.0.0"
+    process "~0.11.0"
+    punycode "^1.3.2"
+    querystring-es3 "~0.2.0"
+    read-only-stream "^2.0.0"
+    readable-stream "^2.0.2"
+    resolve "^1.1.4"
+    shasum "^1.0.0"
+    shell-quote "^1.6.1"
+    stream-browserify "^2.0.0"
+    stream-http "^2.0.0"
+    string_decoder "~1.0.0"
+    subarg "^1.0.0"
+    syntax-error "^1.1.1"
+    through2 "^2.0.0"
+    timers-browserify "^1.0.1"
+    tty-browserify "~0.0.0"
+    url "~0.11.0"
+    util "~0.10.1"
+    vm-browserify "~0.0.1"
+    xtend "^4.0.0"
+
+buble@^0.19.2, buble@^0.19.3:
+  version "0.19.3"
+  resolved "https://registry.yarnpkg.com/buble/-/buble-0.19.3.tgz#01e9412062cff1da6f20342b6ecd72e7bf699d02"
+  dependencies:
+    acorn "^5.4.1"
+    acorn-dynamic-import "^3.0.0"
+    acorn-jsx "^4.1.1"
+    chalk "^2.3.1"
+    magic-string "^0.22.4"
+    minimist "^1.2.0"
+    os-homedir "^1.0.1"
+    vlq "^1.0.0"
+
+buffer-crc32@^0.2.1:
+  version "0.2.13"
+  resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242"
+
+buffer-more-ints@0.0.2:
+  version "0.0.2"
+  resolved "https://registry.yarnpkg.com/buffer-more-ints/-/buffer-more-ints-0.0.2.tgz#26b3885d10fa13db7fc01aae3aab870199e0124c"
+
+buffer-xor@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9"
+
+buffer@^4.3.0:
+  version "4.9.1"
+  resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298"
+  dependencies:
+    base64-js "^1.0.2"
+    ieee754 "^1.1.4"
+    isarray "^1.0.0"
+
+buffer@^5.0.2:
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.1.0.tgz#c913e43678c7cb7c8bd16afbcddb6c5505e8f9fe"
+  dependencies:
+    base64-js "^1.0.2"
+    ieee754 "^1.1.4"
+
+buildmail@4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/buildmail/-/buildmail-4.0.1.tgz#877f7738b78729871c9a105e3b837d2be11a7a72"
+  dependencies:
+    addressparser "1.0.1"
+    libbase64 "0.1.0"
+    libmime "3.0.0"
+    libqp "1.1.0"
+    nodemailer-fetch "1.6.0"
+    nodemailer-shared "1.1.0"
+    punycode "1.4.1"
+
+builtin-modules@^1.0.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f"
+
+builtin-modules@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-2.0.0.tgz#60b7ef5ae6546bd7deefa74b08b62a43a232648e"
+
+builtin-status-codes@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
+
+bytes@3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048"
+
+cache-base@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2"
+  dependencies:
+    collection-visit "^1.0.0"
+    component-emitter "^1.2.1"
+    get-value "^2.0.6"
+    has-value "^1.0.0"
+    isobject "^3.0.1"
+    set-value "^2.0.0"
+    to-object-path "^0.3.0"
+    union-value "^1.0.0"
+    unset-value "^1.0.0"
+
+cached-path-relative@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/cached-path-relative/-/cached-path-relative-1.0.1.tgz#d09c4b52800aa4c078e2dd81a869aac90d2e54e7"
+
+cachedir@^1.1.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/cachedir/-/cachedir-1.2.0.tgz#e9a0a25bb21a2b7a0f766f07c41eb7a311919b97"
+  dependencies:
+    os-homedir "^1.0.1"
+
+caller-path@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f"
+  dependencies:
+    callsites "^0.2.0"
+
+callsite@1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20"
+
+callsites@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca"
+
+callsites@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50"
+
+camelcase-keys@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7"
+  dependencies:
+    camelcase "^2.0.0"
+    map-obj "^1.0.0"
+
+camelcase-keys@^4.0.0:
+  version "4.2.0"
+  resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-4.2.0.tgz#a2aa5fb1af688758259c32c141426d78923b9b77"
+  dependencies:
+    camelcase "^4.1.0"
+    map-obj "^2.0.0"
+    quick-lru "^1.0.0"
+
+camelcase@^1.0.2:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39"
+
+camelcase@^2.0.0:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f"
+
+camelcase@^4.1.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd"
+
+caseless@~0.11.0:
+  version "0.11.0"
+  resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7"
+
+caseless@~0.12.0:
+  version "0.12.0"
+  resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
+
+caseless@~0.6.0:
+  version "0.6.0"
+  resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.6.0.tgz#8167c1ab8397fb5bb95f96d28e5a81c50f247ac4"
+
+center-align@^0.1.1:
+  version "0.1.3"
+  resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad"
+  dependencies:
+    align-text "^0.1.3"
+    lazy-cache "^1.0.3"
+
+chai-nightwatch@~0.1.x:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/chai-nightwatch/-/chai-nightwatch-0.1.1.tgz#1ca56de768d3c0868fe7fc2f4d32c2fe894e6be9"
+  dependencies:
+    assertion-error "1.0.0"
+    deep-eql "0.1.3"
+
+chalk@1.1.3, chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
+  dependencies:
+    ansi-styles "^2.2.1"
+    escape-string-regexp "^1.0.2"
+    has-ansi "^2.0.0"
+    strip-ansi "^3.0.0"
+    supports-color "^2.0.0"
+
+chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.3.1:
+  version "2.3.2"
+  resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.2.tgz#250dc96b07491bfd601e648d66ddf5f60c7a5c65"
+  dependencies:
+    ansi-styles "^3.2.1"
+    escape-string-regexp "^1.0.5"
+    supports-color "^5.3.0"
+
+chardet@^0.4.0:
+  version "0.4.2"
+  resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2"
+
+chokidar@^1.4.1, chokidar@^1.7.0:
+  version "1.7.0"
+  resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468"
+  dependencies:
+    anymatch "^1.3.0"
+    async-each "^1.0.0"
+    glob-parent "^2.0.0"
+    inherits "^2.0.1"
+    is-binary-path "^1.0.0"
+    is-glob "^2.0.0"
+    path-is-absolute "^1.0.0"
+    readdirp "^2.0.0"
+  optionalDependencies:
+    fsevents "^1.0.0"
+
+chokidar@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.2.tgz#4dc65139eeb2714977735b6a35d06e97b494dfd7"
+  dependencies:
+    anymatch "^2.0.0"
+    async-each "^1.0.0"
+    braces "^2.3.0"
+    glob-parent "^3.1.0"
+    inherits "^2.0.1"
+    is-binary-path "^1.0.0"
+    is-glob "^4.0.0"
+    normalize-path "^2.1.1"
+    path-is-absolute "^1.0.0"
+    readdirp "^2.0.0"
+    upath "^1.0.0"
+  optionalDependencies:
+    fsevents "^1.0.0"
+
+chromedriver@^2.30.1:
+  version "2.36.0"
+  resolved "https://registry.yarnpkg.com/chromedriver/-/chromedriver-2.36.0.tgz#6a9473e11b50e7181ef8cd6476680e7f167374cd"
+  dependencies:
+    del "^3.0.0"
+    extract-zip "^1.6.5"
+    kew "^0.7.0"
+    mkdirp "^0.5.1"
+    request "^2.83.0"
+
+ci-info@^1.0.0:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.1.2.tgz#03561259db48d0474c8bdc90f5b47b068b6bbfb4"
+
+cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de"
+  dependencies:
+    inherits "^2.0.1"
+    safe-buffer "^5.0.1"
+
+circular-json@^0.3.1:
+  version "0.3.3"
+  resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66"
+
+circular-json@^0.5.1:
+  version "0.5.1"
+  resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.5.1.tgz#b8942a09e535863dc21b04417a91971e1d9cd91f"
+
+class-utils@^0.3.5:
+  version "0.3.6"
+  resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463"
+  dependencies:
+    arr-union "^3.1.0"
+    define-property "^0.2.5"
+    isobject "^3.0.0"
+    static-extend "^0.1.1"
+
+cli-cursor@^1.0.1, cli-cursor@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987"
+  dependencies:
+    restore-cursor "^1.0.1"
+
+cli-cursor@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5"
+  dependencies:
+    restore-cursor "^2.0.0"
+
+cli-spinners@^0.1.2:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-0.1.2.tgz#bb764d88e185fb9e1e6a2a1f19772318f605e31c"
+
+cli-truncate@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-0.2.1.tgz#9f15cfbb0705005369216c626ac7d05ab90dd574"
+  dependencies:
+    slice-ansi "0.0.4"
+    string-width "^1.0.1"
+
+cli-width@^2.0.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639"
+
+cliui@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1"
+  dependencies:
+    center-align "^0.1.1"
+    right-align "^0.1.1"
+    wordwrap "0.0.2"
+
+cliui@^3.2.0:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d"
+  dependencies:
+    string-width "^1.0.1"
+    strip-ansi "^3.0.1"
+    wrap-ansi "^2.0.0"
+
+co@^4.6.0:
+  version "4.6.0"
+  resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
+
+co@~3.0.6:
+  version "3.0.6"
+  resolved "https://registry.yarnpkg.com/co/-/co-3.0.6.tgz#1445f226c5eb956138e68c9ac30167ea7d2e6bda"
+
+code-point-at@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
+
+codecov.io@^0.1.6:
+  version "0.1.6"
+  resolved "https://registry.yarnpkg.com/codecov.io/-/codecov.io-0.1.6.tgz#59dfd02da1ff31c2fb2b952ad8ad16fd3781b728"
+  dependencies:
+    request "2.42.0"
+    urlgrey "0.4.0"
+
+collection-visit@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0"
+  dependencies:
+    map-visit "^1.0.0"
+    object-visit "^1.0.0"
+
+color-convert@^1.9.0:
+  version "1.9.1"
+  resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.1.tgz#c1261107aeb2f294ebffec9ed9ecad529a6097ed"
+  dependencies:
+    color-name "^1.1.1"
+
+color-name@^1.1.1:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
+
+colors@1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b"
+
+colors@^1.1.0:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63"
+
+combine-lists@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/combine-lists/-/combine-lists-1.0.1.tgz#458c07e09e0d900fc28b70a3fec2dacd1d2cb7f6"
+  dependencies:
+    lodash "^4.5.0"
+
+combine-source-map@~0.7.1:
+  version "0.7.2"
+  resolved "https://registry.yarnpkg.com/combine-source-map/-/combine-source-map-0.7.2.tgz#0870312856b307a87cc4ac486f3a9a62aeccc09e"
+  dependencies:
+    convert-source-map "~1.1.0"
+    inline-source-map "~0.6.0"
+    lodash.memoize "~3.0.3"
+    source-map "~0.5.3"
+
+combine-source-map@~0.8.0:
+  version "0.8.0"
+  resolved "https://registry.yarnpkg.com/combine-source-map/-/combine-source-map-0.8.0.tgz#a58d0df042c186fcf822a8e8015f5450d2d79a8b"
+  dependencies:
+    convert-source-map "~1.1.0"
+    inline-source-map "~0.6.0"
+    lodash.memoize "~3.0.3"
+    source-map "~0.5.3"
+
+combined-stream@1.0.6, combined-stream@^1.0.5, combined-stream@~1.0.5:
+  version "1.0.6"
+  resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818"
+  dependencies:
+    delayed-stream "~1.0.0"
+
+combined-stream@~0.0.4:
+  version "0.0.7"
+  resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-0.0.7.tgz#0137e657baa5a7541c57ac37ac5fc07d73b4dc1f"
+  dependencies:
+    delayed-stream "0.0.5"
+
+commander@2.9.0:
+  version "2.9.0"
+  resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4"
+  dependencies:
+    graceful-readlink ">= 1.0.0"
+
+commander@^2.14.1, commander@^2.9.0, commander@~2.14.1:
+  version "2.14.1"
+  resolved "https://registry.yarnpkg.com/commander/-/commander-2.14.1.tgz#2235123e37af8ca3c65df45b026dbd357b01b9aa"
+
+commitizen@^2.9.6:
+  version "2.9.6"
+  resolved "https://registry.yarnpkg.com/commitizen/-/commitizen-2.9.6.tgz#c0d00535ef264da7f63737edfda4228983fa2291"
+  dependencies:
+    cachedir "^1.1.0"
+    chalk "1.1.3"
+    cz-conventional-changelog "1.2.0"
+    dedent "0.6.0"
+    detect-indent "4.0.0"
+    find-node-modules "1.0.4"
+    find-root "1.0.0"
+    fs-extra "^1.0.0"
+    glob "7.1.1"
+    inquirer "1.2.3"
+    lodash "4.17.2"
+    minimist "1.2.0"
+    path-exists "2.1.0"
+    shelljs "0.7.6"
+    strip-json-comments "2.0.1"
+
+commondir@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
+
+compare-func@^1.3.1:
+  version "1.3.2"
+  resolved "https://registry.yarnpkg.com/compare-func/-/compare-func-1.3.2.tgz#99dd0ba457e1f9bc722b12c08ec33eeab31fa648"
+  dependencies:
+    array-ify "^1.0.0"
+    dot-prop "^3.0.0"
+
+component-bind@1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1"
+
+component-emitter@1.2.1, component-emitter@^1.2.1:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6"
+
+component-inherit@0.0.3:
+  version "0.0.3"
+  resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143"
+
+compress-commons@^1.2.0:
+  version "1.2.2"
+  resolved "https://registry.yarnpkg.com/compress-commons/-/compress-commons-1.2.2.tgz#524a9f10903f3a813389b0225d27c48bb751890f"
+  dependencies:
+    buffer-crc32 "^0.2.1"
+    crc32-stream "^2.0.0"
+    normalize-path "^2.0.0"
+    readable-stream "^2.0.0"
+
+concat-map@0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+
+concat-stream@1.6.0:
+  version "1.6.0"
+  resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7"
+  dependencies:
+    inherits "^2.0.3"
+    readable-stream "^2.2.2"
+    typedarray "^0.0.6"
+
+concat-stream@^1.4.7, concat-stream@^1.6.0:
+  version "1.6.1"
+  resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.1.tgz#261b8f518301f1d834e36342b9fea095d2620a26"
+  dependencies:
+    inherits "^2.0.3"
+    readable-stream "^2.2.2"
+    typedarray "^0.0.6"
+
+concat-stream@~1.5.0, concat-stream@~1.5.1:
+  version "1.5.2"
+  resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.5.2.tgz#708978624d856af41a5a741defdd261da752c266"
+  dependencies:
+    inherits "~2.0.1"
+    readable-stream "~2.0.0"
+    typedarray "~0.0.5"
+
+connect@^3.6.0:
+  version "3.6.6"
+  resolved "https://registry.yarnpkg.com/connect/-/connect-3.6.6.tgz#09eff6c55af7236e137135a72574858b6786f524"
+  dependencies:
+    debug "2.6.9"
+    finalhandler "1.1.0"
+    parseurl "~1.3.2"
+    utils-merge "1.0.1"
+
+console-browserify@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10"
+  dependencies:
+    date-now "^0.1.4"
+
+console-control-strings@^1.0.0, console-control-strings@~1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
+
+constants-browserify@^1.0.0, constants-browserify@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75"
+
+content-type-parser@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/content-type-parser/-/content-type-parser-1.0.2.tgz#caabe80623e63638b2502fd4c7f12ff4ce2352e7"
+
+content-type@~1.0.4:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
+
+conventional-changelog-angular@^1.6.6:
+  version "1.6.6"
+  resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-1.6.6.tgz#b27f2b315c16d0a1f23eb181309d0e6a4698ea0f"
+  dependencies:
+    compare-func "^1.3.1"
+    q "^1.5.1"
+
+conventional-changelog-atom@^0.2.4:
+  version "0.2.4"
+  resolved "https://registry.yarnpkg.com/conventional-changelog-atom/-/conventional-changelog-atom-0.2.4.tgz#4917759947f4db86073f9d3838a2d54302d5843d"
+  dependencies:
+    q "^1.5.1"
+
+conventional-changelog-codemirror@^0.3.4:
+  version "0.3.4"
+  resolved "https://registry.yarnpkg.com/conventional-changelog-codemirror/-/conventional-changelog-codemirror-0.3.4.tgz#debc43991d487d7964e65087fbbe034044bd51fb"
+  dependencies:
+    q "^1.5.1"
+
+conventional-changelog-core@^2.0.5:
+  version "2.0.5"
+  resolved "https://registry.yarnpkg.com/conventional-changelog-core/-/conventional-changelog-core-2.0.5.tgz#45b6347c4c6512e1f163f7ff55c9f5bcb88fd990"
+  dependencies:
+    conventional-changelog-writer "^3.0.4"
+    conventional-commits-parser "^2.1.5"
+    dateformat "^3.0.0"
+    get-pkg-repo "^1.0.0"
+    git-raw-commits "^1.3.4"
+    git-remote-origin-url "^2.0.0"
+    git-semver-tags "^1.3.4"
+    lodash "^4.2.1"
+    normalize-package-data "^2.3.5"
+    q "^1.5.1"
+    read-pkg "^1.1.0"
+    read-pkg-up "^1.0.1"
+    through2 "^2.0.0"
+
+conventional-changelog-ember@^0.3.6:
+  version "0.3.6"
+  resolved "https://registry.yarnpkg.com/conventional-changelog-ember/-/conventional-changelog-ember-0.3.6.tgz#f3825d7434168f3d9211b5532dc1d5769532b668"
+  dependencies:
+    q "^1.5.1"
+
+conventional-changelog-eslint@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/conventional-changelog-eslint/-/conventional-changelog-eslint-1.0.5.tgz#8bae05ebbf574e6506caf7b37dc51ca21b74d220"
+  dependencies:
+    q "^1.5.1"
+
+conventional-changelog-express@^0.3.4:
+  version "0.3.4"
+  resolved "https://registry.yarnpkg.com/conventional-changelog-express/-/conventional-changelog-express-0.3.4.tgz#812a9cf778677e12f978ac9c40d85297c0bfcca9"
+  dependencies:
+    q "^1.5.1"
+
+conventional-changelog-jquery@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/conventional-changelog-jquery/-/conventional-changelog-jquery-0.1.0.tgz#0208397162e3846986e71273b6c79c5b5f80f510"
+  dependencies:
+    q "^1.4.1"
+
+conventional-changelog-jscs@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/conventional-changelog-jscs/-/conventional-changelog-jscs-0.1.0.tgz#0479eb443cc7d72c58bf0bcf0ef1d444a92f0e5c"
+  dependencies:
+    q "^1.4.1"
+
+conventional-changelog-jshint@^0.3.4:
+  version "0.3.4"
+  resolved "https://registry.yarnpkg.com/conventional-changelog-jshint/-/conventional-changelog-jshint-0.3.4.tgz#b2de33cd0870d9af804ac6a4fded0ee25b69c9bb"
+  dependencies:
+    compare-func "^1.3.1"
+    q "^1.5.1"
+
+conventional-changelog-preset-loader@^1.1.6:
+  version "1.1.6"
+  resolved "https://registry.yarnpkg.com/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-1.1.6.tgz#b29af6332f9313857be36427623c9016bfeeaf33"
+
+conventional-changelog-writer@^3.0.4:
+  version "3.0.4"
+  resolved "https://registry.yarnpkg.com/conventional-changelog-writer/-/conventional-changelog-writer-3.0.4.tgz#705b46a8b8277bd7fd79cad8032095b5d803864c"
+  dependencies:
+    compare-func "^1.3.1"
+    conventional-commits-filter "^1.1.5"
+    dateformat "^3.0.0"
+    handlebars "^4.0.2"
+    json-stringify-safe "^5.0.1"
+    lodash "^4.2.1"
+    meow "^4.0.0"
+    semver "^5.5.0"
+    split "^1.0.0"
+    through2 "^2.0.0"
+
+conventional-changelog@^1.1.3:
+  version "1.1.18"
+  resolved "https://registry.yarnpkg.com/conventional-changelog/-/conventional-changelog-1.1.18.tgz#ffe28798e4ddef5f6e2f74398e8248bcb233360b"
+  dependencies:
+    conventional-changelog-angular "^1.6.6"
+    conventional-changelog-atom "^0.2.4"
+    conventional-changelog-codemirror "^0.3.4"
+    conventional-changelog-core "^2.0.5"
+    conventional-changelog-ember "^0.3.6"
+    conventional-changelog-eslint "^1.0.5"
+    conventional-changelog-express "^0.3.4"
+    conventional-changelog-jquery "^0.1.0"
+    conventional-changelog-jscs "^0.1.0"
+    conventional-changelog-jshint "^0.3.4"
+    conventional-changelog-preset-loader "^1.1.6"
+
+conventional-commit-types@^2.0.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/conventional-commit-types/-/conventional-commit-types-2.2.0.tgz#5db95739d6c212acbe7b6f656a11b940baa68946"
+
+conventional-commits-filter@^1.1.5:
+  version "1.1.5"
+  resolved "https://registry.yarnpkg.com/conventional-commits-filter/-/conventional-commits-filter-1.1.5.tgz#77aac065e3de9c1a74b801e8e25c9affb3184f65"
+  dependencies:
+    is-subset "^0.1.1"
+    modify-values "^1.0.0"
+
+conventional-commits-parser@^2.1.5:
+  version "2.1.5"
+  resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-2.1.5.tgz#9ac3a4ab221c0c3c9e9dd2c09ae01e6d1e1dabe0"
+  dependencies:
+    JSONStream "^1.0.4"
+    is-text-path "^1.0.0"
+    lodash "^4.2.1"
+    meow "^4.0.0"
+    split2 "^2.0.0"
+    through2 "^2.0.0"
+    trim-off-newlines "^1.0.0"
+
+convert-source-map@^1.5.0:
+  version "1.5.1"
+  resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5"
+
+convert-source-map@~1.1.0:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.1.3.tgz#4829c877e9fe49b3161f3bf3673888e204699860"
+
+cookie@0.3.1:
+  version "0.3.1"
+  resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb"
+
+copy-descriptor@^0.1.0:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
+
+core-js@^2.2.0, core-js@^2.4.0, core-js@^2.5.0:
+  version "2.5.3"
+  resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.3.tgz#8acc38345824f16d8365b7c9b4259168e8ed603e"
+
+core-util-is@1.0.2, core-util-is@~1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
+
+corser@~2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/corser/-/corser-2.0.1.tgz#8eda252ecaab5840dcd975ceb90d9370c819ff87"
+
+cosmiconfig@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-4.0.0.tgz#760391549580bbd2df1e562bc177b13c290972dc"
+  dependencies:
+    is-directory "^0.3.1"
+    js-yaml "^3.9.0"
+    parse-json "^4.0.0"
+    require-from-string "^2.0.1"
+
+crc32-stream@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/crc32-stream/-/crc32-stream-2.0.0.tgz#e3cdd3b4df3168dd74e3de3fbbcb7b297fe908f4"
+  dependencies:
+    crc "^3.4.4"
+    readable-stream "^2.0.0"
+
+crc@^3.4.4:
+  version "3.5.0"
+  resolved "https://registry.yarnpkg.com/crc/-/crc-3.5.0.tgz#98b8ba7d489665ba3979f59b21381374101a1964"
+
+create-ecdh@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.0.tgz#888c723596cdf7612f6498233eebd7a35301737d"
+  dependencies:
+    bn.js "^4.1.0"
+    elliptic "^6.0.0"
+
+create-hash@^1.1.0, create-hash@^1.1.2:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.1.3.tgz#606042ac8b9262750f483caddab0f5819172d8fd"
+  dependencies:
+    cipher-base "^1.0.1"
+    inherits "^2.0.1"
+    ripemd160 "^2.0.0"
+    sha.js "^2.4.0"
+
+create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4:
+  version "1.1.6"
+  resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.6.tgz#acb9e221a4e17bdb076e90657c42b93e3726cf06"
+  dependencies:
+    cipher-base "^1.0.3"
+    create-hash "^1.1.0"
+    inherits "^2.0.1"
+    ripemd160 "^2.0.0"
+    safe-buffer "^5.0.1"
+    sha.js "^2.4.8"
+
+cross-spawn@^5.0.1, cross-spawn@^5.1.0:
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449"
+  dependencies:
+    lru-cache "^4.0.1"
+    shebang-command "^1.2.0"
+    which "^1.2.9"
+
+cryptiles@0.2.x:
+  version "0.2.2"
+  resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-0.2.2.tgz#ed91ff1f17ad13d3748288594f8a48a0d26f325c"
+  dependencies:
+    boom "0.4.x"
+
+cryptiles@2.x.x:
+  version "2.0.5"
+  resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8"
+  dependencies:
+    boom "2.x.x"
+
+cryptiles@3.x.x:
+  version "3.1.2"
+  resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-3.1.2.tgz#a89fbb220f5ce25ec56e8c4aa8a4fd7b5b0d29fe"
+  dependencies:
+    boom "5.x.x"
+
+crypto-browserify@^3.0.0, crypto-browserify@^3.11.0:
+  version "3.12.0"
+  resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec"
+  dependencies:
+    browserify-cipher "^1.0.0"
+    browserify-sign "^4.0.0"
+    create-ecdh "^4.0.0"
+    create-hash "^1.1.0"
+    create-hmac "^1.1.0"
+    diffie-hellman "^5.0.0"
+    inherits "^2.0.1"
+    pbkdf2 "^3.0.3"
+    public-encrypt "^4.0.0"
+    randombytes "^2.0.0"
+    randomfill "^1.0.3"
+
+css@~2.2.1:
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/css/-/css-2.2.1.tgz#73a4c81de85db664d4ee674f7d47085e3b2d55dc"
+  dependencies:
+    inherits "^2.0.1"
+    source-map "^0.1.38"
+    source-map-resolve "^0.3.0"
+    urix "^0.1.0"
+
+cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0":
+  version "0.3.2"
+  resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.2.tgz#b8036170c79f07a90ff2f16e22284027a243848b"
+
+"cssstyle@>= 0.2.37 < 0.3.0":
+  version "0.2.37"
+  resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.2.37.tgz#541097234cb2513c83ceed3acddc27ff27987d54"
+  dependencies:
+    cssom "0.3.x"
+
+ctype@0.5.3:
+  version "0.5.3"
+  resolved "https://registry.yarnpkg.com/ctype/-/ctype-0.5.3.tgz#82c18c2461f74114ef16c135224ad0b9144ca12f"
+
+currently-unhandled@^0.4.1:
+  version "0.4.1"
+  resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea"
+  dependencies:
+    array-find-index "^1.0.1"
+
+custom-event@~1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/custom-event/-/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5bfd0425"
+
+cz-conventional-changelog@1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/cz-conventional-changelog/-/cz-conventional-changelog-1.2.0.tgz#2bca04964c8919b23f3fd6a89ef5e6008b31b3f8"
+  dependencies:
+    conventional-commit-types "^2.0.0"
+    lodash.map "^4.5.1"
+    longest "^1.0.1"
+    pad-right "^0.2.2"
+    right-pad "^1.0.1"
+    word-wrap "^1.0.3"
+
+cz-conventional-changelog@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/cz-conventional-changelog/-/cz-conventional-changelog-2.1.0.tgz#2f4bc7390e3244e4df293e6ba351e4c740a7c764"
+  dependencies:
+    conventional-commit-types "^2.0.0"
+    lodash.map "^4.5.1"
+    longest "^1.0.1"
+    right-pad "^1.0.1"
+    word-wrap "^1.0.3"
+
+d@1:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f"
+  dependencies:
+    es5-ext "^0.10.9"
+
+dargs@^4.0.1:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/dargs/-/dargs-4.1.0.tgz#03a9dbb4b5c2f139bf14ae53f0b8a2a6a86f4e17"
+  dependencies:
+    number-is-nan "^1.0.0"
+
+dashdash@^1.12.0:
+  version "1.14.1"
+  resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
+  dependencies:
+    assert-plus "^1.0.0"
+
+data-uri-to-buffer@1:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-1.2.0.tgz#77163ea9c20d8641b4707e8f18abdf9a78f34835"
+
+date-fns@^1.27.2:
+  version "1.29.0"
+  resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.29.0.tgz#12e609cdcb935127311d04d33334e2960a2a54e6"
+
+date-format@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/date-format/-/date-format-1.2.0.tgz#615e828e233dd1ab9bb9ae0950e0ceccfa6ecad8"
+
+date-now@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b"
+
+dateformat@^1.0.6:
+  version "1.0.12"
+  resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-1.0.12.tgz#9f124b67594c937ff706932e4a642cca8dbbfee9"
+  dependencies:
+    get-stdin "^4.0.1"
+    meow "^3.3.0"
+
+dateformat@^3.0.0:
+  version "3.0.3"
+  resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae"
+
+de-indent@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d"
+
+debug@2, debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@~2.6.4, debug@~2.6.6:
+  version "2.6.9"
+  resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
+  dependencies:
+    ms "2.0.0"
+
+debug@2.2.0, debug@~2.2.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da"
+  dependencies:
+    ms "0.7.1"
+
+debug@^3.0.1, debug@^3.1.0, debug@~3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
+  dependencies:
+    ms "2.0.0"
+
+decamelize-keys@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9"
+  dependencies:
+    decamelize "^1.1.0"
+    map-obj "^1.0.0"
+
+decamelize@^1.0.0, decamelize@^1.1.0, decamelize@^1.1.1, decamelize@^1.1.2:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
+
+decode-uri-component@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
+
+dedent@0.6.0:
+  version "0.6.0"
+  resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.6.0.tgz#0e6da8f0ce52838ef5cec5c8f9396b0c1b64a3cb"
+
+dedent@^0.7.0:
+  version "0.7.0"
+  resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c"
+
+deep-eql@0.1.3:
+  version "0.1.3"
+  resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-0.1.3.tgz#ef558acab8de25206cd713906d74e56930eb69f2"
+  dependencies:
+    type-detect "0.1.1"
+
+deep-equal@~0.1.0:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-0.1.2.tgz#b246c2b80a570a47c11be1d9bd1070ec878b87ce"
+
+deep-extend@~0.4.0:
+  version "0.4.2"
+  resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f"
+
+deep-is@~0.1.3:
+  version "0.1.3"
+  resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
+
+define-property@^0.2.5:
+  version "0.2.5"
+  resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116"
+  dependencies:
+    is-descriptor "^0.1.0"
+
+define-property@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6"
+  dependencies:
+    is-descriptor "^1.0.0"
+
+define-property@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d"
+  dependencies:
+    is-descriptor "^1.0.2"
+    isobject "^3.0.1"
+
+defined@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693"
+
+defined@~0.0.0:
+  version "0.0.0"
+  resolved "https://registry.yarnpkg.com/defined/-/defined-0.0.0.tgz#f35eea7d705e933baf13b2f03b3f83d921403b3e"
+
+degenerator@~1.0.2:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/degenerator/-/degenerator-1.0.4.tgz#fcf490a37ece266464d9cc431ab98c5819ced095"
+  dependencies:
+    ast-types "0.x.x"
+    escodegen "1.x.x"
+    esprima "3.x.x"
+
+del@^2.0.2:
+  version "2.2.2"
+  resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8"
+  dependencies:
+    globby "^5.0.0"
+    is-path-cwd "^1.0.0"
+    is-path-in-cwd "^1.0.0"
+    object-assign "^4.0.1"
+    pify "^2.0.0"
+    pinkie-promise "^2.0.0"
+    rimraf "^2.2.8"
+
+del@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/del/-/del-3.0.0.tgz#53ecf699ffcbcb39637691ab13baf160819766e5"
+  dependencies:
+    globby "^6.1.0"
+    is-path-cwd "^1.0.0"
+    is-path-in-cwd "^1.0.0"
+    p-map "^1.1.1"
+    pify "^3.0.0"
+    rimraf "^2.2.8"
+
+delayed-stream@0.0.5:
+  version "0.0.5"
+  resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-0.0.5.tgz#d4b1f43a93e8296dfe02694f4680bc37a313c73f"
+
+delayed-stream@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
+
+delegates@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
+
+depd@1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359"
+
+depd@~1.1.1:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
+
+deps-sort@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/deps-sort/-/deps-sort-2.0.0.tgz#091724902e84658260eb910748cccd1af6e21fb5"
+  dependencies:
+    JSONStream "^1.0.3"
+    shasum "^1.0.0"
+    subarg "^1.0.0"
+    through2 "^2.0.0"
+
+des.js@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc"
+  dependencies:
+    inherits "^2.0.1"
+    minimalistic-assert "^1.0.0"
+
+detect-file@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-0.1.0.tgz#4935dedfd9488648e006b0129566e9386711ea63"
+  dependencies:
+    fs-exists-sync "^0.1.0"
+
+detect-indent@4.0.0, detect-indent@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208"
+  dependencies:
+    repeating "^2.0.0"
+
+detect-libc@^1.0.2:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
+
+detective@^4.0.0:
+  version "4.7.1"
+  resolved "https://registry.yarnpkg.com/detective/-/detective-4.7.1.tgz#0eca7314338442febb6d65da54c10bb1c82b246e"
+  dependencies:
+    acorn "^5.2.1"
+    defined "^1.0.0"
+
+di@^0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c"
+
+diff@1.4.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/diff/-/diff-1.4.0.tgz#7f28d2eb9ee7b15a97efd89ce63dcfdaa3ccbabf"
+
+diff@^3.2.0:
+  version "3.5.0"
+  resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12"
+
+diffie-hellman@^5.0.0:
+  version "5.0.2"
+  resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.2.tgz#b5835739270cfe26acf632099fded2a07f209e5e"
+  dependencies:
+    bn.js "^4.1.0"
+    miller-rabin "^4.0.0"
+    randombytes "^2.0.0"
+
+doctrine@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d"
+  dependencies:
+    esutils "^2.0.2"
+
+dom-serialize@^2.2.0:
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/dom-serialize/-/dom-serialize-2.2.1.tgz#562ae8999f44be5ea3076f5419dcd59eb43ac95b"
+  dependencies:
+    custom-event "~1.0.0"
+    ent "~2.2.0"
+    extend "^3.0.0"
+    void-elements "^2.0.0"
+
+dom-serializer@0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82"
+  dependencies:
+    domelementtype "~1.1.1"
+    entities "~1.1.1"
+
+domain-browser@^1.1.1:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda"
+
+domain-browser@~1.1.0:
+  version "1.1.7"
+  resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b21fdf8698bc"
+
+domelementtype@1, domelementtype@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.0.tgz#b17aed82e8ab59e52dd9c19b1756e0fc187204c2"
+
+domelementtype@~1.1.1:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b"
+
+domexception@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90"
+  dependencies:
+    webidl-conversions "^4.0.2"
+
+domhandler@^2.3.0:
+  version "2.4.1"
+  resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.1.tgz#892e47000a99be55bbf3774ffea0561d8879c259"
+  dependencies:
+    domelementtype "1"
+
+domutils@^1.5.1:
+  version "1.7.0"
+  resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a"
+  dependencies:
+    dom-serializer "0"
+    domelementtype "1"
+
+dot-prop@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-3.0.0.tgz#1b708af094a49c9a0e7dbcad790aba539dac1177"
+  dependencies:
+    is-obj "^1.0.0"
+
+double-ended-queue@^2.1.0-0:
+  version "2.1.0-0"
+  resolved "https://registry.yarnpkg.com/double-ended-queue/-/double-ended-queue-2.1.0-0.tgz#103d3527fd31528f40188130c841efdd78264e5c"
+
+duplexer2@^0.1.2, duplexer2@~0.1.0, duplexer2@~0.1.2:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1"
+  dependencies:
+    readable-stream "^2.0.2"
+
+duplexer@~0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1"
+
+ecc-jsbn@~0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505"
+  dependencies:
+    jsbn "~0.1.0"
+
+ecstatic@^3.0.0:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/ecstatic/-/ecstatic-3.2.0.tgz#1b1aee1ca7c6b99cfb5cf6c9b26b481b90c4409f"
+  dependencies:
+    he "^1.1.1"
+    mime "^1.4.1"
+    minimist "^1.1.0"
+    url-join "^2.0.2"
+
+ee-first@1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
+
+ejs@2.5.7:
+  version "2.5.7"
+  resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.5.7.tgz#cc872c168880ae3c7189762fd5ffc00896c9518a"
+
+elegant-spinner@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e"
+
+elliptic@^6.0.0:
+  version "6.4.0"
+  resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df"
+  dependencies:
+    bn.js "^4.4.0"
+    brorand "^1.0.1"
+    hash.js "^1.0.0"
+    hmac-drbg "^1.0.0"
+    inherits "^2.0.1"
+    minimalistic-assert "^1.0.0"
+    minimalistic-crypto-utils "^1.0.0"
+
+emojis-list@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389"
+
+encodeurl@~1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
+
+end-of-stream@^1.0.0:
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43"
+  dependencies:
+    once "^1.4.0"
+
+engine.io-client@~3.1.0:
+  version "3.1.5"
+  resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.1.5.tgz#85de17666560327ef1817978f6e3f8101ded2c47"
+  dependencies:
+    component-emitter "1.2.1"
+    component-inherit "0.0.3"
+    debug "~3.1.0"
+    engine.io-parser "~2.1.1"
+    has-cors "1.1.0"
+    indexof "0.0.1"
+    parseqs "0.0.5"
+    parseuri "0.0.5"
+    ws "~3.3.1"
+    xmlhttprequest-ssl "~1.5.4"
+    yeast "0.1.2"
+
+engine.io-parser@~2.1.0, engine.io-parser@~2.1.1:
+  version "2.1.2"
+  resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-2.1.2.tgz#4c0f4cff79aaeecbbdcfdea66a823c6085409196"
+  dependencies:
+    after "0.8.2"
+    arraybuffer.slice "~0.0.7"
+    base64-arraybuffer "0.1.5"
+    blob "0.0.4"
+    has-binary2 "~1.0.2"
+
+engine.io@~3.1.0:
+  version "3.1.5"
+  resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-3.1.5.tgz#0e7ef9d690eb0b35597f1d4ad02a26ca2dba3845"
+  dependencies:
+    accepts "~1.3.4"
+    base64id "1.0.0"
+    cookie "0.3.1"
+    debug "~3.1.0"
+    engine.io-parser "~2.1.0"
+    ws "~3.3.1"
+  optionalDependencies:
+    uws "~9.14.0"
+
+enhanced-resolve@^3.4.0:
+  version "3.4.1"
+  resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz#0421e339fd71419b3da13d129b3979040230476e"
+  dependencies:
+    graceful-fs "^4.1.2"
+    memory-fs "^0.4.0"
+    object-assign "^4.0.1"
+    tapable "^0.2.7"
+
+ent@~2.2.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d"
+
+entities@^1.1.1, entities@~1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0"
+
+errno@^0.1.3:
+  version "0.1.7"
+  resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618"
+  dependencies:
+    prr "~1.0.1"
+
+error-ex@^1.2.0, error-ex@^1.3.1:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc"
+  dependencies:
+    is-arrayish "^0.2.1"
+
+es5-ext@^0.10.14, es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14:
+  version "0.10.39"
+  resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.39.tgz#fca21b67559277ca4ac1a1ed7048b107b6f76d87"
+  dependencies:
+    es6-iterator "~2.0.3"
+    es6-symbol "~3.1.1"
+
+es6-iterator@^2.0.1, es6-iterator@~2.0.1, es6-iterator@~2.0.3:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7"
+  dependencies:
+    d "1"
+    es5-ext "^0.10.35"
+    es6-symbol "^3.1.1"
+
+es6-map@^0.1.3:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0"
+  dependencies:
+    d "1"
+    es5-ext "~0.10.14"
+    es6-iterator "~2.0.1"
+    es6-set "~0.1.5"
+    es6-symbol "~3.1.1"
+    event-emitter "~0.3.5"
+
+es6-promise@^4.0.3, es6-promise@^4.1.0:
+  version "4.2.4"
+  resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.4.tgz#dc4221c2b16518760bd8c39a52d8f356fc00ed29"
+
+es6-set@~0.1.5:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1"
+  dependencies:
+    d "1"
+    es5-ext "~0.10.14"
+    es6-iterator "~2.0.1"
+    es6-symbol "3.1.1"
+    event-emitter "~0.3.5"
+
+es6-symbol@3.1.1, es6-symbol@^3.1.1, es6-symbol@~3.1.1:
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77"
+  dependencies:
+    d "1"
+    es5-ext "~0.10.14"
+
+es6-weak-map@^2.0.1:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f"
+  dependencies:
+    d "1"
+    es5-ext "^0.10.14"
+    es6-iterator "^2.0.1"
+    es6-symbol "^3.1.1"
+
+escape-html@~1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
+
+escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+
+escodegen@1.8.x:
+  version "1.8.1"
+  resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018"
+  dependencies:
+    esprima "^2.7.1"
+    estraverse "^1.9.1"
+    esutils "^2.0.2"
+    optionator "^0.8.1"
+  optionalDependencies:
+    source-map "~0.2.0"
+
+escodegen@1.x.x, escodegen@^1.8.1, escodegen@^1.9.0:
+  version "1.9.1"
+  resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.9.1.tgz#dbae17ef96c8e4bedb1356f4504fa4cc2f7cb7e2"
+  dependencies:
+    esprima "^3.1.3"
+    estraverse "^4.2.0"
+    esutils "^2.0.2"
+    optionator "^0.8.1"
+  optionalDependencies:
+    source-map "~0.6.1"
+
+escope@^3.6.0:
+  version "3.6.0"
+  resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3"
+  dependencies:
+    es6-map "^0.1.3"
+    es6-weak-map "^2.0.1"
+    esrecurse "^4.1.0"
+    estraverse "^4.1.1"
+
+eslint-loader@^1.7.1:
+  version "1.9.0"
+  resolved "https://registry.yarnpkg.com/eslint-loader/-/eslint-loader-1.9.0.tgz#7e1be9feddca328d3dcfaef1ad49d5beffe83a13"
+  dependencies:
+    loader-fs-cache "^1.0.0"
+    loader-utils "^1.0.2"
+    object-assign "^4.0.1"
+    object-hash "^1.1.4"
+    rimraf "^2.6.1"
+
+eslint-plugin-flowtype@^2.34.0:
+  version "2.46.1"
+  resolved "https://registry.yarnpkg.com/eslint-plugin-flowtype/-/eslint-plugin-flowtype-2.46.1.tgz#c4f81d580cd89c82bc3a85a1ccf4ae3a915143a4"
+  dependencies:
+    lodash "^4.15.0"
+
+eslint-plugin-html@^4.0.1:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/eslint-plugin-html/-/eslint-plugin-html-4.0.2.tgz#0e56149e42c2ffc3f0df6261a8bb96b1a9f2280d"
+  dependencies:
+    htmlparser2 "^3.8.2"
+
+eslint-plugin-jasmine@^2.8.4:
+  version "2.9.3"
+  resolved "https://registry.yarnpkg.com/eslint-plugin-jasmine/-/eslint-plugin-jasmine-2.9.3.tgz#05bf3ab827d791691ceee8c21959b9c0d56a6b0c"
+
+eslint-plugin-vue-libs@^2.0.1:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/eslint-plugin-vue-libs/-/eslint-plugin-vue-libs-2.1.0.tgz#e7faf4ae11dad58553f63f907d6642e2d816dcef"
+  dependencies:
+    eslint-plugin-html "^4.0.1"
+
+eslint-scope@^3.7.1, eslint-scope@~3.7.1:
+  version "3.7.1"
+  resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8"
+  dependencies:
+    esrecurse "^4.1.0"
+    estraverse "^4.1.1"
+
+eslint-visitor-keys@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d"
+
+eslint@^4.13.1:
+  version "4.18.2"
+  resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.18.2.tgz#0f81267ad1012e7d2051e186a9004cc2267b8d45"
+  dependencies:
+    ajv "^5.3.0"
+    babel-code-frame "^6.22.0"
+    chalk "^2.1.0"
+    concat-stream "^1.6.0"
+    cross-spawn "^5.1.0"
+    debug "^3.1.0"
+    doctrine "^2.1.0"
+    eslint-scope "^3.7.1"
+    eslint-visitor-keys "^1.0.0"
+    espree "^3.5.2"
+    esquery "^1.0.0"
+    esutils "^2.0.2"
+    file-entry-cache "^2.0.0"
+    functional-red-black-tree "^1.0.1"
+    glob "^7.1.2"
+    globals "^11.0.1"
+    ignore "^3.3.3"
+    imurmurhash "^0.1.4"
+    inquirer "^3.0.6"
+    is-resolvable "^1.0.0"
+    js-yaml "^3.9.1"
+    json-stable-stringify-without-jsonify "^1.0.1"
+    levn "^0.3.0"
+    lodash "^4.17.4"
+    minimatch "^3.0.2"
+    mkdirp "^0.5.1"
+    natural-compare "^1.4.0"
+    optionator "^0.8.2"
+    path-is-inside "^1.0.2"
+    pluralize "^7.0.0"
+    progress "^2.0.0"
+    require-uncached "^1.0.3"
+    semver "^5.3.0"
+    strip-ansi "^4.0.0"
+    strip-json-comments "~2.0.1"
+    table "4.0.2"
+    text-table "~0.2.0"
+
+espree@^3.5.2:
+  version "3.5.4"
+  resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7"
+  dependencies:
+    acorn "^5.5.0"
+    acorn-jsx "^3.0.0"
+
+esprima@2.7.x, esprima@^2.7.1:
+  version "2.7.3"
+  resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581"
+
+esprima@3.x.x, esprima@^3.1.3:
+  version "3.1.3"
+  resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633"
+
+esprima@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804"
+
+esquery@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.0.tgz#cfba8b57d7fba93f17298a8a006a04cda13d80fa"
+  dependencies:
+    estraverse "^4.0.0"
+
+esrecurse@^4.1.0:
+  version "4.2.1"
+  resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf"
+  dependencies:
+    estraverse "^4.1.0"
+
+estraverse@^1.9.1:
+  version "1.9.3"
+  resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44"
+
+estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0:
+  version "4.2.0"
+  resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13"
+
+estree-walker@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.2.1.tgz#bdafe8095383d8414d5dc2ecf4c9173b6db9412e"
+
+estree-walker@^0.3.0:
+  version "0.3.1"
+  resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.3.1.tgz#e6b1a51cf7292524e7237c312e5fe6660c1ce1aa"
+
+estree-walker@^0.5.0:
+  version "0.5.1"
+  resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.5.1.tgz#64fc375053abc6f57d73e9bd2f004644ad3c5854"
+
+esutils@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b"
+
+event-emitter@~0.3.5:
+  version "0.3.5"
+  resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39"
+  dependencies:
+    d "1"
+    es5-ext "~0.10.14"
+
+eventemitter3@1.x.x:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508"
+
+events@^1.0.0, events@~1.1.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924"
+
+evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02"
+  dependencies:
+    md5.js "^1.3.4"
+    safe-buffer "^5.1.1"
+
+execa@^0.7.0:
+  version "0.7.0"
+  resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777"
+  dependencies:
+    cross-spawn "^5.0.1"
+    get-stream "^3.0.0"
+    is-stream "^1.1.0"
+    npm-run-path "^2.0.0"
+    p-finally "^1.0.0"
+    signal-exit "^3.0.0"
+    strip-eof "^1.0.0"
+
+execa@^0.8.0:
+  version "0.8.0"
+  resolved "https://registry.yarnpkg.com/execa/-/execa-0.8.0.tgz#d8d76bbc1b55217ed190fd6dd49d3c774ecfc8da"
+  dependencies:
+    cross-spawn "^5.0.1"
+    get-stream "^3.0.0"
+    is-stream "^1.1.0"
+    npm-run-path "^2.0.0"
+    p-finally "^1.0.0"
+    signal-exit "^3.0.0"
+    strip-eof "^1.0.0"
+
+execa@^0.9.0:
+  version "0.9.0"
+  resolved "https://registry.yarnpkg.com/execa/-/execa-0.9.0.tgz#adb7ce62cf985071f60580deb4a88b9e34712d01"
+  dependencies:
+    cross-spawn "^5.0.1"
+    get-stream "^3.0.0"
+    is-stream "^1.1.0"
+    npm-run-path "^2.0.0"
+    p-finally "^1.0.0"
+    signal-exit "^3.0.0"
+    strip-eof "^1.0.0"
+
+exit-hook@^1.0.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8"
+
+exit@^0.1.2:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c"
+
+expand-braces@^0.1.1:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/expand-braces/-/expand-braces-0.1.2.tgz#488b1d1d2451cb3d3a6b192cfc030f44c5855fea"
+  dependencies:
+    array-slice "^0.2.3"
+    array-unique "^0.2.1"
+    braces "^0.1.2"
+
+expand-brackets@^0.1.4:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b"
+  dependencies:
+    is-posix-bracket "^0.1.0"
+
+expand-brackets@^2.1.4:
+  version "2.1.4"
+  resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622"
+  dependencies:
+    debug "^2.3.3"
+    define-property "^0.2.5"
+    extend-shallow "^2.0.1"
+    posix-character-classes "^0.1.0"
+    regex-not "^1.0.0"
+    snapdragon "^0.8.1"
+    to-regex "^3.0.1"
+
+expand-range@^0.1.0:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-0.1.1.tgz#4cb8eda0993ca56fa4f41fc42f3cbb4ccadff044"
+  dependencies:
+    is-number "^0.1.1"
+    repeat-string "^0.2.2"
+
+expand-range@^1.8.1:
+  version "1.8.2"
+  resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337"
+  dependencies:
+    fill-range "^2.1.0"
+
+expand-tilde@^1.2.2:
+  version "1.2.2"
+  resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-1.2.2.tgz#0b81eba897e5a3d31d1c3d102f8f01441e559449"
+  dependencies:
+    os-homedir "^1.0.1"
+
+expect@^22.4.0:
+  version "22.4.0"
+  resolved "https://registry.yarnpkg.com/expect/-/expect-22.4.0.tgz#371edf1ae15b83b5bf5ec34b42f1584660a36c16"
+  dependencies:
+    ansi-styles "^3.2.0"
+    jest-diff "^22.4.0"
+    jest-get-type "^22.1.0"
+    jest-matcher-utils "^22.4.0"
+    jest-message-util "^22.4.0"
+    jest-regex-util "^22.1.0"
+
+extend-shallow@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f"
+  dependencies:
+    is-extendable "^0.1.0"
+
+extend-shallow@^3.0.0, extend-shallow@^3.0.2:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8"
+  dependencies:
+    assign-symbols "^1.0.0"
+    is-extendable "^1.0.1"
+
+extend@3, extend@^3.0.0, extend@~3.0.0, extend@~3.0.1:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444"
+
+external-editor@^1.1.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-1.1.1.tgz#12d7b0db850f7ff7e7081baf4005700060c4600b"
+  dependencies:
+    extend "^3.0.0"
+    spawn-sync "^1.0.15"
+    tmp "^0.0.29"
+
+external-editor@^2.0.4:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.1.0.tgz#3d026a21b7f95b5726387d4200ac160d372c3b48"
+  dependencies:
+    chardet "^0.4.0"
+    iconv-lite "^0.4.17"
+    tmp "^0.0.33"
+
+extglob@^0.3.1:
+  version "0.3.2"
+  resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1"
+  dependencies:
+    is-extglob "^1.0.0"
+
+extglob@^2.0.4:
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543"
+  dependencies:
+    array-unique "^0.3.2"
+    define-property "^1.0.0"
+    expand-brackets "^2.1.4"
+    extend-shallow "^2.0.1"
+    fragment-cache "^0.2.1"
+    regex-not "^1.0.0"
+    snapdragon "^0.8.1"
+    to-regex "^3.0.1"
+
+extract-zip@^1.6.5:
+  version "1.6.6"
+  resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.6.6.tgz#1290ede8d20d0872b429fd3f351ca128ec5ef85c"
+  dependencies:
+    concat-stream "1.6.0"
+    debug "2.6.9"
+    mkdirp "0.5.0"
+    yauzl "2.4.1"
+
+extsprintf@1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05"
+
+extsprintf@^1.2.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f"
+
+fast-deep-equal@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614"
+
+fast-json-stable-stringify@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2"
+
+fast-levenshtein@~2.0.4:
+  version "2.0.6"
+  resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
+
+fd-slicer@~1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.0.1.tgz#8b5bcbd9ec327c5041bf9ab023fd6750f1177e65"
+  dependencies:
+    pend "~1.2.0"
+
+figures@^1.3.5, figures@^1.7.0:
+  version "1.7.0"
+  resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e"
+  dependencies:
+    escape-string-regexp "^1.0.5"
+    object-assign "^4.1.0"
+
+figures@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962"
+  dependencies:
+    escape-string-regexp "^1.0.5"
+
+file-entry-cache@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361"
+  dependencies:
+    flat-cache "^1.2.1"
+    object-assign "^4.0.1"
+
+file-loader@^1.1.5:
+  version "1.1.11"
+  resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-1.1.11.tgz#6fe886449b0f2a936e43cabaac0cdbfb369506f8"
+  dependencies:
+    loader-utils "^1.0.2"
+    schema-utils "^0.4.5"
+
+file-uri-to-path@1:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd"
+
+filename-regex@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26"
+
+fill-range@^2.1.0:
+  version "2.2.3"
+  resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723"
+  dependencies:
+    is-number "^2.1.0"
+    isobject "^2.0.0"
+    randomatic "^1.1.3"
+    repeat-element "^1.1.2"
+    repeat-string "^1.5.2"
+
+fill-range@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7"
+  dependencies:
+    extend-shallow "^2.0.1"
+    is-number "^3.0.0"
+    repeat-string "^1.6.1"
+    to-regex-range "^2.1.0"
+
+finalhandler@1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.0.tgz#ce0b6855b45853e791b2fcc680046d88253dd7f5"
+  dependencies:
+    debug "2.6.9"
+    encodeurl "~1.0.1"
+    escape-html "~1.0.3"
+    on-finished "~2.3.0"
+    parseurl "~1.3.2"
+    statuses "~1.3.1"
+    unpipe "~1.0.0"
+
+find-cache-dir@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-0.1.1.tgz#c8defae57c8a52a8a784f9e31c57c742e993a0b9"
+  dependencies:
+    commondir "^1.0.1"
+    mkdirp "^0.5.1"
+    pkg-dir "^1.0.0"
+
+find-cache-dir@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f"
+  dependencies:
+    commondir "^1.0.1"
+    make-dir "^1.0.0"
+    pkg-dir "^2.0.0"
+
+find-node-modules@1.0.4:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/find-node-modules/-/find-node-modules-1.0.4.tgz#b6deb3cccb699c87037677bcede2c5f5862b2550"
+  dependencies:
+    findup-sync "0.4.2"
+    merge "^1.2.0"
+
+find-parent-dir@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/find-parent-dir/-/find-parent-dir-0.3.0.tgz#33c44b429ab2b2f0646299c5f9f718f376ff8d54"
+
+find-root@1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.0.0.tgz#962ff211aab25c6520feeeb8d6287f8f6e95807a"
+
+find-up@^1.0.0:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f"
+  dependencies:
+    path-exists "^2.0.0"
+    pinkie-promise "^2.0.0"
+
+find-up@^2.0.0, find-up@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
+  dependencies:
+    locate-path "^2.0.0"
+
+findup-sync@0.4.2:
+  version "0.4.2"
+  resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-0.4.2.tgz#a8117d0f73124f5a4546839579fe52d7129fb5e5"
+  dependencies:
+    detect-file "^0.1.0"
+    is-glob "^2.0.1"
+    micromatch "^2.3.7"
+    resolve-dir "^0.1.0"
+
+flat-cache@^1.2.1:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481"
+  dependencies:
+    circular-json "^0.3.1"
+    del "^2.0.2"
+    graceful-fs "^4.1.2"
+    write "^0.2.1"
+
+flow-bin@^0.61.0:
+  version "0.61.0"
+  resolved "https://registry.yarnpkg.com/flow-bin/-/flow-bin-0.61.0.tgz#d0473a8c35dbbf4de573823f4932124397d32d35"
+
+flow-remove-types-no-whitespace@^1.0.3:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/flow-remove-types-no-whitespace/-/flow-remove-types-no-whitespace-1.0.5.tgz#3d297985a0bed5197b8fb0cbe89ec163f8dea9eb"
+  dependencies:
+    babylon "^6.8.4"
+    magic-string "^0.16.0"
+
+follow-redirects@1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.0.0.tgz#8e34298cbd2e176f254effec75a1c78cc849fd37"
+  dependencies:
+    debug "^2.2.0"
+
+for-in@^1.0.1, for-in@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
+
+for-own@^0.1.4:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce"
+  dependencies:
+    for-in "^1.0.1"
+
+forever-agent@~0.5.0:
+  version "0.5.2"
+  resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.5.2.tgz#6d0e09c4921f94a27f63d3b49c5feff1ea4c5130"
+
+forever-agent@~0.6.1:
+  version "0.6.1"
+  resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
+
+form-data@~0.1.0:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/form-data/-/form-data-0.1.4.tgz#91abd788aba9702b1aabfa8bc01031a2ac9e3b12"
+  dependencies:
+    async "~0.9.0"
+    combined-stream "~0.0.4"
+    mime "~1.2.11"
+
+form-data@~2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.0.0.tgz#6f0aebadcc5da16c13e1ecc11137d85f9b883b25"
+  dependencies:
+    asynckit "^0.4.0"
+    combined-stream "^1.0.5"
+    mime-types "^2.1.11"
+
+form-data@~2.1.1:
+  version "2.1.4"
+  resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1"
+  dependencies:
+    asynckit "^0.4.0"
+    combined-stream "^1.0.5"
+    mime-types "^2.1.12"
+
+form-data@~2.3.1:
+  version "2.3.2"
+  resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.2.tgz#4970498be604c20c005d4f5c23aecd21d6b49099"
+  dependencies:
+    asynckit "^0.4.0"
+    combined-stream "1.0.6"
+    mime-types "^2.1.12"
+
+fragment-cache@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19"
+  dependencies:
+    map-cache "^0.2.2"
+
+fs-access@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/fs-access/-/fs-access-1.0.1.tgz#d6a87f262271cefebec30c553407fb995da8777a"
+  dependencies:
+    null-check "^1.0.0"
+
+fs-exists-sync@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz#982d6893af918e72d08dec9e8673ff2b5a8d6add"
+
+fs-extra@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-1.0.0.tgz#cd3ce5f7e7cb6145883fcae3191e9877f8587950"
+  dependencies:
+    graceful-fs "^4.1.2"
+    jsonfile "^2.1.0"
+    klaw "^1.0.0"
+
+fs.realpath@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+
+fsevents@^1.0.0:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.3.tgz#11f82318f5fe7bb2cd22965a108e9306208216d8"
+  dependencies:
+    nan "^2.3.0"
+    node-pre-gyp "^0.6.39"
+
+fstream-ignore@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105"
+  dependencies:
+    fstream "^1.0.0"
+    inherits "2"
+    minimatch "^3.0.0"
+
+fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2:
+  version "1.0.11"
+  resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171"
+  dependencies:
+    graceful-fs "^4.1.2"
+    inherits "~2.0.0"
+    mkdirp ">=0.5 0"
+    rimraf "2"
+
+ftp@~0.3.10:
+  version "0.3.10"
+  resolved "https://registry.yarnpkg.com/ftp/-/ftp-0.3.10.tgz#9197d861ad8142f3e63d5a83bfe4c59f7330885d"
+  dependencies:
+    readable-stream "1.1.x"
+    xregexp "2.0.0"
+
+function-bind@^1.0.2:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
+
+functional-red-black-tree@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
+
+gauge@~2.7.3:
+  version "2.7.4"
+  resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7"
+  dependencies:
+    aproba "^1.0.3"
+    console-control-strings "^1.0.0"
+    has-unicode "^2.0.0"
+    object-assign "^4.1.0"
+    signal-exit "^3.0.0"
+    string-width "^1.0.1"
+    strip-ansi "^3.0.1"
+    wide-align "^1.1.0"
+
+generate-function@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74"
+
+generate-object-property@^1.1.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0"
+  dependencies:
+    is-property "^1.0.0"
+
+get-caller-file@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5"
+
+get-own-enumerable-property-symbols@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-2.0.1.tgz#5c4ad87f2834c4b9b4e84549dc1e0650fb38c24b"
+
+get-pkg-repo@^1.0.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/get-pkg-repo/-/get-pkg-repo-1.4.0.tgz#c73b489c06d80cc5536c2c853f9e05232056972d"
+  dependencies:
+    hosted-git-info "^2.1.4"
+    meow "^3.3.0"
+    normalize-package-data "^2.3.0"
+    parse-github-repo-url "^1.3.0"
+    through2 "^2.0.0"
+
+get-stdin@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe"
+
+get-stream@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
+
+get-uri@2:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/get-uri/-/get-uri-2.0.1.tgz#dbdcacacd8c608a38316869368117697a1631c59"
+  dependencies:
+    data-uri-to-buffer "1"
+    debug "2"
+    extend "3"
+    file-uri-to-path "1"
+    ftp "~0.3.10"
+    readable-stream "2"
+
+get-value@^2.0.3, get-value@^2.0.6:
+  version "2.0.6"
+  resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
+
+getpass@^0.1.1:
+  version "0.1.7"
+  resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
+  dependencies:
+    assert-plus "^1.0.0"
+
+git-raw-commits@^1.3.4:
+  version "1.3.4"
+  resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-1.3.4.tgz#442c3df5985b4f5689e9e43597f5194736aac001"
+  dependencies:
+    dargs "^4.0.1"
+    lodash.template "^4.0.2"
+    meow "^4.0.0"
+    split2 "^2.0.0"
+    through2 "^2.0.0"
+
+git-remote-origin-url@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz#5282659dae2107145a11126112ad3216ec5fa65f"
+  dependencies:
+    gitconfiglocal "^1.0.0"
+    pify "^2.3.0"
+
+git-semver-tags@^1.3.4:
+  version "1.3.4"
+  resolved "https://registry.yarnpkg.com/git-semver-tags/-/git-semver-tags-1.3.4.tgz#2ceb2a355c6d7514c123c35e297067d08caf3a92"
+  dependencies:
+    meow "^4.0.0"
+    semver "^5.5.0"
+
+gitconfiglocal@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz#41d045f3851a5ea88f03f24ca1c6178114464b9b"
+  dependencies:
+    ini "^1.3.2"
+
+glob-base@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4"
+  dependencies:
+    glob-parent "^2.0.0"
+    is-glob "^2.0.0"
+
+glob-parent@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28"
+  dependencies:
+    is-glob "^2.0.0"
+
+glob-parent@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae"
+  dependencies:
+    is-glob "^3.1.0"
+    path-dirname "^1.0.0"
+
+glob@7.0.5:
+  version "7.0.5"
+  resolved "https://registry.yarnpkg.com/glob/-/glob-7.0.5.tgz#b4202a69099bbb4d292a7c1b95b6682b67ebdc95"
+  dependencies:
+    fs.realpath "^1.0.0"
+    inflight "^1.0.4"
+    inherits "2"
+    minimatch "^3.0.2"
+    once "^1.3.0"
+    path-is-absolute "^1.0.0"
+
+glob@7.1.1:
+  version "7.1.1"
+  resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8"
+  dependencies:
+    fs.realpath "^1.0.0"
+    inflight "^1.0.4"
+    inherits "2"
+    minimatch "^3.0.2"
+    once "^1.3.0"
+    path-is-absolute "^1.0.0"
+
+glob@^5.0.15:
+  version "5.0.15"
+  resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1"
+  dependencies:
+    inflight "^1.0.4"
+    inherits "2"
+    minimatch "2 || 3"
+    once "^1.3.0"
+    path-is-absolute "^1.0.0"
+
+glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.0.6, glob@^7.1.0, glob@^7.1.1, glob@^7.1.2:
+  version "7.1.2"
+  resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15"
+  dependencies:
+    fs.realpath "^1.0.0"
+    inflight "^1.0.4"
+    inherits "2"
+    minimatch "^3.0.4"
+    once "^1.3.0"
+    path-is-absolute "^1.0.0"
+
+global-modules@^0.2.3:
+  version "0.2.3"
+  resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-0.2.3.tgz#ea5a3bed42c6d6ce995a4f8a1269b5dae223828d"
+  dependencies:
+    global-prefix "^0.1.4"
+    is-windows "^0.2.0"
+
+global-prefix@^0.1.4:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-0.1.5.tgz#8d3bc6b8da3ca8112a160d8d496ff0462bfef78f"
+  dependencies:
+    homedir-polyfill "^1.0.0"
+    ini "^1.3.4"
+    is-windows "^0.2.0"
+    which "^1.2.12"
+
+globals@^11.0.1, globals@^11.1.0:
+  version "11.3.0"
+  resolved "https://registry.yarnpkg.com/globals/-/globals-11.3.0.tgz#e04fdb7b9796d8adac9c8f64c14837b2313378b0"
+
+globals@^9.18.0:
+  version "9.18.0"
+  resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a"
+
+globby@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d"
+  dependencies:
+    array-union "^1.0.1"
+    arrify "^1.0.0"
+    glob "^7.0.3"
+    object-assign "^4.0.1"
+    pify "^2.0.0"
+    pinkie-promise "^2.0.0"
+
+globby@^6.1.0:
+  version "6.1.0"
+  resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c"
+  dependencies:
+    array-union "^1.0.1"
+    glob "^7.0.3"
+    object-assign "^4.0.1"
+    pify "^2.0.0"
+    pinkie-promise "^2.0.0"
+
+graceful-fs@^4.1.0, graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9:
+  version "4.1.11"
+  resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658"
+
+"graceful-readlink@>= 1.0.0":
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725"
+
+growl@1.9.2:
+  version "1.9.2"
+  resolved "https://registry.yarnpkg.com/growl/-/growl-1.9.2.tgz#0ea7743715db8d8de2c5ede1775e1b45ac85c02f"
+
+handlebars@^4.0.1, handlebars@^4.0.2:
+  version "4.0.11"
+  resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.11.tgz#630a35dfe0294bc281edae6ffc5d329fc7982dcc"
+  dependencies:
+    async "^1.4.0"
+    optimist "^0.6.1"
+    source-map "^0.4.4"
+  optionalDependencies:
+    uglify-js "^2.6"
+
+har-schema@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e"
+
+har-schema@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92"
+
+har-validator@~2.0.6:
+  version "2.0.6"
+  resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d"
+  dependencies:
+    chalk "^1.1.1"
+    commander "^2.9.0"
+    is-my-json-valid "^2.12.4"
+    pinkie-promise "^2.0.0"
+
+har-validator@~4.2.1:
+  version "4.2.1"
+  resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a"
+  dependencies:
+    ajv "^4.9.1"
+    har-schema "^1.0.5"
+
+har-validator@~5.0.3:
+  version "5.0.3"
+  resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd"
+  dependencies:
+    ajv "^5.1.0"
+    har-schema "^2.0.0"
+
+has-ansi@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
+  dependencies:
+    ansi-regex "^2.0.0"
+
+has-binary2@~1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/has-binary2/-/has-binary2-1.0.2.tgz#e83dba49f0b9be4d026d27365350d9f03f54be98"
+  dependencies:
+    isarray "2.0.1"
+
+has-cors@1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39"
+
+has-flag@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa"
+
+has-flag@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51"
+
+has-flag@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
+
+has-unicode@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
+
+has-value@^0.3.1:
+  version "0.3.1"
+  resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f"
+  dependencies:
+    get-value "^2.0.3"
+    has-values "^0.1.4"
+    isobject "^2.0.0"
+
+has-value@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177"
+  dependencies:
+    get-value "^2.0.6"
+    has-values "^1.0.0"
+    isobject "^3.0.0"
+
+has-values@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771"
+
+has-values@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f"
+  dependencies:
+    is-number "^3.0.0"
+    kind-of "^4.0.0"
+
+has@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28"
+  dependencies:
+    function-bind "^1.0.2"
+
+hash-base@^2.0.0:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-2.0.2.tgz#66ea1d856db4e8a5470cadf6fce23ae5244ef2e1"
+  dependencies:
+    inherits "^2.0.1"
+
+hash-base@^3.0.0:
+  version "3.0.4"
+  resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918"
+  dependencies:
+    inherits "^2.0.1"
+    safe-buffer "^5.0.1"
+
+hash-sum@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/hash-sum/-/hash-sum-1.0.2.tgz#33b40777754c6432573c120cc3808bbd10d47f04"
+
+hash.js@^1.0.0, hash.js@^1.0.3:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.3.tgz#340dedbe6290187151c1ea1d777a3448935df846"
+  dependencies:
+    inherits "^2.0.3"
+    minimalistic-assert "^1.0.0"
+
+hasha@^2.2.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/hasha/-/hasha-2.2.0.tgz#78d7cbfc1e6d66303fe79837365984517b2f6ee1"
+  dependencies:
+    is-stream "^1.0.1"
+    pinkie-promise "^2.0.0"
+
+hawk@1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/hawk/-/hawk-1.1.1.tgz#87cd491f9b46e4e2aeaca335416766885d2d1ed9"
+  dependencies:
+    boom "0.4.x"
+    cryptiles "0.2.x"
+    hoek "0.9.x"
+    sntp "0.2.x"
+
+hawk@3.1.3, hawk@~3.1.3:
+  version "3.1.3"
+  resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4"
+  dependencies:
+    boom "2.x.x"
+    cryptiles "2.x.x"
+    hoek "2.x.x"
+    sntp "1.x.x"
+
+hawk@~6.0.2:
+  version "6.0.2"
+  resolved "https://registry.yarnpkg.com/hawk/-/hawk-6.0.2.tgz#af4d914eb065f9b5ce4d9d11c1cb2126eecc3038"
+  dependencies:
+    boom "4.x.x"
+    cryptiles "3.x.x"
+    hoek "4.x.x"
+    sntp "2.x.x"
+
+he@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd"
+
+hipchat-notifier@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/hipchat-notifier/-/hipchat-notifier-1.1.0.tgz#b6d249755437c191082367799d3ba9a0f23b231e"
+  dependencies:
+    lodash "^4.0.0"
+    request "^2.0.0"
+
+hmac-drbg@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
+  dependencies:
+    hash.js "^1.0.3"
+    minimalistic-assert "^1.0.0"
+    minimalistic-crypto-utils "^1.0.1"
+
+hoek@0.9.x:
+  version "0.9.1"
+  resolved "https://registry.yarnpkg.com/hoek/-/hoek-0.9.1.tgz#3d322462badf07716ea7eb85baf88079cddce505"
+
+hoek@2.x.x:
+  version "2.16.3"
+  resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed"
+
+hoek@4.x.x:
+  version "4.2.1"
+  resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.1.tgz#9634502aa12c445dd5a7c5734b572bb8738aacbb"
+
+home-or-tmp@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8"
+  dependencies:
+    os-homedir "^1.0.0"
+    os-tmpdir "^1.0.1"
+
+homedir-polyfill@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz#4c2bbc8a758998feebf5ed68580f76d46768b4bc"
+  dependencies:
+    parse-passwd "^1.0.0"
+
+hosted-git-info@^2.1.4:
+  version "2.5.0"
+  resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c"
+
+html-encoding-sniffer@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8"
+  dependencies:
+    whatwg-encoding "^1.0.1"
+
+htmlescape@^1.1.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/htmlescape/-/htmlescape-1.1.1.tgz#3a03edc2214bca3b66424a3e7959349509cb0351"
+
+htmlparser2@^3.8.2:
+  version "3.9.2"
+  resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.9.2.tgz#1bdf87acca0f3f9e53fa4fcceb0f4b4cbb00b338"
+  dependencies:
+    domelementtype "^1.3.0"
+    domhandler "^2.3.0"
+    domutils "^1.5.1"
+    entities "^1.1.1"
+    inherits "^2.0.1"
+    readable-stream "^2.0.2"
+
+http-errors@1.6.2, http-errors@~1.6.2:
+  version "1.6.2"
+  resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736"
+  dependencies:
+    depd "1.1.1"
+    inherits "2.0.3"
+    setprototypeof "1.0.3"
+    statuses ">= 1.3.1 < 2"
+
+http-proxy-agent@1:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-1.0.0.tgz#cc1ce38e453bf984a0f7702d2dd59c73d081284a"
+  dependencies:
+    agent-base "2"
+    debug "2"
+    extend "3"
+
+http-proxy@^1.13.0, http-proxy@^1.8.1:
+  version "1.16.2"
+  resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.16.2.tgz#06dff292952bf64dbe8471fa9df73066d4f37742"
+  dependencies:
+    eventemitter3 "1.x.x"
+    requires-port "1.x.x"
+
+http-server@^0.11.1:
+  version "0.11.1"
+  resolved "https://registry.yarnpkg.com/http-server/-/http-server-0.11.1.tgz#2302a56a6ffef7f9abea0147d838a5e9b6b6a79b"
+  dependencies:
+    colors "1.0.3"
+    corser "~2.0.0"
+    ecstatic "^3.0.0"
+    http-proxy "^1.8.1"
+    opener "~1.4.0"
+    optimist "0.6.x"
+    portfinder "^1.0.13"
+    union "~0.4.3"
+
+http-signature@~0.10.0:
+  version "0.10.1"
+  resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-0.10.1.tgz#4fbdac132559aa8323121e540779c0a012b27e66"
+  dependencies:
+    asn1 "0.1.11"
+    assert-plus "^0.1.5"
+    ctype "0.5.3"
+
+http-signature@~1.1.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf"
+  dependencies:
+    assert-plus "^0.2.0"
+    jsprim "^1.2.2"
+    sshpk "^1.7.0"
+
+http-signature@~1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1"
+  dependencies:
+    assert-plus "^1.0.0"
+    jsprim "^1.2.2"
+    sshpk "^1.7.0"
+
+httpntlm@1.6.1:
+  version "1.6.1"
+  resolved "https://registry.yarnpkg.com/httpntlm/-/httpntlm-1.6.1.tgz#ad01527143a2e8773cfae6a96f58656bb52a34b2"
+  dependencies:
+    httpreq ">=0.4.22"
+    underscore "~1.7.0"
+
+httpreq@>=0.4.22:
+  version "0.4.24"
+  resolved "https://registry.yarnpkg.com/httpreq/-/httpreq-0.4.24.tgz#4335ffd82cd969668a39465c929ac61d6393627f"
+
+https-browserify@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73"
+
+https-proxy-agent@1, https-proxy-agent@^1.0.0, https-proxy-agent@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz#35f7da6c48ce4ddbfa264891ac593ee5ff8671e6"
+  dependencies:
+    agent-base "2"
+    debug "2"
+    extend "3"
+
+iconv-lite@0.4.15:
+  version "0.4.15"
+  resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.15.tgz#fe265a218ac6a57cfe854927e9d04c19825eddeb"
+
+iconv-lite@0.4.19, iconv-lite@^0.4.17:
+  version "0.4.19"
+  resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b"
+
+ieee754@^1.1.4:
+  version "1.1.8"
+  resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4"
+
+ignore@^3.3.3:
+  version "3.3.7"
+  resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.7.tgz#612289bfb3c220e186a58118618d5be8c1bab021"
+
+imurmurhash@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
+
+indent-string@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80"
+  dependencies:
+    repeating "^2.0.0"
+
+indent-string@^3.0.0:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289"
+
+indexof@0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d"
+
+inflection@~1.10.0:
+  version "1.10.0"
+  resolved "https://registry.yarnpkg.com/inflection/-/inflection-1.10.0.tgz#5bffcb1197ad3e81050f8e17e21668087ee9eb2f"
+
+inflection@~1.3.0:
+  version "1.3.8"
+  resolved "https://registry.yarnpkg.com/inflection/-/inflection-1.3.8.tgz#cbd160da9f75b14c3cc63578d4f396784bf3014e"
+
+inflight@^1.0.4:
+  version "1.0.6"
+  resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+  dependencies:
+    once "^1.3.0"
+    wrappy "1"
+
+inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
+
+inherits@2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1"
+
+ini@^1.3.2, ini@^1.3.4, ini@~1.3.0:
+  version "1.3.5"
+  resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
+
+inline-source-map@~0.6.0:
+  version "0.6.2"
+  resolved "https://registry.yarnpkg.com/inline-source-map/-/inline-source-map-0.6.2.tgz#f9393471c18a79d1724f863fa38b586370ade2a5"
+  dependencies:
+    source-map "~0.5.3"
+
+inquirer@1.2.3:
+  version "1.2.3"
+  resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-1.2.3.tgz#4dec6f32f37ef7bb0b2ed3f1d1a5c3f545074918"
+  dependencies:
+    ansi-escapes "^1.1.0"
+    chalk "^1.0.0"
+    cli-cursor "^1.0.1"
+    cli-width "^2.0.0"
+    external-editor "^1.1.0"
+    figures "^1.3.5"
+    lodash "^4.3.0"
+    mute-stream "0.0.6"
+    pinkie-promise "^2.0.0"
+    run-async "^2.2.0"
+    rx "^4.1.0"
+    string-width "^1.0.1"
+    strip-ansi "^3.0.0"
+    through "^2.3.6"
+
+inquirer@^3.0.6:
+  version "3.3.0"
+  resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9"
+  dependencies:
+    ansi-escapes "^3.0.0"
+    chalk "^2.0.0"
+    cli-cursor "^2.1.0"
+    cli-width "^2.0.0"
+    external-editor "^2.0.4"
+    figures "^2.0.0"
+    lodash "^4.3.0"
+    mute-stream "0.0.7"
+    run-async "^2.2.0"
+    rx-lite "^4.0.8"
+    rx-lite-aggregates "^4.0.8"
+    string-width "^2.1.0"
+    strip-ansi "^4.0.0"
+    through "^2.3.6"
+
+insert-module-globals@^7.0.0:
+  version "7.0.2"
+  resolved "https://registry.yarnpkg.com/insert-module-globals/-/insert-module-globals-7.0.2.tgz#012c56baa7d3307a8b417d4ec5270cf9741c18f4"
+  dependencies:
+    JSONStream "^1.0.3"
+    combine-source-map "~0.7.1"
+    concat-stream "~1.5.1"
+    is-buffer "^1.1.0"
+    lexical-scope "^1.2.0"
+    process "~0.11.0"
+    through2 "^2.0.0"
+    xtend "^4.0.0"
+
+interpret@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614"
+
+invariant@^2.2.0, invariant@^2.2.2:
+  version "2.2.3"
+  resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.3.tgz#1a827dfde7dcbd7c323f0ca826be8fa7c5e9d688"
+  dependencies:
+    loose-envify "^1.0.0"
+
+invert-kv@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6"
+
+ip@1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/ip/-/ip-1.0.1.tgz#c7e356cdea225ae71b36d70f2e71a92ba4e42590"
+
+ip@^1.1.2, ip@^1.1.4:
+  version "1.1.5"
+  resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a"
+
+is-accessor-descriptor@^0.1.6:
+  version "0.1.6"
+  resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6"
+  dependencies:
+    kind-of "^3.0.2"
+
+is-accessor-descriptor@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656"
+  dependencies:
+    kind-of "^6.0.0"
+
+is-arrayish@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
+
+is-binary-path@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898"
+  dependencies:
+    binary-extensions "^1.0.0"
+
+is-buffer@^1.1.0, is-buffer@^1.1.5:
+  version "1.1.6"
+  resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
+
+is-builtin-module@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe"
+  dependencies:
+    builtin-modules "^1.0.0"
+
+is-ci@^1.0.10:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.1.0.tgz#247e4162e7860cebbdaf30b774d6b0ac7dcfe7a5"
+  dependencies:
+    ci-info "^1.0.0"
+
+is-data-descriptor@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56"
+  dependencies:
+    kind-of "^3.0.2"
+
+is-data-descriptor@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7"
+  dependencies:
+    kind-of "^6.0.0"
+
+is-descriptor@^0.1.0:
+  version "0.1.6"
+  resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca"
+  dependencies:
+    is-accessor-descriptor "^0.1.6"
+    is-data-descriptor "^0.1.4"
+    kind-of "^5.0.0"
+
+is-descriptor@^1.0.0, is-descriptor@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec"
+  dependencies:
+    is-accessor-descriptor "^1.0.0"
+    is-data-descriptor "^1.0.0"
+    kind-of "^6.0.2"
+
+is-directory@^0.3.1:
+  version "0.3.1"
+  resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1"
+
+is-dotfile@^1.0.0:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1"
+
+is-equal-shallow@^0.1.3:
+  version "0.1.3"
+  resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534"
+  dependencies:
+    is-primitive "^2.0.0"
+
+is-extendable@^0.1.0, is-extendable@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
+
+is-extendable@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4"
+  dependencies:
+    is-plain-object "^2.0.4"
+
+is-extglob@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0"
+
+is-extglob@^2.1.0, is-extglob@^2.1.1:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
+
+is-finite@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa"
+  dependencies:
+    number-is-nan "^1.0.0"
+
+is-fullwidth-code-point@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
+  dependencies:
+    number-is-nan "^1.0.0"
+
+is-fullwidth-code-point@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
+
+is-generator-fn@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-1.0.0.tgz#969d49e1bb3329f6bb7f09089be26578b2ddd46a"
+
+is-glob@^2.0.0, is-glob@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863"
+  dependencies:
+    is-extglob "^1.0.0"
+
+is-glob@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a"
+  dependencies:
+    is-extglob "^2.1.0"
+
+is-glob@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0"
+  dependencies:
+    is-extglob "^2.1.1"
+
+is-module@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591"
+
+is-my-ip-valid@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz#7b351b8e8edd4d3995d4d066680e664d94696824"
+
+is-my-json-valid@^2.12.4:
+  version "2.17.2"
+  resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.17.2.tgz#6b2103a288e94ef3de5cf15d29dd85fc4b78d65c"
+  dependencies:
+    generate-function "^2.0.0"
+    generate-object-property "^1.1.0"
+    is-my-ip-valid "^1.0.0"
+    jsonpointer "^4.0.0"
+    xtend "^4.0.0"
+
+is-number@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/is-number/-/is-number-0.1.1.tgz#69a7af116963d47206ec9bd9b48a14216f1e3806"
+
+is-number@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f"
+  dependencies:
+    kind-of "^3.0.2"
+
+is-number@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195"
+  dependencies:
+    kind-of "^3.0.2"
+
+is-number@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff"
+
+is-obj@^1.0.0, is-obj@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f"
+
+is-observable@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/is-observable/-/is-observable-0.2.0.tgz#b361311d83c6e5d726cabf5e250b0237106f5ae2"
+  dependencies:
+    symbol-observable "^0.2.2"
+
+is-odd@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/is-odd/-/is-odd-2.0.0.tgz#7646624671fd7ea558ccd9a2795182f2958f1b24"
+  dependencies:
+    is-number "^4.0.0"
+
+is-path-cwd@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d"
+
+is-path-in-cwd@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc"
+  dependencies:
+    is-path-inside "^1.0.0"
+
+is-path-inside@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036"
+  dependencies:
+    path-is-inside "^1.0.1"
+
+is-plain-obj@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e"
+
+is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4:
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
+  dependencies:
+    isobject "^3.0.1"
+
+is-posix-bracket@^0.1.0:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4"
+
+is-primitive@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575"
+
+is-promise@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa"
+
+is-property@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84"
+
+is-regexp@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069"
+
+is-resolvable@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88"
+
+is-stream@^1.0.1, is-stream@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
+
+is-subset@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/is-subset/-/is-subset-0.1.1.tgz#8a59117d932de1de00f245fcdd39ce43f1e939a6"
+
+is-text-path@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/is-text-path/-/is-text-path-1.0.1.tgz#4e1aa0fb51bfbcb3e92688001397202c1775b66e"
+  dependencies:
+    text-extensions "^1.0.0"
+
+is-typedarray@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
+
+is-utf8@^0.2.0:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72"
+
+is-windows@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-0.2.0.tgz#de1aa6d63ea29dd248737b69f1ff8b8002d2108c"
+
+is-windows@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
+
+isarray@0.0.1, isarray@~0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
+
+isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
+
+isarray@2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.1.tgz#a37d94ed9cda2d59865c9f76fe596ee1f338741e"
+
+isbinaryfile@^3.0.0:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.2.tgz#4a3e974ec0cba9004d3fc6cde7209ea69368a621"
+
+isexe@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
+
+isobject@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
+  dependencies:
+    isarray "1.0.0"
+
+isobject@^3.0.0, isobject@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
+
+isstream@~0.1.2:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
+
+istanbul-lib-coverage@^1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.2.tgz#4113c8ff6b7a40a1ef7350b01016331f63afde14"
+
+istanbul-lib-instrument@^1.7.5:
+  version "1.9.2"
+  resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.9.2.tgz#84905bf47f7e0b401d6b840da7bad67086b4aab6"
+  dependencies:
+    babel-generator "^6.18.0"
+    babel-template "^6.16.0"
+    babel-traverse "^6.18.0"
+    babel-types "^6.18.0"
+    babylon "^6.18.0"
+    istanbul-lib-coverage "^1.1.2"
+    semver "^5.3.0"
+
+istanbul@^0.4.0:
+  version "0.4.5"
+  resolved "https://registry.yarnpkg.com/istanbul/-/istanbul-0.4.5.tgz#65c7d73d4c4da84d4f3ac310b918fb0b8033733b"
+  dependencies:
+    abbrev "1.0.x"
+    async "1.x"
+    escodegen "1.8.x"
+    esprima "2.7.x"
+    glob "^5.0.15"
+    handlebars "^4.0.1"
+    js-yaml "3.x"
+    mkdirp "0.5.x"
+    nopt "3.x"
+    once "1.x"
+    resolve "1.1.x"
+    supports-color "^3.1.0"
+    which "^1.1.1"
+    wordwrap "^1.0.0"
+
+jasmine-core@^2.99.0, jasmine-core@~2.99.0:
+  version "2.99.1"
+  resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-2.99.1.tgz#e6400df1e6b56e130b61c4bcd093daa7f6e8ca15"
+
+jasmine@^2.99.0:
+  version "2.99.0"
+  resolved "https://registry.yarnpkg.com/jasmine/-/jasmine-2.99.0.tgz#8ca72d102e639b867c6489856e0e18a9c7aa42b7"
+  dependencies:
+    exit "^0.1.2"
+    glob "^7.0.6"
+    jasmine-core "~2.99.0"
+
+jest-config@^22.4.2:
+  version "22.4.2"
+  resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-22.4.2.tgz#580ba5819bf81a5e48f4fd470e8b81834f45c855"
+  dependencies:
+    chalk "^2.0.1"
+    glob "^7.1.1"
+    jest-environment-jsdom "^22.4.1"
+    jest-environment-node "^22.4.1"
+    jest-get-type "^22.1.0"
+    jest-jasmine2 "^22.4.2"
+    jest-regex-util "^22.1.0"
+    jest-resolve "^22.4.2"
+    jest-util "^22.4.1"
+    jest-validate "^22.4.2"
+    pretty-format "^22.4.0"
+
+jest-diff@^22.4.0:
+  version "22.4.0"
+  resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-22.4.0.tgz#384c2b78519ca44ca126382df53f134289232525"
+  dependencies:
+    chalk "^2.0.1"
+    diff "^3.2.0"
+    jest-get-type "^22.1.0"
+    pretty-format "^22.4.0"
+
+jest-environment-jsdom@^22.4.1:
+  version "22.4.1"
+  resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-22.4.1.tgz#754f408872441740100d3917e5ec40c74de6447f"
+  dependencies:
+    jest-mock "^22.2.0"
+    jest-util "^22.4.1"
+    jsdom "^11.5.1"
+
+jest-environment-node@^22.4.1:
+  version "22.4.1"
+  resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-22.4.1.tgz#418850eb654596b8d6e36c2021cbedbc23df8e16"
+  dependencies:
+    jest-mock "^22.2.0"
+    jest-util "^22.4.1"
+
+jest-get-type@^22.1.0:
+  version "22.1.0"
+  resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-22.1.0.tgz#4e90af298ed6181edc85d2da500dbd2753e0d5a9"
+
+jest-jasmine2@^22.4.2:
+  version "22.4.2"
+  resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-22.4.2.tgz#dfd3d259579ed6f52510d8f1ab692808f0d40691"
+  dependencies:
+    chalk "^2.0.1"
+    co "^4.6.0"
+    expect "^22.4.0"
+    graceful-fs "^4.1.11"
+    is-generator-fn "^1.0.0"
+    jest-diff "^22.4.0"
+    jest-matcher-utils "^22.4.0"
+    jest-message-util "^22.4.0"
+    jest-snapshot "^22.4.0"
+    jest-util "^22.4.1"
+    source-map-support "^0.5.0"
+
+jest-matcher-utils@^22.4.0:
+  version "22.4.0"
+  resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-22.4.0.tgz#d55f5faf2270462736bdf7c7485ee931c9d4b6a1"
+  dependencies:
+    chalk "^2.0.1"
+    jest-get-type "^22.1.0"
+    pretty-format "^22.4.0"
+
+jest-message-util@^22.4.0:
+  version "22.4.0"
+  resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-22.4.0.tgz#e3d861df16d2fee60cb2bc8feac2188a42579642"
+  dependencies:
+    "@babel/code-frame" "^7.0.0-beta.35"
+    chalk "^2.0.1"
+    micromatch "^2.3.11"
+    slash "^1.0.0"
+    stack-utils "^1.0.1"
+
+jest-mock@^22.2.0:
+  version "22.2.0"
+  resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-22.2.0.tgz#444b3f9488a7473adae09bc8a77294afded397a7"
+
+jest-regex-util@^22.1.0:
+  version "22.1.0"
+  resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-22.1.0.tgz#5daf2fe270074b6da63e5d85f1c9acc866768f53"
+
+jest-resolve@^22.4.2:
+  version "22.4.2"
+  resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-22.4.2.tgz#25d88aa4147462c9c1c6a1ba16250d3794c24d00"
+  dependencies:
+    browser-resolve "^1.11.2"
+    chalk "^2.0.1"
+
+jest-snapshot@^22.4.0:
+  version "22.4.0"
+  resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-22.4.0.tgz#03d3ce63f8fa7352388afc6a3c8b5ccc3a180ed7"
+  dependencies:
+    chalk "^2.0.1"
+    jest-diff "^22.4.0"
+    jest-matcher-utils "^22.4.0"
+    mkdirp "^0.5.1"
+    natural-compare "^1.4.0"
+    pretty-format "^22.4.0"
+
+jest-util@^22.4.1:
+  version "22.4.1"
+  resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-22.4.1.tgz#dd17c3bdb067f8e90591563ec0c42bf847dc249f"
+  dependencies:
+    callsites "^2.0.0"
+    chalk "^2.0.1"
+    graceful-fs "^4.1.11"
+    is-ci "^1.0.10"
+    jest-message-util "^22.4.0"
+    mkdirp "^0.5.1"
+    source-map "^0.6.0"
+
+jest-validate@^22.4.0, jest-validate@^22.4.2:
+  version "22.4.2"
+  resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-22.4.2.tgz#e789a4e056173bf97fe797a2df2d52105c57d4f4"
+  dependencies:
+    chalk "^2.0.1"
+    jest-config "^22.4.2"
+    jest-get-type "^22.1.0"
+    leven "^2.1.0"
+    pretty-format "^22.4.0"
+
+js-tokens@^3.0.0, js-tokens@^3.0.2:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
+
+js-yaml@3.x, js-yaml@^3.9.0, js-yaml@^3.9.1:
+  version "3.11.0"
+  resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.11.0.tgz#597c1a8bd57152f26d622ce4117851a51f5ebaef"
+  dependencies:
+    argparse "^1.0.7"
+    esprima "^4.0.0"
+
+jsbn@~0.1.0:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
+
+jsdom@^11.5.1:
+  version "11.6.2"
+  resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.6.2.tgz#25d1ef332d48adf77fc5221fe2619967923f16bb"
+  dependencies:
+    abab "^1.0.4"
+    acorn "^5.3.0"
+    acorn-globals "^4.1.0"
+    array-equal "^1.0.0"
+    browser-process-hrtime "^0.1.2"
+    content-type-parser "^1.0.2"
+    cssom ">= 0.3.2 < 0.4.0"
+    cssstyle ">= 0.2.37 < 0.3.0"
+    domexception "^1.0.0"
+    escodegen "^1.9.0"
+    html-encoding-sniffer "^1.0.2"
+    left-pad "^1.2.0"
+    nwmatcher "^1.4.3"
+    parse5 "4.0.0"
+    pn "^1.1.0"
+    request "^2.83.0"
+    request-promise-native "^1.0.5"
+    sax "^1.2.4"
+    symbol-tree "^3.2.2"
+    tough-cookie "^2.3.3"
+    w3c-hr-time "^1.0.1"
+    webidl-conversions "^4.0.2"
+    whatwg-encoding "^1.0.3"
+    whatwg-url "^6.4.0"
+    ws "^4.0.0"
+    xml-name-validator "^3.0.0"
+
+jsesc@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b"
+
+jsesc@^2.5.1:
+  version "2.5.1"
+  resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.1.tgz#e421a2a8e20d6b0819df28908f782526b96dd1fe"
+
+jsesc@~0.5.0:
+  version "0.5.0"
+  resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
+
+json-loader@^0.5.4:
+  version "0.5.7"
+  resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.7.tgz#dca14a70235ff82f0ac9a3abeb60d337a365185d"
+
+json-parse-better-errors@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.1.tgz#50183cd1b2d25275de069e9e71b467ac9eab973a"
+
+json-schema-traverse@^0.3.0:
+  version "0.3.1"
+  resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340"
+
+json-schema@0.2.3:
+  version "0.2.3"
+  resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
+
+json-stable-stringify-without-jsonify@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
+
+json-stable-stringify@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af"
+  dependencies:
+    jsonify "~0.0.0"
+
+json-stable-stringify@~0.0.0:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz#611c23e814db375527df851193db59dd2af27f45"
+  dependencies:
+    jsonify "~0.0.0"
+
+json-stringify-safe@5.0.x, json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.0, json-stringify-safe@~5.0.1:
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
+
+json3@3.3.2:
+  version "3.3.2"
+  resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1"
+
+json5@^0.5.0, json5@^0.5.1:
+  version "0.5.1"
+  resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
+
+jsonfile@^2.1.0:
+  version "2.4.0"
+  resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8"
+  optionalDependencies:
+    graceful-fs "^4.1.6"
+
+jsonify@~0.0.0:
+  version "0.0.0"
+  resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73"
+
+jsonparse@^1.2.0:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280"
+
+jsonpointer@^4.0.0:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9"
+
+jsprim@^1.2.2:
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2"
+  dependencies:
+    assert-plus "1.0.0"
+    extsprintf "1.3.0"
+    json-schema "0.2.3"
+    verror "1.10.0"
+
+karma-chrome-launcher@^2.1.1:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/karma-chrome-launcher/-/karma-chrome-launcher-2.2.0.tgz#cf1b9d07136cc18fe239327d24654c3dbc368acf"
+  dependencies:
+    fs-access "^1.0.0"
+    which "^1.2.1"
+
+karma-coverage@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/karma-coverage/-/karma-coverage-1.1.1.tgz#5aff8b39cf6994dc22de4c84362c76001b637cf6"
+  dependencies:
+    dateformat "^1.0.6"
+    istanbul "^0.4.0"
+    lodash "^3.8.0"
+    minimatch "^3.0.0"
+    source-map "^0.5.1"
+
+karma-firefox-launcher@^1.0.1:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/karma-firefox-launcher/-/karma-firefox-launcher-1.1.0.tgz#2c47030452f04531eb7d13d4fc7669630bb93339"
+
+karma-jasmine@^1.1.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/karma-jasmine/-/karma-jasmine-1.1.1.tgz#6fe840e75a11600c9d91e84b33c458e1c46a3529"
+
+karma-mocha-reporter@^2.2.3:
+  version "2.2.5"
+  resolved "https://registry.yarnpkg.com/karma-mocha-reporter/-/karma-mocha-reporter-2.2.5.tgz#15120095e8ed819186e47a0b012f3cd741895560"
+  dependencies:
+    chalk "^2.1.0"
+    log-symbols "^2.1.0"
+    strip-ansi "^4.0.0"
+
+karma-phantomjs-launcher@^1.0.4:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/karma-phantomjs-launcher/-/karma-phantomjs-launcher-1.0.4.tgz#d23ca34801bda9863ad318e3bb4bd4062b13acd2"
+  dependencies:
+    lodash "^4.0.1"
+    phantomjs-prebuilt "^2.1.7"
+
+karma-safari-launcher@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/karma-safari-launcher/-/karma-safari-launcher-1.0.0.tgz#96982a2cc47d066aae71c553babb28319115a2ce"
+
+karma-sauce-launcher@^1.1.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/karma-sauce-launcher/-/karma-sauce-launcher-1.2.0.tgz#6f2558ddef3cf56879fa27540c8ae9f8bfd16bca"
+  dependencies:
+    q "^1.5.0"
+    sauce-connect-launcher "^1.2.2"
+    saucelabs "^1.4.0"
+    wd "^1.4.0"
+
+karma-sourcemap-loader@^0.3.7:
+  version "0.3.7"
+  resolved "https://registry.yarnpkg.com/karma-sourcemap-loader/-/karma-sourcemap-loader-0.3.7.tgz#91322c77f8f13d46fed062b042e1009d4c4505d8"
+  dependencies:
+    graceful-fs "^4.1.2"
+
+karma-webpack@^2.0.3:
+  version "2.0.13"
+  resolved "https://registry.yarnpkg.com/karma-webpack/-/karma-webpack-2.0.13.tgz#cf56e3056c15b7747a0bb2140fc9a6be41dd9f02"
+  dependencies:
+    async "^2.0.0"
+    babel-runtime "^6.0.0"
+    loader-utils "^1.0.0"
+    lodash "^4.0.0"
+    source-map "^0.5.6"
+    webpack-dev-middleware "^1.12.0"
+
+karma@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/karma/-/karma-2.0.0.tgz#a02698dd7f0f05ff5eb66ab8f65582490b512e58"
+  dependencies:
+    bluebird "^3.3.0"
+    body-parser "^1.16.1"
+    browserify "^14.5.0"
+    chokidar "^1.4.1"
+    colors "^1.1.0"
+    combine-lists "^1.0.0"
+    connect "^3.6.0"
+    core-js "^2.2.0"
+    di "^0.0.1"
+    dom-serialize "^2.2.0"
+    expand-braces "^0.1.1"
+    glob "^7.1.1"
+    graceful-fs "^4.1.2"
+    http-proxy "^1.13.0"
+    isbinaryfile "^3.0.0"
+    lodash "^4.17.4"
+    log4js "^2.3.9"
+    mime "^1.3.4"
+    minimatch "^3.0.2"
+    optimist "^0.6.1"
+    qjobs "^1.1.4"
+    range-parser "^1.2.0"
+    rimraf "^2.6.0"
+    safe-buffer "^5.0.1"
+    socket.io "2.0.4"
+    source-map "^0.6.1"
+    tmp "0.0.33"
+    useragent "^2.1.12"
+
+kew@^0.7.0:
+  version "0.7.0"
+  resolved "https://registry.yarnpkg.com/kew/-/kew-0.7.0.tgz#79d93d2d33363d6fdd2970b335d9141ad591d79b"
+
+kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0:
+  version "3.2.2"
+  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
+  dependencies:
+    is-buffer "^1.1.5"
+
+kind-of@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57"
+  dependencies:
+    is-buffer "^1.1.5"
+
+kind-of@^5.0.0:
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d"
+
+kind-of@^6.0.0, kind-of@^6.0.2:
+  version "6.0.2"
+  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051"
+
+klaw@^1.0.0:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439"
+  optionalDependencies:
+    graceful-fs "^4.1.9"
+
+labeled-stream-splicer@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/labeled-stream-splicer/-/labeled-stream-splicer-2.0.0.tgz#a52e1d138024c00b86b1c0c91f677918b8ae0a59"
+  dependencies:
+    inherits "^2.0.1"
+    isarray "~0.0.1"
+    stream-splicer "^2.0.0"
+
+lazy-cache@^1.0.3:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e"
+
+lazy-cache@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-2.0.2.tgz#b9190a4f913354694840859f8a8f7084d8822264"
+  dependencies:
+    set-getter "^0.1.0"
+
+lazystream@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4"
+  dependencies:
+    readable-stream "^2.0.5"
+
+lcid@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835"
+  dependencies:
+    invert-kv "^1.0.0"
+
+left-pad@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.2.0.tgz#d30a73c6b8201d8f7d8e7956ba9616087a68e0ee"
+
+leven@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580"
+
+levn@^0.3.0, levn@~0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
+  dependencies:
+    prelude-ls "~1.1.2"
+    type-check "~0.3.2"
+
+lexical-scope@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/lexical-scope/-/lexical-scope-1.2.0.tgz#fcea5edc704a4b3a8796cdca419c3a0afaf22df4"
+  dependencies:
+    astw "^2.0.0"
+
+libbase64@0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/libbase64/-/libbase64-0.1.0.tgz#62351a839563ac5ff5bd26f12f60e9830bb751e6"
+
+libmime@3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/libmime/-/libmime-3.0.0.tgz#51a1a9e7448ecbd32cda54421675bb21bc093da6"
+  dependencies:
+    iconv-lite "0.4.15"
+    libbase64 "0.1.0"
+    libqp "1.1.0"
+
+libqp@1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/libqp/-/libqp-1.1.0.tgz#f5e6e06ad74b794fb5b5b66988bf728ef1dedbe8"
+
+lint-staged@^7.0.0:
+  version "7.0.0"
+  resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-7.0.0.tgz#57926c63201e7bd38ca0576d74391efa699b4a9d"
+  dependencies:
+    app-root-path "^2.0.1"
+    chalk "^2.3.1"
+    commander "^2.14.1"
+    cosmiconfig "^4.0.0"
+    debug "^3.1.0"
+    dedent "^0.7.0"
+    execa "^0.9.0"
+    find-parent-dir "^0.3.0"
+    is-glob "^4.0.0"
+    jest-validate "^22.4.0"
+    listr "^0.13.0"
+    lodash "^4.17.5"
+    log-symbols "^2.2.0"
+    micromatch "^3.1.8"
+    npm-which "^3.0.1"
+    p-map "^1.1.1"
+    path-is-inside "^1.0.2"
+    pify "^3.0.0"
+    please-upgrade-node "^3.0.1"
+    staged-git-files "1.1.0"
+    stringify-object "^3.2.2"
+
+listr-silent-renderer@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz#924b5a3757153770bf1a8e3fbf74b8bbf3f9242e"
+
+listr-update-renderer@^0.4.0:
+  version "0.4.0"
+  resolved "https://registry.yarnpkg.com/listr-update-renderer/-/listr-update-renderer-0.4.0.tgz#344d980da2ca2e8b145ba305908f32ae3f4cc8a7"
+  dependencies:
+    chalk "^1.1.3"
+    cli-truncate "^0.2.1"
+    elegant-spinner "^1.0.1"
+    figures "^1.7.0"
+    indent-string "^3.0.0"
+    log-symbols "^1.0.2"
+    log-update "^1.0.2"
+    strip-ansi "^3.0.1"
+
+listr-verbose-renderer@^0.4.0:
+  version "0.4.1"
+  resolved "https://registry.yarnpkg.com/listr-verbose-renderer/-/listr-verbose-renderer-0.4.1.tgz#8206f4cf6d52ddc5827e5fd14989e0e965933a35"
+  dependencies:
+    chalk "^1.1.3"
+    cli-cursor "^1.0.2"
+    date-fns "^1.27.2"
+    figures "^1.7.0"
+
+listr@^0.13.0:
+  version "0.13.0"
+  resolved "https://registry.yarnpkg.com/listr/-/listr-0.13.0.tgz#20bb0ba30bae660ee84cc0503df4be3d5623887d"
+  dependencies:
+    chalk "^1.1.3"
+    cli-truncate "^0.2.1"
+    figures "^1.7.0"
+    indent-string "^2.1.0"
+    is-observable "^0.2.0"
+    is-promise "^2.1.0"
+    is-stream "^1.1.0"
+    listr-silent-renderer "^1.1.1"
+    listr-update-renderer "^0.4.0"
+    listr-verbose-renderer "^0.4.0"
+    log-symbols "^1.0.2"
+    log-update "^1.0.2"
+    ora "^0.2.3"
+    p-map "^1.1.1"
+    rxjs "^5.4.2"
+    stream-to-observable "^0.2.0"
+    strip-ansi "^3.0.1"
+
+load-json-file@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0"
+  dependencies:
+    graceful-fs "^4.1.2"
+    parse-json "^2.2.0"
+    pify "^2.0.0"
+    pinkie-promise "^2.0.0"
+    strip-bom "^2.0.0"
+
+load-json-file@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8"
+  dependencies:
+    graceful-fs "^4.1.2"
+    parse-json "^2.2.0"
+    pify "^2.0.0"
+    strip-bom "^3.0.0"
+
+load-json-file@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b"
+  dependencies:
+    graceful-fs "^4.1.2"
+    parse-json "^4.0.0"
+    pify "^3.0.0"
+    strip-bom "^3.0.0"
+
+loader-fs-cache@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/loader-fs-cache/-/loader-fs-cache-1.0.1.tgz#56e0bf08bd9708b26a765b68509840c8dec9fdbc"
+  dependencies:
+    find-cache-dir "^0.1.1"
+    mkdirp "0.5.1"
+
+loader-runner@^2.3.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2"
+
+loader-utils@^1.0.0, loader-utils@^1.0.2, loader-utils@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd"
+  dependencies:
+    big.js "^3.1.3"
+    emojis-list "^2.0.0"
+    json5 "^0.5.0"
+
+locate-path@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"
+  dependencies:
+    p-locate "^2.0.0"
+    path-exists "^3.0.0"
+
+lodash._arraycopy@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/lodash._arraycopy/-/lodash._arraycopy-3.0.0.tgz#76e7b7c1f1fb92547374878a562ed06a3e50f6e1"
+
+lodash._arrayeach@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/lodash._arrayeach/-/lodash._arrayeach-3.0.0.tgz#bab156b2a90d3f1bbd5c653403349e5e5933ef9e"
+
+lodash._baseassign@^3.0.0:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e"
+  dependencies:
+    lodash._basecopy "^3.0.0"
+    lodash.keys "^3.0.0"
+
+lodash._baseclone@^3.0.0:
+  version "3.3.0"
+  resolved "https://registry.yarnpkg.com/lodash._baseclone/-/lodash._baseclone-3.3.0.tgz#303519bf6393fe7e42f34d8b630ef7794e3542b7"
+  dependencies:
+    lodash._arraycopy "^3.0.0"
+    lodash._arrayeach "^3.0.0"
+    lodash._baseassign "^3.0.0"
+    lodash._basefor "^3.0.0"
+    lodash.isarray "^3.0.0"
+    lodash.keys "^3.0.0"
+
+lodash._baseclone@^4.0.0:
+  version "4.5.7"
+  resolved "https://registry.yarnpkg.com/lodash._baseclone/-/lodash._baseclone-4.5.7.tgz#ce42ade08384ef5d62fa77c30f61a46e686f8434"
+
+lodash._basecopy@^3.0.0:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36"
+
+lodash._basecreate@^3.0.0:
+  version "3.0.3"
+  resolved "https://registry.yarnpkg.com/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz#1bc661614daa7fc311b7d03bf16806a0213cf821"
+
+lodash._basefor@^3.0.0:
+  version "3.0.3"
+  resolved "https://registry.yarnpkg.com/lodash._basefor/-/lodash._basefor-3.0.3.tgz#7550b4e9218ef09fad24343b612021c79b4c20c2"
+
+lodash._bindcallback@^3.0.0:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e"
+
+lodash._getnative@^3.0.0:
+  version "3.9.1"
+  resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5"
+
+lodash._isiterateecall@^3.0.0:
+  version "3.0.9"
+  resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c"
+
+lodash._reinterpolate@~3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d"
+
+lodash._stack@^4.0.0:
+  version "4.1.3"
+  resolved "https://registry.yarnpkg.com/lodash._stack/-/lodash._stack-4.1.3.tgz#751aa76c1b964b047e76d14fc72a093fcb5e2dd0"
+
+lodash.clone@3.0.3:
+  version "3.0.3"
+  resolved "https://registry.yarnpkg.com/lodash.clone/-/lodash.clone-3.0.3.tgz#84688c73d32b5a90ca25616963f189252a997043"
+  dependencies:
+    lodash._baseclone "^3.0.0"
+    lodash._bindcallback "^3.0.0"
+    lodash._isiterateecall "^3.0.0"
+
+lodash.create@3.1.1:
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/lodash.create/-/lodash.create-3.1.1.tgz#d7f2849f0dbda7e04682bb8cd72ab022461debe7"
+  dependencies:
+    lodash._baseassign "^3.0.0"
+    lodash._basecreate "^3.0.0"
+    lodash._isiterateecall "^3.0.0"
+
+lodash.defaultsdeep@4.3.2:
+  version "4.3.2"
+  resolved "https://registry.yarnpkg.com/lodash.defaultsdeep/-/lodash.defaultsdeep-4.3.2.tgz#6c1a586e6c5647b0e64e2d798141b8836158be8a"
+  dependencies:
+    lodash._baseclone "^4.0.0"
+    lodash._stack "^4.0.0"
+    lodash.isplainobject "^4.0.0"
+    lodash.keysin "^4.0.0"
+    lodash.mergewith "^4.0.0"
+    lodash.rest "^4.0.0"
+
+lodash.isarguments@^3.0.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a"
+
+lodash.isarray@^3.0.0:
+  version "3.0.4"
+  resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55"
+
+lodash.isplainobject@^4.0.0:
+  version "4.0.6"
+  resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb"
+
+lodash.keys@^3.0.0:
+  version "3.1.2"
+  resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a"
+  dependencies:
+    lodash._getnative "^3.0.0"
+    lodash.isarguments "^3.0.0"
+    lodash.isarray "^3.0.0"
+
+lodash.keysin@^4.0.0:
+  version "4.2.0"
+  resolved "https://registry.yarnpkg.com/lodash.keysin/-/lodash.keysin-4.2.0.tgz#8cc3fb35c2d94acc443a1863e02fa40799ea6f28"
+
+lodash.map@^4.5.1:
+  version "4.6.0"
+  resolved "https://registry.yarnpkg.com/lodash.map/-/lodash.map-4.6.0.tgz#771ec7839e3473d9c4cde28b19394c3562f4f6d3"
+
+lodash.memoize@~3.0.3:
+  version "3.0.4"
+  resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-3.0.4.tgz#2dcbd2c287cbc0a55cc42328bd0c736150d53e3f"
+
+lodash.mergewith@^4.0.0:
+  version "4.6.1"
+  resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz#639057e726c3afbdb3e7d42741caa8d6e4335927"
+
+lodash.rest@^4.0.0:
+  version "4.0.5"
+  resolved "https://registry.yarnpkg.com/lodash.rest/-/lodash.rest-4.0.5.tgz#954ef75049262038c96d1fc98b28fdaf9f0772aa"
+
+lodash.sortby@^4.7.0:
+  version "4.7.0"
+  resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438"
+
+lodash.template@^4.0.2, lodash.template@^4.4.0:
+  version "4.4.0"
+  resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.4.0.tgz#e73a0385c8355591746e020b99679c690e68fba0"
+  dependencies:
+    lodash._reinterpolate "~3.0.0"
+    lodash.templatesettings "^4.0.0"
+
+lodash.templatesettings@^4.0.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz#2b4d4e95ba440d915ff08bc899e4553666713316"
+  dependencies:
+    lodash._reinterpolate "~3.0.0"
+
+lodash.uniq@^4.5.0:
+  version "4.5.0"
+  resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
+
+lodash@4.16.2:
+  version "4.16.2"
+  resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.16.2.tgz#3e626db827048a699281a8a125226326cfc0e652"
+
+lodash@4.17.2:
+  version "4.17.2"
+  resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.2.tgz#34a3055babe04ce42467b607d700072c7ff6bf42"
+
+lodash@^3.8.0:
+  version "3.10.1"
+  resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6"
+
+lodash@^4.0.0, lodash@^4.0.1, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.16.6, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0, lodash@^4.5.0, lodash@^4.8.0:
+  version "4.17.5"
+  resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.5.tgz#99a92d65c0272debe8c96b6057bc8fbfa3bed511"
+
+log-symbols@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18"
+  dependencies:
+    chalk "^1.0.0"
+
+log-symbols@^2.1.0, log-symbols@^2.2.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a"
+  dependencies:
+    chalk "^2.0.1"
+
+log-update@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/log-update/-/log-update-1.0.2.tgz#19929f64c4093d2d2e7075a1dad8af59c296b8d1"
+  dependencies:
+    ansi-escapes "^1.0.0"
+    cli-cursor "^1.0.2"
+
+log4js@^2.3.9:
+  version "2.5.3"
+  resolved "https://registry.yarnpkg.com/log4js/-/log4js-2.5.3.tgz#38bb7bde5e9c1c181bd75e8bc128c5cd0409caf1"
+  dependencies:
+    circular-json "^0.5.1"
+    date-format "^1.2.0"
+    debug "^3.1.0"
+    semver "^5.3.0"
+    streamroller "^0.7.0"
+  optionalDependencies:
+    amqplib "^0.5.2"
+    axios "^0.15.3"
+    hipchat-notifier "^1.1.0"
+    loggly "^1.1.0"
+    mailgun-js "^0.7.0"
+    nodemailer "^2.5.0"
+    redis "^2.7.1"
+    slack-node "~0.2.0"
+
+loggly@^1.1.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/loggly/-/loggly-1.1.1.tgz#0a0fc1d3fa3a5ec44fdc7b897beba2a4695cebee"
+  dependencies:
+    json-stringify-safe "5.0.x"
+    request "2.75.x"
+    timespan "2.3.x"
+
+longest@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097"
+
+loose-envify@^1.0.0:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848"
+  dependencies:
+    js-tokens "^3.0.0"
+
+loud-rejection@^1.0.0:
+  version "1.6.0"
+  resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f"
+  dependencies:
+    currently-unhandled "^0.4.1"
+    signal-exit "^3.0.0"
+
+lru-cache@4.1.x, lru-cache@^4.0.1, lru-cache@^4.1.1:
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55"
+  dependencies:
+    pseudomap "^1.0.2"
+    yallist "^2.1.2"
+
+lru-cache@~2.6.5:
+  version "2.6.5"
+  resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.6.5.tgz#e56d6354148ede8d7707b58d143220fd08df0fd5"
+
+magic-string@^0.16.0:
+  version "0.16.0"
+  resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.16.0.tgz#970ebb0da7193301285fb1aa650f39bdd81eb45a"
+  dependencies:
+    vlq "^0.2.1"
+
+magic-string@^0.22.4:
+  version "0.22.4"
+  resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.22.4.tgz#31039b4e40366395618c1d6cf8193c53917475ff"
+  dependencies:
+    vlq "^0.2.1"
+
+mailcomposer@4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/mailcomposer/-/mailcomposer-4.0.1.tgz#0e1c44b2a07cf740ee17dc149ba009f19cadfeb4"
+  dependencies:
+    buildmail "4.0.1"
+    libmime "3.0.0"
+
+mailgun-js@^0.7.0:
+  version "0.7.15"
+  resolved "https://registry.yarnpkg.com/mailgun-js/-/mailgun-js-0.7.15.tgz#ee366a20dac64c3c15c03d6c1b3e0ed795252abb"
+  dependencies:
+    async "~2.1.2"
+    debug "~2.2.0"
+    form-data "~2.1.1"
+    inflection "~1.10.0"
+    is-stream "^1.1.0"
+    path-proxy "~1.0.0"
+    proxy-agent "~2.0.0"
+    q "~1.4.0"
+    tsscmp "~1.0.0"
+
+make-dir@^1.0.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.2.0.tgz#6d6a49eead4aae296c53bbf3a1a008bd6c89469b"
+  dependencies:
+    pify "^3.0.0"
+
+map-cache@^0.2.2:
+  version "0.2.2"
+  resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"
+
+map-obj@^1.0.0, map-obj@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d"
+
+map-obj@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-2.0.0.tgz#a65cd29087a92598b8791257a523e021222ac1f9"
+
+map-visit@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f"
+  dependencies:
+    object-visit "^1.0.0"
+
+md5.js@^1.3.4:
+  version "1.3.4"
+  resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.4.tgz#e9bdbde94a20a5ac18b04340fc5764d5b09d901d"
+  dependencies:
+    hash-base "^3.0.0"
+    inherits "^2.0.1"
+
+media-typer@0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
+
+mem@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76"
+  dependencies:
+    mimic-fn "^1.0.0"
+
+memory-fs@^0.4.0, memory-fs@~0.4.1:
+  version "0.4.1"
+  resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552"
+  dependencies:
+    errno "^0.1.3"
+    readable-stream "^2.0.1"
+
+meow@^3.3.0:
+  version "3.7.0"
+  resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb"
+  dependencies:
+    camelcase-keys "^2.0.0"
+    decamelize "^1.1.2"
+    loud-rejection "^1.0.0"
+    map-obj "^1.0.1"
+    minimist "^1.1.3"
+    normalize-package-data "^2.3.4"
+    object-assign "^4.0.1"
+    read-pkg-up "^1.0.1"
+    redent "^1.0.0"
+    trim-newlines "^1.0.0"
+
+meow@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/meow/-/meow-4.0.0.tgz#fd5855dd008db5b92c552082db1c307cba20b29d"
+  dependencies:
+    camelcase-keys "^4.0.0"
+    decamelize-keys "^1.0.0"
+    loud-rejection "^1.0.0"
+    minimist "^1.1.3"
+    minimist-options "^3.0.1"
+    normalize-package-data "^2.3.4"
+    read-pkg-up "^3.0.0"
+    redent "^2.0.0"
+    trim-newlines "^2.0.0"
+
+merge@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da"
+
+micromatch@^2.1.5, micromatch@^2.3.11, micromatch@^2.3.7:
+  version "2.3.11"
+  resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565"
+  dependencies:
+    arr-diff "^2.0.0"
+    array-unique "^0.2.1"
+    braces "^1.8.2"
+    expand-brackets "^0.1.4"
+    extglob "^0.3.1"
+    filename-regex "^2.0.0"
+    is-extglob "^1.0.0"
+    is-glob "^2.0.1"
+    kind-of "^3.0.2"
+    normalize-path "^2.0.1"
+    object.omit "^2.0.0"
+    parse-glob "^3.0.4"
+    regex-cache "^0.4.2"
+
+micromatch@^3.1.4, micromatch@^3.1.8:
+  version "3.1.9"
+  resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.9.tgz#15dc93175ae39e52e93087847096effc73efcf89"
+  dependencies:
+    arr-diff "^4.0.0"
+    array-unique "^0.3.2"
+    braces "^2.3.1"
+    define-property "^2.0.2"
+    extend-shallow "^3.0.2"
+    extglob "^2.0.4"
+    fragment-cache "^0.2.1"
+    kind-of "^6.0.2"
+    nanomatch "^1.2.9"
+    object.pick "^1.3.0"
+    regex-not "^1.0.0"
+    snapdragon "^0.8.1"
+    to-regex "^3.0.1"
+
+miller-rabin@^4.0.0:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d"
+  dependencies:
+    bn.js "^4.0.0"
+    brorand "^1.0.1"
+
+mime-db@~1.33.0:
+  version "1.33.0"
+  resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db"
+
+mime-types@^2.1.11, mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.18, mime-types@~2.1.7:
+  version "2.1.18"
+  resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8"
+  dependencies:
+    mime-db "~1.33.0"
+
+mime-types@~1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-1.0.2.tgz#995ae1392ab8affcbfcb2641dd054e943c0d5dce"
+
+mime@^1.3.4, mime@^1.4.1, mime@^1.5.0:
+  version "1.6.0"
+  resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
+
+mime@~1.2.11:
+  version "1.2.11"
+  resolved "https://registry.yarnpkg.com/mime/-/mime-1.2.11.tgz#58203eed86e3a5ef17aed2b7d9ebd47f0a60dd10"
+
+mimic-fn@^1.0.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022"
+
+minimalistic-assert@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz#702be2dda6b37f4836bcb3f5db56641b64a1d3d3"
+
+minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
+
+"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.4:
+  version "3.0.4"
+  resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
+  dependencies:
+    brace-expansion "^1.1.7"
+
+minimatch@3.0.3:
+  version "3.0.3"
+  resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774"
+  dependencies:
+    brace-expansion "^1.0.0"
+
+minimist-options@^3.0.1:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-3.0.2.tgz#fba4c8191339e13ecf4d61beb03f070103f3d954"
+  dependencies:
+    arrify "^1.0.1"
+    is-plain-obj "^1.1.0"
+
+minimist@0.0.8:
+  version "0.0.8"
+  resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
+
+minimist@1.2.0, minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
+
+minimist@~0.0.1:
+  version "0.0.10"
+  resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf"
+
+mixin-deep@^1.2.0:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe"
+  dependencies:
+    for-in "^1.0.2"
+    is-extendable "^1.0.1"
+
+mkdirp@0.5.0:
+  version "0.5.0"
+  resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.0.tgz#1d73076a6df986cd9344e15e71fcc05a4c9abf12"
+  dependencies:
+    minimist "0.0.8"
+
+mkdirp@0.5.1, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.1, mkdirp@~0.5.0:
+  version "0.5.1"
+  resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
+  dependencies:
+    minimist "0.0.8"
+
+mkpath@1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/mkpath/-/mkpath-1.0.0.tgz#ebb3a977e7af1c683ae6fda12b545a6ba6c5853d"
+
+mocha-nightwatch@3.2.2:
+  version "3.2.2"
+  resolved "https://registry.yarnpkg.com/mocha-nightwatch/-/mocha-nightwatch-3.2.2.tgz#91bcb9b3bde057dd7677c78125e491e58d66647c"
+  dependencies:
+    browser-stdout "1.3.0"
+    commander "2.9.0"
+    debug "2.2.0"
+    diff "1.4.0"
+    escape-string-regexp "1.0.5"
+    glob "7.0.5"
+    growl "1.9.2"
+    json3 "3.3.2"
+    lodash.create "3.1.1"
+    mkdirp "0.5.1"
+    supports-color "3.1.2"
+
+modify-values@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.0.tgz#e2b6cdeb9ce19f99317a53722f3dbf5df5eaaab2"
+
+module-deps@^4.0.8:
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/module-deps/-/module-deps-4.1.1.tgz#23215833f1da13fd606ccb8087b44852dcb821fd"
+  dependencies:
+    JSONStream "^1.0.3"
+    browser-resolve "^1.7.0"
+    cached-path-relative "^1.0.0"
+    concat-stream "~1.5.0"
+    defined "^1.0.0"
+    detective "^4.0.0"
+    duplexer2 "^0.1.2"
+    inherits "^2.0.1"
+    parents "^1.0.0"
+    readable-stream "^2.0.2"
+    resolve "^1.1.3"
+    stream-combiner2 "^1.1.1"
+    subarg "^1.0.0"
+    through2 "^2.0.0"
+    xtend "^4.0.0"
+
+ms@0.7.1:
+  version "0.7.1"
+  resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098"
+
+ms@2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
+
+mute-stream@0.0.6:
+  version "0.0.6"
+  resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.6.tgz#48962b19e169fd1dfc240b3f1e7317627bbc47db"
+
+mute-stream@0.0.7:
+  version "0.0.7"
+  resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab"
+
+nan@^2.3.0:
+  version "2.9.2"
+  resolved "https://registry.yarnpkg.com/nan/-/nan-2.9.2.tgz#f564d75f5f8f36a6d9456cca7a6c4fe488ab7866"
+
+nanomatch@^1.2.9:
+  version "1.2.9"
+  resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.9.tgz#879f7150cb2dab7a471259066c104eee6e0fa7c2"
+  dependencies:
+    arr-diff "^4.0.0"
+    array-unique "^0.3.2"
+    define-property "^2.0.2"
+    extend-shallow "^3.0.2"
+    fragment-cache "^0.2.1"
+    is-odd "^2.0.0"
+    is-windows "^1.0.2"
+    kind-of "^6.0.2"
+    object.pick "^1.3.0"
+    regex-not "^1.0.0"
+    snapdragon "^0.8.1"
+    to-regex "^3.0.1"
+
+natural-compare@^1.4.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
+
+negotiator@0.6.1:
+  version "0.6.1"
+  resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9"
+
+neo-async@^2.5.0:
+  version "2.5.0"
+  resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.0.tgz#76b1c823130cca26acfbaccc8fbaf0a2fa33b18f"
+
+netmask@~1.0.4:
+  version "1.0.6"
+  resolved "https://registry.yarnpkg.com/netmask/-/netmask-1.0.6.tgz#20297e89d86f6f6400f250d9f4f6b4c1945fcd35"
+
+nightwatch-helpers@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/nightwatch-helpers/-/nightwatch-helpers-1.2.0.tgz#cdefeb7635074a141825a7b6d1b955b6d7810a0f"
+
+nightwatch@^0.9.16:
+  version "0.9.20"
+  resolved "https://registry.yarnpkg.com/nightwatch/-/nightwatch-0.9.20.tgz#156d17cd058cbc31f43ab18e915f7ec297fb53e0"
+  dependencies:
+    chai-nightwatch "~0.1.x"
+    ejs "2.5.7"
+    lodash.clone "3.0.3"
+    lodash.defaultsdeep "4.3.2"
+    minimatch "3.0.3"
+    mkpath "1.0.0"
+    mocha-nightwatch "3.2.2"
+    optimist "0.6.1"
+    proxy-agent "2.0.0"
+    q "1.4.1"
+
+node-libs-browser@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.1.0.tgz#5f94263d404f6e44767d726901fff05478d600df"
+  dependencies:
+    assert "^1.1.1"
+    browserify-zlib "^0.2.0"
+    buffer "^4.3.0"
+    console-browserify "^1.1.0"
+    constants-browserify "^1.0.0"
+    crypto-browserify "^3.11.0"
+    domain-browser "^1.1.1"
+    events "^1.0.0"
+    https-browserify "^1.0.0"
+    os-browserify "^0.3.0"
+    path-browserify "0.0.0"
+    process "^0.11.10"
+    punycode "^1.2.4"
+    querystring-es3 "^0.2.0"
+    readable-stream "^2.3.3"
+    stream-browserify "^2.0.1"
+    stream-http "^2.7.2"
+    string_decoder "^1.0.0"
+    timers-browserify "^2.0.4"
+    tty-browserify "0.0.0"
+    url "^0.11.0"
+    util "^0.10.3"
+    vm-browserify "0.0.4"
+
+node-pre-gyp@^0.6.39:
+  version "0.6.39"
+  resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.39.tgz#c00e96860b23c0e1420ac7befc5044e1d78d8649"
+  dependencies:
+    detect-libc "^1.0.2"
+    hawk "3.1.3"
+    mkdirp "^0.5.1"
+    nopt "^4.0.1"
+    npmlog "^4.0.2"
+    rc "^1.1.7"
+    request "2.81.0"
+    rimraf "^2.6.1"
+    semver "^5.3.0"
+    tar "^2.2.1"
+    tar-pack "^3.4.0"
+
+node-uuid@~1.4.0, node-uuid@~1.4.7:
+  version "1.4.8"
+  resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.8.tgz#b040eb0923968afabf8d32fb1f17f1167fdab907"
+
+nodemailer-direct-transport@3.3.2:
+  version "3.3.2"
+  resolved "https://registry.yarnpkg.com/nodemailer-direct-transport/-/nodemailer-direct-transport-3.3.2.tgz#e96fafb90358560947e569017d97e60738a50a86"
+  dependencies:
+    nodemailer-shared "1.1.0"
+    smtp-connection "2.12.0"
+
+nodemailer-fetch@1.6.0:
+  version "1.6.0"
+  resolved "https://registry.yarnpkg.com/nodemailer-fetch/-/nodemailer-fetch-1.6.0.tgz#79c4908a1c0f5f375b73fe888da9828f6dc963a4"
+
+nodemailer-shared@1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/nodemailer-shared/-/nodemailer-shared-1.1.0.tgz#cf5994e2fd268d00f5cf0fa767a08169edb07ec0"
+  dependencies:
+    nodemailer-fetch "1.6.0"
+
+nodemailer-smtp-pool@2.8.2:
+  version "2.8.2"
+  resolved "https://registry.yarnpkg.com/nodemailer-smtp-pool/-/nodemailer-smtp-pool-2.8.2.tgz#2eb94d6cf85780b1b4725ce853b9cbd5e8da8c72"
+  dependencies:
+    nodemailer-shared "1.1.0"
+    nodemailer-wellknown "0.1.10"
+    smtp-connection "2.12.0"
+
+nodemailer-smtp-transport@2.7.2:
+  version "2.7.2"
+  resolved "https://registry.yarnpkg.com/nodemailer-smtp-transport/-/nodemailer-smtp-transport-2.7.2.tgz#03d71c76314f14ac7dbc7bf033a6a6d16d67fb77"
+  dependencies:
+    nodemailer-shared "1.1.0"
+    nodemailer-wellknown "0.1.10"
+    smtp-connection "2.12.0"
+
+nodemailer-wellknown@0.1.10:
+  version "0.1.10"
+  resolved "https://registry.yarnpkg.com/nodemailer-wellknown/-/nodemailer-wellknown-0.1.10.tgz#586db8101db30cb4438eb546737a41aad0cf13d5"
+
+nodemailer@^2.5.0:
+  version "2.7.2"
+  resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-2.7.2.tgz#f242e649aeeae39b6c7ed740ef7b061c404d30f9"
+  dependencies:
+    libmime "3.0.0"
+    mailcomposer "4.0.1"
+    nodemailer-direct-transport "3.3.2"
+    nodemailer-shared "1.1.0"
+    nodemailer-smtp-pool "2.8.2"
+    nodemailer-smtp-transport "2.7.2"
+    socks "1.1.9"
+
+nopt@3.x:
+  version "3.0.6"
+  resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9"
+  dependencies:
+    abbrev "1"
+
+nopt@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d"
+  dependencies:
+    abbrev "1"
+    osenv "^0.1.4"
+
+normalize-package-data@^2.3.0, normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.3.5:
+  version "2.4.0"
+  resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f"
+  dependencies:
+    hosted-git-info "^2.1.4"
+    is-builtin-module "^1.0.0"
+    semver "2 || 3 || 4 || 5"
+    validate-npm-package-license "^3.0.1"
+
+normalize-path@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-1.0.0.tgz#32d0e472f91ff345701c15a8311018d3b0a90379"
+
+normalize-path@^2.0.0, normalize-path@^2.0.1, normalize-path@^2.1.1:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
+  dependencies:
+    remove-trailing-separator "^1.0.1"
+
+npm-path@^2.0.2:
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/npm-path/-/npm-path-2.0.4.tgz#c641347a5ff9d6a09e4d9bce5580c4f505278e64"
+  dependencies:
+    which "^1.2.10"
+
+npm-run-path@^2.0.0:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f"
+  dependencies:
+    path-key "^2.0.0"
+
+npm-which@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/npm-which/-/npm-which-3.0.1.tgz#9225f26ec3a285c209cae67c3b11a6b4ab7140aa"
+  dependencies:
+    commander "^2.9.0"
+    npm-path "^2.0.2"
+    which "^1.2.10"
+
+npmlog@^4.0.2:
+  version "4.1.2"
+  resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
+  dependencies:
+    are-we-there-yet "~1.1.2"
+    console-control-strings "~1.1.0"
+    gauge "~2.7.3"
+    set-blocking "~2.0.0"
+
+null-check@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/null-check/-/null-check-1.0.0.tgz#977dffd7176012b9ec30d2a39db5cf72a0439edd"
+
+number-is-nan@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
+
+nwmatcher@^1.4.3:
+  version "1.4.3"
+  resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.4.3.tgz#64348e3b3d80f035b40ac11563d278f8b72db89c"
+
+oauth-sign@~0.4.0:
+  version "0.4.0"
+  resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.4.0.tgz#f22956f31ea7151a821e5f2fb32c113cad8b9f69"
+
+oauth-sign@~0.8.1, oauth-sign@~0.8.2:
+  version "0.8.2"
+  resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43"
+
+object-assign@^4.0.1, object-assign@^4.1.0:
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+
+object-component@0.0.3:
+  version "0.0.3"
+  resolved "https://registry.yarnpkg.com/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291"
+
+object-copy@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c"
+  dependencies:
+    copy-descriptor "^0.1.0"
+    define-property "^0.2.5"
+    kind-of "^3.0.3"
+
+object-hash@^1.1.4:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-1.2.0.tgz#e96af0e96981996a1d47f88ead8f74f1ebc4422b"
+
+object-visit@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb"
+  dependencies:
+    isobject "^3.0.0"
+
+object.omit@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa"
+  dependencies:
+    for-own "^0.1.4"
+    is-extendable "^0.1.1"
+
+object.pick@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747"
+  dependencies:
+    isobject "^3.0.1"
+
+on-finished@~2.3.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
+  dependencies:
+    ee-first "1.1.1"
+
+once@1.x, once@^1.3.0, once@^1.3.3, once@^1.4.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+  dependencies:
+    wrappy "1"
+
+onetime@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789"
+
+onetime@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4"
+  dependencies:
+    mimic-fn "^1.0.0"
+
+opener@~1.4.0:
+  version "1.4.3"
+  resolved "https://registry.yarnpkg.com/opener/-/opener-1.4.3.tgz#5c6da2c5d7e5831e8ffa3964950f8d6674ac90b8"
+
+optimist@0.6.1, optimist@0.6.x, optimist@^0.6.1:
+  version "0.6.1"
+  resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686"
+  dependencies:
+    minimist "~0.0.1"
+    wordwrap "~0.0.2"
+
+optionator@^0.8.1, optionator@^0.8.2:
+  version "0.8.2"
+  resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64"
+  dependencies:
+    deep-is "~0.1.3"
+    fast-levenshtein "~2.0.4"
+    levn "~0.3.0"
+    prelude-ls "~1.1.2"
+    type-check "~0.3.2"
+    wordwrap "~1.0.0"
+
+ora@^0.2.3:
+  version "0.2.3"
+  resolved "https://registry.yarnpkg.com/ora/-/ora-0.2.3.tgz#37527d220adcd53c39b73571d754156d5db657a4"
+  dependencies:
+    chalk "^1.1.1"
+    cli-cursor "^1.0.2"
+    cli-spinners "^0.1.2"
+    object-assign "^4.0.1"
+
+os-browserify@^0.3.0, os-browserify@~0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27"
+
+os-homedir@^1.0.0, os-homedir@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
+
+os-locale@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2"
+  dependencies:
+    execa "^0.7.0"
+    lcid "^1.0.0"
+    mem "^1.1.0"
+
+os-shim@^0.1.2:
+  version "0.1.3"
+  resolved "https://registry.yarnpkg.com/os-shim/-/os-shim-0.1.3.tgz#6b62c3791cf7909ea35ed46e17658bb417cb3917"
+
+os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.1, os-tmpdir@~1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
+
+osenv@^0.1.4:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410"
+  dependencies:
+    os-homedir "^1.0.0"
+    os-tmpdir "^1.0.0"
+
+p-finally@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
+
+p-limit@^1.1.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.2.0.tgz#0e92b6bedcb59f022c13d0f1949dc82d15909f1c"
+  dependencies:
+    p-try "^1.0.0"
+
+p-locate@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
+  dependencies:
+    p-limit "^1.1.0"
+
+p-map@^1.1.1:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b"
+
+p-try@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"
+
+pac-proxy-agent@1:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-1.1.0.tgz#34a385dfdf61d2f0ecace08858c745d3e791fd4d"
+  dependencies:
+    agent-base "2"
+    debug "2"
+    extend "3"
+    get-uri "2"
+    http-proxy-agent "1"
+    https-proxy-agent "1"
+    pac-resolver "~2.0.0"
+    raw-body "2"
+    socks-proxy-agent "2"
+
+pac-resolver@~2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/pac-resolver/-/pac-resolver-2.0.0.tgz#99b88d2f193fbdeefc1c9a529c1f3260ab5277cd"
+  dependencies:
+    co "~3.0.6"
+    degenerator "~1.0.2"
+    ip "1.0.1"
+    netmask "~1.0.4"
+    thunkify "~2.1.1"
+
+pad-right@^0.2.2:
+  version "0.2.2"
+  resolved "https://registry.yarnpkg.com/pad-right/-/pad-right-0.2.2.tgz#6fbc924045d244f2a2a244503060d3bfc6009774"
+  dependencies:
+    repeat-string "^1.5.2"
+
+pako@~1.0.5:
+  version "1.0.6"
+  resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258"
+
+parents@^1.0.0, parents@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/parents/-/parents-1.0.1.tgz#fedd4d2bf193a77745fe71e371d73c3307d9c751"
+  dependencies:
+    path-platform "~0.11.15"
+
+parse-asn1@^5.0.0:
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.0.tgz#37c4f9b7ed3ab65c74817b5f2480937fbf97c712"
+  dependencies:
+    asn1.js "^4.0.0"
+    browserify-aes "^1.0.0"
+    create-hash "^1.1.0"
+    evp_bytestokey "^1.0.0"
+    pbkdf2 "^3.0.3"
+
+parse-github-repo-url@^1.3.0:
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz#9e7d8bb252a6cb6ba42595060b7bf6df3dbc1f50"
+
+parse-glob@^3.0.4:
+  version "3.0.4"
+  resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c"
+  dependencies:
+    glob-base "^0.3.0"
+    is-dotfile "^1.0.0"
+    is-extglob "^1.0.0"
+    is-glob "^2.0.0"
+
+parse-json@^2.2.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
+  dependencies:
+    error-ex "^1.2.0"
+
+parse-json@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0"
+  dependencies:
+    error-ex "^1.3.1"
+    json-parse-better-errors "^1.0.1"
+
+parse-passwd@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6"
+
+parse5@4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608"
+
+parseqs@0.0.5:
+  version "0.0.5"
+  resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.5.tgz#d5208a3738e46766e291ba2ea173684921a8b89d"
+  dependencies:
+    better-assert "~1.0.0"
+
+parseuri@0.0.5:
+  version "0.0.5"
+  resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.5.tgz#80204a50d4dbb779bfdc6ebe2778d90e4bce320a"
+  dependencies:
+    better-assert "~1.0.0"
+
+parseurl@~1.3.2:
+  version "1.3.2"
+  resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3"
+
+pascalcase@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14"
+
+path-browserify@0.0.0, path-browserify@~0.0.0:
+  version "0.0.0"
+  resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a"
+
+path-dirname@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0"
+
+path-exists@2.1.0, path-exists@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b"
+  dependencies:
+    pinkie-promise "^2.0.0"
+
+path-exists@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
+
+path-is-absolute@^1.0.0, path-is-absolute@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+
+path-is-inside@^1.0.1, path-is-inside@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53"
+
+path-key@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
+
+path-parse@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1"
+
+path-platform@~0.11.15:
+  version "0.11.15"
+  resolved "https://registry.yarnpkg.com/path-platform/-/path-platform-0.11.15.tgz#e864217f74c36850f0852b78dc7bf7d4a5721bf2"
+
+path-proxy@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/path-proxy/-/path-proxy-1.0.0.tgz#18e8a36859fc9d2f1a53b48dee138543c020de5e"
+  dependencies:
+    inflection "~1.3.0"
+
+path-type@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441"
+  dependencies:
+    graceful-fs "^4.1.2"
+    pify "^2.0.0"
+    pinkie-promise "^2.0.0"
+
+path-type@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73"
+  dependencies:
+    pify "^2.0.0"
+
+path-type@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f"
+  dependencies:
+    pify "^3.0.0"
+
+pbkdf2@^3.0.3:
+  version "3.0.14"
+  resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.14.tgz#a35e13c64799b06ce15320f459c230e68e73bade"
+  dependencies:
+    create-hash "^1.1.2"
+    create-hmac "^1.1.4"
+    ripemd160 "^2.0.1"
+    safe-buffer "^5.0.1"
+    sha.js "^2.4.8"
+
+pend@~1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50"
+
+performance-now@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5"
+
+performance-now@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
+
+phantomjs-prebuilt@^2.1.14, phantomjs-prebuilt@^2.1.7:
+  version "2.1.16"
+  resolved "https://registry.yarnpkg.com/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.16.tgz#efd212a4a3966d3647684ea8ba788549be2aefef"
+  dependencies:
+    es6-promise "^4.0.3"
+    extract-zip "^1.6.5"
+    fs-extra "^1.0.0"
+    hasha "^2.2.0"
+    kew "^0.7.0"
+    progress "^1.1.8"
+    request "^2.81.0"
+    request-progress "^2.0.1"
+    which "^1.2.10"
+
+pify@^2.0.0, pify@^2.3.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
+
+pify@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"
+
+pinkie-promise@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa"
+  dependencies:
+    pinkie "^2.0.0"
+
+pinkie@^2.0.0:
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
+
+pkg-dir@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4"
+  dependencies:
+    find-up "^1.0.0"
+
+pkg-dir@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b"
+  dependencies:
+    find-up "^2.1.0"
+
+please-upgrade-node@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/please-upgrade-node/-/please-upgrade-node-3.0.1.tgz#0a681f2c18915e5433a5ca2cd94e0b8206a782db"
+
+pluralize@^7.0.0:
+  version "7.0.0"
+  resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777"
+
+pn@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb"
+
+portfinder@^1.0.13:
+  version "1.0.13"
+  resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.13.tgz#bb32ecd87c27104ae6ee44b5a3ccbf0ebb1aede9"
+  dependencies:
+    async "^1.5.2"
+    debug "^2.2.0"
+    mkdirp "0.5.x"
+
+posix-character-classes@^0.1.0:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
+
+prelude-ls@~1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
+
+preserve@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b"
+
+pretty-format@^22.4.0:
+  version "22.4.0"
+  resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-22.4.0.tgz#237b1f7e1c50ed03bc65c03ccc29d7c8bb7beb94"
+  dependencies:
+    ansi-regex "^3.0.0"
+    ansi-styles "^3.2.0"
+
+private@^0.1.6, private@^0.1.7:
+  version "0.1.8"
+  resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff"
+
+process-nextick-args@~1.0.6:
+  version "1.0.7"
+  resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3"
+
+process-nextick-args@~2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa"
+
+process@^0.11.10, process@~0.11.0:
+  version "0.11.10"
+  resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
+
+progress@^1.1.8:
+  version "1.1.8"
+  resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be"
+
+progress@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f"
+
+proxy-agent@2.0.0, proxy-agent@~2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-2.0.0.tgz#57eb5347aa805d74ec681cb25649dba39c933499"
+  dependencies:
+    agent-base "2"
+    debug "2"
+    extend "3"
+    http-proxy-agent "1"
+    https-proxy-agent "1"
+    lru-cache "~2.6.5"
+    pac-proxy-agent "1"
+    socks-proxy-agent "2"
+
+prr@~1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
+
+pseudomap@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
+
+public-encrypt@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.0.tgz#39f699f3a46560dd5ebacbca693caf7c65c18cc6"
+  dependencies:
+    bn.js "^4.1.0"
+    browserify-rsa "^4.0.0"
+    create-hash "^1.1.0"
+    parse-asn1 "^5.0.0"
+    randombytes "^2.0.1"
+
+punycode@1.3.2:
+  version "1.3.2"
+  resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d"
+
+punycode@1.4.1, punycode@^1.2.4, punycode@^1.3.2, punycode@^1.4.1:
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
+
+punycode@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.0.tgz#5f863edc89b96db09074bad7947bf09056ca4e7d"
+
+q@1.4.1, q@~1.4.0:
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/q/-/q-1.4.1.tgz#55705bcd93c5f3673530c2c2cbc0c2b3addc286e"
+
+q@^1.4.1, q@^1.5.0, q@^1.5.1:
+  version "1.5.1"
+  resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7"
+
+qjobs@^1.1.4:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/qjobs/-/qjobs-1.2.0.tgz#c45e9c61800bd087ef88d7e256423bdd49e5d071"
+
+qs@6.5.1, qs@~6.5.1:
+  version "6.5.1"
+  resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8"
+
+qs@~1.2.0:
+  version "1.2.2"
+  resolved "https://registry.yarnpkg.com/qs/-/qs-1.2.2.tgz#19b57ff24dc2a99ce1f8bdf6afcda59f8ef61f88"
+
+qs@~2.3.3:
+  version "2.3.3"
+  resolved "https://registry.yarnpkg.com/qs/-/qs-2.3.3.tgz#e9e85adbe75da0bbe4c8e0476a086290f863b404"
+
+qs@~6.2.0:
+  version "6.2.3"
+  resolved "https://registry.yarnpkg.com/qs/-/qs-6.2.3.tgz#1cfcb25c10a9b2b483053ff39f5dfc9233908cfe"
+
+qs@~6.3.0:
+  version "6.3.2"
+  resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.2.tgz#e75bd5f6e268122a2a0e0bda630b2550c166502c"
+
+qs@~6.4.0:
+  version "6.4.0"
+  resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233"
+
+querystring-es3@^0.2.0, querystring-es3@~0.2.0:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73"
+
+querystring@0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
+
+quick-lru@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-1.1.0.tgz#4360b17c61136ad38078397ff11416e186dcfbb8"
+
+randomatic@^1.1.3:
+  version "1.1.7"
+  resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c"
+  dependencies:
+    is-number "^3.0.0"
+    kind-of "^4.0.0"
+
+randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5:
+  version "2.0.6"
+  resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.6.tgz#d302c522948588848a8d300c932b44c24231da80"
+  dependencies:
+    safe-buffer "^5.1.0"
+
+randomfill@^1.0.3:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458"
+  dependencies:
+    randombytes "^2.0.5"
+    safe-buffer "^5.1.0"
+
+range-parser@^1.0.3, range-parser@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e"
+
+raw-body@2, raw-body@2.3.2:
+  version "2.3.2"
+  resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.2.tgz#bcd60c77d3eb93cde0050295c3f379389bc88f89"
+  dependencies:
+    bytes "3.0.0"
+    http-errors "1.6.2"
+    iconv-lite "0.4.19"
+    unpipe "1.0.0"
+
+rc@^1.1.7:
+  version "1.2.5"
+  resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.5.tgz#275cd687f6e3b36cc756baa26dfee80a790301fd"
+  dependencies:
+    deep-extend "~0.4.0"
+    ini "~1.3.0"
+    minimist "^1.2.0"
+    strip-json-comments "~2.0.1"
+
+read-only-stream@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/read-only-stream/-/read-only-stream-2.0.0.tgz#2724fd6a8113d73764ac288d4386270c1dbf17f0"
+  dependencies:
+    readable-stream "^2.0.2"
+
+read-pkg-up@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02"
+  dependencies:
+    find-up "^1.0.0"
+    read-pkg "^1.0.0"
+
+read-pkg-up@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be"
+  dependencies:
+    find-up "^2.0.0"
+    read-pkg "^2.0.0"
+
+read-pkg-up@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07"
+  dependencies:
+    find-up "^2.0.0"
+    read-pkg "^3.0.0"
+
+read-pkg@^1.0.0, read-pkg@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28"
+  dependencies:
+    load-json-file "^1.0.0"
+    normalize-package-data "^2.3.2"
+    path-type "^1.0.0"
+
+read-pkg@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8"
+  dependencies:
+    load-json-file "^2.0.0"
+    normalize-package-data "^2.3.2"
+    path-type "^2.0.0"
+
+read-pkg@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389"
+  dependencies:
+    load-json-file "^4.0.0"
+    normalize-package-data "^2.3.2"
+    path-type "^3.0.0"
+
+readable-stream@1.1.x, "readable-stream@1.x >=1.1.9":
+  version "1.1.14"
+  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9"
+  dependencies:
+    core-util-is "~1.0.0"
+    inherits "~2.0.1"
+    isarray "0.0.1"
+    string_decoder "~0.10.x"
+
+readable-stream@2, readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.3:
+  version "2.3.5"
+  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.5.tgz#b4f85003a938cbb6ecbce2a124fb1012bd1a838d"
+  dependencies:
+    core-util-is "~1.0.0"
+    inherits "~2.0.3"
+    isarray "~1.0.0"
+    process-nextick-args "~2.0.0"
+    safe-buffer "~5.1.1"
+    string_decoder "~1.0.3"
+    util-deprecate "~1.0.1"
+
+readable-stream@~1.0.26:
+  version "1.0.34"
+  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c"
+  dependencies:
+    core-util-is "~1.0.0"
+    inherits "~2.0.1"
+    isarray "0.0.1"
+    string_decoder "~0.10.x"
+
+readable-stream@~2.0.0, readable-stream@~2.0.5:
+  version "2.0.6"
+  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e"
+  dependencies:
+    core-util-is "~1.0.0"
+    inherits "~2.0.1"
+    isarray "~1.0.0"
+    process-nextick-args "~1.0.6"
+    string_decoder "~0.10.x"
+    util-deprecate "~1.0.1"
+
+readdirp@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78"
+  dependencies:
+    graceful-fs "^4.1.2"
+    minimatch "^3.0.2"
+    readable-stream "^2.0.2"
+    set-immediate-shim "^1.0.1"
+
+rechoir@^0.6.2:
+  version "0.6.2"
+  resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384"
+  dependencies:
+    resolve "^1.1.6"
+
+redent@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde"
+  dependencies:
+    indent-string "^2.1.0"
+    strip-indent "^1.0.1"
+
+redent@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/redent/-/redent-2.0.0.tgz#c1b2007b42d57eb1389079b3c8333639d5e1ccaa"
+  dependencies:
+    indent-string "^3.0.0"
+    strip-indent "^2.0.0"
+
+redis-commands@^1.2.0:
+  version "1.3.5"
+  resolved "https://registry.yarnpkg.com/redis-commands/-/redis-commands-1.3.5.tgz#4495889414f1e886261180b1442e7295602d83a2"
+
+redis-parser@^2.6.0:
+  version "2.6.0"
+  resolved "https://registry.yarnpkg.com/redis-parser/-/redis-parser-2.6.0.tgz#52ed09dacac108f1a631c07e9b69941e7a19504b"
+
+redis@^2.7.1:
+  version "2.8.0"
+  resolved "https://registry.yarnpkg.com/redis/-/redis-2.8.0.tgz#202288e3f58c49f6079d97af7a10e1303ae14b02"
+  dependencies:
+    double-ended-queue "^2.1.0-0"
+    redis-commands "^1.2.0"
+    redis-parser "^2.6.0"
+
+regenerate@^1.2.1:
+  version "1.3.3"
+  resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.3.tgz#0c336d3980553d755c39b586ae3b20aa49c82b7f"
+
+regenerator-runtime@^0.11.0:
+  version "0.11.1"
+  resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
+
+regenerator-transform@^0.10.0:
+  version "0.10.1"
+  resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd"
+  dependencies:
+    babel-runtime "^6.18.0"
+    babel-types "^6.19.0"
+    private "^0.1.6"
+
+regex-cache@^0.4.2:
+  version "0.4.4"
+  resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd"
+  dependencies:
+    is-equal-shallow "^0.1.3"
+
+regex-not@^1.0.0, regex-not@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c"
+  dependencies:
+    extend-shallow "^3.0.2"
+    safe-regex "^1.1.0"
+
+regexpu-core@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240"
+  dependencies:
+    regenerate "^1.2.1"
+    regjsgen "^0.2.0"
+    regjsparser "^0.1.4"
+
+regjsgen@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7"
+
+regjsparser@^0.1.4:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c"
+  dependencies:
+    jsesc "~0.5.0"
+
+remove-trailing-separator@^1.0.1:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
+
+repeat-element@^1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a"
+
+repeat-string@^0.2.2:
+  version "0.2.2"
+  resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-0.2.2.tgz#c7a8d3236068362059a7e4651fc6884e8b1fb4ae"
+
+repeat-string@^1.5.2, repeat-string@^1.6.1:
+  version "1.6.1"
+  resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
+
+repeating@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda"
+  dependencies:
+    is-finite "^1.0.0"
+
+request-progress@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/request-progress/-/request-progress-2.0.1.tgz#5d36bb57961c673aa5b788dbc8141fdf23b44e08"
+  dependencies:
+    throttleit "^1.0.0"
+
+request-promise-core@1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.1.tgz#3eee00b2c5aa83239cfb04c5700da36f81cd08b6"
+  dependencies:
+    lodash "^4.13.1"
+
+request-promise-native@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.5.tgz#5281770f68e0c9719e5163fd3fab482215f4fda5"
+  dependencies:
+    request-promise-core "1.1.1"
+    stealthy-require "^1.1.0"
+    tough-cookie ">=2.3.3"
+
+request@2.42.0:
+  version "2.42.0"
+  resolved "https://registry.yarnpkg.com/request/-/request-2.42.0.tgz#572bd0148938564040ac7ab148b96423a063304a"
+  dependencies:
+    bl "~0.9.0"
+    caseless "~0.6.0"
+    forever-agent "~0.5.0"
+    json-stringify-safe "~5.0.0"
+    mime-types "~1.0.1"
+    node-uuid "~1.4.0"
+    qs "~1.2.0"
+    tunnel-agent "~0.4.0"
+  optionalDependencies:
+    aws-sign2 "~0.5.0"
+    form-data "~0.1.0"
+    hawk "1.1.1"
+    http-signature "~0.10.0"
+    oauth-sign "~0.4.0"
+    stringstream "~0.0.4"
+    tough-cookie ">=0.12.0"
+
+request@2.75.x:
+  version "2.75.0"
+  resolved "https://registry.yarnpkg.com/request/-/request-2.75.0.tgz#d2b8268a286da13eaa5d01adf5d18cc90f657d93"
+  dependencies:
+    aws-sign2 "~0.6.0"
+    aws4 "^1.2.1"
+    bl "~1.1.2"
+    caseless "~0.11.0"
+    combined-stream "~1.0.5"
+    extend "~3.0.0"
+    forever-agent "~0.6.1"
+    form-data "~2.0.0"
+    har-validator "~2.0.6"
+    hawk "~3.1.3"
+    http-signature "~1.1.0"
+    is-typedarray "~1.0.0"
+    isstream "~0.1.2"
+    json-stringify-safe "~5.0.1"
+    mime-types "~2.1.7"
+    node-uuid "~1.4.7"
+    oauth-sign "~0.8.1"
+    qs "~6.2.0"
+    stringstream "~0.0.4"
+    tough-cookie "~2.3.0"
+    tunnel-agent "~0.4.1"
+
+request@2.79.0:
+  version "2.79.0"
+  resolved "https://registry.yarnpkg.com/request/-/request-2.79.0.tgz#4dfe5bf6be8b8cdc37fcf93e04b65577722710de"
+  dependencies:
+    aws-sign2 "~0.6.0"
+    aws4 "^1.2.1"
+    caseless "~0.11.0"
+    combined-stream "~1.0.5"
+    extend "~3.0.0"
+    forever-agent "~0.6.1"
+    form-data "~2.1.1"
+    har-validator "~2.0.6"
+    hawk "~3.1.3"
+    http-signature "~1.1.0"
+    is-typedarray "~1.0.0"
+    isstream "~0.1.2"
+    json-stringify-safe "~5.0.1"
+    mime-types "~2.1.7"
+    oauth-sign "~0.8.1"
+    qs "~6.3.0"
+    stringstream "~0.0.4"
+    tough-cookie "~2.3.0"
+    tunnel-agent "~0.4.1"
+    uuid "^3.0.0"
+
+request@2.81.0:
+  version "2.81.0"
+  resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0"
+  dependencies:
+    aws-sign2 "~0.6.0"
+    aws4 "^1.2.1"
+    caseless "~0.12.0"
+    combined-stream "~1.0.5"
+    extend "~3.0.0"
+    forever-agent "~0.6.1"
+    form-data "~2.1.1"
+    har-validator "~4.2.1"
+    hawk "~3.1.3"
+    http-signature "~1.1.0"
+    is-typedarray "~1.0.0"
+    isstream "~0.1.2"
+    json-stringify-safe "~5.0.1"
+    mime-types "~2.1.7"
+    oauth-sign "~0.8.1"
+    performance-now "^0.2.0"
+    qs "~6.4.0"
+    safe-buffer "^5.0.1"
+    stringstream "~0.0.4"
+    tough-cookie "~2.3.0"
+    tunnel-agent "^0.6.0"
+    uuid "^3.0.0"
+
+request@^2.0.0, request@^2.74.0, request@^2.81.0, request@^2.83.0:
+  version "2.83.0"
+  resolved "https://registry.yarnpkg.com/request/-/request-2.83.0.tgz#ca0b65da02ed62935887808e6f510381034e3356"
+  dependencies:
+    aws-sign2 "~0.7.0"
+    aws4 "^1.6.0"
+    caseless "~0.12.0"
+    combined-stream "~1.0.5"
+    extend "~3.0.1"
+    forever-agent "~0.6.1"
+    form-data "~2.3.1"
+    har-validator "~5.0.3"
+    hawk "~6.0.2"
+    http-signature "~1.2.0"
+    is-typedarray "~1.0.0"
+    isstream "~0.1.2"
+    json-stringify-safe "~5.0.1"
+    mime-types "~2.1.17"
+    oauth-sign "~0.8.2"
+    performance-now "^2.1.0"
+    qs "~6.5.1"
+    safe-buffer "^5.1.1"
+    stringstream "~0.0.5"
+    tough-cookie "~2.3.3"
+    tunnel-agent "^0.6.0"
+    uuid "^3.1.0"
+
+requestretry@^1.2.2:
+  version "1.13.0"
+  resolved "https://registry.yarnpkg.com/requestretry/-/requestretry-1.13.0.tgz#213ec1006eeb750e8b8ce54176283d15a8d55d94"
+  dependencies:
+    extend "^3.0.0"
+    lodash "^4.15.0"
+    request "^2.74.0"
+    when "^3.7.7"
+
+require-directory@^2.1.1:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
+
+require-from-string@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.1.tgz#c545233e9d7da6616e9d59adfb39fc9f588676ff"
+
+require-main-filename@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1"
+
+require-relative@0.8.7:
+  version "0.8.7"
+  resolved "https://registry.yarnpkg.com/require-relative/-/require-relative-0.8.7.tgz#7999539fc9e047a37928fa196f8e1563dabd36de"
+
+require-uncached@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3"
+  dependencies:
+    caller-path "^0.1.0"
+    resolve-from "^1.0.0"
+
+requires-port@1.x.x:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
+
+resolve-dir@^0.1.0:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-0.1.1.tgz#b219259a5602fac5c5c496ad894a6e8cc430261e"
+  dependencies:
+    expand-tilde "^1.2.2"
+    global-modules "^0.2.3"
+
+resolve-from@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226"
+
+resolve-url@^0.2.1, resolve-url@~0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
+
+resolve@1.1.7, resolve@1.1.x:
+  version "1.1.7"
+  resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b"
+
+resolve@^1.1.3, resolve@^1.1.4, resolve@^1.1.6, resolve@^1.3.3, resolve@^1.4.0:
+  version "1.5.0"
+  resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36"
+  dependencies:
+    path-parse "^1.0.5"
+
+restore-cursor@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541"
+  dependencies:
+    exit-hook "^1.0.0"
+    onetime "^1.0.0"
+
+restore-cursor@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf"
+  dependencies:
+    onetime "^2.0.0"
+    signal-exit "^3.0.2"
+
+resumer@~0.0.0:
+  version "0.0.0"
+  resolved "https://registry.yarnpkg.com/resumer/-/resumer-0.0.0.tgz#f1e8f461e4064ba39e82af3cdc2a8c893d076759"
+  dependencies:
+    through "~2.3.4"
+
+ret@~0.1.10:
+  version "0.1.15"
+  resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
+
+right-align@^0.1.1:
+  version "0.1.3"
+  resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef"
+  dependencies:
+    align-text "^0.1.1"
+
+right-pad@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/right-pad/-/right-pad-1.0.1.tgz#8ca08c2cbb5b55e74dafa96bf7fd1a27d568c8d0"
+
+rimraf@2, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.5.4, rimraf@^2.6.0, rimraf@^2.6.1:
+  version "2.6.2"
+  resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36"
+  dependencies:
+    glob "^7.0.5"
+
+ripemd160@^2.0.0, ripemd160@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.1.tgz#0f4584295c53a3628af7e6d79aca21ce57d1c6e7"
+  dependencies:
+    hash-base "^2.0.0"
+    inherits "^2.0.1"
+
+rollup-plugin-alias@^1.3.1:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/rollup-plugin-alias/-/rollup-plugin-alias-1.4.0.tgz#120cba7c46621c03138f0ca6fd5dd2ade9872db9"
+  dependencies:
+    slash "^1.0.0"
+
+rollup-plugin-babel@^3.0.2:
+  version "3.0.3"
+  resolved "https://registry.yarnpkg.com/rollup-plugin-babel/-/rollup-plugin-babel-3.0.3.tgz#63adedc863130327512a4a9006efc2241c5b7c15"
+  dependencies:
+    rollup-pluginutils "^1.5.0"
+
+rollup-plugin-buble@^0.19.2:
+  version "0.19.2"
+  resolved "https://registry.yarnpkg.com/rollup-plugin-buble/-/rollup-plugin-buble-0.19.2.tgz#c0590c7d3d475b5ed59f129764ec93710cc6e8dd"
+  dependencies:
+    buble "^0.19.2"
+    rollup-pluginutils "^2.0.1"
+
+rollup-plugin-commonjs@^8.0.0:
+  version "8.4.1"
+  resolved "https://registry.yarnpkg.com/rollup-plugin-commonjs/-/rollup-plugin-commonjs-8.4.1.tgz#5c9cea2b2c3de322f5fbccd147e07ed5e502d7a0"
+  dependencies:
+    acorn "^5.2.1"
+    estree-walker "^0.5.0"
+    magic-string "^0.22.4"
+    resolve "^1.4.0"
+    rollup-pluginutils "^2.0.1"
+
+rollup-plugin-flow-no-whitespace@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/rollup-plugin-flow-no-whitespace/-/rollup-plugin-flow-no-whitespace-1.0.0.tgz#bd4ba1bcd99ad5b88234d72e6e2dacea9aa02d16"
+  dependencies:
+    flow-remove-types-no-whitespace "^1.0.3"
+    rollup-pluginutils "^1.5.2"
+
+rollup-plugin-node-resolve@^3.0.0:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-3.2.0.tgz#31534952f3ab21f9473c1d092be7ed43937ea4d4"
+  dependencies:
+    builtin-modules "^2.0.0"
+    is-module "^1.0.0"
+    resolve "^1.1.6"
+
+rollup-plugin-replace@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/rollup-plugin-replace/-/rollup-plugin-replace-2.0.0.tgz#19074089c8ed57184b8cc64e967a03d095119277"
+  dependencies:
+    magic-string "^0.22.4"
+    minimatch "^3.0.2"
+    rollup-pluginutils "^2.0.1"
+
+rollup-pluginutils@^1.5.0, rollup-pluginutils@^1.5.2:
+  version "1.5.2"
+  resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-1.5.2.tgz#1e156e778f94b7255bfa1b3d0178be8f5c552408"
+  dependencies:
+    estree-walker "^0.2.1"
+    minimatch "^3.0.2"
+
+rollup-pluginutils@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.0.1.tgz#7ec95b3573f6543a46a6461bd9a7c544525d0fc0"
+  dependencies:
+    estree-walker "^0.3.0"
+    micromatch "^2.3.11"
+
+rollup-watch@^4.0.0:
+  version "4.3.1"
+  resolved "https://registry.yarnpkg.com/rollup-watch/-/rollup-watch-4.3.1.tgz#5aa1eaeab787addf368905d102b39d6fc5ce4a8b"
+  dependencies:
+    chokidar "^1.7.0"
+    require-relative "0.8.7"
+    rollup-pluginutils "^2.0.1"
+
+rollup@^0.54.1:
+  version "0.54.1"
+  resolved "https://registry.yarnpkg.com/rollup/-/rollup-0.54.1.tgz#415a5d999421502646cf54b873fc4ce1a7393970"
+
+run-async@^2.2.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0"
+  dependencies:
+    is-promise "^2.1.0"
+
+rx-lite-aggregates@^4.0.8:
+  version "4.0.8"
+  resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be"
+  dependencies:
+    rx-lite "*"
+
+rx-lite@*, rx-lite@^4.0.8:
+  version "4.0.8"
+  resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444"
+
+rx@^4.1.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782"
+
+rxjs@^5.4.2:
+  version "5.5.6"
+  resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.6.tgz#e31fb96d6fd2ff1fd84bcea8ae9c02d007179c02"
+  dependencies:
+    symbol-observable "1.0.1"
+
+safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
+  version "5.1.1"
+  resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853"
+
+safe-regex@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e"
+  dependencies:
+    ret "~0.1.10"
+
+sauce-connect-launcher@^1.2.2:
+  version "1.2.3"
+  resolved "https://registry.yarnpkg.com/sauce-connect-launcher/-/sauce-connect-launcher-1.2.3.tgz#d2f931ad7ae8fdabf1968a440e7b20417aca7f86"
+  dependencies:
+    adm-zip "~0.4.3"
+    async "^2.1.2"
+    https-proxy-agent "~1.0.0"
+    lodash "^4.16.6"
+    rimraf "^2.5.4"
+
+saucelabs@^1.4.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/saucelabs/-/saucelabs-1.4.0.tgz#b934a9af9da2874b3f40aae1fcde50a4466f5f38"
+  dependencies:
+    https-proxy-agent "^1.0.0"
+
+sax@^1.2.4:
+  version "1.2.4"
+  resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
+
+schema-utils@^0.4.5:
+  version "0.4.5"
+  resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.5.tgz#21836f0608aac17b78f9e3e24daff14a5ca13a3e"
+  dependencies:
+    ajv "^6.1.0"
+    ajv-keywords "^3.1.0"
+
+selenium-server@^2.53.1:
+  version "2.53.1"
+  resolved "https://registry.yarnpkg.com/selenium-server/-/selenium-server-2.53.1.tgz#d681528812f3c2e0531a6b7e613e23bb02cce8a6"
+
+"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.5.0:
+  version "5.5.0"
+  resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab"
+
+semver@~5.0.1:
+  version "5.0.3"
+  resolved "https://registry.yarnpkg.com/semver/-/semver-5.0.3.tgz#77466de589cd5d3c95f138aa78bc569a3cb5d27a"
+
+serialize-javascript@^1.3.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.4.0.tgz#7c958514db6ac2443a8abc062dc9f7886a7f6005"
+
+set-blocking@^2.0.0, set-blocking@~2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
+
+set-getter@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/set-getter/-/set-getter-0.1.0.tgz#d769c182c9d5a51f409145f2fba82e5e86e80376"
+  dependencies:
+    to-object-path "^0.3.0"
+
+set-immediate-shim@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61"
+
+set-value@^0.4.3:
+  version "0.4.3"
+  resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1"
+  dependencies:
+    extend-shallow "^2.0.1"
+    is-extendable "^0.1.1"
+    is-plain-object "^2.0.1"
+    to-object-path "^0.3.0"
+
+set-value@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274"
+  dependencies:
+    extend-shallow "^2.0.1"
+    is-extendable "^0.1.1"
+    is-plain-object "^2.0.3"
+    split-string "^3.0.1"
+
+setimmediate@^1.0.4:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
+
+setprototypeof@1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04"
+
+sha.js@^2.4.0, sha.js@^2.4.8, sha.js@~2.4.4:
+  version "2.4.10"
+  resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.10.tgz#b1fde5cd7d11a5626638a07c604ab909cfa31f9b"
+  dependencies:
+    inherits "^2.0.1"
+    safe-buffer "^5.0.1"
+
+shasum@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/shasum/-/shasum-1.0.2.tgz#e7012310d8f417f4deb5712150e5678b87ae565f"
+  dependencies:
+    json-stable-stringify "~0.0.0"
+    sha.js "~2.4.4"
+
+shebang-command@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
+  dependencies:
+    shebang-regex "^1.0.0"
+
+shebang-regex@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
+
+shell-quote@^1.6.1:
+  version "1.6.1"
+  resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.6.1.tgz#f4781949cce402697127430ea3b3c5476f481767"
+  dependencies:
+    array-filter "~0.0.0"
+    array-map "~0.0.0"
+    array-reduce "~0.0.0"
+    jsonify "~0.0.0"
+
+shelljs@0.7.6:
+  version "0.7.6"
+  resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.6.tgz#379cccfb56b91c8601e4793356eb5382924de9ad"
+  dependencies:
+    glob "^7.0.0"
+    interpret "^1.0.0"
+    rechoir "^0.6.2"
+
+shelljs@^0.8.1:
+  version "0.8.1"
+  resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.1.tgz#729e038c413a2254c4078b95ed46e0397154a9f1"
+  dependencies:
+    glob "^7.0.0"
+    interpret "^1.0.0"
+    rechoir "^0.6.2"
+
+signal-exit@^3.0.0, signal-exit@^3.0.2:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
+
+slack-node@~0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/slack-node/-/slack-node-0.2.0.tgz#de4b8dddaa8b793f61dbd2938104fdabf37dfa30"
+  dependencies:
+    requestretry "^1.2.2"
+
+slash@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55"
+
+slice-ansi@0.0.4:
+  version "0.0.4"
+  resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35"
+
+slice-ansi@1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d"
+  dependencies:
+    is-fullwidth-code-point "^2.0.0"
+
+smart-buffer@^1.0.13, smart-buffer@^1.0.4:
+  version "1.1.15"
+  resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-1.1.15.tgz#7f114b5b65fab3e2a35aa775bb12f0d1c649bf16"
+
+smtp-connection@2.12.0:
+  version "2.12.0"
+  resolved "https://registry.yarnpkg.com/smtp-connection/-/smtp-connection-2.12.0.tgz#d76ef9127cb23c2259edb1e8349c2e8d5e2d74c1"
+  dependencies:
+    httpntlm "1.6.1"
+    nodemailer-shared "1.1.0"
+
+snapdragon-node@^2.0.1:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b"
+  dependencies:
+    define-property "^1.0.0"
+    isobject "^3.0.0"
+    snapdragon-util "^3.0.1"
+
+snapdragon-util@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2"
+  dependencies:
+    kind-of "^3.2.0"
+
+snapdragon@^0.8.1:
+  version "0.8.1"
+  resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.1.tgz#e12b5487faded3e3dea0ac91e9400bf75b401370"
+  dependencies:
+    base "^0.11.1"
+    debug "^2.2.0"
+    define-property "^0.2.5"
+    extend-shallow "^2.0.1"
+    map-cache "^0.2.2"
+    source-map "^0.5.6"
+    source-map-resolve "^0.5.0"
+    use "^2.0.0"
+
+sntp@0.2.x:
+  version "0.2.4"
+  resolved "https://registry.yarnpkg.com/sntp/-/sntp-0.2.4.tgz#fb885f18b0f3aad189f824862536bceeec750900"
+  dependencies:
+    hoek "0.9.x"
+
+sntp@1.x.x:
+  version "1.0.9"
+  resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198"
+  dependencies:
+    hoek "2.x.x"
+
+sntp@2.x.x:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/sntp/-/sntp-2.1.0.tgz#2c6cec14fedc2222739caf9b5c3d85d1cc5a2cc8"
+  dependencies:
+    hoek "4.x.x"
+
+socket.io-adapter@~1.1.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz#2a805e8a14d6372124dd9159ad4502f8cb07f06b"
+
+socket.io-client@2.0.4:
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-2.0.4.tgz#0918a552406dc5e540b380dcd97afc4a64332f8e"
+  dependencies:
+    backo2 "1.0.2"
+    base64-arraybuffer "0.1.5"
+    component-bind "1.0.0"
+    component-emitter "1.2.1"
+    debug "~2.6.4"
+    engine.io-client "~3.1.0"
+    has-cors "1.1.0"
+    indexof "0.0.1"
+    object-component "0.0.3"
+    parseqs "0.0.5"
+    parseuri "0.0.5"
+    socket.io-parser "~3.1.1"
+    to-array "0.1.4"
+
+socket.io-parser@~3.1.1:
+  version "3.1.3"
+  resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.1.3.tgz#ed2da5ee79f10955036e3da413bfd7f1e4d86c8e"
+  dependencies:
+    component-emitter "1.2.1"
+    debug "~3.1.0"
+    has-binary2 "~1.0.2"
+    isarray "2.0.1"
+
+socket.io@2.0.4:
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-2.0.4.tgz#c1a4590ceff87ecf13c72652f046f716b29e6014"
+  dependencies:
+    debug "~2.6.6"
+    engine.io "~3.1.0"
+    socket.io-adapter "~1.1.0"
+    socket.io-client "2.0.4"
+    socket.io-parser "~3.1.1"
+
+socks-proxy-agent@2:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-2.1.1.tgz#86ebb07193258637870e13b7bd99f26c663df3d3"
+  dependencies:
+    agent-base "2"
+    extend "3"
+    socks "~1.1.5"
+
+socks@1.1.9:
+  version "1.1.9"
+  resolved "https://registry.yarnpkg.com/socks/-/socks-1.1.9.tgz#628d7e4d04912435445ac0b6e459376cb3e6d691"
+  dependencies:
+    ip "^1.1.2"
+    smart-buffer "^1.0.4"
+
+socks@~1.1.5:
+  version "1.1.10"
+  resolved "https://registry.yarnpkg.com/socks/-/socks-1.1.10.tgz#5b8b7fc7c8f341c53ed056e929b7bf4de8ba7b5a"
+  dependencies:
+    ip "^1.1.4"
+    smart-buffer "^1.0.13"
+
+source-list-map@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.0.tgz#aaa47403f7b245a92fbc97ea08f250d6087ed085"
+
+source-map-resolve@^0.3.0:
+  version "0.3.1"
+  resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.3.1.tgz#610f6122a445b8dd51535a2a71b783dfc1248761"
+  dependencies:
+    atob "~1.1.0"
+    resolve-url "~0.2.1"
+    source-map-url "~0.3.0"
+    urix "~0.1.0"
+
+source-map-resolve@^0.5.0:
+  version "0.5.1"
+  resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.1.tgz#7ad0f593f2281598e854df80f19aae4b92d7a11a"
+  dependencies:
+    atob "^2.0.0"
+    decode-uri-component "^0.2.0"
+    resolve-url "^0.2.1"
+    source-map-url "^0.4.0"
+    urix "^0.1.0"
+
+source-map-support@^0.4.15:
+  version "0.4.18"
+  resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f"
+  dependencies:
+    source-map "^0.5.6"
+
+source-map-support@^0.5.0:
+  version "0.5.3"
+  resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.3.tgz#2b3d5fff298cfa4d1afd7d4352d569e9a0158e76"
+  dependencies:
+    source-map "^0.6.0"
+
+source-map-url@^0.4.0:
+  version "0.4.0"
+  resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3"
+
+source-map-url@~0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.3.0.tgz#7ecaf13b57bcd09da8a40c5d269db33799d4aaf9"
+
+source-map@^0.1.38:
+  version "0.1.43"
+  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346"
+  dependencies:
+    amdefine ">=0.0.4"
+
+source-map@^0.4.4:
+  version "0.4.4"
+  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b"
+  dependencies:
+    amdefine ">=0.0.4"
+
+source-map@^0.5.0, source-map@^0.5.1, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.1, source-map@~0.5.3:
+  version "0.5.7"
+  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
+
+source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1:
+  version "0.6.1"
+  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
+
+source-map@~0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d"
+  dependencies:
+    amdefine ">=0.0.4"
+
+spawn-sync@^1.0.15:
+  version "1.0.15"
+  resolved "https://registry.yarnpkg.com/spawn-sync/-/spawn-sync-1.0.15.tgz#b00799557eb7fb0c8376c29d44e8a1ea67e57476"
+  dependencies:
+    concat-stream "^1.4.7"
+    os-shim "^0.1.2"
+
+spdx-correct@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.0.tgz#05a5b4d7153a195bc92c3c425b69f3b2a9524c82"
+  dependencies:
+    spdx-expression-parse "^3.0.0"
+    spdx-license-ids "^3.0.0"
+
+spdx-exceptions@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz#2c7ae61056c714a5b9b9b2b2af7d311ef5c78fe9"
+
+spdx-expression-parse@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0"
+  dependencies:
+    spdx-exceptions "^2.1.0"
+    spdx-license-ids "^3.0.0"
+
+spdx-license-ids@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz#7a7cd28470cc6d3a1cfe6d66886f6bc430d3ac87"
+
+split-string@^3.0.1, split-string@^3.0.2:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2"
+  dependencies:
+    extend-shallow "^3.0.0"
+
+split2@^2.0.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/split2/-/split2-2.2.0.tgz#186b2575bcf83e85b7d18465756238ee4ee42493"
+  dependencies:
+    through2 "^2.0.2"
+
+split@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9"
+  dependencies:
+    through "2"
+
+split@~0.2.10:
+  version "0.2.10"
+  resolved "https://registry.yarnpkg.com/split/-/split-0.2.10.tgz#67097c601d697ce1368f418f06cd201cf0521a57"
+  dependencies:
+    through "2"
+
+sprintf-js@^1.0.3:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.1.tgz#36be78320afe5801f6cea3ee78b6e5aab940ea0c"
+
+sprintf-js@~1.0.2:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
+
+sshpk@^1.7.0:
+  version "1.13.1"
+  resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3"
+  dependencies:
+    asn1 "~0.2.3"
+    assert-plus "^1.0.0"
+    dashdash "^1.12.0"
+    getpass "^0.1.1"
+  optionalDependencies:
+    bcrypt-pbkdf "^1.0.0"
+    ecc-jsbn "~0.1.1"
+    jsbn "~0.1.0"
+    tweetnacl "~0.14.0"
+
+stack-utils@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.1.tgz#d4f33ab54e8e38778b0ca5cfd3b3afb12db68620"
+
+staged-git-files@1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/staged-git-files/-/staged-git-files-1.1.0.tgz#1a9bb131c1885601023c7aaddd3d54c22142c526"
+
+static-extend@^0.1.1:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6"
+  dependencies:
+    define-property "^0.2.5"
+    object-copy "^0.1.0"
+
+"statuses@>= 1.3.1 < 2":
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087"
+
+statuses@~1.3.1:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e"
+
+stealthy-require@^1.1.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b"
+
+stream-browserify@^2.0.0, stream-browserify@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db"
+  dependencies:
+    inherits "~2.0.1"
+    readable-stream "^2.0.2"
+
+stream-combiner2@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/stream-combiner2/-/stream-combiner2-1.1.1.tgz#fb4d8a1420ea362764e21ad4780397bebcb41cbe"
+  dependencies:
+    duplexer2 "~0.1.0"
+    readable-stream "^2.0.2"
+
+stream-combiner@~0.0.2:
+  version "0.0.4"
+  resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14"
+  dependencies:
+    duplexer "~0.1.1"
+
+stream-http@^2.0.0, stream-http@^2.7.2:
+  version "2.8.0"
+  resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.0.tgz#fd86546dac9b1c91aff8fc5d287b98fafb41bc10"
+  dependencies:
+    builtin-status-codes "^3.0.0"
+    inherits "^2.0.1"
+    readable-stream "^2.3.3"
+    to-arraybuffer "^1.0.0"
+    xtend "^4.0.0"
+
+stream-splicer@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/stream-splicer/-/stream-splicer-2.0.0.tgz#1b63be438a133e4b671cc1935197600175910d83"
+  dependencies:
+    inherits "^2.0.1"
+    readable-stream "^2.0.2"
+
+stream-to-observable@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/stream-to-observable/-/stream-to-observable-0.2.0.tgz#59d6ea393d87c2c0ddac10aa0d561bc6ba6f0e10"
+  dependencies:
+    any-observable "^0.2.0"
+
+streamroller@^0.7.0:
+  version "0.7.0"
+  resolved "https://registry.yarnpkg.com/streamroller/-/streamroller-0.7.0.tgz#a1d1b7cf83d39afb0d63049a5acbf93493bdf64b"
+  dependencies:
+    date-format "^1.2.0"
+    debug "^3.1.0"
+    mkdirp "^0.5.1"
+    readable-stream "^2.3.0"
+
+string-width@^1.0.1, string-width@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
+  dependencies:
+    code-point-at "^1.0.0"
+    is-fullwidth-code-point "^1.0.0"
+    strip-ansi "^3.0.0"
+
+string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
+  dependencies:
+    is-fullwidth-code-point "^2.0.0"
+    strip-ansi "^4.0.0"
+
+string_decoder@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.0.tgz#384f322ee8a848e500effde99901bba849c5d403"
+  dependencies:
+    safe-buffer "~5.1.0"
+
+string_decoder@~0.10.x:
+  version "0.10.31"
+  resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
+
+string_decoder@~1.0.0, string_decoder@~1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab"
+  dependencies:
+    safe-buffer "~5.1.0"
+
+stringify-object@^3.2.2:
+  version "3.2.2"
+  resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.2.2.tgz#9853052e5a88fb605a44cd27445aa257ad7ffbcd"
+  dependencies:
+    get-own-enumerable-property-symbols "^2.0.1"
+    is-obj "^1.0.1"
+    is-regexp "^1.0.0"
+
+stringstream@~0.0.4, stringstream@~0.0.5:
+  version "0.0.5"
+  resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878"
+
+strip-ansi@^3.0.0, strip-ansi@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
+  dependencies:
+    ansi-regex "^2.0.0"
+
+strip-ansi@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f"
+  dependencies:
+    ansi-regex "^3.0.0"
+
+strip-bom@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e"
+  dependencies:
+    is-utf8 "^0.2.0"
+
+strip-bom@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
+
+strip-eof@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
+
+strip-indent@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2"
+  dependencies:
+    get-stdin "^4.0.1"
+
+strip-indent@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68"
+
+strip-json-comments@2.0.1, strip-json-comments@~2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
+
+subarg@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/subarg/-/subarg-1.0.0.tgz#f62cf17581e996b48fc965699f54c06ae268b8d2"
+  dependencies:
+    minimist "^1.1.0"
+
+supports-color@3.1.2:
+  version "3.1.2"
+  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.1.2.tgz#72a262894d9d408b956ca05ff37b2ed8a6e2a2d5"
+  dependencies:
+    has-flag "^1.0.0"
+
+supports-color@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
+
+supports-color@^3.1.0:
+  version "3.2.3"
+  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6"
+  dependencies:
+    has-flag "^1.0.0"
+
+supports-color@^4.2.1:
+  version "4.5.0"
+  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b"
+  dependencies:
+    has-flag "^2.0.0"
+
+supports-color@^5.3.0:
+  version "5.3.0"
+  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.3.0.tgz#5b24ac15db80fa927cf5227a4a33fd3c4c7676c0"
+  dependencies:
+    has-flag "^3.0.0"
+
+symbol-observable@1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.1.tgz#8340fc4702c3122df5d22288f88283f513d3fdd4"
+
+symbol-observable@^0.2.2:
+  version "0.2.4"
+  resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-0.2.4.tgz#95a83db26186d6af7e7a18dbd9760a2f86d08f40"
+
+symbol-tree@^3.2.2:
+  version "3.2.2"
+  resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6"
+
+syntax-error@^1.1.1:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/syntax-error/-/syntax-error-1.4.0.tgz#2d9d4ff5c064acb711594a3e3b95054ad51d907c"
+  dependencies:
+    acorn-node "^1.2.0"
+
+table@4.0.2:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36"
+  dependencies:
+    ajv "^5.2.3"
+    ajv-keywords "^2.1.0"
+    chalk "^2.1.0"
+    lodash "^4.17.4"
+    slice-ansi "1.0.0"
+    string-width "^2.1.1"
+
+tapable@^0.2.7:
+  version "0.2.8"
+  resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.8.tgz#99372a5c999bf2df160afc0d74bed4f47948cd22"
+
+tape@2.3.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/tape/-/tape-2.3.0.tgz#0dfeec709227fbcc9170abe7f046962b271431db"
+  dependencies:
+    deep-equal "~0.1.0"
+    defined "~0.0.0"
+    inherits "~2.0.1"
+    jsonify "~0.0.0"
+    resumer "~0.0.0"
+    split "~0.2.10"
+    stream-combiner "~0.0.2"
+    through "~2.3.4"
+
+tar-pack@^3.4.0:
+  version "3.4.1"
+  resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.1.tgz#e1dbc03a9b9d3ba07e896ad027317eb679a10a1f"
+  dependencies:
+    debug "^2.2.0"
+    fstream "^1.0.10"
+    fstream-ignore "^1.0.5"
+    once "^1.3.3"
+    readable-stream "^2.1.4"
+    rimraf "^2.5.1"
+    tar "^2.2.1"
+    uid-number "^0.0.6"
+
+tar-stream@^1.5.0:
+  version "1.5.5"
+  resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.5.5.tgz#5cad84779f45c83b1f2508d96b09d88c7218af55"
+  dependencies:
+    bl "^1.0.0"
+    end-of-stream "^1.0.0"
+    readable-stream "^2.0.0"
+    xtend "^4.0.0"
+
+tar@^2.2.1:
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1"
+  dependencies:
+    block-stream "*"
+    fstream "^1.0.2"
+    inherits "2"
+
+test-exclude@^4.1.1:
+  version "4.2.0"
+  resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.2.0.tgz#07e3613609a362c74516a717515e13322ab45b3c"
+  dependencies:
+    arrify "^1.0.1"
+    micromatch "^2.3.11"
+    object-assign "^4.1.0"
+    read-pkg-up "^1.0.1"
+    require-main-filename "^1.0.1"
+
+text-extensions@^1.0.0:
+  version "1.7.0"
+  resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-1.7.0.tgz#faaaba2625ed746d568a23e4d0aacd9bf08a8b39"
+
+text-table@~0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
+
+throttleit@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528ac6c"
+
+through2@^2.0.0, through2@^2.0.2:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be"
+  dependencies:
+    readable-stream "^2.1.5"
+    xtend "~4.0.1"
+
+through@2, "through@>=2.2.7 <3", through@^2.3.6, through@~2.3.4:
+  version "2.3.8"
+  resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
+
+thunkify@~2.1.1:
+  version "2.1.2"
+  resolved "https://registry.yarnpkg.com/thunkify/-/thunkify-2.1.2.tgz#faa0e9d230c51acc95ca13a361ac05ca7e04553d"
+
+time-stamp@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-2.0.0.tgz#95c6a44530e15ba8d6f4a3ecb8c3a3fac46da357"
+
+timers-browserify@^1.0.1:
+  version "1.4.2"
+  resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-1.4.2.tgz#c9c58b575be8407375cb5e2462dacee74359f41d"
+  dependencies:
+    process "~0.11.0"
+
+timers-browserify@^2.0.4:
+  version "2.0.6"
+  resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.6.tgz#241e76927d9ca05f4d959819022f5b3664b64bae"
+  dependencies:
+    setimmediate "^1.0.4"
+
+timespan@2.3.x:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/timespan/-/timespan-2.3.0.tgz#4902ce040bd13d845c8f59b27e9d59bad6f39929"
+
+tmp@0.0.33, tmp@0.0.x, tmp@^0.0.33:
+  version "0.0.33"
+  resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
+  dependencies:
+    os-tmpdir "~1.0.2"
+
+tmp@^0.0.29:
+  version "0.0.29"
+  resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.29.tgz#f25125ff0dd9da3ccb0c2dd371ee1288bb9128c0"
+  dependencies:
+    os-tmpdir "~1.0.1"
+
+to-array@0.1.4:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890"
+
+to-arraybuffer@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43"
+
+to-fast-properties@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47"
+
+to-fast-properties@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
+
+to-object-path@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af"
+  dependencies:
+    kind-of "^3.0.2"
+
+to-regex-range@^2.1.0:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38"
+  dependencies:
+    is-number "^3.0.0"
+    repeat-string "^1.6.1"
+
+to-regex@^3.0.1:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce"
+  dependencies:
+    define-property "^2.0.2"
+    extend-shallow "^3.0.2"
+    regex-not "^1.0.2"
+    safe-regex "^1.1.0"
+
+tough-cookie@>=0.12.0, tough-cookie@>=2.3.3, tough-cookie@^2.3.3, tough-cookie@~2.3.0, tough-cookie@~2.3.3:
+  version "2.3.4"
+  resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655"
+  dependencies:
+    punycode "^1.4.1"
+
+tr46@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09"
+  dependencies:
+    punycode "^2.1.0"
+
+trim-newlines@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613"
+
+trim-newlines@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-2.0.0.tgz#b403d0b91be50c331dfc4b82eeceb22c3de16d20"
+
+trim-off-newlines@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz#9f9ba9d9efa8764c387698bcbfeb2c848f11adb3"
+
+trim-right@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003"
+
+tsscmp@~1.0.0:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/tsscmp/-/tsscmp-1.0.5.tgz#7dc4a33af71581ab4337da91d85ca5427ebd9a97"
+
+tty-browserify@0.0.0:
+  version "0.0.0"
+  resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6"
+
+tty-browserify@~0.0.0:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.1.tgz#3f05251ee17904dfd0677546670db9651682b811"
+
+tunnel-agent@^0.6.0:
+  version "0.6.0"
+  resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
+  dependencies:
+    safe-buffer "^5.0.1"
+
+tunnel-agent@~0.4.0, tunnel-agent@~0.4.1:
+  version "0.4.3"
+  resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb"
+
+tweetnacl@^0.14.3, tweetnacl@~0.14.0:
+  version "0.14.5"
+  resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
+
+type-check@~0.3.2:
+  version "0.3.2"
+  resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72"
+  dependencies:
+    prelude-ls "~1.1.2"
+
+type-detect@0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-0.1.1.tgz#0ba5ec2a885640e470ea4e8505971900dac58822"
+
+type-is@~1.6.15:
+  version "1.6.16"
+  resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194"
+  dependencies:
+    media-typer "0.3.0"
+    mime-types "~2.1.18"
+
+typedarray@^0.0.6, typedarray@~0.0.5:
+  version "0.0.6"
+  resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
+
+typescript@^2.7.1:
+  version "2.7.2"
+  resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.7.2.tgz#2d615a1ef4aee4f574425cdff7026edf81919836"
+
+uglify-js@^2.6, uglify-js@^2.8.29:
+  version "2.8.29"
+  resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd"
+  dependencies:
+    source-map "~0.5.1"
+    yargs "~3.10.0"
+  optionalDependencies:
+    uglify-to-browserify "~1.0.0"
+
+uglify-js@^3.0.15:
+  version "3.3.13"
+  resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.3.13.tgz#8a1a89eeb16e2d6a66b0db2b04cb871af3c669cf"
+  dependencies:
+    commander "~2.14.1"
+    source-map "~0.6.1"
+
+uglify-to-browserify@~1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7"
+
+uglifyjs-webpack-plugin@^0.4.6:
+  version "0.4.6"
+  resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz#b951f4abb6bd617e66f63eb891498e391763e309"
+  dependencies:
+    source-map "^0.5.6"
+    uglify-js "^2.8.29"
+    webpack-sources "^1.0.1"
+
+uid-number@^0.0.6:
+  version "0.0.6"
+  resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81"
+
+ultron@~1.1.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c"
+
+umd@^3.0.0:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/umd/-/umd-3.0.1.tgz#8ae556e11011f63c2596708a8837259f01b3d60e"
+
+underscore.string@3.3.4:
+  version "3.3.4"
+  resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-3.3.4.tgz#2c2a3f9f83e64762fdc45e6ceac65142864213db"
+  dependencies:
+    sprintf-js "^1.0.3"
+    util-deprecate "^1.0.2"
+
+underscore@~1.7.0:
+  version "1.7.0"
+  resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.7.0.tgz#6bbaf0877500d36be34ecaa584e0db9fef035209"
+
+union-value@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4"
+  dependencies:
+    arr-union "^3.1.0"
+    get-value "^2.0.6"
+    is-extendable "^0.1.1"
+    set-value "^0.4.3"
+
+union@~0.4.3:
+  version "0.4.6"
+  resolved "https://registry.yarnpkg.com/union/-/union-0.4.6.tgz#198fbdaeba254e788b0efcb630bc11f24a2959e0"
+  dependencies:
+    qs "~2.3.3"
+
+unpipe@1.0.0, unpipe@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
+
+unset-value@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559"
+  dependencies:
+    has-value "^0.3.1"
+    isobject "^3.0.0"
+
+upath@^1.0.0:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/upath/-/upath-1.0.4.tgz#ee2321ba0a786c50973db043a50b7bcba822361d"
+
+urix@^0.1.0, urix@~0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
+
+url-join@^2.0.2:
+  version "2.0.5"
+  resolved "https://registry.yarnpkg.com/url-join/-/url-join-2.0.5.tgz#5af22f18c052a000a48d7b82c5e9c2e2feeda728"
+
+url@^0.11.0, url@~0.11.0:
+  version "0.11.0"
+  resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1"
+  dependencies:
+    punycode "1.3.2"
+    querystring "0.2.0"
+
+urlgrey@0.4.0:
+  version "0.4.0"
+  resolved "https://registry.yarnpkg.com/urlgrey/-/urlgrey-0.4.0.tgz#f065357040fb35c3b311d4e5dc36484d96dbea06"
+  dependencies:
+    tape "2.3.0"
+
+use@^2.0.0:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/use/-/use-2.0.2.tgz#ae28a0d72f93bf22422a18a2e379993112dec8e8"
+  dependencies:
+    define-property "^0.2.5"
+    isobject "^3.0.0"
+    lazy-cache "^2.0.2"
+
+useragent@^2.1.12:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/useragent/-/useragent-2.3.0.tgz#217f943ad540cb2128658ab23fc960f6a88c9972"
+  dependencies:
+    lru-cache "4.1.x"
+    tmp "0.0.x"
+
+util-deprecate@^1.0.2, util-deprecate@~1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+
+util@0.10.3, util@^0.10.3, util@~0.10.1:
+  version "0.10.3"
+  resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9"
+  dependencies:
+    inherits "2.0.1"
+
+utils-merge@1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
+
+uuid@^3.0.0, uuid@^3.1.0:
+  version "3.2.1"
+  resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14"
+
+uws@~9.14.0:
+  version "9.14.0"
+  resolved "https://registry.yarnpkg.com/uws/-/uws-9.14.0.tgz#fac8386befc33a7a3705cbd58dc47b430ca4dd95"
+
+validate-npm-package-license@^3.0.1:
+  version "3.0.3"
+  resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz#81643bcbef1bdfecd4623793dc4648948ba98338"
+  dependencies:
+    spdx-correct "^3.0.0"
+    spdx-expression-parse "^3.0.0"
+
+vargs@0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/vargs/-/vargs-0.1.0.tgz#6b6184da6520cc3204ce1b407cac26d92609ebff"
+
+verror@1.10.0:
+  version "1.10.0"
+  resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400"
+  dependencies:
+    assert-plus "^1.0.0"
+    core-util-is "1.0.2"
+    extsprintf "^1.2.0"
+
+vlq@^0.2.1:
+  version "0.2.3"
+  resolved "https://registry.yarnpkg.com/vlq/-/vlq-0.2.3.tgz#8f3e4328cf63b1540c0d67e1b2778386f8975b26"
+
+vlq@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/vlq/-/vlq-1.0.0.tgz#8101be90843422954c2b13eb27f2f3122bdcc806"
+
+vm-browserify@0.0.4, vm-browserify@~0.0.1:
+  version "0.0.4"
+  resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73"
+  dependencies:
+    indexof "0.0.1"
+
+void-elements@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec"
+
+w3c-hr-time@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz#82ac2bff63d950ea9e3189a58a65625fedf19045"
+  dependencies:
+    browser-process-hrtime "^0.1.2"
+
+walkdir@^0.0.11:
+  version "0.0.11"
+  resolved "https://registry.yarnpkg.com/walkdir/-/walkdir-0.0.11.tgz#a16d025eb931bd03b52f308caed0f40fcebe9532"
+
+watchpack@^1.4.0:
+  version "1.5.0"
+  resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.5.0.tgz#231e783af830a22f8966f65c4c4bacc814072eed"
+  dependencies:
+    chokidar "^2.0.2"
+    graceful-fs "^4.1.2"
+    neo-async "^2.5.0"
+
+wd@^1.4.0:
+  version "1.6.0"
+  resolved "https://registry.yarnpkg.com/wd/-/wd-1.6.0.tgz#29f6de1531302a0c553478eeff16ae1e1639b472"
+  dependencies:
+    archiver "1.3.0"
+    async "2.0.1"
+    lodash "4.16.2"
+    mkdirp "^0.5.1"
+    q "1.4.1"
+    request "2.79.0"
+    underscore.string "3.3.4"
+    vargs "0.1.0"
+
+webidl-conversions@^4.0.1, webidl-conversions@^4.0.2:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad"
+
+webpack-dev-middleware@^1.12.0:
+  version "1.12.2"
+  resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz#f8fc1120ce3b4fc5680ceecb43d777966b21105e"
+  dependencies:
+    memory-fs "~0.4.1"
+    mime "^1.5.0"
+    path-is-absolute "^1.0.0"
+    range-parser "^1.0.3"
+    time-stamp "^2.0.0"
+
+webpack-sources@^1.0.1:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.1.0.tgz#a101ebae59d6507354d71d8013950a3a8b7a5a54"
+  dependencies:
+    source-list-map "^2.0.0"
+    source-map "~0.6.1"
+
+webpack@^3.11.0:
+  version "3.11.0"
+  resolved "https://registry.yarnpkg.com/webpack/-/webpack-3.11.0.tgz#77da451b1d7b4b117adaf41a1a93b5742f24d894"
+  dependencies:
+    acorn "^5.0.0"
+    acorn-dynamic-import "^2.0.0"
+    ajv "^6.1.0"
+    ajv-keywords "^3.1.0"
+    async "^2.1.2"
+    enhanced-resolve "^3.4.0"
+    escope "^3.6.0"
+    interpret "^1.0.0"
+    json-loader "^0.5.4"
+    json5 "^0.5.1"
+    loader-runner "^2.3.0"
+    loader-utils "^1.1.0"
+    memory-fs "~0.4.1"
+    mkdirp "~0.5.0"
+    node-libs-browser "^2.0.0"
+    source-map "^0.5.3"
+    supports-color "^4.2.1"
+    tapable "^0.2.7"
+    uglifyjs-webpack-plugin "^0.4.6"
+    watchpack "^1.4.0"
+    webpack-sources "^1.0.1"
+    yargs "^8.0.2"
+
+weex-js-runtime@^0.23.6:
+  version "0.23.7"
+  resolved "https://registry.yarnpkg.com/weex-js-runtime/-/weex-js-runtime-0.23.7.tgz#c9d3427f2debf1d638ab4e41bb4f0e539a51915c"
+
+weex-styler@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/weex-styler/-/weex-styler-0.3.0.tgz#5d614c9cf6d8cec0e23231a92955b722556bfe1a"
+  dependencies:
+    css "~2.2.1"
+
+whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz#57c235bc8657e914d24e1a397d3c82daee0a6ba3"
+  dependencies:
+    iconv-lite "0.4.19"
+
+whatwg-url@^6.4.0:
+  version "6.4.0"
+  resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.4.0.tgz#08fdf2b9e872783a7a1f6216260a1d66cc722e08"
+  dependencies:
+    lodash.sortby "^4.7.0"
+    tr46 "^1.0.0"
+    webidl-conversions "^4.0.1"
+
+when@^3.7.7:
+  version "3.7.8"
+  resolved "https://registry.yarnpkg.com/when/-/when-3.7.8.tgz#c7130b6a7ea04693e842cdc9e7a1f2aa39a39f82"
+
+which-module@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
+
+which@^1.1.1, which@^1.2.1, which@^1.2.10, which@^1.2.12, which@^1.2.9:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a"
+  dependencies:
+    isexe "^2.0.0"
+
+wide-align@^1.1.0:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710"
+  dependencies:
+    string-width "^1.0.2"
+
+window-size@0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d"
+
+word-wrap@^1.0.3:
+  version "1.2.3"
+  resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c"
+
+wordwrap@0.0.2:
+  version "0.0.2"
+  resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f"
+
+wordwrap@^1.0.0, wordwrap@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"
+
+wordwrap@~0.0.2:
+  version "0.0.3"
+  resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107"
+
+wrap-ansi@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85"
+  dependencies:
+    string-width "^1.0.1"
+    strip-ansi "^3.0.1"
+
+wrappy@1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+
+write@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757"
+  dependencies:
+    mkdirp "^0.5.1"
+
+ws@^4.0.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/ws/-/ws-4.1.0.tgz#a979b5d7d4da68bf54efe0408967c324869a7289"
+  dependencies:
+    async-limiter "~1.0.0"
+    safe-buffer "~5.1.0"
+
+ws@~3.3.1:
+  version "3.3.3"
+  resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2"
+  dependencies:
+    async-limiter "~1.0.0"
+    safe-buffer "~5.1.0"
+    ultron "~1.1.0"
+
+xml-name-validator@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a"
+
+xmlhttprequest-ssl@~1.5.4:
+  version "1.5.5"
+  resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz#c2876b06168aadc40e57d97e81191ac8f4398b3e"
+
+xregexp@2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-2.0.0.tgz#52a63e56ca0b84a7f3a5f3d61872f126ad7a5943"
+
+xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
+
+y18n@^3.2.1:
+  version "3.2.1"
+  resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41"
+
+yallist@^2.1.2:
+  version "2.1.2"
+  resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
+
+yargs-parser@^7.0.0:
+  version "7.0.0"
+  resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9"
+  dependencies:
+    camelcase "^4.1.0"
+
+yargs@^8.0.2:
+  version "8.0.2"
+  resolved "https://registry.yarnpkg.com/yargs/-/yargs-8.0.2.tgz#6299a9055b1cefc969ff7e79c1d918dceb22c360"
+  dependencies:
+    camelcase "^4.1.0"
+    cliui "^3.2.0"
+    decamelize "^1.1.1"
+    get-caller-file "^1.0.1"
+    os-locale "^2.0.0"
+    read-pkg-up "^2.0.0"
+    require-directory "^2.1.1"
+    require-main-filename "^1.0.1"
+    set-blocking "^2.0.0"
+    string-width "^2.0.0"
+    which-module "^2.0.0"
+    y18n "^3.2.1"
+    yargs-parser "^7.0.0"
+
+yargs@~3.10.0:
+  version "3.10.0"
+  resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1"
+  dependencies:
+    camelcase "^1.0.2"
+    cliui "^2.1.0"
+    decamelize "^1.0.0"
+    window-size "0.1.0"
+
+yauzl@2.4.1:
+  version "2.4.1"
+  resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.4.1.tgz#9528f442dab1b2284e58b4379bb194e22e0c4005"
+  dependencies:
+    fd-slicer "~1.0.1"
+
+yeast@0.1.2:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419"
+
+yorkie@^1.0.1:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/yorkie/-/yorkie-1.0.3.tgz#5c05db48c012def99c29b79685b6ba2e40c8c671"
+  dependencies:
+    execa "^0.8.0"
+    is-ci "^1.0.10"
+    normalize-path "^1.0.0"
+    strip-indent "^2.0.0"
+
+zip-stream@^1.1.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-1.2.0.tgz#a8bc45f4c1b49699c6b90198baacaacdbcd4ba04"
+  dependencies:
+    archiver-utils "^1.3.0"
+    compress-commons "^1.2.0"
+    lodash "^4.8.0"
+    readable-stream "^2.0.0"
diff --git a/advancedcontentfilter/vendor/autoload.php b/advancedcontentfilter/vendor/autoload.php
new file mode 100644 (file)
index 0000000..3e6193f
--- /dev/null
@@ -0,0 +1,7 @@
+<?php
+
+// autoload.php @generated by Composer
+
+require_once __DIR__ . '/composer/autoload_real.php';
+
+return ComposerAutoloaderInitAdvancedContentFilterAddon::getLoader();
diff --git a/advancedcontentfilter/vendor/composer/ClassLoader.php b/advancedcontentfilter/vendor/composer/ClassLoader.php
new file mode 100644 (file)
index 0000000..dc02dfb
--- /dev/null
@@ -0,0 +1,445 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Autoload;
+
+/**
+ * ClassLoader implements a PSR-0, PSR-4 and classmap class loader.
+ *
+ *     $loader = new \Composer\Autoload\ClassLoader();
+ *
+ *     // register classes with namespaces
+ *     $loader->add('Symfony\Component', __DIR__.'/component');
+ *     $loader->add('Symfony',           __DIR__.'/framework');
+ *
+ *     // activate the autoloader
+ *     $loader->register();
+ *
+ *     // to enable searching the include path (eg. for PEAR packages)
+ *     $loader->setUseIncludePath(true);
+ *
+ * In this example, if you try to use a class in the Symfony\Component
+ * namespace or one of its children (Symfony\Component\Console for instance),
+ * the autoloader will first look for the class under the component/
+ * directory, and it will then fallback to the framework/ directory if not
+ * found before giving up.
+ *
+ * This class is loosely based on the Symfony UniversalClassLoader.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ * @see    http://www.php-fig.org/psr/psr-0/
+ * @see    http://www.php-fig.org/psr/psr-4/
+ */
+class ClassLoader
+{
+    // PSR-4
+    private $prefixLengthsPsr4 = array();
+    private $prefixDirsPsr4 = array();
+    private $fallbackDirsPsr4 = array();
+
+    // PSR-0
+    private $prefixesPsr0 = array();
+    private $fallbackDirsPsr0 = array();
+
+    private $useIncludePath = false;
+    private $classMap = array();
+    private $classMapAuthoritative = false;
+    private $missingClasses = array();
+    private $apcuPrefix;
+
+    public function getPrefixes()
+    {
+        if (!empty($this->prefixesPsr0)) {
+            return call_user_func_array('array_merge', $this->prefixesPsr0);
+        }
+
+        return array();
+    }
+
+    public function getPrefixesPsr4()
+    {
+        return $this->prefixDirsPsr4;
+    }
+
+    public function getFallbackDirs()
+    {
+        return $this->fallbackDirsPsr0;
+    }
+
+    public function getFallbackDirsPsr4()
+    {
+        return $this->fallbackDirsPsr4;
+    }
+
+    public function getClassMap()
+    {
+        return $this->classMap;
+    }
+
+    /**
+     * @param array $classMap Class to filename map
+     */
+    public function addClassMap(array $classMap)
+    {
+        if ($this->classMap) {
+            $this->classMap = array_merge($this->classMap, $classMap);
+        } else {
+            $this->classMap = $classMap;
+        }
+    }
+
+    /**
+     * Registers a set of PSR-0 directories for a given prefix, either
+     * appending or prepending to the ones previously set for this prefix.
+     *
+     * @param string       $prefix  The prefix
+     * @param array|string $paths   The PSR-0 root directories
+     * @param bool         $prepend Whether to prepend the directories
+     */
+    public function add($prefix, $paths, $prepend = false)
+    {
+        if (!$prefix) {
+            if ($prepend) {
+                $this->fallbackDirsPsr0 = array_merge(
+                    (array) $paths,
+                    $this->fallbackDirsPsr0
+                );
+            } else {
+                $this->fallbackDirsPsr0 = array_merge(
+                    $this->fallbackDirsPsr0,
+                    (array) $paths
+                );
+            }
+
+            return;
+        }
+
+        $first = $prefix[0];
+        if (!isset($this->prefixesPsr0[$first][$prefix])) {
+            $this->prefixesPsr0[$first][$prefix] = (array) $paths;
+
+            return;
+        }
+        if ($prepend) {
+            $this->prefixesPsr0[$first][$prefix] = array_merge(
+                (array) $paths,
+                $this->prefixesPsr0[$first][$prefix]
+            );
+        } else {
+            $this->prefixesPsr0[$first][$prefix] = array_merge(
+                $this->prefixesPsr0[$first][$prefix],
+                (array) $paths
+            );
+        }
+    }
+
+    /**
+     * Registers a set of PSR-4 directories for a given namespace, either
+     * appending or prepending to the ones previously set for this namespace.
+     *
+     * @param string       $prefix  The prefix/namespace, with trailing '\\'
+     * @param array|string $paths   The PSR-4 base directories
+     * @param bool         $prepend Whether to prepend the directories
+     *
+     * @throws \InvalidArgumentException
+     */
+    public function addPsr4($prefix, $paths, $prepend = false)
+    {
+        if (!$prefix) {
+            // Register directories for the root namespace.
+            if ($prepend) {
+                $this->fallbackDirsPsr4 = array_merge(
+                    (array) $paths,
+                    $this->fallbackDirsPsr4
+                );
+            } else {
+                $this->fallbackDirsPsr4 = array_merge(
+                    $this->fallbackDirsPsr4,
+                    (array) $paths
+                );
+            }
+        } elseif (!isset($this->prefixDirsPsr4[$prefix])) {
+            // Register directories for a new namespace.
+            $length = strlen($prefix);
+            if ('\\' !== $prefix[$length - 1]) {
+                throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
+            }
+            $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
+            $this->prefixDirsPsr4[$prefix] = (array) $paths;
+        } elseif ($prepend) {
+            // Prepend directories for an already registered namespace.
+            $this->prefixDirsPsr4[$prefix] = array_merge(
+                (array) $paths,
+                $this->prefixDirsPsr4[$prefix]
+            );
+        } else {
+            // Append directories for an already registered namespace.
+            $this->prefixDirsPsr4[$prefix] = array_merge(
+                $this->prefixDirsPsr4[$prefix],
+                (array) $paths
+            );
+        }
+    }
+
+    /**
+     * Registers a set of PSR-0 directories for a given prefix,
+     * replacing any others previously set for this prefix.
+     *
+     * @param string       $prefix The prefix
+     * @param array|string $paths  The PSR-0 base directories
+     */
+    public function set($prefix, $paths)
+    {
+        if (!$prefix) {
+            $this->fallbackDirsPsr0 = (array) $paths;
+        } else {
+            $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths;
+        }
+    }
+
+    /**
+     * Registers a set of PSR-4 directories for a given namespace,
+     * replacing any others previously set for this namespace.
+     *
+     * @param string       $prefix The prefix/namespace, with trailing '\\'
+     * @param array|string $paths  The PSR-4 base directories
+     *
+     * @throws \InvalidArgumentException
+     */
+    public function setPsr4($prefix, $paths)
+    {
+        if (!$prefix) {
+            $this->fallbackDirsPsr4 = (array) $paths;
+        } else {
+            $length = strlen($prefix);
+            if ('\\' !== $prefix[$length - 1]) {
+                throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
+            }
+            $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
+            $this->prefixDirsPsr4[$prefix] = (array) $paths;
+        }
+    }
+
+    /**
+     * Turns on searching the include path for class files.
+     *
+     * @param bool $useIncludePath
+     */
+    public function setUseIncludePath($useIncludePath)
+    {
+        $this->useIncludePath = $useIncludePath;
+    }
+
+    /**
+     * Can be used to check if the autoloader uses the include path to check
+     * for classes.
+     *
+     * @return bool
+     */
+    public function getUseIncludePath()
+    {
+        return $this->useIncludePath;
+    }
+
+    /**
+     * Turns off searching the prefix and fallback directories for classes
+     * that have not been registered with the class map.
+     *
+     * @param bool $classMapAuthoritative
+     */
+    public function setClassMapAuthoritative($classMapAuthoritative)
+    {
+        $this->classMapAuthoritative = $classMapAuthoritative;
+    }
+
+    /**
+     * Should class lookup fail if not found in the current class map?
+     *
+     * @return bool
+     */
+    public function isClassMapAuthoritative()
+    {
+        return $this->classMapAuthoritative;
+    }
+
+    /**
+     * APCu prefix to use to cache found/not-found classes, if the extension is enabled.
+     *
+     * @param string|null $apcuPrefix
+     */
+    public function setApcuPrefix($apcuPrefix)
+    {
+        $this->apcuPrefix = function_exists('apcu_fetch') && ini_get('apc.enabled') ? $apcuPrefix : null;
+    }
+
+    /**
+     * The APCu prefix in use, or null if APCu caching is not enabled.
+     *
+     * @return string|null
+     */
+    public function getApcuPrefix()
+    {
+        return $this->apcuPrefix;
+    }
+
+    /**
+     * Registers this instance as an autoloader.
+     *
+     * @param bool $prepend Whether to prepend the autoloader or not
+     */
+    public function register($prepend = false)
+    {
+        spl_autoload_register(array($this, 'loadClass'), true, $prepend);
+    }
+
+    /**
+     * Unregisters this instance as an autoloader.
+     */
+    public function unregister()
+    {
+        spl_autoload_unregister(array($this, 'loadClass'));
+    }
+
+    /**
+     * Loads the given class or interface.
+     *
+     * @param  string    $class The name of the class
+     * @return bool|null True if loaded, null otherwise
+     */
+    public function loadClass($class)
+    {
+        if ($file = $this->findFile($class)) {
+            includeFile($file);
+
+            return true;
+        }
+    }
+
+    /**
+     * Finds the path to the file where the class is defined.
+     *
+     * @param string $class The name of the class
+     *
+     * @return string|false The path if found, false otherwise
+     */
+    public function findFile($class)
+    {
+        // class map lookup
+        if (isset($this->classMap[$class])) {
+            return $this->classMap[$class];
+        }
+        if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) {
+            return false;
+        }
+        if (null !== $this->apcuPrefix) {
+            $file = apcu_fetch($this->apcuPrefix.$class, $hit);
+            if ($hit) {
+                return $file;
+            }
+        }
+
+        $file = $this->findFileWithExtension($class, '.php');
+
+        // Search for Hack files if we are running on HHVM
+        if (false === $file && defined('HHVM_VERSION')) {
+            $file = $this->findFileWithExtension($class, '.hh');
+        }
+
+        if (null !== $this->apcuPrefix) {
+            apcu_add($this->apcuPrefix.$class, $file);
+        }
+
+        if (false === $file) {
+            // Remember that this class does not exist.
+            $this->missingClasses[$class] = true;
+        }
+
+        return $file;
+    }
+
+    private function findFileWithExtension($class, $ext)
+    {
+        // PSR-4 lookup
+        $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext;
+
+        $first = $class[0];
+        if (isset($this->prefixLengthsPsr4[$first])) {
+            $subPath = $class;
+            while (false !== $lastPos = strrpos($subPath, '\\')) {
+                $subPath = substr($subPath, 0, $lastPos);
+                $search = $subPath.'\\';
+                if (isset($this->prefixDirsPsr4[$search])) {
+                    $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1);
+                    foreach ($this->prefixDirsPsr4[$search] as $dir) {
+                        if (file_exists($file = $dir . $pathEnd)) {
+                            return $file;
+                        }
+                    }
+                }
+            }
+        }
+
+        // PSR-4 fallback dirs
+        foreach ($this->fallbackDirsPsr4 as $dir) {
+            if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {
+                return $file;
+            }
+        }
+
+        // PSR-0 lookup
+        if (false !== $pos = strrpos($class, '\\')) {
+            // namespaced class name
+            $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1)
+                . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR);
+        } else {
+            // PEAR-like class name
+            $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext;
+        }
+
+        if (isset($this->prefixesPsr0[$first])) {
+            foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) {
+                if (0 === strpos($class, $prefix)) {
+                    foreach ($dirs as $dir) {
+                        if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
+                            return $file;
+                        }
+                    }
+                }
+            }
+        }
+
+        // PSR-0 fallback dirs
+        foreach ($this->fallbackDirsPsr0 as $dir) {
+            if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
+                return $file;
+            }
+        }
+
+        // PSR-0 include paths.
+        if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) {
+            return $file;
+        }
+
+        return false;
+    }
+}
+
+/**
+ * Scope isolated include.
+ *
+ * Prevents access to $this/self from included files.
+ */
+function includeFile($file)
+{
+    include $file;
+}
diff --git a/advancedcontentfilter/vendor/composer/LICENSE b/advancedcontentfilter/vendor/composer/LICENSE
new file mode 100644 (file)
index 0000000..f27399a
--- /dev/null
@@ -0,0 +1,21 @@
+
+Copyright (c) Nils Adermann, Jordi Boggiano
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is furnished
+to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
diff --git a/advancedcontentfilter/vendor/composer/autoload_classmap.php b/advancedcontentfilter/vendor/composer/autoload_classmap.php
new file mode 100644 (file)
index 0000000..7ac4d2b
--- /dev/null
@@ -0,0 +1,261 @@
+<?php
+
+// autoload_classmap.php @generated by Composer
+
+$vendorDir = dirname(dirname(__FILE__));
+$baseDir = dirname($vendorDir);
+
+return array(
+    'FastRoute\\BadRouteException' => $vendorDir . '/nikic/fast-route/src/BadRouteException.php',
+    'FastRoute\\DataGenerator' => $vendorDir . '/nikic/fast-route/src/DataGenerator.php',
+    'FastRoute\\DataGenerator\\CharCountBased' => $vendorDir . '/nikic/fast-route/src/DataGenerator/CharCountBased.php',
+    'FastRoute\\DataGenerator\\GroupCountBased' => $vendorDir . '/nikic/fast-route/src/DataGenerator/GroupCountBased.php',
+    'FastRoute\\DataGenerator\\GroupPosBased' => $vendorDir . '/nikic/fast-route/src/DataGenerator/GroupPosBased.php',
+    'FastRoute\\DataGenerator\\MarkBased' => $vendorDir . '/nikic/fast-route/src/DataGenerator/MarkBased.php',
+    'FastRoute\\DataGenerator\\RegexBasedAbstract' => $vendorDir . '/nikic/fast-route/src/DataGenerator/RegexBasedAbstract.php',
+    'FastRoute\\Dispatcher' => $vendorDir . '/nikic/fast-route/src/Dispatcher.php',
+    'FastRoute\\Dispatcher\\CharCountBased' => $vendorDir . '/nikic/fast-route/src/Dispatcher/CharCountBased.php',
+    'FastRoute\\Dispatcher\\GroupCountBased' => $vendorDir . '/nikic/fast-route/src/Dispatcher/GroupCountBased.php',
+    'FastRoute\\Dispatcher\\GroupPosBased' => $vendorDir . '/nikic/fast-route/src/Dispatcher/GroupPosBased.php',
+    'FastRoute\\Dispatcher\\MarkBased' => $vendorDir . '/nikic/fast-route/src/Dispatcher/MarkBased.php',
+    'FastRoute\\Dispatcher\\RegexBasedAbstract' => $vendorDir . '/nikic/fast-route/src/Dispatcher/RegexBasedAbstract.php',
+    'FastRoute\\Route' => $vendorDir . '/nikic/fast-route/src/Route.php',
+    'FastRoute\\RouteCollector' => $vendorDir . '/nikic/fast-route/src/RouteCollector.php',
+    'FastRoute\\RouteParser' => $vendorDir . '/nikic/fast-route/src/RouteParser.php',
+    'FastRoute\\RouteParser\\Std' => $vendorDir . '/nikic/fast-route/src/RouteParser/Std.php',
+    'Fxp\\Composer\\AssetPlugin\\Assets' => $vendorDir . '/fxp/composer-asset-plugin/Assets.php',
+    'Fxp\\Composer\\AssetPlugin\\Composer\\ScriptHandler' => $vendorDir . '/fxp/composer-asset-plugin/Composer/ScriptHandler.php',
+    'Fxp\\Composer\\AssetPlugin\\Config\\Config' => $vendorDir . '/fxp/composer-asset-plugin/Config/Config.php',
+    'Fxp\\Composer\\AssetPlugin\\Config\\ConfigBuilder' => $vendorDir . '/fxp/composer-asset-plugin/Config/ConfigBuilder.php',
+    'Fxp\\Composer\\AssetPlugin\\Converter\\AbstractPackageConverter' => $vendorDir . '/fxp/composer-asset-plugin/Converter/AbstractPackageConverter.php',
+    'Fxp\\Composer\\AssetPlugin\\Converter\\BowerPackageConverter' => $vendorDir . '/fxp/composer-asset-plugin/Converter/BowerPackageConverter.php',
+    'Fxp\\Composer\\AssetPlugin\\Converter\\NpmPackageConverter' => $vendorDir . '/fxp/composer-asset-plugin/Converter/NpmPackageConverter.php',
+    'Fxp\\Composer\\AssetPlugin\\Converter\\NpmPackageUtil' => $vendorDir . '/fxp/composer-asset-plugin/Converter/NpmPackageUtil.php',
+    'Fxp\\Composer\\AssetPlugin\\Converter\\PackageConverterInterface' => $vendorDir . '/fxp/composer-asset-plugin/Converter/PackageConverterInterface.php',
+    'Fxp\\Composer\\AssetPlugin\\Converter\\PackageUtil' => $vendorDir . '/fxp/composer-asset-plugin/Converter/PackageUtil.php',
+    'Fxp\\Composer\\AssetPlugin\\Converter\\SemverConverter' => $vendorDir . '/fxp/composer-asset-plugin/Converter/SemverConverter.php',
+    'Fxp\\Composer\\AssetPlugin\\Converter\\SemverRangeUtil' => $vendorDir . '/fxp/composer-asset-plugin/Converter/SemverRangeUtil.php',
+    'Fxp\\Composer\\AssetPlugin\\Converter\\SemverUtil' => $vendorDir . '/fxp/composer-asset-plugin/Converter/SemverUtil.php',
+    'Fxp\\Composer\\AssetPlugin\\Converter\\VersionConverterInterface' => $vendorDir . '/fxp/composer-asset-plugin/Converter/VersionConverterInterface.php',
+    'Fxp\\Composer\\AssetPlugin\\Exception\\ExceptionInterface' => $vendorDir . '/fxp/composer-asset-plugin/Exception/ExceptionInterface.php',
+    'Fxp\\Composer\\AssetPlugin\\Exception\\InvalidArgumentException' => $vendorDir . '/fxp/composer-asset-plugin/Exception/InvalidArgumentException.php',
+    'Fxp\\Composer\\AssetPlugin\\Exception\\InvalidCreateRepositoryException' => $vendorDir . '/fxp/composer-asset-plugin/Exception/InvalidCreateRepositoryException.php',
+    'Fxp\\Composer\\AssetPlugin\\FxpAssetPlugin' => $vendorDir . '/fxp/composer-asset-plugin/FxpAssetPlugin.php',
+    'Fxp\\Composer\\AssetPlugin\\Installer\\AssetInstaller' => $vendorDir . '/fxp/composer-asset-plugin/Installer/AssetInstaller.php',
+    'Fxp\\Composer\\AssetPlugin\\Installer\\BowerInstaller' => $vendorDir . '/fxp/composer-asset-plugin/Installer/BowerInstaller.php',
+    'Fxp\\Composer\\AssetPlugin\\Installer\\IgnoreFactory' => $vendorDir . '/fxp/composer-asset-plugin/Installer/IgnoreFactory.php',
+    'Fxp\\Composer\\AssetPlugin\\Installer\\IgnoreManager' => $vendorDir . '/fxp/composer-asset-plugin/Installer/IgnoreManager.php',
+    'Fxp\\Composer\\AssetPlugin\\Package\\AbstractLazyCompletePackage' => $vendorDir . '/fxp/composer-asset-plugin/Package/AbstractLazyCompletePackage.php',
+    'Fxp\\Composer\\AssetPlugin\\Package\\LazyCompletePackage' => $vendorDir . '/fxp/composer-asset-plugin/Package/LazyCompletePackage.php',
+    'Fxp\\Composer\\AssetPlugin\\Package\\LazyPackageInterface' => $vendorDir . '/fxp/composer-asset-plugin/Package/LazyPackageInterface.php',
+    'Fxp\\Composer\\AssetPlugin\\Package\\Loader\\LazyAssetPackageLoader' => $vendorDir . '/fxp/composer-asset-plugin/Package/Loader/LazyAssetPackageLoader.php',
+    'Fxp\\Composer\\AssetPlugin\\Package\\Loader\\LazyLoaderInterface' => $vendorDir . '/fxp/composer-asset-plugin/Package/Loader/LazyLoaderInterface.php',
+    'Fxp\\Composer\\AssetPlugin\\Package\\Version\\VersionParser' => $vendorDir . '/fxp/composer-asset-plugin/Package/Version/VersionParser.php',
+    'Fxp\\Composer\\AssetPlugin\\Repository\\AbstractAssetVcsRepository' => $vendorDir . '/fxp/composer-asset-plugin/Repository/AbstractAssetVcsRepository.php',
+    'Fxp\\Composer\\AssetPlugin\\Repository\\AbstractAssetsRepository' => $vendorDir . '/fxp/composer-asset-plugin/Repository/AbstractAssetsRepository.php',
+    'Fxp\\Composer\\AssetPlugin\\Repository\\AssetRepositoryManager' => $vendorDir . '/fxp/composer-asset-plugin/Repository/AssetRepositoryManager.php',
+    'Fxp\\Composer\\AssetPlugin\\Repository\\AssetVcsRepository' => $vendorDir . '/fxp/composer-asset-plugin/Repository/AssetVcsRepository.php',
+    'Fxp\\Composer\\AssetPlugin\\Repository\\BowerPrivateRegistryFactory' => $vendorDir . '/fxp/composer-asset-plugin/Repository/BowerPrivateRegistryFactory.php',
+    'Fxp\\Composer\\AssetPlugin\\Repository\\BowerPrivateRepository' => $vendorDir . '/fxp/composer-asset-plugin/Repository/BowerPrivateRepository.php',
+    'Fxp\\Composer\\AssetPlugin\\Repository\\BowerRepository' => $vendorDir . '/fxp/composer-asset-plugin/Repository/BowerRepository.php',
+    'Fxp\\Composer\\AssetPlugin\\Repository\\DefaultRegistryFactory' => $vendorDir . '/fxp/composer-asset-plugin/Repository/DefaultRegistryFactory.php',
+    'Fxp\\Composer\\AssetPlugin\\Repository\\FilterUtil' => $vendorDir . '/fxp/composer-asset-plugin/Repository/FilterUtil.php',
+    'Fxp\\Composer\\AssetPlugin\\Repository\\NpmRepository' => $vendorDir . '/fxp/composer-asset-plugin/Repository/NpmRepository.php',
+    'Fxp\\Composer\\AssetPlugin\\Repository\\RegistryFactoryInterface' => $vendorDir . '/fxp/composer-asset-plugin/Repository/RegistryFactoryInterface.php',
+    'Fxp\\Composer\\AssetPlugin\\Repository\\ResolutionManager' => $vendorDir . '/fxp/composer-asset-plugin/Repository/ResolutionManager.php',
+    'Fxp\\Composer\\AssetPlugin\\Repository\\Util' => $vendorDir . '/fxp/composer-asset-plugin/Repository/Util.php',
+    'Fxp\\Composer\\AssetPlugin\\Repository\\VcsPackageFilter' => $vendorDir . '/fxp/composer-asset-plugin/Repository/VcsPackageFilter.php',
+    'Fxp\\Composer\\AssetPlugin\\Repository\\Vcs\\AbstractGitHubDriver' => $vendorDir . '/fxp/composer-asset-plugin/Repository/Vcs/AbstractGitHubDriver.php',
+    'Fxp\\Composer\\AssetPlugin\\Repository\\Vcs\\BitbucketUtil' => $vendorDir . '/fxp/composer-asset-plugin/Repository/Vcs/BitbucketUtil.php',
+    'Fxp\\Composer\\AssetPlugin\\Repository\\Vcs\\GitBitbucketDriver' => $vendorDir . '/fxp/composer-asset-plugin/Repository/Vcs/GitBitbucketDriver.php',
+    'Fxp\\Composer\\AssetPlugin\\Repository\\Vcs\\GitDriver' => $vendorDir . '/fxp/composer-asset-plugin/Repository/Vcs/GitDriver.php',
+    'Fxp\\Composer\\AssetPlugin\\Repository\\Vcs\\GitHubDriver' => $vendorDir . '/fxp/composer-asset-plugin/Repository/Vcs/GitHubDriver.php',
+    'Fxp\\Composer\\AssetPlugin\\Repository\\Vcs\\HgBitbucketDriver' => $vendorDir . '/fxp/composer-asset-plugin/Repository/Vcs/HgBitbucketDriver.php',
+    'Fxp\\Composer\\AssetPlugin\\Repository\\Vcs\\HgDriver' => $vendorDir . '/fxp/composer-asset-plugin/Repository/Vcs/HgDriver.php',
+    'Fxp\\Composer\\AssetPlugin\\Repository\\Vcs\\PerforceDriver' => $vendorDir . '/fxp/composer-asset-plugin/Repository/Vcs/PerforceDriver.php',
+    'Fxp\\Composer\\AssetPlugin\\Repository\\Vcs\\ProcessUtil' => $vendorDir . '/fxp/composer-asset-plugin/Repository/Vcs/ProcessUtil.php',
+    'Fxp\\Composer\\AssetPlugin\\Repository\\Vcs\\SvnDriver' => $vendorDir . '/fxp/composer-asset-plugin/Repository/Vcs/SvnDriver.php',
+    'Fxp\\Composer\\AssetPlugin\\Repository\\Vcs\\Util' => $vendorDir . '/fxp/composer-asset-plugin/Repository/Vcs/Util.php',
+    'Fxp\\Composer\\AssetPlugin\\Type\\AbstractAssetType' => $vendorDir . '/fxp/composer-asset-plugin/Type/AbstractAssetType.php',
+    'Fxp\\Composer\\AssetPlugin\\Type\\AssetTypeInterface' => $vendorDir . '/fxp/composer-asset-plugin/Type/AssetTypeInterface.php',
+    'Fxp\\Composer\\AssetPlugin\\Type\\BowerAssetType' => $vendorDir . '/fxp/composer-asset-plugin/Type/BowerAssetType.php',
+    'Fxp\\Composer\\AssetPlugin\\Type\\NpmAssetType' => $vendorDir . '/fxp/composer-asset-plugin/Type/NpmAssetType.php',
+    'Fxp\\Composer\\AssetPlugin\\Util\\AssetPlugin' => $vendorDir . '/fxp/composer-asset-plugin/Util/AssetPlugin.php',
+    'Fxp\\Composer\\AssetPlugin\\Util\\Perforce' => $vendorDir . '/fxp/composer-asset-plugin/Util/Perforce.php',
+    'Fxp\\Composer\\AssetPlugin\\Util\\Validator' => $vendorDir . '/fxp/composer-asset-plugin/Util/Validator.php',
+    'Interop\\Container\\ContainerInterface' => $vendorDir . '/container-interop/container-interop/src/Interop/Container/ContainerInterface.php',
+    'Interop\\Container\\Exception\\ContainerException' => $vendorDir . '/container-interop/container-interop/src/Interop/Container/Exception/ContainerException.php',
+    'Interop\\Container\\Exception\\NotFoundException' => $vendorDir . '/container-interop/container-interop/src/Interop/Container/Exception/NotFoundException.php',
+    'Pimple\\Container' => $vendorDir . '/pimple/pimple/src/Pimple/Container.php',
+    'Pimple\\Exception\\ExpectedInvokableException' => $vendorDir . '/pimple/pimple/src/Pimple/Exception/ExpectedInvokableException.php',
+    'Pimple\\Exception\\FrozenServiceException' => $vendorDir . '/pimple/pimple/src/Pimple/Exception/FrozenServiceException.php',
+    'Pimple\\Exception\\InvalidServiceIdentifierException' => $vendorDir . '/pimple/pimple/src/Pimple/Exception/InvalidServiceIdentifierException.php',
+    'Pimple\\Exception\\UnknownIdentifierException' => $vendorDir . '/pimple/pimple/src/Pimple/Exception/UnknownIdentifierException.php',
+    'Pimple\\Psr11\\Container' => $vendorDir . '/pimple/pimple/src/Pimple/Psr11/Container.php',
+    'Pimple\\Psr11\\ServiceLocator' => $vendorDir . '/pimple/pimple/src/Pimple/Psr11/ServiceLocator.php',
+    'Pimple\\ServiceIterator' => $vendorDir . '/pimple/pimple/src/Pimple/ServiceIterator.php',
+    'Pimple\\ServiceProviderInterface' => $vendorDir . '/pimple/pimple/src/Pimple/ServiceProviderInterface.php',
+    'Pimple\\Tests\\Fixtures\\Invokable' => $vendorDir . '/pimple/pimple/src/Pimple/Tests/Fixtures/Invokable.php',
+    'Pimple\\Tests\\Fixtures\\NonInvokable' => $vendorDir . '/pimple/pimple/src/Pimple/Tests/Fixtures/NonInvokable.php',
+    'Pimple\\Tests\\Fixtures\\PimpleServiceProvider' => $vendorDir . '/pimple/pimple/src/Pimple/Tests/Fixtures/PimpleServiceProvider.php',
+    'Pimple\\Tests\\Fixtures\\Service' => $vendorDir . '/pimple/pimple/src/Pimple/Tests/Fixtures/Service.php',
+    'Pimple\\Tests\\PimpleServiceProviderInterfaceTest' => $vendorDir . '/pimple/pimple/src/Pimple/Tests/PimpleServiceProviderInterfaceTest.php',
+    'Pimple\\Tests\\PimpleTest' => $vendorDir . '/pimple/pimple/src/Pimple/Tests/PimpleTest.php',
+    'Pimple\\Tests\\Psr11\\ContainerTest' => $vendorDir . '/pimple/pimple/src/Pimple/Tests/Psr11/ContainerTest.php',
+    'Pimple\\Tests\\Psr11\\ServiceLocatorTest' => $vendorDir . '/pimple/pimple/src/Pimple/Tests/Psr11/ServiceLocatorTest.php',
+    'Pimple\\Tests\\ServiceIteratorTest' => $vendorDir . '/pimple/pimple/src/Pimple/Tests/ServiceIteratorTest.php',
+    'Psr\\Cache\\CacheException' => $vendorDir . '/psr/cache/src/CacheException.php',
+    'Psr\\Cache\\CacheItemInterface' => $vendorDir . '/psr/cache/src/CacheItemInterface.php',
+    'Psr\\Cache\\CacheItemPoolInterface' => $vendorDir . '/psr/cache/src/CacheItemPoolInterface.php',
+    'Psr\\Cache\\InvalidArgumentException' => $vendorDir . '/psr/cache/src/InvalidArgumentException.php',
+    'Psr\\Container\\ContainerExceptionInterface' => $vendorDir . '/psr/container/src/ContainerExceptionInterface.php',
+    'Psr\\Container\\ContainerInterface' => $vendorDir . '/psr/container/src/ContainerInterface.php',
+    'Psr\\Container\\NotFoundExceptionInterface' => $vendorDir . '/psr/container/src/NotFoundExceptionInterface.php',
+    'Psr\\Http\\Message\\MessageInterface' => $vendorDir . '/psr/http-message/src/MessageInterface.php',
+    'Psr\\Http\\Message\\RequestInterface' => $vendorDir . '/psr/http-message/src/RequestInterface.php',
+    'Psr\\Http\\Message\\ResponseInterface' => $vendorDir . '/psr/http-message/src/ResponseInterface.php',
+    'Psr\\Http\\Message\\ServerRequestInterface' => $vendorDir . '/psr/http-message/src/ServerRequestInterface.php',
+    'Psr\\Http\\Message\\StreamInterface' => $vendorDir . '/psr/http-message/src/StreamInterface.php',
+    'Psr\\Http\\Message\\UploadedFileInterface' => $vendorDir . '/psr/http-message/src/UploadedFileInterface.php',
+    'Psr\\Http\\Message\\UriInterface' => $vendorDir . '/psr/http-message/src/UriInterface.php',
+    'Psr\\Log\\AbstractLogger' => $vendorDir . '/psr/log/Psr/Log/AbstractLogger.php',
+    'Psr\\Log\\InvalidArgumentException' => $vendorDir . '/psr/log/Psr/Log/InvalidArgumentException.php',
+    'Psr\\Log\\LogLevel' => $vendorDir . '/psr/log/Psr/Log/LogLevel.php',
+    'Psr\\Log\\LoggerAwareInterface' => $vendorDir . '/psr/log/Psr/Log/LoggerAwareInterface.php',
+    'Psr\\Log\\LoggerAwareTrait' => $vendorDir . '/psr/log/Psr/Log/LoggerAwareTrait.php',
+    'Psr\\Log\\LoggerInterface' => $vendorDir . '/psr/log/Psr/Log/LoggerInterface.php',
+    'Psr\\Log\\LoggerTrait' => $vendorDir . '/psr/log/Psr/Log/LoggerTrait.php',
+    'Psr\\Log\\NullLogger' => $vendorDir . '/psr/log/Psr/Log/NullLogger.php',
+    'Psr\\Log\\Test\\DummyTest' => $vendorDir . '/psr/log/Psr/Log/Test/LoggerInterfaceTest.php',
+    'Psr\\Log\\Test\\LoggerInterfaceTest' => $vendorDir . '/psr/log/Psr/Log/Test/LoggerInterfaceTest.php',
+    'Psr\\SimpleCache\\CacheException' => $vendorDir . '/psr/simple-cache/src/CacheException.php',
+    'Psr\\SimpleCache\\CacheInterface' => $vendorDir . '/psr/simple-cache/src/CacheInterface.php',
+    'Psr\\SimpleCache\\InvalidArgumentException' => $vendorDir . '/psr/simple-cache/src/InvalidArgumentException.php',
+    'Slim\\App' => $vendorDir . '/slim/slim/Slim/App.php',
+    'Slim\\CallableResolver' => $vendorDir . '/slim/slim/Slim/CallableResolver.php',
+    'Slim\\CallableResolverAwareTrait' => $vendorDir . '/slim/slim/Slim/CallableResolverAwareTrait.php',
+    'Slim\\Collection' => $vendorDir . '/slim/slim/Slim/Collection.php',
+    'Slim\\Container' => $vendorDir . '/slim/slim/Slim/Container.php',
+    'Slim\\DefaultServicesProvider' => $vendorDir . '/slim/slim/Slim/DefaultServicesProvider.php',
+    'Slim\\DeferredCallable' => $vendorDir . '/slim/slim/Slim/DeferredCallable.php',
+    'Slim\\Exception\\ContainerException' => $vendorDir . '/slim/slim/Slim/Exception/ContainerException.php',
+    'Slim\\Exception\\ContainerValueNotFoundException' => $vendorDir . '/slim/slim/Slim/Exception/ContainerValueNotFoundException.php',
+    'Slim\\Exception\\InvalidMethodException' => $vendorDir . '/slim/slim/Slim/Exception/InvalidMethodException.php',
+    'Slim\\Exception\\MethodNotAllowedException' => $vendorDir . '/slim/slim/Slim/Exception/MethodNotAllowedException.php',
+    'Slim\\Exception\\NotFoundException' => $vendorDir . '/slim/slim/Slim/Exception/NotFoundException.php',
+    'Slim\\Exception\\SlimException' => $vendorDir . '/slim/slim/Slim/Exception/SlimException.php',
+    'Slim\\Handlers\\AbstractError' => $vendorDir . '/slim/slim/Slim/Handlers/AbstractError.php',
+    'Slim\\Handlers\\AbstractHandler' => $vendorDir . '/slim/slim/Slim/Handlers/AbstractHandler.php',
+    'Slim\\Handlers\\Error' => $vendorDir . '/slim/slim/Slim/Handlers/Error.php',
+    'Slim\\Handlers\\NotAllowed' => $vendorDir . '/slim/slim/Slim/Handlers/NotAllowed.php',
+    'Slim\\Handlers\\NotFound' => $vendorDir . '/slim/slim/Slim/Handlers/NotFound.php',
+    'Slim\\Handlers\\PhpError' => $vendorDir . '/slim/slim/Slim/Handlers/PhpError.php',
+    'Slim\\Handlers\\Strategies\\RequestResponse' => $vendorDir . '/slim/slim/Slim/Handlers/Strategies/RequestResponse.php',
+    'Slim\\Handlers\\Strategies\\RequestResponseArgs' => $vendorDir . '/slim/slim/Slim/Handlers/Strategies/RequestResponseArgs.php',
+    'Slim\\Http\\Body' => $vendorDir . '/slim/slim/Slim/Http/Body.php',
+    'Slim\\Http\\Cookies' => $vendorDir . '/slim/slim/Slim/Http/Cookies.php',
+    'Slim\\Http\\Environment' => $vendorDir . '/slim/slim/Slim/Http/Environment.php',
+    'Slim\\Http\\Headers' => $vendorDir . '/slim/slim/Slim/Http/Headers.php',
+    'Slim\\Http\\Message' => $vendorDir . '/slim/slim/Slim/Http/Message.php',
+    'Slim\\Http\\Request' => $vendorDir . '/slim/slim/Slim/Http/Request.php',
+    'Slim\\Http\\RequestBody' => $vendorDir . '/slim/slim/Slim/Http/RequestBody.php',
+    'Slim\\Http\\Response' => $vendorDir . '/slim/slim/Slim/Http/Response.php',
+    'Slim\\Http\\Stream' => $vendorDir . '/slim/slim/Slim/Http/Stream.php',
+    'Slim\\Http\\UploadedFile' => $vendorDir . '/slim/slim/Slim/Http/UploadedFile.php',
+    'Slim\\Http\\Uri' => $vendorDir . '/slim/slim/Slim/Http/Uri.php',
+    'Slim\\Interfaces\\CallableResolverInterface' => $vendorDir . '/slim/slim/Slim/Interfaces/CallableResolverInterface.php',
+    'Slim\\Interfaces\\CollectionInterface' => $vendorDir . '/slim/slim/Slim/Interfaces/CollectionInterface.php',
+    'Slim\\Interfaces\\Http\\CookiesInterface' => $vendorDir . '/slim/slim/Slim/Interfaces/Http/CookiesInterface.php',
+    'Slim\\Interfaces\\Http\\EnvironmentInterface' => $vendorDir . '/slim/slim/Slim/Interfaces/Http/EnvironmentInterface.php',
+    'Slim\\Interfaces\\Http\\HeadersInterface' => $vendorDir . '/slim/slim/Slim/Interfaces/Http/HeadersInterface.php',
+    'Slim\\Interfaces\\InvocationStrategyInterface' => $vendorDir . '/slim/slim/Slim/Interfaces/InvocationStrategyInterface.php',
+    'Slim\\Interfaces\\RouteGroupInterface' => $vendorDir . '/slim/slim/Slim/Interfaces/RouteGroupInterface.php',
+    'Slim\\Interfaces\\RouteInterface' => $vendorDir . '/slim/slim/Slim/Interfaces/RouteInterface.php',
+    'Slim\\Interfaces\\RouterInterface' => $vendorDir . '/slim/slim/Slim/Interfaces/RouterInterface.php',
+    'Slim\\MiddlewareAwareTrait' => $vendorDir . '/slim/slim/Slim/MiddlewareAwareTrait.php',
+    'Slim\\Routable' => $vendorDir . '/slim/slim/Slim/Routable.php',
+    'Slim\\Route' => $vendorDir . '/slim/slim/Slim/Route.php',
+    'Slim\\RouteGroup' => $vendorDir . '/slim/slim/Slim/RouteGroup.php',
+    'Slim\\Router' => $vendorDir . '/slim/slim/Slim/Router.php',
+    'Symfony\\Component\\Cache\\Adapter\\AbstractAdapter' => $vendorDir . '/symfony/cache/Adapter/AbstractAdapter.php',
+    'Symfony\\Component\\Cache\\Adapter\\AdapterInterface' => $vendorDir . '/symfony/cache/Adapter/AdapterInterface.php',
+    'Symfony\\Component\\Cache\\Adapter\\ApcuAdapter' => $vendorDir . '/symfony/cache/Adapter/ApcuAdapter.php',
+    'Symfony\\Component\\Cache\\Adapter\\ArrayAdapter' => $vendorDir . '/symfony/cache/Adapter/ArrayAdapter.php',
+    'Symfony\\Component\\Cache\\Adapter\\ChainAdapter' => $vendorDir . '/symfony/cache/Adapter/ChainAdapter.php',
+    'Symfony\\Component\\Cache\\Adapter\\DoctrineAdapter' => $vendorDir . '/symfony/cache/Adapter/DoctrineAdapter.php',
+    'Symfony\\Component\\Cache\\Adapter\\FilesystemAdapter' => $vendorDir . '/symfony/cache/Adapter/FilesystemAdapter.php',
+    'Symfony\\Component\\Cache\\Adapter\\MemcachedAdapter' => $vendorDir . '/symfony/cache/Adapter/MemcachedAdapter.php',
+    'Symfony\\Component\\Cache\\Adapter\\NullAdapter' => $vendorDir . '/symfony/cache/Adapter/NullAdapter.php',
+    'Symfony\\Component\\Cache\\Adapter\\PdoAdapter' => $vendorDir . '/symfony/cache/Adapter/PdoAdapter.php',
+    'Symfony\\Component\\Cache\\Adapter\\PhpArrayAdapter' => $vendorDir . '/symfony/cache/Adapter/PhpArrayAdapter.php',
+    'Symfony\\Component\\Cache\\Adapter\\PhpFilesAdapter' => $vendorDir . '/symfony/cache/Adapter/PhpFilesAdapter.php',
+    'Symfony\\Component\\Cache\\Adapter\\ProxyAdapter' => $vendorDir . '/symfony/cache/Adapter/ProxyAdapter.php',
+    'Symfony\\Component\\Cache\\Adapter\\RedisAdapter' => $vendorDir . '/symfony/cache/Adapter/RedisAdapter.php',
+    'Symfony\\Component\\Cache\\Adapter\\SimpleCacheAdapter' => $vendorDir . '/symfony/cache/Adapter/SimpleCacheAdapter.php',
+    'Symfony\\Component\\Cache\\Adapter\\TagAwareAdapter' => $vendorDir . '/symfony/cache/Adapter/TagAwareAdapter.php',
+    'Symfony\\Component\\Cache\\Adapter\\TagAwareAdapterInterface' => $vendorDir . '/symfony/cache/Adapter/TagAwareAdapterInterface.php',
+    'Symfony\\Component\\Cache\\Adapter\\TraceableAdapter' => $vendorDir . '/symfony/cache/Adapter/TraceableAdapter.php',
+    'Symfony\\Component\\Cache\\Adapter\\TraceableAdapterEvent' => $vendorDir . '/symfony/cache/Adapter/TraceableAdapter.php',
+    'Symfony\\Component\\Cache\\Adapter\\TraceableTagAwareAdapter' => $vendorDir . '/symfony/cache/Adapter/TraceableTagAwareAdapter.php',
+    'Symfony\\Component\\Cache\\CacheItem' => $vendorDir . '/symfony/cache/CacheItem.php',
+    'Symfony\\Component\\Cache\\DataCollector\\CacheDataCollector' => $vendorDir . '/symfony/cache/DataCollector/CacheDataCollector.php',
+    'Symfony\\Component\\Cache\\DoctrineProvider' => $vendorDir . '/symfony/cache/DoctrineProvider.php',
+    'Symfony\\Component\\Cache\\Exception\\CacheException' => $vendorDir . '/symfony/cache/Exception/CacheException.php',
+    'Symfony\\Component\\Cache\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/cache/Exception/InvalidArgumentException.php',
+    'Symfony\\Component\\Cache\\PruneableInterface' => $vendorDir . '/symfony/cache/PruneableInterface.php',
+    'Symfony\\Component\\Cache\\ResettableInterface' => $vendorDir . '/symfony/cache/ResettableInterface.php',
+    'Symfony\\Component\\Cache\\Simple\\AbstractCache' => $vendorDir . '/symfony/cache/Simple/AbstractCache.php',
+    'Symfony\\Component\\Cache\\Simple\\ApcuCache' => $vendorDir . '/symfony/cache/Simple/ApcuCache.php',
+    'Symfony\\Component\\Cache\\Simple\\ArrayCache' => $vendorDir . '/symfony/cache/Simple/ArrayCache.php',
+    'Symfony\\Component\\Cache\\Simple\\ChainCache' => $vendorDir . '/symfony/cache/Simple/ChainCache.php',
+    'Symfony\\Component\\Cache\\Simple\\DoctrineCache' => $vendorDir . '/symfony/cache/Simple/DoctrineCache.php',
+    'Symfony\\Component\\Cache\\Simple\\FilesystemCache' => $vendorDir . '/symfony/cache/Simple/FilesystemCache.php',
+    'Symfony\\Component\\Cache\\Simple\\MemcachedCache' => $vendorDir . '/symfony/cache/Simple/MemcachedCache.php',
+    'Symfony\\Component\\Cache\\Simple\\NullCache' => $vendorDir . '/symfony/cache/Simple/NullCache.php',
+    'Symfony\\Component\\Cache\\Simple\\PdoCache' => $vendorDir . '/symfony/cache/Simple/PdoCache.php',
+    'Symfony\\Component\\Cache\\Simple\\PhpArrayCache' => $vendorDir . '/symfony/cache/Simple/PhpArrayCache.php',
+    'Symfony\\Component\\Cache\\Simple\\PhpFilesCache' => $vendorDir . '/symfony/cache/Simple/PhpFilesCache.php',
+    'Symfony\\Component\\Cache\\Simple\\Psr6Cache' => $vendorDir . '/symfony/cache/Simple/Psr6Cache.php',
+    'Symfony\\Component\\Cache\\Simple\\RedisCache' => $vendorDir . '/symfony/cache/Simple/RedisCache.php',
+    'Symfony\\Component\\Cache\\Simple\\TraceableCache' => $vendorDir . '/symfony/cache/Simple/TraceableCache.php',
+    'Symfony\\Component\\Cache\\Simple\\TraceableCacheEvent' => $vendorDir . '/symfony/cache/Simple/TraceableCache.php',
+    'Symfony\\Component\\Cache\\Traits\\AbstractTrait' => $vendorDir . '/symfony/cache/Traits/AbstractTrait.php',
+    'Symfony\\Component\\Cache\\Traits\\ApcuTrait' => $vendorDir . '/symfony/cache/Traits/ApcuTrait.php',
+    'Symfony\\Component\\Cache\\Traits\\ArrayTrait' => $vendorDir . '/symfony/cache/Traits/ArrayTrait.php',
+    'Symfony\\Component\\Cache\\Traits\\DoctrineTrait' => $vendorDir . '/symfony/cache/Traits/DoctrineTrait.php',
+    'Symfony\\Component\\Cache\\Traits\\FilesystemCommonTrait' => $vendorDir . '/symfony/cache/Traits/FilesystemCommonTrait.php',
+    'Symfony\\Component\\Cache\\Traits\\FilesystemTrait' => $vendorDir . '/symfony/cache/Traits/FilesystemTrait.php',
+    'Symfony\\Component\\Cache\\Traits\\MemcachedTrait' => $vendorDir . '/symfony/cache/Traits/MemcachedTrait.php',
+    'Symfony\\Component\\Cache\\Traits\\PdoTrait' => $vendorDir . '/symfony/cache/Traits/PdoTrait.php',
+    'Symfony\\Component\\Cache\\Traits\\PhpArrayTrait' => $vendorDir . '/symfony/cache/Traits/PhpArrayTrait.php',
+    'Symfony\\Component\\Cache\\Traits\\PhpFilesTrait' => $vendorDir . '/symfony/cache/Traits/PhpFilesTrait.php',
+    'Symfony\\Component\\Cache\\Traits\\ProxyTrait' => $vendorDir . '/symfony/cache/Traits/ProxyTrait.php',
+    'Symfony\\Component\\Cache\\Traits\\RedisProxy' => $vendorDir . '/symfony/cache/Traits/RedisProxy.php',
+    'Symfony\\Component\\Cache\\Traits\\RedisTrait' => $vendorDir . '/symfony/cache/Traits/RedisTrait.php',
+    'Symfony\\Component\\ExpressionLanguage\\Compiler' => $vendorDir . '/symfony/expression-language/Compiler.php',
+    'Symfony\\Component\\ExpressionLanguage\\Expression' => $vendorDir . '/symfony/expression-language/Expression.php',
+    'Symfony\\Component\\ExpressionLanguage\\ExpressionFunction' => $vendorDir . '/symfony/expression-language/ExpressionFunction.php',
+    'Symfony\\Component\\ExpressionLanguage\\ExpressionFunctionProviderInterface' => $vendorDir . '/symfony/expression-language/ExpressionFunctionProviderInterface.php',
+    'Symfony\\Component\\ExpressionLanguage\\ExpressionLanguage' => $vendorDir . '/symfony/expression-language/ExpressionLanguage.php',
+    'Symfony\\Component\\ExpressionLanguage\\Lexer' => $vendorDir . '/symfony/expression-language/Lexer.php',
+    'Symfony\\Component\\ExpressionLanguage\\Node\\ArgumentsNode' => $vendorDir . '/symfony/expression-language/Node/ArgumentsNode.php',
+    'Symfony\\Component\\ExpressionLanguage\\Node\\ArrayNode' => $vendorDir . '/symfony/expression-language/Node/ArrayNode.php',
+    'Symfony\\Component\\ExpressionLanguage\\Node\\BinaryNode' => $vendorDir . '/symfony/expression-language/Node/BinaryNode.php',
+    'Symfony\\Component\\ExpressionLanguage\\Node\\ConditionalNode' => $vendorDir . '/symfony/expression-language/Node/ConditionalNode.php',
+    'Symfony\\Component\\ExpressionLanguage\\Node\\ConstantNode' => $vendorDir . '/symfony/expression-language/Node/ConstantNode.php',
+    'Symfony\\Component\\ExpressionLanguage\\Node\\FunctionNode' => $vendorDir . '/symfony/expression-language/Node/FunctionNode.php',
+    'Symfony\\Component\\ExpressionLanguage\\Node\\GetAttrNode' => $vendorDir . '/symfony/expression-language/Node/GetAttrNode.php',
+    'Symfony\\Component\\ExpressionLanguage\\Node\\NameNode' => $vendorDir . '/symfony/expression-language/Node/NameNode.php',
+    'Symfony\\Component\\ExpressionLanguage\\Node\\Node' => $vendorDir . '/symfony/expression-language/Node/Node.php',
+    'Symfony\\Component\\ExpressionLanguage\\Node\\UnaryNode' => $vendorDir . '/symfony/expression-language/Node/UnaryNode.php',
+    'Symfony\\Component\\ExpressionLanguage\\ParsedExpression' => $vendorDir . '/symfony/expression-language/ParsedExpression.php',
+    'Symfony\\Component\\ExpressionLanguage\\Parser' => $vendorDir . '/symfony/expression-language/Parser.php',
+    'Symfony\\Component\\ExpressionLanguage\\ParserCache\\ArrayParserCache' => $vendorDir . '/symfony/expression-language/ParserCache/ArrayParserCache.php',
+    'Symfony\\Component\\ExpressionLanguage\\ParserCache\\ParserCacheAdapter' => $vendorDir . '/symfony/expression-language/ParserCache/ParserCacheAdapter.php',
+    'Symfony\\Component\\ExpressionLanguage\\ParserCache\\ParserCacheInterface' => $vendorDir . '/symfony/expression-language/ParserCache/ParserCacheInterface.php',
+    'Symfony\\Component\\ExpressionLanguage\\SerializedParsedExpression' => $vendorDir . '/symfony/expression-language/SerializedParsedExpression.php',
+    'Symfony\\Component\\ExpressionLanguage\\SyntaxError' => $vendorDir . '/symfony/expression-language/SyntaxError.php',
+    'Symfony\\Component\\ExpressionLanguage\\Token' => $vendorDir . '/symfony/expression-language/Token.php',
+    'Symfony\\Component\\ExpressionLanguage\\TokenStream' => $vendorDir . '/symfony/expression-language/TokenStream.php',
+    'Symfony\\Polyfill\\Apcu\\Apcu' => $vendorDir . '/symfony/polyfill-apcu/Apcu.php',
+);
diff --git a/advancedcontentfilter/vendor/composer/autoload_files.php b/advancedcontentfilter/vendor/composer/autoload_files.php
new file mode 100644 (file)
index 0000000..a6b8b35
--- /dev/null
@@ -0,0 +1,11 @@
+<?php
+
+// autoload_files.php @generated by Composer
+
+$vendorDir = dirname(dirname(__FILE__));
+$baseDir = dirname($vendorDir);
+
+return array(
+    '32dcc8afd4335739640db7d200c1971d' => $vendorDir . '/symfony/polyfill-apcu/bootstrap.php',
+    '253c157292f75eb38082b5acb06f3f01' => $vendorDir . '/nikic/fast-route/src/functions.php',
+);
diff --git a/advancedcontentfilter/vendor/composer/autoload_namespaces.php b/advancedcontentfilter/vendor/composer/autoload_namespaces.php
new file mode 100644 (file)
index 0000000..c3cd022
--- /dev/null
@@ -0,0 +1,10 @@
+<?php
+
+// autoload_namespaces.php @generated by Composer
+
+$vendorDir = dirname(dirname(__FILE__));
+$baseDir = dirname($vendorDir);
+
+return array(
+    'Pimple' => array($vendorDir . '/pimple/pimple/src'),
+);
diff --git a/advancedcontentfilter/vendor/composer/autoload_psr4.php b/advancedcontentfilter/vendor/composer/autoload_psr4.php
new file mode 100644 (file)
index 0000000..f0e16da
--- /dev/null
@@ -0,0 +1,21 @@
+<?php
+
+// autoload_psr4.php @generated by Composer
+
+$vendorDir = dirname(dirname(__FILE__));
+$baseDir = dirname($vendorDir);
+
+return array(
+    'Symfony\\Polyfill\\Apcu\\' => array($vendorDir . '/symfony/polyfill-apcu'),
+    'Symfony\\Component\\ExpressionLanguage\\' => array($vendorDir . '/symfony/expression-language'),
+    'Symfony\\Component\\Cache\\' => array($vendorDir . '/symfony/cache'),
+    'Slim\\' => array($vendorDir . '/slim/slim/Slim'),
+    'Psr\\SimpleCache\\' => array($vendorDir . '/psr/simple-cache/src'),
+    'Psr\\Log\\' => array($vendorDir . '/psr/log/Psr/Log'),
+    'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-message/src'),
+    'Psr\\Container\\' => array($vendorDir . '/psr/container/src'),
+    'Psr\\Cache\\' => array($vendorDir . '/psr/cache/src'),
+    'Interop\\Container\\' => array($vendorDir . '/container-interop/container-interop/src/Interop/Container'),
+    'Fxp\\Composer\\AssetPlugin\\' => array($vendorDir . '/fxp/composer-asset-plugin'),
+    'FastRoute\\' => array($vendorDir . '/nikic/fast-route/src'),
+);
diff --git a/advancedcontentfilter/vendor/composer/autoload_real.php b/advancedcontentfilter/vendor/composer/autoload_real.php
new file mode 100644 (file)
index 0000000..6d7169a
--- /dev/null
@@ -0,0 +1,70 @@
+<?php
+
+// autoload_real.php @generated by Composer
+
+class ComposerAutoloaderInitAdvancedContentFilterAddon
+{
+    private static $loader;
+
+    public static function loadClassLoader($class)
+    {
+        if ('Composer\Autoload\ClassLoader' === $class) {
+            require __DIR__ . '/ClassLoader.php';
+        }
+    }
+
+    public static function getLoader()
+    {
+        if (null !== self::$loader) {
+            return self::$loader;
+        }
+
+        spl_autoload_register(array('ComposerAutoloaderInitAdvancedContentFilterAddon', 'loadClassLoader'), true, true);
+        self::$loader = $loader = new \Composer\Autoload\ClassLoader();
+        spl_autoload_unregister(array('ComposerAutoloaderInitAdvancedContentFilterAddon', 'loadClassLoader'));
+
+        $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
+        if ($useStaticLoader) {
+            require_once __DIR__ . '/autoload_static.php';
+
+            call_user_func(\Composer\Autoload\ComposerStaticInitAdvancedContentFilterAddon::getInitializer($loader));
+        } else {
+            $map = require __DIR__ . '/autoload_namespaces.php';
+            foreach ($map as $namespace => $path) {
+                $loader->set($namespace, $path);
+            }
+
+            $map = require __DIR__ . '/autoload_psr4.php';
+            foreach ($map as $namespace => $path) {
+                $loader->setPsr4($namespace, $path);
+            }
+
+            $classMap = require __DIR__ . '/autoload_classmap.php';
+            if ($classMap) {
+                $loader->addClassMap($classMap);
+            }
+        }
+
+        $loader->register(true);
+
+        if ($useStaticLoader) {
+            $includeFiles = Composer\Autoload\ComposerStaticInitAdvancedContentFilterAddon::$files;
+        } else {
+            $includeFiles = require __DIR__ . '/autoload_files.php';
+        }
+        foreach ($includeFiles as $fileIdentifier => $file) {
+            composerRequireAdvancedContentFilterAddon($fileIdentifier, $file);
+        }
+
+        return $loader;
+    }
+}
+
+function composerRequireAdvancedContentFilterAddon($fileIdentifier, $file)
+{
+    if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
+        require $file;
+
+        $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;
+    }
+}
diff --git a/advancedcontentfilter/vendor/composer/autoload_static.php b/advancedcontentfilter/vendor/composer/autoload_static.php
new file mode 100644 (file)
index 0000000..c5a93e6
--- /dev/null
@@ -0,0 +1,367 @@
+<?php
+
+// autoload_static.php @generated by Composer
+
+namespace Composer\Autoload;
+
+class ComposerStaticInitAdvancedContentFilterAddon
+{
+    public static $files = array (
+        '32dcc8afd4335739640db7d200c1971d' => __DIR__ . '/..' . '/symfony/polyfill-apcu/bootstrap.php',
+        '253c157292f75eb38082b5acb06f3f01' => __DIR__ . '/..' . '/nikic/fast-route/src/functions.php',
+    );
+
+    public static $prefixLengthsPsr4 = array (
+        'S' => 
+        array (
+            'Symfony\\Polyfill\\Apcu\\' => 22,
+            'Symfony\\Component\\ExpressionLanguage\\' => 37,
+            'Symfony\\Component\\Cache\\' => 24,
+            'Slim\\' => 5,
+        ),
+        'P' => 
+        array (
+            'Psr\\SimpleCache\\' => 16,
+            'Psr\\Log\\' => 8,
+            'Psr\\Http\\Message\\' => 17,
+            'Psr\\Container\\' => 14,
+            'Psr\\Cache\\' => 10,
+        ),
+        'I' => 
+        array (
+            'Interop\\Container\\' => 18,
+        ),
+        'F' => 
+        array (
+            'Fxp\\Composer\\AssetPlugin\\' => 25,
+            'FastRoute\\' => 10,
+        ),
+    );
+
+    public static $prefixDirsPsr4 = array (
+        'Symfony\\Polyfill\\Apcu\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/symfony/polyfill-apcu',
+        ),
+        'Symfony\\Component\\ExpressionLanguage\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/symfony/expression-language',
+        ),
+        'Symfony\\Component\\Cache\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/symfony/cache',
+        ),
+        'Slim\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/slim/slim/Slim',
+        ),
+        'Psr\\SimpleCache\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/psr/simple-cache/src',
+        ),
+        'Psr\\Log\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/psr/log/Psr/Log',
+        ),
+        'Psr\\Http\\Message\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/psr/http-message/src',
+        ),
+        'Psr\\Container\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/psr/container/src',
+        ),
+        'Psr\\Cache\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/psr/cache/src',
+        ),
+        'Interop\\Container\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/container-interop/container-interop/src/Interop/Container',
+        ),
+        'Fxp\\Composer\\AssetPlugin\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/fxp/composer-asset-plugin',
+        ),
+        'FastRoute\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/nikic/fast-route/src',
+        ),
+    );
+
+    public static $prefixesPsr0 = array (
+        'P' => 
+        array (
+            'Pimple' => 
+            array (
+                0 => __DIR__ . '/..' . '/pimple/pimple/src',
+            ),
+        ),
+    );
+
+    public static $classMap = array (
+        'FastRoute\\BadRouteException' => __DIR__ . '/..' . '/nikic/fast-route/src/BadRouteException.php',
+        'FastRoute\\DataGenerator' => __DIR__ . '/..' . '/nikic/fast-route/src/DataGenerator.php',
+        'FastRoute\\DataGenerator\\CharCountBased' => __DIR__ . '/..' . '/nikic/fast-route/src/DataGenerator/CharCountBased.php',
+        'FastRoute\\DataGenerator\\GroupCountBased' => __DIR__ . '/..' . '/nikic/fast-route/src/DataGenerator/GroupCountBased.php',
+        'FastRoute\\DataGenerator\\GroupPosBased' => __DIR__ . '/..' . '/nikic/fast-route/src/DataGenerator/GroupPosBased.php',
+        'FastRoute\\DataGenerator\\MarkBased' => __DIR__ . '/..' . '/nikic/fast-route/src/DataGenerator/MarkBased.php',
+        'FastRoute\\DataGenerator\\RegexBasedAbstract' => __DIR__ . '/..' . '/nikic/fast-route/src/DataGenerator/RegexBasedAbstract.php',
+        'FastRoute\\Dispatcher' => __DIR__ . '/..' . '/nikic/fast-route/src/Dispatcher.php',
+        'FastRoute\\Dispatcher\\CharCountBased' => __DIR__ . '/..' . '/nikic/fast-route/src/Dispatcher/CharCountBased.php',
+        'FastRoute\\Dispatcher\\GroupCountBased' => __DIR__ . '/..' . '/nikic/fast-route/src/Dispatcher/GroupCountBased.php',
+        'FastRoute\\Dispatcher\\GroupPosBased' => __DIR__ . '/..' . '/nikic/fast-route/src/Dispatcher/GroupPosBased.php',
+        'FastRoute\\Dispatcher\\MarkBased' => __DIR__ . '/..' . '/nikic/fast-route/src/Dispatcher/MarkBased.php',
+        'FastRoute\\Dispatcher\\RegexBasedAbstract' => __DIR__ . '/..' . '/nikic/fast-route/src/Dispatcher/RegexBasedAbstract.php',
+        'FastRoute\\Route' => __DIR__ . '/..' . '/nikic/fast-route/src/Route.php',
+        'FastRoute\\RouteCollector' => __DIR__ . '/..' . '/nikic/fast-route/src/RouteCollector.php',
+        'FastRoute\\RouteParser' => __DIR__ . '/..' . '/nikic/fast-route/src/RouteParser.php',
+        'FastRoute\\RouteParser\\Std' => __DIR__ . '/..' . '/nikic/fast-route/src/RouteParser/Std.php',
+        'Fxp\\Composer\\AssetPlugin\\Assets' => __DIR__ . '/..' . '/fxp/composer-asset-plugin/Assets.php',
+        'Fxp\\Composer\\AssetPlugin\\Composer\\ScriptHandler' => __DIR__ . '/..' . '/fxp/composer-asset-plugin/Composer/ScriptHandler.php',
+        'Fxp\\Composer\\AssetPlugin\\Config\\Config' => __DIR__ . '/..' . '/fxp/composer-asset-plugin/Config/Config.php',
+        'Fxp\\Composer\\AssetPlugin\\Config\\ConfigBuilder' => __DIR__ . '/..' . '/fxp/composer-asset-plugin/Config/ConfigBuilder.php',
+        'Fxp\\Composer\\AssetPlugin\\Converter\\AbstractPackageConverter' => __DIR__ . '/..' . '/fxp/composer-asset-plugin/Converter/AbstractPackageConverter.php',
+        'Fxp\\Composer\\AssetPlugin\\Converter\\BowerPackageConverter' => __DIR__ . '/..' . '/fxp/composer-asset-plugin/Converter/BowerPackageConverter.php',
+        'Fxp\\Composer\\AssetPlugin\\Converter\\NpmPackageConverter' => __DIR__ . '/..' . '/fxp/composer-asset-plugin/Converter/NpmPackageConverter.php',
+        'Fxp\\Composer\\AssetPlugin\\Converter\\NpmPackageUtil' => __DIR__ . '/..' . '/fxp/composer-asset-plugin/Converter/NpmPackageUtil.php',
+        'Fxp\\Composer\\AssetPlugin\\Converter\\PackageConverterInterface' => __DIR__ . '/..' . '/fxp/composer-asset-plugin/Converter/PackageConverterInterface.php',
+        'Fxp\\Composer\\AssetPlugin\\Converter\\PackageUtil' => __DIR__ . '/..' . '/fxp/composer-asset-plugin/Converter/PackageUtil.php',
+        'Fxp\\Composer\\AssetPlugin\\Converter\\SemverConverter' => __DIR__ . '/..' . '/fxp/composer-asset-plugin/Converter/SemverConverter.php',
+        'Fxp\\Composer\\AssetPlugin\\Converter\\SemverRangeUtil' => __DIR__ . '/..' . '/fxp/composer-asset-plugin/Converter/SemverRangeUtil.php',
+        'Fxp\\Composer\\AssetPlugin\\Converter\\SemverUtil' => __DIR__ . '/..' . '/fxp/composer-asset-plugin/Converter/SemverUtil.php',
+        'Fxp\\Composer\\AssetPlugin\\Converter\\VersionConverterInterface' => __DIR__ . '/..' . '/fxp/composer-asset-plugin/Converter/VersionConverterInterface.php',
+        'Fxp\\Composer\\AssetPlugin\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/fxp/composer-asset-plugin/Exception/ExceptionInterface.php',
+        'Fxp\\Composer\\AssetPlugin\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/fxp/composer-asset-plugin/Exception/InvalidArgumentException.php',
+        'Fxp\\Composer\\AssetPlugin\\Exception\\InvalidCreateRepositoryException' => __DIR__ . '/..' . '/fxp/composer-asset-plugin/Exception/InvalidCreateRepositoryException.php',
+        'Fxp\\Composer\\AssetPlugin\\FxpAssetPlugin' => __DIR__ . '/..' . '/fxp/composer-asset-plugin/FxpAssetPlugin.php',
+        'Fxp\\Composer\\AssetPlugin\\Installer\\AssetInstaller' => __DIR__ . '/..' . '/fxp/composer-asset-plugin/Installer/AssetInstaller.php',
+        'Fxp\\Composer\\AssetPlugin\\Installer\\BowerInstaller' => __DIR__ . '/..' . '/fxp/composer-asset-plugin/Installer/BowerInstaller.php',
+        'Fxp\\Composer\\AssetPlugin\\Installer\\IgnoreFactory' => __DIR__ . '/..' . '/fxp/composer-asset-plugin/Installer/IgnoreFactory.php',
+        'Fxp\\Composer\\AssetPlugin\\Installer\\IgnoreManager' => __DIR__ . '/..' . '/fxp/composer-asset-plugin/Installer/IgnoreManager.php',
+        'Fxp\\Composer\\AssetPlugin\\Package\\AbstractLazyCompletePackage' => __DIR__ . '/..' . '/fxp/composer-asset-plugin/Package/AbstractLazyCompletePackage.php',
+        'Fxp\\Composer\\AssetPlugin\\Package\\LazyCompletePackage' => __DIR__ . '/..' . '/fxp/composer-asset-plugin/Package/LazyCompletePackage.php',
+        'Fxp\\Composer\\AssetPlugin\\Package\\LazyPackageInterface' => __DIR__ . '/..' . '/fxp/composer-asset-plugin/Package/LazyPackageInterface.php',
+        'Fxp\\Composer\\AssetPlugin\\Package\\Loader\\LazyAssetPackageLoader' => __DIR__ . '/..' . '/fxp/composer-asset-plugin/Package/Loader/LazyAssetPackageLoader.php',
+        'Fxp\\Composer\\AssetPlugin\\Package\\Loader\\LazyLoaderInterface' => __DIR__ . '/..' . '/fxp/composer-asset-plugin/Package/Loader/LazyLoaderInterface.php',
+        'Fxp\\Composer\\AssetPlugin\\Package\\Version\\VersionParser' => __DIR__ . '/..' . '/fxp/composer-asset-plugin/Package/Version/VersionParser.php',
+        'Fxp\\Composer\\AssetPlugin\\Repository\\AbstractAssetVcsRepository' => __DIR__ . '/..' . '/fxp/composer-asset-plugin/Repository/AbstractAssetVcsRepository.php',
+        'Fxp\\Composer\\AssetPlugin\\Repository\\AbstractAssetsRepository' => __DIR__ . '/..' . '/fxp/composer-asset-plugin/Repository/AbstractAssetsRepository.php',
+        'Fxp\\Composer\\AssetPlugin\\Repository\\AssetRepositoryManager' => __DIR__ . '/..' . '/fxp/composer-asset-plugin/Repository/AssetRepositoryManager.php',
+        'Fxp\\Composer\\AssetPlugin\\Repository\\AssetVcsRepository' => __DIR__ . '/..' . '/fxp/composer-asset-plugin/Repository/AssetVcsRepository.php',
+        'Fxp\\Composer\\AssetPlugin\\Repository\\BowerPrivateRegistryFactory' => __DIR__ . '/..' . '/fxp/composer-asset-plugin/Repository/BowerPrivateRegistryFactory.php',
+        'Fxp\\Composer\\AssetPlugin\\Repository\\BowerPrivateRepository' => __DIR__ . '/..' . '/fxp/composer-asset-plugin/Repository/BowerPrivateRepository.php',
+        'Fxp\\Composer\\AssetPlugin\\Repository\\BowerRepository' => __DIR__ . '/..' . '/fxp/composer-asset-plugin/Repository/BowerRepository.php',
+        'Fxp\\Composer\\AssetPlugin\\Repository\\DefaultRegistryFactory' => __DIR__ . '/..' . '/fxp/composer-asset-plugin/Repository/DefaultRegistryFactory.php',
+        'Fxp\\Composer\\AssetPlugin\\Repository\\FilterUtil' => __DIR__ . '/..' . '/fxp/composer-asset-plugin/Repository/FilterUtil.php',
+        'Fxp\\Composer\\AssetPlugin\\Repository\\NpmRepository' => __DIR__ . '/..' . '/fxp/composer-asset-plugin/Repository/NpmRepository.php',
+        'Fxp\\Composer\\AssetPlugin\\Repository\\RegistryFactoryInterface' => __DIR__ . '/..' . '/fxp/composer-asset-plugin/Repository/RegistryFactoryInterface.php',
+        'Fxp\\Composer\\AssetPlugin\\Repository\\ResolutionManager' => __DIR__ . '/..' . '/fxp/composer-asset-plugin/Repository/ResolutionManager.php',
+        'Fxp\\Composer\\AssetPlugin\\Repository\\Util' => __DIR__ . '/..' . '/fxp/composer-asset-plugin/Repository/Util.php',
+        'Fxp\\Composer\\AssetPlugin\\Repository\\VcsPackageFilter' => __DIR__ . '/..' . '/fxp/composer-asset-plugin/Repository/VcsPackageFilter.php',
+        'Fxp\\Composer\\AssetPlugin\\Repository\\Vcs\\AbstractGitHubDriver' => __DIR__ . '/..' . '/fxp/composer-asset-plugin/Repository/Vcs/AbstractGitHubDriver.php',
+        'Fxp\\Composer\\AssetPlugin\\Repository\\Vcs\\BitbucketUtil' => __DIR__ . '/..' . '/fxp/composer-asset-plugin/Repository/Vcs/BitbucketUtil.php',
+        'Fxp\\Composer\\AssetPlugin\\Repository\\Vcs\\GitBitbucketDriver' => __DIR__ . '/..' . '/fxp/composer-asset-plugin/Repository/Vcs/GitBitbucketDriver.php',
+        'Fxp\\Composer\\AssetPlugin\\Repository\\Vcs\\GitDriver' => __DIR__ . '/..' . '/fxp/composer-asset-plugin/Repository/Vcs/GitDriver.php',
+        'Fxp\\Composer\\AssetPlugin\\Repository\\Vcs\\GitHubDriver' => __DIR__ . '/..' . '/fxp/composer-asset-plugin/Repository/Vcs/GitHubDriver.php',
+        'Fxp\\Composer\\AssetPlugin\\Repository\\Vcs\\HgBitbucketDriver' => __DIR__ . '/..' . '/fxp/composer-asset-plugin/Repository/Vcs/HgBitbucketDriver.php',
+        'Fxp\\Composer\\AssetPlugin\\Repository\\Vcs\\HgDriver' => __DIR__ . '/..' . '/fxp/composer-asset-plugin/Repository/Vcs/HgDriver.php',
+        'Fxp\\Composer\\AssetPlugin\\Repository\\Vcs\\PerforceDriver' => __DIR__ . '/..' . '/fxp/composer-asset-plugin/Repository/Vcs/PerforceDriver.php',
+        'Fxp\\Composer\\AssetPlugin\\Repository\\Vcs\\ProcessUtil' => __DIR__ . '/..' . '/fxp/composer-asset-plugin/Repository/Vcs/ProcessUtil.php',
+        'Fxp\\Composer\\AssetPlugin\\Repository\\Vcs\\SvnDriver' => __DIR__ . '/..' . '/fxp/composer-asset-plugin/Repository/Vcs/SvnDriver.php',
+        'Fxp\\Composer\\AssetPlugin\\Repository\\Vcs\\Util' => __DIR__ . '/..' . '/fxp/composer-asset-plugin/Repository/Vcs/Util.php',
+        'Fxp\\Composer\\AssetPlugin\\Type\\AbstractAssetType' => __DIR__ . '/..' . '/fxp/composer-asset-plugin/Type/AbstractAssetType.php',
+        'Fxp\\Composer\\AssetPlugin\\Type\\AssetTypeInterface' => __DIR__ . '/..' . '/fxp/composer-asset-plugin/Type/AssetTypeInterface.php',
+        'Fxp\\Composer\\AssetPlugin\\Type\\BowerAssetType' => __DIR__ . '/..' . '/fxp/composer-asset-plugin/Type/BowerAssetType.php',
+        'Fxp\\Composer\\AssetPlugin\\Type\\NpmAssetType' => __DIR__ . '/..' . '/fxp/composer-asset-plugin/Type/NpmAssetType.php',
+        'Fxp\\Composer\\AssetPlugin\\Util\\AssetPlugin' => __DIR__ . '/..' . '/fxp/composer-asset-plugin/Util/AssetPlugin.php',
+        'Fxp\\Composer\\AssetPlugin\\Util\\Perforce' => __DIR__ . '/..' . '/fxp/composer-asset-plugin/Util/Perforce.php',
+        'Fxp\\Composer\\AssetPlugin\\Util\\Validator' => __DIR__ . '/..' . '/fxp/composer-asset-plugin/Util/Validator.php',
+        'Interop\\Container\\ContainerInterface' => __DIR__ . '/..' . '/container-interop/container-interop/src/Interop/Container/ContainerInterface.php',
+        'Interop\\Container\\Exception\\ContainerException' => __DIR__ . '/..' . '/container-interop/container-interop/src/Interop/Container/Exception/ContainerException.php',
+        'Interop\\Container\\Exception\\NotFoundException' => __DIR__ . '/..' . '/container-interop/container-interop/src/Interop/Container/Exception/NotFoundException.php',
+        'Pimple\\Container' => __DIR__ . '/..' . '/pimple/pimple/src/Pimple/Container.php',
+        'Pimple\\Exception\\ExpectedInvokableException' => __DIR__ . '/..' . '/pimple/pimple/src/Pimple/Exception/ExpectedInvokableException.php',
+        'Pimple\\Exception\\FrozenServiceException' => __DIR__ . '/..' . '/pimple/pimple/src/Pimple/Exception/FrozenServiceException.php',
+        'Pimple\\Exception\\InvalidServiceIdentifierException' => __DIR__ . '/..' . '/pimple/pimple/src/Pimple/Exception/InvalidServiceIdentifierException.php',
+        'Pimple\\Exception\\UnknownIdentifierException' => __DIR__ . '/..' . '/pimple/pimple/src/Pimple/Exception/UnknownIdentifierException.php',
+        'Pimple\\Psr11\\Container' => __DIR__ . '/..' . '/pimple/pimple/src/Pimple/Psr11/Container.php',
+        'Pimple\\Psr11\\ServiceLocator' => __DIR__ . '/..' . '/pimple/pimple/src/Pimple/Psr11/ServiceLocator.php',
+        'Pimple\\ServiceIterator' => __DIR__ . '/..' . '/pimple/pimple/src/Pimple/ServiceIterator.php',
+        'Pimple\\ServiceProviderInterface' => __DIR__ . '/..' . '/pimple/pimple/src/Pimple/ServiceProviderInterface.php',
+        'Pimple\\Tests\\Fixtures\\Invokable' => __DIR__ . '/..' . '/pimple/pimple/src/Pimple/Tests/Fixtures/Invokable.php',
+        'Pimple\\Tests\\Fixtures\\NonInvokable' => __DIR__ . '/..' . '/pimple/pimple/src/Pimple/Tests/Fixtures/NonInvokable.php',
+        'Pimple\\Tests\\Fixtures\\PimpleServiceProvider' => __DIR__ . '/..' . '/pimple/pimple/src/Pimple/Tests/Fixtures/PimpleServiceProvider.php',
+        'Pimple\\Tests\\Fixtures\\Service' => __DIR__ . '/..' . '/pimple/pimple/src/Pimple/Tests/Fixtures/Service.php',
+        'Pimple\\Tests\\PimpleServiceProviderInterfaceTest' => __DIR__ . '/..' . '/pimple/pimple/src/Pimple/Tests/PimpleServiceProviderInterfaceTest.php',
+        'Pimple\\Tests\\PimpleTest' => __DIR__ . '/..' . '/pimple/pimple/src/Pimple/Tests/PimpleTest.php',
+        'Pimple\\Tests\\Psr11\\ContainerTest' => __DIR__ . '/..' . '/pimple/pimple/src/Pimple/Tests/Psr11/ContainerTest.php',
+        'Pimple\\Tests\\Psr11\\ServiceLocatorTest' => __DIR__ . '/..' . '/pimple/pimple/src/Pimple/Tests/Psr11/ServiceLocatorTest.php',
+        'Pimple\\Tests\\ServiceIteratorTest' => __DIR__ . '/..' . '/pimple/pimple/src/Pimple/Tests/ServiceIteratorTest.php',
+        'Psr\\Cache\\CacheException' => __DIR__ . '/..' . '/psr/cache/src/CacheException.php',
+        'Psr\\Cache\\CacheItemInterface' => __DIR__ . '/..' . '/psr/cache/src/CacheItemInterface.php',
+        'Psr\\Cache\\CacheItemPoolInterface' => __DIR__ . '/..' . '/psr/cache/src/CacheItemPoolInterface.php',
+        'Psr\\Cache\\InvalidArgumentException' => __DIR__ . '/..' . '/psr/cache/src/InvalidArgumentException.php',
+        'Psr\\Container\\ContainerExceptionInterface' => __DIR__ . '/..' . '/psr/container/src/ContainerExceptionInterface.php',
+        'Psr\\Container\\ContainerInterface' => __DIR__ . '/..' . '/psr/container/src/ContainerInterface.php',
+        'Psr\\Container\\NotFoundExceptionInterface' => __DIR__ . '/..' . '/psr/container/src/NotFoundExceptionInterface.php',
+        'Psr\\Http\\Message\\MessageInterface' => __DIR__ . '/..' . '/psr/http-message/src/MessageInterface.php',
+        'Psr\\Http\\Message\\RequestInterface' => __DIR__ . '/..' . '/psr/http-message/src/RequestInterface.php',
+        'Psr\\Http\\Message\\ResponseInterface' => __DIR__ . '/..' . '/psr/http-message/src/ResponseInterface.php',
+        'Psr\\Http\\Message\\ServerRequestInterface' => __DIR__ . '/..' . '/psr/http-message/src/ServerRequestInterface.php',
+        'Psr\\Http\\Message\\StreamInterface' => __DIR__ . '/..' . '/psr/http-message/src/StreamInterface.php',
+        'Psr\\Http\\Message\\UploadedFileInterface' => __DIR__ . '/..' . '/psr/http-message/src/UploadedFileInterface.php',
+        'Psr\\Http\\Message\\UriInterface' => __DIR__ . '/..' . '/psr/http-message/src/UriInterface.php',
+        'Psr\\Log\\AbstractLogger' => __DIR__ . '/..' . '/psr/log/Psr/Log/AbstractLogger.php',
+        'Psr\\Log\\InvalidArgumentException' => __DIR__ . '/..' . '/psr/log/Psr/Log/InvalidArgumentException.php',
+        'Psr\\Log\\LogLevel' => __DIR__ . '/..' . '/psr/log/Psr/Log/LogLevel.php',
+        'Psr\\Log\\LoggerAwareInterface' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerAwareInterface.php',
+        'Psr\\Log\\LoggerAwareTrait' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerAwareTrait.php',
+        'Psr\\Log\\LoggerInterface' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerInterface.php',
+        'Psr\\Log\\LoggerTrait' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerTrait.php',
+        'Psr\\Log\\NullLogger' => __DIR__ . '/..' . '/psr/log/Psr/Log/NullLogger.php',
+        'Psr\\Log\\Test\\DummyTest' => __DIR__ . '/..' . '/psr/log/Psr/Log/Test/LoggerInterfaceTest.php',
+        'Psr\\Log\\Test\\LoggerInterfaceTest' => __DIR__ . '/..' . '/psr/log/Psr/Log/Test/LoggerInterfaceTest.php',
+        'Psr\\SimpleCache\\CacheException' => __DIR__ . '/..' . '/psr/simple-cache/src/CacheException.php',
+        'Psr\\SimpleCache\\CacheInterface' => __DIR__ . '/..' . '/psr/simple-cache/src/CacheInterface.php',
+        'Psr\\SimpleCache\\InvalidArgumentException' => __DIR__ . '/..' . '/psr/simple-cache/src/InvalidArgumentException.php',
+        'Slim\\App' => __DIR__ . '/..' . '/slim/slim/Slim/App.php',
+        'Slim\\CallableResolver' => __DIR__ . '/..' . '/slim/slim/Slim/CallableResolver.php',
+        'Slim\\CallableResolverAwareTrait' => __DIR__ . '/..' . '/slim/slim/Slim/CallableResolverAwareTrait.php',
+        'Slim\\Collection' => __DIR__ . '/..' . '/slim/slim/Slim/Collection.php',
+        'Slim\\Container' => __DIR__ . '/..' . '/slim/slim/Slim/Container.php',
+        'Slim\\DefaultServicesProvider' => __DIR__ . '/..' . '/slim/slim/Slim/DefaultServicesProvider.php',
+        'Slim\\DeferredCallable' => __DIR__ . '/..' . '/slim/slim/Slim/DeferredCallable.php',
+        'Slim\\Exception\\ContainerException' => __DIR__ . '/..' . '/slim/slim/Slim/Exception/ContainerException.php',
+        'Slim\\Exception\\ContainerValueNotFoundException' => __DIR__ . '/..' . '/slim/slim/Slim/Exception/ContainerValueNotFoundException.php',
+        'Slim\\Exception\\InvalidMethodException' => __DIR__ . '/..' . '/slim/slim/Slim/Exception/InvalidMethodException.php',
+        'Slim\\Exception\\MethodNotAllowedException' => __DIR__ . '/..' . '/slim/slim/Slim/Exception/MethodNotAllowedException.php',
+        'Slim\\Exception\\NotFoundException' => __DIR__ . '/..' . '/slim/slim/Slim/Exception/NotFoundException.php',
+        'Slim\\Exception\\SlimException' => __DIR__ . '/..' . '/slim/slim/Slim/Exception/SlimException.php',
+        'Slim\\Handlers\\AbstractError' => __DIR__ . '/..' . '/slim/slim/Slim/Handlers/AbstractError.php',
+        'Slim\\Handlers\\AbstractHandler' => __DIR__ . '/..' . '/slim/slim/Slim/Handlers/AbstractHandler.php',
+        'Slim\\Handlers\\Error' => __DIR__ . '/..' . '/slim/slim/Slim/Handlers/Error.php',
+        'Slim\\Handlers\\NotAllowed' => __DIR__ . '/..' . '/slim/slim/Slim/Handlers/NotAllowed.php',
+        'Slim\\Handlers\\NotFound' => __DIR__ . '/..' . '/slim/slim/Slim/Handlers/NotFound.php',
+        'Slim\\Handlers\\PhpError' => __DIR__ . '/..' . '/slim/slim/Slim/Handlers/PhpError.php',
+        'Slim\\Handlers\\Strategies\\RequestResponse' => __DIR__ . '/..' . '/slim/slim/Slim/Handlers/Strategies/RequestResponse.php',
+        'Slim\\Handlers\\Strategies\\RequestResponseArgs' => __DIR__ . '/..' . '/slim/slim/Slim/Handlers/Strategies/RequestResponseArgs.php',
+        'Slim\\Http\\Body' => __DIR__ . '/..' . '/slim/slim/Slim/Http/Body.php',
+        'Slim\\Http\\Cookies' => __DIR__ . '/..' . '/slim/slim/Slim/Http/Cookies.php',
+        'Slim\\Http\\Environment' => __DIR__ . '/..' . '/slim/slim/Slim/Http/Environment.php',
+        'Slim\\Http\\Headers' => __DIR__ . '/..' . '/slim/slim/Slim/Http/Headers.php',
+        'Slim\\Http\\Message' => __DIR__ . '/..' . '/slim/slim/Slim/Http/Message.php',
+        'Slim\\Http\\Request' => __DIR__ . '/..' . '/slim/slim/Slim/Http/Request.php',
+        'Slim\\Http\\RequestBody' => __DIR__ . '/..' . '/slim/slim/Slim/Http/RequestBody.php',
+        'Slim\\Http\\Response' => __DIR__ . '/..' . '/slim/slim/Slim/Http/Response.php',
+        'Slim\\Http\\Stream' => __DIR__ . '/..' . '/slim/slim/Slim/Http/Stream.php',
+        'Slim\\Http\\UploadedFile' => __DIR__ . '/..' . '/slim/slim/Slim/Http/UploadedFile.php',
+        'Slim\\Http\\Uri' => __DIR__ . '/..' . '/slim/slim/Slim/Http/Uri.php',
+        'Slim\\Interfaces\\CallableResolverInterface' => __DIR__ . '/..' . '/slim/slim/Slim/Interfaces/CallableResolverInterface.php',
+        'Slim\\Interfaces\\CollectionInterface' => __DIR__ . '/..' . '/slim/slim/Slim/Interfaces/CollectionInterface.php',
+        'Slim\\Interfaces\\Http\\CookiesInterface' => __DIR__ . '/..' . '/slim/slim/Slim/Interfaces/Http/CookiesInterface.php',
+        'Slim\\Interfaces\\Http\\EnvironmentInterface' => __DIR__ . '/..' . '/slim/slim/Slim/Interfaces/Http/EnvironmentInterface.php',
+        'Slim\\Interfaces\\Http\\HeadersInterface' => __DIR__ . '/..' . '/slim/slim/Slim/Interfaces/Http/HeadersInterface.php',
+        'Slim\\Interfaces\\InvocationStrategyInterface' => __DIR__ . '/..' . '/slim/slim/Slim/Interfaces/InvocationStrategyInterface.php',
+        'Slim\\Interfaces\\RouteGroupInterface' => __DIR__ . '/..' . '/slim/slim/Slim/Interfaces/RouteGroupInterface.php',
+        'Slim\\Interfaces\\RouteInterface' => __DIR__ . '/..' . '/slim/slim/Slim/Interfaces/RouteInterface.php',
+        'Slim\\Interfaces\\RouterInterface' => __DIR__ . '/..' . '/slim/slim/Slim/Interfaces/RouterInterface.php',
+        'Slim\\MiddlewareAwareTrait' => __DIR__ . '/..' . '/slim/slim/Slim/MiddlewareAwareTrait.php',
+        'Slim\\Routable' => __DIR__ . '/..' . '/slim/slim/Slim/Routable.php',
+        'Slim\\Route' => __DIR__ . '/..' . '/slim/slim/Slim/Route.php',
+        'Slim\\RouteGroup' => __DIR__ . '/..' . '/slim/slim/Slim/RouteGroup.php',
+        'Slim\\Router' => __DIR__ . '/..' . '/slim/slim/Slim/Router.php',
+        'Symfony\\Component\\Cache\\Adapter\\AbstractAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/AbstractAdapter.php',
+        'Symfony\\Component\\Cache\\Adapter\\AdapterInterface' => __DIR__ . '/..' . '/symfony/cache/Adapter/AdapterInterface.php',
+        'Symfony\\Component\\Cache\\Adapter\\ApcuAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/ApcuAdapter.php',
+        'Symfony\\Component\\Cache\\Adapter\\ArrayAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/ArrayAdapter.php',
+        'Symfony\\Component\\Cache\\Adapter\\ChainAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/ChainAdapter.php',
+        'Symfony\\Component\\Cache\\Adapter\\DoctrineAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/DoctrineAdapter.php',
+        'Symfony\\Component\\Cache\\Adapter\\FilesystemAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/FilesystemAdapter.php',
+        'Symfony\\Component\\Cache\\Adapter\\MemcachedAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/MemcachedAdapter.php',
+        'Symfony\\Component\\Cache\\Adapter\\NullAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/NullAdapter.php',
+        'Symfony\\Component\\Cache\\Adapter\\PdoAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/PdoAdapter.php',
+        'Symfony\\Component\\Cache\\Adapter\\PhpArrayAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/PhpArrayAdapter.php',
+        'Symfony\\Component\\Cache\\Adapter\\PhpFilesAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/PhpFilesAdapter.php',
+        'Symfony\\Component\\Cache\\Adapter\\ProxyAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/ProxyAdapter.php',
+        'Symfony\\Component\\Cache\\Adapter\\RedisAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/RedisAdapter.php',
+        'Symfony\\Component\\Cache\\Adapter\\SimpleCacheAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/SimpleCacheAdapter.php',
+        'Symfony\\Component\\Cache\\Adapter\\TagAwareAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/TagAwareAdapter.php',
+        'Symfony\\Component\\Cache\\Adapter\\TagAwareAdapterInterface' => __DIR__ . '/..' . '/symfony/cache/Adapter/TagAwareAdapterInterface.php',
+        'Symfony\\Component\\Cache\\Adapter\\TraceableAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/TraceableAdapter.php',
+        'Symfony\\Component\\Cache\\Adapter\\TraceableAdapterEvent' => __DIR__ . '/..' . '/symfony/cache/Adapter/TraceableAdapter.php',
+        'Symfony\\Component\\Cache\\Adapter\\TraceableTagAwareAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/TraceableTagAwareAdapter.php',
+        'Symfony\\Component\\Cache\\CacheItem' => __DIR__ . '/..' . '/symfony/cache/CacheItem.php',
+        'Symfony\\Component\\Cache\\DataCollector\\CacheDataCollector' => __DIR__ . '/..' . '/symfony/cache/DataCollector/CacheDataCollector.php',
+        'Symfony\\Component\\Cache\\DoctrineProvider' => __DIR__ . '/..' . '/symfony/cache/DoctrineProvider.php',
+        'Symfony\\Component\\Cache\\Exception\\CacheException' => __DIR__ . '/..' . '/symfony/cache/Exception/CacheException.php',
+        'Symfony\\Component\\Cache\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/symfony/cache/Exception/InvalidArgumentException.php',
+        'Symfony\\Component\\Cache\\PruneableInterface' => __DIR__ . '/..' . '/symfony/cache/PruneableInterface.php',
+        'Symfony\\Component\\Cache\\ResettableInterface' => __DIR__ . '/..' . '/symfony/cache/ResettableInterface.php',
+        'Symfony\\Component\\Cache\\Simple\\AbstractCache' => __DIR__ . '/..' . '/symfony/cache/Simple/AbstractCache.php',
+        'Symfony\\Component\\Cache\\Simple\\ApcuCache' => __DIR__ . '/..' . '/symfony/cache/Simple/ApcuCache.php',
+        'Symfony\\Component\\Cache\\Simple\\ArrayCache' => __DIR__ . '/..' . '/symfony/cache/Simple/ArrayCache.php',
+        'Symfony\\Component\\Cache\\Simple\\ChainCache' => __DIR__ . '/..' . '/symfony/cache/Simple/ChainCache.php',
+        'Symfony\\Component\\Cache\\Simple\\DoctrineCache' => __DIR__ . '/..' . '/symfony/cache/Simple/DoctrineCache.php',
+        'Symfony\\Component\\Cache\\Simple\\FilesystemCache' => __DIR__ . '/..' . '/symfony/cache/Simple/FilesystemCache.php',
+        'Symfony\\Component\\Cache\\Simple\\MemcachedCache' => __DIR__ . '/..' . '/symfony/cache/Simple/MemcachedCache.php',
+        'Symfony\\Component\\Cache\\Simple\\NullCache' => __DIR__ . '/..' . '/symfony/cache/Simple/NullCache.php',
+        'Symfony\\Component\\Cache\\Simple\\PdoCache' => __DIR__ . '/..' . '/symfony/cache/Simple/PdoCache.php',
+        'Symfony\\Component\\Cache\\Simple\\PhpArrayCache' => __DIR__ . '/..' . '/symfony/cache/Simple/PhpArrayCache.php',
+        'Symfony\\Component\\Cache\\Simple\\PhpFilesCache' => __DIR__ . '/..' . '/symfony/cache/Simple/PhpFilesCache.php',
+        'Symfony\\Component\\Cache\\Simple\\Psr6Cache' => __DIR__ . '/..' . '/symfony/cache/Simple/Psr6Cache.php',
+        'Symfony\\Component\\Cache\\Simple\\RedisCache' => __DIR__ . '/..' . '/symfony/cache/Simple/RedisCache.php',
+        'Symfony\\Component\\Cache\\Simple\\TraceableCache' => __DIR__ . '/..' . '/symfony/cache/Simple/TraceableCache.php',
+        'Symfony\\Component\\Cache\\Simple\\TraceableCacheEvent' => __DIR__ . '/..' . '/symfony/cache/Simple/TraceableCache.php',
+        'Symfony\\Component\\Cache\\Traits\\AbstractTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/AbstractTrait.php',
+        'Symfony\\Component\\Cache\\Traits\\ApcuTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/ApcuTrait.php',
+        'Symfony\\Component\\Cache\\Traits\\ArrayTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/ArrayTrait.php',
+        'Symfony\\Component\\Cache\\Traits\\DoctrineTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/DoctrineTrait.php',
+        'Symfony\\Component\\Cache\\Traits\\FilesystemCommonTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/FilesystemCommonTrait.php',
+        'Symfony\\Component\\Cache\\Traits\\FilesystemTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/FilesystemTrait.php',
+        'Symfony\\Component\\Cache\\Traits\\MemcachedTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/MemcachedTrait.php',
+        'Symfony\\Component\\Cache\\Traits\\PdoTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/PdoTrait.php',
+        'Symfony\\Component\\Cache\\Traits\\PhpArrayTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/PhpArrayTrait.php',
+        'Symfony\\Component\\Cache\\Traits\\PhpFilesTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/PhpFilesTrait.php',
+        'Symfony\\Component\\Cache\\Traits\\ProxyTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/ProxyTrait.php',
+        'Symfony\\Component\\Cache\\Traits\\RedisProxy' => __DIR__ . '/..' . '/symfony/cache/Traits/RedisProxy.php',
+        'Symfony\\Component\\Cache\\Traits\\RedisTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/RedisTrait.php',
+        'Symfony\\Component\\ExpressionLanguage\\Compiler' => __DIR__ . '/..' . '/symfony/expression-language/Compiler.php',
+        'Symfony\\Component\\ExpressionLanguage\\Expression' => __DIR__ . '/..' . '/symfony/expression-language/Expression.php',
+        'Symfony\\Component\\ExpressionLanguage\\ExpressionFunction' => __DIR__ . '/..' . '/symfony/expression-language/ExpressionFunction.php',
+        'Symfony\\Component\\ExpressionLanguage\\ExpressionFunctionProviderInterface' => __DIR__ . '/..' . '/symfony/expression-language/ExpressionFunctionProviderInterface.php',
+        'Symfony\\Component\\ExpressionLanguage\\ExpressionLanguage' => __DIR__ . '/..' . '/symfony/expression-language/ExpressionLanguage.php',
+        'Symfony\\Component\\ExpressionLanguage\\Lexer' => __DIR__ . '/..' . '/symfony/expression-language/Lexer.php',
+        'Symfony\\Component\\ExpressionLanguage\\Node\\ArgumentsNode' => __DIR__ . '/..' . '/symfony/expression-language/Node/ArgumentsNode.php',
+        'Symfony\\Component\\ExpressionLanguage\\Node\\ArrayNode' => __DIR__ . '/..' . '/symfony/expression-language/Node/ArrayNode.php',
+        'Symfony\\Component\\ExpressionLanguage\\Node\\BinaryNode' => __DIR__ . '/..' . '/symfony/expression-language/Node/BinaryNode.php',
+        'Symfony\\Component\\ExpressionLanguage\\Node\\ConditionalNode' => __DIR__ . '/..' . '/symfony/expression-language/Node/ConditionalNode.php',
+        'Symfony\\Component\\ExpressionLanguage\\Node\\ConstantNode' => __DIR__ . '/..' . '/symfony/expression-language/Node/ConstantNode.php',
+        'Symfony\\Component\\ExpressionLanguage\\Node\\FunctionNode' => __DIR__ . '/..' . '/symfony/expression-language/Node/FunctionNode.php',
+        'Symfony\\Component\\ExpressionLanguage\\Node\\GetAttrNode' => __DIR__ . '/..' . '/symfony/expression-language/Node/GetAttrNode.php',
+        'Symfony\\Component\\ExpressionLanguage\\Node\\NameNode' => __DIR__ . '/..' . '/symfony/expression-language/Node/NameNode.php',
+        'Symfony\\Component\\ExpressionLanguage\\Node\\Node' => __DIR__ . '/..' . '/symfony/expression-language/Node/Node.php',
+        'Symfony\\Component\\ExpressionLanguage\\Node\\UnaryNode' => __DIR__ . '/..' . '/symfony/expression-language/Node/UnaryNode.php',
+        'Symfony\\Component\\ExpressionLanguage\\ParsedExpression' => __DIR__ . '/..' . '/symfony/expression-language/ParsedExpression.php',
+        'Symfony\\Component\\ExpressionLanguage\\Parser' => __DIR__ . '/..' . '/symfony/expression-language/Parser.php',
+        'Symfony\\Component\\ExpressionLanguage\\ParserCache\\ArrayParserCache' => __DIR__ . '/..' . '/symfony/expression-language/ParserCache/ArrayParserCache.php',
+        'Symfony\\Component\\ExpressionLanguage\\ParserCache\\ParserCacheAdapter' => __DIR__ . '/..' . '/symfony/expression-language/ParserCache/ParserCacheAdapter.php',
+        'Symfony\\Component\\ExpressionLanguage\\ParserCache\\ParserCacheInterface' => __DIR__ . '/..' . '/symfony/expression-language/ParserCache/ParserCacheInterface.php',
+        'Symfony\\Component\\ExpressionLanguage\\SerializedParsedExpression' => __DIR__ . '/..' . '/symfony/expression-language/SerializedParsedExpression.php',
+        'Symfony\\Component\\ExpressionLanguage\\SyntaxError' => __DIR__ . '/..' . '/symfony/expression-language/SyntaxError.php',
+        'Symfony\\Component\\ExpressionLanguage\\Token' => __DIR__ . '/..' . '/symfony/expression-language/Token.php',
+        'Symfony\\Component\\ExpressionLanguage\\TokenStream' => __DIR__ . '/..' . '/symfony/expression-language/TokenStream.php',
+        'Symfony\\Polyfill\\Apcu\\Apcu' => __DIR__ . '/..' . '/symfony/polyfill-apcu/Apcu.php',
+    );
+
+    public static function getInitializer(ClassLoader $loader)
+    {
+        return \Closure::bind(function () use ($loader) {
+            $loader->prefixLengthsPsr4 = ComposerStaticInitAdvancedContentFilterAddon::$prefixLengthsPsr4;
+            $loader->prefixDirsPsr4 = ComposerStaticInitAdvancedContentFilterAddon::$prefixDirsPsr4;
+            $loader->prefixesPsr0 = ComposerStaticInitAdvancedContentFilterAddon::$prefixesPsr0;
+            $loader->classMap = ComposerStaticInitAdvancedContentFilterAddon::$classMap;
+
+        }, null, ClassLoader::class);
+    }
+}
diff --git a/advancedcontentfilter/vendor/composer/installed.json b/advancedcontentfilter/vendor/composer/installed.json
new file mode 100644 (file)
index 0000000..63e9ef6
--- /dev/null
@@ -0,0 +1,757 @@
+[
+    {
+        "name": "bower-asset/vue",
+        "version": "v2.5.16",
+        "version_normalized": "2.5.16.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/vuejs/vue.git",
+            "reference": "25342194016dc3bcc81cb3e8e229b0fb7ba1d1d6"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/vuejs/vue/zipball/25342194016dc3bcc81cb3e8e229b0fb7ba1d1d6",
+            "reference": "25342194016dc3bcc81cb3e8e229b0fb7ba1d1d6",
+            "shasum": ""
+        },
+        "type": "bower-asset-library",
+        "installation-source": "dist"
+    },
+    {
+        "name": "bower-asset/vue-resource",
+        "version": "1.5.0",
+        "version_normalized": "1.5.0.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/pagekit/vue-resource.git",
+            "reference": "9a34f881f56f64b923572541d1753cb6cdd63d40"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/pagekit/vue-resource/zipball/9a34f881f56f64b923572541d1753cb6cdd63d40",
+            "reference": "9a34f881f56f64b923572541d1753cb6cdd63d40",
+            "shasum": ""
+        },
+        "time": "2018-03-03T07:42:38+00:00",
+        "type": "bower-asset-library",
+        "extra": {
+            "bower-asset-main": "dist/vue-resource.js",
+            "bower-asset-ignore": [
+                ".*",
+                "build",
+                "docs",
+                "package.json"
+            ]
+        },
+        "installation-source": "dist",
+        "license": [
+            "MIT"
+        ],
+        "description": "The HTTP client for Vue.js",
+        "keywords": [
+            "ajax",
+            "http",
+            "vue",
+            "xhr"
+        ]
+    },
+    {
+        "name": "container-interop/container-interop",
+        "version": "1.2.0",
+        "version_normalized": "1.2.0.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/container-interop/container-interop.git",
+            "reference": "79cbf1341c22ec75643d841642dd5d6acd83bdb8"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/container-interop/container-interop/zipball/79cbf1341c22ec75643d841642dd5d6acd83bdb8",
+            "reference": "79cbf1341c22ec75643d841642dd5d6acd83bdb8",
+            "shasum": ""
+        },
+        "require": {
+            "psr/container": "^1.0"
+        },
+        "time": "2017-02-14T19:40:03+00:00",
+        "type": "library",
+        "installation-source": "dist",
+        "autoload": {
+            "psr-4": {
+                "Interop\\Container\\": "src/Interop/Container/"
+            }
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "license": [
+            "MIT"
+        ],
+        "description": "Promoting the interoperability of container objects (DIC, SL, etc.)",
+        "homepage": "https://github.com/container-interop/container-interop"
+    },
+    {
+        "name": "fxp/composer-asset-plugin",
+        "version": "v1.4.2",
+        "version_normalized": "1.4.2.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/fxpio/composer-asset-plugin.git",
+            "reference": "61352d99940d2b2392a5d2db83b8c0ef5faf222a"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/fxpio/composer-asset-plugin/zipball/61352d99940d2b2392a5d2db83b8c0ef5faf222a",
+            "reference": "61352d99940d2b2392a5d2db83b8c0ef5faf222a",
+            "shasum": ""
+        },
+        "require": {
+            "composer-plugin-api": "^1.0",
+            "php": ">=5.3.3"
+        },
+        "require-dev": {
+            "composer/composer": "^1.4.0"
+        },
+        "time": "2017-10-20T06:53:56+00:00",
+        "type": "composer-plugin",
+        "extra": {
+            "class": "Fxp\\Composer\\AssetPlugin\\FxpAssetPlugin",
+            "branch-alias": {
+                "dev-master": "1.4-dev"
+            }
+        },
+        "installation-source": "dist",
+        "autoload": {
+            "psr-4": {
+                "Fxp\\Composer\\AssetPlugin\\": ""
+            },
+            "exclude-from-classmap": [
+                "/Tests/"
+            ]
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "license": [
+            "MIT"
+        ],
+        "authors": [
+            {
+                "name": "François Pluchino",
+                "email": "francois.pluchino@gmail.com"
+            }
+        ],
+        "description": "NPM/Bower Dependency Manager for Composer",
+        "homepage": "https://github.com/fxpio/composer-asset-plugin",
+        "keywords": [
+            "asset",
+            "bower",
+            "composer",
+            "dependency manager",
+            "nodejs",
+            "npm",
+            "package"
+        ]
+    },
+    {
+        "name": "nikic/fast-route",
+        "version": "v1.3.0",
+        "version_normalized": "1.3.0.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/nikic/FastRoute.git",
+            "reference": "181d480e08d9476e61381e04a71b34dc0432e812"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/nikic/FastRoute/zipball/181d480e08d9476e61381e04a71b34dc0432e812",
+            "reference": "181d480e08d9476e61381e04a71b34dc0432e812",
+            "shasum": ""
+        },
+        "require": {
+            "php": ">=5.4.0"
+        },
+        "require-dev": {
+            "phpunit/phpunit": "^4.8.35|~5.7"
+        },
+        "time": "2018-02-13T20:26:39+00:00",
+        "type": "library",
+        "installation-source": "dist",
+        "autoload": {
+            "psr-4": {
+                "FastRoute\\": "src/"
+            },
+            "files": [
+                "src/functions.php"
+            ]
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "license": [
+            "BSD-3-Clause"
+        ],
+        "authors": [
+            {
+                "name": "Nikita Popov",
+                "email": "nikic@php.net"
+            }
+        ],
+        "description": "Fast request router for PHP",
+        "keywords": [
+            "router",
+            "routing"
+        ]
+    },
+    {
+        "name": "pimple/pimple",
+        "version": "v3.2.3",
+        "version_normalized": "3.2.3.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/silexphp/Pimple.git",
+            "reference": "9e403941ef9d65d20cba7d54e29fe906db42cf32"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/silexphp/Pimple/zipball/9e403941ef9d65d20cba7d54e29fe906db42cf32",
+            "reference": "9e403941ef9d65d20cba7d54e29fe906db42cf32",
+            "shasum": ""
+        },
+        "require": {
+            "php": ">=5.3.0",
+            "psr/container": "^1.0"
+        },
+        "require-dev": {
+            "symfony/phpunit-bridge": "^3.2"
+        },
+        "time": "2018-01-21T07:42:36+00:00",
+        "type": "library",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "3.2.x-dev"
+            }
+        },
+        "installation-source": "dist",
+        "autoload": {
+            "psr-0": {
+                "Pimple": "src/"
+            }
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "license": [
+            "MIT"
+        ],
+        "authors": [
+            {
+                "name": "Fabien Potencier",
+                "email": "fabien@symfony.com"
+            }
+        ],
+        "description": "Pimple, a simple Dependency Injection Container",
+        "homepage": "http://pimple.sensiolabs.org",
+        "keywords": [
+            "container",
+            "dependency injection"
+        ]
+    },
+    {
+        "name": "psr/cache",
+        "version": "1.0.1",
+        "version_normalized": "1.0.1.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/php-fig/cache.git",
+            "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8",
+            "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8",
+            "shasum": ""
+        },
+        "require": {
+            "php": ">=5.3.0"
+        },
+        "time": "2016-08-06T20:24:11+00:00",
+        "type": "library",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "1.0.x-dev"
+            }
+        },
+        "installation-source": "dist",
+        "autoload": {
+            "psr-4": {
+                "Psr\\Cache\\": "src/"
+            }
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "license": [
+            "MIT"
+        ],
+        "authors": [
+            {
+                "name": "PHP-FIG",
+                "homepage": "http://www.php-fig.org/"
+            }
+        ],
+        "description": "Common interface for caching libraries",
+        "keywords": [
+            "cache",
+            "psr",
+            "psr-6"
+        ]
+    },
+    {
+        "name": "psr/container",
+        "version": "1.0.0",
+        "version_normalized": "1.0.0.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/php-fig/container.git",
+            "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
+            "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
+            "shasum": ""
+        },
+        "require": {
+            "php": ">=5.3.0"
+        },
+        "time": "2017-02-14T16:28:37+00:00",
+        "type": "library",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "1.0.x-dev"
+            }
+        },
+        "installation-source": "dist",
+        "autoload": {
+            "psr-4": {
+                "Psr\\Container\\": "src/"
+            }
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "license": [
+            "MIT"
+        ],
+        "authors": [
+            {
+                "name": "PHP-FIG",
+                "homepage": "http://www.php-fig.org/"
+            }
+        ],
+        "description": "Common Container Interface (PHP FIG PSR-11)",
+        "homepage": "https://github.com/php-fig/container",
+        "keywords": [
+            "PSR-11",
+            "container",
+            "container-interface",
+            "container-interop",
+            "psr"
+        ]
+    },
+    {
+        "name": "psr/http-message",
+        "version": "1.0.1",
+        "version_normalized": "1.0.1.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/php-fig/http-message.git",
+            "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363",
+            "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363",
+            "shasum": ""
+        },
+        "require": {
+            "php": ">=5.3.0"
+        },
+        "time": "2016-08-06T14:39:51+00:00",
+        "type": "library",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "1.0.x-dev"
+            }
+        },
+        "installation-source": "dist",
+        "autoload": {
+            "psr-4": {
+                "Psr\\Http\\Message\\": "src/"
+            }
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "license": [
+            "MIT"
+        ],
+        "authors": [
+            {
+                "name": "PHP-FIG",
+                "homepage": "http://www.php-fig.org/"
+            }
+        ],
+        "description": "Common interface for HTTP messages",
+        "homepage": "https://github.com/php-fig/http-message",
+        "keywords": [
+            "http",
+            "http-message",
+            "psr",
+            "psr-7",
+            "request",
+            "response"
+        ]
+    },
+    {
+        "name": "psr/log",
+        "version": "1.0.2",
+        "version_normalized": "1.0.2.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/php-fig/log.git",
+            "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/php-fig/log/zipball/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d",
+            "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d",
+            "shasum": ""
+        },
+        "require": {
+            "php": ">=5.3.0"
+        },
+        "time": "2016-10-10T12:19:37+00:00",
+        "type": "library",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "1.0.x-dev"
+            }
+        },
+        "installation-source": "dist",
+        "autoload": {
+            "psr-4": {
+                "Psr\\Log\\": "Psr/Log/"
+            }
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "license": [
+            "MIT"
+        ],
+        "authors": [
+            {
+                "name": "PHP-FIG",
+                "homepage": "http://www.php-fig.org/"
+            }
+        ],
+        "description": "Common interface for logging libraries",
+        "homepage": "https://github.com/php-fig/log",
+        "keywords": [
+            "log",
+            "psr",
+            "psr-3"
+        ]
+    },
+    {
+        "name": "psr/simple-cache",
+        "version": "1.0.1",
+        "version_normalized": "1.0.1.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/php-fig/simple-cache.git",
+            "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b",
+            "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b",
+            "shasum": ""
+        },
+        "require": {
+            "php": ">=5.3.0"
+        },
+        "time": "2017-10-23T01:57:42+00:00",
+        "type": "library",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "1.0.x-dev"
+            }
+        },
+        "installation-source": "dist",
+        "autoload": {
+            "psr-4": {
+                "Psr\\SimpleCache\\": "src/"
+            }
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "license": [
+            "MIT"
+        ],
+        "authors": [
+            {
+                "name": "PHP-FIG",
+                "homepage": "http://www.php-fig.org/"
+            }
+        ],
+        "description": "Common interfaces for simple caching",
+        "keywords": [
+            "cache",
+            "caching",
+            "psr",
+            "psr-16",
+            "simple-cache"
+        ]
+    },
+    {
+        "name": "slim/slim",
+        "version": "3.9.2",
+        "version_normalized": "3.9.2.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/slimphp/Slim.git",
+            "reference": "4086d0106cf5a7135c69fce4161fe355a8feb118"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/slimphp/Slim/zipball/4086d0106cf5a7135c69fce4161fe355a8feb118",
+            "reference": "4086d0106cf5a7135c69fce4161fe355a8feb118",
+            "shasum": ""
+        },
+        "require": {
+            "container-interop/container-interop": "^1.2",
+            "nikic/fast-route": "^1.0",
+            "php": ">=5.5.0",
+            "pimple/pimple": "^3.0",
+            "psr/container": "^1.0",
+            "psr/http-message": "^1.0"
+        },
+        "provide": {
+            "psr/http-message-implementation": "1.0"
+        },
+        "require-dev": {
+            "phpunit/phpunit": "^4.0",
+            "squizlabs/php_codesniffer": "^2.5"
+        },
+        "time": "2017-11-26T19:13:09+00:00",
+        "type": "library",
+        "installation-source": "dist",
+        "autoload": {
+            "psr-4": {
+                "Slim\\": "Slim"
+            }
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "license": [
+            "MIT"
+        ],
+        "authors": [
+            {
+                "name": "Rob Allen",
+                "email": "rob@akrabat.com",
+                "homepage": "http://akrabat.com"
+            },
+            {
+                "name": "Josh Lockhart",
+                "email": "hello@joshlockhart.com",
+                "homepage": "https://joshlockhart.com"
+            },
+            {
+                "name": "Gabriel Manricks",
+                "email": "gmanricks@me.com",
+                "homepage": "http://gabrielmanricks.com"
+            },
+            {
+                "name": "Andrew Smith",
+                "email": "a.smith@silentworks.co.uk",
+                "homepage": "http://silentworks.co.uk"
+            }
+        ],
+        "description": "Slim is a PHP micro framework that helps you quickly write simple yet powerful web applications and APIs",
+        "homepage": "https://slimframework.com",
+        "keywords": [
+            "api",
+            "framework",
+            "micro",
+            "router"
+        ]
+    },
+    {
+        "name": "symfony/cache",
+        "version": "v3.4.8",
+        "version_normalized": "3.4.8.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/symfony/cache.git",
+            "reference": "13255ddd056e49f3154747943f8ee175d555d394"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/symfony/cache/zipball/13255ddd056e49f3154747943f8ee175d555d394",
+            "reference": "13255ddd056e49f3154747943f8ee175d555d394",
+            "shasum": ""
+        },
+        "require": {
+            "php": "^5.5.9|>=7.0.8",
+            "psr/cache": "~1.0",
+            "psr/log": "~1.0",
+            "psr/simple-cache": "^1.0",
+            "symfony/polyfill-apcu": "~1.1"
+        },
+        "conflict": {
+            "symfony/var-dumper": "<3.3"
+        },
+        "provide": {
+            "psr/cache-implementation": "1.0",
+            "psr/simple-cache-implementation": "1.0"
+        },
+        "require-dev": {
+            "cache/integration-tests": "dev-master",
+            "doctrine/cache": "~1.6",
+            "doctrine/dbal": "~2.4",
+            "predis/predis": "~1.0"
+        },
+        "time": "2018-04-02T14:35:16+00:00",
+        "type": "library",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "3.4-dev"
+            }
+        },
+        "installation-source": "dist",
+        "autoload": {
+            "psr-4": {
+                "Symfony\\Component\\Cache\\": ""
+            },
+            "exclude-from-classmap": [
+                "/Tests/"
+            ]
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "license": [
+            "MIT"
+        ],
+        "authors": [
+            {
+                "name": "Nicolas Grekas",
+                "email": "p@tchwork.com"
+            },
+            {
+                "name": "Symfony Community",
+                "homepage": "https://symfony.com/contributors"
+            }
+        ],
+        "description": "Symfony Cache component with PSR-6, PSR-16, and tags",
+        "homepage": "https://symfony.com",
+        "keywords": [
+            "caching",
+            "psr6"
+        ]
+    },
+    {
+        "name": "symfony/expression-language",
+        "version": "v3.4.8",
+        "version_normalized": "3.4.8.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/symfony/expression-language.git",
+            "reference": "867e4d1f5d4e52435a8ffff6b24fd6a801582241"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/symfony/expression-language/zipball/867e4d1f5d4e52435a8ffff6b24fd6a801582241",
+            "reference": "867e4d1f5d4e52435a8ffff6b24fd6a801582241",
+            "shasum": ""
+        },
+        "require": {
+            "php": "^5.5.9|>=7.0.8",
+            "symfony/cache": "~3.1|~4.0"
+        },
+        "time": "2018-01-03T07:37:34+00:00",
+        "type": "library",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "3.4-dev"
+            }
+        },
+        "installation-source": "dist",
+        "autoload": {
+            "psr-4": {
+                "Symfony\\Component\\ExpressionLanguage\\": ""
+            },
+            "exclude-from-classmap": [
+                "/Tests/"
+            ]
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "license": [
+            "MIT"
+        ],
+        "authors": [
+            {
+                "name": "Fabien Potencier",
+                "email": "fabien@symfony.com"
+            },
+            {
+                "name": "Symfony Community",
+                "homepage": "https://symfony.com/contributors"
+            }
+        ],
+        "description": "Symfony ExpressionLanguage Component",
+        "homepage": "https://symfony.com"
+    },
+    {
+        "name": "symfony/polyfill-apcu",
+        "version": "v1.7.0",
+        "version_normalized": "1.7.0.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/symfony/polyfill-apcu.git",
+            "reference": "e8ae2136ddb53dea314df56fcd88e318ab936c00"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/symfony/polyfill-apcu/zipball/e8ae2136ddb53dea314df56fcd88e318ab936c00",
+            "reference": "e8ae2136ddb53dea314df56fcd88e318ab936c00",
+            "shasum": ""
+        },
+        "require": {
+            "php": ">=5.3.3"
+        },
+        "time": "2018-01-30T19:27:44+00:00",
+        "type": "library",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "1.7-dev"
+            }
+        },
+        "installation-source": "dist",
+        "autoload": {
+            "psr-4": {
+                "Symfony\\Polyfill\\Apcu\\": ""
+            },
+            "files": [
+                "bootstrap.php"
+            ]
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "license": [
+            "MIT"
+        ],
+        "authors": [
+            {
+                "name": "Nicolas Grekas",
+                "email": "p@tchwork.com"
+            },
+            {
+                "name": "Symfony Community",
+                "homepage": "https://symfony.com/contributors"
+            }
+        ],
+        "description": "Symfony polyfill backporting apcu_* functions to lower PHP versions",
+        "homepage": "https://symfony.com",
+        "keywords": [
+            "apcu",
+            "compatibility",
+            "polyfill",
+            "portable",
+            "shim"
+        ]
+    }
+]
diff --git a/advancedcontentfilter/vendor/container-interop/container-interop/.gitignore b/advancedcontentfilter/vendor/container-interop/container-interop/.gitignore
new file mode 100644 (file)
index 0000000..b2395aa
--- /dev/null
@@ -0,0 +1,3 @@
+composer.lock
+composer.phar
+/vendor/
diff --git a/advancedcontentfilter/vendor/container-interop/container-interop/LICENSE b/advancedcontentfilter/vendor/container-interop/container-interop/LICENSE
new file mode 100644 (file)
index 0000000..7671d90
--- /dev/null
@@ -0,0 +1,20 @@
+The MIT License (MIT)
+
+Copyright (c) 2013 container-interop
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/advancedcontentfilter/vendor/container-interop/container-interop/README.md b/advancedcontentfilter/vendor/container-interop/container-interop/README.md
new file mode 100644 (file)
index 0000000..cdd7a44
--- /dev/null
@@ -0,0 +1,148 @@
+# Container Interoperability
+
+[![Latest Stable Version](https://poser.pugx.org/container-interop/container-interop/v/stable.png)](https://packagist.org/packages/container-interop/container-interop)
+[![Total Downloads](https://poser.pugx.org/container-interop/container-interop/downloads.svg)](https://packagist.org/packages/container-interop/container-interop)
+
+## Deprecation warning!
+
+Starting Feb. 13th 2017, container-interop is officially deprecated in favor of [PSR-11](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-11-container.md).
+Container-interop has been the test-bed of PSR-11. From v1.2, container-interop directly extends PSR-11 interfaces.
+Therefore, all containers implementing container-interop are now *de-facto* compatible with PSR-11.
+
+- Projects implementing container-interop interfaces are encouraged to directly implement PSR-11 interfaces instead.
+- Projects consuming container-interop interfaces are very strongly encouraged to directly type-hint on PSR-11 interfaces, in order to be compatible with PSR-11 containers that are not compatible with container-interop.
+
+Regarding the delegate lookup feature, that is present in container-interop and not in PSR-11, the feature is actually a design pattern. It is therefore not deprecated. Documentation regarding this design pattern will be migrated from this repository into a separate website in the future.
+
+## About
+
+*container-interop* tries to identify and standardize features in *container* objects (service locators,
+dependency injection containers, etc.) to achieve interoperability.
+
+Through discussions and trials, we try to create a standard, made of common interfaces but also recommendations.
+
+If PHP projects that provide container implementations begin to adopt these common standards, then PHP
+applications and projects that use containers can depend on the common interfaces instead of specific
+implementations. This facilitates a high-level of interoperability and flexibility that allows users to consume
+*any* container implementation that can be adapted to these interfaces.
+
+The work done in this project is not officially endorsed by the [PHP-FIG](http://www.php-fig.org/), but it is being
+worked on by members of PHP-FIG and other good developers. We adhere to the spirit and ideals of PHP-FIG, and hope
+this project will pave the way for one or more future PSRs.
+
+
+## Installation
+
+You can install this package through Composer:
+
+```json
+composer require container-interop/container-interop
+```
+
+The packages adheres to the [SemVer](http://semver.org/) specification, and there will be full backward compatibility
+between minor versions.
+
+## Standards
+
+### Available
+
+- [`ContainerInterface`](src/Interop/Container/ContainerInterface.php).
+[Description](docs/ContainerInterface.md) [Meta Document](docs/ContainerInterface-meta.md).
+Describes the interface of a container that exposes methods to read its entries.
+- [*Delegate lookup feature*](docs/Delegate-lookup.md).
+[Meta Document](docs/Delegate-lookup-meta.md).
+Describes the ability for a container to delegate the lookup of its dependencies to a third-party container. This
+feature lets several containers work together in a single application.
+
+### Proposed
+
+View open [request for comments](https://github.com/container-interop/container-interop/labels/RFC)
+
+## Compatible projects
+
+### Projects implementing `ContainerInterface`
+
+- [Acclimate](https://github.com/jeremeamia/acclimate-container): Adapters for
+  Aura.Di, Laravel, Nette DI, Pimple, Symfony DI, ZF2 Service manager, ZF2
+  Dependency injection and any container using `ArrayAccess`
+- [Aura.Di](https://github.com/auraphp/Aura.Di)
+- [auryn-container-interop](https://github.com/elazar/auryn-container-interop)
+- [Burlap](https://github.com/codeeverything/burlap)
+- [Chernozem](https://github.com/pyrsmk/Chernozem)
+- [Data Manager](https://github.com/chrismichaels84/data-manager)
+- [Disco](https://github.com/bitexpert/disco)
+- [InDI](https://github.com/idealogica/indi)
+- [League/Container](http://container.thephpleague.com/)
+- [Mouf](http://mouf-php.com)
+- [Njasm Container](https://github.com/njasm/container)
+- [PHP-DI](http://php-di.org)
+- [Picotainer](https://github.com/thecodingmachine/picotainer)
+- [PimpleInterop](https://github.com/moufmouf/pimple-interop)
+- [Pimple3-ContainerInterop](https://github.com/Sam-Burns/pimple3-containerinterop) (using Pimple v3)
+- [SitePoint Container](https://github.com/sitepoint/Container)
+- [Thruster Container](https://github.com/ThrusterIO/container) (PHP7 only)
+- [Ultra-Lite Container](https://github.com/ultra-lite/container)
+- [Unbox](https://github.com/mindplay-dk/unbox)
+- [XStatic](https://github.com/jeremeamia/xstatic)
+- [Zend\ServiceManager](https://github.com/zendframework/zend-servicemanager)
+- [Zit](https://github.com/inxilpro/Zit)
+
+### Projects implementing the *delegate lookup* feature
+
+- [Aura.Di](https://github.com/auraphp/Aura.Di)
+- [Burlap](https://github.com/codeeverything/burlap)
+- [Chernozem](https://github.com/pyrsmk/Chernozem)
+- [InDI](https://github.com/idealogica/indi)
+- [League/Container](http://container.thephpleague.com/)
+- [Mouf](http://mouf-php.com)
+- [Picotainer](https://github.com/thecodingmachine/picotainer)
+- [PHP-DI](http://php-di.org)
+- [PimpleInterop](https://github.com/moufmouf/pimple-interop)
+- [Ultra-Lite Container](https://github.com/ultra-lite/container)
+
+### Middlewares implementing `ContainerInterface`
+
+- [Alias-Container](https://github.com/thecodingmachine/alias-container): add
+  aliases support to any container
+- [Prefixer-Container](https://github.com/thecodingmachine/prefixer-container):
+  dynamically prefix identifiers
+- [Lazy-Container](https://github.com/snapshotpl/lazy-container): lazy services
+
+### Projects using `ContainerInterface`
+
+The list below contains only a sample of all the projects consuming `ContainerInterface`. For a more complete list have a look [here](http://packanalyst.com/class?q=Interop%5CContainer%5CContainerInterface).
+
+| | Downloads |
+| --- | --- |
+| [Adroit](https://github.com/bitexpert/adroit) | ![](https://img.shields.io/packagist/dt/bitexpert/adroit.svg) |
+| [Behat](https://github.com/Behat/Behat/pull/974) | ![](https://img.shields.io/packagist/dt/behat/behat.svg) |
+| [blast-facades](https://github.com/phpthinktank/blast-facades): Minimize complexity and represent dependencies as facades. | ![](https://img.shields.io/packagist/dt/blast/facades.svg) |
+| [interop.silex.di](https://github.com/thecodingmachine/interop.silex.di): an extension to [Silex](http://silex.sensiolabs.org/) that adds support for any *container-interop* compatible container | ![](https://img.shields.io/packagist/dt/mouf/interop.silex.di.svg) |
+| [mindplay/walkway](https://github.com/mindplay-dk/walkway): a modular request router | ![](https://img.shields.io/packagist/dt/mindplay/walkway.svg) |
+| [mindplay/middleman](https://github.com/mindplay-dk/middleman): minimalist PSR-7 middleware dispatcher | ![](https://img.shields.io/packagist/dt/mindplay/middleman.svg) |
+| [PHP-DI/Invoker](https://github.com/PHP-DI/Invoker): extensible and configurable invoker/dispatcher | ![](https://img.shields.io/packagist/dt/php-di/invoker.svg) |
+| [Prophiler](https://github.com/fabfuel/prophiler) | ![](https://img.shields.io/packagist/dt/fabfuel/prophiler.svg) |
+| [Silly](https://github.com/mnapoli/silly): CLI micro-framework | ![](https://img.shields.io/packagist/dt/mnapoli/silly.svg) |
+| [Slim v3](https://github.com/slimphp/Slim) | ![](https://img.shields.io/packagist/dt/slim/slim.svg) |
+| [Splash](http://mouf-php.com/packages/mouf/mvc.splash-common/version/8.0-dev/README.md) | ![](https://img.shields.io/packagist/dt/mouf/mvc.splash-common.svg) |
+| [Woohoo Labs. Harmony](https://github.com/woohoolabs/harmony): a flexible micro-framework | ![](https://img.shields.io/packagist/dt/woohoolabs/harmony.svg) |
+| [zend-expressive](https://github.com/zendframework/zend-expressive) | ![](https://img.shields.io/packagist/dt/zendframework/zend-expressive.svg) |
+
+
+## Workflow
+
+Everyone is welcome to join and contribute.
+
+The general workflow looks like this:
+
+1. Someone opens a discussion (GitHub issue) to suggest an interface
+1. Feedback is gathered
+1. The interface is added to a development branch
+1. We release alpha versions so that the interface can be experimented with
+1. Discussions and edits ensue until the interface is deemed stable by a general consensus
+1. A new minor version of the package is released
+
+We try to not break BC by creating new interfaces instead of editing existing ones.
+
+While we currently work on interfaces, we are open to anything that might help towards interoperability, may that
+be code, best practices, etc.
diff --git a/advancedcontentfilter/vendor/container-interop/container-interop/composer.json b/advancedcontentfilter/vendor/container-interop/container-interop/composer.json
new file mode 100644 (file)
index 0000000..855f766
--- /dev/null
@@ -0,0 +1,15 @@
+{
+    "name": "container-interop/container-interop",
+    "type": "library",
+    "description": "Promoting the interoperability of container objects (DIC, SL, etc.)",
+    "homepage": "https://github.com/container-interop/container-interop",
+    "license": "MIT",
+    "autoload": {
+        "psr-4": {
+            "Interop\\Container\\": "src/Interop/Container/"
+        }
+    },
+    "require": {
+        "psr/container": "^1.0"
+    }
+}
diff --git a/advancedcontentfilter/vendor/container-interop/container-interop/docs/ContainerInterface-meta.md b/advancedcontentfilter/vendor/container-interop/container-interop/docs/ContainerInterface-meta.md
new file mode 100644 (file)
index 0000000..59f3d55
--- /dev/null
@@ -0,0 +1,114 @@
+# ContainerInterface Meta Document
+
+## Introduction
+
+This document describes the process and discussions that lead to the `ContainerInterface`.
+Its goal is to explain the reasons behind each decision.
+
+## Goal
+
+The goal set by `ContainerInterface` is to standardize how frameworks and libraries make use of a
+container to obtain objects and parameters.
+
+By standardizing such a behavior, frameworks and libraries using the `ContainerInterface`
+could work with any compatible container.
+That would allow end users to choose their own container based on their own preferences.
+
+It is important to distinguish the two usages of a container:
+
+- configuring entries
+- fetching entries
+
+Most of the time, those two sides are not used by the same party.
+While it is often end users who tend to configure entries, it is generally the framework that fetch
+entries to build the application.
+
+This is why this interface focuses only on how entries can be fetched from a container.
+
+## Interface name
+
+The interface name has been thoroughly discussed and was decided by a vote.
+
+The list of options considered with their respective votes are:
+
+- `ContainerInterface`: +8
+- `ProviderInterface`: +2
+- `LocatorInterface`: 0
+- `ReadableContainerInterface`: -5
+- `ServiceLocatorInterface`: -6
+- `ObjectFactory`: -6
+- `ObjectStore`: -8
+- `ConsumerInterface`: -9
+
+[Full results of the vote](https://github.com/container-interop/container-interop/wiki/%231-interface-name:-Vote)
+
+The complete discussion can be read in [the issue #1](https://github.com/container-interop/container-interop/issues/1).
+
+## Interface methods
+
+The choice of which methods the interface would contain was made after a statistical analysis of existing containers.
+The results of this analysis are available [in this document](https://gist.github.com/mnapoli/6159681).
+
+The summary of the analysis showed that:
+
+- all containers offer a method to get an entry by its id
+- a large majority name such method `get()`
+- for all containers, the `get()` method has 1 mandatory parameter of type string
+- some containers have an optional additional argument for `get()`, but it doesn't have the same purpose between containers
+- a large majority of the containers offer a method to test if it can return an entry by its id
+- a majority name such method `has()`
+- for all containers offering `has()`, the method has exactly 1 parameter of type string
+- a large majority of the containers throw an exception rather than returning null when an entry is not found in `get()`
+- a large majority of the containers don't implement `ArrayAccess`
+
+The question of whether to include methods to define entries has been discussed in
+[issue #1](https://github.com/container-interop/container-interop/issues/1).
+It has been judged that such methods do not belong in the interface described here because it is out of its scope
+(see the "Goal" section).
+
+As a result, the `ContainerInterface` contains two methods:
+
+- `get()`, returning anything, with one mandatory string parameter. Should throw an exception if the entry is not found.
+- `has()`, returning a boolean, with one mandatory string parameter.
+
+### Number of parameters in `get()` method
+
+While `ContainerInterface` only defines one mandatory parameter in `get()`, it is not incompatible with
+existing containers that have additional optional parameters. PHP allows an implementation to offer more parameters
+as long as they are optional, because the implementation *does* satisfy the interface.
+
+This issue has been discussed in [issue #6](https://github.com/container-interop/container-interop/issues/6).
+
+### Type of the `$id` parameter
+
+The type of the `$id` parameter in `get()` and `has()` has been discussed in
+[issue #6](https://github.com/container-interop/container-interop/issues/6).
+While `string` is used in all the containers that were analyzed, it was suggested that allowing
+anything (such as objects) could allow containers to offer a more advanced query API.
+
+An example given was to use the container as an object builder. The `$id` parameter would then be an
+object that would describe how to create an instance.
+
+The conclusion of the discussion was that this was beyond the scope of getting entries from a container without
+knowing how the container provided them, and it was more fit for a factory.
+
+## Contributors
+
+Are listed here all people that contributed in the discussions or votes, by alphabetical order:
+
+- [Amy Stephen](https://github.com/AmyStephen)
+- [David Négrier](https://github.com/moufmouf)
+- [Don Gilbert](https://github.com/dongilbert)
+- [Jason Judge](https://github.com/judgej)
+- [Jeremy Lindblom](https://github.com/jeremeamia)
+- [Marco Pivetta](https://github.com/Ocramius)
+- [Matthieu Napoli](https://github.com/mnapoli)
+- [Paul M. Jones](https://github.com/pmjones)
+- [Stephan Hochdörfer](https://github.com/shochdoerfer)
+- [Taylor Otwell](https://github.com/taylorotwell)
+
+## Relevant links
+
+- [`ContainerInterface.php`](https://github.com/container-interop/container-interop/blob/master/src/Interop/Container/ContainerInterface.php)
+- [List of all issues](https://github.com/container-interop/container-interop/issues?labels=ContainerInterface&milestone=&page=1&state=closed)
+- [Vote for the interface name](https://github.com/container-interop/container-interop/wiki/%231-interface-name:-Vote)
diff --git a/advancedcontentfilter/vendor/container-interop/container-interop/docs/ContainerInterface.md b/advancedcontentfilter/vendor/container-interop/container-interop/docs/ContainerInterface.md
new file mode 100644 (file)
index 0000000..bda973d
--- /dev/null
@@ -0,0 +1,158 @@
+Container interface
+===================
+
+This document describes a common interface for dependency injection containers.
+
+The goal set by `ContainerInterface` is to standardize how frameworks and libraries make use of a
+container to obtain objects and parameters (called *entries* in the rest of this document).
+
+The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD",
+"SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be
+interpreted as described in [RFC 2119][].
+
+The word `implementor` in this document is to be interpreted as someone
+implementing the `ContainerInterface` in a dependency injection-related library or framework.
+Users of dependency injections containers (DIC) are referred to as `user`.
+
+[RFC 2119]: http://tools.ietf.org/html/rfc2119
+
+1. Specification
+-----------------
+
+### 1.1 Basics
+
+- The `Interop\Container\ContainerInterface` exposes two methods : `get` and `has`.
+
+- `get` takes one mandatory parameter: an entry identifier. It MUST be a string.
+  A call to `get` can return anything (a *mixed* value), or throws an exception if the identifier
+  is not known to the container. Two successive calls to `get` with the same
+  identifier SHOULD return the same value. However, depending on the `implementor`
+  design and/or `user` configuration, different values might be returned, so
+  `user` SHOULD NOT rely on getting the same value on 2 successive calls.
+  While `ContainerInterface` only defines one mandatory parameter in `get()`, implementations
+  MAY accept additional optional parameters.
+
+- `has` takes one unique parameter: an entry identifier. It MUST return `true`
+  if an entry identifier is known to the container and `false` if it is not.
+  `has($id)` returning true does not mean that `get($id)` will not throw an exception.
+  It does however mean that `get($id)` will not throw a `NotFoundException`.
+
+### 1.2 Exceptions
+
+Exceptions directly thrown by the container MUST implement the
+[`Interop\Container\Exception\ContainerException`](../src/Interop/Container/Exception/ContainerException.php).
+
+A call to the `get` method with a non-existing id SHOULD throw a
+[`Interop\Container\Exception\NotFoundException`](../src/Interop/Container/Exception/NotFoundException.php).
+
+### 1.3 Additional features
+
+This section describes additional features that MAY be added to a container. Containers are not
+required to implement these features to respect the ContainerInterface.
+
+#### 1.3.1 Delegate lookup feature
+
+The goal of the *delegate lookup* feature is to allow several containers to share entries.
+Containers implementing this feature can perform dependency lookups in other containers.
+
+Containers implementing this feature will offer a greater lever of interoperability
+with other containers. Implementation of this feature is therefore RECOMMENDED.
+
+A container implementing this feature:
+
+- MUST implement the `ContainerInterface`
+- MUST provide a way to register a delegate container (using a constructor parameter, or a setter,
+  or any possible way). The delegate container MUST implement the `ContainerInterface`.
+
+When a container is configured to use a delegate container for dependencies:
+
+- Calls to the `get` method should only return an entry if the entry is part of the container.
+  If the entry is not part of the container, an exception should be thrown
+  (as requested by the `ContainerInterface`).
+- Calls to the `has` method should only return `true` if the entry is part of the container.
+  If the entry is not part of the container, `false` should be returned.
+- If the fetched entry has dependencies, **instead** of performing
+  the dependency lookup in the container, the lookup is performed on the *delegate container*.
+
+Important! By default, the lookup SHOULD be performed on the delegate container **only**, not on the container itself.
+
+It is however allowed for containers to provide exception cases for special entries, and a way to lookup
+into the same container (or another container) instead of the delegate container.
+
+2. Package
+----------
+
+The interfaces and classes described as well as relevant exception are provided as part of the
+[container-interop/container-interop](https://packagist.org/packages/container-interop/container-interop) package.
+
+3. `Interop\Container\ContainerInterface`
+-----------------------------------------
+
+```php
+<?php
+namespace Interop\Container;
+
+use Interop\Container\Exception\ContainerException;
+use Interop\Container\Exception\NotFoundException;
+
+/**
+ * Describes the interface of a container that exposes methods to read its entries.
+ */
+interface ContainerInterface
+{
+    /**
+     * Finds an entry of the container by its identifier and returns it.
+     *
+     * @param string $id Identifier of the entry to look for.
+     *
+     * @throws NotFoundException  No entry was found for this identifier.
+     * @throws ContainerException Error while retrieving the entry.
+     *
+     * @return mixed Entry.
+     */
+    public function get($id);
+
+    /**
+     * Returns true if the container can return an entry for the given identifier.
+     * Returns false otherwise.
+     *
+     * `has($id)` returning true does not mean that `get($id)` will not throw an exception.
+     * It does however mean that `get($id)` will not throw a `NotFoundException`.
+     *
+     * @param string $id Identifier of the entry to look for.
+     *
+     * @return boolean
+     */
+    public function has($id);
+}
+```
+
+4. `Interop\Container\Exception\ContainerException`
+---------------------------------------------------
+
+```php
+<?php
+namespace Interop\Container\Exception;
+
+/**
+ * Base interface representing a generic exception in a container.
+ */
+interface ContainerException
+{
+}
+```
+
+5. `Interop\Container\Exception\NotFoundException`
+---------------------------------------------------
+
+```php
+<?php
+namespace Interop\Container\Exception;
+
+/**
+ * No entry was found in the container.
+ */
+interface NotFoundException extends ContainerException
+{
+}
+```
diff --git a/advancedcontentfilter/vendor/container-interop/container-interop/docs/Delegate-lookup-meta.md b/advancedcontentfilter/vendor/container-interop/container-interop/docs/Delegate-lookup-meta.md
new file mode 100644 (file)
index 0000000..6048b73
--- /dev/null
@@ -0,0 +1,259 @@
+Delegate lookup feature Meta Document
+=====================================
+
+1. Summary
+----------
+
+This document describes the *delegate lookup feature*.
+Containers are not required to implement this feature to respect the `ContainerInterface`.
+However, containers implementing this feature will offer a greater lever of interoperability
+with other containers, allowing multiple containers to share entries in the same application.
+Implementation of this feature is therefore recommanded.
+
+2. Why Bother?
+--------------
+
+The [`ContainerInterface`](../src/Interop/Container/ContainerInterface.php) ([meta doc](ContainerInterface.md))
+standardizes how frameworks and libraries make use of a container to obtain objects and parameters.
+
+By standardizing such a behavior, frameworks and libraries relying on the `ContainerInterface`
+could work with any compatible container.
+That would allow end users to choose their own container based on their own preferences.
+
+The `ContainerInterface` is also enough if we want to have several containers side-by-side in the same
+application. For instance, this is what the [CompositeContainer](https://github.com/jeremeamia/acclimate-container/blob/master/src/CompositeContainer.php) 
+class of [Acclimate](https://github.com/jeremeamia/acclimate-container) is designed for:
+
+![Side by side containers](images/side_by_side_containers.png)
+
+However, an instance in container 1 cannot reference an instance in container 2.
+
+It would be better if an instance of container 1 could reference an instance in container 2,
+and the opposite should be true. 
+
+![Interoperating containers](images/interoperating_containers.png)
+
+In the sample above, entry 1 in container 1 is referencing entry 3 in container 2.
+
+3. Scope
+--------
+
+### 3.1 Goals
+
+The goal of the *delegate lookup* feature is to allow several containers to share entries.
+
+4. Approaches
+-------------
+
+### 4.1 Chosen Approach
+
+Containers implementing this feature can perform dependency lookups in other containers.
+
+A container implementing this feature:
+
+- must implement the `ContainerInterface`
+- must provide a way to register a *delegate container* (using a constructor parameter, or a setter, or any
+possible way). The *delegate container* must implement the `ContainerInterface`.
+
+When a *delegate container* is configured on a container:
+
+- Calls to the `get` method should only return an entry if the entry is part of the container.
+If the entry is not part of the container, an exception should be thrown (as required in the `ContainerInterface`).
+- Calls to the `has` method should only return *true* if the entry is part of the container.
+If the entry is not part of the container, *false* should be returned.
+ - Finally, the important part: if the entry we are fetching has dependencies,
+**instead** of perfoming the dependency lookup in the container, the lookup is performed on the *delegate container*.
+
+Important! By default, the lookup should be performed on the delegate container **only**, not on the container itself.
+
+It is however allowed for containers to provide exception cases for special entries, and a way to lookup into 
+the same container (or another container) instead of the delegate container.
+
+### 4.2 Typical usage
+
+The *delegate container* will usually be a composite container. A composite container is a container that
+contains several other containers. When performing a lookup on a composite container, the inner containers are 
+queried until one container returns an entry.
+An inner container implementing the *delegate lookup feature* will return entries it contains, but if these
+entries have dependencies, the dependencies lookup calls will be performed on the composite container, giving
+a chance to all containers to answer.
+
+Interestingly enough, the order in which containers are added in the composite container matters. Indeed,
+the first containers to be added in the composite container can "override" the entries of containers with
+lower priority.
+
+![Containers priority](images/priority.png)
+
+In the example above, "container 2" contains a controller "myController" and the controller is referencing an 
+"entityManager" entry. "Container 1" contains also an entry named "entityManager".
+Without the *delegate lookup* feature, when requesting the "myController" instance to container 2, it would take 
+in charge the instanciation of both entries.
+
+However, using the *delegate lookup* feature, here is what happens when we ask the composite container for the 
+"myController" instance:
+
+- The composite container asks container 1 if if contains the "myController" instance. The answer is no.
+- The composite container asks container 2 if if contains the "myController" instance. The answer is yes.
+- The composite container performs a `get` call on container 2 for the "myController" instance.
+- Container 2 sees that "myController" has a dependency on "entityManager".
+- Container 2 delegates the lookup of "entityManager" to the composite container.
+- The composite container asks container 1 if if contains the "entityManager" instance. The answer is yes.
+- The composite container performs a `get` call on container 1 for the "entityManager" instance.
+
+In the end, we get a controller instanciated by container 2 that references an entityManager instanciated
+by container 1.
+
+### 4.3 Alternative: the fallback strategy
+
+The first proposed approach we tried was to perform all the lookups in the "local" container,
+and if a lookup fails in the container, to use the delegate container. In this scenario, the
+delegate container is used in "fallback" mode.
+
+This strategy has been described in @moufmouf blog post: http://mouf-php.com/container-interop-whats-next (solution 1).
+It was also discussed [here](https://github.com/container-interop/container-interop/pull/8#issuecomment-33570697) and
+[here](https://github.com/container-interop/container-interop/pull/20#issuecomment-56599631).
+
+Problems with this strategy:
+
+- Heavy problem regarding infinite loops
+- Unable to overload a container entry with the delegate container entry
+
+### 4.4 Alternative: force implementing an interface
+
+The first proposed approach was to develop a `ParentAwareContainerInterface` interface.
+It was proposed here: https://github.com/container-interop/container-interop/pull/8
+
+The interface would have had the behaviour of the delegate lookup feature but would have forced the addition of
+a `setParentContainter` method:
+
+```php
+interface ParentAwareContainerInterface extends ReadableContainerInterface {
+    /**
+     * Sets the parent container associated to that container. This container will call
+     * the parent container to fetch dependencies.
+     *
+     * @param ContainerInterface $container
+     */
+    public function setParentContainer(ContainerInterface $container);
+}
+```
+
+The interface idea was first questioned by @Ocramius [here](https://github.com/container-interop/container-interop/pull/8#issuecomment-51721777).
+@Ocramius expressed the idea that an interface should not contain setters, otherwise, it is forcing implementation
+details on the class implementing the interface. 
+Then @mnapoli made a proposal for a "convention" [here](https://github.com/container-interop/container-interop/pull/8#issuecomment-51841079),
+this idea was further discussed until all participants in the discussion agreed to remove the interface idea
+and replace it with a "standard" feature.
+
+**Pros:**
+
+If we had had an interface, we could have delegated the registration of the delegate/composite container to the
+the delegate/composite container itself.
+For instance:
+
+```php
+$containerA = new ContainerA();
+$containerB = new ContainerB();
+
+$compositeContainer = new CompositeContainer([$containerA, $containerB]);
+
+// The call to 'setParentContainer' is delegated to the CompositeContainer
+// It is not the responsibility of the user anymore.
+class CompositeContainer {
+       ...
+       
+       public function __construct($containers) {
+               foreach ($containers as $container) {
+                       if ($container instanceof ParentAwareContainerInterface) {
+                               $container->setParentContainer($this);
+                       }
+               }
+               ...
+       }
+}
+
+``` 
+
+**Cons:**
+
+Cons have been extensively discussed [here](https://github.com/container-interop/container-interop/pull/8#issuecomment-51721777).
+Basically, forcing a setter into an interface is a bad idea. Setters are similar to constructor arguments,
+and it's a bad idea to standardize a constructor: how the delegate container is configured into a container is an implementation detail. This outweights the benefits of the interface.
+
+### 4.4 Alternative: no exception case for delegate lookups
+
+Originally, the proposed wording for delegate lookup calls was:
+
+> Important! The lookup MUST be performed on the delegate container **only**, not on the container itself.
+
+This was later replaced by:
+
+> Important! By default, the lookup SHOULD be performed on the delegate container **only**, not on the container itself.
+>
+> It is however allowed for containers to provide exception cases for special entries, and a way to lookup 
+> into the same container (or another container) instead of the delegate container.
+
+Exception cases have been allowed to avoid breaking dependencies with some services that must be provided
+by the container (on @njasm proposal). This was proposed here: https://github.com/container-interop/container-interop/pull/20#issuecomment-56597235
+
+### 4.5 Alternative: having one of the containers act as the composite container
+
+In real-life scenarios, we usually have a big framework (Symfony 2, Zend Framework 2, etc...) and we want to
+add another DI container to this container. Most of the time, the "big" framework will be responsible for
+creating the controller's instances, using it's own DI container. Until *container-interop* is fully adopted,
+the "big" framework will not be aware of the existence of a composite container that it should use instead
+of its own container.
+
+For this real-life use cases, @mnapoli and @moufmouf proposed to extend the "big" framework's DI container
+to make it act as a composite container.
+
+This has been discussed [here](https://github.com/container-interop/container-interop/pull/8#issuecomment-40367194) 
+and [here](http://mouf-php.com/container-interop-whats-next#solution4).
+
+This was implemented in Symfony 2 using:
+
+- [interop.symfony.di](https://github.com/thecodingmachine/interop.symfony.di/tree/v0.1.0)
+- [framework interop](https://github.com/mnapoli/framework-interop/)
+
+This was implemented in Silex using:
+
+- [interop.silex.di](https://github.com/thecodingmachine/interop.silex.di)
+
+Having a container act as the composite container is not part of the delegate lookup standard because it is
+simply a temporary design pattern used to make existing frameworks that do not support yet ContainerInterop
+play nice with other DI containers.
+
+
+5. Implementations
+------------------
+
+The following projects already implement the delegate lookup feature:
+
+- [Mouf](http://mouf-php.com), through the [`setDelegateLookupContainer` method](https://github.com/thecodingmachine/mouf/blob/2.0/src/Mouf/MoufManager.php#L2120)
+- [PHP-DI](http://php-di.org/), through the [`$wrapperContainer` parameter of the constructor](https://github.com/mnapoli/PHP-DI/blob/master/src/DI/Container.php#L72)
+- [pimple-interop](https://github.com/moufmouf/pimple-interop), through the [`$container` parameter of the constructor](https://github.com/moufmouf/pimple-interop/blob/master/src/Interop/Container/Pimple/PimpleInterop.php#L62)
+
+6. People
+---------
+
+Are listed here all people that contributed in the discussions, by alphabetical order:
+
+- [Alexandru Pătrănescu](https://github.com/drealecs)
+- [Ben Peachey](https://github.com/potherca)
+- [David Négrier](https://github.com/moufmouf)
+- [Jeremy Lindblom](https://github.com/jeremeamia)
+- [Marco Pivetta](https://github.com/Ocramius)
+- [Matthieu Napoli](https://github.com/mnapoli)
+- [Nelson J Morais](https://github.com/njasm)
+- [Phil Sturgeon](https://github.com/philsturgeon)
+- [Stephan Hochdörfer](https://github.com/shochdoerfer)
+
+7. Relevant Links
+-----------------
+
+_**Note:** Order descending chronologically._
+
+- [Pull request on the delegate lookup feature](https://github.com/container-interop/container-interop/pull/20)
+- [Pull request on the interface idea](https://github.com/container-interop/container-interop/pull/8)
+- [Original article exposing the delegate lookup idea along many others](http://mouf-php.com/container-interop-whats-next)
+
diff --git a/advancedcontentfilter/vendor/container-interop/container-interop/docs/Delegate-lookup.md b/advancedcontentfilter/vendor/container-interop/container-interop/docs/Delegate-lookup.md
new file mode 100644 (file)
index 0000000..f64a8f7
--- /dev/null
@@ -0,0 +1,60 @@
+Delegate lookup feature
+=======================
+
+This document describes a standard for dependency injection containers.
+
+The goal set by the *delegate lookup* feature is to allow several containers to share entries.
+Containers implementing this feature can perform dependency lookups in other containers.
+
+Containers implementing this feature will offer a greater lever of interoperability
+with other containers. Implementation of this feature is therefore RECOMMENDED.
+
+The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD",
+"SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be
+interpreted as described in [RFC 2119][].
+
+The word `implementor` in this document is to be interpreted as someone
+implementing the delegate lookup feature in a dependency injection-related library or framework.
+Users of dependency injections containers (DIC) are referred to as `user`.
+
+[RFC 2119]: http://tools.ietf.org/html/rfc2119
+
+1. Vocabulary
+-------------
+
+In a dependency injection container, the container is used to fetch entries.
+Entries can have dependencies on other entries. Usually, these other entries are fetched by the container.
+
+The *delegate lookup* feature is the ability for a container to fetch dependencies in
+another container. In the rest of the document, the word "container" will reference the container
+implemented by the implementor. The word "delegate container" will reference the container we are
+fetching the dependencies from.
+
+2. Specification
+----------------
+
+A container implementing the *delegate lookup* feature:
+
+- MUST implement the [`ContainerInterface`](ContainerInterface.md)
+- MUST provide a way to register a delegate container (using a constructor parameter, or a setter,
+  or any possible way). The delegate container MUST implement the [`ContainerInterface`](ContainerInterface.md).
+
+When a container is configured to use a delegate container for dependencies:
+
+- Calls to the `get` method should only return an entry if the entry is part of the container.
+  If the entry is not part of the container, an exception should be thrown
+  (as requested by the [`ContainerInterface`](ContainerInterface.md)).
+- Calls to the `has` method should only return `true` if the entry is part of the container.
+  If the entry is not part of the container, `false` should be returned.
+- If the fetched entry has dependencies, **instead** of performing
+  the dependency lookup in the container, the lookup is performed on the *delegate container*.
+
+Important: By default, the dependency lookups SHOULD be performed on the delegate container **only**, not on the container itself.
+
+It is however allowed for containers to provide exception cases for special entries, and a way to lookup
+into the same container (or another container) instead of the delegate container.
+
+3. Package / Interface
+----------------------
+
+This feature is not tied to any code, interface or package.
diff --git a/advancedcontentfilter/vendor/container-interop/container-interop/docs/images/interoperating_containers.png b/advancedcontentfilter/vendor/container-interop/container-interop/docs/images/interoperating_containers.png
new file mode 100644 (file)
index 0000000..1d3fdd0
Binary files /dev/null and b/advancedcontentfilter/vendor/container-interop/container-interop/docs/images/interoperating_containers.png differ
diff --git a/advancedcontentfilter/vendor/container-interop/container-interop/docs/images/priority.png b/advancedcontentfilter/vendor/container-interop/container-interop/docs/images/priority.png
new file mode 100644 (file)
index 0000000..d02cb7d
Binary files /dev/null and b/advancedcontentfilter/vendor/container-interop/container-interop/docs/images/priority.png differ
diff --git a/advancedcontentfilter/vendor/container-interop/container-interop/docs/images/side_by_side_containers.png b/advancedcontentfilter/vendor/container-interop/container-interop/docs/images/side_by_side_containers.png
new file mode 100644 (file)
index 0000000..87884bc
Binary files /dev/null and b/advancedcontentfilter/vendor/container-interop/container-interop/docs/images/side_by_side_containers.png differ
diff --git a/advancedcontentfilter/vendor/container-interop/container-interop/src/Interop/Container/ContainerInterface.php b/advancedcontentfilter/vendor/container-interop/container-interop/src/Interop/Container/ContainerInterface.php
new file mode 100644 (file)
index 0000000..a75468f
--- /dev/null
@@ -0,0 +1,15 @@
+<?php
+/**
+ * @license http://www.opensource.org/licenses/mit-license.php MIT (see the LICENSE file)
+ */
+
+namespace Interop\Container;
+
+use Psr\Container\ContainerInterface as PsrContainerInterface;
+
+/**
+ * Describes the interface of a container that exposes methods to read its entries.
+ */
+interface ContainerInterface extends PsrContainerInterface
+{
+}
diff --git a/advancedcontentfilter/vendor/container-interop/container-interop/src/Interop/Container/Exception/ContainerException.php b/advancedcontentfilter/vendor/container-interop/container-interop/src/Interop/Container/Exception/ContainerException.php
new file mode 100644 (file)
index 0000000..3964061
--- /dev/null
@@ -0,0 +1,15 @@
+<?php
+/**
+ * @license http://www.opensource.org/licenses/mit-license.php MIT (see the LICENSE file)
+ */
+
+namespace Interop\Container\Exception;
+
+use Psr\Container\ContainerExceptionInterface as PsrContainerException;
+
+/**
+ * Base interface representing a generic exception in a container.
+ */
+interface ContainerException extends PsrContainerException
+{
+}
diff --git a/advancedcontentfilter/vendor/container-interop/container-interop/src/Interop/Container/Exception/NotFoundException.php b/advancedcontentfilter/vendor/container-interop/container-interop/src/Interop/Container/Exception/NotFoundException.php
new file mode 100644 (file)
index 0000000..031b3ab
--- /dev/null
@@ -0,0 +1,15 @@
+<?php
+/**
+ * @license http://www.opensource.org/licenses/mit-license.php MIT (see the LICENSE file)
+ */
+
+namespace Interop\Container\Exception;
+
+use Psr\Container\NotFoundExceptionInterface as PsrNotFoundException;
+
+/**
+ * No entry was found in the container.
+ */
+interface NotFoundException extends ContainerException, PsrNotFoundException
+{
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/.gitignore b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/.gitignore
new file mode 100644 (file)
index 0000000..9ca13d6
--- /dev/null
@@ -0,0 +1,3 @@
+vendor/
+phpunit.xml
+.php_cs.cache
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/.php_cs.dist b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/.php_cs.dist
new file mode 100644 (file)
index 0000000..96a6aa8
--- /dev/null
@@ -0,0 +1,14 @@
+<?php
+
+return PhpCsFixer\Config::create()
+    ->setRules(array(
+        '@Symfony' => true,
+        '@Symfony:risky' => true,
+        'array_syntax' => array('syntax' => 'long'),
+    ))
+    ->setRiskyAllowed(true)
+    ->setFinder(
+        PhpCsFixer\Finder::create()
+            ->in(__DIR__)
+    )
+;
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/.scrutinizer.yml b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/.scrutinizer.yml
new file mode 100644 (file)
index 0000000..861e120
--- /dev/null
@@ -0,0 +1,13 @@
+tools:
+    external_code_coverage: false
+    php_code_sniffer: true
+    php_sim: true
+    php_changetracking: true
+    php_cs_fixer: true
+    php_mess_detector: true
+    php_pdepend: true
+    php_analyzer: true
+    sensiolabs_security_checker: true
+filter:
+    excluded_paths:
+        - Tests/*
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/.travis.yml b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/.travis.yml
new file mode 100644 (file)
index 0000000..d185e71
--- /dev/null
@@ -0,0 +1,43 @@
+language: php
+
+sudo: false
+
+cache:
+  directories:
+    - $HOME/.composer/cache/files
+
+matrix:
+    include:
+        - php: 5.5
+          env: COMPOSER_VERSION=""
+        - php: 5.6
+          env: COMPOSER_VERSION=""
+        - php: 7.0
+          env: COMPOSER_VERSION=""
+        - php: 7.1
+          env: COMPOSER_VERSION=""
+        - php: nightly
+          env: COMPOSER_VERSION=""
+
+    allow_failures:
+        - php: nightly
+
+    fast_finish: true
+
+before_script:
+    - composer self-update
+    - composer global require --prefer-source phpunit/phpunit:"^4.8 || ^5.7.0" satooshi/php-coveralls:^1.0.0
+    - if [ "$COMPOSER_VERSION" == "" ]; then composer install --prefer-source; fi;
+    - if [ "$COMPOSER_VERSION" != "" ]; then composer require "composer/composer:${COMPOSER_VERSION}" --no-update; fi;
+    - if [ "$COMPOSER_VERSION" != "" ]; then composer update "composer/composer" --prefer-source; fi;
+    - mkdir -p ./build/logs
+
+script:
+    - ~/.composer/vendor/bin/phpunit -v --coverage-clover ./build/logs/clover.xml
+
+after_script:
+    - 'echo ''coverage_clover: build/logs/clover.xml'' >> ./.coveralls.yml'
+    - sh -c 'if [ "$TRAVIS_PHP_VERSION" != "nightly" ]; then php ~/.composer/vendor/bin/coveralls -v; fi;'
+
+notifications:
+    email: false
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Assets.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Assets.php
new file mode 100644 (file)
index 0000000..8b47860
--- /dev/null
@@ -0,0 +1,145 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin;
+
+use Fxp\Composer\AssetPlugin\Exception\InvalidArgumentException;
+use Fxp\Composer\AssetPlugin\Type\AssetTypeInterface;
+
+/**
+ * Assets definition.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class Assets
+{
+    /**
+     * @var array
+     */
+    protected static $typeClasses = array(
+        'npm' => 'Fxp\Composer\AssetPlugin\Type\NpmAssetType',
+        'bower' => 'Fxp\Composer\AssetPlugin\Type\BowerAssetType',
+    );
+
+    /**
+     * @var array
+     */
+    protected static $registryFactoryClasses = array(
+        'default' => 'Fxp\Composer\AssetPlugin\Repository\DefaultRegistryFactory',
+        'bower-private' => 'Fxp\Composer\AssetPlugin\Repository\BowerPrivateRegistryFactory',
+    );
+
+    /**
+     * @var array
+     */
+    protected static $defaultRegistryClasses = array(
+        'npm' => 'Fxp\Composer\AssetPlugin\Repository\NpmRepository',
+        'bower' => 'Fxp\Composer\AssetPlugin\Repository\BowerRepository',
+    );
+
+    /**
+     * @var array
+     */
+    protected static $vcsRepositoryDrivers = array(
+        'vcs' => 'Fxp\Composer\AssetPlugin\Repository\AssetVcsRepository',
+        'github' => 'Fxp\Composer\AssetPlugin\Repository\AssetVcsRepository',
+        'git-bitbucket' => 'Fxp\Composer\AssetPlugin\Repository\AssetVcsRepository',
+        'git' => 'Fxp\Composer\AssetPlugin\Repository\AssetVcsRepository',
+        'hg-bitbucket' => 'Fxp\Composer\AssetPlugin\Repository\AssetVcsRepository',
+        'hg' => 'Fxp\Composer\AssetPlugin\Repository\AssetVcsRepository',
+        'perforce' => 'Fxp\Composer\AssetPlugin\Repository\AssetVcsRepository',
+        'svn' => 'Fxp\Composer\AssetPlugin\Repository\AssetVcsRepository',
+    );
+
+    /**
+     * @var array
+     */
+    protected static $vcsDrivers = array(
+        'github' => 'Fxp\Composer\AssetPlugin\Repository\Vcs\GitHubDriver',
+        'git-bitbucket' => 'Fxp\Composer\AssetPlugin\Repository\Vcs\GitBitbucketDriver',
+        'git' => 'Fxp\Composer\AssetPlugin\Repository\Vcs\GitDriver',
+        'hg-bitbucket' => 'Fxp\Composer\AssetPlugin\Repository\Vcs\HgBitbucketDriver',
+        'hg' => 'Fxp\Composer\AssetPlugin\Repository\Vcs\HgDriver',
+        'perforce' => 'Fxp\Composer\AssetPlugin\Repository\Vcs\PerforceDriver',
+        // svn must be last because identifying a subversion server for sure is practically impossible
+        'svn' => 'Fxp\Composer\AssetPlugin\Repository\Vcs\SvnDriver',
+    );
+
+    /**
+     * Creates asset type.
+     *
+     * @param string $type
+     *
+     * @return AssetTypeInterface
+     *
+     * @throws InvalidArgumentException When the asset type does not exist
+     */
+    public static function createType($type)
+    {
+        if (!isset(static::$typeClasses[$type])) {
+            throw new InvalidArgumentException('The asset type "'.$type.'" does not exist, only "'.implode('", "', static::getTypes()).'" are accepted');
+        }
+
+        $class = static::$typeClasses[$type];
+
+        return new $class();
+    }
+
+    /**
+     * Gets the asset types.
+     *
+     * @return array
+     */
+    public static function getTypes()
+    {
+        return array_keys(static::$typeClasses);
+    }
+
+    /**
+     * Gets the asset registry repository factories.
+     *
+     * @return array
+     */
+    public static function getRegistryFactories()
+    {
+        return static::$registryFactoryClasses;
+    }
+
+    /**
+     * Gets the asset registry repositories.
+     *
+     * @return array
+     */
+    public static function getDefaultRegistries()
+    {
+        return static::$defaultRegistryClasses;
+    }
+
+    /**
+     * Gets the asset vcs repository drivers.
+     *
+     * @return array
+     */
+    public static function getVcsRepositoryDrivers()
+    {
+        return static::$vcsRepositoryDrivers;
+    }
+
+    /**
+     * Gets the asset vcs drivers.
+     *
+     * @return array
+     */
+    public static function getVcsDrivers()
+    {
+        return static::$vcsDrivers;
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Composer/ScriptHandler.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Composer/ScriptHandler.php
new file mode 100644 (file)
index 0000000..1a2ca95
--- /dev/null
@@ -0,0 +1,133 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Composer;
+
+use Composer\DependencyResolver\Operation\InstallOperation;
+use Composer\DependencyResolver\Operation\OperationInterface;
+use Composer\DependencyResolver\Operation\UpdateOperation;
+use Composer\Installer\PackageEvent;
+use Composer\Package\PackageInterface;
+use Fxp\Composer\AssetPlugin\Assets;
+use Fxp\Composer\AssetPlugin\Config\Config;
+use Fxp\Composer\AssetPlugin\FxpAssetPlugin;
+use Fxp\Composer\AssetPlugin\Installer\IgnoreFactory;
+
+/**
+ * Composer script handler.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class ScriptHandler
+{
+    /**
+     * Remove ignored files of the installed package defined in the root
+     * package config section.
+     *
+     * @param PackageEvent $event
+     */
+    public static function deleteIgnoredFiles(PackageEvent $event)
+    {
+        if (null === $package = static::getLibraryPackage($event->getOperation())) {
+            return;
+        }
+
+        $section = static::getIgnoreConfigSection();
+        $manager = IgnoreFactory::create(static::getConfig($event), $event->getComposer(), $package, null, $section);
+        $manager->cleanup();
+    }
+
+    /**
+     * Get the plugin config.
+     *
+     * @param PackageEvent $event
+     *
+     * @return Config
+     */
+    public static function getConfig(PackageEvent $event)
+    {
+        foreach ($event->getComposer()->getPluginManager()->getPlugins() as $plugin) {
+            if ($plugin instanceof FxpAssetPlugin) {
+                return $plugin->getConfig();
+            }
+        }
+
+        throw new \RuntimeException('The fxp composer asset plugin is not found');
+    }
+
+    /**
+     * Get the root config section of igore file patterns for each package.
+     *
+     * @return string The config section name
+     */
+    protected static function getIgnoreConfigSection()
+    {
+        return 'ignore-files';
+    }
+
+    /**
+     * Get the library package (not asset package).
+     *
+     * @param OperationInterface $operation The operation
+     *
+     * @return PackageInterface|null Return NULL if the package is an asset
+     */
+    protected static function getLibraryPackage(OperationInterface $operation)
+    {
+        $package = static::getOperationPackage($operation);
+        $data = null;
+
+        if ($package && !static::isAsset($package)) {
+            $data = $package;
+        }
+
+        return $data;
+    }
+
+    /**
+     * Get the package defined in the composer operation.
+     *
+     * @param OperationInterface $operation The operation
+     *
+     * @return PackageInterface|null Return NULL if the operation is not INSTALL or UPDATE
+     */
+    protected static function getOperationPackage(OperationInterface $operation)
+    {
+        $data = null;
+        if ($operation instanceof UpdateOperation) {
+            $data = $operation->getTargetPackage();
+        } elseif ($operation instanceof InstallOperation) {
+            $data = $operation->getPackage();
+        }
+
+        return $data;
+    }
+
+    /**
+     * Check if the package is a asset package.
+     *
+     * @param PackageInterface $package The package instance
+     *
+     * @return bool
+     */
+    protected static function isAsset(PackageInterface $package)
+    {
+        foreach (Assets::getTypes() as $type) {
+            $type = Assets::createType($type);
+
+            if ($package->getType() === $type->getComposerType()) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Config/Config.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Config/Config.php
new file mode 100644 (file)
index 0000000..2d89e3f
--- /dev/null
@@ -0,0 +1,197 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Config;
+
+use Fxp\Composer\AssetPlugin\Exception\InvalidArgumentException;
+
+/**
+ * Helper of package config.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+final class Config
+{
+    /**
+     * @var array
+     */
+    private $config;
+
+    /**
+     * @var array
+     */
+    private $cacheEnv = array();
+
+    /**
+     * Constructor.
+     *
+     * @param array $config The config
+     */
+    public function __construct(array $config)
+    {
+        $this->config = $config;
+    }
+
+    /**
+     * Get the array config value.
+     *
+     * @param string $key     The config key
+     * @param array  $default The default value
+     *
+     * @return array
+     */
+    public function getArray($key, array $default = array())
+    {
+        return $this->get($key, $default);
+    }
+
+    /**
+     * Get the config value.
+     *
+     * @param string     $key     The config key
+     * @param mixed|null $default The default value
+     *
+     * @return mixed|null
+     */
+    public function get($key, $default = null)
+    {
+        if (array_key_exists($key, $this->cacheEnv)) {
+            return $this->cacheEnv[$key];
+        } else {
+            $envKey = $this->convertEnvKey($key);
+            $envValue = getenv($envKey);
+
+            if (false !== $envValue) {
+                return $this->cacheEnv[$key] = $this->convertEnvValue($envValue, $envKey);
+            }
+        }
+
+        return array_key_exists($key, $this->config)
+            ? $this->config[$key]
+            : $default;
+    }
+
+    /**
+     * Convert the config key into environment variable.
+     *
+     * @param string $key The config key
+     *
+     * @return string
+     */
+    private function convertEnvKey($key)
+    {
+        return 'FXP_ASSET__'.strtoupper(str_replace('-', '_', $key));
+    }
+
+    /**
+     * Convert the value of environment variable into php variable.
+     *
+     * @param string $value               The value of environment variable
+     * @param string $environmentVariable The environment variable name
+     *
+     * @return string|bool|int|array
+     */
+    private function convertEnvValue($value, $environmentVariable)
+    {
+        $value = trim(trim(trim($value, '\''), '"'));
+
+        if ($this->isBoolean($value)) {
+            $value = $this->convertBoolean($value);
+        } elseif ($this->isInteger($value)) {
+            $value = $this->convertInteger($value);
+        } elseif ($this->isJson($value)) {
+            $value = $this->convertJson($value, $environmentVariable);
+        }
+
+        return $value;
+    }
+
+    /**
+     * Check if the value of environment variable is a boolean.
+     *
+     * @param string $value The value of environment variable
+     *
+     * @return bool
+     */
+    private function isBoolean($value)
+    {
+        $value = strtolower($value);
+
+        return in_array($value, array('true', 'false', '1', '0', 'yes', 'no', 'y', 'n'), true);
+    }
+
+    /**
+     * Convert the value of environment variable into a boolean.
+     *
+     * @param string $value The value of environment variable
+     *
+     * @return bool
+     */
+    private function convertBoolean($value)
+    {
+        return in_array($value, array('true', '1', 'yes', 'y'), true);
+    }
+
+    /**
+     * Check if the value of environment variable is a integer.
+     *
+     * @param string $value The value of environment variable
+     *
+     * @return bool
+     */
+    private function isInteger($value)
+    {
+        return ctype_digit(trim($value, '-'));
+    }
+
+    /**
+     * Convert the value of environment variable into a integer.
+     *
+     * @param string $value The value of environment variable
+     *
+     * @return bool
+     */
+    private function convertInteger($value)
+    {
+        return (int) $value;
+    }
+
+    /**
+     * Check if the value of environment variable is a string JSON.
+     *
+     * @param string $value The value of environment variable
+     *
+     * @return bool
+     */
+    private function isJson($value)
+    {
+        return 0 === strpos($value, '{') || 0 === strpos($value, '[');
+    }
+
+    /**
+     * Convert the value of environment variable into a json array.
+     *
+     * @param string $value               The value of environment variable
+     * @param string $environmentVariable The environment variable name
+     *
+     * @return array
+     */
+    private function convertJson($value, $environmentVariable)
+    {
+        $value = json_decode($value, true);
+
+        if (json_last_error()) {
+            throw new InvalidArgumentException(sprintf('The "%s" environment variable isn\'t a valid JSON', $environmentVariable));
+        }
+
+        return $value;
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Config/ConfigBuilder.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Config/ConfigBuilder.php
new file mode 100644 (file)
index 0000000..e6337f3
--- /dev/null
@@ -0,0 +1,162 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Config;
+
+use Composer\Composer;
+use Composer\IO\IOInterface;
+use Composer\Json\JsonFile;
+use Composer\Package\RootPackageInterface;
+
+/**
+ * Plugin Config builder.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+abstract class ConfigBuilder
+{
+    /**
+     * List of the deprecated options.
+     *
+     * @var array
+     */
+    private static $deprecatedOptions = array(
+        'installer-paths' => 'asset-installer-paths',
+        'ignore-files' => 'asset-ignore-files',
+        'private-bower-registries' => 'asset-private-bower-registries',
+        'pattern-skip-version' => 'asset-pattern-skip-version',
+        'optimize-with-installed-packages' => 'asset-optimize-with-installed-packages',
+        'optimize-with-conjunctive' => 'asset-optimize-with-conjunctive',
+        'repositories' => 'asset-repositories',
+        'registry-options' => 'asset-registry-options',
+        'vcs-driver-options' => 'asset-vcs-driver-options',
+        'main-files' => 'asset-main-files',
+    );
+
+    /**
+     * Validate the config of root package.
+     *
+     * @param IOInterface          $io          The composer input/output
+     * @param RootPackageInterface $package     The root package
+     * @param string               $commandName The command name
+     */
+    public static function validate(IOInterface $io, RootPackageInterface $package, $commandName = null)
+    {
+        if (null === $commandName || in_array($commandName, array('install', 'update', 'validate', 'require', 'remove'))) {
+            $extra = (array) $package->getExtra();
+
+            foreach (self::$deprecatedOptions as $new => $old) {
+                if (array_key_exists($old, $extra)) {
+                    $io->write(sprintf('<warning>The "extra.%s" option is deprecated, use the "config.fxp-asset.%s" option</warning>', $old, $new));
+                }
+            }
+        }
+    }
+
+    /**
+     * Build the config of plugin.
+     *
+     * @param Composer         $composer The composer
+     * @param IOInterface|null $io       The composer input/output
+     *
+     * @return Config
+     */
+    public static function build(Composer $composer, $io = null)
+    {
+        $config = self::getConfigBase($composer, $io);
+        $config = self::injectDeprecatedConfig($config, (array) $composer->getPackage()->getExtra());
+
+        return new Config($config);
+    }
+
+    /**
+     * Inject the deprecated keys in config if the config keys are not present.
+     *
+     * @param array $config The config
+     * @param array $extra  The root package extra section
+     *
+     * @return array
+     */
+    private static function injectDeprecatedConfig(array $config, array $extra)
+    {
+        foreach (self::$deprecatedOptions as $key => $deprecatedKey) {
+            if (array_key_exists($deprecatedKey, $extra) && !array_key_exists($key, $config)) {
+                $config[$key] = $extra[$deprecatedKey];
+            }
+        }
+
+        return $config;
+    }
+
+    /**
+     * Get the base of data.
+     *
+     * @param Composer         $composer The composer
+     * @param IOInterface|null $io       The composer input/output
+     *
+     * @return array
+     */
+    private static function getConfigBase(Composer $composer, $io = null)
+    {
+        $globalPackageConfig = self::getGlobalConfig($composer, 'composer', $io);
+        $globalConfig = self::getGlobalConfig($composer, 'config', $io);
+        $packageConfig = $composer->getPackage()->getConfig();
+        $packageConfig = isset($packageConfig['fxp-asset']) && is_array($packageConfig['fxp-asset'])
+            ? $packageConfig['fxp-asset']
+            : array();
+
+        return array_merge($globalPackageConfig, $globalConfig, $packageConfig);
+    }
+
+    /**
+     * Get the data of the global config.
+     *
+     * @param Composer         $composer The composer
+     * @param string           $filename The filename
+     * @param IOInterface|null $io       The composer input/output
+     *
+     * @return array
+     */
+    private static function getGlobalConfig(Composer $composer, $filename, $io = null)
+    {
+        $home = self::getComposerHome($composer);
+        $file = new JsonFile($home.'/'.$filename.'.json');
+        $config = array();
+
+        if ($file->exists()) {
+            $data = $file->read();
+
+            if (isset($data['config']['fxp-asset']) && is_array($data['config']['fxp-asset'])) {
+                $config = $data['config']['fxp-asset'];
+
+                if ($io instanceof IOInterface && $io->isDebug()) {
+                    $io->writeError('Loading fxp-asset config in file '.$file->getPath());
+                }
+            }
+        }
+
+        return $config;
+    }
+
+    /**
+     * Get the home directory of composer.
+     *
+     * @param Composer $composer The composer
+     *
+     * @return string
+     */
+    private static function getComposerHome(Composer $composer)
+    {
+        return null !== $composer->getConfig() && $composer->getConfig()->has('home')
+            ? $composer->getConfig()->get('home')
+            : '';
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Converter/AbstractPackageConverter.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Converter/AbstractPackageConverter.php
new file mode 100644 (file)
index 0000000..d0557ad
--- /dev/null
@@ -0,0 +1,193 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Converter;
+
+use Fxp\Composer\AssetPlugin\Exception\InvalidArgumentException;
+use Fxp\Composer\AssetPlugin\Type\AssetTypeInterface;
+
+/**
+ * Abstract class for converter for asset package to composer package.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+abstract class AbstractPackageConverter implements PackageConverterInterface
+{
+    /**
+     * @var AssetTypeInterface
+     */
+    protected $assetType;
+
+    /**
+     * Constructor.
+     *
+     * @param AssetTypeInterface $assetType
+     */
+    public function __construct(AssetTypeInterface $assetType)
+    {
+        $this->assetType = $assetType;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function convert(array $data, array &$vcsRepos = array())
+    {
+        $keys = $this->getMapKeys();
+        $dependencies = $this->getMapDependencies();
+        $extras = $this->getMapExtras();
+
+        return $this->convertData($data, $keys, $dependencies, $extras, $vcsRepos);
+    }
+
+    /**
+     * Converts the all keys (keys, dependencies and extra keys).
+     *
+     * @param array $asset        The asset data
+     * @param array $keys         The map of asset key and composer key
+     * @param array $dependencies The map of asset dependency key and composer dependency key
+     * @param array $extras       The map of asset key and composer extra key
+     * @param array $vcsRepos     The list of new vcs configs
+     *
+     * @return array The composer package converted
+     */
+    protected function convertData(array $asset, array $keys, array $dependencies, array $extras, array &$vcsRepos = array())
+    {
+        $composer = array();
+
+        foreach ($keys as $assetKey => $composerKey) {
+            $this->convertKey($asset, $assetKey, $composer, $composerKey);
+        }
+
+        foreach ($dependencies as $assetKey => $composerKey) {
+            $this->convertDependencies($asset, $assetKey, $composer, $composerKey, $vcsRepos);
+        }
+
+        foreach ($extras as $assetKey => $composerKey) {
+            $this->convertExtraKey($asset, $assetKey, $composer, $composerKey);
+        }
+
+        return $composer;
+    }
+
+    /**
+     * Converts the simple key of package.
+     *
+     * @param array        $asset       The asset data
+     * @param string       $assetKey    The asset key
+     * @param array        $composer    The composer data
+     * @param string|array $composerKey The composer key or array with composer key name and closure
+     *
+     * @throws InvalidArgumentException When the 'composerKey' argument of asset packager converter is not an string or an array with the composer key and closure
+     */
+    protected function convertKey(array $asset, $assetKey, array &$composer, $composerKey)
+    {
+        if (is_array($composerKey)) {
+            PackageUtil::convertArrayKey($asset, $assetKey, $composer, $composerKey);
+        } else {
+            PackageUtil::convertStringKey($asset, $assetKey, $composer, $composerKey);
+        }
+    }
+
+    /**
+     * Converts the extra key of package.
+     *
+     * @param array        $asset       The asset data
+     * @param string       $assetKey    The asset extra key
+     * @param array        $composer    The composer data
+     * @param string|array $composerKey The composer extra key or array with composer extra key name and closure
+     * @param string       $extraKey    The extra key name
+     */
+    protected function convertExtraKey(array $asset, $assetKey, array &$composer, $composerKey, $extraKey = 'extra')
+    {
+        $extra = isset($composer[$extraKey]) ? $composer[$extraKey] : array();
+
+        $this->convertKey($asset, $assetKey, $extra, $composerKey);
+
+        if (count($extra) > 0) {
+            $composer[$extraKey] = $extra;
+        }
+    }
+
+    /**
+     * Converts simple key of package.
+     *
+     * @param array  $asset       The asset data
+     * @param string $assetKey    The asset key of dependencies
+     * @param array  $composer    The composer data
+     * @param string $composerKey The composer key of dependencies
+     * @param array  $vcsRepos    The list of new vcs configs
+     */
+    protected function convertDependencies(array $asset, $assetKey, array &$composer, $composerKey, array &$vcsRepos = array())
+    {
+        if (isset($asset[$assetKey]) && is_array($asset[$assetKey])) {
+            $newDependencies = array();
+
+            foreach ($asset[$assetKey] as $dependency => $version) {
+                list($dependency, $version) = $this->convertDependency($dependency, $version, $vcsRepos, $composer);
+                $version = $this->assetType->getVersionConverter()->convertRange($version);
+                if (0 !== strpos($version, $dependency)) {
+                    $newDependencies[$this->assetType->getComposerVendorName().'/'.$dependency] = $version;
+                }
+            }
+
+            $composer[$composerKey] = $newDependencies;
+        }
+    }
+
+    /**
+     * Convert the .
+     *
+     * @param string $dependency The dependency
+     * @param string $version    The version
+     * @param array  $vcsRepos   The list of new vcs configs
+     * @param array  $composer   The partial composer data
+     *
+     * @return string[] The new dependency and the new version
+     */
+    protected function convertDependency($dependency, $version, array &$vcsRepos, array $composer)
+    {
+        list($dependency, $version) = PackageUtil::checkUrlVersion($this->assetType, $dependency, $version, $vcsRepos, $composer);
+        list($dependency, $version) = PackageUtil::checkAliasVersion($this->assetType, $dependency, $version);
+        list($dependency, $version) = PackageUtil::convertDependencyVersion($this->assetType, $dependency, $version);
+
+        return array($dependency, $version);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function getMapKeys()
+    {
+        return array();
+    }
+
+    /**
+     * Get the map conversion of dependencies.
+     *
+     * @return array
+     */
+    protected function getMapDependencies()
+    {
+        return array(
+            'dependencies' => 'require',
+            'devDependencies' => 'require-dev',
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function getMapExtras()
+    {
+        return array();
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Converter/BowerPackageConverter.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Converter/BowerPackageConverter.php
new file mode 100644 (file)
index 0000000..b264165
--- /dev/null
@@ -0,0 +1,88 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Converter;
+
+/**
+ * Converter for bower package to composer package.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class BowerPackageConverter extends AbstractPackageConverter
+{
+    /**
+     * {@inheritdoc}
+     */
+    protected function getMapKeys()
+    {
+        $assetType = $this->assetType;
+
+        return array(
+            'name' => array('name', function ($value) use ($assetType) {
+                return $assetType->formatComposerName($value);
+            }),
+            'type' => array('type', function () use ($assetType) {
+                return $assetType->getComposerType();
+            }),
+            'version' => array('version', function ($value) use ($assetType) {
+                return $assetType->getVersionConverter()->convertVersion($value);
+            }),
+            'version_normalized' => 'version_normalized',
+            'description' => 'description',
+            'keywords' => 'keywords',
+            'license' => 'license',
+            'time' => 'time',
+            'bin' => 'bin',
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function getMapExtras()
+    {
+        return array(
+            'main' => 'bower-asset-main',
+            'ignore' => 'bower-asset-ignore',
+            'private' => 'bower-asset-private',
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function convertDependency($dependency, $version, array &$vcsRepos, array $composer)
+    {
+        list($dependency, $version) = $this->checkGithubRepositoryVersion($dependency, $version);
+
+        return parent::convertDependency($dependency, $version, $vcsRepos, $composer);
+    }
+
+    /**
+     * Checks if the version is a Github alias version of repository.
+     *
+     * @param string $dependency The dependency
+     * @param string $version    The version
+     *
+     * @return string[] The new dependency and the new version
+     */
+    protected function checkGithubRepositoryVersion($dependency, $version)
+    {
+        if (preg_match('/^[A-Za-z0-9\-_]+\/[A-Za-z0-9\-_.]+/', $version)) {
+            $pos = strpos($version, '#');
+            $pos = false === $pos ? strlen($version) : $pos;
+            $realVersion = substr($version, $pos);
+            $version = 'git://github.com/'.substr($version, 0, $pos).'.git'.$realVersion;
+        }
+
+        return array($dependency, $version);
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Converter/NpmPackageConverter.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Converter/NpmPackageConverter.php
new file mode 100644 (file)
index 0000000..287c3dc
--- /dev/null
@@ -0,0 +1,94 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Converter;
+
+/**
+ * Converter for NPM package to composer package.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class NpmPackageConverter extends AbstractPackageConverter
+{
+    /**
+     * {@inheritdoc}
+     */
+    protected function getMapKeys()
+    {
+        $assetType = $this->assetType;
+
+        return array(
+            'name' => array('name', function ($value) use ($assetType) {
+                return $assetType->formatComposerName(NpmPackageUtil::convertName($value));
+            }),
+            'type' => array('type', function () use ($assetType) {
+                return $assetType->getComposerType();
+            }),
+            'version' => array('version', function ($value) use ($assetType) {
+                return $assetType->getVersionConverter()->convertVersion($value);
+            }),
+            'version_normalized' => 'version_normalized',
+            'description' => 'description',
+            'keywords' => 'keywords',
+            'homepage' => 'homepage',
+            'license' => 'license',
+            'time' => 'time',
+            'author' => array('authors', function ($value) {
+                return NpmPackageUtil::convertAuthor($value);
+            }),
+            'contributors' => array('authors', function ($value, $prevValue) {
+                return NpmPackageUtil::convertContributors($value, $prevValue);
+            }),
+            'bin' => array('bin', function ($value) {
+                return (array) $value;
+            }),
+            'dist' => array('dist', function ($value) {
+                return NpmPackageUtil::convertDist($value);
+            }),
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function getMapExtras()
+    {
+        return array(
+            'bugs' => 'npm-asset-bugs',
+            'files' => 'npm-asset-files',
+            'main' => 'npm-asset-main',
+            'man' => 'npm-asset-man',
+            'directories' => 'npm-asset-directories',
+            'repository' => 'npm-asset-repository',
+            'scripts' => 'npm-asset-scripts',
+            'config' => 'npm-asset-config',
+            'bundledDependencies' => 'npm-asset-bundled-dependencies',
+            'optionalDependencies' => 'npm-asset-optional-dependencies',
+            'engines' => 'npm-asset-engines',
+            'engineStrict' => 'npm-asset-engine-strict',
+            'os' => 'npm-asset-os',
+            'cpu' => 'npm-asset-cpu',
+            'preferGlobal' => 'npm-asset-prefer-global',
+            'private' => 'npm-asset-private',
+            'publishConfig' => 'npm-asset-publish-config',
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function convertDependency($dependency, $version, array &$vcsRepos, array $composer)
+    {
+        $dependency = NpmPackageUtil::convertName($dependency);
+
+        return parent::convertDependency($dependency, $version, $vcsRepos, $composer);
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Converter/NpmPackageUtil.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Converter/NpmPackageUtil.php
new file mode 100644 (file)
index 0000000..1a20ff7
--- /dev/null
@@ -0,0 +1,134 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Converter;
+
+/**
+ * Utils for NPM package converter.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+abstract class NpmPackageUtil
+{
+    /**
+     * Convert the npm package name.
+     *
+     * @param string $name The npm package name
+     *
+     * @return string
+     */
+    public static function convertName($name)
+    {
+        if (0 === strpos($name, '@') && false !== strpos($name, '/')) {
+            $name = ltrim(str_replace('/', '--', $name), '@');
+        }
+
+        return $name;
+    }
+
+    /**
+     * Revert the npm package name from composer package name.
+     *
+     * @param string $name The npm package name
+     *
+     * @return string
+     */
+    public static function revertName($name)
+    {
+        if (false !== strpos($name, '--')) {
+            $name = '@'.str_replace('--', '/', $name);
+        }
+
+        return $name;
+    }
+
+    /**
+     * Convert the author section.
+     *
+     * @param string|null $value The current value
+     *
+     * @return array
+     */
+    public static function convertAuthor($value)
+    {
+        if (null !== $value) {
+            $value = array($value);
+        }
+
+        return $value;
+    }
+
+    /**
+     * Convert the contributors section.
+     *
+     * @param string|null $value     The current value
+     * @param string|null $prevValue The previous value
+     *
+     * @return array
+     */
+    public static function convertContributors($value, $prevValue)
+    {
+        $mergeValue = is_array($prevValue) ? $prevValue : array();
+        $mergeValue = array_merge($mergeValue, is_array($value) ? $value : array());
+
+        if (count($mergeValue) > 0) {
+            $value = $mergeValue;
+        }
+
+        return $value;
+    }
+
+    /**
+     * Convert the dist section.
+     *
+     * @param string|null $value The current value
+     *
+     * @return array
+     */
+    public static function convertDist($value)
+    {
+        if (is_array($value)) {
+            $data = (array) $value;
+            $value = array();
+
+            foreach ($data as $type => $url) {
+                if (is_string($url)) {
+                    self::convertDistEntry($value, $type, $url);
+                }
+            }
+        }
+
+        return $value;
+    }
+
+    /**
+     * Convert the each entry of dist section.
+     *
+     * @param array  $value The result
+     * @param string $type  The dist type
+     * @param string $url   The dist url
+     */
+    private static function convertDistEntry(array &$value, $type, $url)
+    {
+        $httpPrefix = 'http://';
+
+        if (0 === strpos($url, $httpPrefix)) {
+            $url = 'https://'.substr($url, strlen($httpPrefix));
+        }
+
+        if ('shasum' === $type) {
+            $value[$type] = $url;
+        } else {
+            $value['type'] = 'tarball' === $type ? 'tar' : $type;
+            $value['url'] = $url;
+        }
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Converter/PackageConverterInterface.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Converter/PackageConverterInterface.php
new file mode 100644 (file)
index 0000000..034418e
--- /dev/null
@@ -0,0 +1,30 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Converter;
+
+/**
+ * Interface for the converter for asset package to composer package.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+interface PackageConverterInterface
+{
+    /**
+     * Converts the asset data package to composer data package.
+     *
+     * @param array $data     The asset data package
+     * @param array $vcsRepos The vcs repositories created
+     *
+     * @return array The composer data package
+     */
+    public function convert(array $data, array &$vcsRepos = array());
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Converter/PackageUtil.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Converter/PackageUtil.php
new file mode 100644 (file)
index 0000000..4ca2f5c
--- /dev/null
@@ -0,0 +1,321 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Converter;
+
+use Composer\Config;
+use Composer\IO\NullIO;
+use Composer\Repository\Vcs\VcsDriverInterface;
+use Fxp\Composer\AssetPlugin\Assets;
+use Fxp\Composer\AssetPlugin\Exception\InvalidArgumentException;
+use Fxp\Composer\AssetPlugin\Type\AssetTypeInterface;
+use Fxp\Composer\AssetPlugin\Util\Validator;
+
+/**
+ * Utils for package converter.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+abstract class PackageUtil
+{
+    /**
+     * @var string[]
+     */
+    private static $extensions = array(
+        '.zip',
+        '.tar',
+        '.tar.gz',
+        '.tar.bz2',
+        '.tar.Z',
+        '.tar.xz',
+        '.bz2',
+        '.gz',
+    );
+
+    /**
+     * Checks if the version is a URL version.
+     *
+     * @param AssetTypeInterface $assetType  The asset type
+     * @param string             $dependency The dependency
+     * @param string             $version    The version
+     * @param array              $vcsRepos   The list of new vcs configs
+     * @param array              $composer   The partial composer data
+     *
+     * @return string[] The new dependency and the new version
+     */
+    public static function checkUrlVersion(AssetTypeInterface $assetType, $dependency, $version, array &$vcsRepos, array $composer)
+    {
+        if (preg_match('/(\:\/\/)|\@/', $version)) {
+            list($url, $version) = static::splitUrlVersion($version);
+
+            if (!static::isUrlArchive($url) && static::hasUrlDependencySupported($url)) {
+                $vcsRepos[] = array(
+                    'type' => sprintf('%s-vcs', $assetType->getName()),
+                    'url' => $url,
+                    'name' => $assetType->formatComposerName($dependency),
+                );
+            } else {
+                $dependency = static::getUrlFileDependencyName($assetType, $composer, $dependency);
+                $vcsRepos[] = array(
+                    'type' => 'package',
+                    'package' => array(
+                        'name' => $assetType->formatComposerName($dependency),
+                        'type' => $assetType->getComposerType(),
+                        'version' => static::getUrlFileDependencyVersion($assetType, $url, $version),
+                        'dist' => array(
+                            'url' => $url,
+                            'type' => 'file',
+                        ),
+                    ),
+                );
+            }
+        }
+
+        return array($dependency, $version);
+    }
+
+    /**
+     * Check if the url is a url of a archive file.
+     *
+     * @param string $url The url
+     *
+     * @return bool
+     */
+    public static function isUrlArchive($url)
+    {
+        if (0 === strpos($url, 'http')) {
+            foreach (self::$extensions as $extension) {
+                if (substr($url, -strlen($extension)) === $extension) {
+                    return true;
+                }
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * Checks if the version is a alias version.
+     *
+     * @param AssetTypeInterface $assetType  The asset type
+     * @param string             $dependency The dependency
+     * @param string             $version    The version
+     *
+     * @return string[] The new dependency and the new version
+     */
+    public static function checkAliasVersion(AssetTypeInterface $assetType, $dependency, $version)
+    {
+        $pos = strpos($version, '#');
+
+        if ($pos > 0 && !preg_match('{[0-9a-f]{40}$}', $version)) {
+            $dependency = substr($version, 0, $pos);
+            $version = substr($version, $pos);
+            $searchVerion = substr($version, 1);
+
+            if (false === strpos($version, '*') && Validator::validateTag($searchVerion, $assetType)) {
+                $dependency .= '-'.str_replace('#', '', $version);
+            }
+        }
+
+        return array($dependency, $version);
+    }
+
+    /**
+     * Convert the dependency version.
+     *
+     * @param AssetTypeInterface $assetType  The asset type
+     * @param string             $dependency The dependency
+     * @param string             $version    The version
+     *
+     * @return string[] The new dependency and the new version
+     */
+    public static function convertDependencyVersion(AssetTypeInterface $assetType, $dependency, $version)
+    {
+        $containsHash = false !== strpos($version, '#');
+        $version = str_replace('#', '', $version);
+        $version = empty($version) ? '*' : trim($version);
+        $searchVersion = str_replace(array(' ', '<', '>', '=', '^', '~'), '', $version);
+
+        // sha version or branch version
+        // sha size: 4-40. See https://git-scm.com/book/tr/v2/Git-Tools-Revision-Selection#_short_sha_1
+        if ($containsHash && preg_match('{^[0-9a-f]{4,40}$}', $version)) {
+            $version = 'dev-default#'.$version;
+        } elseif ('*' !== $version && !Validator::validateTag($searchVersion, $assetType) && !static::depIsRange($version)) {
+            $version = static::convertBrachVersion($assetType, $version);
+        }
+
+        return array($dependency, $version);
+    }
+
+    /**
+     * Converts the simple key of package.
+     *
+     * @param array  $asset       The asset data
+     * @param string $assetKey    The asset key
+     * @param array  $composer    The composer data
+     * @param string $composerKey The composer key
+     */
+    public static function convertStringKey(array $asset, $assetKey, array &$composer, $composerKey)
+    {
+        if (isset($asset[$assetKey])) {
+            $composer[$composerKey] = $asset[$assetKey];
+        }
+    }
+
+    /**
+     * Converts the simple key of package.
+     *
+     * @param array  $asset       The asset data
+     * @param string $assetKey    The asset key
+     * @param array  $composer    The composer data
+     * @param array  $composerKey The array with composer key name and closure
+     *
+     * @throws InvalidArgumentException When the 'composerKey' argument of asset packager converter is not an string or an array with the composer key and closure
+     */
+    public static function convertArrayKey(array $asset, $assetKey, array &$composer, $composerKey)
+    {
+        if (2 !== count($composerKey)
+            || !is_string($composerKey[0]) || !$composerKey[1] instanceof \Closure) {
+            throw new InvalidArgumentException('The "composerKey" argument of asset packager converter must be an string or an array with the composer key and closure');
+        }
+
+        $closure = $composerKey[1];
+        $composerKey = $composerKey[0];
+        $data = isset($asset[$assetKey]) ? $asset[$assetKey] : null;
+        $previousData = isset($composer[$composerKey]) ? $composer[$composerKey] : null;
+        $data = $closure($data, $previousData);
+
+        if (null !== $data) {
+            $composer[$composerKey] = $data;
+        }
+    }
+
+    /**
+     * Split the URL and version.
+     *
+     * @param string $version The url and version (in the same string)
+     *
+     * @return string[] The url and version
+     */
+    protected static function splitUrlVersion($version)
+    {
+        $pos = strpos($version, '#');
+
+        // number version or empty version
+        if (false !== $pos) {
+            $url = substr($version, 0, $pos);
+            $version = substr($version, $pos);
+        } else {
+            $url = $version;
+            $version = '#';
+        }
+
+        return array($url, $version);
+    }
+
+    /**
+     * Get the name of url file dependency.
+     *
+     * @param AssetTypeInterface $assetType  The asset type
+     * @param array              $composer   The partial composer
+     * @param string             $dependency The dependency name
+     *
+     * @return string The dependency name
+     */
+    protected static function getUrlFileDependencyName(AssetTypeInterface $assetType, array $composer, $dependency)
+    {
+        $prefix = isset($composer['name'])
+            ? substr($composer['name'], strlen($assetType->getComposerVendorName()) + 1).'-'
+            : '';
+
+        return $prefix.$dependency.'-file';
+    }
+
+    /**
+     * Get the version of url file dependency.
+     *
+     * @param AssetTypeInterface $assetType The asset type
+     * @param string             $url       The url
+     * @param string             $version   The version
+     *
+     * @return string The version
+     */
+    protected static function getUrlFileDependencyVersion(AssetTypeInterface $assetType, $url, $version)
+    {
+        if ('#' !== $version) {
+            return substr($version, 1);
+        }
+
+        if (preg_match('/(\d+)(\.\d+)(\.\d+)?(\.\d+)?/', $url, $match)) {
+            return $assetType->getVersionConverter()->convertVersion($match[0]);
+        }
+
+        return '0.0.0.0';
+    }
+
+    /**
+     * Check if url is supported by vcs drivers.
+     *
+     * @param string $url The url
+     *
+     * @return bool
+     */
+    protected static function hasUrlDependencySupported($url)
+    {
+        $io = new NullIO();
+        $config = new Config();
+
+        /* @var VcsDriverInterface $driver */
+        foreach (Assets::getVcsDrivers() as $driver) {
+            $supported = $driver::supports($io, $config, $url);
+
+            if ($supported) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * Check if the version of dependency is a range version.
+     *
+     * @param string $version
+     *
+     * @return bool
+     */
+    protected static function depIsRange($version)
+    {
+        $version = trim($version);
+
+        return (bool) preg_match('/[\<\>\=\^\~\ ]/', $version);
+    }
+
+    /**
+     * Convert the dependency branch version.
+     *
+     * @param AssetTypeInterface $assetType The asset type
+     * @param string             $version   The version
+     *
+     * @return string
+     */
+    protected static function convertBrachVersion(AssetTypeInterface $assetType, $version)
+    {
+        $oldVersion = $version;
+        $version = 'dev-'.$assetType->getVersionConverter()->convertVersion($version);
+
+        if (!Validator::validateBranch($oldVersion)) {
+            $version .= ' || '.$oldVersion;
+        }
+
+        return $version;
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Converter/SemverConverter.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Converter/SemverConverter.php
new file mode 100644 (file)
index 0000000..6357310
--- /dev/null
@@ -0,0 +1,219 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Converter;
+
+/**
+ * Converter for Semver syntax version to composer syntax version.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class SemverConverter implements VersionConverterInterface
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function convertVersion($version)
+    {
+        if (in_array($version, array(null, '', 'latest'))) {
+            return ('latest' === $version ? 'default || ' : '').'*';
+        }
+
+        $version = str_replace('–', '-', $version);
+        $prefix = preg_match('/^[a-z]/', $version) && 0 !== strpos($version, 'dev-') ? substr($version, 0, 1) : '';
+        $version = substr($version, strlen($prefix));
+        $version = SemverUtil::convertVersionMetadata($version);
+        $version = SemverUtil::convertDateVersion($version);
+
+        return $prefix.$version;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function convertRange($range)
+    {
+        $range = $this->cleanRange(strtolower($range));
+
+        return $this->matchRange($range);
+    }
+
+    /**
+     * Clean the raw range.
+     *
+     * @param string $range
+     *
+     * @return string
+     */
+    protected function cleanRange($range)
+    {
+        foreach (array('<', '>', '=', '~', '^', '||', '&&') as $character) {
+            $range = str_replace($character.' ', $character, $range);
+        }
+
+        $range = preg_replace('/(?:[vV])(\d+)/', '${1}', $range);
+        $range = str_replace(' ||', '||', $range);
+        $range = str_replace(array(' &&', '&&'), ',', $range);
+
+        return $range;
+    }
+
+    /**
+     * Match the range.
+     *
+     * @param string $range The range cleaned
+     *
+     * @return string The range
+     */
+    protected function matchRange($range)
+    {
+        $pattern = '/(\ -\ )|(<)|(>)|(=)|(\|\|)|(\ )|(,)|(\~)|(\^)/';
+        $matches = preg_split($pattern, $range, -1, PREG_SPLIT_DELIM_CAPTURE);
+        $special = null;
+        $replace = null;
+        $first = true;
+
+        foreach ($matches as $i => $match) {
+            if ($first && '' !== $match) {
+                $first = false;
+                $match = '=' === $match ? 'EQUAL' : $match;
+            }
+
+            $this->matchRangeToken($i, $match, $matches, $special, $replace);
+        }
+
+        return implode('', $matches);
+    }
+
+    /**
+     * Converts the token of the matched range.
+     *
+     * @param int         $i
+     * @param string      $match
+     * @param array       $matches
+     * @param string|null $special
+     * @param string|null $replace
+     */
+    protected function matchRangeToken($i, $match, array &$matches, &$special, &$replace)
+    {
+        if (' - ' === $match) {
+            $matches[$i - 1] = '>='.str_replace(array('*', 'x', 'X'), '0', $matches[$i - 1]);
+
+            if (false !== strpos($matches[$i + 1], '.') && strpos($matches[$i + 1], '*') === false
+                    && strpos($matches[$i + 1], 'x') === false && strpos($matches[$i + 1], 'X') === false) {
+                $matches[$i] = ',<=';
+            } else {
+                $matches[$i] = ',<';
+                $special = ',<~';
+            }
+        } else {
+            $this->matchRangeTokenStep2($i, $match, $matches, $special, $replace);
+        }
+    }
+
+    /**
+     * Step2: Converts the token of the matched range.
+     *
+     * @param int         $i
+     * @param string      $match
+     * @param array       $matches
+     * @param string|null $special
+     * @param string|null $replace
+     */
+    protected function matchRangeTokenStep2($i, $match, array &$matches, &$special, &$replace)
+    {
+        if (in_array($match, array('', '<', '>', '=', ','))) {
+            $replace = in_array($match, array('<', '>')) ? $match : $replace;
+            $matches[$i] = '~' === $special && in_array($replace, array('<', '>')) ? '' : $matches[$i];
+        } elseif ('~' === $match) {
+            $special = $match;
+        } elseif (in_array($match, array('EQUAL', '^'))) {
+            $special = $match;
+            $matches[$i] = '';
+        } else {
+            $this->matchRangeTokenStep3($i, $match, $matches, $special, $replace);
+        }
+    }
+
+    /**
+     * Step3: Converts the token of the matched range.
+     *
+     * @param int         $i
+     * @param string      $match
+     * @param array       $matches
+     * @param string|null $special
+     * @param string|null $replace
+     */
+    protected function matchRangeTokenStep3($i, $match, array &$matches, &$special, &$replace)
+    {
+        if (' ' === $match) {
+            $matches[$i] = ',';
+        } elseif ('||' === $match) {
+            $matches[$i] = '|';
+        } elseif (in_array($special, array('^'))) {
+            $matches[$i] = SemverRangeUtil::replaceSpecialRange($this, $match);
+            $special = null;
+        } else {
+            $this->matchRangeTokenStep4($i, $match, $matches, $special, $replace);
+        }
+    }
+
+    /**
+     * Step4: Converts the token of the matched range.
+     *
+     * @param int         $i
+     * @param string      $match
+     * @param array       $matches
+     * @param string|null $special
+     * @param string|null $replace
+     */
+    protected function matchRangeTokenStep4($i, $match, array &$matches, &$special, &$replace)
+    {
+        if ($special === ',<~') {
+            // Version range contains x in last place.
+            $match .= (false === strpos($match, '.') ? '.x' : '');
+            $version = explode('.', $match);
+            $change = count($version) - 2;
+            $version[$change] = (int) ($version[$change]) + 1;
+            $match = str_replace(array('*', 'x', 'X'), '0', implode('.', $version));
+        } elseif (null === $special && $i === 0 && false === strpos($match, '.') && is_numeric($match)) {
+            $match = isset($matches[$i + 1]) && (' - ' === $matches[$i + 1] || '-' === $matches[$i + 1])
+                ? $match
+                : '~'.$match;
+        } else {
+            $match = '~' === $special ? str_replace(array('*', 'x', 'X'), '0', $match) : $match;
+        }
+
+        $this->matchRangeTokenStep5($i, $match, $matches, $special, $replace);
+    }
+
+    /**
+     * Step5: Converts the token of the matched range.
+     *
+     * @param int         $i
+     * @param string      $match
+     * @param array       $matches
+     * @param string|null $special
+     * @param string|null $replace
+     */
+    protected function matchRangeTokenStep5($i, $match, array &$matches, &$special, &$replace)
+    {
+        $matches[$i] = $this->convertVersion($match);
+        $matches[$i] = $replace
+            ? SemverUtil::replaceAlias($matches[$i], $replace)
+            : $matches[$i];
+        $matches[$i] .= '~' === $special && in_array($replace, array('<', '>'))
+            ? ','.$replace.$matches[$i]
+            : '';
+        $special = null;
+        $replace = null;
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Converter/SemverRangeUtil.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Converter/SemverRangeUtil.php
new file mode 100644 (file)
index 0000000..421a51f
--- /dev/null
@@ -0,0 +1,146 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Converter;
+
+/**
+ * Utils for semver range converter.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+abstract class SemverRangeUtil
+{
+    /**
+     * Replaces the special range "^".
+     *
+     * @param SemverConverter $converter The semver converter
+     * @param string          $match     The match version
+     *
+     * @return string the new match version
+     */
+    public static function replaceSpecialRange(SemverConverter $converter, $match)
+    {
+        $newMatch = $converter->convertVersion($match);
+        $newMatch = '>='.static::standardizeVersion(SemverUtil::replaceAlias($newMatch, '>')).',<';
+        $exp = static::getSplittedVersion($match);
+        $increase = false;
+
+        foreach ($exp as $i => $sub) {
+            if (static::analyzeSubVersion($i, $exp, $increase)) {
+                continue;
+            }
+
+            static::increaseSubVersion($i, $exp, $increase);
+        }
+
+        $newMatch .= $converter->convertVersion(static::standardizeVersion($exp));
+
+        return $newMatch;
+    }
+
+    /**
+     * Analyze the sub version of splitted version.
+     *
+     * @param int   $i        The position in splitted version
+     * @param array $exp      The splitted version
+     * @param bool  $increase Check if the next sub version must be increased
+     *
+     * @return bool
+     */
+    protected static function analyzeSubVersion($i, array &$exp, &$increase)
+    {
+        $analyzed = false;
+
+        if ($increase) {
+            $exp[$i] = 0;
+            $analyzed = true;
+        }
+
+        if (0 === $i && (int) $exp[$i] > 0) {
+            $increase = true;
+            $exp[$i] = (int) $exp[$i] + 1;
+            $analyzed = true;
+        }
+
+        return $analyzed;
+    }
+
+    /**
+     * Increase the sub version of splitted version.
+     *
+     * @param int   $i        The position in splitted version
+     * @param array $exp      The splitted version
+     * @param bool  $increase Check if the next sub version must be increased
+     */
+    protected static function increaseSubVersion($i, array &$exp, &$increase)
+    {
+        $iNext = min(min($i + 1, 3), count($exp) - 1);
+
+        if (($iNext !== $i && ($exp[$i] > 0 || (int) $exp[$iNext] > 9999998)) || $iNext === $i) {
+            $exp[$i] = (int) $exp[$i] + 1;
+            $increase = true;
+        }
+    }
+
+    /**
+     * Standardize the version.
+     *
+     * @param string|array $version The version or the splitted version
+     *
+     * @return string
+     */
+    protected static function standardizeVersion($version)
+    {
+        if (is_string($version)) {
+            $version = explode('.', $version);
+        }
+
+        while (count($version) < 3) {
+            $version[] = '0';
+        }
+
+        return implode('.', $version);
+    }
+
+    /**
+     * Split the version.
+     *
+     * @param string $version
+     *
+     * @return array
+     */
+    protected static function getSplittedVersion($version)
+    {
+        $version = static::cleanExtraVersion($version);
+        $version = str_replace(array('*', 'x', 'X'), '9999999', $version);
+        $exp = explode('.', $version);
+
+        return $exp;
+    }
+
+    /**
+     * Remove the extra informations of the version (info after "-").
+     *
+     * @param string $version
+     *
+     * @return string
+     */
+    protected static function cleanExtraVersion($version)
+    {
+        $pos = strpos($version, '-');
+
+        if (false !== $pos) {
+            $version = substr($version, 0, $pos);
+        }
+
+        return $version;
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Converter/SemverUtil.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Converter/SemverUtil.php
new file mode 100644 (file)
index 0000000..1273103
--- /dev/null
@@ -0,0 +1,192 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Converter;
+
+use Fxp\Composer\AssetPlugin\Package\Version\VersionParser;
+
+/**
+ * Utils for semver converter.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+abstract class SemverUtil
+{
+    /**
+     * @var string[]
+     */
+    private static $cleanPatterns = array(
+        '-npm-packages',
+        '-bower-packages',
+    );
+
+    /**
+     * Replace the alias version (x or *) by integer.
+     *
+     * @param string $version
+     * @param string $type
+     *
+     * @return string
+     */
+    public static function replaceAlias($version, $type)
+    {
+        $value = '>' === $type ? '0' : '9999999';
+
+        return str_replace(array('x', '*'), $value, $version);
+    }
+
+    /**
+     * Converts the date or datetime version.
+     *
+     * @param string $version The version
+     *
+     * @return string
+     */
+    public static function convertDateVersion($version)
+    {
+        if (preg_match('/^\d{7,}\./', $version)) {
+            $pos = strpos($version, '.');
+            $version = substr($version, 0, $pos).self::convertDateMinorVersion(substr($version, $pos + 1));
+        }
+
+        return $version;
+    }
+
+    /**
+     * Converts the version metadata.
+     *
+     * @param string $version
+     *
+     * @return string
+     */
+    public static function convertVersionMetadata($version)
+    {
+        $version = str_replace(self::$cleanPatterns, '', $version);
+
+        if (preg_match_all(self::createPattern('([a-zA-Z]+|(\-|\+)[a-zA-Z]+|(\-|\+)[0-9]+)'),
+            $version, $matches, PREG_OFFSET_CAPTURE)) {
+            list($type, $version, $end) = self::cleanVersion(strtolower($version), $matches);
+            list($version, $patchVersion) = self::matchVersion($version, $type);
+
+            $matches = array();
+            $hasPatchNumber = preg_match('/[0-9]+\.[0-9]+|[0-9]+|\.[0-9]+$/', $end, $matches);
+            $end = $hasPatchNumber ? $matches[0] : '1';
+
+            if ($patchVersion) {
+                $version .= $end;
+            }
+        }
+
+        return static::cleanWildcard($version);
+    }
+
+    /**
+     * Creates a pattern with the version prefix pattern.
+     *
+     * @param string $pattern The pattern without '/'
+     *
+     * @return string The full pattern with '/'
+     */
+    public static function createPattern($pattern)
+    {
+        $numVer = '([0-9]+|x|\*)';
+        $numVer2 = '('.$numVer.'\.'.$numVer.')';
+        $numVer3 = '('.$numVer.'\.'.$numVer.'\.'.$numVer.')';
+
+        return '/^'.'('.$numVer.'|'.$numVer2.'|'.$numVer3.')'.$pattern.'/';
+    }
+
+    /**
+     * Clean the wildcard in version.
+     *
+     * @param string $version The version
+     *
+     * @return string The cleaned version
+     */
+    protected static function cleanWildcard($version)
+    {
+        while (false !== strpos($version, '.x.x')) {
+            $version = str_replace('.x.x', '.x', $version);
+        }
+
+        return $version;
+    }
+
+    /**
+     * Clean the raw version.
+     *
+     * @param string $version The version
+     * @param array  $matches The match of pattern asset version
+     *
+     * @return array The list of $type, $version and $end
+     */
+    protected static function cleanVersion($version, array $matches)
+    {
+        $end = substr($version, strlen($matches[1][0][0]));
+        $version = $matches[1][0][0].'-';
+
+        $matches = array();
+        if (preg_match('/^(\-|\+)/', $end, $matches)) {
+            $end = substr($end, 1);
+        }
+
+        $matches = array();
+        preg_match('/^[a-z]+/', $end, $matches);
+        $type = isset($matches[0]) ? VersionParser::normalizeStability($matches[0]) : null;
+        $end = substr($end, strlen($type));
+
+        return array($type, $version, $end);
+    }
+
+    /**
+     * Match the version.
+     *
+     * @param string $version
+     * @param string $type
+     *
+     * @return array The list of $version and $patchVersion
+     */
+    protected static function matchVersion($version, $type)
+    {
+        $patchVersion = true;
+
+        if (in_array($type, array('dev', 'snapshot'))) {
+            $type = 'dev';
+            $patchVersion = false;
+        } elseif ('a' === $type) {
+            $type = 'alpha';
+        } elseif (in_array($type, array('b', 'pre'))) {
+            $type = 'beta';
+        } elseif (!in_array($type, array('alpha', 'beta', 'RC'))) {
+            $type = 'patch';
+        }
+
+        $version .= $type;
+
+        return array($version, $patchVersion);
+    }
+
+    /**
+     * Convert the minor version of date.
+     *
+     * @param string $minor The minor version
+     *
+     * @return string
+     */
+    protected static function convertDateMinorVersion($minor)
+    {
+        $split = explode('.', $minor);
+        $minor = (int) $split[0];
+        $revision = isset($split[1]) ? (int) $split[1] : 0;
+
+        return '.'.sprintf('%03d', $minor).sprintf('%03d', $revision);
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Converter/VersionConverterInterface.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Converter/VersionConverterInterface.php
new file mode 100644 (file)
index 0000000..0bfbf44
--- /dev/null
@@ -0,0 +1,38 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Converter;
+
+/**
+ * Interface for the converter for asset syntax version to composer syntax version.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+interface VersionConverterInterface
+{
+    /**
+     * Converts the asset version to composer version.
+     *
+     * @param string $version The asset version
+     *
+     * @return string The composer version
+     */
+    public function convertVersion($version);
+
+    /**
+     * Converts the range asset version to range composer version.
+     *
+     * @param string $range The range asset version
+     *
+     * @return string The range composer version
+     */
+    public function convertRange($range);
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Exception/ExceptionInterface.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Exception/ExceptionInterface.php
new file mode 100644 (file)
index 0000000..8914601
--- /dev/null
@@ -0,0 +1,21 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Exception;
+
+/**
+ * The interface of exception.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+interface ExceptionInterface
+{
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Exception/InvalidArgumentException.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Exception/InvalidArgumentException.php
new file mode 100644 (file)
index 0000000..153eb27
--- /dev/null
@@ -0,0 +1,21 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Exception;
+
+/**
+ * The Invalid Argument Exception.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class InvalidArgumentException extends \InvalidArgumentException implements ExceptionInterface
+{
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Exception/InvalidCreateRepositoryException.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Exception/InvalidCreateRepositoryException.php
new file mode 100644 (file)
index 0000000..c0ef3be
--- /dev/null
@@ -0,0 +1,49 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Exception;
+
+/**
+ * The Invalid Create Asset Repository Exception.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class InvalidCreateRepositoryException extends \Exception implements ExceptionInterface
+{
+    /**
+     * @var array
+     */
+    protected $data = array();
+
+    /**
+     * Set the data of asset package config defined by the registry.
+     *
+     * @param array $data The data
+     *
+     * @return self
+     */
+    public function setData(array $data)
+    {
+        $this->data = $data;
+
+        return $this;
+    }
+
+    /**
+     * Get the data of asset package config defined by the registry.
+     *
+     * @return array
+     */
+    public function getData()
+    {
+        return $this->data;
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/FxpAssetPlugin.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/FxpAssetPlugin.php
new file mode 100644 (file)
index 0000000..3442f45
--- /dev/null
@@ -0,0 +1,139 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin;
+
+use Composer\Composer;
+use Composer\EventDispatcher\EventSubscriberInterface;
+use Composer\Installer\InstallerEvent;
+use Composer\Installer\InstallerEvents;
+use Composer\IO\IOInterface;
+use Composer\Plugin\CommandEvent;
+use Composer\Plugin\PluginEvents;
+use Composer\Plugin\PluginInterface;
+use Composer\Repository\InstalledFilesystemRepository;
+use Fxp\Composer\AssetPlugin\Config\Config;
+use Fxp\Composer\AssetPlugin\Config\ConfigBuilder;
+use Fxp\Composer\AssetPlugin\Repository\AssetRepositoryManager;
+use Fxp\Composer\AssetPlugin\Repository\ResolutionManager;
+use Fxp\Composer\AssetPlugin\Repository\VcsPackageFilter;
+use Fxp\Composer\AssetPlugin\Util\AssetPlugin;
+
+/**
+ * Composer plugin.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class FxpAssetPlugin implements PluginInterface, EventSubscriberInterface
+{
+    /**
+     * @var Config
+     */
+    protected $config;
+
+    /**
+     * @var Composer
+     */
+    protected $composer;
+
+    /**
+     * @var IOInterface
+     */
+    protected $io;
+
+    /**
+     * @var VcsPackageFilter
+     */
+    protected $packageFilter;
+
+    /**
+     * @var AssetRepositoryManager
+     */
+    protected $assetRepositoryManager;
+
+    /**
+     * {@inheritdoc}
+     */
+    public static function getSubscribedEvents()
+    {
+        return array(
+            PluginEvents::COMMAND => array(
+                array('onPluginCommand', 0),
+            ),
+            InstallerEvents::PRE_DEPENDENCIES_SOLVING => array(
+                array('onPreDependenciesSolving', 0),
+            ),
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function activate(Composer $composer, IOInterface $io)
+    {
+        $this->config = ConfigBuilder::build($composer, $io);
+
+        if ($this->config->get('enabled', true)) {
+            /* @var InstalledFilesystemRepository $installedRepository */
+            $installedRepository = $composer->getRepositoryManager()->getLocalRepository();
+            $this->composer = $composer;
+            $this->io = $io;
+            $this->packageFilter = new VcsPackageFilter($this->config, $composer->getPackage(), $composer->getInstallationManager(), $installedRepository);
+            $this->assetRepositoryManager = new AssetRepositoryManager($io, $composer->getRepositoryManager(), $this->config, $this->packageFilter);
+            $this->assetRepositoryManager->setResolutionManager(new ResolutionManager($this->config->getArray('resolutions')));
+
+            AssetPlugin::addRegistryRepositories($this->assetRepositoryManager, $this->packageFilter, $this->config);
+            AssetPlugin::setVcsTypeRepositories($composer->getRepositoryManager());
+
+            $this->assetRepositoryManager->addRepositories($this->config->getArray('repositories'));
+
+            AssetPlugin::addInstallers($this->config, $composer, $io);
+        }
+    }
+
+    /**
+     * Disable the package filter for all command, but for install and update command.
+     *
+     * @param CommandEvent $event
+     */
+    public function onPluginCommand(CommandEvent $event)
+    {
+        if ($this->config->get('enabled', true)) {
+            ConfigBuilder::validate($this->io, $this->composer->getPackage(), $event->getCommandName());
+
+            if (!in_array($event->getCommandName(), array('install', 'update'))) {
+                $this->packageFilter->setEnabled(false);
+            }
+        }
+    }
+
+    /**
+     * Add pool in asset repository manager.
+     *
+     * @param InstallerEvent $event
+     */
+    public function onPreDependenciesSolving(InstallerEvent $event)
+    {
+        if ($this->config->get('enabled', true)) {
+            $this->assetRepositoryManager->setPool($event->getPool());
+        }
+    }
+
+    /**
+     * Get the plugin config.
+     *
+     * @return Config
+     */
+    public function getConfig()
+    {
+        return $this->config;
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Installer/AssetInstaller.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Installer/AssetInstaller.php
new file mode 100644 (file)
index 0000000..3773426
--- /dev/null
@@ -0,0 +1,139 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Installer;
+
+use Composer\Composer;
+use Composer\Installer\LibraryInstaller;
+use Composer\IO\IOInterface;
+use Composer\Package\PackageInterface;
+use Composer\Util\Filesystem;
+use Fxp\Composer\AssetPlugin\Config\Config;
+use Fxp\Composer\AssetPlugin\Type\AssetTypeInterface;
+use Fxp\Composer\AssetPlugin\Util\AssetPlugin;
+
+/**
+ * Installer for asset packages.
+ *
+ * @author Martin Hasoň <martin.hason@gmail.com>
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class AssetInstaller extends LibraryInstaller
+{
+    /**
+     * @var Config
+     */
+    private $config;
+
+    /**
+     * Constructor.
+     *
+     * @param Config             $config
+     * @param IOInterface        $io
+     * @param Composer           $composer
+     * @param AssetTypeInterface $assetType
+     * @param Filesystem         $filesystem
+     */
+    public function __construct(Config $config, IOInterface $io, Composer $composer, AssetTypeInterface $assetType, Filesystem $filesystem = null)
+    {
+        parent::__construct($io, $composer, $assetType->getComposerType(), $filesystem);
+
+        $this->config = $config;
+        $paths = $this->config->getArray('installer-paths');
+
+        if (!empty($paths[$this->type])) {
+            $this->vendorDir = rtrim($paths[$this->type], '/');
+        } else {
+            $this->vendorDir = rtrim($this->vendorDir.'/'.$assetType->getComposerVendorName(), '/');
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function supports($packageType)
+    {
+        return $packageType === $this->type;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getInstallPath(PackageInterface $package)
+    {
+        $this->initializeVendorDir();
+
+        $targetDir = $package->getTargetDir();
+
+        list(, $name) = explode('/', $package->getPrettyName(), 2);
+
+        return ($this->vendorDir ? $this->vendorDir.'/' : '').$name.($targetDir ? '/'.$targetDir : '');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function getPackageBasePath(PackageInterface $package)
+    {
+        return $this->getInstallPath($package);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function installCode(PackageInterface $package)
+    {
+        $package = AssetPlugin::addMainFiles($this->config, $package);
+
+        parent::installCode($package);
+
+        $this->deleteIgnoredFiles($package);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function updateCode(PackageInterface $initial, PackageInterface $target)
+    {
+        $target = AssetPlugin::addMainFiles($this->config, $target);
+
+        parent::updateCode($initial, $target);
+
+        $this->deleteIgnoredFiles($target);
+    }
+
+    /**
+     * Deletes files defined in bower.json in section "ignore".
+     *
+     * @param PackageInterface $package
+     */
+    protected function deleteIgnoredFiles(PackageInterface $package)
+    {
+        $manager = IgnoreFactory::create($this->config, $this->composer, $package, $this->getInstallPath($package));
+
+        if ($manager->isEnabled() && !$manager->hasPattern()) {
+            $this->addIgnorePatterns($manager, $package);
+        }
+
+        $manager->cleanup();
+    }
+
+    /**
+     * Add ignore patterns in the manager.
+     *
+     * @param IgnoreManager    $manager The ignore manager instance
+     * @param PackageInterface $package The package instance
+     */
+    protected function addIgnorePatterns(IgnoreManager $manager, PackageInterface $package)
+    {
+        // override this method
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Installer/BowerInstaller.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Installer/BowerInstaller.php
new file mode 100644 (file)
index 0000000..2dc45aa
--- /dev/null
@@ -0,0 +1,39 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Installer;
+
+use Composer\Package\PackageInterface;
+
+/**
+ * Installer for bower packages.
+ *
+ * @author Martin Hasoň <martin.hason@gmail.com>
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class BowerInstaller extends AssetInstaller
+{
+    /**
+     * {@inheritdoc}
+     */
+    protected function addIgnorePatterns(IgnoreManager $manager, PackageInterface $package)
+    {
+        $extra = $package->getExtra();
+
+        if (!empty($extra['bower-asset-ignore'])) {
+            $manager->doAddPattern('!bower.json');
+
+            foreach ($extra['bower-asset-ignore'] as $pattern) {
+                $manager->addPattern($pattern);
+            }
+        }
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Installer/IgnoreFactory.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Installer/IgnoreFactory.php
new file mode 100644 (file)
index 0000000..9b213a5
--- /dev/null
@@ -0,0 +1,87 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Installer;
+
+use Composer\Composer;
+use Composer\Package\PackageInterface;
+use Fxp\Composer\AssetPlugin\Config\Config;
+
+/**
+ * Factory of ignore manager patterns.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class IgnoreFactory
+{
+    /**
+     * Create a ignore manager.
+     *
+     * @param Config           $config     The plugin config
+     * @param Composer         $composer   The composer instance
+     * @param PackageInterface $package    The package instance
+     * @param string|null      $installDir The custom installation directory
+     * @param string|null      $section    The config section of ignore patterns
+     *
+     * @return IgnoreManager
+     */
+    public static function create(Config $config, Composer $composer, PackageInterface $package, $installDir = null, $section = 'ignore-files')
+    {
+        $installDir = static::getInstallDir($composer, $package, $installDir);
+        $manager = new IgnoreManager($installDir);
+        $config = $config->getArray($section);
+
+        foreach ($config as $packageName => $patterns) {
+            if ($packageName === $package->getName()) {
+                static::addPatterns($manager, $patterns);
+                break;
+            }
+        }
+
+        return $manager;
+    }
+
+    /**
+     * Get the installation directory of the package.
+     *
+     * @param Composer         $composer   The composer instance
+     * @param PackageInterface $package    The package instance
+     * @param string|null      $installDir The custom installation directory
+     *
+     * @return string The installation directory
+     */
+    protected static function getInstallDir(Composer $composer, PackageInterface $package, $installDir = null)
+    {
+        if (null === $installDir) {
+            $installDir = rtrim($composer->getConfig()->get('vendor-dir'), '/').'/'.$package->getName();
+        }
+
+        return rtrim($installDir, '/');
+    }
+
+    /**
+     * Add ignore file patterns in the ignore manager.
+     *
+     * @param IgnoreManager $manager  The ignore files manager
+     * @param bool|array    $patterns The patterns for ignore files
+     */
+    protected static function addPatterns(IgnoreManager $manager, $patterns)
+    {
+        $enabled = false === $patterns ? false : true;
+        $manager->setEnabled($enabled);
+
+        if (is_array($patterns)) {
+            foreach ($patterns as $pattern) {
+                $manager->addPattern($pattern);
+            }
+        }
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Installer/IgnoreManager.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Installer/IgnoreManager.php
new file mode 100644 (file)
index 0000000..ca6db54
--- /dev/null
@@ -0,0 +1,196 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Installer;
+
+use Composer\Util\Filesystem;
+use Symfony\Component\Finder\Finder;
+use Symfony\Component\Finder\Glob;
+
+/**
+ * Manager of ignore patterns.
+ *
+ * @author Martin Hasoň <martin.hason@gmail.com>
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class IgnoreManager
+{
+    /**
+     * @var string
+     */
+    protected $installDir;
+
+    /**
+     * @var Filesystem
+     */
+    private $filesystem;
+
+    /**
+     * @var bool
+     */
+    protected $enabled;
+
+    /**
+     * @var bool
+     */
+    protected $hasPattern;
+
+    /**
+     * @var Finder
+     */
+    private $finder;
+
+    /**
+     * Constructor.
+     *
+     * @param string          $installDir The install dir
+     * @param Filesystem|null $filesystem The filesystem
+     */
+    public function __construct($installDir, Filesystem $filesystem = null)
+    {
+        $this->installDir = $installDir;
+        $this->filesystem = $filesystem ?: new Filesystem();
+        $this->enabled = true;
+        $this->hasPattern = false;
+        $this->finder = Finder::create()->ignoreVCS(true)->ignoreDotFiles(false);
+    }
+
+    /**
+     * Enable or not this ignore files manager.
+     *
+     * @param bool $enabled
+     *
+     * @return self
+     */
+    public function setEnabled($enabled)
+    {
+        $this->enabled = (bool) $enabled;
+
+        return $this;
+    }
+
+    /**
+     * Check if this ignore files manager is enabled.
+     *
+     * @return bool
+     */
+    public function isEnabled()
+    {
+        return $this->enabled;
+    }
+
+    /**
+     * Check if a pattern is added.
+     *
+     * @return bool
+     */
+    public function hasPattern()
+    {
+        return $this->hasPattern;
+    }
+
+    /**
+     * Adds an ignore pattern.
+     *
+     * @param string $pattern The pattern
+     */
+    public function addPattern($pattern)
+    {
+        $this->doAddPattern($this->convertPattern($pattern));
+        $this->hasPattern = true;
+    }
+
+    /**
+     * Deletes all files and directories that matches patterns.
+     */
+    public function cleanup()
+    {
+        if ($this->isEnabled() && $this->hasPattern() && realpath($this->installDir)) {
+            $paths = iterator_to_array($this->finder->in($this->installDir));
+
+            /* @var \SplFileInfo $path */
+            foreach ($paths as $path) {
+                $this->filesystem->remove($path);
+            }
+        }
+    }
+
+    /**
+     * Action for Add an ignore pattern.
+     *
+     * @param string $pattern The pattern
+     */
+    public function doAddPattern($pattern)
+    {
+        if (0 === strpos($pattern, '!')) {
+            $searchPattern = substr($pattern, 1);
+            $this->finder->notPath(Glob::toRegex($searchPattern, true, true));
+
+            $pathComponents = explode('/', $searchPattern);
+
+            if (1 < count($pathComponents)) {
+                $parentDirectories = array_slice($pathComponents, 0, -1);
+                $basePath = '';
+
+                foreach ($parentDirectories as $dir) {
+                    $this->finder->notPath('/\b('.preg_quote($basePath.$dir, '/').')(?!\/)\b/');
+                    $basePath .= $dir.'/';
+                }
+            }
+        } else {
+            $this->finder->path(Glob::toRegex($pattern, true, true));
+        }
+    }
+
+    /**
+     * Converter pattern to glob.
+     *
+     * @param string $pattern The pattern
+     *
+     * @return string The pattern converted
+     */
+    protected function convertPattern($pattern)
+    {
+        $prefix = 0 === strpos($pattern, '!') ? '!' : '';
+        $searchPattern = trim(ltrim($pattern, '!'), '/');
+        $pattern = $prefix.$searchPattern;
+
+        if (in_array($searchPattern, array('*', '*.*'))) {
+            $this->doAddPattern($prefix.'.*');
+        } elseif (0 === strpos($searchPattern, '**/')) {
+            $this->doAddPattern($prefix.'**/'.$searchPattern);
+            $this->doAddPattern($prefix.substr($searchPattern, 3));
+        } else {
+            $this->convertPatternStep2($prefix, $searchPattern, $pattern);
+        }
+
+        return $pattern;
+    }
+
+    /**
+     * Step2: Converter pattern to glob.
+     *
+     * @param string $prefix        The prefix
+     * @param string $searchPattern The search pattern
+     * @param string $pattern       The pattern
+     */
+    protected function convertPatternStep2($prefix, $searchPattern, $pattern)
+    {
+        if ('.*' === $searchPattern) {
+            $this->doAddPattern($prefix.'**/.*');
+        } elseif ('**' === $searchPattern) {
+            $this->finder->path('/.*/');
+            $this->finder->notPath('/^\..*(?!\/)/');
+        } elseif (preg_match('/\/\*$|\/\*\*$/', $pattern, $matches)) {
+            $this->doAddPattern(substr($pattern, 0, strlen($pattern) - strlen($matches[0])));
+        }
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/LICENSE b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/LICENSE
new file mode 100644 (file)
index 0000000..5d2dd4c
--- /dev/null
@@ -0,0 +1,19 @@
+Copyright (c) 2014-2017 François Pluchino
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is furnished
+to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Package/AbstractLazyCompletePackage.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Package/AbstractLazyCompletePackage.php
new file mode 100644 (file)
index 0000000..6edf11d
--- /dev/null
@@ -0,0 +1,221 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Package;
+
+use Composer\Package\CompletePackage;
+use Fxp\Composer\AssetPlugin\Package\Loader\LazyLoaderInterface;
+
+/**
+ * Abstract class for the lazy loading complete package.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+abstract class AbstractLazyCompletePackage extends CompletePackage implements LazyPackageInterface
+{
+    /**
+     * @var LazyLoaderInterface
+     */
+    protected $lazyLoader;
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getAutoload()
+    {
+        $this->initialize();
+
+        return parent::getAutoload();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getDevAutoload()
+    {
+        $this->initialize();
+
+        return parent::getDevAutoload();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getIncludePaths()
+    {
+        $this->initialize();
+
+        return parent::getIncludePaths();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getNotificationUrl()
+    {
+        $this->initialize();
+
+        return parent::getNotificationUrl();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getArchiveExcludes()
+    {
+        $this->initialize();
+
+        return parent::getArchiveExcludes();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getScripts()
+    {
+        $this->initialize();
+
+        return parent::getScripts();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getRepositories()
+    {
+        $this->initialize();
+
+        return parent::getRepositories();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getLicense()
+    {
+        $this->initialize();
+
+        return parent::getLicense();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getKeywords()
+    {
+        $this->initialize();
+
+        return parent::getKeywords();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getAuthors()
+    {
+        $this->initialize();
+
+        return parent::getAuthors();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getDescription()
+    {
+        $this->initialize();
+
+        return parent::getDescription();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getHomepage()
+    {
+        $this->initialize();
+
+        return parent::getHomepage();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getSupport()
+    {
+        $this->initialize();
+
+        return parent::getSupport();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setLoader(LazyLoaderInterface $lazyLoader)
+    {
+        $this->lazyLoader = $lazyLoader;
+    }
+
+    /**
+     * Initialize the package.
+     */
+    protected function initialize()
+    {
+        if (!$this->lazyLoader) {
+            return;
+        }
+
+        $real = $this->lazyLoader->load($this);
+        $this->lazyLoader = null;
+
+        if (false === $real) {
+            $this->version = '-9999999.9999999.9999999.9999999';
+
+            return;
+        }
+
+        $this->type = $real->getType();
+        $this->transportOptions = $real->getTransportOptions();
+        $this->targetDir = $real->getTargetDir();
+        $this->extra = $real->getExtra();
+        $this->binaries = $real->getBinaries();
+        $this->installationSource = $real->getInstallationSource();
+        $this->sourceType = $real->getSourceType();
+        $this->sourceUrl = $real->getSourceUrl();
+        $this->sourceReference = $real->getSourceReference();
+        $this->sourceMirrors = $real->getSourceMirrors();
+        $this->distType = $real->getDistType();
+        $this->distUrl = $real->getDistUrl();
+        $this->distReference = $real->getDistReference();
+        $this->distSha1Checksum = $real->getDistSha1Checksum();
+        $this->distMirrors = $real->getDistMirrors();
+        $this->releaseDate = $real->getReleaseDate();
+        $this->requires = $real->getRequires();
+        $this->conflicts = $real->getConflicts();
+        $this->provides = $real->getProvides();
+        $this->replaces = $real->getReplaces();
+        $this->devRequires = $real->getDevRequires();
+        $this->suggests = $real->getSuggests();
+        $this->autoload = $real->getAutoload();
+        $this->devAutoload = $real->getDevAutoload();
+        $this->includePaths = $real->getIncludePaths();
+        $this->notificationUrl = $real->getNotificationUrl();
+        $this->archiveExcludes = $real->getArchiveExcludes();
+        $this->scripts = $real->getScripts();
+        $this->repositories = $real->getRepositories();
+        $this->license = $real->getLicense();
+        $this->keywords = $real->getKeywords();
+        $this->authors = $real->getAuthors();
+        $this->description = $real->getDescription();
+        $this->homepage = $real->getHomepage();
+        $this->support = $real->getSupport();
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Package/LazyCompletePackage.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Package/LazyCompletePackage.php
new file mode 100644 (file)
index 0000000..85aec22
--- /dev/null
@@ -0,0 +1,230 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Package;
+
+/**
+ * The lazy loading complete package.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class LazyCompletePackage extends AbstractLazyCompletePackage implements LazyPackageInterface
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function getTransportOptions()
+    {
+        $this->initialize();
+
+        return parent::getTransportOptions();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getTargetDir()
+    {
+        $this->initialize();
+
+        return parent::getTargetDir();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getExtra()
+    {
+        $this->initialize();
+
+        return parent::getExtra();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getBinaries()
+    {
+        $this->initialize();
+
+        return parent::getBinaries();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getInstallationSource()
+    {
+        $this->initialize();
+
+        return parent::getInstallationSource();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getSourceType()
+    {
+        $this->initialize();
+
+        return parent::getSourceType();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getSourceUrl()
+    {
+        $this->initialize();
+
+        return parent::getSourceUrl();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getSourceReference()
+    {
+        $this->initialize();
+
+        return parent::getSourceReference();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getSourceMirrors()
+    {
+        $this->initialize();
+
+        return parent::getSourceMirrors();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getSourceUrls()
+    {
+        $this->initialize();
+
+        return parent::getSourceUrls();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getDistType()
+    {
+        $this->initialize();
+
+        return parent::getDistType();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getDistUrl()
+    {
+        $this->initialize();
+
+        return parent::getDistUrl();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getDistReference()
+    {
+        $this->initialize();
+
+        return parent::getDistReference();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getDistSha1Checksum()
+    {
+        $this->initialize();
+
+        return parent::getDistSha1Checksum();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getDistMirrors()
+    {
+        $this->initialize();
+
+        return parent::getDistMirrors();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getDistUrls()
+    {
+        $this->initialize();
+
+        return parent::getDistUrls();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getReleaseDate()
+    {
+        $this->initialize();
+
+        return parent::getReleaseDate();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getRequires()
+    {
+        $this->initialize();
+
+        return parent::getRequires();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getConflicts()
+    {
+        $this->initialize();
+
+        return parent::getConflicts();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getDevRequires()
+    {
+        $this->initialize();
+
+        return parent::getDevRequires();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getSuggests()
+    {
+        $this->initialize();
+
+        return parent::getSuggests();
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Package/LazyPackageInterface.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Package/LazyPackageInterface.php
new file mode 100644 (file)
index 0000000..426584d
--- /dev/null
@@ -0,0 +1,30 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Package;
+
+use Composer\Package\CompletePackageInterface;
+use Fxp\Composer\AssetPlugin\Package\Loader\LazyLoaderInterface;
+
+/**
+ * Interface for lazy loading package.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+interface LazyPackageInterface extends CompletePackageInterface
+{
+    /**
+     * Sets the lazy loader.
+     *
+     * @param LazyLoaderInterface $lazyLoader
+     */
+    public function setLoader(LazyLoaderInterface $lazyLoader);
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Package/Loader/LazyAssetPackageLoader.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Package/Loader/LazyAssetPackageLoader.php
new file mode 100644 (file)
index 0000000..04d961e
--- /dev/null
@@ -0,0 +1,281 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Package\Loader;
+
+use Composer\Downloader\TransportException;
+use Composer\IO\IOInterface;
+use Composer\Package\CompletePackageInterface;
+use Composer\Package\Loader\LoaderInterface;
+use Composer\Repository\Vcs\VcsDriverInterface;
+use Fxp\Composer\AssetPlugin\Exception\InvalidArgumentException;
+use Fxp\Composer\AssetPlugin\Package\LazyPackageInterface;
+use Fxp\Composer\AssetPlugin\Repository\AssetRepositoryManager;
+use Fxp\Composer\AssetPlugin\Type\AssetTypeInterface;
+
+/**
+ * Lazy loader for asset package.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class LazyAssetPackageLoader implements LazyLoaderInterface
+{
+    /**
+     * @var string
+     */
+    protected $type;
+
+    /**
+     * @var string
+     */
+    protected $identifier;
+
+    /**
+     * @var array
+     */
+    protected $packageData;
+
+    /**
+     * @var AssetTypeInterface
+     */
+    protected $assetType;
+
+    /**
+     * @var LoaderInterface
+     */
+    protected $loader;
+
+    /**
+     * @var VcsDriverInterface
+     */
+    protected $driver;
+
+    /**
+     * @var IOInterface
+     */
+    protected $io;
+
+    /**
+     * @var AssetRepositoryManager
+     */
+    protected $assetRepositoryManager;
+
+    /**
+     * @var bool
+     */
+    protected $verbose;
+
+    /**
+     * @var array
+     */
+    protected $cache;
+
+    /**
+     * Constructor.
+     *
+     * @param string $identifier
+     * @param string $type
+     * @param array  $packageData
+     */
+    public function __construct($type, $identifier, array $packageData)
+    {
+        $this->identifier = $identifier;
+        $this->type = $type;
+        $this->packageData = $packageData;
+        $this->verbose = false;
+        $this->cache = array();
+    }
+
+    /**
+     * Sets the asset type.
+     *
+     * @param AssetTypeInterface $assetType
+     */
+    public function setAssetType(AssetTypeInterface $assetType)
+    {
+        $this->assetType = $assetType;
+    }
+
+    /**
+     * Sets the laoder.
+     *
+     * @param LoaderInterface $loader
+     */
+    public function setLoader(LoaderInterface $loader)
+    {
+        $this->loader = $loader;
+    }
+
+    /**
+     * Sets the driver.
+     *
+     * @param VcsDriverInterface $driver
+     */
+    public function setDriver(VcsDriverInterface $driver)
+    {
+        $this->driver = $driver;
+    }
+
+    /**
+     * Sets the IO.
+     *
+     * @param IOInterface $io
+     */
+    public function setIO(IOInterface $io)
+    {
+        $this->io = $io;
+        $this->verbose = $io->isVerbose();
+    }
+
+    /**
+     * Sets the asset repository manager.
+     *
+     * @param AssetRepositoryManager $assetRepositoryManager The asset repository manager
+     */
+    public function setAssetRepositoryManager(AssetRepositoryManager $assetRepositoryManager)
+    {
+        $this->assetRepositoryManager = $assetRepositoryManager;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function load(LazyPackageInterface $package)
+    {
+        if (isset($this->cache[$package->getUniqueName()])) {
+            return $this->cache[$package->getUniqueName()];
+        }
+        $this->validateConfig();
+
+        $filename = $this->assetType->getFilename();
+        $msg = 'Reading '.$filename.' of <info>'.$package->getName().'</info> (<comment>'.$package->getPrettyVersion().'</comment>)';
+        if ($this->verbose) {
+            $this->io->write($msg);
+        } else {
+            $this->io->overwrite($msg, false);
+        }
+
+        $realPackage = $this->loadRealPackage($package);
+        $this->cache[$package->getUniqueName()] = $realPackage;
+
+        if (!$this->verbose) {
+            $this->io->overwrite('', false);
+        }
+
+        return $realPackage;
+    }
+
+    /**
+     * Validates the class config.
+     *
+     * @throws InvalidArgumentException When the property of this class is not defined
+     */
+    protected function validateConfig()
+    {
+        foreach (array('assetType', 'loader', 'driver', 'io') as $property) {
+            if (null === $this->$property) {
+                throw new InvalidArgumentException(sprintf('The "%s" property must be defined', $property));
+            }
+        }
+    }
+
+    /**
+     * Loads the real package.
+     *
+     * @param LazyPackageInterface $package
+     *
+     * @return CompletePackageInterface|false
+     */
+    protected function loadRealPackage(LazyPackageInterface $package)
+    {
+        $realPackage = false;
+
+        try {
+            $data = $this->driver->getComposerInformation($this->identifier);
+            $valid = is_array($data);
+            $data = $this->preProcess($this->driver, $this->validateData($data), $this->identifier);
+
+            if ($this->verbose) {
+                $this->io->write('Importing '.($valid ? '' : 'empty ').$this->type.' '.$data['version'].' ('.$data['version_normalized'].')');
+            }
+
+            /* @var CompletePackageInterface $realPackage */
+            $realPackage = $this->loader->load($data);
+        } catch (\Exception $e) {
+            if ($this->verbose) {
+                $filename = $this->assetType->getFilename();
+                $this->io->write('<'.$this->getIoTag().'>Skipped '.$this->type.' '.$package->getPrettyVersion().', '.($e instanceof TransportException ? 'no '.$filename.' file was found' : $e->getMessage()).'</'.$this->getIoTag().'>');
+            }
+        }
+        $this->driver->cleanup();
+
+        return $realPackage;
+    }
+
+    /**
+     * @param array|bool $data
+     *
+     * @return array
+     */
+    protected function validateData($data)
+    {
+        return is_array($data) ? $data : array();
+    }
+
+    /**
+     * Gets the tag name for IO.
+     *
+     * @return string
+     */
+    protected function getIoTag()
+    {
+        return 'branch' === $this->type ? 'error' : 'warning';
+    }
+
+    /**
+     * Pre process the data of package before the conversion to Package instance.
+     *
+     * @param VcsDriverInterface $driver
+     * @param array              $data
+     * @param string             $identifier
+     *
+     * @return array
+     */
+    protected function preProcess(VcsDriverInterface $driver, array $data, $identifier)
+    {
+        $vcsRepos = array();
+        $data = array_merge($data, $this->packageData);
+        $data = $this->assetType->getPackageConverter()->convert($data, $vcsRepos);
+
+        $this->addRepositories($vcsRepos);
+
+        if (!isset($data['dist'])) {
+            $data['dist'] = $driver->getDist($identifier);
+        }
+        if (!isset($data['source'])) {
+            $data['source'] = $driver->getSource($identifier);
+        }
+
+        return $this->assetRepositoryManager->solveResolutions((array) $data);
+    }
+
+    /**
+     * Dispatches the vcs repositories event.
+     *
+     * @param array $vcsRepositories
+     */
+    protected function addRepositories(array $vcsRepositories)
+    {
+        if (null !== $this->assetRepositoryManager) {
+            $this->assetRepositoryManager->addRepositories($vcsRepositories);
+        }
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Package/Loader/LazyLoaderInterface.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Package/Loader/LazyLoaderInterface.php
new file mode 100644 (file)
index 0000000..d26312c
--- /dev/null
@@ -0,0 +1,31 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Package\Loader;
+
+use Fxp\Composer\AssetPlugin\Package\LazyPackageInterface;
+
+/**
+ * Interface for lazy loader package.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+interface LazyLoaderInterface
+{
+    /**
+     * Loads the real package.
+     *
+     * @param LazyPackageInterface $package
+     *
+     * @return \Composer\Package\CompletePackageInterface|false
+     */
+    public function load(LazyPackageInterface $package);
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Package/Version/VersionParser.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Package/Version/VersionParser.php
new file mode 100644 (file)
index 0000000..a35bb7e
--- /dev/null
@@ -0,0 +1,36 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Package\Version;
+
+use Composer\Package\Version\VersionParser as BaseVersionParser;
+
+/**
+ * Lazy loader for asset package.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class VersionParser extends BaseVersionParser
+{
+    /**
+     * Returns the stability of a version.
+     *
+     * @param string $version
+     *
+     * @return string
+     */
+    public static function parseStability($version)
+    {
+        $stability = parent::parseStability($version);
+
+        return false !== strpos($version, '-patch') ? 'dev' : $stability;
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/README.md b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/README.md
new file mode 100644 (file)
index 0000000..59a2cc1
--- /dev/null
@@ -0,0 +1,121 @@
+NPM/Bower Dependency Manager for Composer
+=========================================
+
+[![Latest Version](https://img.shields.io/packagist/v/fxp/composer-asset-plugin.svg)](https://packagist.org/packages/fxp/composer-asset-plugin)
+[![Build Status](https://img.shields.io/travis/fxpio/composer-asset-plugin/master.svg)](https://travis-ci.org/fxpio/composer-asset-plugin)
+[![Coverage Status](https://img.shields.io/coveralls/fxpio/composer-asset-plugin/master.svg)](https://coveralls.io/r/fxpio/composer-asset-plugin?branch=master)
+[![Scrutinizer Code Quality](https://img.shields.io/scrutinizer/g/fxpio/composer-asset-plugin.svg)](https://scrutinizer-ci.com/g/fxpio/composer-asset-plugin?branch=master)
+[![SensioLabsInsight](https://img.shields.io/sensiolabs/i/0d67ca33-5a72-46b8-b109-cfbf95673fce.svg)](https://insight.sensiolabs.com/projects/0d67ca33-5a72-46b8-b109-cfbf95673fce)
+[![Packagist Downloads](https://img.shields.io/packagist/dt/fxp/composer-asset-plugin.svg)](https://packagist.org/packages/fxp/composer-asset-plugin/stats)
+
+The Composer Asset Plugin allows you to manage project assets (css, js, etc.) in your `composer.json`
+without installing NPM or Bower.
+
+This plugin works by transposing package information from NPM or Bower to a compatible version for Composer.
+This allows you to manage asset dependencies in a PHP based project very easily.
+
+
+##### Features include:
+
+- Works with native management system versions of VCS repository of composer
+- Works with public and private VCS repositories
+- Lazy loader of asset package definitions to improve performance
+- Import filter with the dependencies of the root package and the installed packages, for increased dramatically the performance for the update
+- Automatically get and create an Asset VCS repository defined in:
+  - [NPM Registry](https://www.npmjs.org)
+  - [Bower Registry](http://bower.io/search)
+  - [Private Bower Registry](https://github.com/Hacklone/private-bower)
+- Automatically get and create the Asset VCS repositories of dependencies defined
+  in each asset package (dev dependencies included)
+- Mapping conversion of asset package to composer package for:
+  - [NPM Package](https://www.npmjs.org/doc/package.json.html) - [package.json](Resources/doc/schema.md#npm-mapping)
+  - [Bower Package](http://bower.io/docs/creating-packages) - [bower.json](Resources/doc/schema.md#bower-mapping)
+- Conversion of [Semver version](Resources/doc/schema.md#verison-conversion) to the composer version
+- Conversion of [Semver range version](Resources/doc/schema.md#range-verison-conversion) to the composer range version
+- Conversion of [dependencies with URL](Resources/doc/schema.md#url-range-verison-conversion) to the composer dependencies with the creation of VCS repositories
+- Conversion of [multiple versions of the same dependency](Resources/doc/schema.md#multiple-version-of-depdendency-in-the-same-project) to different dependencies of composer
+- Add manually the [multiple versions of a same dependency in the project](Resources/doc/index.md#usage-with-multiple-version-of-a-same-dependency)
+- Add a [custom config of VCS Repository](Resources/doc/index.md#usage-with-vcs-repository)
+- Override the [config of VCS Repository](Resources/doc/index.md#overriding-the-config-of-a-vcs-repository) defined by the asset registry directly in config section of root composer
+- VCS drivers for:
+  - [Git](Resources/doc/index.md#usage-with-vcs-repository)
+  - [GitHub](Resources/doc/index.md#usage-with-vcs-repository) (compatible with repository redirects)
+  - [Git Bitbucket](Resources/doc/index.md#usage-with-vcs-repository)
+  - [Mercurial](Resources/doc/index.md#usage-with-vcs-repository)
+  - [Mercurial Bitbucket](Resources/doc/index.md#usage-with-vcs-repository)
+  - [SVN](Resources/doc/index.md#usage-with-vcs-repository)
+  - [Perforce](Resources/doc/index.md#usage-with-vcs-repository)
+- Local cache system for:
+  - package versions
+  - package contents
+  - repository redirects
+- Custom asset installers configurable in the root file `composer.json`
+- For Bower, all files defined in the section `ignore` will not be installed
+- Disable or replace the deleting of the ignore files for Bower
+- Enable manually the deleting of the ignore files for NPM
+- Use the Ignore Files Manager in the Composer scripts
+- Configure the plugin per project, globally or with the environment variables
+- Compatible with all commands, including:
+  - `depends`
+  - `diagnose`
+  - `licenses`
+  - `remove`
+  - `require`
+  - `search` (bower only)
+  - `show`
+  - `status`
+
+##### Why this plugin?
+
+There already are several possibilities for managing assets in a PHP project:
+
+1. Install Node.js and use NPM or Bower command line in addition to Composer command line
+2. Do #1, but add Composer scripts to automate the process
+3. Include assets directly in the project (not recommended)
+4. Create a repository with all assets and include the `composer.json` file (and use Packagist or an VCS Repository)
+5. Add a package repository in `composer.json` with a direct download link
+6. Create a Satis or Packagist server
+7. Other?
+
+It goes without saying that each javascript, CSS, etc. library should be developed with the usual tools for that
+language, which front-end developers know well. However, in the case of a complete project in PHP, it shouldn't 
+be necessary to use several tools (PHP, Nodejs, Composer, NPM, Bower, Grunt, etc.) to simply install
+these assets in your project.
+
+This plugin has been created to address these issues. Additionally, most developers will not add a `composer.json`
+file to their projects just to support php based projects, especially when npm and/or bower already exist and are
+widely used.
+
+Documentation
+-------------
+
+The bulk of the documentation is located in `Resources/doc/index.md`:
+
+[Read the Documentation](Resources/doc/index.md)
+
+[Read the FAQs](Resources/doc/faqs.md)
+
+[Read the Release Notes](https://github.com/fxpio/composer-asset-plugin/releases)
+
+Installation
+------------
+
+All the installation instructions are located in [documentation](Resources/doc/index.md).
+
+License
+-------
+
+This composer plugin is under the MIT license. See the complete license in:
+
+[LICENSE](LICENSE)
+
+About
+-----
+
+Fxp Composer Asset Plugin is a [François Pluchino](https://github.com/francoispluchino) initiative.
+See also the list of [contributors](https://github.com/fxpio/composer-asset-plugin/contributors).
+
+Reporting an issue or a feature request
+---------------------------------------
+
+Issues and feature requests are tracked in the [Github issue tracker](https://github.com/fxpio/composer-asset-plugin/issues).
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Repository/AbstractAssetVcsRepository.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Repository/AbstractAssetVcsRepository.php
new file mode 100644 (file)
index 0000000..6a60547
--- /dev/null
@@ -0,0 +1,301 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Repository;
+
+use Composer\Config;
+use Composer\EventDispatcher\EventDispatcher;
+use Composer\IO\IOInterface;
+use Composer\Package\AliasPackage;
+use Composer\Package\Loader\ArrayLoader;
+use Composer\Package\Loader\LoaderInterface;
+use Composer\Package\Package;
+use Composer\Package\PackageInterface;
+use Composer\Repository\Vcs\VcsDriverInterface;
+use Composer\Repository\VcsRepository;
+use Fxp\Composer\AssetPlugin\Assets;
+use Fxp\Composer\AssetPlugin\Converter\SemverConverter;
+use Fxp\Composer\AssetPlugin\Exception\InvalidArgumentException;
+use Fxp\Composer\AssetPlugin\Package\Loader\LazyAssetPackageLoader;
+use Fxp\Composer\AssetPlugin\Package\Version\VersionParser;
+use Fxp\Composer\AssetPlugin\Type\AssetTypeInterface;
+
+/**
+ * Abstract class for Asset VCS repository.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+abstract class AbstractAssetVcsRepository extends VcsRepository
+{
+    /**
+     * @var AssetTypeInterface
+     */
+    protected $assetType;
+
+    /**
+     * @var VersionParser
+     */
+    protected $versionParser;
+
+    /**
+     * @var AssetRepositoryManager
+     */
+    protected $assetRepositoryManager;
+
+    /**
+     * @var LoaderInterface
+     */
+    protected $loader;
+
+    /**
+     * @var string
+     */
+    protected $rootPackageVersion;
+
+    /**
+     * @var array|null
+     */
+    protected $rootData;
+
+    /**
+     * @var VcsPackageFilter|null
+     */
+    protected $filter;
+
+    /**
+     * Constructor.
+     *
+     * @param array           $repoConfig
+     * @param IOInterface     $io
+     * @param Config          $config
+     * @param EventDispatcher $dispatcher
+     * @param array           $drivers
+     */
+    public function __construct(array $repoConfig, IOInterface $io, Config $config, EventDispatcher $dispatcher = null, array $drivers = null)
+    {
+        $drivers = $drivers ?: Assets::getVcsDrivers();
+        $assetType = substr($repoConfig['type'], 0, strpos($repoConfig['type'], '-'));
+        $assetType = Assets::createType($assetType);
+        $repoConfig['asset-type'] = $assetType->getName();
+        $repoConfig['package-name'] = $assetType->formatComposerName($repoConfig['name']);
+        $repoConfig['filename'] = $assetType->getFilename();
+        $this->assetType = $assetType;
+        $this->assetRepositoryManager = isset($repoConfig['asset-repository-manager'])
+                && $repoConfig['asset-repository-manager'] instanceof AssetRepositoryManager
+            ? $repoConfig['asset-repository-manager']
+            : null;
+        $this->filter = isset($repoConfig['vcs-package-filter'])
+                && $repoConfig['vcs-package-filter'] instanceof VcsPackageFilter
+            ? $repoConfig['vcs-package-filter']
+            : null;
+
+        parent::__construct($repoConfig, $io, $config, $dispatcher, $drivers);
+    }
+
+    /**
+     * Gets the package name of this repository.
+     *
+     * @return string
+     */
+    public function getComposerPackageName()
+    {
+        if (null === $this->packages) {
+            $this->initialize();
+        }
+
+        return $this->assetType->formatComposerName($this->packageName);
+    }
+
+    /**
+     * Initializes the driver.
+     *
+     * @return VcsDriverInterface
+     *
+     * @throws InvalidArgumentException When not driver found
+     */
+    protected function initDriver()
+    {
+        $driver = $this->getDriver();
+        if (!$driver) {
+            throw new InvalidArgumentException('No driver found to handle Asset VCS repository '.$this->url);
+        }
+
+        return $driver;
+    }
+
+    /**
+     * Initializes the version parser and loader.
+     */
+    protected function initLoader()
+    {
+        $this->versionParser = new VersionParser();
+
+        if (!$this->loader) {
+            $this->loader = new ArrayLoader($this->versionParser);
+        }
+    }
+
+    /**
+     * Initializes the root identifier.
+     *
+     * @param VcsDriverInterface $driver
+     */
+    protected function initRootIdentifier(VcsDriverInterface $driver)
+    {
+        try {
+            if ($driver->hasComposerFile($driver->getRootIdentifier())) {
+                $data = $driver->getComposerInformation($driver->getRootIdentifier());
+                $sc = new SemverConverter();
+                $this->rootPackageVersion = !empty($data['version'])
+                    ? $sc->convertVersion(ltrim($data['version'], '^~')) : null;
+                $this->rootData = $data;
+
+                if (null === $this->packageName) {
+                    $this->packageName = !empty($data['name']) ? $data['name'] : null;
+                }
+            }
+        } catch (\Exception $e) {
+            if ($this->verbose) {
+                $this->io->write('<error>Skipped parsing '.$driver->getRootIdentifier().', '.$e->getMessage().'</error>');
+            }
+        }
+    }
+
+    /**
+     * Creates the package name with the composer prefix and the asset package name,
+     * or only with the URL.
+     *
+     * @return string The package name
+     */
+    protected function createPackageName()
+    {
+        if (null === $this->packageName) {
+            return $this->url;
+        }
+
+        return sprintf('%s/%s', $this->assetType->getComposerVendorName(), $this->packageName);
+    }
+
+    /**
+     * Creates the mock of package config.
+     *
+     * @param string $name    The package name
+     * @param string $version The version
+     *
+     * @return array The package config
+     */
+    protected function createMockOfPackageConfig($name, $version)
+    {
+        return array(
+            'name' => $name,
+            'version' => $version,
+            'type' => $this->assetType->getComposerType(),
+        );
+    }
+
+    /**
+     * Creates the lazy loader of package.
+     *
+     * @param string             $type
+     * @param string             $identifier
+     * @param array              $packageData
+     * @param VcsDriverInterface $driver
+     *
+     * @return LazyAssetPackageLoader
+     */
+    protected function createLazyLoader($type, $identifier, array $packageData, VcsDriverInterface $driver)
+    {
+        $lazyLoader = new LazyAssetPackageLoader($type, $identifier, $packageData);
+        $lazyLoader->setAssetType($this->assetType);
+        $lazyLoader->setLoader($this->loader);
+        $lazyLoader->setDriver(clone $driver);
+        $lazyLoader->setIO($this->io);
+        $lazyLoader->setAssetRepositoryManager($this->assetRepositoryManager);
+
+        return $lazyLoader;
+    }
+
+    /**
+     * Pre process the data of package before the conversion to Package instance.
+     *
+     * @param array $data
+     *
+     * @return array
+     */
+    protected function preProcessAsset(array $data)
+    {
+        $vcsRepos = array();
+
+        // keep the name of the main identifier for all packages
+        $data['name'] = $this->packageName ?: $data['name'];
+        $data = (array) $this->assetType->getPackageConverter()->convert($data, $vcsRepos);
+        $this->assetRepositoryManager->addRepositories($vcsRepos);
+
+        return $this->assetRepositoryManager->solveResolutions($data);
+    }
+
+    /**
+     * Override the branch alias extra config of the current package.
+     *
+     * @param PackageInterface $package         The current package
+     * @param string           $aliasNormalized The alias version normalizes
+     * @param string           $branch          The branch name
+     *
+     * @return PackageInterface
+     */
+    protected function overrideBranchAliasConfig(PackageInterface $package, $aliasNormalized, $branch)
+    {
+        if ($package instanceof Package && false === strpos('dev-', $aliasNormalized)) {
+            $extra = $package->getExtra();
+            $extra['branch-alias'] = array(
+                'dev-'.$branch => $this->rootPackageVersion.'-dev',
+            );
+            $this->injectExtraConfig($package, $extra);
+        }
+
+        return $package;
+    }
+
+    /**
+     * Add the alias packages.
+     *
+     * @param PackageInterface $package         The current package
+     * @param string           $aliasNormalized The alias version normalizes
+     *
+     * @return PackageInterface
+     */
+    protected function addPackageAliases(PackageInterface $package, $aliasNormalized)
+    {
+        $alias = new AliasPackage($package, $aliasNormalized, $this->rootPackageVersion);
+        $this->addPackage($alias);
+
+        if (false === strpos('dev-', $aliasNormalized)) {
+            $alias = new AliasPackage($package, $aliasNormalized.'-dev', $this->rootPackageVersion);
+            $this->addPackage($alias);
+        }
+
+        return $package;
+    }
+
+    /**
+     * Inject the overriding extra config in the current package.
+     *
+     * @param PackageInterface $package The package
+     * @param array            $extra   The new extra config
+     */
+    private function injectExtraConfig(PackageInterface $package, array $extra)
+    {
+        $ref = new \ReflectionClass($package);
+        $met = $ref->getProperty('extra');
+        $met->setAccessible(true);
+        $met->setValue($package, $extra);
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Repository/AbstractAssetsRepository.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Repository/AbstractAssetsRepository.php
new file mode 100644 (file)
index 0000000..938ba1e
--- /dev/null
@@ -0,0 +1,348 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Repository;
+
+use Composer\Config;
+use Composer\DependencyResolver\Pool;
+use Composer\Downloader\TransportException;
+use Composer\EventDispatcher\EventDispatcher;
+use Composer\IO\IOInterface;
+use Composer\Json\JsonFile;
+use Composer\Repository\ComposerRepository;
+use Composer\Repository\RepositoryManager;
+use Fxp\Composer\AssetPlugin\Assets;
+use Fxp\Composer\AssetPlugin\Type\AssetTypeInterface;
+
+/**
+ * Abstract assets repository.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+abstract class AbstractAssetsRepository extends ComposerRepository
+{
+    /**
+     * @var AssetTypeInterface
+     */
+    protected $assetType;
+
+    /**
+     * @var AssetVcsRepository[]
+     */
+    protected $repos;
+
+    /**
+     * @var bool
+     */
+    protected $searchable;
+
+    /**
+     * @var bool
+     */
+    protected $fallbackProviders;
+
+    /**
+     * @var RepositoryManager
+     */
+    protected $repositoryManager;
+
+    /**
+     * @var AssetRepositoryManager
+     */
+    protected $assetRepositoryManager;
+
+    /**
+     * @var VcsPackageFilter
+     */
+    protected $packageFilter;
+
+    /**
+     * Constructor.
+     *
+     * @param array           $repoConfig
+     * @param IOInterface     $io
+     * @param Config          $config
+     * @param EventDispatcher $eventDispatcher
+     */
+    public function __construct(array $repoConfig, IOInterface $io, Config $config, EventDispatcher $eventDispatcher = null)
+    {
+        $repoConfig = array_merge($repoConfig, array(
+            'url' => $this->getUrl(),
+        ));
+        $this->assetRepositoryManager = $repoConfig['asset-repository-manager'];
+        $this->repositoryManager = $this->assetRepositoryManager->getRepositoryManager();
+
+        parent::__construct($repoConfig, $io, $config, $eventDispatcher);
+
+        $this->assetType = Assets::createType($this->getType());
+        $this->lazyProvidersUrl = $this->getPackageUrl();
+        $this->providersUrl = $this->lazyProvidersUrl;
+        $this->searchUrl = $this->getSearchUrl();
+        $this->hasProviders = true;
+        $this->packageFilter = isset($repoConfig['vcs-package-filter'])
+            ? $repoConfig['vcs-package-filter']
+            : null;
+        $this->repos = array();
+        $this->searchable = (bool) $this->getOption($repoConfig['asset-options'], 'searchable', true);
+        $this->fallbackProviders = false;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function search($query, $mode = 0, $type = null)
+    {
+        if (!$this->searchable) {
+            return array();
+        }
+
+        $url = str_replace('%query%', urlencode(Util::cleanPackageName($query)), $this->searchUrl);
+        $hostname = (string) parse_url($url, PHP_URL_HOST) ?: $url;
+        $json = (string) $this->rfs->getContents($hostname, $url, false);
+        $data = JsonFile::parseJson($json, $url);
+        $results = array();
+
+        /* @var array $item */
+        foreach ($data as $item) {
+            $results[] = $this->createSearchItem($item);
+        }
+
+        return $results;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function whatProvides(Pool $pool, $name, $bypassFilters = false)
+    {
+        if (null !== $provides = $this->findWhatProvides($name)) {
+            return $provides;
+        }
+
+        try {
+            $repoName = Util::convertAliasName($name);
+            $packageName = Util::cleanPackageName($repoName);
+            $packageUrl = $this->buildPackageUrl($packageName);
+            $cacheName = $packageName.'-'.sha1($packageName).'-package.json';
+            $data = $this->fetchFile($packageUrl, $cacheName);
+            $repo = $this->createVcsRepositoryConfig($data, Util::cleanPackageName($name));
+            $repo['asset-repository-manager'] = $this->assetRepositoryManager;
+            $repo['vcs-package-filter'] = $this->packageFilter;
+            $repo['vcs-driver-options'] = Util::getArrayValue($this->repoConfig, 'vcs-driver-options', array());
+
+            Util::addRepository($this->io, $this->repositoryManager, $this->repos, $name, $repo, $pool);
+
+            $this->providers[$name] = array();
+        } catch (\Exception $ex) {
+            $this->whatProvidesManageException($pool, $name, $ex);
+        }
+
+        return $this->providers[$name];
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getMinimalPackages()
+    {
+        return array();
+    }
+
+    /**
+     * Build the package url.
+     *
+     * @param string $packageName The package name
+     *
+     * @return string
+     */
+    protected function buildPackageUrl($packageName)
+    {
+        return str_replace('%package%', $packageName, $this->lazyProvidersUrl);
+    }
+
+    /**
+     * Finds what provides in cache or return empty array if the
+     * name is not a asset package.
+     *
+     * @param string $name
+     *
+     * @return array|null
+     */
+    protected function findWhatProvides($name)
+    {
+        $assetPrefix = $this->assetType->getComposerVendorName().'/';
+
+        if (false === strpos($name, $assetPrefix)) {
+            return array();
+        }
+
+        if (isset($this->providers[$name])) {
+            return $this->providers[$name];
+        }
+
+        $data = null;
+        if ($this->hasVcsRepository($name)) {
+            $this->providers[$name] = array();
+            $data = $this->providers[$name];
+        }
+
+        return $data;
+    }
+
+    /**
+     * Checks if the package vcs repository is already include in repository manager.
+     *
+     * @param string $name The package name of the vcs repository
+     *
+     * @return bool
+     */
+    protected function hasVcsRepository($name)
+    {
+        foreach ($this->repositoryManager->getRepositories() as $mRepo) {
+            if ($mRepo instanceof AssetVcsRepository
+                    && $name === $mRepo->getComposerPackageName()) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function loadRootServerFile()
+    {
+        return array(
+            'providers' => array(),
+        );
+    }
+
+    /**
+     * Gets the option.
+     *
+     * @param array  $options The options
+     * @param string $key     The key
+     * @param mixed  $default The default value
+     *
+     * @return mixed The option value or default value if key is not found
+     */
+    protected function getOption(array $options, $key, $default = null)
+    {
+        if (array_key_exists($key, $options)) {
+            return $options[$key];
+        }
+
+        return $default;
+    }
+
+    /**
+     * Creates the search result item.
+     *
+     * @param array $item The item
+     *
+     * @return array An array('name' => '...', 'description' => '...')
+     */
+    protected function createSearchItem(array $item)
+    {
+        return array(
+            'name' => $this->assetType->getComposerVendorName().'/'.$item['name'],
+            'description' => null,
+        );
+    }
+
+    /**
+     * Manage exception for "whatProvides" method.
+     *
+     * @param Pool       $pool
+     * @param string     $name
+     * @param \Exception $exception
+     *
+     * @throws \Exception When exception is not a TransportException instance
+     */
+    protected function whatProvidesManageException(Pool $pool, $name, \Exception $exception)
+    {
+        if ($exception instanceof TransportException) {
+            $this->fallbackWathProvides($pool, $name, $exception);
+
+            return;
+        }
+
+        throw $exception;
+    }
+
+    /**
+     * Searchs if the registry has a package with the same name exists with a
+     * different camelcase.
+     *
+     * @param Pool               $pool
+     * @param string             $name
+     * @param TransportException $ex
+     */
+    protected function fallbackWathProvides(Pool $pool, $name, TransportException $ex)
+    {
+        $providers = array();
+
+        if (404 === $ex->getCode() && !$this->fallbackProviders) {
+            $this->fallbackProviders = true;
+            $repoName = Util::convertAliasName($name);
+            $results = $this->search($repoName);
+
+            foreach ($results as $item) {
+                if ($name === strtolower($item['name'])) {
+                    $providers = $this->whatProvides($pool, $item['name']);
+                    break;
+                }
+            }
+        }
+
+        $this->fallbackProviders = false;
+        $this->providers[$name] = $providers;
+    }
+
+    /**
+     * Gets the asset type name.
+     *
+     * @return string
+     */
+    abstract protected function getType();
+
+    /**
+     * Gets the URL of repository.
+     *
+     * @return string
+     */
+    abstract protected function getUrl();
+
+    /**
+     * Gets the URL for get the package information.
+     *
+     * @return string
+     */
+    abstract protected function getPackageUrl();
+
+    /**
+     * Gets the URL for get the search result.
+     *
+     * @return string
+     */
+    abstract protected function getSearchUrl();
+
+    /**
+     * Creates a config of vcs repository.
+     *
+     * @param array  $data         The repository config
+     * @param string $registryName The package name in asset registry
+     *
+     * @return array An array('type' => '...', 'url' => '...')
+     */
+    abstract protected function createVcsRepositoryConfig(array $data, $registryName = null);
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Repository/AssetRepositoryManager.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Repository/AssetRepositoryManager.php
new file mode 100644 (file)
index 0000000..0e8503c
--- /dev/null
@@ -0,0 +1,245 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Repository;
+
+use Composer\DependencyResolver\Pool;
+use Composer\IO\IOInterface;
+use Composer\Repository\RepositoryInterface;
+use Composer\Repository\RepositoryManager;
+use Fxp\Composer\AssetPlugin\Config\Config;
+
+/**
+ * The asset repository manager.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class AssetRepositoryManager
+{
+    /**
+     * @var IOInterface
+     */
+    protected $io;
+
+    /**
+     * @var RepositoryManager
+     */
+    protected $rm;
+
+    /**
+     * @var Config
+     */
+    protected $config;
+
+    /**
+     * @var VcsPackageFilter
+     */
+    protected $packageFilter;
+
+    /**
+     * @var Pool|null
+     */
+    protected $pool;
+
+    /**
+     * @var ResolutionManager
+     */
+    protected $resolutionManager;
+
+    /**
+     * @var RepositoryInterface[]
+     */
+    protected $repositories = array();
+
+    /**
+     * @var array
+     */
+    protected $poolRepositories = array();
+
+    /**
+     * Constructor.
+     *
+     * @param IOInterface       $io            The IO
+     * @param RepositoryManager $rm            The repository manager
+     * @param Config            $config        The asset config
+     * @param VcsPackageFilter  $packageFilter The package filter
+     */
+    public function __construct(IOInterface $io, RepositoryManager $rm, Config $config, VcsPackageFilter $packageFilter)
+    {
+        $this->io = $io;
+        $this->rm = $rm;
+        $this->config = $config;
+        $this->packageFilter = $packageFilter;
+    }
+
+    /**
+     * Get the repository manager.
+     *
+     * @return RepositoryManager
+     */
+    public function getRepositoryManager()
+    {
+        return $this->rm;
+    }
+
+    /**
+     * Get the asset config.
+     *
+     * @return Config
+     */
+    public function getConfig()
+    {
+        return $this->config;
+    }
+
+    /**
+     * Set the pool.
+     *
+     * @param Pool $pool The pool
+     *
+     * @return self
+     */
+    public function setPool(Pool $pool)
+    {
+        $this->pool = $pool;
+
+        foreach ($this->poolRepositories as $repo) {
+            $pool->addRepository($repo);
+        }
+
+        $this->poolRepositories = array();
+
+        return $this;
+    }
+
+    /**
+     * Set the dependency resolution manager.
+     *
+     * @param ResolutionManager $resolutionManager The dependency resolution manager
+     */
+    public function setResolutionManager(ResolutionManager $resolutionManager)
+    {
+        $this->resolutionManager = $resolutionManager;
+    }
+
+    /**
+     * Solve the dependency resolutions.
+     *
+     * @param array $data
+     *
+     * @return array
+     */
+    public function solveResolutions(array $data)
+    {
+        return null !== $this->resolutionManager
+            ? $this->resolutionManager->solveResolutions($data)
+            : $data;
+    }
+
+    /**
+     * Adds asset vcs repositories.
+     *
+     * @param array $repositories The repositories
+     *
+     * @throws \UnexpectedValueException When config of repository is not an array
+     * @throws \UnexpectedValueException When the config of repository has not a type defined
+     * @throws \UnexpectedValueException When the config of repository has an invalid type
+     */
+    public function addRepositories(array $repositories)
+    {
+        foreach ($repositories as $index => $repo) {
+            $this->validateRepositories($index, $repo);
+
+            if ('package' === $repo['type']) {
+                $name = $repo['package']['name'];
+            } else {
+                $name = is_int($index) ? preg_replace('{^https?://}i', '', $repo['url']) : $index;
+                $name = isset($repo['name']) ? $repo['name'] : $name;
+                $repo['asset-repository-manager'] = $this;
+                $repo['vcs-package-filter'] = $this->packageFilter;
+            }
+
+            $repoInstance = Util::addRepository($this->io, $this->rm, $this->repositories, $name, $repo, $this->pool);
+
+            if (null === $this->pool && $repoInstance instanceof RepositoryInterface) {
+                $this->poolRepositories[] = $repoInstance;
+            }
+        }
+    }
+
+    /**
+     * Validates the config of repositories.
+     *
+     * @param int|string  $index The index
+     * @param mixed|array $repo  The config repo
+     *
+     * @throws \UnexpectedValueException
+     */
+    protected function validateRepositories($index, $repo)
+    {
+        if (!is_array($repo)) {
+            throw new \UnexpectedValueException('Repository '.$index.' ('.json_encode($repo).') should be an array, '.gettype($repo).' given');
+        }
+        if (!isset($repo['type'])) {
+            throw new \UnexpectedValueException('Repository '.$index.' ('.json_encode($repo).') must have a type defined');
+        }
+
+        $this->validatePackageRepositories($index, $repo);
+        $this->validateVcsRepositories($index, $repo);
+    }
+
+    /**
+     * Validates the config of package repositories.
+     *
+     * @param int|string  $index The index
+     * @param mixed|array $repo  The config repo
+     *
+     * @throws \UnexpectedValueException
+     */
+    protected function validatePackageRepositories($index, $repo)
+    {
+        if ('package' !== $repo['type']) {
+            return;
+        }
+
+        if (!isset($repo['package'])) {
+            throw new \UnexpectedValueException('Repository '.$index.' ('.json_encode($repo).') must have a package definition"');
+        }
+
+        foreach (array('name', 'type', 'version', 'dist') as $key) {
+            if (!isset($repo['package'][$key])) {
+                throw new \UnexpectedValueException('Repository '.$index.' ('.json_encode($repo).') must have the "'.$key.'" key  in the package definition"');
+            }
+        }
+    }
+
+    /**
+     * Validates the config of vcs repositories.
+     *
+     * @param int|string  $index The index
+     * @param mixed|array $repo  The config repo
+     *
+     * @throws \UnexpectedValueException
+     */
+    protected function validateVcsRepositories($index, $repo)
+    {
+        if ('package' === $repo['type']) {
+            return;
+        }
+
+        if (false === strpos($repo['type'], '-')) {
+            throw new \UnexpectedValueException('Repository '.$index.' ('.json_encode($repo).') must have a type defined in this way: "%asset-type%-%type%"');
+        }
+        if (!isset($repo['url'])) {
+            throw new \UnexpectedValueException('Repository '.$index.' ('.json_encode($repo).') must have a url defined');
+        }
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Repository/AssetVcsRepository.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Repository/AssetVcsRepository.php
new file mode 100644 (file)
index 0000000..14bb6f2
--- /dev/null
@@ -0,0 +1,304 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Repository;
+
+use Composer\Package\AliasPackage;
+use Composer\Package\BasePackage;
+use Composer\Package\CompletePackageInterface;
+use Composer\Package\Loader\ArrayLoader;
+use Composer\Package\PackageInterface;
+use Composer\Repository\InvalidRepositoryException;
+use Composer\Repository\Vcs\VcsDriverInterface;
+use Fxp\Composer\AssetPlugin\Package\LazyCompletePackage;
+use Fxp\Composer\AssetPlugin\Package\Version\VersionParser;
+use Fxp\Composer\AssetPlugin\Util\Validator;
+
+/**
+ * Asset VCS repository.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class AssetVcsRepository extends AbstractAssetVcsRepository
+{
+    /**
+     * {@inheritdoc}
+     */
+    protected function initialize()
+    {
+        $this->packages = array();
+        $this->packageName = isset($this->repoConfig['name']) ? Util::cleanPackageName($this->repoConfig['name']) : null;
+        $this->initLoader();
+        $this->initRegistryVersions();
+        $this->initFullDriver();
+
+        if (!$this->getPackages()) {
+            throw new InvalidRepositoryException('No valid '.$this->assetType->getFilename().' was found in any branch or tag of '.$this->url.', could not load a package from it.');
+        }
+    }
+
+    /**
+     * Init the driver with branches and tags.
+     */
+    protected function initFullDriver()
+    {
+        try {
+            $driver = $this->initDriver();
+            $this->initRootIdentifier($driver);
+            $this->initTags($driver);
+            $this->initBranches($driver);
+            $driver->cleanup();
+        } catch (\Exception $e) {
+            // do nothing
+        }
+    }
+
+    /**
+     * Initializes all tags.
+     *
+     * @param VcsDriverInterface $driver
+     */
+    protected function initTags(VcsDriverInterface $driver)
+    {
+        foreach ($driver->getTags() as $tag => $identifier) {
+            $packageName = $this->createPackageName();
+            // strip the release- prefix from tags if present
+            $tag = str_replace(array('release-', 'version/'), '', $tag);
+
+            $this->initTag($driver, $packageName, $tag, $identifier);
+        }
+
+        if (!$this->verbose) {
+            $this->io->overwrite('', false);
+        }
+    }
+
+    /**
+     * Initializes the tag: check if tag must be skipped and validate the tag.
+     *
+     * @param VcsDriverInterface $driver
+     * @param string             $packageName
+     * @param string             $tag
+     * @param string             $identifier
+     */
+    protected function initTag(VcsDriverInterface $driver, $packageName, $tag, $identifier)
+    {
+        if (null !== $this->filter && $this->filter->skip($this->assetType, $packageName, $tag)) {
+            return;
+        }
+
+        if (!$parsedTag = Validator::validateTag($tag, $this->assetType, $this->versionParser)) {
+            if ($this->verbose) {
+                $this->io->write('<warning>Skipped tag '.$tag.', invalid tag name</warning>');
+            }
+
+            return;
+        }
+
+        $this->initTagAddPackage($driver, $packageName, $tag, $identifier, $parsedTag);
+    }
+
+    /**
+     * Initializes the tag: convert data and create package.
+     *
+     * @param VcsDriverInterface $driver
+     * @param string             $packageName
+     * @param string             $tag
+     * @param string             $identifier
+     * @param string             $parsedTag
+     */
+    protected function initTagAddPackage(VcsDriverInterface $driver, $packageName, $tag, $identifier, $parsedTag)
+    {
+        $packageClass = 'Fxp\Composer\AssetPlugin\Package\LazyCompletePackage';
+        $data = $this->createMockOfPackageConfig($packageName, $tag);
+        $data['version'] = $this->assetType->getVersionConverter()->convertVersion($tag);
+        $data['version_normalized'] = $parsedTag;
+
+        // make sure tag packages have no -dev flag
+        $data['version'] = preg_replace('{[.-]?dev$}i', '', (string) $data['version']);
+        $data['version_normalized'] = preg_replace('{(^dev-|[.-]?dev$)}i', '', (string) $data['version_normalized']);
+
+        $packageData = $this->preProcessAsset($data);
+        $package = $this->loader->load($packageData, $packageClass);
+        $lazyLoader = $this->createLazyLoader('tag', $identifier, $packageData, $driver);
+        /* @var LazyCompletePackage $package */
+        $package->setLoader($lazyLoader);
+
+        if (!$this->hasPackage($package)) {
+            $this->addPackage($package);
+        }
+    }
+
+    /**
+     * Initializes all branches.
+     *
+     * @param VcsDriverInterface $driver
+     */
+    protected function initBranches(VcsDriverInterface $driver)
+    {
+        foreach ($driver->getBranches() as $branch => $identifier) {
+            if (is_array($this->rootData) && $branch === $driver->getRootIdentifier()) {
+                $this->preInitBranchPackage($driver, $this->rootData, $branch, $identifier);
+                continue;
+            }
+
+            $this->preInitBranchLazyPackage($driver, $branch, $identifier);
+        }
+
+        if (!$this->verbose) {
+            $this->io->overwrite('', false);
+        }
+    }
+
+    /**
+     * Pre inits the branch of complete package.
+     *
+     * @param VcsDriverInterface $driver     The vcs driver
+     * @param array              $data       The asset package data
+     * @param string             $branch     The branch name
+     * @param string             $identifier The branch identifier
+     */
+    protected function preInitBranchPackage(VcsDriverInterface $driver, array $data, $branch, $identifier)
+    {
+        $packageName = $this->createPackageName();
+        $data = array_merge($this->createMockOfPackageConfig($packageName, $branch), $data);
+        $data = $this->preProcessAsset($data);
+        $data['version'] = $branch;
+        $data = $this->configureBranchPackage($branch, $data);
+
+        if (!isset($data['dist'])) {
+            $data['dist'] = $driver->getDist($identifier);
+        }
+        if (!isset($data['source'])) {
+            $data['source'] = $driver->getSource($identifier);
+        }
+
+        $loader = new ArrayLoader();
+        $package = $loader->load($data);
+        $package = $this->includeBranchAlias($driver, $package, $branch);
+        $this->addPackage($package);
+    }
+
+    /**
+     * Pre inits the branch of lazy package.
+     *
+     * @param VcsDriverInterface $driver     The vcs driver
+     * @param string             $branch     The branch name
+     * @param string             $identifier The branch identifier
+     */
+    protected function preInitBranchLazyPackage(VcsDriverInterface $driver, $branch, $identifier)
+    {
+        $packageName = $this->createPackageName();
+        $data = $this->createMockOfPackageConfig($packageName, $branch);
+        $data = $this->configureBranchPackage($branch, $data);
+
+        $this->initBranchLazyPackage($driver, $data, $branch, $identifier);
+    }
+
+    /**
+     * Configures the package of branch.
+     *
+     * @param string $branch The branch name
+     * @param array  $data   The data
+     *
+     * @return array
+     */
+    protected function configureBranchPackage($branch, array $data)
+    {
+        $parsedBranch = $this->versionParser->normalizeBranch($branch);
+        $data['version_normalized'] = $parsedBranch;
+
+        // make sure branch packages have a dev flag
+        if ('dev-' === substr((string) $parsedBranch, 0, 4) || '9999999-dev' === $parsedBranch) {
+            $data['version'] = 'dev-'.$data['version'];
+        } else {
+            $data['version'] = preg_replace('{(\.9{7})+}', '.x', (string) $parsedBranch);
+        }
+
+        return $data;
+    }
+
+    /**
+     * Inits the branch of lazy package.
+     *
+     * @param VcsDriverInterface $driver     The vcs driver
+     * @param array              $data       The package data
+     * @param string             $branch     The branch name
+     * @param string             $identifier The branch identifier
+     */
+    protected function initBranchLazyPackage(VcsDriverInterface $driver, array $data, $branch, $identifier)
+    {
+        $packageClass = 'Fxp\Composer\AssetPlugin\Package\LazyCompletePackage';
+        $packageData = $this->preProcessAsset($data);
+        /* @var LazyCompletePackage $package */
+        $package = $this->loader->load($packageData, $packageClass);
+        $lazyLoader = $this->createLazyLoader('branch', $identifier, $packageData, $driver);
+        $package->setLoader($lazyLoader);
+        $package = $this->includeBranchAlias($driver, $package, $branch);
+
+        $this->addPackage($package);
+    }
+
+    /**
+     * Include the package in the alias package if the branch is a root branch
+     * identifier and having a package version.
+     *
+     * @param VcsDriverInterface $driver  The vcs driver
+     * @param PackageInterface   $package The package instance
+     * @param string             $branch  The branch name
+     *
+     * @return PackageInterface|AliasPackage
+     */
+    protected function includeBranchAlias(VcsDriverInterface $driver, PackageInterface $package, $branch)
+    {
+        if (null !== $this->rootPackageVersion && $branch === $driver->getRootIdentifier()) {
+            $aliasNormalized = $this->normalizeBranchAlias($package);
+            $package = $package instanceof AliasPackage ? $package->getAliasOf() : $package;
+            $package = $this->overrideBranchAliasConfig($package, $aliasNormalized, $branch);
+            $package = $this->addPackageAliases($package, $aliasNormalized);
+        }
+
+        return $package;
+    }
+
+    /**
+     * Normalize the alias of branch.
+     *
+     * @param PackageInterface $package The package instance
+     *
+     * @return string The alias branch name
+     */
+    protected function normalizeBranchAlias(PackageInterface $package)
+    {
+        $stability = VersionParser::parseStability($this->versionParser->normalize($this->rootPackageVersion));
+        $aliasNormalized = 'dev-'.$this->rootPackageVersion;
+
+        if (BasePackage::STABILITY_STABLE === BasePackage::$stabilities[$stability]
+            && null === $this->findPackage($package->getName(), $this->rootPackageVersion)) {
+            $aliasNormalized = $this->versionParser->normalize($this->rootPackageVersion);
+        }
+
+        return $aliasNormalized;
+    }
+
+    /**
+     * Init the package versions added directly in the Asset Registry.
+     */
+    protected function initRegistryVersions()
+    {
+        if (isset($this->repoConfig['registry-versions'])) {
+            /* @var CompletePackageInterface $package */
+            foreach ($this->repoConfig['registry-versions'] as $package) {
+                $this->addPackage($package);
+            }
+        }
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Repository/BowerPrivateRegistryFactory.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Repository/BowerPrivateRegistryFactory.php
new file mode 100644 (file)
index 0000000..e6f838d
--- /dev/null
@@ -0,0 +1,40 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Repository;
+
+use Fxp\Composer\AssetPlugin\Config\Config;
+use Fxp\Composer\AssetPlugin\Util\AssetPlugin;
+
+/**
+ * Factory of bower private repository registries.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class BowerPrivateRegistryFactory implements RegistryFactoryInterface
+{
+    /**
+     * {@inheritdoc}
+     */
+    public static function create(AssetRepositoryManager $arm, VcsPackageFilter $filter, Config $config)
+    {
+        $rm = $arm->getRepositoryManager();
+        $registries = $config->getArray('private-bower-registries');
+
+        foreach ($registries as $registryName => $registryUrl) {
+            $repoConfig = AssetPlugin::createRepositoryConfig($arm, $filter, $config, $registryName);
+            $repoConfig['private-registry-url'] = $registryUrl;
+
+            $rm->setRepositoryClass($registryName, 'Fxp\Composer\AssetPlugin\Repository\BowerPrivateRepository');
+            $rm->addRepository($rm->createRepository($registryName, $repoConfig));
+        }
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Repository/BowerPrivateRepository.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Repository/BowerPrivateRepository.php
new file mode 100644 (file)
index 0000000..c1abaa9
--- /dev/null
@@ -0,0 +1,113 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Repository;
+
+use Composer\Config;
+use Composer\EventDispatcher\EventDispatcher;
+use Composer\IO\IOInterface;
+use Fxp\Composer\AssetPlugin\Exception\InvalidCreateRepositoryException;
+
+/**
+ * Bower repository for Private Instaltions.
+ *
+ * @author Marcus Stueben <marcus@it-stueben.de>
+ */
+class BowerPrivateRepository extends AbstractAssetsRepository
+{
+    /**
+     * Constructor.
+     *
+     * @param array           $repoConfig
+     * @param IOInterface     $io
+     * @param Config          $config
+     * @param EventDispatcher $eventDispatcher
+     */
+    public function __construct(array $repoConfig, IOInterface $io, Config $config, EventDispatcher $eventDispatcher = null)
+    {
+        $this->url = isset($repoConfig['private-registry-url'])
+            ? $repoConfig['private-registry-url']
+            : null;
+
+        parent::__construct($repoConfig, $io, $config, $eventDispatcher);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function getType()
+    {
+        return 'bower';
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function getUrl()
+    {
+        return $this->url;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function getPackageUrl()
+    {
+        return $this->canonicalizeUrl($this->baseUrl.'/%package%');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function getSearchUrl()
+    {
+        return $this->canonicalizeUrl($this->baseUrl.'/search/%query%');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function createVcsRepositoryConfig(array $data, $registryName = null)
+    {
+        $myArray = array();
+        $myArray['repository'] = $data;
+
+        return array(
+            'type' => $this->assetType->getName().'-vcs',
+            'url' => $this->getVcsRepositoryUrl($myArray, $registryName),
+            'name' => $registryName,
+        );
+    }
+
+    /**
+     * Get the URL of VCS repository.
+     *
+     * @param array  $data         The repository config
+     * @param string $registryName The package name in asset registry
+     *
+     * @return string
+     *
+     * @throws InvalidCreateRepositoryException When the repository.url parameter does not exist
+     */
+    protected function getVcsRepositoryUrl(array $data, $registryName = null)
+    {
+        if (!isset($data['repository']['url'])) {
+            $msg = sprintf('The "repository.url" parameter of "%s" %s asset package must be present for create a VCS Repository', $registryName, $this->assetType->getName());
+            $msg .= PHP_EOL.'If the config comes from the Bower Private Registry, override the config with a custom Asset VCS Repository';
+            $ex = new InvalidCreateRepositoryException($msg);
+            $ex->setData($data);
+
+            throw $ex;
+        }
+
+        return (string) $data['repository']['url'];
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Repository/BowerRepository.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Repository/BowerRepository.php
new file mode 100644 (file)
index 0000000..abb8043
--- /dev/null
@@ -0,0 +1,64 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Repository;
+
+/**
+ * Bower repository.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class BowerRepository extends AbstractAssetsRepository
+{
+    /**
+     * {@inheritdoc}
+     */
+    protected function getType()
+    {
+        return 'bower';
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function getUrl()
+    {
+        return 'https://registry.bower.io/packages';
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function getPackageUrl()
+    {
+        return $this->canonicalizeUrl($this->baseUrl.'/%package%');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function getSearchUrl()
+    {
+        return $this->canonicalizeUrl($this->baseUrl.'/search/%query%');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function createVcsRepositoryConfig(array $data, $registryName = null)
+    {
+        return array(
+            'type' => $this->assetType->getName().'-vcs',
+            'url' => $data['url'],
+            'name' => $registryName,
+        );
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Repository/DefaultRegistryFactory.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Repository/DefaultRegistryFactory.php
new file mode 100644 (file)
index 0000000..d3a8549
--- /dev/null
@@ -0,0 +1,39 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Repository;
+
+use Fxp\Composer\AssetPlugin\Assets;
+use Fxp\Composer\AssetPlugin\Config\Config;
+use Fxp\Composer\AssetPlugin\Util\AssetPlugin;
+
+/**
+ * Factory of default repository registries.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class DefaultRegistryFactory implements RegistryFactoryInterface
+{
+    /**
+     * {@inheritdoc}
+     */
+    public static function create(AssetRepositoryManager $arm, VcsPackageFilter $filter, Config $config)
+    {
+        $rm = $arm->getRepositoryManager();
+
+        foreach (Assets::getDefaultRegistries() as $assetType => $registryClass) {
+            $repoConfig = AssetPlugin::createRepositoryConfig($arm, $filter, $config, $assetType);
+
+            $rm->setRepositoryClass($assetType, $registryClass);
+            $rm->addRepository($rm->createRepository($assetType, $repoConfig));
+        }
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Repository/FilterUtil.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Repository/FilterUtil.php
new file mode 100644 (file)
index 0000000..c81da73
--- /dev/null
@@ -0,0 +1,125 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Repository;
+
+use Composer\Package\Link;
+use Composer\Package\Package;
+use Composer\Package\RootPackageInterface;
+use Composer\Semver\Constraint\ConstraintInterface;
+use Fxp\Composer\AssetPlugin\Config\Config;
+use Fxp\Composer\AssetPlugin\Package\Version\VersionParser;
+
+/**
+ * Helper for Filter Package of Repository.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class FilterUtil
+{
+    /**
+     * Get the link constraint of normalized version.
+     *
+     * @param string        $normalizedVersion The normalized version
+     * @param VersionParser $versionParser     The version parser
+     *
+     * @return ConstraintInterface The constraint
+     */
+    public static function getVersionConstraint($normalizedVersion, VersionParser $versionParser)
+    {
+        if (preg_match('/^\d+(\.\d+)(\.\d+)(\.\d+)\-[A-Za-z0-9]+$/', $normalizedVersion)) {
+            $normalizedVersion = substr($normalizedVersion, 0, strpos($normalizedVersion, '-'));
+        }
+
+        return $versionParser->parseConstraints($normalizedVersion);
+    }
+
+    /**
+     * Find the stability name with the stability value.
+     *
+     * @param int $level The stability level
+     *
+     * @return string The stability name
+     */
+    public static function findFlagStabilityName($level)
+    {
+        $stability = 'dev';
+
+        /* @var string $stabilityName */
+        /* @var int    $stabilityLevel */
+        foreach (Package::$stabilities as $stabilityName => $stabilityLevel) {
+            if ($stabilityLevel === $level) {
+                $stability = $stabilityName;
+                break;
+            }
+        }
+
+        return $stability;
+    }
+
+    /**
+     * Find the lowest stability.
+     *
+     * @param string[]      $stabilities   The list of stability
+     * @param VersionParser $versionParser The version parser
+     *
+     * @return string The lowest stability
+     */
+    public static function findInlineStabilities(array $stabilities, VersionParser $versionParser)
+    {
+        $lowestStability = 'stable';
+
+        foreach ($stabilities as $stability) {
+            $stability = $versionParser->normalizeStability($stability);
+            $stability = $versionParser->parseStability($stability);
+
+            if (Package::$stabilities[$stability] > Package::$stabilities[$lowestStability]) {
+                $lowestStability = $stability;
+            }
+        }
+
+        return $lowestStability;
+    }
+
+    /**
+     * Get the minimum stability for the require dependency defined in root package.
+     *
+     * @param RootPackageInterface $package The root package
+     * @param Link                 $require The require link defined in root package
+     *
+     * @return string The minimum stability defined in root package (in links or global project)
+     */
+    public static function getMinimumStabilityFlag(RootPackageInterface $package, Link $require)
+    {
+        $flags = $package->getStabilityFlags();
+
+        if (isset($flags[$require->getTarget()])) {
+            return static::findFlagStabilityName($flags[$require->getTarget()]);
+        }
+
+        return $package->getPreferStable()
+            ? 'stable'
+            : $package->getMinimumStability();
+    }
+
+    /**
+     * Check the config option.
+     *
+     * @param Config $config The plugin config
+     * @param string $name   The extra option name
+     *
+     * @return bool
+     */
+    public static function checkConfigOption(Config $config, $name)
+    {
+        return true === $config->get($name, true);
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Repository/NpmRepository.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Repository/NpmRepository.php
new file mode 100644 (file)
index 0000000..b6652a2
--- /dev/null
@@ -0,0 +1,207 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Repository;
+
+use Composer\DependencyResolver\Pool;
+use Composer\IO\IOInterface;
+use Composer\Package\CompletePackageInterface;
+use Composer\Package\Loader\ArrayLoader;
+use Composer\Repository\ArrayRepository;
+use Fxp\Composer\AssetPlugin\Converter\NpmPackageUtil;
+use Fxp\Composer\AssetPlugin\Converter\PackageUtil;
+use Fxp\Composer\AssetPlugin\Exception\InvalidCreateRepositoryException;
+
+/**
+ * NPM repository.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class NpmRepository extends AbstractAssetsRepository
+{
+    /**
+     * {@inheritdoc}
+     */
+    protected function getType()
+    {
+        return 'npm';
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function getUrl()
+    {
+        return 'https://registry.npmjs.org';
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function getPackageUrl()
+    {
+        return $this->canonicalizeUrl($this->baseUrl.'/%package%');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function getSearchUrl()
+    {
+        return $this->canonicalizeUrl($this->baseUrl.'/-/all');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function search($query, $mode = 0, $type = null)
+    {
+        return array();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function buildPackageUrl($packageName)
+    {
+        $packageName = urlencode(NpmPackageUtil::revertName($packageName));
+        $packageName = str_replace('%40', '@', $packageName);
+
+        return parent::buildPackageUrl($packageName);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function createVcsRepositoryConfig(array $data, $registryName = null)
+    {
+        $type = isset($data['repository']['type']) ? $data['repository']['type'] : 'vcs';
+
+        // Add release date in $packageConfigs
+        if (isset($data['versions']) && isset($data['time'])) {
+            $time = $data['time'];
+            array_walk($data['versions'], function (&$packageConfigs, $version) use ($time) {
+                PackageUtil::convertStringKey($time, $version, $packageConfigs, 'time');
+            });
+        }
+
+        return array(
+            'type' => $this->assetType->getName().'-'.$type,
+            'url' => $this->getVcsRepositoryUrl($data, $registryName),
+            'name' => $registryName,
+            'registry-versions' => isset($data['versions']) ? $this->createArrayRepositoryConfig($data['versions']) : array(),
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function whatProvidesManageException(Pool $pool, $name, \Exception $exception)
+    {
+        if ($exception instanceof InvalidCreateRepositoryException) {
+            $data = $exception->getData();
+
+            if (isset($data['versions']) && !empty($data['versions'])) {
+                $this->putArrayRepositoryConfig($data['versions'], $name, $pool);
+
+                return;
+            }
+        }
+
+        parent::whatProvidesManageException($pool, $name, $exception);
+    }
+
+    /**
+     * Create and put the array repository with the asset configs.
+     *
+     * @param array  $packageConfigs The configs of assets package versions
+     * @param string $name           The asset package name
+     * @param Pool   $pool           The pool
+     */
+    protected function putArrayRepositoryConfig(array $packageConfigs, $name, Pool $pool)
+    {
+        $packages = $this->createArrayRepositoryConfig($packageConfigs);
+        $repo = new ArrayRepository($packages);
+        Util::addRepositoryInstance($this->io, $this->repositoryManager, $this->repos, $name, $repo, $pool);
+
+        $this->providers[$name] = array();
+    }
+
+    /**
+     * Create the array repository with the asset configs.
+     *
+     * A warning message is displayed if the constraint versions of packages
+     * are broken. These versions are skipped and the plugin hope that other
+     * versions will be OK.
+     *
+     * @param array $packageConfigs The configs of assets package versions
+     *
+     * @return CompletePackageInterface[]
+     */
+    protected function createArrayRepositoryConfig(array $packageConfigs)
+    {
+        $packages = array();
+        $loader = new ArrayLoader();
+
+        foreach ($packageConfigs as $version => $config) {
+            try {
+                $config['version'] = $version;
+                $config = $this->assetType->getPackageConverter()->convert($config);
+                $config = $this->assetRepositoryManager->solveResolutions($config);
+                $packages[] = $loader->load($config);
+            } catch (\UnexpectedValueException $exception) {
+                $this->io->write("<warning>Skipped {$config['name']} version {$version}: {$exception->getMessage()}</warning>", IOInterface::VERBOSE);
+            }
+        }
+
+        return $packages;
+    }
+
+    /**
+     * Get the URL of VCS repository.
+     *
+     * @param array  $data         The repository config
+     * @param string $registryName The package name in asset registry
+     *
+     * @return string
+     *
+     * @throws InvalidCreateRepositoryException When the repository.url parameter does not exist
+     */
+    protected function getVcsRepositoryUrl(array $data, $registryName = null)
+    {
+        if (!isset($data['repository']['url'])) {
+            $msg = sprintf('The "repository.url" parameter of "%s" %s asset package must be present for create a VCS Repository', $registryName, $this->assetType->getName());
+            $msg .= PHP_EOL.'If the config comes from the NPM Registry, override the config with a custom Asset VCS Repository';
+            $ex = new InvalidCreateRepositoryException($msg);
+            $ex->setData($data);
+
+            throw $ex;
+        }
+
+        return $this->convertUrl((string) $data['repository']['url']);
+    }
+
+    /**
+     * Convert the url repository.
+     *
+     * @param string $url The url
+     *
+     * @return string The url converted
+     */
+    private function convertUrl($url)
+    {
+        if (0 === strpos($url, 'git+http')) {
+            return substr($url, 4);
+        }
+
+        return $url;
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Repository/RegistryFactoryInterface.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Repository/RegistryFactoryInterface.php
new file mode 100644 (file)
index 0000000..1a83fa8
--- /dev/null
@@ -0,0 +1,31 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Repository;
+
+use Fxp\Composer\AssetPlugin\Config\Config;
+
+/**
+ * Interface of repository registry factory.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+interface RegistryFactoryInterface
+{
+    /**
+     * Create the repository registries.
+     *
+     * @param AssetRepositoryManager $arm    The asset repository manager
+     * @param VcsPackageFilter       $filter The vcs package filter
+     * @param Config                 $config The plugin config
+     */
+    public static function create(AssetRepositoryManager $arm, VcsPackageFilter $filter, Config $config);
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Repository/ResolutionManager.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Repository/ResolutionManager.php
new file mode 100644 (file)
index 0000000..287f4c0
--- /dev/null
@@ -0,0 +1,73 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Repository;
+
+/**
+ * Solve the conflicts of dependencies by the resolutions.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class ResolutionManager
+{
+    /**
+     * @var array
+     */
+    protected $resolutions;
+
+    /**
+     * Constructor.
+     *
+     * @param array $resolutions The dependency resolutions
+     */
+    public function __construct(array $resolutions = array())
+    {
+        $this->resolutions = $resolutions;
+    }
+
+    /**
+     * Solve the dependency resolutions.
+     *
+     * @param array $data The data of asset composer package
+     *
+     * @return array
+     */
+    public function solveResolutions(array $data)
+    {
+        $data = $this->doSolveResolutions($data, 'require');
+        $data = $this->doSolveResolutions($data, 'require-dev');
+
+        return $data;
+    }
+
+    /**
+     * Solve the dependency resolutions.
+     *
+     * @param array  $data    The data of asset composer package
+     * @param string $section The dependency section in package
+     *
+     * @return array
+     */
+    protected function doSolveResolutions(array $data, $section)
+    {
+        if (array_key_exists($section, $data) && is_array($data[$section])) {
+            foreach ($data[$section] as $dependency => &$range) {
+                foreach ($this->resolutions as $resolutionDependency => $resolutionRange) {
+                    if ($dependency === $resolutionDependency) {
+                        $range = $resolutionRange;
+                    }
+                }
+            }
+        }
+
+        return $data;
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Repository/Util.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Repository/Util.php
new file mode 100644 (file)
index 0000000..c1ca390
--- /dev/null
@@ -0,0 +1,139 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Repository;
+
+use Composer\DependencyResolver\Pool;
+use Composer\IO\IOInterface;
+use Composer\Repository\RepositoryInterface;
+use Composer\Repository\RepositoryManager;
+
+/**
+ * Helper for Repository.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class Util
+{
+    /**
+     * Add repository config.
+     * The instance of repository is returned if the repository in't added in the pool.
+     *
+     * @param IOInterface       $io         The IO instance
+     * @param RepositoryManager $rm         The repository manager
+     * @param array             $repos      The list of already repository added (passed by reference)
+     * @param string            $name       The name of the new repository
+     * @param array             $repoConfig The config of the new repository
+     * @param Pool|null         $pool       The pool
+     *
+     * @return RepositoryInterface|null
+     */
+    public static function addRepository(IOInterface $io, RepositoryManager $rm, array &$repos, $name, array $repoConfig, Pool $pool = null)
+    {
+        $repoConfig['name'] = $name;
+        $repo = $rm->createRepository($repoConfig['type'], $repoConfig);
+
+        return static::addRepositoryInstance($io, $rm, $repos, $name, $repo, $pool);
+    }
+
+    /**
+     * Add repository instance.
+     * The instance of repository is returned if the repository in't added in the pool.
+     *
+     * @param IOInterface         $io    The IO instance
+     * @param RepositoryManager   $rm    The repository mamanger
+     * @param array               $repos The list of already repository added (passed by reference)
+     * @param string              $name  The name of the new repository
+     * @param RepositoryInterface $repo  The repository instance
+     * @param Pool|null           $pool  The pool
+     *
+     * @return RepositoryInterface|null
+     */
+    public static function addRepositoryInstance(IOInterface $io, RepositoryManager $rm, array &$repos, $name, RepositoryInterface $repo, Pool $pool = null)
+    {
+        $notAddedRepo = null;
+
+        if (!isset($repos[$name])) {
+            static::writeAddRepository($io, $name);
+            $notAddedRepo = $repo;
+            $repos[$name] = $repo;
+            $rm->addRepository($repo);
+
+            if (null !== $pool) {
+                $pool->addRepository($repo);
+                $notAddedRepo = null;
+            }
+        }
+
+        return $notAddedRepo;
+    }
+
+    /**
+     * Cleans the package name, removing the Composer prefix if present.
+     *
+     * @param string $name
+     *
+     * @return string
+     */
+    public static function cleanPackageName($name)
+    {
+        if (preg_match('/^[a-z]+\-asset\//', $name, $matches)) {
+            $name = substr($name, strlen($matches[0]));
+        }
+
+        return $name;
+    }
+
+    /**
+     * Converts the alias of asset package name by the real asset package name.
+     *
+     * @param string $name
+     *
+     * @return string
+     */
+    public static function convertAliasName($name)
+    {
+        if (preg_match('/([\w0-9\/_-]+)-\d+(.\d+)?.[\dxX]+$/', $name, $matches)) {
+            return $matches[1];
+        }
+
+        return $name;
+    }
+
+    /**
+     * Get the array value.
+     *
+     * @param array  $array   The array
+     * @param string $name    The key name
+     * @param mixed  $default The default value
+     *
+     * @return mixed
+     */
+    public static function getArrayValue(array $array, $name, $default = null)
+    {
+        return array_key_exists($name, $array)
+            ? $array[$name]
+            : $default;
+    }
+
+    /**
+     * Write the vcs repository name in output console.
+     *
+     * @param IOInterface $io   The IO instance
+     * @param string      $name The vcs repository name
+     */
+    protected static function writeAddRepository(IOInterface $io, $name)
+    {
+        if ($io->isVerbose()) {
+            $io->write('Adding VCS repository <info>'.$name.'</info>');
+        }
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Repository/Vcs/AbstractGitHubDriver.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Repository/Vcs/AbstractGitHubDriver.php
new file mode 100644 (file)
index 0000000..4f69660
--- /dev/null
@@ -0,0 +1,257 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Repository\Vcs;
+
+use Composer\Cache;
+use Composer\Downloader\TransportException;
+use Composer\Json\JsonFile;
+use Composer\Repository\Vcs\GitHubDriver as BaseGitHubDriver;
+use Fxp\Composer\AssetPlugin\Repository\Util as RepoUtil;
+
+/**
+ * Abstract class for GitHub vcs driver.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+abstract class AbstractGitHubDriver extends BaseGitHubDriver
+{
+    /**
+     * @var Cache
+     */
+    protected $cache;
+
+    /**
+     * @var string|null|false
+     */
+    protected $redirectApi;
+
+    public function initialize()
+    {
+        if (!isset($this->repoConfig['no-api'])) {
+            $this->repoConfig['no-api'] = $this->getNoApiOption();
+        }
+
+        parent::initialize();
+    }
+
+    /**
+     * Get the no-api repository option.
+     *
+     * @return bool
+     */
+    protected function getNoApiOption()
+    {
+        $packageName = $this->repoConfig['package-name'];
+        $opts = RepoUtil::getArrayValue($this->repoConfig, 'vcs-driver-options', array());
+        $noApiOpt = RepoUtil::getArrayValue($opts, 'github-no-api', array());
+        $defaultValue = false;
+
+        if (is_bool($noApiOpt)) {
+            $defaultValue = $noApiOpt;
+            $noApiOpt = array();
+        }
+
+        $noApiOpt['default'] = (bool) RepoUtil::getArrayValue($noApiOpt, 'default', $defaultValue);
+        $noApiOpt['packages'] = (array) RepoUtil::getArrayValue($noApiOpt, 'packages', array());
+
+        return (bool) RepoUtil::getArrayValue($noApiOpt['packages'], $packageName, $defaultValue);
+    }
+
+    /**
+     * Get the remote content.
+     *
+     * @param string $url              The URL of content
+     * @param bool   $fetchingRepoData Fetching the repo data or not
+     *
+     * @return mixed The result
+     */
+    protected function getContents($url, $fetchingRepoData = false)
+    {
+        $url = $this->getValidContentUrl($url);
+
+        if (null !== $this->redirectApi) {
+            return parent::getContents($url, $fetchingRepoData);
+        }
+
+        try {
+            $contents = $this->getRemoteContents($url);
+            $this->redirectApi = false;
+
+            return $contents;
+        } catch (TransportException $e) {
+            if ($this->hasRedirectUrl($url)) {
+                $url = $this->getValidContentUrl($url);
+            }
+
+            return parent::getContents($url, $fetchingRepoData);
+        }
+    }
+
+    /**
+     * @param string $url The url
+     *
+     * @return string The url redirected
+     */
+    protected function getValidContentUrl($url)
+    {
+        if (null === $this->redirectApi && false !== $redirectApi = $this->cache->read('redirect-api')) {
+            $this->redirectApi = $redirectApi;
+        }
+
+        if (is_string($this->redirectApi) && 0 === strpos($url, $this->getRepositoryApiUrl())) {
+            $url = $this->redirectApi.substr($url, strlen($this->getRepositoryApiUrl()));
+        }
+
+        return $url;
+    }
+
+    /**
+     * Check if the driver must find the new url.
+     *
+     * @param string $url The url
+     *
+     * @return bool
+     */
+    protected function hasRedirectUrl($url)
+    {
+        if (null === $this->redirectApi && 0 === strpos($url, $this->getRepositoryApiUrl())) {
+            $this->redirectApi = $this->getNewRepositoryUrl();
+
+            if (is_string($this->redirectApi)) {
+                $this->cache->write('redirect-api', $this->redirectApi);
+            }
+        }
+
+        return is_string($this->redirectApi);
+    }
+
+    /**
+     * Get the new url of repository.
+     *
+     * @return string|false The new url or false if there is not a new url
+     */
+    protected function getNewRepositoryUrl()
+    {
+        try {
+            $this->getRemoteContents($this->getRepositoryUrl());
+            $headers = $this->remoteFilesystem->getLastHeaders();
+
+            if (!empty($headers[0]) && preg_match('{^HTTP/\S+ (30[1278])}i', $headers[0], $match)) {
+                array_shift($headers);
+
+                return $this->findNewLocationInHeader($headers);
+            }
+
+            return false;
+        } catch (\Exception $ex) {
+            return false;
+        }
+    }
+
+    /**
+     * Find the new url api in the header.
+     *
+     * @param array $headers The http header
+     *
+     * @return string|false
+     */
+    protected function findNewLocationInHeader(array $headers)
+    {
+        $url = false;
+
+        foreach ($headers as $header) {
+            if (0 === strpos($header, 'Location:')) {
+                $newUrl = trim(substr($header, 9));
+                preg_match('#^(?:(?:https?|git)://([^/]+)/|git@([^:]+):)([^/]+)/(.+?)(?:\.git|/)?$#', $newUrl, $match);
+                $owner = $match[3];
+                $repository = $match[4];
+                $paramPos = strpos($repository, '?');
+                $repository = is_int($paramPos) ? substr($match[4], 0, $paramPos) : $repository;
+                $url = $this->getRepositoryApiUrl($owner, $repository);
+                break;
+            }
+        }
+
+        return $url;
+    }
+
+    /**
+     * Get the url API of the repository.
+     *
+     * @param string $owner
+     * @param string $repository
+     *
+     * @return string
+     */
+    protected function getRepositoryApiUrl($owner = null, $repository = null)
+    {
+        $owner = null !== $owner ? $owner : $this->owner;
+        $repository = null !== $repository ? $repository : $this->repository;
+
+        return $this->getApiUrl().'/repos/'.$owner.'/'.$repository;
+    }
+
+    /**
+     * Get the remote content.
+     *
+     * @param string $url
+     *
+     * @return bool|string
+     */
+    protected function getRemoteContents($url)
+    {
+        return $this->remoteFilesystem->getContents($this->originUrl, $url, false);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getBranches()
+    {
+        if ($this->gitDriver) {
+            return $this->gitDriver->getBranches();
+        }
+
+        if (null === $this->branches) {
+            $this->branches = array();
+            $resource = $this->getApiUrl().'/repos/'.$this->owner.'/'.$this->repository.'/git/refs/heads?per_page=100';
+            $branchBlacklist = 'gh-pages' === $this->getRootIdentifier() ? array() : array('gh-pages');
+
+            $this->doAddBranches($resource, $branchBlacklist);
+        }
+
+        return $this->branches;
+    }
+
+    /**
+     * Push the list of all branch.
+     *
+     * @param string $resource
+     * @param array  $branchBlacklist
+     */
+    protected function doAddBranches($resource, array $branchBlacklist)
+    {
+        do {
+            $branchData = JsonFile::parseJson((string) $this->getContents($resource), $resource);
+
+            foreach ($branchData as $branch) {
+                $name = substr($branch['ref'], 11);
+
+                if (!in_array($name, $branchBlacklist)) {
+                    $this->branches[$name] = $branch['object']['sha'];
+                }
+            }
+
+            $resource = $this->getNextPage();
+        } while ($resource);
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Repository/Vcs/BitbucketUtil.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Repository/Vcs/BitbucketUtil.php
new file mode 100644 (file)
index 0000000..6b4b36b
--- /dev/null
@@ -0,0 +1,155 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Repository\Vcs;
+
+use Composer\Cache;
+use Composer\Json\JsonFile;
+use Composer\Repository\Vcs\VcsDriverInterface;
+
+/**
+ * Helper for bitbucket VCS driver.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class BitbucketUtil
+{
+    /**
+     * Get composer information.
+     *
+     * @param Cache              $cache      The cache
+     * @param array              $infoCache  The code cache
+     * @param string             $scheme     The scheme
+     * @param array              $repoConfig The repository config
+     * @param string             $identifier The identifier
+     * @param string             $owner      The owner of repository
+     * @param string             $repository The repository name
+     * @param VcsDriverInterface $driver     The vcs driver
+     * @param string             $method     The method of vcs driver for get contents
+     *
+     * @return array The composer
+     */
+    public static function getComposerInformation(Cache $cache, array &$infoCache, $scheme,
+        array $repoConfig, $identifier, $owner, $repository, VcsDriverInterface $driver, $method = 'getContents')
+    {
+        $infoCache[$identifier] = Util::readCache($infoCache, $cache, $repoConfig['asset-type'], $identifier);
+
+        if (!isset($infoCache[$identifier])) {
+            $resource = static::getUrlResource($scheme, $repoConfig, $identifier, $owner, $repository, $driver);
+            $composer = static::getComposerContent($resource, $identifier, $scheme, $owner, $repository, $driver, $method);
+
+            Util::writeCache($cache, $repoConfig['asset-type'], $identifier, $composer);
+            $infoCache[$identifier] = $composer;
+        }
+
+        return $infoCache[$identifier];
+    }
+
+    /**
+     * Get the url of resource.
+     *
+     * @param string             $scheme     The scheme
+     * @param array              $repoConfig The repository config
+     * @param string             $identifier The identifier
+     * @param string             $owner      The owner of repository
+     * @param string             $repository The repository name
+     * @param VcsDriverInterface $driver     The vcs driver
+     *
+     * @return string
+     */
+    protected static function getUrlResource($scheme, array $repoConfig, $identifier, $owner, $repository,
+                                             VcsDriverInterface $driver)
+    {
+        if (false === strpos(get_class($driver), 'Git')) {
+            return $scheme.'://bitbucket.org/'.$owner.'/'.$repository.'/raw/'.$identifier.'/'.$repoConfig['filename'];
+        }
+
+        return $scheme.'://api.bitbucket.org/1.0/repositories/'.$owner.'/'.$repository.'/src/'.$identifier.'/'.$repoConfig['filename'];
+    }
+
+    /**
+     * Gets content of composer information.
+     *
+     * @param string             $resource   The resource
+     * @param string             $identifier The identifier
+     * @param string             $scheme     The scheme
+     * @param string             $owner      The owner
+     * @param string             $repository The repository
+     * @param VcsDriverInterface $driver     The vcs driver
+     * @param string             $method     The method for get content
+     *
+     * @return array
+     */
+    protected static function getComposerContent($resource, $identifier, $scheme, $owner, $repository,
+                                                 VcsDriverInterface $driver, $method)
+    {
+        $composer = static::getComposerContentOfFile($resource, $driver, $method);
+
+        if (false !== $composer) {
+            $composer = (array) JsonFile::parseJson((string) $composer, $resource);
+            $composer = static::formatComposerContent($composer, $identifier, $scheme, $owner, $repository, $driver, $method);
+
+            return $composer;
+        }
+
+        return array('_nonexistent_package' => true);
+    }
+
+    /**
+     * Get the parsed content of composer.
+     *
+     * @param string             $resource The resource
+     * @param VcsDriverInterface $driver   The vcs driver
+     * @param string             $method   The method for get content
+     *
+     * @return string|false
+     */
+    protected static function getComposerContentOfFile($resource, VcsDriverInterface $driver, $method)
+    {
+        try {
+            $ref = new \ReflectionClass($driver);
+            $meth = $ref->getMethod($method);
+            $meth->setAccessible(true);
+            $composer = $meth->invoke($driver, $resource);
+
+            if ($method !== 'getContents') {
+                $file = (array) JsonFile::parseJson((string) $composer, $resource);
+                $composer = empty($file) || !array_key_exists('data', $file)
+                    ? false : $file['data'];
+            }
+        } catch (\Exception $e) {
+            $composer = false;
+        }
+
+        return $composer;
+    }
+
+    /**
+     * Format composer content.
+     *
+     * @param array              $composer   The composer
+     * @param string             $identifier The identifier
+     * @param string             $scheme     The scheme
+     * @param string             $owner      The owner
+     * @param string             $repository The repository
+     * @param VcsDriverInterface $driver     The vcs driver
+     * @param string             $method     The method for get content
+     *
+     * @return array
+     */
+    protected static function formatComposerContent(array $composer, $identifier, $scheme, $owner, $repository, $driver, $method)
+    {
+        $resource = $scheme.'://api.bitbucket.org/1.0/repositories/'.$owner.'/'.$repository.'/changesets/'.$identifier;
+        $composer = Util::addComposerTime($composer, 'timestamp', $resource, $driver, $method);
+
+        return $composer;
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Repository/Vcs/GitBitbucketDriver.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Repository/Vcs/GitBitbucketDriver.php
new file mode 100644 (file)
index 0000000..05b0590
--- /dev/null
@@ -0,0 +1,48 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Repository\Vcs;
+
+use Composer\Cache;
+use Composer\Repository\Vcs\GitBitbucketDriver as BaseGitBitbucketDriver;
+
+/**
+ * Git Bitbucket vcs driver.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class GitBitbucketDriver extends BaseGitBitbucketDriver
+{
+    /**
+     * @var Cache
+     */
+    protected $cache;
+
+    /**
+     * {@inheritdoc}
+     */
+    public function initialize()
+    {
+        parent::initialize();
+
+        $this->cache = new Cache($this->io, $this->config->get('cache-repo-dir').'/'.$this->originUrl.'/'.$this->owner.'/'.$this->repository);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getComposerInformation($identifier)
+    {
+        $method = method_exists($this, 'getContentsWithOAuthCredentials') ? 'getContentsWithOAuthCredentials' : 'getContents';
+
+        return BitbucketUtil::getComposerInformation($this->cache, $this->infoCache, $this->getScheme(), $this->repoConfig, $identifier, $this->owner, $this->repository, $this, $method);
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Repository/Vcs/GitDriver.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Repository/Vcs/GitDriver.php
new file mode 100644 (file)
index 0000000..67e7911
--- /dev/null
@@ -0,0 +1,113 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Repository\Vcs;
+
+use Composer\Cache;
+use Composer\IO\IOInterface;
+use Composer\Repository\Vcs\GitDriver as BaseGitDriver;
+use Composer\Util\Filesystem;
+use Composer\Util\Git as GitUtil;
+use Fxp\Composer\AssetPlugin\Repository\AssetRepositoryManager;
+
+/**
+ * Git vcs driver.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class GitDriver extends BaseGitDriver
+{
+    /**
+     * @var Cache
+     */
+    protected $cache;
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getComposerInformation($identifier)
+    {
+        $resource = sprintf('%s:%s', escapeshellarg($identifier), $this->repoConfig['filename']);
+
+        return ProcessUtil::getComposerInformation($this->cache, $this->infoCache, $this->repoConfig['asset-type'], $this->process, $identifier, $resource, sprintf('git show %s', $resource), sprintf('git log -1 --format=%%at %s', escapeshellarg($identifier)), $this->repoDir, '@');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function initialize()
+    {
+        /* @var AssetRepositoryManager $arm */
+        $arm = $this->repoConfig['asset-repository-manager'];
+        $skipSync = false;
+
+        if (null !== ($skip = $arm->getConfig()->get('git-skip-update'))) {
+            $localUrl = $this->config->get('cache-vcs-dir').'/'.preg_replace('{[^a-z0-9.]}i', '-', $this->url).'/';
+            // check if local copy exists and if it is a git repository and that modification time is within threshold
+            if (is_dir($localUrl) && is_file($localUrl.'/config') && filemtime($localUrl) > strtotime('-'.$skip)) {
+                $skipSync = true;
+                $this->io->write('(<comment>skip update</comment>) ', false, IOInterface::VERBOSE);
+            }
+        }
+
+        $cacheUrl = Filesystem::isLocalPath($this->url)
+            ? $this->initializeLocalPath() : $this->initializeRemotePath($skipSync);
+        $this->getTags();
+        $this->getBranches();
+        $this->cache = new Cache($this->io, $this->config->get('cache-repo-dir').'/'.preg_replace('{[^a-z0-9.]}i', '-', $cacheUrl));
+    }
+
+    /**
+     * Initialize the local path.
+     *
+     * @return string
+     */
+    private function initializeLocalPath()
+    {
+        $this->url = preg_replace('{[\\/]\.git/?$}', '', $this->url);
+        $this->repoDir = $this->url;
+
+        return realpath($this->url);
+    }
+
+    /**
+     * Initialize the remote path.
+     *
+     * @param bool $skipSync Check if sync must be skipped
+     *
+     * @return string
+     */
+    private function initializeRemotePath($skipSync)
+    {
+        $this->repoDir = $this->config->get('cache-vcs-dir').'/'.preg_replace('{[^a-z0-9.]}i', '-', $this->url).'/';
+
+        GitUtil::cleanEnv();
+
+        $fs = new Filesystem();
+        $fs->ensureDirectoryExists(dirname($this->repoDir));
+
+        if (!is_writable(dirname($this->repoDir))) {
+            throw new \RuntimeException('Can not clone '.$this->url.' to access package information. The "'.dirname($this->repoDir).'" directory is not writable by the current user.');
+        }
+
+        if (preg_match('{^ssh://[^@]+@[^:]+:[^0-9]+}', $this->url)) {
+            throw new \InvalidArgumentException('The source URL '.$this->url.' is invalid, ssh URLs should have a port number after ":".'."\n".'Use ssh://git@example.com:22/path or just git@example.com:path if you do not want to provide a password or custom port.');
+        }
+
+        $gitUtil = new GitUtil($this->io, $this->config, $this->process, $fs);
+        // patched line, sync from local dir without modifying url
+        if (!$skipSync && !$gitUtil->syncMirror($this->url, $this->repoDir)) {
+            $this->io->writeError('<error>Failed to update '.$this->url.', package information from this repository may be outdated</error>');
+        }
+
+        return $this->url;
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Repository/Vcs/GitHubDriver.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Repository/Vcs/GitHubDriver.php
new file mode 100644 (file)
index 0000000..03c61ef
--- /dev/null
@@ -0,0 +1,152 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Repository\Vcs;
+
+use Composer\Downloader\TransportException;
+use Composer\Json\JsonFile;
+
+/**
+ * GitHub vcs driver.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class GitHubDriver extends AbstractGitHubDriver
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function getComposerInformation($identifier)
+    {
+        if ($this->gitDriver) {
+            return $this->gitDriver->getComposerInformation($identifier);
+        }
+
+        $this->infoCache[$identifier] = Util::readCache($this->infoCache, $this->cache, $this->repoConfig['asset-type'], $identifier);
+
+        if (!isset($this->infoCache[$identifier])) {
+            $resource = $this->getApiUrl().'/repos/'.$this->owner.'/'.$this->repository.'/contents/'.$this->repoConfig['filename'].'?ref='.urlencode($identifier);
+            $composer = $this->getComposerContent($resource);
+
+            if ($composer) {
+                $composer = $this->convertComposerContent($composer, $resource, $identifier);
+            } else {
+                $composer = array('_nonexistent_package' => true);
+            }
+
+            Util::writeCache($this->cache, $this->repoConfig['asset-type'], $identifier, $composer);
+            $this->infoCache[$identifier] = $composer;
+        }
+
+        return $this->infoCache[$identifier];
+    }
+
+    /**
+     * Gets content of composer information.
+     *
+     * @param string $resource
+     *
+     * @return null|false|array
+     *
+     * @throws \RuntimeException
+     * @throws \Composer\Downloader\TransportException
+     * @throws \Exception
+     */
+    protected function getComposerContent($resource)
+    {
+        $notFoundRetries = 2;
+        $composer = null;
+
+        while ($notFoundRetries) {
+            try {
+                $composer = $this->parseComposerContent($resource);
+                break;
+            } catch (TransportException $e) {
+                if (404 !== $e->getCode()) {
+                    throw $e;
+                }
+
+                // retry fetching if github returns a 404 since they happen randomly
+                --$notFoundRetries;
+                $composer = false;
+            }
+        }
+
+        return $composer;
+    }
+
+    /**
+     * Parse the composer content.
+     *
+     * @param string $resource
+     *
+     * @return array
+     *
+     * @throws \RuntimeException When the resource could not be retrieved
+     */
+    protected function parseComposerContent($resource)
+    {
+        $composer = (array) JsonFile::parseJson($this->getContents($resource));
+        if (empty($composer['content']) || $composer['encoding'] !== 'base64' || !($composer = base64_decode($composer['content']))) {
+            throw new \RuntimeException('Could not retrieve '.$this->repoConfig['filename'].' from '.$resource);
+        }
+
+        return $composer;
+    }
+
+    /**
+     * Converts json composer file to array.
+     *
+     * @param string $composer
+     * @param string $resource
+     * @param string $identifier
+     *
+     * @return array
+     */
+    protected function convertComposerContent($composer, $resource, $identifier)
+    {
+        $composer = JsonFile::parseJson($composer, $resource);
+        $resource = $this->getApiUrl().'/repos/'.$this->owner.'/'.$this->repository.'/commits/'.urlencode($identifier);
+        $composer = Util::addComposerTime($composer, 'commit.committer.date', $resource, $this);
+
+        if (!isset($composer['support']['source'])) {
+            $label = array_search($identifier, $this->getTags()) ?: array_search($identifier, $this->getBranches()) ?: $identifier;
+            $composer['support']['source'] = sprintf('https://%s/%s/%s/tree/%s', $this->originUrl, $this->owner, $this->repository, $label);
+        }
+        if (!isset($composer['support']['issues']) && $this->hasIssues) {
+            $composer['support']['issues'] = sprintf('https://%s/%s/%s/issues', $this->originUrl, $this->owner, $this->repository);
+        }
+
+        return $composer;
+    }
+
+    /**
+     * Setup git driver.
+     *
+     * @param string $url
+     */
+    protected function setupGitDriver($url)
+    {
+        $this->gitDriver = new GitDriver(
+            array(
+                'url' => $url,
+                'asset-type' => $this->repoConfig['asset-type'],
+                'filename' => $this->repoConfig['filename'],
+                'asset-repository-manager' => $this->repoConfig['asset-repository-manager'],
+            ),
+            $this->io,
+            $this->config,
+            $this->process,
+            $this->remoteFilesystem
+        );
+        $this->gitDriver->initialize();
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Repository/Vcs/HgBitbucketDriver.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Repository/Vcs/HgBitbucketDriver.php
new file mode 100644 (file)
index 0000000..8a11eb2
--- /dev/null
@@ -0,0 +1,46 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Repository\Vcs;
+
+use Composer\Cache;
+use Composer\Repository\Vcs\HgBitbucketDriver as BaseHgBitbucketDriver;
+
+/**
+ * Mercurial Bitbucket Bitbucket vcs driver.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class HgBitbucketDriver extends BaseHgBitbucketDriver
+{
+    /**
+     * @var Cache
+     */
+    protected $cache;
+
+    /**
+     * {@inheritdoc}
+     */
+    public function initialize()
+    {
+        parent::initialize();
+
+        $this->cache = new Cache($this->io, $this->config->get('cache-repo-dir').'/'.$this->originUrl.'/'.$this->owner.'/'.$this->repository);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getComposerInformation($identifier)
+    {
+        return BitbucketUtil::getComposerInformation($this->cache, $this->infoCache, $this->getScheme(), $this->repoConfig, $identifier, $this->owner, $this->repository, $this, 'getContents');
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Repository/Vcs/HgDriver.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Repository/Vcs/HgDriver.php
new file mode 100644 (file)
index 0000000..c3fc2dd
--- /dev/null
@@ -0,0 +1,53 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Repository\Vcs;
+
+use Composer\Cache;
+use Composer\Repository\Vcs\HgDriver as BaseHgDriver;
+use Composer\Util\Filesystem;
+use Composer\Util\ProcessExecutor;
+
+/**
+ * Mercurial vcs driver.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class HgDriver extends BaseHgDriver
+{
+    /**
+     * @var Cache
+     */
+    protected $cache;
+
+    /**
+     * {@inheritdoc}
+     */
+    public function initialize()
+    {
+        parent::initialize();
+
+        $cacheUrl = Filesystem::isLocalPath($this->url)
+            ? realpath($this->url) : $this->url;
+
+        $this->cache = new Cache($this->io, $this->config->get('cache-repo-dir').'/'.preg_replace('{[^a-z0-9.]}i', '-', $cacheUrl));
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getComposerInformation($identifier)
+    {
+        $resource = sprintf('%s %s', ProcessExecutor::escape($identifier), $this->repoConfig['filename']);
+
+        return ProcessUtil::getComposerInformation($this->cache, $this->infoCache, $this->repoConfig['asset-type'], $this->process, $identifier, $resource, sprintf('hg cat -r %s', $resource), sprintf('hg log --template "{date|rfc3339date}" -r %s', ProcessExecutor::escape($identifier)), $this->repoDir);
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Repository/Vcs/PerforceDriver.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Repository/Vcs/PerforceDriver.php
new file mode 100644 (file)
index 0000000..ea099e4
--- /dev/null
@@ -0,0 +1,110 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Repository\Vcs;
+
+use Composer\Cache;
+use Composer\Repository\Vcs\PerforceDriver as BasePerforceDriver;
+use Fxp\Composer\AssetPlugin\Util\Perforce;
+
+/**
+ * Perforce vcs driver.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class PerforceDriver extends BasePerforceDriver
+{
+    /**
+     * @var Perforce
+     */
+    protected $perforce;
+
+    /**
+     * @var array
+     */
+    protected $infoCache = array();
+
+    /**
+     * @var Cache
+     */
+    protected $cache;
+
+    /**
+     * {@inheritdoc}
+     */
+    public function initialize()
+    {
+        $this->depot = $this->repoConfig['depot'];
+        $this->branch = '';
+        if (!empty($this->repoConfig['branch'])) {
+            $this->branch = $this->repoConfig['branch'];
+        }
+
+        $this->initAssetPerforce($this->repoConfig);
+        $this->perforce->p4Login();
+        $this->perforce->checkStream();
+
+        $this->perforce->writeP4ClientSpec();
+        $this->perforce->connectClient();
+
+        $this->cache = new Cache($this->io, $this->config->get('cache-repo-dir').'/'.$this->originUrl.'/'.$this->depot);
+
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getComposerInformation($identifier)
+    {
+        $this->infoCache[$identifier] = Util::readCache($this->infoCache, $this->cache, $this->repoConfig['asset-type'], $identifier, true);
+
+        if (!isset($this->infoCache[$identifier])) {
+            $composer = $this->getComposerContent($identifier);
+
+            Util::writeCache($this->cache, $this->repoConfig['asset-type'], $identifier, $composer, true);
+            $this->infoCache[$identifier] = $composer;
+        }
+
+        return $this->infoCache[$identifier];
+    }
+
+    /**
+     * Get composer content.
+     *
+     * @param string $identifier
+     *
+     * @return array
+     */
+    protected function getComposerContent($identifier)
+    {
+        $composer = $this->perforce->getComposerInformation($identifier);
+
+        if (empty($composer) || !is_array($composer)) {
+            $composer = array('_nonexistent_package' => true);
+        }
+
+        return $composer;
+    }
+
+    /**
+     * @param array $repoConfig
+     */
+    private function initAssetPerforce($repoConfig)
+    {
+        if (!empty($this->perforce)) {
+            return;
+        }
+
+        $repoDir = $this->config->get('cache-vcs-dir').'/'.$this->depot;
+        $this->perforce = Perforce::create($repoConfig, $this->getUrl(), $repoDir, $this->process, $this->io);
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Repository/Vcs/ProcessUtil.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Repository/Vcs/ProcessUtil.php
new file mode 100644 (file)
index 0000000..3e4e281
--- /dev/null
@@ -0,0 +1,103 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Repository\Vcs;
+
+use Composer\Cache;
+use Composer\Json\JsonFile;
+use Composer\Util\ProcessExecutor;
+
+/**
+ * Helper for process VCS driver.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class ProcessUtil
+{
+    /**
+     * Get composer information.
+     *
+     * @param Cache           $cache
+     * @param array           $infoCache
+     * @param string          $assetType
+     * @param ProcessExecutor $process
+     * @param string          $identifier
+     * @param string          $resource
+     * @param string          $cmdGet
+     * @param string          $cmdLog
+     * @param string          $repoDir
+     * @param string          $datetimePrefix
+     *
+     * @return array The composer
+     */
+    public static function getComposerInformation(Cache $cache, array &$infoCache,
+        $assetType, ProcessExecutor $process, $identifier, $resource, $cmdGet,
+        $cmdLog, $repoDir, $datetimePrefix = '')
+    {
+        $infoCache[$identifier] = Util::readCache($infoCache, $cache, $assetType, $identifier);
+
+        if (!isset($infoCache[$identifier])) {
+            $composer = static::doGetComposerInformation($resource, $process, $cmdGet, $cmdLog, $repoDir, $datetimePrefix);
+
+            Util::writeCache($cache, $assetType, $identifier, $composer);
+            $infoCache[$identifier] = $composer;
+        }
+
+        return $infoCache[$identifier];
+    }
+
+    /**
+     * Get composer information.
+     *
+     * @param string          $resource
+     * @param ProcessExecutor $process
+     * @param string          $cmdGet
+     * @param string          $cmdLog
+     * @param string          $repoDir
+     * @param string          $datetimePrefix
+     *
+     * @return array The composer
+     */
+    protected static function doGetComposerInformation($resource, ProcessExecutor $process, $cmdGet, $cmdLog, $repoDir, $datetimePrefix = '')
+    {
+        $process->execute($cmdGet, $composer, $repoDir);
+
+        if (!trim($composer)) {
+            return array('_nonexistent_package' => true);
+        }
+
+        $composer = JsonFile::parseJson($composer, $resource);
+
+        return static::addComposerTime($composer, $process, $cmdLog, $repoDir, $datetimePrefix);
+    }
+
+    /**
+     * Add time in composer.
+     *
+     * @param array           $composer
+     * @param ProcessExecutor $process
+     * @param string          $cmd
+     * @param string          $repoDir
+     * @param string          $datetimePrefix
+     *
+     * @return array The composer
+     */
+    protected static function addComposerTime(array $composer, ProcessExecutor $process, $cmd, $repoDir, $datetimePrefix = '')
+    {
+        if (!isset($composer['time'])) {
+            $process->execute($cmd, $output, $repoDir);
+            $date = new \DateTime($datetimePrefix.trim($output), new \DateTimeZone('UTC'));
+            $composer['time'] = $date->format('Y-m-d H:i:s');
+        }
+
+        return $composer;
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Repository/Vcs/SvnDriver.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Repository/Vcs/SvnDriver.php
new file mode 100644 (file)
index 0000000..223e3fb
--- /dev/null
@@ -0,0 +1,188 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Repository\Vcs;
+
+use Composer\Config;
+use Composer\Downloader\TransportException;
+use Composer\IO\IOInterface;
+use Composer\Json\JsonFile;
+use Composer\Repository\Vcs\SvnDriver as BaseSvnDriver;
+
+/**
+ * SVN vcs driver.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class SvnDriver extends BaseSvnDriver
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function initialize()
+    {
+        $this->url = 0 === strpos($this->url, 'svn+http')
+            ? substr($this->url, 4)
+            : $this->url;
+
+        parent::initialize();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getComposerInformation($identifier)
+    {
+        $identifier = '/'.trim($identifier, '/').'/';
+        $this->infoCache[$identifier] = Util::readCache($this->infoCache, $this->cache, $this->repoConfig['asset-type'], trim($identifier, '/'), true);
+
+        if (!isset($this->infoCache[$identifier])) {
+            list($path, $rev) = $this->getPathRev($identifier);
+            $resource = $path.$this->repoConfig['filename'];
+            $output = $this->getComposerContent($resource, $rev);
+            $composer = $this->parseComposerContent($output, $resource, $path, $rev);
+
+            Util::writeCache($this->cache, $this->repoConfig['asset-type'], trim($identifier, '/'), $composer, true);
+            $this->infoCache[$identifier] = $composer;
+        }
+
+        return $this->infoCache[$identifier];
+    }
+
+    /**
+     * Get path and rev.
+     *
+     * @param string $identifier The identifier
+     *
+     * @return string[]
+     */
+    protected function getPathRev($identifier)
+    {
+        $path = $identifier;
+        $rev = '';
+
+        preg_match('{^(.+?)(@\d+)?/$}', $identifier, $match);
+
+        if (!empty($match[2])) {
+            $path = $match[1];
+            $rev = $match[2];
+        }
+
+        return array($path, $rev);
+    }
+
+    /**
+     * Get the composer content.
+     *
+     * @param string $resource The resource
+     * @param string $rev      The rev
+     *
+     * @return null|string The composer content
+     *
+     * @throws TransportException
+     */
+    protected function getComposerContent($resource, $rev)
+    {
+        $output = null;
+
+        try {
+            $output = $this->execute($this->getSvnCredetials('svn cat'), $this->baseUrl.$resource.$rev);
+        } catch (\RuntimeException $e) {
+            throw new TransportException($e->getMessage());
+        }
+
+        return $output;
+    }
+
+    /**
+     * Parse the content of composer.
+     *
+     * @param string|null $output   The output of process executor
+     * @param string      $resource The resouce
+     * @param string      $path     The path
+     * @param string      $rev      The rev
+     *
+     * @return array The composer
+     */
+    protected function parseComposerContent($output, $resource, $path, $rev)
+    {
+        if (!trim($output)) {
+            return array('_nonexistent_package' => true);
+        }
+
+        $composer = (array) JsonFile::parseJson($output, $this->baseUrl.$resource.$rev);
+
+        return $this->addComposerTime($composer, $path, $rev);
+    }
+
+    /**
+     * Add time in composer.
+     *
+     * @param array  $composer The composer
+     * @param string $path     The path
+     * @param string $rev      The rev
+     *
+     * @return array The composer
+     */
+    protected function addComposerTime(array $composer, $path, $rev)
+    {
+        if (!isset($composer['time'])) {
+            $output = $this->execute($this->getSvnCredetials('svn info'), $this->baseUrl.$path.$rev);
+
+            foreach ($this->process->splitLines($output) as $line) {
+                if ($line && preg_match('{^Last Changed Date: ([^(]+)}', $line, $match)) {
+                    $date = new \DateTime($match[1], new \DateTimeZone('UTC'));
+                    $composer['time'] = $date->format('Y-m-d H:i:s');
+                    break;
+                }
+            }
+        }
+
+        return $composer;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public static function supports(IOInterface $io, Config $config, $url, $deep = false)
+    {
+        if (0 === strpos($url, 'http') && preg_match('/\/svn|svn\//i', $url)) {
+            $url = 'svn'.substr($url, strpos($url, '://'));
+        }
+
+        return parent::supports($io, $config, $url, $deep);
+    }
+
+    /**
+     * Get the credentials of SVN.
+     *
+     * @param string $command The command
+     *
+     * @return string
+     */
+    protected function getSvnCredetials($command)
+    {
+        $httpBasic = $this->config->get('http-basic');
+        $parsedUrl = parse_url($this->baseUrl);
+        $svnCommand = $command;
+
+        if ($parsedUrl && isset($httpBasic[$parsedUrl['host']])) {
+            if ($httpBasic[$parsedUrl['host']]['username'] && $httpBasic[$parsedUrl['host']]['password']) {
+                $uname = $httpBasic[$parsedUrl['host']]['username'];
+                $pw = $httpBasic[$parsedUrl['host']]['password'];
+
+                $svnCommand = $command.sprintf(' --username %s --password %s --no-auth-cache', $uname, $pw);
+            }
+        }
+
+        return $svnCommand;
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Repository/Vcs/Util.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Repository/Vcs/Util.php
new file mode 100644 (file)
index 0000000..d1a9915
--- /dev/null
@@ -0,0 +1,109 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Repository\Vcs;
+
+use Composer\Cache;
+use Composer\Json\JsonFile;
+use Composer\Repository\Vcs\VcsDriverInterface;
+
+/**
+ * Helper for VCS driver.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class Util
+{
+    /**
+     * Check if the identifier is an SHA.
+     *
+     * @param string $identifier The identifier
+     *
+     * @return bool
+     */
+    public static function isSha($identifier)
+    {
+        return (bool) preg_match('{[a-f0-9]{40}}i', $identifier);
+    }
+
+    /**
+     * @param array  $cacheCode  The cache code
+     * @param Cache  $cache      The cache filesystem
+     * @param string $type       The asset type
+     * @param string $identifier The identifier
+     * @param bool   $force      Force the read
+     *
+     * @return array|null
+     */
+    public static function readCache(array $cacheCode, Cache $cache, $type, $identifier, $force = false)
+    {
+        if (array_key_exists($identifier, $cacheCode)) {
+            return $cacheCode[$identifier];
+        }
+
+        $data = null;
+        if (self::isSha($identifier) || $force) {
+            $res = $cache->read($type.'-'.$identifier);
+
+            if ($res) {
+                $data = JsonFile::parseJson($res);
+            }
+        }
+
+        return $data;
+    }
+
+    /**
+     * @param Cache  $cache      The cache
+     * @param string $type       The asset type
+     * @param string $identifier The identifier
+     * @param array  $composer   The data composer
+     * @param bool   $force      Force the write
+     */
+    public static function writeCache(Cache $cache, $type, $identifier, array $composer, $force = false)
+    {
+        if (self::isSha($identifier) || $force) {
+            $cache->write($type.'-'.$identifier, json_encode($composer));
+        }
+    }
+
+    /**
+     * Add time in composer.
+     *
+     * @param array              $composer    The composer
+     * @param string             $resourceKey The composer key
+     * @param string             $resource    The resource url
+     * @param VcsDriverInterface $driver      The vcs driver
+     * @param string             $method      The method for get content
+     *
+     * @return array The composer
+     */
+    public static function addComposerTime(array $composer, $resourceKey, $resource, VcsDriverInterface $driver, $method = 'getContents')
+    {
+        if (!isset($composer['time'])) {
+            $ref = new \ReflectionClass($driver);
+            $meth = $ref->getMethod($method);
+            $meth->setAccessible(true);
+
+            $commit = JsonFile::parseJson($meth->invoke($driver, $resource), $resource);
+            $keys = explode('.', $resourceKey);
+
+            while (!empty($keys)) {
+                $commit = $commit[$keys[0]];
+                array_shift($keys);
+            }
+
+            $composer['time'] = $commit;
+        }
+
+        return $composer;
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Repository/VcsPackageFilter.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Repository/VcsPackageFilter.php
new file mode 100644 (file)
index 0000000..51cbc12
--- /dev/null
@@ -0,0 +1,323 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Repository;
+
+use Composer\Installer\InstallationManager;
+use Composer\Package\Link;
+use Composer\Package\Loader\ArrayLoader;
+use Composer\Package\Package;
+use Composer\Package\PackageInterface;
+use Composer\Package\RootPackageInterface;
+use Composer\Repository\InstalledFilesystemRepository;
+use Composer\Semver\Constraint\MultiConstraint;
+use Fxp\Composer\AssetPlugin\Config\Config;
+use Fxp\Composer\AssetPlugin\Package\Version\VersionParser;
+use Fxp\Composer\AssetPlugin\Type\AssetTypeInterface;
+
+/**
+ * Filters the asset packages imported into VCS repository to optimize
+ * performance when getting the informations of packages.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class VcsPackageFilter
+{
+    /**
+     * @var Config
+     */
+    protected $config;
+
+    /**
+     * @var RootPackageInterface
+     */
+    protected $package;
+
+    /**
+     * @var InstallationManager
+     */
+    protected $installationManager;
+
+    /**
+     * @var InstalledFilesystemRepository
+     */
+    protected $installedRepository;
+
+    /**
+     * @var VersionParser
+     */
+    protected $versionParser;
+
+    /**
+     * @var ArrayLoader
+     */
+    protected $arrayLoader;
+
+    /**
+     * @var bool
+     */
+    protected $enabled;
+
+    /**
+     * @var array
+     */
+    protected $requires;
+
+    /**
+     * Constructor.
+     *
+     * @param Config                             $config              The plugin config
+     * @param RootPackageInterface               $package             The root package
+     * @param InstallationManager                $installationManager The installation manager
+     * @param InstalledFilesystemRepository|null $installedRepository The installed repository
+     */
+    public function __construct(Config $config, RootPackageInterface $package, InstallationManager $installationManager, InstalledFilesystemRepository $installedRepository = null)
+    {
+        $this->config = $config;
+        $this->package = $package;
+        $this->installationManager = $installationManager;
+        $this->installedRepository = $installedRepository;
+        $this->versionParser = new VersionParser();
+        $this->arrayLoader = new ArrayLoader();
+        $this->enabled = true;
+
+        $this->initialize();
+    }
+
+    /**
+     * @param bool $enabled
+     *
+     * @return self
+     */
+    public function setEnabled($enabled)
+    {
+        $this->enabled = (bool) $enabled;
+
+        return $this;
+    }
+
+    /**
+     * Check if the filter is enabled.
+     *
+     * @return bool
+     */
+    public function isEnabled()
+    {
+        return $this->enabled;
+    }
+
+    /**
+     * Check if the version must be skipped.
+     *
+     * @param AssetTypeInterface $assetType The asset type
+     * @param string             $name      The composer package name
+     * @param string             $version   The version
+     *
+     * @return bool
+     */
+    public function skip(AssetTypeInterface $assetType, $name, $version)
+    {
+        try {
+            $cVersion = $assetType->getVersionConverter()->convertVersion($version);
+            $normalizedVersion = $this->versionParser->normalize($cVersion);
+        } catch (\Exception $ex) {
+            return true;
+        }
+
+        if (false !== $this->skipByPattern() && $this->forceSkipVersion($normalizedVersion)) {
+            return true;
+        }
+
+        return $this->doSkip($name, $normalizedVersion);
+    }
+
+    /**
+     * Do check if the version must be skipped.
+     *
+     * @param string $name              The composer package name
+     * @param string $normalizedVersion The normalized version
+     *
+     * @return bool
+     */
+    protected function doSkip($name, $normalizedVersion)
+    {
+        if (!isset($this->requires[$name]) || false !== strpos($normalizedVersion, '-p')) {
+            return false;
+        }
+
+        /* @var Link $require */
+        $require = $this->requires[$name];
+
+        return !$this->satisfy($require, $normalizedVersion) && $this->isEnabled();
+    }
+
+    /**
+     * Check if the require dependency has a satisfactory version and stability.
+     *
+     * @param Link   $require           The require link defined in root package
+     * @param string $normalizedVersion The normalized version
+     *
+     * @return bool
+     */
+    protected function satisfy(Link $require, $normalizedVersion)
+    {
+        return $this->satisfyVersion($require, $normalizedVersion)
+            && $this->satisfyStability($require, $normalizedVersion);
+    }
+
+    /**
+     * Check if the filter must be skipped the version by pattern or not.
+     *
+     * @return string|false Return the pattern or FALSE for disable the feature
+     */
+    protected function skipByPattern()
+    {
+        $skip = $this->config->get('pattern-skip-version', false);
+
+        return is_string($skip)
+            ? trim($skip, '/')
+            : false;
+    }
+
+    /**
+     * Check if the require package version must be skipped or not.
+     *
+     * @param string $normalizedVersion The normalized version
+     *
+     * @return bool
+     */
+    protected function forceSkipVersion($normalizedVersion)
+    {
+        return (bool) preg_match('/'.$this->skipByPattern().'/', $normalizedVersion);
+    }
+
+    /**
+     * Check if the require dependency has a satisfactory version.
+     *
+     * @param Link   $require           The require link defined in root package
+     * @param string $normalizedVersion The normalized version
+     *
+     * @return bool
+     */
+    protected function satisfyVersion(Link $require, $normalizedVersion)
+    {
+        $constraintSame = $this->versionParser->parseConstraints($normalizedVersion);
+        $sameVersion = (bool) $require->getConstraint()->matches($constraintSame);
+
+        $consNormalizedVersion = FilterUtil::getVersionConstraint($normalizedVersion, $this->versionParser);
+        $constraint = FilterUtil::getVersionConstraint($consNormalizedVersion->getPrettyString(), $this->versionParser);
+
+        return (bool) $require->getConstraint()->matches($constraint) || $sameVersion;
+    }
+
+    /**
+     * Check if the require dependency has a satisfactory stability.
+     *
+     * @param Link   $require           The require link defined in root package
+     * @param string $normalizedVersion The normalized version
+     *
+     * @return bool
+     */
+    protected function satisfyStability(Link $require, $normalizedVersion)
+    {
+        $requireStability = $this->getRequireStability($require);
+        $stability = $this->versionParser->parseStability($normalizedVersion);
+
+        return Package::$stabilities[$stability] <= Package::$stabilities[$requireStability];
+    }
+
+    /**
+     * Get the minimum stability for the require dependency defined in root package.
+     *
+     * @param Link $require The require link defined in root package
+     *
+     * @return string The minimum stability
+     */
+    protected function getRequireStability(Link $require)
+    {
+        $prettyConstraint = $require->getPrettyConstraint();
+        $stabilities = Package::$stabilities;
+
+        if (preg_match_all('/@('.implode('|', array_keys($stabilities)).')/', $prettyConstraint, $matches)) {
+            return FilterUtil::findInlineStabilities($matches[1], $this->versionParser);
+        }
+
+        return FilterUtil::getMinimumStabilityFlag($this->package, $require);
+    }
+
+    /**
+     * Initialize.
+     */
+    protected function initialize()
+    {
+        $this->requires = array_merge(
+            $this->package->getRequires(),
+            $this->package->getDevRequires()
+        );
+
+        if (null !== $this->installedRepository
+                && FilterUtil::checkConfigOption($this->config, 'optimize-with-installed-packages')) {
+            $this->initInstalledPackages();
+        }
+    }
+
+    /**
+     * Initialize the installed package.
+     */
+    private function initInstalledPackages()
+    {
+        /* @var PackageInterface $package */
+        foreach ($this->installedRepository->getPackages() as $package) {
+            $operator = $this->getFilterOperator($package);
+            /* @var Link $link */
+            $link = current($this->arrayLoader->parseLinks($this->package->getName(), $this->package->getVersion(), 'installed', array($package->getName() => $operator.$package->getPrettyVersion())));
+            $link = $this->includeRootConstraint($package, $link);
+
+            $this->requires[$package->getName()] = $link;
+        }
+    }
+
+    /**
+     * Include the constraint of root dependency version in the constraint
+     * of installed package.
+     *
+     * @param PackageInterface $package The installed package
+     * @param Link             $link    The link contained installed constraint
+     *
+     * @return Link The link with root and installed version constraint
+     */
+    private function includeRootConstraint(PackageInterface $package, Link $link)
+    {
+        if (isset($this->requires[$package->getName()])) {
+            /* @var Link $rLink */
+            $rLink = $this->requires[$package->getName()];
+            $useConjunctive = FilterUtil::checkConfigOption($this->config, 'optimize-with-conjunctive');
+            $constraint = new MultiConstraint(array($rLink->getConstraint(), $link->getConstraint()), $useConjunctive);
+            $link = new Link($rLink->getSource(), $rLink->getTarget(), $constraint, 'installed', $constraint->getPrettyString());
+        }
+
+        return $link;
+    }
+
+    /**
+     * Get the filter root constraint operator.
+     *
+     * @param PackageInterface $package
+     *
+     * @return string
+     */
+    private function getFilterOperator(PackageInterface $package)
+    {
+        return $this->installationManager->isPackageInstalled($this->installedRepository, $package)
+            ? '>'
+            : '>=';
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Resources/doc/faqs.md b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Resources/doc/faqs.md
new file mode 100644 (file)
index 0000000..09bc2b3
--- /dev/null
@@ -0,0 +1,164 @@
+FAQs
+====
+
+What version required of Composer?
+----------------------------------
+
+See the documentation: [Installation](index.md#installation).
+
+How does the plugin work?
+-------------------------
+
+To add dependencies of asset in Composer, the plugin uses the VCS repositories to add
+each repository of a required asset.
+
+However, to retrieve the repository of an asset automatically, the plugin needs to add
+a Composer 'Repository' operating in the same way than the 'Packagist' registry, but
+dedicated to the NPM and Bower registries. Of course, it’s still possible to
+add an asset’s VCS repository manually.
+
+Once the VCS repository is selected, Composer downloads the package definition of the
+main branch, together with the list of branches and tags. Of course, a conversion of
+NPM or Bower package definitions is made. Note that the definitions of each package will
+be taken at the time Composer needs it (in the Solver).
+
+This way, the plugin makes it possible to add a VCS repository by simulating the presence
+of the `composer.json` file, and there is no need to add this file manually if the 
+package is registered in the registry of NPM or Bower, and if the file `bower.json` or
+`package.json` is present in the repository.
+
+Why does the plugin use the VCS repository?
+-------------------------------------------
+
+There are already several possibilities for managing assets in a PHP project:
+
+1. Install Node.js and use NPM or Bower command line in addition to Composer command line
+2. Do #1, but add Composer scripts to automate the process
+3. Include assets directly in the project (not recommended)
+4. Create a repository with all assets and include the `composer.json` file (and use
+Packagist or an VCS repository)
+5. Add a package repository in `composer.json` with a direct download link
+6. Create a Satis or Packagist server
+7. And possibly other creative options
+
+In the case of a complete project in PHP, it shouldn't be necessary to use several tools
+(PHP, Nodejs, Composer, NPM, Bower, Grunt, etc.) to simply install these assets in your
+project. This eliminates the possibilities 1, 2 and 3.
+
+Solution 6 is unfortunately not feasible, because it would regularly collect all
+packages in the registries of NPM and Bower, then analyze each and every branch and
+every tag of each package. The packages would not be updated immediately, and the
+requests limit of API would be reached very quickly.
+
+The solutions 4 and 5 are standard in Composer, but they are very onerous to manage. The
+plugin allows exactly opting for this solution, while sorely simplifying these solutions.
+
+Why is Composer slow when the plugin retrieves the package definitions?
+-----------------------------------------------------------------------
+
+For the VCS repositories, the native system of Composer retrieves the package definitions
+for all branches and all tags. If these are numerous, it may become very slow. However,
+the plugin uses a caching system, allowing to not make new requests to retrieve the
+definitions of packages. The next commands install/update will be much faster.
+
+The performance to get the new package definitions could be even higher, but this requires
+a change directly into Composer ([see composer/composer#3282](https://github.com/composer/composer/issues/3282)).
+
+Why are the definitions from multiple versions of package retrieved to install?
+-------------------------------------------------------------------------------
+
+For the `install`, the Solver must verify that each version available answer all project
+constraints.
+
+Therefore, if constraints of version are 'flexible', then the Solver must retrieve the
+definitions of package for each version who answer the constraint.
+
+So, more you specify the version, less Composer will try to retrieve the definitions
+of package.
+
+Why are all the versions definitions retrieved for all packages to update?
+--------------------------------------------------------------------------
+
+For the `update`, The Solver must obtain all of the definitions for each package and for
+all available versions.
+
+The plugin uses the system of VCS repository, and this can significantly slow the
+retrieving of the definitions of packages. Fortunately, a caching system avoids to
+download every time all versions.
+
+With the version `>1.0.0-beta3` of the plugin, a new import filter lets you import only
+package definitions greater than or equal to the installed versions. In this way, the
+performances are dramatically improved.
+
+Composer throws an exception stating that the version does not exist
+--------------------------------------------------------------------
+
+If Composer throws an exception stating that the version does not exist, whereas the
+version exists, but it isn't imported, it means that this new package version is lesser than
+the installed version.
+
+Of course, 3 solutions can work around the problem:
+
+1. delete the `vendor` directory, do the `update`
+2. disable temporarily the import filter in the `config` section
+3. add the dependency in the root Composer package:
+  - add the dependency in the root Composer package with the required version (the version not found)
+  - put the option `config.fxp-asset.optimize-with-conjunctive` to `false`,
+  - do the `update`,
+  - remove the dependency in the root Composer package
+  - remove the option `config.fxp-asset.optimize-with-conjunctive`
+  - do the `update` to sync the lock file,
+
+> The solution 1 is the easiest and fastest.
+
+See the documentation: [Disable the import filter using the installed packages](index.md#disable-the-import-filter-using-the-installed-packages)
+
+How to reduce the number of requests for getting the package definitions?
+-------------------------------------------------------------------------
+
+For the `install`, the more you specify the versions in your dependencies, less Composer will
+try to retrieve the definitions of the packages.
+
+For the `update`, in contrast, this is unfortunately not the case, because Composer must
+retrieve all the definitions of the packages.
+
+But a trick allows to filter the import of package definitions to the `install`, but also
+for the `update`:
+
+Add directly to your root Composer package, the dependencies that you want to filter. Of
+course, all constraints of versions are functional (exact version, range, wildcard, tilde
+operator). In this way, all versions are not accepted by the constraint of version and
+they will be skipped to the importation, and will not be injected in the `Pool`.
+
+See the documentation: [Reduce the number of requests for getting the package definitions](index.md#reduce-the-number-of-requests-for-getting-the-package-definitions)
+
+How to increase the PHP memory limit?
+-------------------------------------
+
+See the official documentation of Composer: [Memory limits errors](https://getcomposer.org/doc/articles/troubleshooting.md#memory-limit-errors).
+
+Why should I create a token for Github?
+---------------------------------------
+
+It's a rate limit of Github API. In anonymous access, Github at a greatly reduced limit
+(60/hr), and you must be logged with a token for have a much higher limit (5 000/hr).
+
+The problem also exists using Nodejs NPM and Bower.
+
+If you want more details: [Github Personal API Tokens]
+(https://github.com/blog/1509-personal-api-tokens)
+
+See the official documentation of Composer: [API rate limit and OAuth tokens](https://getcomposer.org/doc/articles/troubleshooting.md#api-rate-limit-and-oauth-tokens).
+
+How to add a Github token in the configuration?
+-----------------------------------------------
+
+See the official documentation of Composer: [API rate limit and OAuth tokens](https://getcomposer.org/doc/articles/troubleshooting.md#api-rate-limit-and-oauth-tokens).
+
+Why the asset VCS repositories are placed in the 'config' section?
+------------------------------------------------------------------
+
+Because it's impossible to create the custom VCS repositories: Composer checks the type
+of VCS repository before the loading of plugins, so, an exception is thrown.
+
+The only way, is to put the config in `config` section (see the [doc](https://github.com/fxpio/composer-asset-plugin/blob/master/Resources/doc/schema.md#configfxp-assetrepositories-root-only)).
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Resources/doc/index.md b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Resources/doc/index.md
new file mode 100644 (file)
index 0000000..5bc8b3f
--- /dev/null
@@ -0,0 +1,657 @@
+Basic Usage
+===========
+
+1. [Installation](index.md)
+2. [Composer Schema of Asset](schema.md)
+3. [FAQs](faqs.md)
+
+## Installation
+
+See the [Release Notes](https://github.com/fxpio/composer-asset-plugin/releases)
+to know the Composer version required.
+
+### Global scope (per user) installation
+
+```shell
+$ composer global require "fxp/composer-asset-plugin:~1.3"
+```
+
+### Project scope installation
+
+The installation in the project scope is not supported (see the
+[issue #7](https://github.com/fxpio/composer-asset-plugin/issues/7)).
+
+## Usage
+
+### Usage with asset repository
+
+Adding a dependency on an asset, you must add the asset to the property
+`require` of the `composer.json` of your project.
+
+It must be prefixed with `{asset-type}-asset/`.
+
+**Example for twitter bootstrap:**
+
+```json
+{
+    "require": {
+        "npm-asset/bootstrap": "dev-master"
+    }
+}
+```
+
+**or:**
+
+```json
+{
+    "require": {
+        "bower-asset/bootstrap": "dev-master"
+    }
+}
+```
+
+### Usage with Private Bower Registry
+
+You can work with your private Bower server build with
+[Hacklone Private Bower](https://github.com/Hacklone/private-bower):
+
+Adding the URL to your Private Bower Server in the `composer.json` in the section `config`. This
+Asset Plugin automaticly look if there is a private Bower URL defined and search for your Private
+Bower Package.
+
+**Example:**
+
+```json
+{
+    "config": {
+        "fxp-asset": {
+            "private-bower-registries": {
+                "<YourPrivateBowerRegistryServerName>": "https://<YourPrivateBowerRegistryServerURL>/packages"
+            }
+        }
+    }
+}
+```
+
+### Usage with VCS repository
+
+If your asset is not listed on the NPM- or Bower-Repository, or it is a private package, you can
+create a VCS repository for it. The repository must have an asset package file for NPM (`package.json`)
+or Bower (`bower.json`).
+
+In addition, the repository must respect the specifications of [Bower Spec]
+(https://github.com/bower/bower.json-spec) or [NPM Spec](https://docs.npmjs.com/files/package.json)
+for the package files. Concerning the version numbers and the tags, they must respect the [Semver 2.0]
+(http://semver.org/) format.
+
+If your repository does not contain a tag that repsent the number, you must put the flag `@dev` or directly
+use the development branch `dev-master`.
+
+**Example:**
+
+Add the following to your `composer.json`:
+
+```json
+{
+    "config": {
+        "fxp-asset": {
+            "repositories": [
+                {
+                    "type": "bower-vcs",
+                    "url": "https://github.com/vendor/exemple-asset-name.git"
+                }
+            ]
+        }
+    }
+}
+```
+
+**Availables drivers:**
+
+| Drivers             | NPM                 | Bower                 |
+|---------------------|---------------------|-----------------------|
+| **auto**            | `npm-vcs`           | `bower-vcs`           |
+| Git                 | `npm-git`           | `bower-git`           |
+| GitHub              | `npm-github`        | `bower-github`        |
+| Git Bitbucket       | `npm-git-bitbucket` | `bower-git-bitbucket` |
+| Mercurial           | `npm-hg`            | `bower-hg`            |
+| Mercurial Bitbucket | `npm-hg-bitbucket`  | `bower-hg-bitbucket`  |
+| SVN                 | `npm-svn`           | `bower-svn`           |
+| Perforce            | `npm-perforce`      | `bower-perforce`      |
+
+### Overriding the config of a VCS Repository
+
+If you must use a repository other than that indicated by the registry of NPM or Bower,
+you must specify the name of the package with the asset prefix in the config of the VCS
+Repository.
+
+**Example:**
+
+```json
+{
+    "config": {
+        "fxp-asset": {
+            "repositories": [
+                {
+                    "type": "bower-vcs",
+                    "url": "https://github.com/vendor/exemple-asset-name.git",
+                    "name": "bower-asset/exemple-asset-name"
+                }
+            ]
+        }
+    }
+}
+```
+
+You can also use the standard format of Composer for naming your VCS Repository:
+
+```json
+{
+    "config": {
+        "fxp-asset": {
+            "repositories": {
+                "bower-asset/exemple-asset-name": {
+                    "type": "bower-vcs",
+                    "url": "https://github.com/vendor/exemple-asset-name.git"
+                }
+            }
+        }
+    }
+}
+```
+
+### Usage with multiple versions of the same dependency
+
+If you need to use multiple versions of the same asset, you can do this by
+simply adding a version number after the package name, separated with the "-"
+character.
+
+**Example with Jquery:**
+
+```json
+{
+    "require": {
+        "bower-asset/jquery": "1.11.*",
+        "bower-asset/jquery-2.0.x": "2.0.x",
+        "bower-asset/jquery-2.1.0": "2.1.0"
+    }
+}
+```
+
+The dependencies will then be placed in the following directories:
+
+- `vendor/bower-asset/jquery` for `1.11.*`
+- `vendor/bower-asset/jquery-2.0.x` for `2.0.x`
+- `vendor/bower-asset/jquery-2.1.0` for `2.1.0`
+
+### Reduce the number of requests for getting the package definitions
+
+The root Composer package has a feature: all asset dependencies added will have automatically
+a filter applied, before the importation of the branches and the tags.
+
+In this way, all versions are not accepted by the constraint of version and they will be
+skipped to the importation, and will not be injected in the `Pool`. Of course, all constraints
+of versions are functional (exact version, range, wildcard, tilde operator).
+
+**For example:**
+
+The root `composer.json`:
+
+```json
+{
+    "minimum-stability": "dev",
+    "require": {
+        "npm-asset/example-asset1": ">=1.0@stable",
+        "npm-asset/example-asset2": ">=2.3@RC",
+        "npm-asset/example-asset3": ">=1.3@beta",
+        "npm-asset/example-asset4": "~0.9@alpha",
+        "npm-asset/example-asset4": "2.1.*",
+    }
+}
+```
+
+In case you have an dependency that that requires a sub asset dependency, and given that this
+optimization cannot be performed with the sub dependencies, you can add this asset dependency
+directly to the root Composer package, in the same way that if you wanted to use a
+well-defined version of this dependency.
+
+### Disable the import filter using the installed packages
+
+By default, and for dramatically optimize performance for the `update`, the plugin filters the
+imports of definitions packages. In addition to filter with the dependencies in the root
+Composer package, the plugin filters the imports of packages definitions with the previous
+versions of the packages installed.
+
+However it may happen that Composer throws an exception, indicating that it can not find a
+compatible version. This happens if a dependency uses a new version lower than the installed
+version.
+
+Of course, several solutions can work around the problem (see the [FAQs]
+(faqs.md#composer-throws-an-exception-stating-that-the-version-does-not-exist)), but the
+solution below may be used in another use case.
+
+You can disable the import filter using the versions of installed packages with the option
+`config.fxp-asset.optimize-with-installed-packages` in the root Composer package:
+
+```json
+{
+    "config": {
+        "fxp-asset": {
+            "optimize-with-installed-packages": false
+        }
+    }
+}
+```
+
+#### Change/Disable the skip of versions by pattern
+
+By default, the plugin does not import the `patch` versions for increase dramatically
+performance. However, it is possible to change the pattern or to disable this feature.
+
+**Example for change the pattern:**
+
+```json
+{
+    "config": {
+        "fxp-asset": {
+            "pattern-skip-version": "(-build)"
+        }
+    }
+}
+```
+
+**Example for disable the pattern:**
+
+```json
+{
+    "config": {
+        "fxp-asset": {
+            "pattern-skip-version": false
+        }
+    }
+}
+```
+
+#### Disable the conjunctive option of the import filter
+
+You can disable the `conjunctive` mode of the import filter with the option
+`config.fxp-asset.optimize-with-conjunctive` in the root Composer package:
+
+```json
+{
+    "config": {
+        "fxp-asset": {
+            "optimize-with-conjunctive": false
+        }
+    }
+}
+```
+
+> **Note:**
+>
+> This option is used only if the optimization with the installed packages is enabled
+
+### Define a custom directory for the assets installation
+
+By default, the plugin will install all the assets in the directory
+`vendors/{asset-type}-asset` and packages will be installed in each folder with
+their asset name.
+
+But you can change the installation directory of the assets directly in the root
+`composer.json`-file of your project:
+
+```json
+{
+    "config": {
+        "fxp-asset": {
+            "installer-paths": {
+                "npm-asset-library": "web/assets/vendor",
+                "bower-asset-library": "web/assets/vendor"
+            }
+        }
+    }
+}
+```
+
+> **Note:**
+>
+> For Bower, all files defined in the section `ignore` will not be installed
+
+### Disable or replace the deleting of the ignore files for Bower
+
+For Bower, all files defined in the section `ignore` will be delete just after the
+installation of each package. Of course, this behavior can be disabled or replaced.
+
+**Example for disable the list of ignored files:**
+
+```json
+{
+    "config": {
+        "fxp-asset": {
+            "ignore-files": {
+                "bower-asset/example-asset1": false
+            }
+        }
+    }
+}
+```
+
+**Example for replace the list of ignored files:**
+
+```json
+{
+    "config": {
+        "fxp-asset": {
+            "ignore-files": {
+                "bower-asset/example-asset1": [
+                    ".*",
+                    "*.md",
+                    "test"
+                ]
+            }
+        }
+    }
+}
+```
+
+### Enable manually the deleting of the ignore files for NPM
+
+For NPM, there is no section `ignore`, but you can manually add the patterns for
+delete the files:
+
+```json
+{
+    "config": {
+        "fxp-asset": {
+            "ignore-files": {
+                "npm-asset/example-asset1": [
+                    ".*",
+                    "*.md",
+                    "test"
+                ]
+            }
+        }
+    }
+}
+```
+
+### Work with the NPM scopes
+
+NPM can manage the package with the vendor scopes (`@<vendor>/<dependency-name>`),
+but Composer has already a namespace for vendors, and this plugin create a virtual
+vendor for the NPM assets (`npm-asset/`). Futhermore, the `@` character is not
+managed by Composer for the package name.
+
+For this reason, the NPM scope `@<vendor>/` is converted into `<vendor>--`.
+
+NPM package name              | Composer package name
+------------------------------|-----------------------------------------
+`@<vendor>/<dependency-name>` | `npm-asset/<vendor>--<dependency-name>`
+
+### Use the Ignore Files Manager in the Composer scripts
+
+Sometimes you need to clean a package that is not considered an NPM/Bower Asset
+Package. To do this, you can use the script helper
+`Fxp\Composer\AssetPlugin\Composer\ScriptHandler::deleteIgnoredFiles` for the
+`post-package-install` or `post-package-update` script events.
+
+**Example:**
+
+```json
+{
+    "scripts": {
+        "post-package-install": [
+            "Fxp\\Composer\\AssetPlugin\\Composer\\ScriptHandler::deleteIgnoredFiles"
+        ],
+        "post-package-update": [
+            "Fxp\\Composer\\AssetPlugin\\Composer\\ScriptHandler::deleteIgnoredFiles"
+        ]
+    },
+    "config": {
+        "fxp-asset": {
+            "ignore-files": {
+                "acme/other-asset": [
+                    ".*",
+                    "*.md",
+                    "test"
+                ]
+            }
+        }
+    }
+}
+```
+
+### Override the main files for Bower
+
+The bower.json specification allows packages to define entry-point files
+which can later be processed with taskrunners or build scripts. Some Bower
+plugins like main-bower-files, wiredep and asset-builder have a feature to
+override the package main files in the project configuration file.
+
+You can do the same with composer-asset-plugin, just add a section
+`config.fxp-asset.main-files` in the root project `composer.json` file with the package
+name and the files you want to mark as main files.
+
+**Example:**
+
+```json
+{
+    "config": {
+        "fxp-asset": {
+            "main-files": {
+                "acme/other-asset": [
+                    "other-asset.js"
+                ]
+            }
+        }
+    }
+}
+```
+
+### Disable the search for an asset registry
+
+If you want to disable the search for an asset registry, you can add the
+option `config.fxp-asset.registry-options.{type}-searchable` in the root project
+`composer.json`-file.
+
+**Example:**
+
+```json
+{
+    "config": {
+        "fxp-asset": {
+            "registry-options": {
+                "npm-searchable": false,
+                "bower-searchable": false
+            }
+        }
+    }
+}
+```
+
+### Use no-api option of VCS Githhub driver
+
+If you want to use the [no-api](https://getcomposer.org/doc/05-repositories.md#git-alternatives) option
+for your Github assets, you can add the option `config.fxp-asset.vcs-driver-options.github-no-api` in
+the root project `composer.json` file. By default, this option is to `false`. The option `config.fxp-asset.pattern-skip-version`
+can be used to exclude tags via a regular expression.
+
+```json
+{
+    "config": {
+        "fxp-asset": {
+            "vcs-driver-options": {
+                "github-no-api": true
+            },
+            "pattern-skip-version": "(-build|-patch)"
+        }
+    }
+}
+```
+
+You can further define this option for each package:
+
+```json
+{
+    "config": {
+        "fxp-asset": {
+            "vcs-driver-options": {
+                "github-no-api": {
+                    "default": true,
+                    "packages": {
+                        "bower-asset/example-asset1": false
+                    }
+                }
+            }
+        }
+    }
+}
+```
+
+With this configuration, all your github packages will use the native Git, except for
+the `bower-asset/example-asset1` package.
+
+### Solve the conflicts of asset dependencies
+
+Bower include a [resolution section](https://jaketrent.com/post/bower-resolutions) to
+solve the conflicts between 2 same dependencies but with different versions.
+
+As for NPM, it's possible to install several versions of the same dependency by different
+dependencies, which is not the case for Bower and Composer. Only the installation of a
+single version compatible for all dependencies is possible.
+
+The dependency resolution would force (replace) a version or range version directly in the
+root Composer package.
+
+**Example:**
+```json
+    "name": "foo/bar",
+    "require": {
+        "bower-asset/jquery": "^2.2.0"
+    }
+```
+```json
+    "name": "bar/baz",
+    "require": {
+        "bower-asset/jquery": "2.0.*"
+    }
+```
+```json
+    "name": "root/package",
+    "require": {
+        "foo/bar": "^1.0.0",
+        "bar/baz": "^1.0.0"
+    }
+    "config": {
+        "fxp-asset": {
+            "resolutions": {
+                "bower-asset/jquery": "^3.0.0"
+            }
+        }
+    }
+```
+
+Result, all asset packages with the `bower-asset/jquery` dependency will use the `^3.0.0` range version.
+
+> **Note:**
+> Be careful when replacing the version, and check the compatibility before.
+
+### Define the config for all projects
+
+You can define each option (`config.fxp-asset.*`) in each project in the `composer.json`
+file of each project, but you can also set an option for all projects.
+
+To do this, you simply need to add your options in the Composer global configuration,
+in the file of your choice:
+
+- `<COMPOSER_HOME>/composer.json` file
+- `<COMPOSER_HOME>/config.json` file
+
+> **Note:**
+> The `composer global config` command cannot be used, bacause Composer does not accept custom options.
+> But you can use the command `composer global config -e` to edit the global `composer.json`
+file with your text editor.
+
+### Define the config in a environment variable
+
+You can define each option (`config.fxp-asset.*`) directly in the PHP environment variables. For
+this, all variables will start with `FXP_ASSET__` and uppercased, and each `-` will replaced by `_`.
+
+The accepted value types are:
+
+- string
+- boolean
+- integer
+- JSON array or object
+
+**Example:**
+```json
+{
+    "config": {
+        "fxp-asset": {
+            "pattern-skip-version": "(-patch)"
+        }
+    }
+}
+```
+
+Can be overridden by `FXP_ASSET__PATTERN_SKIP_VERSION="(-build)"` environment variable.
+
+**Example:**
+```json
+{
+    "config": {
+        "fxp-asset": {
+            "vcs-driver-options": {
+                "github-no-api": true
+            }
+        }
+    }
+}
+```
+
+Can be overridden by `FXP_ASSET__VCS_DRIVER_OPTIONS='{"github-no-api": true}'` environment variable.
+
+
+### Config priority order
+
+The config values are retrieved in priority in:
+
+1. the environment variables starting with `FXP_ASSET__`
+2. the project `composer.json` file
+3. the global `<COMPOSER_HOME>/config.json` file
+4. the global `<COMPOSER_HOME>/composer.json` file
+5. the deprecated config `extra.asset-*` of the project `composer.json` file
+
+### Disable the plugin
+
+When you working on multiple PHP projects, you do not necessarily need to use the plugin. It's
+possible to disable the plugin with the `config.fxp-asset.enabled` option with the `false` value.
+
+For example, you can disable the plugin globally (for all your projects), and enable it only
+for projects requiring the plugin.
+
+**Example:**
+```json
+// The global <COMPOSER_HOME>/config.json file
+{
+    "config": {
+        "fxp-asset": {
+            "enabled": false
+        }
+    }
+}
+```
+```json
+// The project composer.json file
+{
+    "config": {
+        "fxp-asset": {
+            "enabled": true
+        }
+    }
+}
+```
+
+> **Note:**
+> If you disable the plugin, and your project require this plugin, Composer will throw an exception indicating that the asset dependencies does not exist.
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Resources/doc/schema.md b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Resources/doc/schema.md
new file mode 100644 (file)
index 0000000..eb36c26
--- /dev/null
@@ -0,0 +1,276 @@
+Composer Schema of Asset
+========================
+
+### Properties
+
+##### requires
+
+Lists packages required by this package. The package will not be installed unless those requirements
+can be met.
+
+##### requires-dev (root-only)
+
+Lists packages required for developing this package, or running tests, etc. The dev requirements
+of the root package are installed by default. Both `install` or `update` support the `--no-dev`
+option that prevents dev dependencies from being installed.
+
+##### config.fxp-asset.repositories (root-only)
+
+Because the plugin is installed after the analysis of type repositories, the custom types must
+be included in a special property in `config` composer.
+
+Custom package repositories to use.
+
+By default composer just uses the packagist repository. By specifying
+repositories you can get packages from elsewhere.
+
+Repositories are not resolved recursively. You only can add them to your
+main `composer.json`. Repository declarations of dependencies' composer.json are ignored.
+
+The following repository types are supported:
+
+- **npm-vcs**: The version control system repository can fetch packages from git with `package.json`
+               file dedicated to NPM. The `url` property of git source code is required.
+- **bower-vcs**: The version control system repository can fetch packages from git with `bower.json`
+                 file dedicated to Bower. The `url` property of git source code is required.
+
+##### config.fxp-asset.registry-options (root-only)
+
+Options available for the asset registers:
+
+- **npm-searchable** (bool): The search in the NPM registry may be disabled with this option
+                             for the search command.
+- **bower-searchable** (bool): The search in the Bower registry may be disabled with this option
+                               for the search command.
+
+##### config.fxp-asset.main-files (root-only)
+
+The plugin can override the main file definitions of the Bower packages. To override the file
+definitions specify the packages and their main file array as name/value pairs. For an example
+see the [usage informations](index.md#override-the-main-files-for-bower).
+
+##### config.fxp-asset.git-skip-update (root-only)
+
+The plugin can skip updating meta-data in git repositories for given amount of time, i.e. `6 hours`, `3 days` or `1 week`.
+
+    "config": {
+        "fxp-asset": {
+            "git-skip-update": "2 days"
+        }
+    }
+
+### Mapping asset file to composer package
+
+##### NPM mapping
+
+The `package.json` of asset repository is automatically converted to a Complete Package instance with:
+
+| NPM Package          | Composer Package                      |
+|----------------------|---------------------------------------|
+| name                 | name (`npm-asset/{name}`)             |
+| `npm-asset-library`  | type                                  |
+| description          | description                           |
+| version              | version                               |
+| keywords             | keywords                              |
+| homepage             | homepage                              |
+| license              | license                               |
+| author               | authors [0]                           |
+| contributors         | authors [n], merging with `author`    |
+| dependencies         | require                               |
+| devDependencies      | require-dev                           |
+| bin                  | bin                                   |
+| bugs                 | extra.npm-asset-bugs                  |
+| files                | extra.npm-asset-files                 |
+| main                 | extra.npm-asset-main                  |
+| man                  | extra.npm-asset-man                   |
+| directories          | extra.npm-asset-directories           |
+| repository           | extra.npm-asset-repository            |
+| scripts              | extra.npm-asset-scripts               |
+| config               | extra.npm-asset-config                |
+| bundledDependencies  | extra.npm-asset-bundled-dependencies  |
+| optionalDependencies | extra.npm-asset-optional-dependencies |
+| engines              | extra.npm-asset-engines               |
+| engineStrict         | extra.npm-asset-engine-strict         |
+| os                   | extra.npm-asset-os                    |
+| cpu                  | extra.npm-asset-cpu                   |
+| preferGlobal         | extra.npm-asset-prefer-global         |
+| private              | extra.npm-asset-private               |
+| publishConfig        | extra.npm-asset-publish-config        |
+| `not used`           | time                                  |
+| `not used`           | support                               |
+| `not used`           | conflict                              |
+| `not used`           | replace                               |
+| `not used`           | provide                               |
+| `not used`           | suggest                               |
+| `not used`           | autoload                              |
+| `not used`           | autoload-dev                          |
+| `not used`           | include-path                          |
+| `not used`           | target-dir                            |
+| `not used`           | extra                                 |
+| `not used`           | archive                               |
+
+##### Bower mapping
+
+The `bower.json` of asset repository is automatically converted to a Complete Package instance with:
+
+| Bower Package        | Composer Package                      |
+|----------------------|---------------------------------------|
+| name                 | name (`bower-asset/{name}`)           |
+| `bower-asset-library`| type                                  |
+| description          | description                           |
+| version              | version                               |
+| keywords             | keywords                              |
+| license              | license                               |
+| dependencies         | require                               |
+| devDependencies      | require-dev                           |
+| bin                  | bin                                   |
+| main                 | extra.bower-asset-main                |
+| ignore               | extra.bower-asset-ignore              |
+| private              | extra.bower-asset-private             |
+| `not used`           | homepage                              |
+| `not used`           | time                                  |
+| `not used`           | authors                               |
+| `not used`           | support                               |
+| `not used`           | conflict                              |
+| `not used`           | replace                               |
+| `not used`           | provide                               |
+| `not used`           | suggest                               |
+| `not used`           | autoload                              |
+| `not used`           | autoload-dev                          |
+| `not used`           | include-path                          |
+| `not used`           | target-dir                            |
+| `not used`           | extra                                 |
+| `not used`           | archive                               |
+
+##### Verison conversion
+
+NPM and Bower use [Semver](http://semver.org) for formatting the versions, which is not
+the case for Composer. It is therefore necessary to perform a conversion, but it's not
+perfect because of the differences in operation between Semver and Composer.
+
+Here are the matches currently validated:
+
+| Semver version   | Composer version |
+| ---------------- | ---------------- |
+| 1.2.3            | 1.2.3            |
+| 20170124.0.0     | 20170124.000000  |
+| 20170124.1.0     | 20170124.001000  |
+| 20170124.1.1     | 20170124.001001  |
+| 20170124.0       | 20170124.000000  |
+| 20170124.1       | 20170124.001000  |
+| 20170124         | 20170124         |
+| 1.2.3alpha       | 1.2.3-alpha1     |
+| 1.2.3-alpha      | 1.2.3-alpha1     |
+| 1.2.3a           | 1.2.3-alpha1     |
+| 1.2.3a1          | 1.2.3-alpha1     |
+| 1.2.3-a          | 1.2.3-alpha1     |
+| 1.2.3-a1         | 1.2.3-alpha1     |
+| 1.2.3b           | 1.2.3-beta1      |
+| 1.2.3b1          | 1.2.3-beta1      |
+| 1.2.3-b          | 1.2.3-beta1      |
+| 1.2.3-b1         | 1.2.3-beta1      |
+| 1.2.3beta        | 1.2.3-beta1      |
+| 1.2.3-beta       | 1.2.3-beta1      |
+| 1.2.3beta1       | 1.2.3-beta1      |
+| 1.2.3-beta1      | 1.2.3-beta1      |
+| 1.2.3rc1         | 1.2.3-RC1        |
+| 1.2.3-rc1        | 1.2.3-RC1        |
+| 1.2.3rc2         | 1.2.3-RC2        |
+| 1.2.3-rc2        | 1.2.3-RC2        |
+| 1.2.3rc.2        | 1.2.3-RC.2       |
+| 1.2.3-rc.2       | 1.2.3-RC.2       |
+| 1.2.3+0          | 1.2.3-patch0     |
+| 1.2.3-0          | 1.2.3-patch0     |
+| 1.2.3pre         | 1.2.3-beta1      |
+| 1.2.3-pre        | 1.2.3-beta1      |
+| 1.2.3dev         | 1.2.3-dev        |
+| 1.2.3-dev        | 1.2.3-dev        |
+| 1.2.3+build2012  | 1.2.3-patch2012  |
+| 1.2.3-build2012  | 1.2.3-patch2012  |
+| 1.2.3+build.2012 | 1.2.3-patch.2012 |
+| 1.2.3-build.2012 | 1.2.3-patch.2012 |
+| 1.2.3-SNAPSHOT   | 1.2.3-dev        |
+| 1.2.3-snapshot   | 1.2.3-dev        |
+| latest           | default          |
+
+##### Range verison conversion
+
+NPM and Bower use [Semver](http://semver.org) for formatting the range versions, which is not
+the case for Composer. It is therefore necessary to perform a conversion, but it's not
+perfect because of the differences in operation between Semver and Composer.
+
+Here are the matches currently validated:
+
+| Semver range version | Composer range version |
+| -------------------- | ---------------------- |
+| >1.2.3               | >1.2.3                 |
+| > 1.2.3              | >1.2.3                 |
+| <1.2.3               | <1.2.3                 |
+| < 1.2.3              | <1.2.3                 |
+| >=1.2.3              | >=1.2.3                |
+| >= 1.2.3             | >=1.2.3                |
+| <=1.2.3              | <=1.2.3                |
+| <= 1.2.3             | <=1.2.3                |
+| ~1.2.3               | ~1.2.3                 |
+| ~ 1.2.3              | ~1.2.3                 |
+| ~1                   | ~1                     |
+| ~ 1                  | ~1.2.3                 |
+| ^1.2.3               | >=1.2.3,<2.0           |
+| ^ 1.2.3              | >=1.2.3,<2.0           |
+| >1.2.3 <2.0          | >1.2.3,<2.0            |
+| &gt;=1.0 &lt;1.1 `¦¦` &gt;=1.2 | &gt;=1.0,&lt;1.1`¦`&gt;=1.2 |
+| 1.2.3 - 2.3.4        | >=1.2.3,<=2.3.4        |
+| 1 - 2                | >=1,<3.0               |
+
+
+##### URL Range verison conversion
+
+NPM and Bower can use a URL directly as the version of the dependency, which is not the
+case for Composer. It is therefore necessary to perform a conversion, but it's not perfect
+because of the differences in operation between NPM/Bower and Composer.
+
+| Asset URL version | Composer version                                    |
+| ----------------- | --------------------------------------------------- |
+| {URL}             | dev-default                                         |
+| {URL}#1.2.3       | dev-1.2.3 <code>&#124;</code> 1.2.3 (branch or tag) |
+| {URL}#{branch}    | dev-{branch}                                        |
+| {URL}#{sha}       | dev-default#{sha}                                   |
+
+##### Multiple versions of a depdendency in the same project
+
+NPM and Bower can add multiple versions of the same dependency, which is not the case for Composer.
+To overcome this limitation, the plugin adds a VCS repository for each required version, with the
+name including the version number after the character `-`
+(`{ASSET-TYPE}-asset/{PACKAGE-NAME}-X.Y.Z`).
+
+A Vcs repository will be created for each version, and the number of requests is proportional to
+the number of versions required. However, given that each version of the dependency uses the same
+URL of the VCS repository, subsequent requests will get the package information directly in the cache.
+However, a cache of files is created for each version (included in require section) of a same dependency.
+
+## Asset Repository
+
+The plugin creates `Composer Repositories` to find and create
+the VCS repository of the asset defined in the `require` and `require-dev` automatically.
+
+### NPM Composer Repository
+
+[NPM Package](https://www.npmjs.org) is the main NPM repository. A NPM Composer repository
+is basically a package source, i.e. a place where you can get packages from. NPM Package aims to
+be the central repository that everybody uses. This means that you can automatically `require`
+any package that is available there.
+
+If you go to the [NPM website](https://www.npmjs.org), you can browse and search for packages.
+
+All package names are automatically prefixed with `npm-asset/`.
+
+### Bower Composer Repository
+
+[Bower Package](http://bower.io) is the main Bower repository. A Bower Composer repository
+is basically a package source, i.e. a place where you can get packages from. Bower Package aims to
+be the central repository that everybody uses. This means that you can automatically `require`
+any package that is available there.
+
+If you go to the [Bower website](http://bower.io/search/), you can browse and search for packages.
+
+All package names are automatically prefixed with `bower-asset/`.
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/AssetsTest.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/AssetsTest.php
new file mode 100644 (file)
index 0000000..fb08941
--- /dev/null
@@ -0,0 +1,94 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Tests;
+
+use Fxp\Composer\AssetPlugin\Assets;
+
+/**
+ * Tests of assets factory.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class AssetsTest extends \PHPUnit_Framework_TestCase
+{
+    public function testGetTypes()
+    {
+        $this->assertEquals(array(
+            'npm',
+            'bower',
+        ), Assets::getTypes());
+    }
+
+    public function testDefaultGetRegistries()
+    {
+        $this->assertEquals(array(
+            'npm',
+            'bower',
+        ), array_keys(Assets::getDefaultRegistries()));
+    }
+
+    public function testGetVcsRepositoryDrivers()
+    {
+        $this->assertEquals(array(
+            'vcs',
+            'github',
+            'git-bitbucket',
+            'git',
+            'hg-bitbucket',
+            'hg',
+            'perforce',
+            'svn',
+        ), array_keys(Assets::getVcsRepositoryDrivers()));
+    }
+
+    public function testGetVcsDrivers()
+    {
+        $this->assertEquals(array(
+            'github',
+            'git-bitbucket',
+            'git',
+            'hg-bitbucket',
+            'hg',
+            'perforce',
+            'svn',
+        ), array_keys(Assets::getVcsDrivers()));
+    }
+
+    /**
+     * @expectedException \Fxp\Composer\AssetPlugin\Exception\InvalidArgumentException
+     */
+    public function testCreationOfInvalidType()
+    {
+        Assets::createType(null);
+    }
+
+    public function testCreationOfNpmAsset()
+    {
+        $type = Assets::createType('npm');
+
+        $this->assertInstanceOf('Fxp\Composer\AssetPlugin\Type\AssetTypeInterface', $type);
+    }
+
+    public function testCreationOfBowerAsset()
+    {
+        $type = Assets::createType('bower');
+
+        $this->assertInstanceOf('Fxp\Composer\AssetPlugin\Type\AssetTypeInterface', $type);
+    }
+
+    public function testCreationOfPrivateBowerAsset()
+    {
+        $type = Assets::createType('bower');
+
+        $this->assertInstanceOf('Fxp\Composer\AssetPlugin\Type\AssetTypeInterface', $type);
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Composer/ScriptHandlerTest.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Composer/ScriptHandlerTest.php
new file mode 100644 (file)
index 0000000..f37c702
--- /dev/null
@@ -0,0 +1,237 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Tests\Composer;
+
+use Composer\Composer;
+use Composer\DependencyResolver\Operation\InstallOperation;
+use Composer\DependencyResolver\Operation\OperationInterface;
+use Composer\DependencyResolver\Operation\UpdateOperation;
+use Composer\DependencyResolver\PolicyInterface;
+use Composer\DependencyResolver\Pool;
+use Composer\DependencyResolver\Request;
+use Composer\Installer\PackageEvent;
+use Composer\IO\IOInterface;
+use Composer\Package\PackageInterface;
+use Composer\Plugin\PluginManager;
+use Composer\Repository\CompositeRepository;
+use Fxp\Composer\AssetPlugin\Composer\ScriptHandler;
+use Fxp\Composer\AssetPlugin\Config\Config;
+use Fxp\Composer\AssetPlugin\FxpAssetPlugin;
+
+/**
+ * Tests for the composer script handler.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class ScriptHandlerTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var Composer|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $composer;
+
+    /**
+     * @var Config
+     */
+    protected $config;
+
+    /**
+     * @var IOInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $io;
+
+    /**
+     * @var OperationInterface|InstallOperation|UpdateOperation|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $operation;
+
+    /**
+     * @var PackageInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $package;
+
+    public function setUp()
+    {
+        $this->composer = $this->getMockBuilder('Composer\Composer')->getMock();
+        $this->io = $this->getMockBuilder('Composer\IO\IOInterface')->getMock();
+        $this->package = $this->getMockBuilder('Composer\Package\PackageInterface')->getMock();
+
+        $this->config = $this->getMockBuilder('Composer\Config')->getMock();
+        $this->config->expects($this->any())
+            ->method('get')
+            ->will($this->returnCallback(function ($key) {
+                $val = null;
+
+                switch ($key) {
+                    case 'cache-repo-dir':
+                        return sys_get_temp_dir().'/composer-test-repo-cache';
+                    case 'vendor-dir':
+                        return sys_get_temp_dir().'/composer-test/vendor';
+                }
+
+                return $val;
+            }));
+
+        $rootPackage = $this->getMockBuilder('Composer\Package\RootPackageInterface')->getMock();
+
+        $this->composer->expects($this->any())
+            ->method('getConfig')
+            ->will($this->returnValue($this->config));
+        $this->composer->expects($this->any())
+            ->method('getPackage')
+            ->will($this->returnValue($rootPackage));
+
+        $plugin = $this->getMockBuilder(FxpAssetPlugin::class)->disableOriginalConstructor()->getMock();
+        $plugin->expects($this->any())
+            ->method('getConfig')
+            ->willReturn(new Config(array()));
+
+        $pm = $this->getMockBuilder(PluginManager::class)->disableOriginalConstructor()->getMock();
+        $pm->expects($this->any())
+            ->method('getPlugins')
+            ->willReturn(array($plugin));
+
+        $this->composer->expects($this->any())
+            ->method('getPluginManager')
+            ->will($this->returnValue($pm));
+    }
+
+    public function tearDown()
+    {
+        $this->composer = null;
+        $this->io = null;
+        $this->operation = null;
+        $this->package = null;
+    }
+
+    public function getPackageComposerTypes()
+    {
+        return array(
+            array('npm-asset-library'),
+            array('bower-asset-library'),
+            array('library'),
+        );
+    }
+
+    /**
+     * @dataProvider getPackageComposerTypes
+     *
+     * @param string $composerType
+     */
+    public function testDeleteIgnoreFiles($composerType)
+    {
+        $this->operation = $this->getMockBuilder('Composer\DependencyResolver\Operation\OperationInterface')->getMock();
+        $this->assertInstanceOf('Composer\DependencyResolver\Operation\OperationInterface', $this->operation);
+
+        ScriptHandler::deleteIgnoredFiles($this->createEvent($composerType));
+    }
+
+    /**
+     * @dataProvider getPackageComposerTypes
+     *
+     * @param string $composerType
+     */
+    public function testDeleteIgnoreFilesWithInstallOperation($composerType)
+    {
+        $this->operation = $this->getMockBuilder('Composer\DependencyResolver\Operation\InstallOperation')
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->assertInstanceOf('Composer\DependencyResolver\Operation\OperationInterface', $this->operation);
+
+        ScriptHandler::deleteIgnoredFiles($this->createEvent($composerType));
+    }
+
+    /**
+     * @dataProvider getPackageComposerTypes
+     *
+     * @param string $composerType
+     */
+    public function testDeleteIgnoreFilesWithUpdateOperation($composerType)
+    {
+        $this->operation = $this->getMockBuilder('Composer\DependencyResolver\Operation\UpdateOperation')
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->assertInstanceOf('Composer\DependencyResolver\Operation\OperationInterface', $this->operation);
+
+        ScriptHandler::deleteIgnoredFiles($this->createEvent($composerType));
+    }
+
+    /**
+     * @dataProvider getPackageComposerTypes
+     *
+     * @param string $composerType
+     *
+     * @expectedException \RuntimeException
+     * @expectedExceptionMessage The fxp composer asset plugin is not found
+     */
+    public function testGetConfig($composerType)
+    {
+        $rootPackage = $this->getMockBuilder('Composer\Package\RootPackageInterface')->getMock();
+
+        $this->composer = $this->getMockBuilder('Composer\Composer')->getMock();
+        $this->composer->expects($this->any())
+            ->method('getConfig')
+            ->will($this->returnValue($this->config));
+        $this->composer->expects($this->any())
+            ->method('getPackage')
+            ->will($this->returnValue($rootPackage));
+
+        $pm = $this->getMockBuilder(PluginManager::class)->disableOriginalConstructor()->getMock();
+        $pm->expects($this->any())
+            ->method('getPlugins')
+            ->willReturn(array());
+
+        $this->composer->expects($this->any())
+            ->method('getPluginManager')
+            ->will($this->returnValue($pm));
+
+        $this->operation = $this->getMockBuilder('Composer\DependencyResolver\Operation\OperationInterface')->getMock();
+
+        ScriptHandler::getConfig($this->createEvent($composerType));
+    }
+
+    /**
+     * @param string $composerType
+     *
+     * @return PackageEvent
+     */
+    protected function createEvent($composerType)
+    {
+        $this->package->expects($this->any())
+            ->method('getType')
+            ->will($this->returnValue($composerType));
+
+        if ($this->operation instanceof UpdateOperation) {
+            $this->operation->expects($this->any())
+                ->method('getTargetPackage')
+                ->will($this->returnValue($this->package));
+        }
+
+        if ($this->operation instanceof InstallOperation) {
+            $this->operation->expects($this->any())
+                ->method('getPackage')
+                ->will($this->returnValue($this->package));
+        }
+
+        /* @var PolicyInterface $policy */
+        $policy = $this->getMockBuilder('Composer\DependencyResolver\PolicyInterface')->getMock();
+        /* @var Pool $pool */
+        $pool = $this->getMockBuilder('Composer\DependencyResolver\Pool')->disableOriginalConstructor()->getMock();
+        /* @var CompositeRepository $installedRepo */
+        $installedRepo = $this->getMockBuilder('Composer\Repository\CompositeRepository')->disableOriginalConstructor()->getMock();
+        /* @var Request $request */
+        $request = $this->getMockBuilder('Composer\DependencyResolver\Request')->disableOriginalConstructor()->getMock();
+        $operations = array($this->getMockBuilder('Composer\DependencyResolver\Operation\OperationInterface')->getMock());
+
+        return new PackageEvent('foo-event', $this->composer, $this->io, true, $policy, $pool, $installedRepo, $request, $operations, $this->operation);
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Config/ConfigTest.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Config/ConfigTest.php
new file mode 100644 (file)
index 0000000..781e824
--- /dev/null
@@ -0,0 +1,205 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Tests\Composer;
+
+use Composer\Composer;
+use Composer\Config;
+use Composer\IO\IOInterface;
+use Composer\Package\RootPackageInterface;
+use Fxp\Composer\AssetPlugin\Config\ConfigBuilder;
+
+/**
+ * Tests for the plugin config.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class ConfigTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var Composer|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $composer;
+
+    /**
+     * @var Config|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $composerConfig;
+
+    /**
+     * @var IOInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $io;
+
+    /**
+     * @var RootPackageInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $package;
+
+    protected function setUp()
+    {
+        $this->composer = $this->getMockBuilder(Composer::class)->disableOriginalConstructor()->getMock();
+        $this->composerConfig = $this->getMockBuilder(Config::class)->disableOriginalConstructor()->getMock();
+        $this->io = $this->getMockBuilder(IOInterface::class)->getMock();
+        $this->package = $this->getMockBuilder(RootPackageInterface::class)->getMock();
+
+        $this->composer->expects($this->any())
+            ->method('getPackage')
+            ->willReturn($this->package);
+
+        $this->composer->expects($this->any())
+            ->method('getConfig')
+            ->willReturn($this->composerConfig);
+    }
+
+    public function getDataForGetConfig()
+    {
+        return array(
+            array('foo',                 42,                           42),
+            array('bar',                 'foo',                        'empty'),
+            array('baz',                 false,                        true),
+            array('repositories',        42,                           0),
+            array('global-composer-foo', 90,                           0),
+            array('global-composer-bar', 70,                           0),
+            array('global-config-foo',   23,                           0),
+            array('env-boolean',         false,                        true,    'FXP_ASSET__ENV_BOOLEAN=false'),
+            array('env-integer',         -32,                          0,       'FXP_ASSET__ENV_INTEGER=-32'),
+            array('env-json',            array('foo' => 'bar'),        array(), 'FXP_ASSET__ENV_JSON="{"foo": "bar"}"'),
+            array('env-json-array',      array(array('foo' => 'bar')), array(), 'FXP_ASSET__ENV_JSON_ARRAY="[{"foo": "bar"}]"'),
+            array('env-string',          'baz',                        'foo',   'FXP_ASSET__ENV_STRING=baz'),
+        );
+    }
+
+    /**
+     * @dataProvider getDataForGetConfig
+     *
+     * @param string      $key      The key
+     * @param mixed       $expected The expected value
+     * @param mixed|null  $default  The default value
+     * @param string|null $env      The env variable
+     */
+    public function testGetConfig($key, $expected, $default = null, $env = null)
+    {
+        // add env variables
+        if (null !== $env) {
+            putenv($env);
+        }
+
+        $globalPath = realpath(__DIR__.'/../Fixtures/package/global');
+        $this->composerConfig->expects($this->any())
+            ->method('has')
+            ->with('home')
+            ->willReturn(true);
+
+        $this->composerConfig->expects($this->any())
+            ->method('get')
+            ->with('home')
+            ->willReturn($globalPath);
+
+        $this->package->expects($this->any())
+            ->method('getExtra')
+            ->willReturn(array(
+                'asset-baz' => false,
+                'asset-repositories' => 42,
+            ));
+
+        $this->package->expects($this->any())
+            ->method('getConfig')
+            ->willReturn(array(
+                'fxp-asset' => array(
+                    'bar' => 'foo',
+                    'baz' => false,
+                    'env-foo' => 55,
+                ),
+            ));
+
+        if (0 === strpos($key, 'global-')) {
+            $this->io->expects($this->atLeast(2))
+                ->method('isDebug')
+                ->willReturn(true);
+
+            $this->io->expects($this->at(1))
+                ->method('writeError')
+                ->with(sprintf('Loading fxp-asset config in file %s/composer.json', $globalPath));
+            $this->io->expects($this->at(3))
+                ->method('writeError')
+                ->with(sprintf('Loading fxp-asset config in file %s/config.json', $globalPath));
+        }
+
+        $config = ConfigBuilder::build($this->composer, $this->io);
+        $value = $config->get($key, $default);
+
+        // remove env variables
+        if (null !== $env) {
+            $envKey = substr($env, 0, strpos($env, '='));
+            putenv($envKey);
+            $this->assertFalse(getenv($envKey));
+        }
+
+        $this->assertSame($expected, $value);
+        // test cache
+        $this->assertSame($expected, $config->get($key, $default));
+    }
+
+    /**
+     * @expectedException \Fxp\Composer\AssetPlugin\Exception\InvalidArgumentException
+     * @expectedExceptionMessage The "FXP_ASSET__ENV_JSON" environment variable isn't a valid JSON
+     */
+    public function testGetEnvConfigWithInvalidJson()
+    {
+        putenv('FXP_ASSET__ENV_JSON="{"foo"}"');
+        $config = ConfigBuilder::build($this->composer, $this->io);
+        $ex = null;
+
+        try {
+            $config->get('env-json');
+        } catch (\Exception $e) {
+            $ex = $e;
+        }
+
+        putenv('FXP_ASSET__ENV_JSON');
+        $this->assertFalse(getenv('FXP_ASSET__ENV_JSON'));
+
+        if (null === $ex) {
+            throw new \Exception('The expected exception was not thrown');
+        }
+
+        throw $ex;
+    }
+
+    public function testValidateConfig()
+    {
+        $deprecated = array(
+            'asset-installer-paths' => 'deprecated',
+            'asset-ignore-files' => 'deprecated',
+            'asset-private-bower-registries' => 'deprecated',
+            'asset-pattern-skip-version' => 'deprecated',
+            'asset-optimize-with-installed-packages' => 'deprecated',
+            'asset-optimize-with-conjunctive' => 'deprecated',
+            'asset-repositories' => 'deprecated',
+            'asset-registry-options' => 'deprecated',
+            'asset-vcs-driver-options' => 'deprecated',
+            'asset-main-files' => 'deprecated',
+        );
+
+        $this->package->expects($this->any())
+            ->method('getExtra')
+            ->willReturn($deprecated);
+
+        foreach (array_keys($deprecated) as $i => $option) {
+            $this->io->expects($this->at($i))
+                ->method('write')
+                ->with('<warning>The "extra.'.$option.'" option is deprecated, use the "config.fxp-asset.'.substr($option, 6).'" option</warning>');
+        }
+
+        ConfigBuilder::validate($this->io, $this->package);
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Converter/AbstractPackageConverterTest.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Converter/AbstractPackageConverterTest.php
new file mode 100644 (file)
index 0000000..aea5f82
--- /dev/null
@@ -0,0 +1,90 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Tests\Converter;
+
+use Fxp\Composer\AssetPlugin\Converter\PackageConverterInterface;
+use Fxp\Composer\AssetPlugin\Tests\Fixtures\Converter\InvalidPackageConverter;
+use Fxp\Composer\AssetPlugin\Type\AssetTypeInterface;
+
+/**
+ * Abstract tests of asset package converter.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+abstract class AbstractPackageConverterTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var AssetTypeInterface
+     */
+    protected $type;
+
+    /**
+     * @var PackageConverterInterface
+     */
+    protected $converter;
+
+    /**
+     * @var array
+     */
+    protected $asset;
+
+    protected function setUp()
+    {
+        $versionConverter = $this->getMockBuilder('Fxp\Composer\AssetPlugin\Converter\VersionConverterInterface')->getMock();
+        $versionConverter->expects($this->any())
+            ->method('convertVersion')
+            ->will($this->returnCallback(function ($value) {
+                return $value;
+            }));
+        $versionConverter->expects($this->any())
+            ->method('convertRange')
+            ->will($this->returnCallback(function ($value) {
+                return $value;
+            }));
+        $type = $this->getMockBuilder('Fxp\Composer\AssetPlugin\Type\AssetTypeInterface')->getMock();
+        $type->expects($this->any())
+            ->method('getComposerVendorName')
+            ->will($this->returnValue('ASSET'));
+        $type->expects($this->any())
+            ->method('getComposerType')
+            ->will($this->returnValue('ASSET_TYPE'));
+        $type->expects($this->any())
+            ->method('getVersionConverter')
+            ->will($this->returnValue($versionConverter));
+        $type->expects($this->any())
+            ->method('formatComposerName')
+            ->will($this->returnCallback(function ($value) {
+                return 'ASSET/'.$value;
+            }));
+
+        $this->type = $type;
+    }
+
+    protected function tearDown()
+    {
+        $this->type = null;
+        $this->converter = null;
+        $this->asset = array();
+    }
+
+    /**
+     * @expectedException \Fxp\Composer\AssetPlugin\Exception\InvalidArgumentException
+     */
+    public function testConversionWithInvalidKey()
+    {
+        $this->converter = new InvalidPackageConverter($this->type);
+
+        $this->converter->convert(array(
+            'name' => 'foo',
+        ));
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Converter/BowerPackageConverterTest.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Converter/BowerPackageConverterTest.php
new file mode 100644 (file)
index 0000000..36a4c71
--- /dev/null
@@ -0,0 +1,116 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Tests\Converter;
+
+use Fxp\Composer\AssetPlugin\Converter\BowerPackageConverter;
+use Fxp\Composer\AssetPlugin\Type\AssetTypeInterface;
+
+/**
+ * Tests of bower package converter.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class BowerPackageConverterTest extends AbstractPackageConverterTest
+{
+    protected function setUp()
+    {
+        parent::setUp();
+
+        /* @var AssetTypeInterface $type */
+        $type = $this->type;
+        $this->converter = new BowerPackageConverter($type);
+        $this->asset = (array) json_decode(file_get_contents(__DIR__.'/../Fixtures/package/bower.json'), true);
+    }
+
+    public function testConvert()
+    {
+        $composer = $this->converter->convert($this->asset);
+
+        $this->assertArrayHasKey('name', $composer);
+        $this->assertSame('ASSET/'.$this->asset['name'], $composer['name']);
+
+        $this->assertArrayHasKey('type', $composer);
+        $this->assertSame('ASSET_TYPE', $composer['type']);
+
+        $this->assertArrayHasKey('description', $composer);
+        $this->assertSame($this->asset['description'], $composer['description']);
+
+        $this->assertArrayHasKey('version', $composer);
+        $this->assertSame('1.0.0-pre', $composer['version']);
+
+        $this->assertArrayHasKey('keywords', $composer);
+        $this->assertSame($this->asset['keywords'], $composer['keywords']);
+
+        $this->assertArrayHasKey('require', $composer);
+        $this->assertSame(array(
+            'ASSET/library1' => '>= 1.0.0',
+            'ASSET/library2' => '>= 1.0.0',
+            'ASSET/library2-0.9.0' => '0.9.0',
+            'ASSET/library3' => '*',
+            'ASSET/library4' => '1.2.3',
+            'ASSET/library5' => 'dev-default#0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b',
+            'ASSET/library6' => 'dev-branch',
+            'ASSET/library7' => 'dev-1.2.* || 1.2.*',
+            'ASSET/library8' => 'dev-1.2.x || 1.2.x',
+            'ASSET/library9' => 'dev-master',
+            'ASSET/library10' => '1.0.0',
+            'ASSET/library11' => '*',
+            'ASSET/library12' => '>=1 <2',
+            'ASSET/library13' => '>=1 <2',
+            'ASSET/library14' => '*',
+            'ASSET/library15' => '*',
+            'ASSET/library16' => '>=1 <2',
+            'ASSET/test-library17-file' => '*',
+            'ASSET/test-library18-file' => '1.2.3',
+            'ASSET/test-library19-file' => '*',
+            'ASSET/test-library20-file' => '*',
+        ), $composer['require']);
+
+        $this->assertArrayHasKey('require-dev', $composer);
+        $this->assertSame(array(
+            'ASSET/dev-library1' => '>= 1.0.0',
+            'ASSET/dev-library2' => '>= 1.0.0',
+            'ASSET/dev-library2-0.9.0' => '0.9.0',
+        ), $composer['require-dev']);
+
+        $this->assertArrayHasKey('license', $composer);
+        $this->assertSame($this->asset['license'], $composer['license']);
+
+        $this->assertArrayHasKey('bin', $composer);
+        $this->assertSame($this->asset['bin'], $composer['bin']);
+
+        $this->assertArrayHasKey('extra', $composer);
+
+        $this->assertArrayHasKey('bower-asset-main', $composer['extra']);
+        $this->assertSame($this->asset['main'], $composer['extra']['bower-asset-main']);
+
+        $this->assertArrayHasKey('bower-asset-ignore', $composer['extra']);
+        $this->assertSame($this->asset['ignore'], $composer['extra']['bower-asset-ignore']);
+
+        $this->assertArrayHasKey('bower-asset-private', $composer['extra']);
+        $this->assertSame($this->asset['private'], $composer['extra']['bower-asset-private']);
+
+        $this->assertArrayNotHasKey('homepage', $composer);
+        $this->assertArrayNotHasKey('time', $composer);
+        $this->assertArrayNotHasKey('authors', $composer);
+        $this->assertArrayNotHasKey('support', $composer);
+        $this->assertArrayNotHasKey('conflict', $composer);
+        $this->assertArrayNotHasKey('replace', $composer);
+        $this->assertArrayNotHasKey('provide', $composer);
+        $this->assertArrayNotHasKey('suggest', $composer);
+        $this->assertArrayNotHasKey('autoload', $composer);
+        $this->assertArrayNotHasKey('autoload-dev', $composer);
+        $this->assertArrayNotHasKey('include-path', $composer);
+        $this->assertArrayNotHasKey('target-dir', $composer);
+        $this->assertArrayNotHasKey('archive', $composer);
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Converter/NpmPackageConverterTest.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Converter/NpmPackageConverterTest.php
new file mode 100644 (file)
index 0000000..07c6059
--- /dev/null
@@ -0,0 +1,220 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Tests\Converter;
+
+use Fxp\Composer\AssetPlugin\Converter\NpmPackageConverter;
+use Fxp\Composer\AssetPlugin\Converter\NpmPackageUtil;
+use Fxp\Composer\AssetPlugin\Type\AssetTypeInterface;
+
+/**
+ * Tests of npm package converter.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class NpmPackageConverterTest extends AbstractPackageConverterTest
+{
+    protected function setUp()
+    {
+        parent::setUp();
+
+        /* @var AssetTypeInterface $type */
+        $type = $this->type;
+        $this->converter = new NpmPackageConverter($type);
+        $this->asset = $this->loadPackage();
+    }
+
+    public function testConvert()
+    {
+        $composer = $this->converter->convert($this->asset);
+
+        $this->assertArrayHasKey('name', $composer);
+        $this->assertSame('ASSET/'.$this->asset['name'], $composer['name']);
+
+        $this->assertArrayHasKey('type', $composer);
+        $this->assertSame('ASSET_TYPE', $composer['type']);
+
+        $this->assertArrayHasKey('description', $composer);
+        $this->assertSame($this->asset['description'], $composer['description']);
+
+        $this->assertArrayHasKey('version', $composer);
+        $this->assertSame('1.0.0-pre', $composer['version']);
+
+        $this->assertArrayHasKey('keywords', $composer);
+        $this->assertSame($this->asset['keywords'], $composer['keywords']);
+
+        $this->assertArrayHasKey('homepage', $composer);
+        $this->assertSame($this->asset['homepage'], $composer['homepage']);
+
+        $this->assertArrayHasKey('license', $composer);
+        $this->assertSame($this->asset['license'], $composer['license']);
+
+        $this->assertArrayHasKey('authors', $composer);
+        $this->assertSame(array_merge(array($this->asset['author']), $this->asset['contributors']), $composer['authors']);
+
+        $this->assertArrayHasKey('require', $composer);
+        $this->assertSame(array(
+            'ASSET/library1' => '>= 1.0.0',
+            'ASSET/library2' => '>= 1.0.0',
+            'ASSET/library2-0.9.0' => '0.9.0',
+            'ASSET/library3' => '*',
+            'ASSET/library4' => '1.2.3',
+            'ASSET/library5' => 'dev-default#0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b',
+            'ASSET/library6' => 'dev-branch',
+            'ASSET/library7' => 'dev-1.2.* || 1.2.*',
+            'ASSET/library8' => 'dev-1.2.x || 1.2.x',
+            'ASSET/library9' => 'dev-master',
+            'ASSET/library10' => '1.0.0',
+            'ASSET/library11' => '*',
+            'ASSET/library12' => '>=1 <2',
+            'ASSET/library13' => '>=1 <2',
+            'ASSET/library14' => '*',
+            'ASSET/library15' => '*',
+            'ASSET/library16' => '>=1 <2',
+            'ASSET/test-library17-file' => '*',
+            'ASSET/test-library18-file' => '1.2.3',
+            'ASSET/test-library19-file' => '*',
+            'ASSET/test-library20-file' => '*',
+            'ASSET/library21' => '1 || 2',
+        ), $composer['require']);
+
+        $this->assertArrayHasKey('require-dev', $composer);
+        $validDevRequires = $composer['require-dev'];
+        unset($validDevRequires['ASSET/library3']);
+        $this->assertSame(array(
+            'ASSET/dev-library1' => '>= 1.0.0',
+            'ASSET/dev-library2' => '>= 1.0.0',
+            'ASSET/dev-library2-0.9.0' => '0.9.0',
+        ), $validDevRequires);
+
+        $this->assertArrayHasKey('bin', $composer);
+        $this->assertInternalType('array', $composer['bin']);
+        $this->assertSame($this->asset['bin'], $composer['bin'][0]);
+
+        $this->assertArrayHasKey('extra', $composer);
+
+        $this->assertArrayHasKey('npm-asset-bugs', $composer['extra']);
+        $this->assertSame($this->asset['bugs'], $composer['extra']['npm-asset-bugs']);
+
+        $this->assertArrayHasKey('npm-asset-files', $composer['extra']);
+        $this->assertSame($this->asset['files'], $composer['extra']['npm-asset-files']);
+
+        $this->assertArrayHasKey('npm-asset-main', $composer['extra']);
+        $this->assertSame($this->asset['main'], $composer['extra']['npm-asset-main']);
+
+        $this->assertArrayHasKey('npm-asset-man', $composer['extra']);
+        $this->assertSame($this->asset['man'], $composer['extra']['npm-asset-man']);
+
+        $this->assertArrayHasKey('npm-asset-directories', $composer['extra']);
+        $this->assertSame($this->asset['directories'], $composer['extra']['npm-asset-directories']);
+
+        $this->assertArrayHasKey('npm-asset-repository', $composer['extra']);
+        $this->assertSame($this->asset['repository'], $composer['extra']['npm-asset-repository']);
+
+        $this->assertArrayHasKey('npm-asset-scripts', $composer['extra']);
+        $this->assertSame($this->asset['scripts'], $composer['extra']['npm-asset-scripts']);
+
+        $this->assertArrayHasKey('npm-asset-config', $composer['extra']);
+        $this->assertSame($this->asset['config'], $composer['extra']['npm-asset-config']);
+
+        $this->assertArrayHasKey('npm-asset-bundled-dependencies', $composer['extra']);
+        $this->assertSame($this->asset['bundledDependencies'], $composer['extra']['npm-asset-bundled-dependencies']);
+
+        $this->assertArrayHasKey('npm-asset-optional-dependencies', $composer['extra']);
+        $this->assertSame($this->asset['optionalDependencies'], $composer['extra']['npm-asset-optional-dependencies']);
+
+        $this->assertArrayHasKey('npm-asset-engines', $composer['extra']);
+        $this->assertSame($this->asset['engines'], $composer['extra']['npm-asset-engines']);
+
+        $this->assertArrayHasKey('npm-asset-engine-strict', $composer['extra']);
+        $this->assertSame($this->asset['engineStrict'], $composer['extra']['npm-asset-engine-strict']);
+
+        $this->assertArrayHasKey('npm-asset-os', $composer['extra']);
+        $this->assertSame($this->asset['os'], $composer['extra']['npm-asset-os']);
+
+        $this->assertArrayHasKey('npm-asset-cpu', $composer['extra']);
+        $this->assertSame($this->asset['cpu'], $composer['extra']['npm-asset-cpu']);
+
+        $this->assertArrayHasKey('npm-asset-prefer-global', $composer['extra']);
+        $this->assertSame($this->asset['preferGlobal'], $composer['extra']['npm-asset-prefer-global']);
+
+        $this->assertArrayHasKey('npm-asset-private', $composer['extra']);
+        $this->assertSame($this->asset['private'], $composer['extra']['npm-asset-private']);
+
+        $this->assertArrayHasKey('npm-asset-publish-config', $composer['extra']);
+        $this->assertSame($this->asset['publishConfig'], $composer['extra']['npm-asset-publish-config']);
+
+        $this->assertArrayNotHasKey('time', $composer);
+        $this->assertArrayNotHasKey('support', $composer);
+        $this->assertArrayNotHasKey('conflict', $composer);
+        $this->assertArrayNotHasKey('replace', $composer);
+        $this->assertArrayNotHasKey('provide', $composer);
+        $this->assertArrayNotHasKey('suggest', $composer);
+        $this->assertArrayNotHasKey('autoload', $composer);
+        $this->assertArrayNotHasKey('autoload-dev', $composer);
+        $this->assertArrayNotHasKey('include-path', $composer);
+        $this->assertArrayNotHasKey('target-dir', $composer);
+        $this->assertArrayNotHasKey('archive', $composer);
+    }
+
+    public function testConvertWithScope()
+    {
+        $this->asset = $this->loadPackage('npm-scope.json');
+        $composer = $this->converter->convert($this->asset);
+
+        $this->assertArrayHasKey('name', $composer);
+        $this->assertSame('ASSET/scope--test', $composer['name']);
+
+        $this->assertArrayHasKey('require', $composer);
+        $this->assertSame(array(
+            'ASSET/scope--library1' => '>= 1.0.0',
+            'ASSET/scope2--library2' => '>= 1.0.0',
+        ), $composer['require']);
+
+        $this->assertArrayHasKey('require-dev', $composer);
+        $this->assertSame(array(
+            'ASSET/scope3--dev-library1' => '>= 1.0.0',
+        ), $composer['require-dev']);
+    }
+
+    public function getConvertDistData()
+    {
+        return array(
+            array(array('type' => null), array()),
+            array(array('type' => 'http://example.com'), array('type' => 'type', 'url' => 'https://example.com')),
+            array(array('tarball' => 'http://example.com'), array('type' => 'tar', 'url' => 'https://example.com')),
+            array(array('shasum' => 'abcdef0123456789abcdef0123456789abcdef01'), array('shasum' => 'abcdef0123456789abcdef0123456789abcdef01')),
+        );
+    }
+
+    /**
+     * @dataProvider getConvertDistData
+     *
+     * @param array $value  The value must be converted
+     * @param array $result The result of convertion
+     */
+    public function testConvertDist($value, $result)
+    {
+        $this->assertSame($result, NpmPackageUtil::convertDist($value));
+    }
+
+    /**
+     * Load the package.
+     *
+     * @param string $package The package file name
+     *
+     * @return array
+     */
+    private function loadPackage($package = 'npm.json')
+    {
+        return (array) json_decode(file_get_contents(__DIR__.'/../Fixtures/package/'.$package), true);
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Converter/NpmPackageUtilTest.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Converter/NpmPackageUtilTest.php
new file mode 100644 (file)
index 0000000..604ffa4
--- /dev/null
@@ -0,0 +1,38 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Tests\Converter;
+
+use Fxp\Composer\AssetPlugin\Converter\NpmPackageUtil;
+
+/**
+ * Tests of npm package util.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class NpmPackageUtilTest extends AbstractPackageConverterTest
+{
+    public function testConvertName()
+    {
+        $packageName = '@vendor/package';
+        $expected = 'vendor--package';
+
+        $this->assertSame($expected, NpmPackageUtil::convertName($packageName));
+    }
+
+    public function testRevertName()
+    {
+        $packageName = 'vendor--package';
+        $expected = '@vendor/package';
+
+        $this->assertSame($expected, NpmPackageUtil::revertName($packageName));
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Converter/SemverConverterTest.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Converter/SemverConverterTest.php
new file mode 100644 (file)
index 0000000..45ea465
--- /dev/null
@@ -0,0 +1,182 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Tests\Converter;
+
+use Fxp\Composer\AssetPlugin\Converter\SemverConverter;
+use Fxp\Composer\AssetPlugin\Converter\VersionConverterInterface;
+
+/**
+ * Tests for the conversion of Semver syntax to composer syntax.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class SemverConverterTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var VersionConverterInterface
+     */
+    protected $converter;
+
+    protected function setUp()
+    {
+        $this->converter = new SemverConverter();
+    }
+
+    protected function tearDown()
+    {
+        $this->converter = null;
+    }
+
+    /**
+     * @dataProvider getTestVersions
+     *
+     * @param string $semver
+     * @param string $composer
+     */
+    public function testConverter($semver, $composer)
+    {
+        $this->assertEquals($composer, $this->converter->convertVersion($semver));
+
+        if (!ctype_alpha($semver) && !in_array($semver, array(null, ''))) {
+            $this->assertEquals('v'.$composer, $this->converter->convertVersion('v'.$semver));
+        }
+    }
+
+    public function getTestVersions()
+    {
+        return array(
+            array('1.2.3', '1.2.3'),
+            array('1.2.3alpha', '1.2.3-alpha1'),
+            array('1.2.3-alpha', '1.2.3-alpha1'),
+            array('1.2.3a', '1.2.3-alpha1'),
+            array('1.2.3a1', '1.2.3-alpha1'),
+            array('1.2.3-a', '1.2.3-alpha1'),
+            array('1.2.3-a1', '1.2.3-alpha1'),
+            array('1.2.3b', '1.2.3-beta1'),
+            array('1.2.3b1', '1.2.3-beta1'),
+            array('1.2.3-b', '1.2.3-beta1'),
+            array('1.2.3-b1', '1.2.3-beta1'),
+            array('1.2.3beta', '1.2.3-beta1'),
+            array('1.2.3-beta', '1.2.3-beta1'),
+            array('1.2.3beta1', '1.2.3-beta1'),
+            array('1.2.3-beta1', '1.2.3-beta1'),
+            array('1.2.3rc1', '1.2.3-RC1'),
+            array('1.2.3-rc1', '1.2.3-RC1'),
+            array('1.2.3rc2', '1.2.3-RC2'),
+            array('1.2.3-rc2', '1.2.3-RC2'),
+            array('1.2.3rc.2', '1.2.3-RC.2'),
+            array('1.2.3-rc.2', '1.2.3-RC.2'),
+            array('1.2.3+0', '1.2.3-patch0'),
+            array('1.2.3-0', '1.2.3-patch0'),
+            array('1.2.3pre', '1.2.3-beta1'),
+            array('1.2.3-pre', '1.2.3-beta1'),
+            array('1.2.3dev', '1.2.3-dev'),
+            array('1.2.3-dev', '1.2.3-dev'),
+            array('1.2.3+build2012', '1.2.3-patch2012'),
+            array('1.2.3-build2012', '1.2.3-patch2012'),
+            array('1.2.3+build.2012', '1.2.3-patch.2012'),
+            array('1.2.3-build.2012', '1.2.3-patch.2012'),
+            array('1.3.0–rc30.79', '1.3.0-RC30.79'),
+            array('1.2.3-SNAPSHOT', '1.2.3-dev'),
+            array('1.2.3-npm-packages', '1.2.3'),
+            array('1.2.3-bower-packages', '1.2.3'),
+            array('20170124.0.0', '20170124.000000'),
+            array('20170124.1.0', '20170124.001000'),
+            array('20170124.1.1', '20170124.001001'),
+            array('20170124.100.200', '20170124.100200'),
+            array('20170124.0', '20170124.000000'),
+            array('20170124.1', '20170124.001000'),
+            array('20170124', '20170124'),
+            array('latest', 'default || *'),
+            array(null, '*'),
+            array('', '*'),
+        );
+    }
+
+    /**
+     * @dataProvider getTestRanges
+     *
+     * @param string $semver
+     * @param string $composer
+     */
+    public function testRangeConverter($semver, $composer)
+    {
+        $this->assertEquals($composer, $this->converter->convertRange($semver));
+    }
+
+    public function getTestRanges()
+    {
+        return array(
+            array('>1.2.3', '>1.2.3'),
+            array('<1.2.3', '<1.2.3'),
+            array('>=1.2.3', '>=1.2.3'),
+            array('<=1.2.3', '<=1.2.3'),
+            array('~1.2.3', '~1.2.3'),
+            array('~1', '~1'),
+            array('1', '~1'),
+            array('^1.2.3', '>=1.2.3,<2.0.0'),
+            array('^1.2', '>=1.2.0,<2.0.0'),
+            array('^1.x', '>=1.0.0,<2.0.0'),
+            array('^1', '>=1.0.0,<2.0.0'),
+            array('>1.2.3 <2.0', '>1.2.3,<2.0'),
+            array('>1.2 <2.0', '>1.2,<2.0'),
+            array('>1 <2', '>1,<2'),
+            array('>=1.2.3 <2.0', '>=1.2.3,<2.0'),
+            array('>=1.2 <2.0', '>=1.2,<2.0'),
+            array('>=1 <2', '>=1,<2'),
+            array('>=1.0 <1.1 || >=1.2', '>=1.0,<1.1|>=1.2'),
+            array('>=1.0 && <1.1 || >=1.2', '>=1.0,<1.1|>=1.2'),
+            array('< 1.2.3', '<1.2.3'),
+            array('> 1.2.3', '>1.2.3'),
+            array('<= 1.2.3', '<=1.2.3'),
+            array('>= 1.2.3', '>=1.2.3'),
+            array('~ 1.2.3', '~1.2.3'),
+            array('~1.2.x', '~1.2.0'),
+            array('~ 1.2', '~1.2'),
+            array('~ 1', '~1'),
+            array('^ 1.2.3', '>=1.2.3,<2.0.0'),
+            array('~> 1.2.3', '~1.2.3,>1.2.3'),
+            array('1.2.3 - 2.3.4', '>=1.2.3,<=2.3.4'),
+            array('1.0.0 - 1.3.x', '>=1.0.0,<1.4.0'),
+            array('1.0 - 1.x', '>=1.0,<2.0'),
+            array('1.2.3 - 2', '>=1.2.3,<3.0'),
+            array('1.x - 2.x', '>=1.0,<3.0'),
+            array('2 - 3', '>=2,<4.0'),
+            array('>=0.10.x', '>=0.10.0'),
+            array('>=0.10.*', '>=0.10.0'),
+            array('<=0.10.x', '<=0.10.9999999'),
+            array('<=0.10.*', '<=0.10.9999999'),
+            array('=1.2.x', '1.2.x'),
+            array('1.x.x', '1.x'),
+            array('1.x.x.x', '1.x'),
+            array('2.X.X.X', '2.x'),
+            array('2.X.x.x', '2.x'),
+            array('>=1.2.3 <2.0', '>=1.2.3,<2.0'),
+            array('^1.2.3', '>=1.2.3,<2.0.0'),
+            array('^0.2.3', '>=0.2.3,<0.3.0'),
+            array('^0.0.3', '>=0.0.3,<0.0.4'),
+            array('^1.2.3-beta.2', '>=1.2.3-beta.2,<2.0.0'),
+            array('^0.0.3-beta', '>=0.0.3-beta1,<0.0.4'),
+            array('^1.2.x', '>=1.2.0,<2.0.0'),
+            array('^0.0.x', '>=0.0.0,<0.1.0'),
+            array('^0.0', '>=0.0.0,<0.1.0'),
+            array('^1.x', '>=1.0.0,<2.0.0'),
+            array('^0.x', '>=0.0.0,<1.0.0'),
+            array('~v1', '~1'),
+            array('~v1-beta', '~1-beta1'),
+            array('~v1.2', '~1.2'),
+            array('~v1.2-beta', '~1.2-beta1'),
+            array('~v1.2.3', '~1.2.3'),
+            array('~v1.2.3-beta', '~1.2.3-beta1'),
+        );
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Fixtures/Converter/InvalidPackageConverter.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Fixtures/Converter/InvalidPackageConverter.php
new file mode 100644 (file)
index 0000000..fd4082b
--- /dev/null
@@ -0,0 +1,34 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Tests\Fixtures\Converter;
+
+use Fxp\Composer\AssetPlugin\Converter\AbstractPackageConverter;
+
+/**
+ * Fixture for invalid package converter tests.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class InvalidPackageConverter extends AbstractPackageConverter
+{
+    /**
+     * {@inheritdoc}
+     */
+    protected function getMapKeys()
+    {
+        return array_merge(parent::getMapKeys(), array(
+            'name' => array(null, function ($value) {
+                return $value;
+            }),
+        ));
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Fixtures/IO/MockIO.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Fixtures/IO/MockIO.php
new file mode 100644 (file)
index 0000000..6bff2a0
--- /dev/null
@@ -0,0 +1,173 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Tests\Fixtures\IO;
+
+use Composer\IO\BaseIO;
+
+/**
+ * Mock of IO.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class MockIO extends BaseIO
+{
+    /**
+     * @var bool
+     */
+    protected $verbose;
+
+    /**
+     * @var array
+     */
+    protected $traces;
+
+    /**
+     * Constructor.
+     *
+     * @param bool $verbose
+     */
+    public function __construct($verbose)
+    {
+        $this->verbose = $verbose;
+        $this->traces = array();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function isInteractive()
+    {
+        return false;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function isVerbose()
+    {
+        return $this->verbose;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function isVeryVerbose()
+    {
+        return $this->verbose;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function isDebug()
+    {
+        return false;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function isDecorated()
+    {
+        return false;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function write($messages, $newline = true, $verbosity = self::NORMAL)
+    {
+        $pos = max(count($this->traces) - 1, 0);
+        if (isset($this->traces[$pos])) {
+            $messages = $this->traces[$pos].$messages;
+        }
+        $this->traces[$pos] = $messages;
+        if ($newline) {
+            $this->traces[] = '';
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function writeError($messages, $newline = true, $verbosity = self::NORMAL)
+    {
+        $this->write($messages, $newline, $verbosity);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function overwrite($messages, $newline = true, $size = 80, $verbosity = self::NORMAL)
+    {
+        $pos = max(count($this->traces) - 1, 0);
+        $this->traces[$pos] = $messages;
+        if ($newline) {
+            $this->traces[] = '';
+        }
+    }
+
+    public function overwriteError($messages, $newline = true, $size = null, $verbosity = self::NORMAL)
+    {
+        $this->overwrite($messages, $newline, $size, $verbosity);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function ask($question, $default = null)
+    {
+        return $default;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function askConfirmation($question, $default = true)
+    {
+        return $default;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function askAndValidate($question, $validator, $attempts = false, $default = null)
+    {
+        return $default;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function askAndHideAnswer($question)
+    {
+        return;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function select($question, $choices, $default, $attempts = false, $errorMessage = 'Value "%s" is invalid', $multiselect = false)
+    {
+        return $default;
+    }
+
+    /**
+     * Gets the taces.
+     *
+     * @return array
+     */
+    public function getTraces()
+    {
+        return $this->traces;
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Fixtures/Repository/MockAssetRepository.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Fixtures/Repository/MockAssetRepository.php
new file mode 100644 (file)
index 0000000..f4a2b63
--- /dev/null
@@ -0,0 +1,87 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Tests\Fixtures\Repository;
+
+use Composer\Config;
+use Composer\EventDispatcher\EventDispatcher;
+use Composer\IO\IOInterface;
+use Composer\Package\PackageInterface;
+use Composer\Repository\RepositoryInterface;
+
+/**
+ * Fixture for assets repository tests.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class MockAssetRepository implements RepositoryInterface
+{
+    /**
+     * Constructor.
+     *
+     * @param array                $repoConfig
+     * @param IOInterface          $io
+     * @param Config               $config
+     * @param EventDispatcher|null $eventDispatcher
+     */
+    public function __construct(array $repoConfig, IOInterface $io, Config $config,
+                                EventDispatcher $eventDispatcher = null)
+    {
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function hasPackage(PackageInterface $package)
+    {
+        return false;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function findPackage($name, $version)
+    {
+        return;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function findPackages($name, $version = null)
+    {
+        return array();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getPackages()
+    {
+        return array();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function search($query, $mode = 0, $type = null)
+    {
+        return array();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function count()
+    {
+        return 0;
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Fixtures/Repository/Vcs/MockVcsDriver.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Fixtures/Repository/Vcs/MockVcsDriver.php
new file mode 100644 (file)
index 0000000..1b366c5
--- /dev/null
@@ -0,0 +1,145 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Tests\Fixtures\Repository\Vcs;
+
+use Composer\Config;
+use Composer\IO\IOInterface;
+use Composer\Repository\Vcs\VcsDriverInterface;
+
+/**
+ * Mock vcs driver.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class MockVcsDriver implements VcsDriverInterface
+{
+    /**
+     * @var bool
+     */
+    public static $supported = true;
+
+    /**
+     * @var mixed
+     */
+    public $contents = null;
+
+    /**
+     * {@inheritdoc}
+     */
+    public function initialize()
+    {
+        // no action
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getComposerInformation($identifier)
+    {
+        return;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getRootIdentifier()
+    {
+        return;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getBranches()
+    {
+        return array();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getTags()
+    {
+        return array();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getDist($identifier)
+    {
+        return;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getSource($identifier)
+    {
+        return;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getUrl()
+    {
+        return;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function hasComposerFile($identifier)
+    {
+        return false;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function cleanup()
+    {
+        // no action
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public static function supports(IOInterface $io, Config $config, $url, $deep = false)
+    {
+        return static::$supported;
+    }
+
+    /**
+     * @return mixed
+     */
+    protected function getContents()
+    {
+        return $this->contents;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getFileContent($file, $identifier)
+    {
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getChangeDate($identifier)
+    {
+        return new \DateTime();
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Fixtures/Repository/Vcs/MockVcsDriverSkipParsing.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Fixtures/Repository/Vcs/MockVcsDriverSkipParsing.php
new file mode 100644 (file)
index 0000000..17dc37a
--- /dev/null
@@ -0,0 +1,44 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Tests\Fixtures\Repository\Vcs;
+
+/**
+ * Mock vcs driver for skip parsing test.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class MockVcsDriverSkipParsing extends MockVcsDriver
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function getRootIdentifier()
+    {
+        return 'ROOT';
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function hasComposerFile($identifier)
+    {
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getComposerInformation($identifier)
+    {
+        throw new \Exception('MESSAGE with '.$identifier);
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Fixtures/Repository/Vcs/MockVcsDriverWithPackages.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Fixtures/Repository/Vcs/MockVcsDriverWithPackages.php
new file mode 100644 (file)
index 0000000..c2b9b81
--- /dev/null
@@ -0,0 +1,112 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Tests\Fixtures\Repository\Vcs;
+
+/**
+ * Mock vcs driver for packages test.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class MockVcsDriverWithPackages extends MockVcsDriver
+{
+    protected $composer = array(
+        'branch:master' => array(
+            'name' => 'foobar',
+            'version' => '2.0',
+        ),
+        'branch:1.x' => array(
+            'name' => 'foobar',
+            'version' => '1.1',
+        ),
+        'tag:v1.0.0' => array(
+            'name' => 'foobar',
+            'version' => '1.0',
+        ),
+        'tag:v1.0.1' => array(
+            'name' => 'foobar',
+        ),
+        'tag:invalid' => array(
+            'name' => 'foobar',
+            'description' => 'invalid tag name',
+        ),
+    );
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getRootIdentifier()
+    {
+        return 'master';
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function hasComposerFile($identifier)
+    {
+        return isset($this->composer['branch:'.$identifier])
+            || isset($this->composer['tag:'.$identifier]);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getComposerInformation($identifier)
+    {
+        $composer = null;
+
+        if ($this->hasComposerFile($identifier)) {
+            if (isset($this->composer['branch:'.$identifier])) {
+                $composer = $this->composer['branch:'.$identifier];
+            } elseif (isset($this->composer['tag:'.$identifier])) {
+                $composer = $this->composer['tag:'.$identifier];
+            }
+        }
+
+        return $composer;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getBranches()
+    {
+        return $this->getDataPackages('branch');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getTags()
+    {
+        return $this->getDataPackages('tag');
+    }
+
+    /**
+     * @param string $type
+     *
+     * @return array
+     */
+    protected function getDataPackages($type)
+    {
+        $packages = array();
+
+        foreach ($this->composer as $name => $data) {
+            if (0 === strpos($name, $type.':')) {
+                $name = substr($name, strpos($name, ':') + 1);
+                $packages[$name] = $data;
+            }
+        }
+
+        return $packages;
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Fixtures/Repository/Vcs/MockVcsDriverWithUrlPackages.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Fixtures/Repository/Vcs/MockVcsDriverWithUrlPackages.php
new file mode 100644 (file)
index 0000000..51b213b
--- /dev/null
@@ -0,0 +1,37 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Tests\Fixtures\Repository\Vcs;
+
+/**
+ * Mock vcs driver for url packages test.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class MockVcsDriverWithUrlPackages extends MockVcsDriverWithPackages
+{
+    protected $composer = array(
+        'branch:master' => array(
+            'version' => '2.0',
+        ),
+        'branch:1.x' => array(
+            'version' => '1.1',
+        ),
+        'tag:v1.0.0' => array(
+            'version' => '1.0',
+        ),
+        'tag:v1.0.1' => array(
+        ),
+        'tag:invalid' => array(
+            'description' => 'invalid tag name',
+        ),
+    );
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Fixtures/package/bower.json b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Fixtures/package/bower.json
new file mode 100644 (file)
index 0000000..18f7b7c
--- /dev/null
@@ -0,0 +1,46 @@
+{
+    "name": "test",
+    "description": "Test bower",
+    "version": "1.0.0-pre",
+    "keywords": [
+        "foo",
+        "bar"
+    ],
+    "license": "MIT",
+    "bin": "bin/foo",
+    "main": [
+        "dist/js/foo.js"
+    ],
+    "ignore": [
+        ".*"
+    ],
+    "dependencies": {
+        "library1": ">= 1.0.0",
+        "library2": ">= 1.0.0",
+        "library2-0.9.0": "library2#0.9.0",
+        "library3": "git@foobar.tld:user/repository3.git",
+        "library4": "git@foobar.tld:user/repository4.git#1.2.3",
+        "library5": "git@foobar.tld:user/repository5.git#0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b",
+        "library6": "git@foobar.tld:user/repository6.git#branch",
+        "library7": "git@foobar.tld:user/repository7.git#1.2.*",
+        "library8": "git@foobar.tld:user/repository8.git#1.2.x",
+        "library9": "git@foobar.tld:user/repository9.git#master",
+        "library10": "user/repository10#1.0.0",
+        "library11": "user/repository11",
+        "library12": "user/repository11#>=1 <2",
+        "library13": ">=1 <2",
+        "library14": "*",
+        "library15": "library15#*",
+        "library16": "library16#>=1 <2",
+        "library17": "http://foobar.tld/library17-1.2.3.js",
+        "library18": "http://foobar.tld/library18.js#1.2.3",
+        "library19": "http://foobar.tld/library19.js",
+        "library20": "http://foobar.tld/library20/v1.2.tar.gz"
+    },
+    "devDependencies": {
+        "dev-library1": ">= 1.0.0",
+        "dev-library2": ">= 1.0.0",
+        "dev-library2-0.9.0": "dev-library2#0.9.0"
+    },
+    "private": false
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Fixtures/package/global/composer.json b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Fixtures/package/global/composer.json
new file mode 100644 (file)
index 0000000..d4d3ae3
--- /dev/null
@@ -0,0 +1,8 @@
+{
+    "config": {
+        "fxp-asset": {
+            "global-composer-foo": 70,
+            "global-composer-bar": 70
+        }
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Fixtures/package/global/config.json b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Fixtures/package/global/config.json
new file mode 100644 (file)
index 0000000..7607490
--- /dev/null
@@ -0,0 +1,8 @@
+{
+    "config": {
+        "fxp-asset": {
+            "global-composer-foo": 90,
+            "global-config-foo": 23
+        }
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Fixtures/package/npm-scope.json b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Fixtures/package/npm-scope.json
new file mode 100644 (file)
index 0000000..a524636
--- /dev/null
@@ -0,0 +1,13 @@
+{
+    "name": "@scope/test",
+    "description": "Test NPM Scope",
+    "version": "1.0.0-pre",
+    "license": "MIT",
+    "dependencies": {
+        "@scope/library1": ">= 1.0.0",
+        "@scope2/library2": ">= 1.0.0"
+    },
+    "devDependencies": {
+        "@scope3/dev-library1": ">= 1.0.0"
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Fixtures/package/npm.json b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Fixtures/package/npm.json
new file mode 100644 (file)
index 0000000..fa5a006
--- /dev/null
@@ -0,0 +1,95 @@
+{
+    "name": "test",
+    "description": "Test NPM",
+    "version": "1.0.0-pre",
+    "keywords": [
+        "foo",
+        "bar"
+    ],
+    "homepage": "http://test.tld",
+    "license": "MIT",
+    "author": {
+        "name": "Foo Bar",
+        "email": "foo@bar.tld",
+        "url": "http://foo.bar.tld"
+    },
+    "contributors": [
+        {
+            "name": "Bar Foo",
+            "email": "bar@foo.tld",
+            "url": "http://bar.foo.tld"
+        }
+    ],
+    "dependencies": {
+        "library1": ">= 1.0.0",
+        "library2": ">= 1.0.0",
+        "library2-0.9.0": "library2#0.9.0",
+        "library3": "git@foobar.tld:user/repository3.git",
+        "library4": "git@foobar.tld:user/repository4.git#1.2.3",
+        "library5": "git@foobar.tld:user/repository5.git#0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b",
+        "library6": "git@foobar.tld:user/repository6.git#branch",
+        "library7": "git@foobar.tld:user/repository7.git#1.2.*",
+        "library8": "git@foobar.tld:user/repository8.git#1.2.x",
+        "library9": "git@foobar.tld:user/repository9.git#master",
+        "library10": "git@foobar.tld:user/repository10#1.0.0",
+        "library11": "git@foobar.tld:user/repository11",
+        "library12": "git@foobar.tld:user/repository11#>=1 <2",
+        "library13": ">=1 <2",
+        "library14": "*",
+        "library15": "library15#*",
+        "library16": "library16#>=1 <2",
+        "library17": "http://foobar.tld/library17-1.2.3.js",
+        "library18": "http://foobar.tld/library18.js#1.2.3",
+        "library19": "http://foobar.tld/library19.js",
+        "library20": "http://foobar.tld/library20/v1.2.tar.gz",
+        "library21": "1 || 2"
+    },
+    "devDependencies": {
+        "dev-library1": ">= 1.0.0",
+        "dev-library2": ">= 1.0.0",
+        "dev-library2-0.9.0": "dev-library2#0.9.0",
+        "library3": "library3,bar/*.js"
+    },
+    "bin": "bin/foo",
+    "bugs": {
+        "url": "http://foo.bar.tld",
+        "email": "foo@bar.tld"
+    },
+    "files": [
+        "dist/js/foo.js"
+    ],
+    "main": [
+        "dist/js/bar.js"
+    ],
+    "man": [],
+    "directories": {
+        "lib": "lib",
+        "bin": "bin",
+        "man": "man",
+        "doc": "doc",
+        "example": "example"
+    },
+    "repository": {
+        "type" : "git",
+        "url" : "http://github.com/npm/npm.git"
+    },
+    "scripts": {
+        "build": "npm install && grunt"
+    },
+    "config": {
+        "foo": "bar"
+    },
+    "bundledDependencies": [],
+    "optionalDependencies": [],
+    "engines": {
+        "node": ">=0.10.3 <0.12"
+    },
+    "engineStrict": true,
+    "os": ["darwin", "linux"],
+    "cpu": ["x64", "ia32"],
+    "preferGlobal": true,
+    "private": false,
+    "publishConfig": {
+        "foo": "bar"
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/FxpAssetPluginTest.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/FxpAssetPluginTest.php
new file mode 100644 (file)
index 0000000..a3bd484
--- /dev/null
@@ -0,0 +1,379 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Tests;
+
+use Composer\Composer;
+use Composer\Config;
+use Composer\DependencyResolver\Pool;
+use Composer\Installer\InstallationManager;
+use Composer\Installer\InstallerEvent;
+use Composer\IO\IOInterface;
+use Composer\Plugin\CommandEvent;
+use Composer\Repository\RepositoryManager;
+use Composer\Util\Filesystem;
+use Fxp\Composer\AssetPlugin\FxpAssetPlugin;
+
+/**
+ * Tests of asset plugin.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class FxpAssetPluginTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var FxpAssetPlugin
+     */
+    protected $plugin;
+
+    /**
+     * @var Composer
+     */
+    protected $composer;
+
+    /**
+     * @var IOInterface
+     */
+    protected $io;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $package;
+
+    protected function setUp()
+    {
+        $io = $this->getMockBuilder('Composer\IO\IOInterface')->getMock();
+        $config = $this->getMockBuilder('Composer\Config')->getMock();
+        $config->expects($this->any())
+            ->method('get')
+            ->will($this->returnCallback(function ($key) {
+                $value = null;
+
+                switch ($key) {
+                    case 'cache-repo-dir':
+                        $value = sys_get_temp_dir().'/composer-test-repo-cache';
+                        break;
+                }
+
+                return $value;
+            }));
+        $this->package = $this->getMockBuilder('Composer\Package\RootPackageInterface')->getMock();
+        $this->package->expects($this->any())
+            ->method('getRequires')
+            ->will($this->returnValue(array()));
+        $this->package->expects($this->any())
+            ->method('getDevRequires')
+            ->will($this->returnValue(array()));
+
+        /* @var IOInterface $io */
+        /* @var Config $config */
+        $rm = new RepositoryManager($io, $config);
+        $im = new InstallationManager();
+
+        $composer = $this->getMockBuilder('Composer\Composer')->getMock();
+        $composer->expects($this->any())
+            ->method('getRepositoryManager')
+            ->will($this->returnValue($rm));
+        $composer->expects($this->any())
+            ->method('getPackage')
+            ->will($this->returnValue($this->package));
+        $composer->expects($this->any())
+            ->method('getConfig')
+            ->will($this->returnValue($config));
+        $composer->expects($this->any())
+            ->method('getInstallationManager')
+            ->will($this->returnValue($im));
+
+        $this->plugin = new FxpAssetPlugin();
+        $this->composer = $composer;
+        $this->io = $io;
+    }
+
+    protected function tearDown()
+    {
+        $this->plugin = null;
+        $this->composer = null;
+        $this->io = null;
+
+        $fs = new Filesystem();
+        $fs->remove(sys_get_temp_dir().'/composer-test-repo-cache');
+    }
+
+    public function testAssetRepositories()
+    {
+        $this->package->expects($this->any())
+            ->method('getConfig')
+            ->will($this->returnValue(array(
+                'fxp-asset' => array(
+                    'private-bower-registries' => array(
+                        'my-private-bower-server' => 'https://my-private-bower-server.tld/packages',
+                    ),
+                ),
+            )));
+
+        $this->plugin->activate($this->composer, $this->io);
+        $repos = $this->composer->getRepositoryManager()->getRepositories();
+
+        $this->assertCount(3, $repos);
+        foreach ($repos as $repo) {
+            $this->assertInstanceOf('Composer\Repository\ComposerRepository', $repo);
+        }
+    }
+
+    /**
+     * @dataProvider getDataForAssetVcsRepositories
+     *
+     * @param string $type
+     */
+    public function testAssetVcsRepositories($type)
+    {
+        $this->package->expects($this->any())
+            ->method('getExtra')
+            ->will($this->returnValue(array()));
+
+        $this->plugin->activate($this->composer, $this->io);
+        $rm = $this->composer->getRepositoryManager();
+        $repo = $rm->createRepository($type, array(
+            'type' => $type,
+            'url' => 'http://foo.tld',
+            'name' => 'foo',
+        ));
+
+        $this->assertInstanceOf('Composer\Repository\VcsRepository', $repo);
+    }
+
+    public function getDataForAssetVcsRepositories()
+    {
+        return array(
+            array('npm-vcs'),
+            array('npm-git'),
+            array('npm-github'),
+
+            array('bower-vcs'),
+            array('bower-git'),
+            array('bower-github'),
+        );
+    }
+
+    /**
+     * @expectedException \UnexpectedValueException
+     */
+    public function testAssetRepositoryWithValueIsNotArray()
+    {
+        $this->package->expects($this->any())
+            ->method('getExtra')
+            ->will($this->returnValue(array('asset-repositories' => array(
+                'invalid_repo',
+            ))));
+
+        $this->plugin->activate($this->composer, $this->io);
+    }
+
+    /**
+     * @expectedException \UnexpectedValueException
+     */
+    public function testAssetRepositoryWithInvalidType()
+    {
+        $this->package->expects($this->any())
+            ->method('getExtra')
+            ->will($this->returnValue(array('asset-repositories' => array(
+                array(),
+            ))));
+
+        $this->plugin->activate($this->composer, $this->io);
+    }
+
+    /**
+     * @expectedException \UnexpectedValueException
+     */
+    public function testAssetRepositoryWithInvalidTypeFormat()
+    {
+        $this->package->expects($this->any())
+            ->method('getExtra')
+            ->will($this->returnValue(array('asset-repositories' => array(
+                array('type' => 'invalid_type'),
+            ))));
+
+        $this->plugin->activate($this->composer, $this->io);
+    }
+
+    /**
+     * @expectedException \UnexpectedValueException
+     */
+    public function testAssetRepositoryWithInvalidUrl()
+    {
+        $this->package->expects($this->any())
+            ->method('getExtra')
+            ->will($this->returnValue(array('asset-repositories' => array(
+                array('type' => 'npm-vcs'),
+            ))));
+
+        $this->plugin->activate($this->composer, $this->io);
+    }
+
+    public function testAssetRepository()
+    {
+        $this->package->expects($this->any())
+            ->method('getExtra')
+            ->will($this->returnValue(array('asset-repositories' => array(
+                array('type' => 'npm-vcs', 'url' => 'http://foo.tld', 'name' => 'foo'),
+            ))));
+
+        $this->plugin->activate($this->composer, $this->io);
+        $repos = $this->composer->getRepositoryManager()->getRepositories();
+
+        $this->assertCount(3, $repos);
+        $this->assertInstanceOf('Fxp\Composer\AssetPlugin\Repository\AssetVcsRepository', $repos[2]);
+    }
+
+    public function testAssetRepositoryWithAlreadyExistRepositoryName()
+    {
+        $this->package->expects($this->any())
+            ->method('getExtra')
+            ->will($this->returnValue(array('asset-repositories' => array(
+                array('type' => 'npm-vcs', 'url' => 'http://foo.tld', 'name' => 'foo'),
+                array('type' => 'npm-vcs', 'url' => 'http://foo.tld', 'name' => 'foo'),
+            ))));
+
+        $this->plugin->activate($this->composer, $this->io);
+        $repos = $this->composer->getRepositoryManager()->getRepositories();
+
+        $this->assertCount(3, $repos);
+        $this->assertInstanceOf('Fxp\Composer\AssetPlugin\Repository\AssetVcsRepository', $repos[2]);
+    }
+
+    /**
+     * @expectedException \UnexpectedValueException
+     */
+    public function testAssetPackageWithoutPackage()
+    {
+        $this->package->expects($this->any())
+            ->method('getExtra')
+            ->will($this->returnValue(array('asset-repositories' => array(
+                array('type' => 'package'),
+            ))));
+
+        $this->plugin->activate($this->composer, $this->io);
+    }
+
+    /**
+     * @expectedException \UnexpectedValueException
+     */
+    public function testAssetPackageWithInvalidPackage()
+    {
+        $this->package->expects($this->any())
+            ->method('getExtra')
+            ->will($this->returnValue(array('asset-repositories' => array(
+                array('type' => 'package', 'package' => array('key' => 'value')),
+            ))));
+
+        $this->plugin->activate($this->composer, $this->io);
+    }
+
+    public function testAssetPackageRepositories()
+    {
+        $this->package->expects($this->any())
+            ->method('getExtra')
+            ->will($this->returnValue(array('asset-repositories' => array(
+                array(
+                    'type' => 'package',
+                    'package' => array(
+                        'name' => 'foo',
+                        'type' => 'ASSET-asset-library',
+                        'version' => '0.0.0.0',
+                        'dist' => array(
+                            'url' => 'foo.tld/bar',
+                            'type' => 'file',
+                        ),
+                    ),
+                ),
+            ))));
+
+        $rm = $this->composer->getRepositoryManager();
+        $rm->setRepositoryClass('package', 'Composer\Repository\PackageRepository');
+        $this->plugin->activate($this->composer, $this->io);
+        $repos = $this->composer->getRepositoryManager()->getRepositories();
+
+        $this->assertCount(3, $repos);
+        $this->assertInstanceOf('Composer\Repository\PackageRepository', $repos[2]);
+    }
+
+    public function testOptionsForAssetRegistryRepositories()
+    {
+        $this->package->expects($this->any())
+            ->method('getConfig')
+            ->will($this->returnValue(array(
+                'fxp-asset' => array(
+                    'registry-options' => array(
+                        'npm-option1' => 'value 1',
+                        'bower-option1' => 'value 2',
+                    ),
+                ),
+            )));
+        $this->assertInstanceOf('Composer\Package\RootPackageInterface', $this->package);
+
+        $this->plugin->activate($this->composer, $this->io);
+    }
+
+    public function testSubscribeEvents()
+    {
+        $this->package->expects($this->any())
+            ->method('getExtra')
+            ->will($this->returnValue(array()));
+
+        $this->assertCount(2, $this->plugin->getSubscribedEvents());
+        $this->assertCount(0, $this->composer->getRepositoryManager()->getRepositories());
+
+        /* @var InstallerEvent|\PHPUnit_Framework_MockObject_MockObject  $eventInstaller */
+        $eventInstaller = $this->getMockBuilder('Composer\Installer\InstallerEvent')
+            ->disableOriginalConstructor()
+            ->getMock();
+        $eventInstaller->expects($this->any())
+            ->method('getPool')
+            ->will($this->returnValue($this->getMockBuilder(Pool::class)
+                ->disableOriginalConstructor()
+                ->getMock()
+            ));
+        /* @var CommandEvent|\PHPUnit_Framework_MockObject_MockObject $eventCommand */
+        $eventCommand = $this->getMockBuilder('Composer\Plugin\CommandEvent')
+            ->disableOriginalConstructor()
+            ->getMock();
+        $eventCommand->expects($this->any())
+            ->method('getCommandName')
+            ->will($this->returnValue('show'));
+
+        $this->plugin->activate($this->composer, $this->io);
+        $this->plugin->onPluginCommand($eventCommand);
+        $this->plugin->onPreDependenciesSolving($eventInstaller);
+    }
+
+    public function testAssetInstallers()
+    {
+        $this->package->expects($this->any())
+            ->method('getExtra')
+            ->will($this->returnValue(array()));
+
+        $this->plugin->activate($this->composer, $this->io);
+        $im = $this->composer->getInstallationManager();
+
+        $this->assertInstanceOf('Fxp\Composer\AssetPlugin\Installer\BowerInstaller', $im->getInstaller('bower-asset-library'));
+        $this->assertInstanceOf('Fxp\Composer\AssetPlugin\Installer\AssetInstaller', $im->getInstaller('npm-asset-library'));
+    }
+
+    public function testGetConfig()
+    {
+        $this->plugin->activate($this->composer, $this->io);
+
+        $config = $this->plugin->getConfig();
+        $this->assertInstanceOf(\Fxp\Composer\AssetPlugin\Config\Config::class, $config);
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Installer/AssetInstallerTest.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Installer/AssetInstallerTest.php
new file mode 100644 (file)
index 0000000..eebeccb
--- /dev/null
@@ -0,0 +1,257 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Tests\Installer;
+
+use Composer\Composer;
+use Composer\IO\IOInterface;
+use Composer\Package\PackageInterface;
+use Composer\Package\RootPackageInterface;
+use Composer\Repository\InstalledRepositoryInterface;
+use Composer\Util\Filesystem;
+use Fxp\Composer\AssetPlugin\Config\ConfigBuilder;
+use Fxp\Composer\AssetPlugin\Installer\AssetInstaller;
+use Fxp\Composer\AssetPlugin\Type\AssetTypeInterface;
+
+/**
+ * Tests of asset installer.
+ *
+ * @author Martin Hasoň <martin.hason@gmail.com>
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class AssetInstallerTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var Composer|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $composer;
+
+    /**
+     * @var IOInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $io;
+
+    /**
+     * @var RootPackageInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $package;
+
+    /**
+     * @var AssetTypeInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $type;
+
+    protected function setUp()
+    {
+        $this->io = $this->getMockBuilder('Composer\IO\IOInterface')->getMock();
+        $config = $this->getMockBuilder('Composer\Config')->getMock();
+        $config->expects($this->any())
+            ->method('get')
+            ->will($this->returnCallback(function ($key) {
+                $value = null;
+
+                switch ($key) {
+                    case 'cache-repo-dir':
+                        $value = sys_get_temp_dir().'/composer-test-repo-cache';
+                        break;
+                    case 'vendor-dir':
+                        $value = sys_get_temp_dir().'/composer-test/vendor';
+                        break;
+                }
+
+                return $value;
+            }));
+
+        $this->package = $this->getMockBuilder('Composer\Package\RootPackageInterface')->getMock();
+
+        $this->composer = $this->getMockBuilder('Composer\Composer')->getMock();
+        $this->composer->expects($this->any())
+            ->method('getPackage')
+            ->will($this->returnValue($this->package));
+        $this->composer->expects($this->any())
+            ->method('getConfig')
+            ->will($this->returnValue($config));
+
+        $this->type = $this->getMockBuilder('Fxp\Composer\AssetPlugin\Type\AssetTypeInterface')->getMock();
+        $this->type->expects($this->any())
+            ->method('getName')
+            ->will($this->returnValue('foo'));
+        $this->type->expects($this->any())
+            ->method('getComposerVendorName')
+            ->will($this->returnValue('foo-asset'));
+        $this->type->expects($this->any())
+            ->method('getComposerType')
+            ->will($this->returnValue('foo-asset-library'));
+        $this->type->expects($this->any())
+            ->method('getFilename')
+            ->will($this->returnValue('foo.json'));
+        $this->type->expects($this->any())
+            ->method('getVersionConverter')
+            ->will($this->returnValue($this->getMockBuilder('Fxp\Composer\AssetPlugin\Converter\VersionConverterInterface')->getMock()));
+        $this->type->expects($this->any())
+            ->method('getPackageConverter')
+            ->will($this->returnValue($this->getMockBuilder('Fxp\Composer\AssetPlugin\Converter\PackageConverterInterface')->getMock()));
+    }
+
+    protected function tearDown()
+    {
+        $this->package = null;
+        $this->composer = null;
+        $this->io = null;
+
+        $fs = new Filesystem();
+        $fs->remove(sys_get_temp_dir().'/composer-test-repo-cache');
+        $fs->remove(sys_get_temp_dir().'/composer-test/vendor');
+    }
+
+    public function testDefaultVendorDir()
+    {
+        $installer = $this->createInstaller();
+        $vendorDir = realpath(sys_get_temp_dir()).'/composer-test/vendor/'.$this->type->getComposerVendorName();
+        $vendorDir = str_replace('\\', '/', $vendorDir);
+
+        $installerPath = $installer->getInstallPath($this->createPackageMock('foo-asset/foo'));
+        $installerPath = str_replace('\\', '/', $installerPath);
+        $this->assertEquals($vendorDir.'/foo', $installerPath);
+
+        $installerPath2 = $installer->getInstallPath($this->createPackageMock('foo-asset/foo/bar'));
+        $installerPath2 = str_replace('\\', '/', $installerPath2);
+        $this->assertEquals($vendorDir.'/foo/bar', $installerPath2);
+    }
+
+    public function testCustomFooDir()
+    {
+        $vendorDir = realpath(sys_get_temp_dir()).'/composer-test/web';
+        $vendorDir = str_replace('\\', '/', $vendorDir);
+
+        $package = $this->package;
+        $package->expects($this->any())
+            ->method('getExtra')
+            ->will($this->returnValue(array(
+                'asset-installer-paths' => array(
+                    $this->type->getComposerType() => $vendorDir,
+                ),
+            )));
+
+        $installer = $this->createInstaller();
+
+        $installerPath = $installer->getInstallPath($this->createPackageMock('foo-asset/foo'));
+        $installerPath = str_replace('\\', '/', $installerPath);
+        $this->assertEquals($vendorDir.'/foo', $installerPath);
+
+        $installerPath2 = $installer->getInstallPath($this->createPackageMock('foo-asset/foo/bar'));
+        $installerPath2 = str_replace('\\', '/', $installerPath2);
+        $this->assertEquals($vendorDir.'/foo/bar', $installerPath2);
+    }
+
+    public function testInstall()
+    {
+        /* @var RootPackageInterface $rootPackage */
+        $rootPackage = $this->createRootPackageMock();
+        /* @var IOInterface $io */
+        $io = $this->io;
+        /* @var AssetTypeInterface $type */
+        $type = $this->type;
+        $vendorDir = realpath(sys_get_temp_dir()).DIRECTORY_SEPARATOR.'composer-test'.DIRECTORY_SEPARATOR.'vendor';
+
+        $this->composer->setPackage($rootPackage);
+
+        $dm = $this->getMockBuilder('Composer\Downloader\DownloadManager')
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->composer->expects($this->any())
+            ->method('getDownloadManager')
+            ->will($this->returnValue($dm));
+
+        /* @var \PHPUnit_Framework_MockObject_MockObject $package */
+        $package = $this->createPackageMock('foo-asset/package');
+
+        /* @var PackageInterface $package */
+        $packageDir = $vendorDir.'/'.$package->getPrettyName();
+
+        $dm->expects($this->once())
+            ->method('download')
+            ->with($package, $vendorDir.DIRECTORY_SEPARATOR.'foo-asset/package');
+
+        $repository = $this->getMockBuilder('Composer\Repository\InstalledRepositoryInterface')->getMock();
+        $repository->expects($this->once())
+            ->method('addPackage')
+            ->with($package);
+
+        $config = ConfigBuilder::build($this->composer);
+        $library = new AssetInstaller($config, $io, $this->composer, $type);
+
+        /* @var InstalledRepositoryInterface $repository */
+        $library->install($repository, $package);
+        $this->assertFileExists($vendorDir, 'Vendor dir should be created');
+
+        $this->ensureDirectoryExistsAndClear($packageDir);
+    }
+
+    /**
+     * Creates the asset installer.
+     *
+     * @return AssetInstaller
+     */
+    protected function createInstaller()
+    {
+        /* @var IOInterface $io */
+        $io = $this->io;
+        /* @var Composer $composer */
+        $composer = $this->composer;
+        /* @var AssetTypeInterface $type */
+        $type = $this->type;
+        $config = ConfigBuilder::build($composer);
+
+        return new AssetInstaller($config, $io, $composer, $type);
+    }
+
+    /**
+     * Creates the mock package.
+     *
+     * @param string $name
+     *
+     * @return PackageInterface
+     */
+    private function createPackageMock($name)
+    {
+        return $this->getMockBuilder('Composer\Package\Package')
+            ->setConstructorArgs(array($name, '1.0.0.0', '1.0.0'))
+            ->enableProxyingToOriginalMethods()
+            ->getMock();
+    }
+
+    /**
+     * @return RootPackageInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected function createRootPackageMock()
+    {
+        $package = $this->getMockBuilder('Composer\Package\RootPackageInterface')
+            ->setConstructorArgs(array(md5(mt_rand()), '1.0.0.0', '1.0.0'))
+            ->getMock();
+
+        $package->expects($this->any())
+            ->method('getConfig')
+            ->will($this->returnValue(array()));
+
+        return $package;
+    }
+
+    protected function ensureDirectoryExistsAndClear($directory)
+    {
+        $fs = new Filesystem();
+        if (is_dir($directory)) {
+            $fs->removeDirectory($directory);
+        }
+        mkdir($directory, 0777, true);
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Installer/BowerInstallerTest.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Installer/BowerInstallerTest.php
new file mode 100644 (file)
index 0000000..e6a4030
--- /dev/null
@@ -0,0 +1,511 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Tests\Installer;
+
+use Composer\Composer;
+use Composer\Config;
+use Composer\Downloader\DownloadManager;
+use Composer\IO\IOInterface;
+use Composer\Package\Package;
+use Composer\Package\PackageInterface;
+use Composer\Package\RootPackageInterface;
+use Composer\Repository\InstalledRepositoryInterface;
+use Composer\TestCase;
+use Composer\Util\Filesystem;
+use Fxp\Composer\AssetPlugin\Config\ConfigBuilder;
+use Fxp\Composer\AssetPlugin\Installer\BowerInstaller;
+use Fxp\Composer\AssetPlugin\Type\AssetTypeInterface;
+use Fxp\Composer\AssetPlugin\Util\AssetPlugin;
+
+/**
+ * Tests of bower asset installer.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class BowerInstallerTest extends TestCase
+{
+    /**
+     * @var Composer
+     */
+    protected $composer;
+
+    /**
+     * @var Config
+     */
+    protected $config;
+
+    /**
+     * @var string
+     */
+    protected $vendorDir;
+
+    /**
+     * @var string
+     */
+    protected $binDir;
+
+    /**
+     * @var DownloadManager|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $dm;
+
+    /**
+     * @var InstalledRepositoryInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $repository;
+
+    /**
+     * @var IOInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $io;
+
+    /**
+     * @var Filesystem
+     */
+    protected $fs;
+
+    /**
+     * @var AssetTypeInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $type;
+
+    protected function setUp()
+    {
+        $this->fs = new Filesystem();
+
+        $this->composer = new Composer();
+        $this->config = new Config();
+        $this->composer->setConfig($this->config);
+
+        $this->vendorDir = realpath(sys_get_temp_dir()).DIRECTORY_SEPARATOR.'composer-test-vendor';
+        $this->ensureDirectoryExistsAndClear($this->vendorDir);
+
+        $this->binDir = realpath(sys_get_temp_dir()).DIRECTORY_SEPARATOR.'composer-test-bin';
+        $this->ensureDirectoryExistsAndClear($this->binDir);
+
+        $this->config->merge(array(
+                'config' => array(
+                    'vendor-dir' => $this->vendorDir,
+                    'bin-dir' => $this->binDir,
+                ),
+            ));
+
+        $this->dm = $this->getMockBuilder('Composer\Downloader\DownloadManager')
+            ->disableOriginalConstructor()
+            ->getMock();
+        /* @var DownloadManager $dm */
+        $dm = $this->dm;
+        $this->composer->setDownloadManager($dm);
+
+        $this->repository = $this->getMockBuilder('Composer\Repository\InstalledRepositoryInterface')->getMock();
+        $this->io = $this->getMockBuilder('Composer\IO\IOInterface')->getMock();
+
+        $this->type = $this->getMockBuilder('Fxp\Composer\AssetPlugin\Type\AssetTypeInterface')->getMock();
+        $this->type->expects($this->any())
+            ->method('getName')
+            ->will($this->returnValue('foo'));
+        $this->type->expects($this->any())
+            ->method('getComposerVendorName')
+            ->will($this->returnValue('foo-asset'));
+        $this->type->expects($this->any())
+            ->method('getComposerType')
+            ->will($this->returnValue('foo-asset-library'));
+        $this->type->expects($this->any())
+            ->method('getFilename')
+            ->will($this->returnValue('foo.json'));
+        $this->type->expects($this->any())
+            ->method('getVersionConverter')
+            ->will($this->returnValue($this->getMockBuilder('Fxp\Composer\AssetPlugin\Converter\VersionConverterInterface')->getMock()));
+        $this->type->expects($this->any())
+            ->method('getPackageConverter')
+            ->will($this->returnValue($this->getMockBuilder('Fxp\Composer\AssetPlugin\Converter\PackageConverterInterface')->getMock()));
+    }
+
+    protected function tearDown()
+    {
+        $this->fs->removeDirectory($this->vendorDir);
+        $this->fs->removeDirectory($this->binDir);
+    }
+
+    public function testInstallerCreationShouldNotCreateVendorDirectory()
+    {
+        /* @var RootPackageInterface $rootPackage */
+        $rootPackage = $this->createRootPackageMock();
+        /* @var IOInterface $io */
+        $io = $this->io;
+        /* @var AssetTypeInterface $type */
+        $type = $this->type;
+
+        $this->fs->removeDirectory($this->vendorDir);
+        $this->composer->setPackage($rootPackage);
+
+        new BowerInstaller(ConfigBuilder::build($this->composer), $io, $this->composer, $type);
+        $this->assertFileNotExists($this->vendorDir);
+    }
+
+    public function testInstallerCreationShouldNotCreateBinDirectory()
+    {
+        /* @var RootPackageInterface $rootPackage */
+        $rootPackage = $this->createRootPackageMock();
+        /* @var IOInterface $io */
+        $io = $this->io;
+        /* @var AssetTypeInterface $type */
+        $type = $this->type;
+
+        $this->fs->removeDirectory($this->binDir);
+        $this->composer->setPackage($rootPackage);
+
+        new BowerInstaller(ConfigBuilder::build($this->composer), $io, $this->composer, $type);
+        $this->assertFileNotExists($this->binDir);
+    }
+
+    public function testIsInstalled()
+    {
+        /* @var RootPackageInterface $rootPackage */
+        $rootPackage = $this->createRootPackageMock();
+        /* @var IOInterface $io */
+        $io = $this->io;
+        /* @var AssetTypeInterface $type */
+        $type = $this->type;
+
+        $this->composer->setPackage($rootPackage);
+
+        $library = new BowerInstaller(ConfigBuilder::build($this->composer), $io, $this->composer, $type);
+        /* @var \PHPUnit_Framework_MockObject_MockObject $package */
+        $package = $this->createPackageMock();
+        $package
+            ->expects($this->any())
+            ->method('getPrettyName')
+            ->will($this->returnValue('foo-asset/package'));
+
+        /* @var PackageInterface $package */
+        $packageDir = $this->vendorDir.'/'.$package->getPrettyName();
+        mkdir($packageDir, 0777, true);
+
+        /* @var \PHPUnit_Framework_MockObject_MockObject $repository */
+        $repository = $this->repository;
+        $repository
+            ->expects($this->exactly(2))
+            ->method('hasPackage')
+            ->with($package)
+            ->will($this->onConsecutiveCalls(true, false));
+
+        /* @var InstalledRepositoryInterface $repository */
+        $this->assertTrue($library->isInstalled($repository, $package));
+        $this->assertFalse($library->isInstalled($repository, $package));
+
+        $this->ensureDirectoryExistsAndClear($packageDir);
+    }
+
+    public function getAssetIgnoreFiles()
+    {
+        return array(
+            array(array()),
+            array(array('foo', 'bar')),
+        );
+    }
+
+    public function getAssetMainFiles()
+    {
+        return array(
+            array(array()),
+            array(array(
+                'fxp-asset' => array(
+                    'main-files' => array(
+                        'foo-asset/bar' => array(
+                            'foo',
+                            'bar',
+                        ),
+                    ),
+                ),
+            )),
+        );
+    }
+
+    /**
+     * @dataProvider getAssetIgnoreFiles
+     *
+     * @param array $ignoreFiles
+     */
+    public function testInstall(array $ignoreFiles)
+    {
+        /* @var RootPackageInterface $rootPackage */
+        $rootPackage = $this->createRootPackageMock();
+        /* @var IOInterface $io */
+        $io = $this->io;
+        /* @var AssetTypeInterface $type */
+        $type = $this->type;
+
+        $this->composer->setPackage($rootPackage);
+
+        $library = new BowerInstaller(ConfigBuilder::build($this->composer), $io, $this->composer, $type);
+        /* @var \PHPUnit_Framework_MockObject_MockObject $package */
+        $package = $this->createPackageMock($ignoreFiles);
+        $package
+            ->expects($this->any())
+            ->method('getPrettyName')
+            ->will($this->returnValue('foo-asset/package'));
+
+        /* @var PackageInterface $package */
+        $packageDir = $this->vendorDir.'/'.$package->getPrettyName();
+        mkdir($packageDir, 0777, true);
+
+        /* @var \PHPUnit_Framework_MockObject_MockObject $dm */
+        $dm = $this->dm;
+        $dm
+            ->expects($this->once())
+            ->method('download')
+            ->with($package, $this->vendorDir.DIRECTORY_SEPARATOR.'foo-asset/package');
+
+        /* @var \PHPUnit_Framework_MockObject_MockObject $repository */
+        $repository = $this->repository;
+        $repository
+            ->expects($this->once())
+            ->method('addPackage')
+            ->with($package);
+
+        /* @var InstalledRepositoryInterface $repository */
+        $library->install($repository, $package);
+        $this->assertFileExists($this->vendorDir, 'Vendor dir should be created');
+        $this->assertFileExists($this->binDir, 'Bin dir should be created');
+
+        $this->ensureDirectoryExistsAndClear($packageDir);
+    }
+
+    /**
+     * @dataProvider getAssetIgnoreFiles
+     *
+     * @param array $ignoreFiles
+     */
+    public function testUpdate(array $ignoreFiles)
+    {
+        /* @var RootPackageInterface $rootPackage */
+        $rootPackage = $this->createRootPackageMock();
+        /* @var IOInterface $io */
+        $io = $this->io;
+        /* @var AssetTypeInterface $type */
+        $type = $this->type;
+
+        $this->composer->setPackage($rootPackage);
+
+        $library = new BowerInstaller(ConfigBuilder::build($this->composer), $io, $this->composer, $type);
+        /* @var \PHPUnit_Framework_MockObject_MockObject $package */
+        $package = $this->createPackageMock($ignoreFiles);
+        $package
+            ->expects($this->any())
+            ->method('getPrettyName')
+            ->will($this->returnValue('foo-asset/package'));
+
+        /* @var PackageInterface $package */
+        $packageDir = $this->vendorDir.'/'.$package->getPrettyName();
+        mkdir($packageDir, 0777, true);
+
+        /* @var \PHPUnit_Framework_MockObject_MockObject $repository */
+        $repository = $this->repository;
+
+        $repository
+            ->expects($this->exactly(2))
+            ->method('hasPackage')
+            ->with($package)
+            ->will($this->returnValue(true));
+
+        /* @var InstalledRepositoryInterface $repository */
+        $library->update($repository, $package, $package);
+        $this->assertFileExists($this->vendorDir, 'Vendor dir should be created');
+        $this->assertFileExists($this->binDir, 'Bin dir should be created');
+
+        $this->ensureDirectoryExistsAndClear($packageDir);
+    }
+
+    /**
+     * @expectedException \InvalidArgumentException
+     */
+    public function testUninstall()
+    {
+        /* @var RootPackageInterface $rootPackage */
+        $rootPackage = $this->createRootPackageMock();
+        /* @var IOInterface $io */
+        $io = $this->io;
+        /* @var AssetTypeInterface $type */
+        $type = $this->type;
+
+        $this->composer->setPackage($rootPackage);
+
+        $library = new BowerInstaller(ConfigBuilder::build($this->composer), $io, $this->composer, $type);
+        $package = $this->createPackageMock();
+
+        /* @var \PHPUnit_Framework_MockObject_MockObject $package */
+        $package
+            ->expects($this->any())
+            ->method('getPrettyName')
+            ->will($this->returnValue('foo-asset/pkg'));
+
+        /* @var \PHPUnit_Framework_MockObject_MockObject $repository */
+        $repository = $this->repository;
+        $repository
+            ->expects($this->exactly(2))
+            ->method('hasPackage')
+            ->with($package)
+            ->will($this->onConsecutiveCalls(true, false));
+
+        $repository
+            ->expects($this->once())
+            ->method('removePackage')
+            ->with($package);
+
+        /* @var \PHPUnit_Framework_MockObject_MockObject $dm */
+        $dm = $this->dm;
+        $dm
+            ->expects($this->once())
+            ->method('remove')
+            ->with($package, $this->vendorDir.DIRECTORY_SEPARATOR.'foo-asset/pkg');
+
+        /* @var InstalledRepositoryInterface $repository */
+        /* @var PackageInterface $package */
+        $library->uninstall($repository, $package);
+
+        $library->uninstall($repository, $package);
+    }
+
+    public function testGetInstallPath()
+    {
+        /* @var RootPackageInterface $rootPackage */
+        $rootPackage = $this->createRootPackageMock();
+        /* @var IOInterface $io */
+        $io = $this->io;
+        /* @var AssetTypeInterface $type */
+        $type = $this->type;
+
+        $this->composer->setPackage($rootPackage);
+
+        $library = new BowerInstaller(ConfigBuilder::build($this->composer), $io, $this->composer, $type);
+        $package = $this->createPackageMock();
+
+        /* @var \PHPUnit_Framework_MockObject_MockObject $package */
+        $package
+            ->expects($this->once())
+            ->method('getTargetDir')
+            ->will($this->returnValue(null));
+        $package
+            ->expects($this->any())
+            ->method('getName')
+            ->will($this->returnValue('foo-asset/bar'));
+        $package
+            ->expects($this->any())
+            ->method('getPrettyName')
+            ->will($this->returnValue('foo-asset/bar'));
+
+        /* @var PackageInterface $package */
+        $exceptDir = $this->vendorDir.'/'.$package->getName();
+        $exceptDir = str_replace('\\', '/', $exceptDir);
+        $packageDir = $library->getInstallPath($package);
+        $packageDir = str_replace('\\', '/', $packageDir);
+
+        $this->assertEquals($exceptDir, $packageDir);
+    }
+
+    public function testGetInstallPathWithTargetDir()
+    {
+        /* @var RootPackageInterface $rootPackage */
+        $rootPackage = $this->createRootPackageMock();
+        /* @var IOInterface $io */
+        $io = $this->io;
+        /* @var AssetTypeInterface $type */
+        $type = $this->type;
+
+        $this->composer->setPackage($rootPackage);
+
+        $library = new BowerInstaller(ConfigBuilder::build($this->composer), $io, $this->composer, $type);
+        $package = $this->createPackageMock();
+
+        /* @var \PHPUnit_Framework_MockObject_MockObject $package */
+        $package
+            ->expects($this->once())
+            ->method('getTargetDir')
+            ->will($this->returnValue('Some/Namespace'));
+        $package
+            ->expects($this->any())
+            ->method('getPrettyName')
+            ->will($this->returnValue('foo-asset/bar'));
+
+        /* @var PackageInterface $package */
+        $exceptDir = $this->vendorDir.'/'.$package->getPrettyName().'/Some/Namespace';
+        $exceptDir = str_replace('\\', '/', $exceptDir);
+        $packageDir = $library->getInstallPath($package);
+        $packageDir = str_replace('\\', '/', $packageDir);
+
+        $this->assertEquals($exceptDir, $packageDir);
+    }
+
+    /**
+     * @dataProvider getAssetMainFiles
+     *
+     * @param array $mainFiles
+     */
+    public function testMainFiles(array $mainFiles)
+    {
+        /* @var RootPackageInterface $rootPackage */
+        $rootPackage = $this->createRootPackageMock($mainFiles);
+        $this->composer->setPackage($rootPackage);
+        $config = ConfigBuilder::build($this->composer);
+
+        $package = new Package('foo-asset/bar', '1.0.0', '1.0.0');
+        $package = AssetPlugin::addMainFiles($config, $package);
+        $extra = $package->getExtra();
+
+        if (isset($mainFiles['fxp-asset']['main-files'])) {
+            $this->assertEquals($extra['bower-asset-main'], $mainFiles['fxp-asset']['main-files']['foo-asset/bar']);
+        } else {
+            $this->assertEquals($extra, array());
+        }
+    }
+
+    /**
+     * @param array $ignoreFiles
+     *
+     * @return PackageInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected function createPackageMock(array $ignoreFiles = array())
+    {
+        $package = $this->getMockBuilder('Composer\Package\Package')
+            ->setConstructorArgs(array(md5(mt_rand()), '1.0.0.0', '1.0.0'))
+            ->getMock();
+
+        $package
+            ->expects($this->any())
+            ->method('getExtra')
+            ->will($this->returnValue(array(
+                'bower-asset-ignore' => $ignoreFiles,
+            )));
+
+        return $package;
+    }
+
+    /**
+     * @param array $mainFiles
+     *
+     * @return RootPackageInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected function createRootPackageMock(array $mainFiles = array())
+    {
+        $package = $this->getMockBuilder('Composer\Package\RootPackageInterface')
+            ->setConstructorArgs(array(md5(mt_rand()), '1.0.0.0', '1.0.0'))
+            ->getMock();
+
+        $package
+            ->expects($this->any())
+            ->method('getConfig')
+            ->will($this->returnValue($mainFiles));
+
+        return $package;
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Installer/IgnoreFactoryTest.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Installer/IgnoreFactoryTest.php
new file mode 100644 (file)
index 0000000..0f7d282
--- /dev/null
@@ -0,0 +1,221 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Tests\Installer;
+
+use Composer\Composer;
+use Composer\Config;
+use Composer\Package\PackageInterface;
+use Composer\Package\RootPackageInterface;
+use Fxp\Composer\AssetPlugin\Config\ConfigBuilder;
+use Fxp\Composer\AssetPlugin\Installer\IgnoreFactory;
+use Fxp\Composer\AssetPlugin\Installer\IgnoreManager;
+
+/**
+ * Tests of ignore factory.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class IgnoreFactoryTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var Composer|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $composer;
+
+    /**
+     * @var Config|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $config;
+
+    /**
+     * @var RootPackageInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $rootPackage;
+
+    /**
+     * @var PackageInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $package;
+
+    public function setUp()
+    {
+        $this->config = $this->getMockBuilder('Composer\Config')->getMock();
+        $this->config->expects($this->any())
+            ->method('get')
+            ->will($this->returnCallback(function ($key) {
+                $value = null;
+
+                switch ($key) {
+                    case 'cache-repo-dir':
+                        $value = sys_get_temp_dir().'/composer-test-repo-cache';
+                        break;
+                    case 'vendor-dir':
+                        $value = sys_get_temp_dir().'/composer-test/vendor';
+                        break;
+                }
+
+                return $value;
+            }));
+
+        $this->rootPackage = $this->getMockBuilder('Composer\Package\RootPackageInterface')->getMock();
+        $this->package = $this->getMockBuilder('Composer\Package\PackageInterface')->getMock();
+        $this->package->expects($this->any())
+            ->method('getName')
+            ->will($this->returnValue('foo-asset/foo'));
+
+        $this->composer = $this->getMockBuilder('Composer\Composer')->getMock();
+        $this->composer->expects($this->any())
+            ->method('getPackage')
+            ->will($this->returnValue($this->rootPackage));
+        $this->composer->expects($this->any())
+            ->method('getConfig')
+            ->will($this->returnValue($this->config));
+    }
+
+    public function tearDown()
+    {
+        $this->composer = null;
+        $this->config = null;
+        $this->rootPackage = null;
+        $this->package = null;
+    }
+
+    public function testCreateWithoutIgnoreFiles()
+    {
+        $config = ConfigBuilder::build($this->composer);
+        $manager = IgnoreFactory::create($config, $this->composer, $this->package);
+
+        $this->assertTrue($manager->isEnabled());
+        $this->assertFalse($manager->hasPattern());
+        $this->validateInstallDir($manager, $this->config->get('vendor-dir').'/'.$this->package->getName());
+    }
+
+    public function testCreateWithIgnoreFiles()
+    {
+        $config = array(
+            'fxp-asset' => array(
+                'ignore-files' => array(
+                    'foo-asset/foo' => array(
+                        'PATTERN',
+                    ),
+                    'foo-asset/bar' => array(),
+                ),
+            ),
+        );
+
+        $this->rootPackage->expects($this->any())
+            ->method('getConfig')
+            ->will($this->returnValue($config));
+
+        $config = ConfigBuilder::build($this->composer);
+        $manager = IgnoreFactory::create($config, $this->composer, $this->package);
+
+        $this->assertTrue($manager->isEnabled());
+        $this->assertTrue($manager->hasPattern());
+        $this->validateInstallDir($manager, $this->config->get('vendor-dir').'/'.$this->package->getName());
+    }
+
+    public function testCreateWithCustomInstallDir()
+    {
+        $installDir = 'web/assets/';
+        $config = ConfigBuilder::build($this->composer);
+        $manager = IgnoreFactory::create($config, $this->composer, $this->package, $installDir);
+
+        $this->assertTrue($manager->isEnabled());
+        $this->assertFalse($manager->hasPattern());
+        $this->validateInstallDir($manager, rtrim($installDir, '/'));
+    }
+
+    public function testCreateWithEnablingOfIgnoreFiles()
+    {
+        $config = array(
+            'fxp-asset' => array(
+                'ignore-files' => array(
+                    'foo-asset/foo' => true,
+                    'foo-asset/bar' => array(),
+                ),
+            ),
+        );
+
+        $this->rootPackage->expects($this->any())
+            ->method('getConfig')
+            ->will($this->returnValue($config));
+
+        $config = ConfigBuilder::build($this->composer);
+        $manager = IgnoreFactory::create($config, $this->composer, $this->package);
+
+        $this->assertTrue($manager->isEnabled());
+        $this->assertFalse($manager->hasPattern());
+        $this->validateInstallDir($manager, $this->config->get('vendor-dir').'/'.$this->package->getName());
+    }
+
+    public function testCreateWithDisablingOfIgnoreFiles()
+    {
+        $config = array(
+            'fxp-asset' => array(
+                'ignore-files' => array(
+                    'foo-asset/foo' => false,
+                    'foo-asset/bar' => array(),
+                ),
+            ),
+        );
+
+        $this->rootPackage->expects($this->any())
+            ->method('getConfig')
+            ->will($this->returnValue($config));
+
+        $config = ConfigBuilder::build($this->composer);
+        $manager = IgnoreFactory::create($config, $this->composer, $this->package);
+
+        $this->assertFalse($manager->isEnabled());
+        $this->assertFalse($manager->hasPattern());
+        $this->validateInstallDir($manager, $this->config->get('vendor-dir').'/'.$this->package->getName());
+    }
+
+    public function testCreateWithCustomIgnoreSection()
+    {
+        $config = array(
+            'fxp-asset' => array(
+                'custom-ignore-files' => array(
+                    'foo-asset/foo' => array(
+                        'PATTERN',
+                    ),
+                    'foo-asset/bar' => array(),
+                ),
+            ),
+        );
+
+        $this->rootPackage->expects($this->any())
+            ->method('getConfig')
+            ->will($this->returnValue($config));
+
+        $config = ConfigBuilder::build($this->composer);
+        $manager = IgnoreFactory::create($config, $this->composer, $this->package, null, 'custom-ignore-files');
+
+        $this->assertTrue($manager->isEnabled());
+        $this->assertTrue($manager->hasPattern());
+        $this->validateInstallDir($manager, $this->config->get('vendor-dir').'/'.$this->package->getName());
+    }
+
+    /**
+     * @param IgnoreManager $manager
+     * @param string        $installDir
+     */
+    protected function validateInstallDir(IgnoreManager $manager, $installDir)
+    {
+        $ref = new \ReflectionClass($manager);
+        $prop = $ref->getProperty('installDir');
+        $prop->setAccessible(true);
+
+        $this->assertSame($installDir, $prop->getValue($manager));
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Installer/IgnoreManagerTest.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Installer/IgnoreManagerTest.php
new file mode 100644 (file)
index 0000000..8292606
--- /dev/null
@@ -0,0 +1,250 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Tests\Installer;
+
+use Composer\Util\Filesystem;
+use Fxp\Composer\AssetPlugin\Installer\IgnoreManager;
+
+/**
+ * Tests of manager of ignore patterns.
+ *
+ * @author Martin Hasoň <martin.hason@gmail.com>
+ */
+class IgnoreManagerTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var string
+     */
+    private $target;
+
+    protected function setUp()
+    {
+        $fs = new Filesystem();
+        $this->target = sys_get_temp_dir().'/composer-foo';
+
+        foreach ($this->getFixtureFiles() as $filename) {
+            $path = $this->target.'/'.$filename;
+            $fs->ensureDirectoryExists(dirname($path));
+            @file_put_contents($path, '');
+        }
+    }
+
+    protected function tearDown()
+    {
+        $fs = new Filesystem();
+        $fs->remove($this->target);
+    }
+
+    /**
+     * @return array
+     */
+    protected function getFixtureFiles()
+    {
+        return array(
+            '.hidden',
+            'CHANGELOG',
+            'README',
+            'lib/autoload.php',
+            'src/.hidden',
+            'src/doc',
+            'src/foo/.hidden',
+            'src/foo/empty.html',
+            'src/foo/empty.md',
+            'src/foo/empty.txt',
+            'src/foo/small.txt',
+            'src/lib/empty.txt',
+            'src/lib/foo/empty.txt',
+            'src/lib/foo/small.txt',
+            'src/tests/empty.html',
+            'tests/bootstrap.php',
+        );
+    }
+
+    public function testDeleteIgnoredFiles()
+    {
+        $ignorer = new IgnoreManager($this->target);
+        $ignorer->addPattern('.*');
+        $ignorer->addPattern('**/.*');
+        $ignorer->addPattern('README');
+        $ignorer->addPattern('**/*.md');
+        $ignorer->addPattern('lib');
+        $ignorer->addPattern('tests');
+        $ignorer->addPattern('**/doc');
+        $ignorer->addPattern('src/foo/*.txt');
+        $ignorer->addPattern('!src/foo/small.txt');
+
+        $ignorer->cleanup();
+
+        $this->assertFileNotExists($this->target.'/.hidden');
+        $this->assertFileExists($this->target.'/CHANGELOG');
+        $this->assertFileNotExists($this->target.'/README');
+
+        $this->assertFileNotExists($this->target.'/lib/autoload.php');
+        $this->assertFileNotExists($this->target.'/lib');
+
+        $this->assertFileNotExists($this->target.'/src/.hidden');
+        $this->assertFileNotExists($this->target.'/src/doc');
+        $this->assertFileExists($this->target.'/src');
+
+        $this->assertFileNotExists($this->target.'/src/foo/.hidden');
+        $this->assertFileExists($this->target.'/src/foo/empty.html');
+        $this->assertFileNotExists($this->target.'/src/foo/empty.md');
+        $this->assertFileNotExists($this->target.'/src/foo/empty.txt');
+        $this->assertFileExists($this->target.'/src/foo/small.txt');
+        $this->assertFileExists($this->target.'/src/foo');
+
+        $this->assertFileExists($this->target.'/src/lib/empty.txt');
+        $this->assertFileExists($this->target.'/src/lib');
+
+        $this->assertFileExists($this->target.'/src/lib/foo/empty.txt');
+        $this->assertFileExists($this->target.'/src/lib/foo/small.txt');
+        $this->assertFileExists($this->target.'/src/lib/foo');
+
+        $this->assertFileExists($this->target.'/src/tests/empty.html');
+        $this->assertFileExists($this->target.'/src/tests');
+
+        $this->assertFileNotExists($this->target.'/tests/bootstrap.php');
+        $this->assertFileNotExists($this->target.'/tests');
+    }
+
+    public function testDeleteIgnoredFilesWithDisabledManager()
+    {
+        $ignorer = new IgnoreManager($this->target);
+        $ignorer->setEnabled(false);
+        $ignorer->addPattern('.*');
+        $ignorer->addPattern('**/.*');
+        $ignorer->addPattern('README');
+        $ignorer->addPattern('**/*.md');
+        $ignorer->addPattern('lib');
+        $ignorer->addPattern('tests');
+        $ignorer->addPattern('**/doc');
+        $ignorer->addPattern('src/foo/*.txt');
+        $ignorer->addPattern('!src/foo/small.txt');
+
+        $ignorer->cleanup();
+
+        $this->assertFileExists($this->target.'/.hidden');
+        $this->assertFileExists($this->target.'/CHANGELOG');
+        $this->assertFileExists($this->target.'/README');
+
+        $this->assertFileExists($this->target.'/lib/autoload.php');
+        $this->assertFileExists($this->target.'/lib');
+
+        $this->assertFileExists($this->target.'/src/.hidden');
+        $this->assertFileExists($this->target.'/src/doc');
+        $this->assertFileExists($this->target.'/src');
+
+        $this->assertFileExists($this->target.'/src/foo/.hidden');
+        $this->assertFileExists($this->target.'/src/foo/empty.html');
+        $this->assertFileExists($this->target.'/src/foo/empty.md');
+        $this->assertFileExists($this->target.'/src/foo/empty.txt');
+        $this->assertFileExists($this->target.'/src/foo/small.txt');
+        $this->assertFileExists($this->target.'/src/foo');
+
+        $this->assertFileExists($this->target.'/src/lib/empty.txt');
+        $this->assertFileExists($this->target.'/src/lib');
+
+        $this->assertFileExists($this->target.'/src/lib/foo/empty.txt');
+        $this->assertFileExists($this->target.'/src/lib/foo/small.txt');
+        $this->assertFileExists($this->target.'/src/lib/foo');
+
+        $this->assertFileExists($this->target.'/src/tests/empty.html');
+        $this->assertFileExists($this->target.'/src/tests');
+
+        $this->assertFileExists($this->target.'/tests/bootstrap.php');
+        $this->assertFileExists($this->target.'/tests');
+    }
+
+    public function testIgnoreAllFilesExceptAFew()
+    {
+        $ignorer = new IgnoreManager($this->target);
+        $ignorer->addPattern('*');
+        $ignorer->addPattern('**/.*');
+        $ignorer->addPattern('!README');
+        $ignorer->addPattern('!lib/*');
+        $ignorer->addPattern('!tests');
+
+        $ignorer->cleanup();
+
+        $this->assertFileNotExists($this->target.'/.hidden');
+        $this->assertFileNotExists($this->target.'/CHANGELOG');
+        $this->assertFileExists($this->target.'/README');
+
+        $this->assertFileExists($this->target.'/lib/autoload.php');
+        $this->assertFileExists($this->target.'/lib');
+
+        $this->assertFileNotExists($this->target.'/src/.hidden');
+        $this->assertFileNotExists($this->target.'/src/doc');
+        $this->assertFileNotExists($this->target.'/src');
+
+        $this->assertFileNotExists($this->target.'/src/foo/.hidden');
+        $this->assertFileNotExists($this->target.'/src/foo/empty.html');
+        $this->assertFileNotExists($this->target.'/src/foo/empty.md');
+        $this->assertFileNotExists($this->target.'/src/foo/empty.txt');
+        $this->assertFileNotExists($this->target.'/src/foo/small.txt');
+        $this->assertFileNotExists($this->target.'/src/foo');
+
+        $this->assertFileNotExists($this->target.'/src/lib/empty.txt');
+        $this->assertFileNotExists($this->target.'/src/lib');
+
+        $this->assertFileNotExists($this->target.'/src/lib/foo/empty.txt');
+        $this->assertFileNotExists($this->target.'/src/lib/foo/small.txt');
+        $this->assertFileNotExists($this->target.'/src/lib/foo');
+
+        $this->assertFileNotExists($this->target.'/src/tests/empty.html');
+        $this->assertFileNotExists($this->target.'/src/tests');
+
+        $this->assertFileExists($this->target.'/tests/bootstrap.php');
+        $this->assertFileExists($this->target.'/tests');
+    }
+
+    public function testIgnoreAllFilesExceptAFewWithDoubleAsterisks()
+    {
+        $ignorer = new IgnoreManager($this->target);
+
+        $ignorer->addPattern('**');
+        $ignorer->addPattern('!/src/foo/*.txt');
+
+        $ignorer->cleanup();
+
+        $this->assertFileExists($this->target.'/.hidden');
+        $this->assertFileNotExists($this->target.'/CHANGELOG');
+        $this->assertFileNotExists($this->target.'/README');
+
+        $this->assertFileNotExists($this->target.'/lib/autoload.php');
+        $this->assertFileNotExists($this->target.'/lib');
+
+        $this->assertFileNotExists($this->target.'/src/.hidden');
+        $this->assertFileNotExists($this->target.'/src/doc');
+        $this->assertFileExists($this->target.'/src');
+
+        $this->assertFileNotExists($this->target.'/src/foo/.hidden');
+        $this->assertFileNotExists($this->target.'/src/foo/empty.html');
+        $this->assertFileNotExists($this->target.'/src/foo/empty.md');
+        $this->assertFileExists($this->target.'/src/foo/empty.txt');
+        $this->assertFileExists($this->target.'/src/foo/small.txt');
+        $this->assertFileExists($this->target.'/src/foo');
+
+        $this->assertFileNotExists($this->target.'/src/lib/empty.txt');
+        $this->assertFileNotExists($this->target.'/src/lib');
+
+        $this->assertFileNotExists($this->target.'/src/lib/foo/empty.txt');
+        $this->assertFileNotExists($this->target.'/src/lib/foo/small.txt');
+        $this->assertFileNotExists($this->target.'/src/lib/foo');
+
+        $this->assertFileNotExists($this->target.'/src/tests/empty.html');
+        $this->assertFileNotExists($this->target.'/src/tests');
+
+        $this->assertFileNotExists($this->target.'/tests/bootstrap.php');
+        $this->assertFileNotExists($this->target.'/tests');
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Package/LazyCompletePackageTest.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Package/LazyCompletePackageTest.php
new file mode 100644 (file)
index 0000000..fae72e6
--- /dev/null
@@ -0,0 +1,111 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Tests\Package;
+
+use Composer\Package\CompletePackage;
+use Fxp\Composer\AssetPlugin\Package\LazyCompletePackage;
+use Fxp\Composer\AssetPlugin\Package\LazyPackageInterface;
+use Fxp\Composer\AssetPlugin\Package\Loader\LazyLoaderInterface;
+
+/**
+ * Tests of lazy asset package loader.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class LazyCompletePackageTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var LazyPackageInterface
+     */
+    protected $package;
+
+    protected function setUp()
+    {
+        $this->package = new LazyCompletePackage('foo', '1.0.0.0', '1.0');
+    }
+
+    protected function tearDown()
+    {
+        $this->package = null;
+    }
+
+    public function getConfigLazyLoader()
+    {
+        return array(
+            array(null),
+            array('lazy'),
+            array('lazy-exception'),
+        );
+    }
+
+    /**
+     * @param string $lazyType
+     *
+     * @dataProvider getConfigLazyLoader
+     */
+    public function testMissingAssetType($lazyType)
+    {
+        if (null !== $lazyType) {
+            $lp = 'lazy' === $lazyType
+                ? new CompletePackage($this->package->getName(),
+                    $this->package->getVersion(), $this->package->getPrettyVersion())
+                : false;
+
+            $loader = $this->getMockBuilder('Fxp\Composer\AssetPlugin\Package\Loader\LazyLoaderInterface')->getMock();
+            $loader
+                ->expects($this->any())
+                ->method('load')
+                ->will($this->returnValue($lp));
+
+            /* @var LazyLoaderInterface$loader */
+            $this->package->setLoader($loader);
+        }
+
+        $this->assertSame('library', $this->package->getType());
+        $this->assertSame(array(), $this->package->getTransportOptions());
+        $this->assertNull($this->package->getTargetDir());
+        $this->assertSame(array(), $this->package->getExtra());
+        $this->assertSame(array(), $this->package->getBinaries());
+        $this->assertNull($this->package->getInstallationSource());
+        $this->assertNull($this->package->getSourceType());
+        $this->assertNull($this->package->getSourceUrl());
+        $this->assertNull($this->package->getSourceReference());
+        $this->assertNull($this->package->getSourceMirrors());
+        $this->assertSame(array(), $this->package->getSourceUrls());
+        $this->assertNull($this->package->getDistType());
+        $this->assertNull($this->package->getDistUrl());
+        $this->assertNull($this->package->getDistReference());
+        $this->assertNull($this->package->getDistSha1Checksum());
+        $this->assertNull($this->package->getDistMirrors());
+        $this->assertSame(array(), $this->package->getDistUrls());
+        $this->assertNull($this->package->getReleaseDate());
+        $this->assertSame(array(), $this->package->getRequires());
+        $this->assertSame(array(), $this->package->getConflicts());
+        $this->assertSame(array(), $this->package->getProvides());
+        $this->assertSame(array(), $this->package->getReplaces());
+        $this->assertSame(array(), $this->package->getDevRequires());
+        $this->assertSame(array(), $this->package->getSuggests());
+        $this->assertSame(array(), $this->package->getAutoload());
+        $this->assertSame(array(), $this->package->getDevAutoload());
+        $this->assertSame(array(), $this->package->getIncludePaths());
+        $this->assertNull($this->package->getNotificationUrl());
+        $this->assertSame(array(), $this->package->getArchiveExcludes());
+        $this->assertSame(array(), $this->package->getScripts());
+        $this->assertNull($this->package->getRepositories());
+        $this->assertSame(array(), $this->package->getLicense());
+        $this->assertNull($this->package->getKeywords());
+        $this->assertNull($this->package->getAuthors());
+        $this->assertNull($this->package->getDescription());
+        $this->assertNull($this->package->getHomepage());
+        $this->assertSame(array(), $this->package->getSupport());
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Package/Loader/LazyAssetPackageLoaderTest.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Package/Loader/LazyAssetPackageLoaderTest.php
new file mode 100644 (file)
index 0000000..5415a85
--- /dev/null
@@ -0,0 +1,438 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Tests\Package\Loader;
+
+use Composer\Downloader\TransportException;
+use Composer\Package\CompletePackageInterface;
+use Composer\Package\Loader\LoaderInterface;
+use Composer\Repository\Vcs\VcsDriverInterface;
+use Fxp\Composer\AssetPlugin\Converter\PackageConverterInterface;
+use Fxp\Composer\AssetPlugin\Converter\VersionConverterInterface;
+use Fxp\Composer\AssetPlugin\Package\LazyPackageInterface;
+use Fxp\Composer\AssetPlugin\Package\Loader\LazyAssetPackageLoader;
+use Fxp\Composer\AssetPlugin\Repository\AssetRepositoryManager;
+use Fxp\Composer\AssetPlugin\Tests\Fixtures\IO\MockIO;
+use Fxp\Composer\AssetPlugin\Type\AssetTypeInterface;
+
+/**
+ * Tests of lazy asset package loader.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class LazyAssetPackageLoaderTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var LazyAssetPackageLoader
+     */
+    protected $lazyLoader;
+
+    /**
+     * @var LazyPackageInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $lazyPackage;
+
+    /**
+     * @var AssetTypeInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $assetType;
+
+    /**
+     * @var LoaderInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $loader;
+
+    /**
+     * @var VcsDriverInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $driver;
+
+    /**
+     * @var MockIO
+     */
+    protected $io;
+
+    /**
+     * @var AssetRepositoryManager|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $assetRepositoryManager;
+
+    protected function setUp()
+    {
+        $this->lazyPackage = $this->getMockBuilder(LazyPackageInterface::class)->getMock();
+        $this->assetType = $this->getMockBuilder(AssetTypeInterface::class)->getMock();
+        $this->loader = $this->getMockBuilder(LoaderInterface::class)->getMock();
+        $this->driver = $this->getMockBuilder(VcsDriverInterface::class)->getMock();
+        $this->assetRepositoryManager = $this->getMockBuilder(AssetRepositoryManager::class)
+            ->disableOriginalConstructor()->getMock();
+
+        $this->assetRepositoryManager->expects($this->any())
+            ->method('solveResolutions')
+            ->willReturnCallback(function ($value) {
+                return $value;
+            });
+
+        $this->lazyPackage
+            ->expects($this->any())
+            ->method('getName')
+            ->will($this->returnValue('PACKAGE_NAME'));
+        $this->lazyPackage
+            ->expects($this->any())
+            ->method('getUniqueName')
+            ->will($this->returnValue('PACKAGE_NAME-1.0.0.0'));
+        $this->lazyPackage
+            ->expects($this->any())
+            ->method('getPrettyVersion')
+            ->will($this->returnValue('1.0'));
+        $this->lazyPackage
+            ->expects($this->any())
+            ->method('getVersion')
+            ->will($this->returnValue('1.0.0.0'));
+
+        $versionConverter = $this->getMockBuilder(VersionConverterInterface::class)->getMock();
+        $versionConverter->expects($this->any())
+            ->method('convertVersion')
+            ->will($this->returnValue('VERSION_CONVERTED'));
+        $versionConverter->expects($this->any())
+            ->method('convertRange')
+            ->will($this->returnCallback(function ($value) {
+                return $value;
+            }));
+        $packageConverter = $this->getMockBuilder(PackageConverterInterface::class)->getMock();
+        /* @var LazyPackageInterface $lasyPackage */
+        $lasyPackage = $this->lazyPackage;
+        $packageConverter->expects($this->any())
+            ->method('convert')
+            ->will($this->returnCallback(function ($value) use ($lasyPackage) {
+                $value['version'] = $lasyPackage->getPrettyVersion();
+                $value['version_normalized'] = $lasyPackage->getVersion();
+
+                return $value;
+            }));
+        $this->assetType->expects($this->any())
+            ->method('getComposerVendorName')
+            ->will($this->returnValue('ASSET'));
+        $this->assetType->expects($this->any())
+            ->method('getComposerType')
+            ->will($this->returnValue('ASSET_TYPE'));
+        $this->assetType->expects($this->any())
+            ->method('getFilename')
+            ->will($this->returnValue('ASSET.json'));
+        $this->assetType->expects($this->any())
+            ->method('getVersionConverter')
+            ->will($this->returnValue($versionConverter));
+        $this->assetType->expects($this->any())
+            ->method('getPackageConverter')
+            ->will($this->returnValue($packageConverter));
+
+        $this->driver
+            ->expects($this->any())
+            ->method('getDist')
+            ->will($this->returnCallback(function ($value) {
+                return array(
+                    'type' => 'vcs',
+                    'url' => 'http://foobar.tld/dist/'.$value,
+                );
+            }));
+        $this->driver
+            ->expects($this->any())
+            ->method('getSource')
+            ->will($this->returnCallback(function ($value) {
+                return array(
+                    'type' => 'vcs',
+                    'url' => 'http://foobar.tld/source/'.$value,
+                );
+            }));
+    }
+
+    protected function tearDown()
+    {
+        $this->lazyPackage = null;
+        $this->assetType = null;
+        $this->loader = null;
+        $this->driver = null;
+        $this->io = null;
+        $this->assetRepositoryManager = null;
+        $this->lazyLoader = null;
+    }
+
+    /**
+     * @expectedException \Fxp\Composer\AssetPlugin\Exception\InvalidArgumentException
+     * @expectedExceptionMessage The "assetType" property must be defined
+     */
+    public function testMissingAssetType()
+    {
+        $loader = $this->createLazyLoader('TYPE');
+        $loader->load($this->lazyPackage);
+    }
+
+    /**
+     * @expectedException \Fxp\Composer\AssetPlugin\Exception\InvalidArgumentException
+     * @expectedExceptionMessage The "loader" property must be defined
+     */
+    public function testMissingLoader()
+    {
+        /* @var AssetTypeInterface $assetType */
+        $assetType = $this->assetType;
+        $loader = $this->createLazyLoader('TYPE');
+        $loader->setAssetType($assetType);
+        $loader->load($this->lazyPackage);
+    }
+
+    /**
+     * @expectedException \Fxp\Composer\AssetPlugin\Exception\InvalidArgumentException
+     * @expectedExceptionMessage The "driver" property must be defined
+     */
+    public function testMissingDriver()
+    {
+        /* @var AssetTypeInterface $assetType */
+        $assetType = $this->assetType;
+        /* @var LoaderInterface $cLoader */
+        $cLoader = $this->loader;
+        /* @var LazyPackageInterface $lazyPackage */
+        $lazyPackage = $this->lazyPackage;
+        $loader = $this->createLazyLoader('TYPE');
+        $loader->setAssetType($assetType);
+        $loader->setLoader($cLoader);
+        $loader->load($lazyPackage);
+    }
+
+    /**
+     * @expectedException \Fxp\Composer\AssetPlugin\Exception\InvalidArgumentException
+     * @expectedExceptionMessage The "io" property must be defined
+     */
+    public function testMissingIo()
+    {
+        /* @var AssetTypeInterface $assetType */
+        $assetType = $this->assetType;
+        /* @var LoaderInterface $cLoader */
+        $cLoader = $this->loader;
+        /* @var VcsDriverInterface $driver */
+        $driver = $this->driver;
+        $loader = $this->createLazyLoader('TYPE');
+        $loader->setAssetType($assetType);
+        $loader->setLoader($cLoader);
+        $loader->setDriver($driver);
+        $loader->load($this->lazyPackage);
+    }
+
+    public function getConfigIo()
+    {
+        return array(
+            array(false),
+            array(true),
+        );
+    }
+
+    /**
+     * @param $verbose
+     *
+     * @dataProvider getConfigIo
+     */
+    public function testWithoutJsonFile($verbose)
+    {
+        /* @var \PHPUnit_Framework_MockObject_MockObject $driver */
+        $driver = $this->driver;
+        $driver
+            ->expects($this->any())
+            ->method('getComposerInformation')
+            ->will($this->returnValue(false));
+
+        /* @var \PHPUnit_Framework_MockObject_MockObject $loader */
+        $loader = $this->loader;
+        $loader
+            ->expects($this->any())
+            ->method('load')
+            ->will($this->returnValue(false));
+
+        $this->lazyLoader = $this->createLazyLoaderConfigured('TYPE', $verbose);
+        $package = $this->lazyLoader->load($this->lazyPackage);
+
+        $this->assertFalse($package);
+
+        $filename = $this->assetType->getFilename();
+        $validOutput = array('');
+
+        if ($verbose) {
+            $validOutput = array(
+                'Reading '.$filename.' of <info>'.$this->lazyPackage->getName().'</info> (<comment>'.$this->lazyPackage->getPrettyVersion().'</comment>)',
+                'Importing empty TYPE '.$this->lazyPackage->getPrettyVersion().' ('.$this->lazyPackage->getVersion().')',
+                '',
+            );
+        }
+        $this->assertSame($validOutput, $this->io->getTraces());
+
+        $packageCache = $this->lazyLoader->load($this->lazyPackage);
+        $this->assertFalse($packageCache);
+        $this->assertSame($validOutput, $this->io->getTraces());
+    }
+
+    /**
+     * @param $verbose
+     *
+     * @dataProvider getConfigIo
+     */
+    public function testWithJsonFile($verbose)
+    {
+        $arrayPackage = array(
+            'name' => 'PACKAGE_NAME',
+            'version' => '1.0',
+        );
+
+        $realPackage = $this->getMockBuilder(CompletePackageInterface::class)->getMock();
+        $realPackage
+            ->expects($this->any())
+            ->method('getName')
+            ->will($this->returnValue('PACKAGE_NAME'));
+        $realPackage
+            ->expects($this->any())
+            ->method('getUniqueName')
+            ->will($this->returnValue('PACKAGE_NAME-1.0.0.0'));
+        $realPackage
+            ->expects($this->any())
+            ->method('getPrettyVersion')
+            ->will($this->returnValue('1.0'));
+        $realPackage
+            ->expects($this->any())
+            ->method('getVersion')
+            ->will($this->returnValue('1.0.0.0'));
+
+        /* @var \PHPUnit_Framework_MockObject_MockObject $driver */
+        $driver = $this->driver;
+        $driver
+            ->expects($this->any())
+            ->method('getComposerInformation')
+            ->will($this->returnValue($arrayPackage));
+
+        /* @var \PHPUnit_Framework_MockObject_MockObject $loader */
+        $loader = $this->loader;
+        $loader
+            ->expects($this->any())
+            ->method('load')
+            ->will($this->returnValue($realPackage));
+
+        $this->lazyLoader = $this->createLazyLoaderConfigured('TYPE', $verbose);
+        $package = $this->lazyLoader->load($this->lazyPackage);
+
+        $filename = $this->assetType->getFilename();
+        $validOutput = array('');
+
+        if ($verbose) {
+            $validOutput = array(
+                'Reading '.$filename.' of <info>'.$this->lazyPackage->getName().'</info> (<comment>'.$this->lazyPackage->getPrettyVersion().'</comment>)',
+                'Importing TYPE'.' '.$this->lazyPackage->getPrettyVersion().' ('.$this->lazyPackage->getVersion().')',
+                '',
+            );
+        }
+
+        $this->assertInstanceOf('Composer\Package\CompletePackageInterface', $package);
+        $this->assertSame($validOutput, $this->io->getTraces());
+
+        $packageCache = $this->lazyLoader->load($this->lazyPackage);
+        $this->assertInstanceOf('Composer\Package\CompletePackageInterface', $packageCache);
+        $this->assertSame($package, $packageCache);
+        $this->assertSame($validOutput, $this->io->getTraces());
+    }
+
+    public function getConfigIoForException()
+    {
+        return array(
+            array('tag', false, 'Exception', '<warning>Skipped tag 1.0, MESSAGE</warning>'),
+            array('tag', true, 'Exception', '<warning>Skipped tag 1.0, MESSAGE</warning>'),
+            array('branch', false, 'Exception', '<error>Skipped branch 1.0, MESSAGE</error>'),
+            array('branch', true, 'Exception', '<error>Skipped branch 1.0, MESSAGE</error>'),
+            array('tag', false, TransportException::class, '<warning>Skipped tag 1.0, no ASSET.json file was found</warning>'),
+            array('tag', true, TransportException::class, '<warning>Skipped tag 1.0, no ASSET.json file was found</warning>'),
+            array('branch', false, TransportException::class, '<error>Skipped branch 1.0, no ASSET.json file was found</error>'),
+            array('branch', true, TransportException::class, '<error>Skipped branch 1.0, no ASSET.json file was found</error>'),
+        );
+    }
+
+    /**
+     * @param string $type
+     * @param bool   $verbose
+     * @param string $exceptionClass
+     * @param string $validTrace
+     *
+     * @dataProvider getConfigIoForException
+     */
+    public function testTagWithTransportException($type, $verbose, $exceptionClass, $validTrace)
+    {
+        /* @var \PHPUnit_Framework_MockObject_MockObject $loader */
+        $loader = $this->loader;
+        $loader
+            ->expects($this->any())
+            ->method('load')
+            ->will($this->throwException(new $exceptionClass('MESSAGE')));
+
+        $this->lazyLoader = $this->createLazyLoaderConfigured($type, $verbose);
+        $package = $this->lazyLoader->load($this->lazyPackage);
+
+        $this->assertFalse($package);
+
+        $filename = $this->assetType->getFilename();
+        $validOutput = array('');
+
+        if ($verbose) {
+            $validOutput = array(
+                'Reading '.$filename.' of <info>'.$this->lazyPackage->getName().'</info> (<comment>'.$this->lazyPackage->getPrettyVersion().'</comment>)',
+                'Importing empty '.$type.' '.$this->lazyPackage->getPrettyVersion().' ('.$this->lazyPackage->getVersion().')',
+                $validTrace,
+                '',
+            );
+        }
+        $this->assertSame($validOutput, $this->io->getTraces());
+
+        $packageCache = $this->lazyLoader->load($this->lazyPackage);
+        $this->assertFalse($packageCache);
+        $this->assertSame($validOutput, $this->io->getTraces());
+    }
+
+    /**
+     * Creates the lazy asset package loader with full configuration.
+     *
+     * @param string $type
+     * @param bool   $verbose
+     *
+     * @return LazyAssetPackageLoader
+     */
+    protected function createLazyLoaderConfigured($type, $verbose = false)
+    {
+        $this->io = new MockIO($verbose);
+
+        $cLoader = $this->loader;
+        $loader = $this->createLazyLoader($type);
+        $loader->setAssetType($this->assetType);
+        $loader->setLoader($cLoader);
+        $loader->setDriver($this->driver);
+        $loader->setIO($this->io);
+        $loader->setAssetRepositoryManager($this->assetRepositoryManager);
+
+        return $loader;
+    }
+
+    /**
+     * Creates the lazy asset package loader.
+     *
+     * @param string $type
+     *
+     * @return LazyAssetPackageLoader
+     */
+    protected function createLazyLoader($type)
+    {
+        $data = array(
+            'foo' => 'bar',
+            'bar' => 'foo',
+        );
+
+        return new LazyAssetPackageLoader($type, 'IDENTIFIER', $data);
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Repository/AbstractAssetsRepositoryTest.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Repository/AbstractAssetsRepositoryTest.php
new file mode 100644 (file)
index 0000000..cedad9e
--- /dev/null
@@ -0,0 +1,324 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Tests\Repository;
+
+use Composer\Config;
+use Composer\DependencyResolver\Pool;
+use Composer\Downloader\TransportException;
+use Composer\EventDispatcher\EventDispatcher;
+use Composer\IO\IOInterface;
+use Composer\Repository\RepositoryManager;
+use Fxp\Composer\AssetPlugin\Config\Config as AssetConfig;
+use Fxp\Composer\AssetPlugin\Repository\AbstractAssetsRepository;
+use Fxp\Composer\AssetPlugin\Repository\AssetRepositoryManager;
+use Fxp\Composer\AssetPlugin\Repository\AssetVcsRepository;
+use Fxp\Composer\AssetPlugin\Repository\VcsPackageFilter;
+
+/**
+ * Abstract class for Tests of assets repository.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+abstract class AbstractAssetsRepositoryTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var IOInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $io;
+
+    /**
+     * @var Config
+     */
+    protected $config;
+
+    /**
+     * @var RepositoryManager
+     */
+    protected $rm;
+
+    /**
+     * @var AssetRepositoryManager
+     */
+    protected $assetRepositoryManager;
+
+    /**
+     * @var AbstractAssetsRepository
+     */
+    protected $registry;
+
+    /**
+     * @var Pool
+     */
+    protected $pool;
+
+    protected function setUp()
+    {
+        $io = $this->getMockBuilder('Composer\IO\IOInterface')->getMock();
+        $io->expects($this->any())
+            ->method('isVerbose')
+            ->will($this->returnValue(true));
+        /* @var IOInterface $io */
+        $config = new Config();
+        $config->merge(array(
+            'config' => array(
+                'home' => sys_get_temp_dir().'/composer-test',
+                'cache-repo-dir' => sys_get_temp_dir().'/composer-test-cache-repo',
+            ),
+        ));
+        /* @var VcsPackageFilter $filter */
+        $filter = $this->getMockBuilder(VcsPackageFilter::class)->disableOriginalConstructor()->getMock();
+        $rm = new RepositoryManager($io, $config);
+        $rm->setRepositoryClass($this->getType().'-vcs', 'Fxp\Composer\AssetPlugin\Tests\Fixtures\Repository\MockAssetRepository');
+        $this->assetRepositoryManager = new AssetRepositoryManager($io, $rm, new AssetConfig(array()), $filter);
+        $repoConfig = array_merge(array(
+            'asset-repository-manager' => $this->assetRepositoryManager,
+            'asset-options' => array(
+                'searchable' => true,
+            ),
+        ), $this->getCustomRepoConfig());
+
+        $this->io = $io;
+        $this->config = $config;
+        $this->rm = $rm;
+        $this->registry = $this->getRegistry($repoConfig, $io, $config);
+        $this->pool = $this->getMockBuilder('Composer\DependencyResolver\Pool')->getMock();
+    }
+
+    protected function tearDown()
+    {
+        $this->io = null;
+        $this->config = null;
+        $this->rm = null;
+        $this->registry = null;
+        $this->pool = null;
+    }
+
+    protected function getCustomRepoConfig()
+    {
+        return array();
+    }
+
+    /**
+     * Gets the asset type.
+     *
+     * @return string
+     */
+    abstract protected function getType();
+
+    /**
+     * Gets the asset registry.
+     *
+     * @param array           $repoConfig
+     * @param IOInterface     $io
+     * @param Config          $config
+     * @param EventDispatcher $eventDispatcher
+     *
+     * @return AbstractAssetsRepository
+     */
+    abstract protected function getRegistry(array $repoConfig, IOInterface $io, Config $config, EventDispatcher $eventDispatcher = null);
+
+    /**
+     * Gets the mock package of asset for the config of VCS repository.
+     *
+     * @return array
+     */
+    abstract protected function getMockPackageForVcsConfig();
+
+    /**
+     * Gets the mock search result.
+     *
+     * @param string $name
+     *
+     * @return array
+     */
+    abstract protected function getMockSearchResult($name = 'mock-package');
+
+    /**
+     * Replaces the Remote file system of Registry by a mock.
+     *
+     * @return \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected function replaceRegistryRfsByMock()
+    {
+        $ref = new \ReflectionClass($this->registry);
+        $pRef = $ref->getParentClass()->getParentClass();
+        $pRfs = $pRef->getProperty('rfs');
+        $pRfs->setAccessible(true);
+
+        $rfs = $this->getMockBuilder('Composer\Util\RemoteFilesystem')
+            ->setConstructorArgs(array($this->io, $this->config))
+            ->getMock();
+
+        $pRfs->setValue($this->registry, $rfs);
+
+        return $rfs;
+    }
+
+    public function testFindPackageMustBeAlwaysNull()
+    {
+        $this->assertNull($this->registry->findPackage('foobar', '0'));
+    }
+
+    public function testFindPackageMustBeAlwaysEmpty()
+    {
+        $this->assertCount(0, $this->registry->findPackages('foobar', '0'));
+    }
+
+    /**
+     * @expectedException \LogicException
+     */
+    public function testGetPackagesNotBeUsed()
+    {
+        $this->registry->getPackages();
+    }
+
+    public function testGetProviderNamesMustBeEmpty()
+    {
+        $this->assertCount(0, $this->registry->getProviderNames());
+    }
+
+    public function testGetMinimalPackagesMustBeAlwaysEmpty()
+    {
+        $this->assertCount(0, $this->registry->getMinimalPackages());
+    }
+
+    public function testWhatProvidesWithNotAssetName()
+    {
+        $this->assertCount(0, $this->registry->whatProvides($this->pool, 'foo/bar'));
+    }
+
+    public function testWhatProvidesWithNonExistentPackage()
+    {
+        $name = $this->getType().'-asset/non-existent';
+        $rfs = $this->replaceRegistryRfsByMock();
+        $rfs->expects($this->any())
+            ->method('getContents')
+            ->will($this->throwException(new TransportException('Package not found')));
+
+        $this->assertCount(0, $this->rm->getRepositories());
+        $this->assertCount(0, $this->registry->whatProvides($this->pool, $name));
+        $this->assertCount(0, $this->registry->whatProvides($this->pool, $name));
+        $this->assertCount(0, $this->rm->getRepositories());
+    }
+
+    public function testWhatProvidesWithExistingPackage()
+    {
+        $name = $this->getType().'-asset/existing';
+        $rfs = $this->replaceRegistryRfsByMock();
+        $rfs->expects($this->any())
+            ->method('getContents')
+            ->will($this->returnValue(json_encode($this->getMockPackageForVcsConfig())));
+
+        $this->assertCount(0, $this->rm->getRepositories());
+        $this->assertCount(0, $this->registry->whatProvides($this->pool, $name));
+        $this->assertCount(0, $this->registry->whatProvides($this->pool, $name));
+        $this->assertCount(1, $this->rm->getRepositories());
+    }
+
+    public function testWhatProvidesWithExistingAliasPackage()
+    {
+        $name = $this->getType().'-asset/existing-1.0';
+        $rfs = $this->replaceRegistryRfsByMock();
+        $rfs->expects($this->any())
+            ->method('getContents')
+            ->will($this->returnValue(json_encode($this->getMockPackageForVcsConfig())));
+
+        $this->assertCount(0, $this->rm->getRepositories());
+        $this->assertCount(0, $this->registry->whatProvides($this->pool, $name));
+        $this->assertCount(0, $this->registry->whatProvides($this->pool, $name));
+        $this->assertCount(1, $this->rm->getRepositories());
+    }
+
+    public function testWhatProvidesWithCamelcasePackageName()
+    {
+        $assetName = 'CamelCasePackage';
+        $name = $this->getType().'-asset/'.strtolower($assetName);
+        $rfs = $this->replaceRegistryRfsByMock();
+        $rfs->expects($this->at(0))
+            ->method('getContents')
+            ->will($this->throwException(new TransportException('Package not found', 404)));
+        $rfs->expects($this->at(1))
+            ->method('getContents')
+            ->will($this->throwException(new TransportException('Package not found', 404)));
+        $rfs->expects($this->at(2))
+            ->method('getContents')
+            ->will($this->throwException(new TransportException('Package not found', 404)));
+        $rfs->expects($this->at(3))
+            ->method('getContents')
+            ->will($this->returnValue(json_encode($this->getMockSearchResult($assetName))));
+        $rfs->expects($this->at(4))
+            ->method('getContents')
+            ->will($this->returnValue(json_encode($this->getMockPackageForVcsConfig())));
+
+        $this->assertCount(0, $this->rm->getRepositories());
+        $this->assertCount(0, $this->registry->whatProvides($this->pool, $name));
+        $this->assertCount(0, $this->registry->whatProvides($this->pool, $name));
+        $this->assertCount(1, $this->rm->getRepositories());
+    }
+
+    public function testSearch()
+    {
+        $rfs = $this->replaceRegistryRfsByMock();
+        $rfs->expects($this->any())
+            ->method('getContents')
+            ->will($this->returnValue(json_encode($this->getMockSearchResult())));
+
+        $result = $this->registry->search('query');
+        $this->assertCount(count($this->getMockSearchResult()), $result);
+    }
+
+    public function testSearchWithAssetComposerPrefix()
+    {
+        $rfs = $this->replaceRegistryRfsByMock();
+        $rfs->expects($this->any())
+            ->method('getContents')
+            ->will($this->returnValue(json_encode($this->getMockSearchResult())));
+
+        $result = $this->registry->search($this->getType().'-asset/query');
+        $this->assertCount(count($this->getMockSearchResult()), $result);
+    }
+
+    public function testSearchWithSearchDisabled()
+    {
+        $repoConfig = array(
+            'asset-repository-manager' => $this->assetRepositoryManager,
+            'asset-options' => array(
+                'searchable' => false,
+            ),
+        );
+        $this->registry = $this->getRegistry($repoConfig, $this->io, $this->config);
+
+        $this->assertCount(0, $this->registry->search('query'));
+    }
+
+    public function testOverridingVcsRepositoryConfig()
+    {
+        $name = $this->getType().'-asset/foobar';
+        $rfs = $this->replaceRegistryRfsByMock();
+        $rfs->expects($this->any())
+            ->method('getContents')
+            ->will($this->returnValue(json_encode($this->getMockPackageForVcsConfig())));
+
+        $repo = $this->getMockBuilder('Fxp\Composer\AssetPlugin\Repository\AssetVcsRepository')
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $repo->expects($this->any())
+            ->method('getComposerPackageName')
+            ->will($this->returnValue($name));
+
+        /* @var AssetVcsRepository $repo */
+        $this->rm->addRepository($repo);
+
+        $this->assertCount(0, $this->registry->whatProvides($this->pool, $name));
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Repository/AssetRepositoryManagerTest.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Repository/AssetRepositoryManagerTest.php
new file mode 100644 (file)
index 0000000..ffe3642
--- /dev/null
@@ -0,0 +1,143 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Tests\Repository;
+
+use Composer\DependencyResolver\Pool;
+use Composer\IO\IOInterface;
+use Composer\Repository\RepositoryInterface;
+use Composer\Repository\RepositoryManager;
+use Fxp\Composer\AssetPlugin\Config\Config;
+use Fxp\Composer\AssetPlugin\Repository\AssetRepositoryManager;
+use Fxp\Composer\AssetPlugin\Repository\ResolutionManager;
+use Fxp\Composer\AssetPlugin\Repository\VcsPackageFilter;
+
+/**
+ * Tests of Asset Repository Manager.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class AssetRepositoryManagerTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var RepositoryManager|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $rm;
+
+    /**
+     * @var IOInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $io;
+
+    /**
+     * @var Config
+     */
+    protected $config;
+
+    /**
+     * @var VcsPackageFilter|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $filter;
+
+    /**
+     * @var ResolutionManager|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $resolutionManager;
+
+    /**
+     * @var AssetRepositoryManager
+     */
+    protected $assetRepositoryManager;
+
+    protected function setUp()
+    {
+        $this->io = $this->getMockBuilder(IOInterface::class)->getMock();
+        $this->rm = $this->getMockBuilder(RepositoryManager::class)->disableOriginalConstructor()->getMock();
+        $this->config = new Config(array());
+        $this->filter = $this->getMockBuilder(VcsPackageFilter::class)->disableOriginalConstructor()->getMock();
+
+        $this->resolutionManager = $this->getMockBuilder(ResolutionManager::class)->getMock();
+        $this->assetRepositoryManager = new AssetRepositoryManager($this->io, $this->rm, $this->config, $this->filter);
+    }
+
+    public function getDataForSolveResolutions()
+    {
+        return array(
+            array(true),
+            array(false),
+        );
+    }
+
+    /**
+     * @dataProvider getDataForSolveResolutions
+     *
+     * @param bool $withResolutionManager
+     */
+    public function testSolveResolutions($withResolutionManager)
+    {
+        $expected = array(
+            'name' => 'foo/bar',
+        );
+
+        if ($withResolutionManager) {
+            $this->assetRepositoryManager->setResolutionManager($this->resolutionManager);
+            $this->resolutionManager->expects($this->once())
+                ->method('solveResolutions')
+                ->with($expected)
+                ->willReturn($expected);
+        } else {
+            $this->resolutionManager->expects($this->never())
+                ->method('solveResolutions');
+        }
+
+        $data = $this->assetRepositoryManager->solveResolutions($expected);
+
+        $this->assertSame($expected, $data);
+    }
+
+    public function testAddRepositoryInPool()
+    {
+        $repos = array(
+            array(
+                'name' => 'foo/bar',
+                'type' => 'asset-vcs',
+                'url' => 'https://github.com/helloguest/helloguest-ui-app.git',
+            ),
+        );
+
+        $repoConfigExpected = array_merge($repos[0], array(
+            'asset-repository-manager' => $this->assetRepositoryManager,
+            'vcs-package-filter' => $this->filter,
+        ));
+
+        $repo = $this->getMockBuilder(RepositoryInterface::class)->getMock();
+
+        $this->rm->expects($this->once())
+            ->method('createRepository')
+            ->with('asset-vcs', $repoConfigExpected)
+            ->willReturn($repo);
+
+        $this->assetRepositoryManager->addRepositories($repos);
+
+        /* @var Pool|\PHPUnit_Framework_MockObject_MockObject $pool */
+        $pool = $this->getMockBuilder(Pool::class)->disableOriginalConstructor()->getMock();
+        $pool->expects($this->once())
+            ->method('addRepository')
+            ->with($repo);
+
+        $this->assetRepositoryManager->setPool($pool);
+    }
+
+    public function testGetConfig()
+    {
+        $this->assertSame($this->config, $this->assetRepositoryManager->getConfig());
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Repository/AssetVcsRepositoryTest.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Repository/AssetVcsRepositoryTest.php
new file mode 100644 (file)
index 0000000..2d38b1c
--- /dev/null
@@ -0,0 +1,473 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Tests\Repository;
+
+use Composer\Config;
+use Composer\EventDispatcher\EventDispatcher;
+use Composer\Package\AliasPackage;
+use Composer\Package\CompletePackage;
+use Composer\Package\PackageInterface;
+use Composer\Repository\InvalidRepositoryException;
+use Fxp\Composer\AssetPlugin\Repository\AssetRepositoryManager;
+use Fxp\Composer\AssetPlugin\Repository\AssetVcsRepository;
+use Fxp\Composer\AssetPlugin\Repository\VcsPackageFilter;
+use Fxp\Composer\AssetPlugin\Tests\Fixtures\IO\MockIO;
+use Fxp\Composer\AssetPlugin\Tests\Fixtures\Repository\Vcs\MockVcsDriver;
+
+/**
+ * Tests of asset vcs repository.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class AssetVcsRepositoryTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var Config
+     */
+    protected $config;
+
+    /**
+     * @var EventDispatcher
+     */
+    protected $dispatcher;
+
+    /**
+     * @var MockIO
+     */
+    protected $io;
+
+    /**
+     * @var AssetRepositoryManager
+     */
+    protected $assetRepositoryManager;
+
+    /**
+     * @var AssetVcsRepository
+     */
+    protected $repository;
+
+    protected function setUp()
+    {
+        $this->config = new Config();
+        /* @var EventDispatcher $dispatcher */
+        $dispatcher = $this->getMockBuilder('Composer\EventDispatcher\EventDispatcher')
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->dispatcher = $dispatcher;
+        $this->assetRepositoryManager = $this->getMockBuilder(AssetRepositoryManager::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->assetRepositoryManager->expects($this->any())
+            ->method('solveResolutions')
+            ->willReturnCallback(function ($value) {
+                return $value;
+            });
+    }
+
+    protected function tearDown()
+    {
+        $this->config = null;
+        $this->dispatcher = null;
+        $this->io = null;
+        $this->repository = null;
+    }
+
+    /**
+     * Data provider.
+     *
+     * @return array
+     */
+    public function getDefaultDrivers()
+    {
+        return array(
+            array('npm-github', 'http://example.org/foo.git', 'Fxp\Composer\AssetPlugin\Repository\Vcs\GitHubDriver'),
+            array('npm-git', 'http://example.org/foo.git', 'Fxp\Composer\AssetPlugin\Repository\Vcs\GitDriver'),
+            array('bower-github', 'http://example.org/foo.git', 'Fxp\Composer\AssetPlugin\Repository\Vcs\GitHubDriver'),
+            array('bower-git', 'http://example.org/foo.git', 'Fxp\Composer\AssetPlugin\Repository\Vcs\GitDriver'),
+        );
+    }
+
+    /**
+     * @dataProvider getDefaultDrivers
+     *
+     * @param string $type
+     * @param string $url
+     */
+    public function testDefaultConstructor($type, $url)
+    {
+        $this->init(false, $type, $url, '', false, array());
+        $this->assertEquals(0, $this->repository->count());
+    }
+
+    /**
+     * Data provider.
+     *
+     * @return array
+     */
+    public function getMockDrivers()
+    {
+        return array(
+            array('npm-mock', 'http://example.org/foo', 'Fxp\Composer\AssetPlugin\Tests\Fixtures\Repository\Vcs\MockVcsDriver'),
+            array('bower-mock', 'http://example.org/foo', 'Fxp\Composer\AssetPlugin\Tests\Fixtures\Repository\Vcs\MockVcsDriver'),
+        );
+    }
+
+    /**
+     * @dataProvider getMockDrivers
+     *
+     * @param string $type
+     * @param string $url
+     * @param string $class
+     *
+     * @expectedException \Composer\Repository\InvalidRepositoryException
+     * @expectedExceptionMessageRegExp /No valid (bower|package).json was found in any branch or tag of http:\/\/example.org\/foo, could not load a package from it./
+     */
+    public function testNotDriverFound($type, $url, $class)
+    {
+        $this->init(false, $type, $url, $class);
+        $this->repository->getPackages();
+    }
+
+    /**
+     * @dataProvider getMockDrivers
+     *
+     * @param string $type
+     * @param string $url
+     * @param string $class
+     *
+     * @expectedException \Composer\Repository\InvalidRepositoryException
+     */
+    public function testWithoutValidPackage($type, $url, $class)
+    {
+        $this->init(true, $type, $url, $class);
+        $this->repository->getPackages();
+    }
+
+    /**
+     * Data provider.
+     *
+     * @return array
+     */
+    public function getMockDriversSkipParsing()
+    {
+        return array(
+            array('npm-mock', 'http://example.org/foo', 'Fxp\Composer\AssetPlugin\Tests\Fixtures\Repository\Vcs\MockVcsDriverSkipParsing', false),
+            array('bower-mock', 'http://example.org/foo', 'Fxp\Composer\AssetPlugin\Tests\Fixtures\Repository\Vcs\MockVcsDriverSkipParsing', false),
+            array('npm-mock', 'http://example.org/foo', 'Fxp\Composer\AssetPlugin\Tests\Fixtures\Repository\Vcs\MockVcsDriverSkipParsing', true),
+            array('bower-mock', 'http://example.org/foo', 'Fxp\Composer\AssetPlugin\Tests\Fixtures\Repository\Vcs\MockVcsDriverSkipParsing', true),
+        );
+    }
+
+    /**
+     * @dataProvider getMockDriversSkipParsing
+     *
+     * @param string $type
+     * @param string $url
+     * @param string $class
+     * @param bool   $verbose
+     */
+    public function testSkipParsingFile($type, $url, $class, $verbose)
+    {
+        $validTraces = array('');
+        if ($verbose) {
+            $validTraces = array(
+                '<error>Skipped parsing ROOT, MESSAGE with ROOT</error>',
+                '',
+            );
+        }
+
+        $this->init(true, $type, $url, $class, $verbose);
+
+        try {
+            $this->repository->getPackages();
+        } catch (InvalidRepositoryException $e) {
+            // for analysis the IO traces
+        }
+        $this->assertSame($validTraces, $this->io->getTraces());
+    }
+
+    /**
+     * Data provider.
+     *
+     * @return array
+     */
+    public function getMockDriversWithVersions()
+    {
+        return array(
+            array('npm-mock', 'http://example.org/foo', 'Fxp\Composer\AssetPlugin\Tests\Fixtures\Repository\Vcs\MockVcsDriverWithPackages', false),
+            array('bower-mock', 'http://example.org/foo', 'Fxp\Composer\AssetPlugin\Tests\Fixtures\Repository\Vcs\MockVcsDriverWithPackages', false),
+            array('npm-mock', 'http://example.org/foo', 'Fxp\Composer\AssetPlugin\Tests\Fixtures\Repository\Vcs\MockVcsDriverWithPackages', true),
+            array('bower-mock', 'http://example.org/foo', 'Fxp\Composer\AssetPlugin\Tests\Fixtures\Repository\Vcs\MockVcsDriverWithPackages', true),
+        );
+    }
+
+    /**
+     * @dataProvider getMockDriversWithVersions
+     *
+     * @param string $type
+     * @param string $url
+     * @param string $class
+     * @param bool   $verbose
+     */
+    public function testRepositoryPackageName($type, $url, $class, $verbose)
+    {
+        $packageName = 'asset-package-name';
+        $valid = str_replace('-mock', '-asset', $type).'/'.$packageName;
+
+        $this->init(true, $type, $url, $class, $verbose, null, $packageName);
+
+        $this->assertEquals($valid, $this->repository->getComposerPackageName());
+    }
+
+    /**
+     * @dataProvider getMockDriversWithVersions
+     *
+     * @param string $type
+     * @param string $url
+     * @param string $class
+     * @param bool   $verbose
+     */
+    public function testWithTagsAndBranchs($type, $url, $class, $verbose)
+    {
+        $validPackageName = substr($type, 0, strpos($type, '-')).'-asset/foobar';
+        $validTraces = array('');
+        if ($verbose) {
+            $validTraces = array(
+                '<warning>Skipped tag invalid, invalid tag name</warning>',
+                '',
+            );
+        }
+
+        $this->init(true, $type, $url, $class, $verbose);
+
+        /* @var PackageInterface[] $packages */
+        $packages = $this->repository->getPackages();
+        $this->assertCount(7, $packages);
+
+        foreach ($packages as $package) {
+            if ($package instanceof AliasPackage) {
+                $package = $package->getAliasOf();
+            }
+
+            $this->assertInstanceOf('Composer\Package\CompletePackage', $package);
+            $this->assertSame($validPackageName, $package->getName());
+        }
+
+        $this->assertSame($validTraces, $this->io->getTraces());
+    }
+
+    /**
+     * Data provider.
+     *
+     * @return array
+     */
+    public function getMockDriversWithVersionsAndWithoutName()
+    {
+        return array(
+            array('npm-mock', 'http://example.org/foo', 'Fxp\Composer\AssetPlugin\Tests\Fixtures\Repository\Vcs\MockVcsDriverWithUrlPackages', false),
+            array('bower-mock', 'http://example.org/foo', 'Fxp\Composer\AssetPlugin\Tests\Fixtures\Repository\Vcs\MockVcsDriverWithUrlPackages', false),
+            array('npm-mock', 'http://example.org/foo', 'Fxp\Composer\AssetPlugin\Tests\Fixtures\Repository\Vcs\MockVcsDriverWithUrlPackages', true),
+            array('bower-mock', 'http://example.org/foo', 'Fxp\Composer\AssetPlugin\Tests\Fixtures\Repository\Vcs\MockVcsDriverWithUrlPackages', true),
+        );
+    }
+
+    /**
+     * @dataProvider getMockDriversWithVersionsAndWithoutName
+     *
+     * @param string $type
+     * @param string $url
+     * @param string $class
+     * @param bool   $verbose
+     */
+    public function testWithTagsAndBranchsWithoutPackageName($type, $url, $class, $verbose)
+    {
+        $validPackageName = $url;
+        $validTraces = array('');
+        if ($verbose) {
+            $validTraces = array(
+                '<warning>Skipped tag invalid, invalid tag name</warning>',
+                '',
+            );
+        }
+
+        $this->init(true, $type, $url, $class, $verbose);
+
+        /* @var PackageInterface[] $packages */
+        $packages = $this->repository->getPackages();
+        $this->assertCount(7, $packages);
+
+        foreach ($packages as $package) {
+            if ($package instanceof AliasPackage) {
+                $package = $package->getAliasOf();
+            }
+
+            $this->assertInstanceOf('Composer\Package\CompletePackage', $package);
+            $this->assertSame($validPackageName, $package->getName());
+        }
+
+        $this->assertSame($validTraces, $this->io->getTraces());
+    }
+
+    /**
+     * @dataProvider getMockDriversWithVersions
+     *
+     * @param string $type
+     * @param string $url
+     * @param string $class
+     * @param bool   $verbose
+     */
+    public function testWithTagsAndBranchsWithRegistryPackageName($type, $url, $class, $verbose)
+    {
+        $validPackageName = substr($type, 0, strpos($type, '-')).'-asset/registry-foobar';
+        $validTraces = array('');
+        if ($verbose) {
+            $validTraces = array(
+                '<warning>Skipped tag invalid, invalid tag name</warning>',
+                '',
+            );
+        }
+
+        $this->init(true, $type, $url, $class, $verbose, null, 'registry-foobar');
+
+        /* @var PackageInterface[] $packages */
+        $packages = $this->repository->getPackages();
+        $this->assertCount(7, $packages);
+
+        foreach ($packages as $package) {
+            if ($package instanceof AliasPackage) {
+                $package = $package->getAliasOf();
+            }
+
+            $this->assertInstanceOf('Composer\Package\CompletePackage', $package);
+            $this->assertSame($validPackageName, $package->getName());
+        }
+
+        $this->assertSame($validTraces, $this->io->getTraces());
+    }
+
+    /**
+     * @dataProvider getMockDriversWithVersions
+     *
+     * @param string $type
+     * @param string $url
+     * @param string $class
+     * @param bool   $verbose
+     */
+    public function testWithFilterTags($type, $url, $class, $verbose)
+    {
+        $validPackageName = substr($type, 0, strpos($type, '-')).'-asset/registry-foobar';
+        $validTraces = array('');
+        if ($verbose) {
+            $validTraces = array();
+        }
+
+        $filter = $this->getMockBuilder('Fxp\Composer\AssetPlugin\Repository\VcsPackageFilter')
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $filter->expects($this->any())
+            ->method('skip')
+            ->will($this->returnValue(true));
+
+        /* @var VcsPackageFilter $filter */
+        $this->init(true, $type, $url, $class, $verbose, null, 'registry-foobar', $filter);
+
+        /* @var PackageInterface[] $packages */
+        $packages = $this->repository->getPackages();
+        $this->assertCount(5, $packages);
+
+        foreach ($packages as $package) {
+            if ($package instanceof AliasPackage) {
+                $package = $package->getAliasOf();
+            }
+
+            $this->assertInstanceOf('Composer\Package\CompletePackage', $package);
+            $this->assertSame($validPackageName, $package->getName());
+        }
+
+        $this->assertSame($validTraces, $this->io->getTraces());
+    }
+
+    /**
+     * @dataProvider getMockDrivers
+     *
+     * @param string $type
+     * @param string $url
+     * @param string $class
+     */
+    public function testPackageWithRegistryVersions($type, $url, $class)
+    {
+        $registryPackages = array(
+            new CompletePackage('package1', '0.1.0.0', '0.1'),
+            new CompletePackage('package1', '0.2.0.0', '0.2'),
+            new CompletePackage('package1', '0.3.0.0', '0.3'),
+            new CompletePackage('package1', '0.4.0.0', '0.4'),
+            new CompletePackage('package1', '0.5.0.0', '0.5'),
+            new CompletePackage('package1', '0.6.0.0', '0.6'),
+            new CompletePackage('package1', '0.7.0.0', '0.7'),
+            new CompletePackage('package1', '0.8.0.0', '0.8'),
+            new CompletePackage('package1', '0.9.0.0', '0.9'),
+            new CompletePackage('package1', '1.0.0.0', '1.0'),
+        );
+
+        $this->init(true, $type, $url, $class, false, null, 'registry-foobar', null, $registryPackages);
+
+        /* @var PackageInterface[] $packages */
+        $packages = $this->repository->getPackages();
+        $this->assertCount(10, $packages);
+        $this->assertSame($registryPackages, $packages);
+    }
+
+    /**
+     * Init the test.
+     *
+     * @param bool                  $supported
+     * @param string                $type
+     * @param string                $url
+     * @param string                $class
+     * @param bool                  $verbose
+     * @param array|null            $drivers
+     * @param string|null           $registryName
+     * @param VcsPackageFilter|null $vcsPackageFilter
+     * @param array                 $registryPackages
+     */
+    protected function init($supported, $type, $url, $class, $verbose = false, $drivers = null, $registryName = null, VcsPackageFilter $vcsPackageFilter = null, array $registryPackages = array())
+    {
+        MockVcsDriver::$supported = $supported;
+        $driverType = substr($type, strpos($type, '-') + 1);
+        $repoConfig = array('type' => $type, 'url' => $url, 'name' => $registryName, 'vcs-package-filter' => $vcsPackageFilter, 'asset-repository-manager' => $this->assetRepositoryManager);
+
+        if (null === $drivers) {
+            $drivers = array(
+                $driverType => $class,
+            );
+        }
+
+        if (count($registryPackages) > 0) {
+            $repoConfig['registry-versions'] = $registryPackages;
+        }
+
+        $this->io = $this->createIO($verbose);
+        $this->repository = new AssetVcsRepository($repoConfig, $this->io, $this->config, $this->dispatcher, $drivers);
+    }
+
+    /**
+     * @param bool $verbose
+     *
+     * @return MockIO
+     */
+    protected function createIO($verbose = false)
+    {
+        return new MockIO($verbose);
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Repository/BowerPrivateRepositoryTest.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Repository/BowerPrivateRepositoryTest.php
new file mode 100644 (file)
index 0000000..f6d45ef
--- /dev/null
@@ -0,0 +1,88 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Tests\Repository;
+
+use Composer\Config;
+use Composer\EventDispatcher\EventDispatcher;
+use Composer\IO\IOInterface;
+use Fxp\Composer\AssetPlugin\Repository\BowerPrivateRepository;
+
+/**
+ * Tests of Private Bower repository.
+ *
+ * @author Marcus Stüben <marcus@it-stueben.de>
+ */
+class BowerPrivateRepositoryTest extends AbstractAssetsRepositoryTest
+{
+    /**
+     * {@inheritdoc}
+     */
+    protected function getType()
+    {
+        return 'bower';
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function getRegistry(array $repoConfig, IOInterface $io, Config $config, EventDispatcher $eventDispatcher = null)
+    {
+        return new BowerPrivateRepository($repoConfig, $io, $config, $eventDispatcher);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function getMockPackageForVcsConfig()
+    {
+        return array(
+            'url' => 'http://foo.tld',
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function getMockSearchResult($name = 'mock-package')
+    {
+        return array(
+            array(
+                'name' => $name,
+            ),
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function getCustomRepoConfig()
+    {
+        return array(
+            'private-registry-url' => 'http://foo.tld',
+        );
+    }
+
+    /**
+     * @expectedException \Fxp\Composer\AssetPlugin\Exception\InvalidCreateRepositoryException
+     * @expectedExceptionMessage The "repository.url" parameter of "existing" bower asset package must be present for create a VCS Repository
+     */
+    public function testWhatProvidesWithInvalidPrivateUrl()
+    {
+        $name = $this->getType().'-asset/existing';
+        $rfs = $this->replaceRegistryRfsByMock();
+        $rfs->expects($this->any())
+            ->method('getContents')
+            ->will($this->returnValue(json_encode(array())));
+
+        $this->registry->whatProvides($this->pool, $name);
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Repository/BowerRepositoryTest.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Repository/BowerRepositoryTest.php
new file mode 100644 (file)
index 0000000..fc5d03a
--- /dev/null
@@ -0,0 +1,63 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Tests\Repository;
+
+use Composer\Config;
+use Composer\EventDispatcher\EventDispatcher;
+use Composer\IO\IOInterface;
+use Fxp\Composer\AssetPlugin\Repository\BowerRepository;
+
+/**
+ * Tests of Bower repository.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class BowerRepositoryTest extends AbstractAssetsRepositoryTest
+{
+    /**
+     * {@inheritdoc}
+     */
+    protected function getType()
+    {
+        return 'bower';
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function getRegistry(array $repoConfig, IOInterface $io, Config $config, EventDispatcher $eventDispatcher = null)
+    {
+        return new BowerRepository($repoConfig, $io, $config, $eventDispatcher);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function getMockPackageForVcsConfig()
+    {
+        return array(
+            'url' => 'http://foo.tld',
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function getMockSearchResult($name = 'mock-package')
+    {
+        return array(
+            array(
+                'name' => $name,
+            ),
+        );
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Repository/NpmRepositoryTest.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Repository/NpmRepositoryTest.php
new file mode 100644 (file)
index 0000000..7d80f3e
--- /dev/null
@@ -0,0 +1,201 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Tests\Repository;
+
+use Composer\Config;
+use Composer\Downloader\TransportException;
+use Composer\EventDispatcher\EventDispatcher;
+use Composer\IO\IOInterface;
+use Fxp\Composer\AssetPlugin\Repository\NpmRepository;
+
+/**
+ * Tests of NPM repository.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class NpmRepositoryTest extends AbstractAssetsRepositoryTest
+{
+    /**
+     * {@inheritdoc}
+     */
+    protected function getType()
+    {
+        return 'npm';
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function getRegistry(array $repoConfig, IOInterface $io, Config $config, EventDispatcher $eventDispatcher = null)
+    {
+        return new NpmRepository($repoConfig, $io, $config, $eventDispatcher);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function getMockPackageForVcsConfig()
+    {
+        return array(
+            'repository' => array(
+                'type' => 'vcs',
+                'url' => 'http://foo.tld',
+            ),
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function getMockSearchResult($name = 'mock-package')
+    {
+        return array();
+    }
+
+    public function testWhatProvidesWithCamelcasePackageName()
+    {
+        $name = $this->getType().'-asset/CamelCasePackage';
+        $rfs = $this->replaceRegistryRfsByMock();
+        $rfs->expects($this->any())
+            ->method('getContents')
+            ->will($this->throwException(new TransportException('Package not found', 404)));
+
+        $this->assertCount(0, $this->rm->getRepositories());
+        $this->assertCount(0, $this->registry->whatProvides($this->pool, $name));
+        $this->assertCount(0, $this->registry->whatProvides($this->pool, $name));
+        $this->assertCount(0, $this->rm->getRepositories());
+    }
+
+    public function testWatProvidesWithoutRepositoryUrl()
+    {
+        $name = $this->getType().'-asset/foobar';
+        $rfs = $this->replaceRegistryRfsByMock();
+        $rfs->expects($this->any())
+            ->method('getContents')
+            ->will($this->returnValue(json_encode(array(
+                'repository' => array(
+                    'type' => 'vcs',
+                ),
+                'versions' => array(
+                    '1.0.0' => array(
+                        'name' => 'foobar',
+                        'version' => '0.0.1',
+                        'dependencies' => array(),
+                        'dist' => array(
+                            'shasum' => '1d408b3fdb76923b9543d96fb4c9dfd535d9cb5d',
+                            'tarball' => 'http://registry.tld/foobar/-/foobar-1.0.0.tgz',
+                        ),
+                    ),
+                ),
+                'time' => array(
+                    '1.0.0' => '2016-09-20T13:48:47.730Z',
+                ),
+            ))));
+
+        $this->assertCount(0, $this->rm->getRepositories());
+        $this->assertCount(0, $this->registry->whatProvides($this->pool, $name));
+        $this->assertCount(0, $this->registry->whatProvides($this->pool, $name));
+        $this->assertCount(1, $this->rm->getRepositories());
+    }
+
+    public function testWhatProvidesWithBrokenVersionConstraint()
+    {
+        $name = $this->getType().'-asset/foobar';
+        $rfs = $this->replaceRegistryRfsByMock();
+        $rfs->expects($this->any())
+            ->method('getContents')
+            ->will($this->returnValue(json_encode(array(
+                'repository' => array(
+                    'type' => 'vcs',
+                ),
+                'versions' => array(
+                    '1.0.0' => array(
+                        'name' => 'foobar',
+                        'version' => '0.0.1',
+                        'dependencies' => array(),
+                        'dist' => array(
+                            'shasum' => '1d408b3fdb76923b9543d96fb4c9dfd535d9cb5d',
+                            'tarball' => 'http://registry.tld/foobar/-/foobar-1.0.0.tgz',
+                        ),
+                    ),
+                    '1.0.1' => array(
+                        'name' => 'foobar',
+                        'version' => '0.0.1',
+                        'dependencies' => array(
+                            // This constraint is invalid. Whole version package version should be skipped.
+                            'library1' => '^1.2,,<2.0',
+                        ),
+                        'dist' => array(
+                            'shasum' => '1d408b3fdb76923b9543d96fb4c9acd535d9cb7a',
+                            'tarball' => 'http://registry.tld/foobar/-/foobar-1.0.1.tgz',
+                        ),
+                    ),
+                    '1.0.2' => array(
+                        'name' => 'foobar',
+                        'version' => '0.0.1',
+                        'dependencies' => array(
+                            'library1' => '^1.2,<2.0',
+                        ),
+                        'dist' => array(
+                            'shasum' => '1d408b3fdb76923b9543d96fb4c9acd535d9cb7a',
+                            'tarball' => 'http://registry.tld/foobar/-/foobar-1.0.1.tgz',
+                        ),
+                    ),
+                ),
+                'time' => array(
+                    '1.0.0' => '2016-09-20T13:48:47.730Z',
+                ),
+            ))));
+
+        $this->assertCount(0, $this->rm->getRepositories());
+        $this->assertCount(0, $this->registry->whatProvides($this->pool, $name));
+        $this->assertCount(0, $this->registry->whatProvides($this->pool, $name));
+        $this->assertCount(1, $this->rm->getRepositories());
+        $this->assertCount(2, $this->rm->getRepositories()[0]->getPackages());
+    }
+
+    /**
+     * @expectedException \Fxp\Composer\AssetPlugin\Exception\InvalidCreateRepositoryException
+     * @expectedExceptionMessage "repository.url" parameter of "foobar"
+     */
+    public function testWatProvidesWithoutRepositoryUrlAndWithoutVersions()
+    {
+        $name = $this->getType().'-asset/foobar';
+        $rfs = $this->replaceRegistryRfsByMock();
+        $rfs->expects($this->any())
+            ->method('getContents')
+            ->will($this->returnValue(json_encode(array())));
+
+        $this->assertCount(0, $this->rm->getRepositories());
+
+        $this->registry->whatProvides($this->pool, $name);
+    }
+
+    public function testWhatProvidesWithGitPlusHttpsUrl()
+    {
+        $name = $this->getType().'-asset/existing';
+        $rfs = $this->replaceRegistryRfsByMock();
+        $rfs->expects($this->any())
+            ->method('getContents')
+            ->will($this->returnValue(json_encode(array(
+                'repository' => array(
+                    'type' => 'vcs',
+                    'url' => 'git+https://foo.tld',
+                ),
+            ))));
+
+        $this->assertCount(0, $this->rm->getRepositories());
+        $this->assertCount(0, $this->registry->whatProvides($this->pool, $name));
+        $this->assertCount(0, $this->registry->whatProvides($this->pool, $name));
+        $this->assertCount(1, $this->rm->getRepositories());
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Repository/ResolutionManagerTest.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Repository/ResolutionManagerTest.php
new file mode 100644 (file)
index 0000000..a0643db
--- /dev/null
@@ -0,0 +1,54 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Tests\Repository;
+
+use Fxp\Composer\AssetPlugin\Repository\ResolutionManager;
+
+/**
+ * Tests of Resolution Manager.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class ResolutionManagerTest extends \PHPUnit_Framework_TestCase
+{
+    public function testSolveResolutions()
+    {
+        $rm = new ResolutionManager(array(
+            'foo/bar' => '^2.2.0',
+            'bar/foo' => '^0.2.0',
+        ));
+
+        $data = $rm->solveResolutions(array(
+            'require' => array(
+                'foo/bar' => '2.0.*',
+                'foo/baz' => '~1.0',
+            ),
+            'require-dev' => array(
+                'bar/foo' => '^0.1.0',
+                'test/dev' => '~1.0@dev',
+            ),
+        ));
+
+        $expected = array(
+            'require' => array(
+                'foo/bar' => '^2.2.0',
+                'foo/baz' => '~1.0',
+            ),
+            'require-dev' => array(
+                'bar/foo' => '^0.2.0',
+                'test/dev' => '~1.0@dev',
+            ),
+        );
+
+        $this->assertSame($expected, $data);
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Repository/UtilTest.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Repository/UtilTest.php
new file mode 100644 (file)
index 0000000..5968060
--- /dev/null
@@ -0,0 +1,74 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Tests\Repository;
+
+use Fxp\Composer\AssetPlugin\Repository\Util;
+
+/**
+ * Repository Util Tests.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class UtilTest extends \PHPUnit_Framework_TestCase
+{
+    public function getPackageNames()
+    {
+        return array(
+            array('vendor/package',        'vendor/package'),
+            array('vendor/package-name',   'vendor/package-name'),
+            array('vendor/package_name',   'vendor/package_name'),
+            array('vendor/package-1',      'vendor/package-1'),
+            array('vendor/package_1',      'vendor/package_1'),
+            array('vendor/package-name-1', 'vendor/package-name-1'),
+            array('vendor/package_name_1', 'vendor/package_name_1'),
+            array('vendor/package-1.0',    'vendor/package'),
+            array('vendor/package-1.x',    'vendor/package'),
+            array('vendor/package-1.X',    'vendor/package'),
+            array('vendor/package-1.0.0',  'vendor/package'),
+            array('vendor/package-1.0.x',  'vendor/package'),
+            array('vendor/package-1.0.X',  'vendor/package'),
+
+            array('vendor-name/package',        'vendor-name/package'),
+            array('vendor-name/package-name',   'vendor-name/package-name'),
+            array('vendor-name/package-1',      'vendor-name/package-1'),
+            array('vendor-name/package-name-1', 'vendor-name/package-name-1'),
+            array('vendor-name/package-1.0',    'vendor-name/package'),
+            array('vendor-name/package-1.x',    'vendor-name/package'),
+            array('vendor-name/package-1.X',    'vendor-name/package'),
+            array('vendor-name/package-1.0.0',  'vendor-name/package'),
+            array('vendor-name/package-1.0.x',  'vendor-name/package'),
+            array('vendor-name/package-1.0.X',  'vendor-name/package'),
+
+            array('vendor_name/package',        'vendor_name/package'),
+            array('vendor_name/package-name',   'vendor_name/package-name'),
+            array('vendor_name/package-1',      'vendor_name/package-1'),
+            array('vendor_name/package-name-1', 'vendor_name/package-name-1'),
+            array('vendor_name/package-1.0',    'vendor_name/package'),
+            array('vendor_name/package-1.x',    'vendor_name/package'),
+            array('vendor_name/package-1.X',    'vendor_name/package'),
+            array('vendor_name/package-1.0.0',  'vendor_name/package'),
+            array('vendor_name/package-1.0.x',  'vendor_name/package'),
+            array('vendor_name/package-1.0.X',  'vendor_name/package'),
+        );
+    }
+
+    /**
+     * @dataProvider getPackageNames
+     *
+     * @param string $name
+     * @param string $validName
+     */
+    public function testConvertAliasName($name, $validName)
+    {
+        $this->assertSame($validName, Util::convertAliasName($name));
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Repository/Vcs/GitBitbucketDriverTest.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Repository/Vcs/GitBitbucketDriverTest.php
new file mode 100644 (file)
index 0000000..d317c0a
--- /dev/null
@@ -0,0 +1,241 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Tests\Repository\Vcs;
+
+use Composer\Config;
+use Composer\Downloader\TransportException;
+use Composer\IO\IOInterface;
+use Composer\Util\Filesystem;
+use Composer\Util\RemoteFilesystem;
+use Fxp\Composer\AssetPlugin\Repository\Vcs\GitBitbucketDriver;
+
+/**
+ * Tests of vcs git bitbucket repository.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class GitBitbucketDriverTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var Config
+     */
+    private $config;
+
+    public function setUp()
+    {
+        $this->config = new Config();
+        $this->config->merge(array(
+            'config' => array(
+                'home' => sys_get_temp_dir().'/composer-test',
+                'cache-repo-dir' => sys_get_temp_dir().'/composer-test-cache',
+            ),
+        ));
+    }
+
+    public function tearDown()
+    {
+        $fs = new Filesystem();
+        $fs->removeDirectory(sys_get_temp_dir().'/composer-test');
+        $fs->removeDirectory(sys_get_temp_dir().'/composer-test-cache');
+    }
+
+    public function getAssetTypes()
+    {
+        return array(
+            array('npm', 'package.json'),
+            array('bower', 'bower.json'),
+        );
+    }
+
+    /**
+     * @dataProvider getAssetTypes
+     *
+     * @param string $type
+     * @param string $filename
+     */
+    public function testPublicRepositoryWithComposer($type, $filename)
+    {
+        $repoBaseUrl = 'https://bitbucket.org/composer-test/repo-name';
+        $repoUrl = $repoBaseUrl.'.git';
+        $identifier = 'v0.0.0';
+        $sha = 'SOMESHA';
+
+        $io = $this->getMockBuilder('Composer\IO\IOInterface')->getMock();
+        $io->expects($this->any())
+            ->method('isInteractive')
+            ->will($this->returnValue(true));
+
+        $remoteFilesystem = $this->getMockBuilder('Composer\Util\RemoteFilesystem')
+            ->setConstructorArgs(array($io))
+            ->getMock();
+
+        $remoteFilesystem->expects($this->any())
+            ->method('getContents')
+            ->withConsecutive(
+                array(
+                    'bitbucket.org',
+                    'https://api.bitbucket.org/2.0/repositories/composer-test/repo-name?fields=-project%2C-owner',
+                    false,
+                ),
+                array(
+                    'bitbucket.org',
+                    'https://api.bitbucket.org/1.0/repositories/composer-test/repo-name/main-branch',
+                    false,
+                ),
+                array(
+                    'bitbucket.org',
+                    'https://api.bitbucket.org/1.0/repositories/composer-test/repo-name/src/v0.0.0/'.$filename,
+                    false,
+                )
+            )
+            ->willReturnOnConsecutiveCalls(
+                '{"scm":"git","website":"","has_wiki":false,"name":"repo","links":{"branches":{"href":"https:\/\/api.bitbucket.org\/2.0\/repositories\/composer-test\/repo-name\/refs\/branches"},"tags":{"href":"https:\/\/api.bitbucket.org\/2.0\/repositories\/composer-test\/repo-name\/refs\/tags"},"clone":[{"href":"https:\/\/user@bitbucket.org\/composer-test\/repo-name.git","name":"https"},{"href":"ssh:\/\/git@bitbucket.org\/composer-test\/repo-name.git","name":"ssh"}],"html":{"href":"https:\/\/bitbucket.org\/composer-test\/repo-name"}},"language":"php","created_on":"2015-02-18T16:22:24.688+00:00","updated_on":"2016-05-17T13:20:21.993+00:00","is_private":true,"has_issues":false}',
+                '{"name": "test_master"}',
+                '{"name": "composer-test/repo-name","description": "test repo","license": "GPL","authors": [{"name": "Name","email": "local@domain.tld"}],"require": {"creator/package": "^1.0"},"require-dev": {"phpunit/phpunit": "~4.8"}}'
+            );
+
+        $repoConfig = array(
+            'url' => $repoUrl,
+            'asset-type' => $type,
+            'filename' => $filename,
+        );
+
+        /* @var IOInterface $io */
+        /* @var RemoteFilesystem $remoteFilesystem */
+
+        $driver = new GitBitbucketDriver($repoConfig, $io, $this->config, null, $remoteFilesystem);
+        $driver->initialize();
+
+        $this->assertEquals('test_master', $driver->getRootIdentifier());
+
+        $dist = $driver->getDist($sha);
+        $this->assertEquals('zip', $dist['type']);
+        $this->assertEquals($this->getScheme($repoBaseUrl).'/get/SOMESHA.zip', $dist['url']);
+        $this->assertEquals($sha, $dist['reference']);
+
+        $source = $driver->getSource($sha);
+        $this->assertEquals('git', $source['type']);
+        $this->assertEquals($repoUrl, $source['url']);
+        $this->assertEquals($sha, $source['reference']);
+
+        $driver->getComposerInformation($identifier);
+    }
+
+    /**
+     * @dataProvider getAssetTypes
+     *
+     * @param string $type
+     * @param string $filename
+     */
+    public function testPublicRepositoryWithEmptyComposer($type, $filename)
+    {
+        $repoBaseUrl = 'https://bitbucket.org/composer-test/repo-name';
+        $repoUrl = $repoBaseUrl.'.git';
+        $repoApiUrl = 'https://api.bitbucket.org/1.0/repositories/composer-test/repo-name';
+        $identifier = 'v0.0.0';
+        $io = $this->getMockBuilder('Composer\IO\IOInterface')->getMock();
+
+        $remoteFilesystem = $this->getMockBuilder('Composer\Util\RemoteFilesystem')
+            ->setConstructorArgs(array($io))
+            ->getMock();
+
+        $remoteFilesystem->expects($this->at(0))
+            ->method('getContents')
+            ->with(
+                $this->equalTo('bitbucket.org'),
+                $this->equalTo($repoApiUrl.'/src/'.$identifier.'/'.$filename),
+                $this->equalTo(false)
+            )
+            ->will($this->throwException(new TransportException('Not Found', 404)));
+
+        $repoConfig = array(
+            'url' => $repoUrl,
+            'asset-type' => $type,
+            'filename' => $filename,
+        );
+
+        /* @var IOInterface $io */
+        /* @var RemoteFilesystem $remoteFilesystem */
+
+        $driver = new GitBitbucketDriver($repoConfig, $io, $this->config, null, $remoteFilesystem);
+        $driver->initialize();
+
+        $validEmpty = array(
+            '_nonexistent_package' => true,
+        );
+
+        $this->assertSame($validEmpty, $driver->getComposerInformation($identifier));
+    }
+
+    /**
+     * @param object $object
+     * @param string $attribute
+     * @param mixed  $value
+     */
+    protected function setAttribute($object, $attribute, $value)
+    {
+        $attr = new \ReflectionProperty($object, $attribute);
+        $attr->setAccessible(true);
+        $attr->setValue($object, $value);
+    }
+
+    /**
+     * Creates the json composer content.
+     *
+     * @param array  $content The composer content
+     * @param string $name    The name of repository
+     *
+     * @return string The json content
+     */
+    protected function createJsonComposer(array $content, $name = 'repo-name')
+    {
+        return json_encode(array_merge_recursive($content, array(
+            'name' => $name,
+        )));
+    }
+
+    /**
+     * @param array  $content The composer content
+     * @param string $name    The name of repository
+     *
+     * @return string The API return value with the json content
+     */
+    protected function createApiJsonWithRepoData(array $content, $name = 'repo-name')
+    {
+        $composerContent = $this->createJsonComposer($content, $name);
+
+        return json_encode(
+            array(
+                'node' => 'nodename',
+                'path' => '/path/to/file',
+                'data' => $composerContent,
+                'size' => strlen($composerContent),
+            )
+        );
+    }
+
+    /**
+     * Get the url with https or http protocol depending on SSL support.
+     *
+     * @param string $url
+     *
+     * @return string The correct url
+     */
+    protected function getScheme($url)
+    {
+        if (extension_loaded('openssl')) {
+            return $url;
+        }
+
+        return str_replace('https:', 'http:', $url);
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Repository/Vcs/GitDriverTest.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Repository/Vcs/GitDriverTest.php
new file mode 100644 (file)
index 0000000..fa0f763
--- /dev/null
@@ -0,0 +1,281 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Tests\Repository\Vcs;
+
+use Composer\Config;
+use Composer\IO\IOInterface;
+use Composer\Util\Filesystem;
+use Composer\Util\ProcessExecutor;
+use Fxp\Composer\AssetPlugin\Repository\AssetRepositoryManager;
+use Fxp\Composer\AssetPlugin\Repository\Vcs\GitDriver;
+
+/**
+ * Tests of vcs git repository.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class GitDriverTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var Config
+     */
+    private $config;
+
+    /**
+     * @var AssetRepositoryManager|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $assetRepositoryManager;
+
+    public function setUp()
+    {
+        $assetConfig = new \Fxp\Composer\AssetPlugin\Config\Config(array('git-skip-update' => '1 hour'));
+
+        /* @var AssetRepositoryManager|\PHPUnit_Framework_MockObject_MockObject $arm */
+        $this->assetRepositoryManager = $this->getMockBuilder(AssetRepositoryManager::class)->disableOriginalConstructor()->getMock();
+        $this->assetRepositoryManager->expects($this->any())
+            ->method('getConfig')
+            ->willReturn($assetConfig);
+
+        $this->config = new Config();
+        $this->config->merge(array(
+            'config' => array(
+                'home' => sys_get_temp_dir().'/composer-test',
+                'cache-repo-dir' => sys_get_temp_dir().'/composer-test-cache',
+                'cache-vcs-dir' => sys_get_temp_dir().'/composer-test-cache',
+            ),
+        ));
+
+        // Mock for skip asset
+        $fs = new Filesystem();
+        $fs->ensureDirectoryExists(sys_get_temp_dir().'/composer-test-cache/https---github.com-fxpio-composer-asset-plugin.git');
+        file_put_contents(sys_get_temp_dir().'/composer-test-cache/https---github.com-fxpio-composer-asset-plugin.git/config', '');
+    }
+
+    public function tearDown()
+    {
+        $fs = new Filesystem();
+        $fs->removeDirectory(sys_get_temp_dir().'/composer-test');
+        $fs->removeDirectory(sys_get_temp_dir().'/composer-test-cache');
+    }
+
+    public function getAssetTypes()
+    {
+        return array(
+            array('npm', 'package.json'),
+            array('bower', 'bower.json'),
+        );
+    }
+
+    /**
+     * @dataProvider getAssetTypes
+     *
+     * @param string $type
+     * @param string $filename
+     */
+    public function testPublicRepositoryWithEmptyComposer($type, $filename)
+    {
+        $repoUrl = 'https://github.com/fxpio/composer-asset-plugin';
+        $identifier = 'v0.0.0';
+        $io = $this->getMockBuilder('Composer\IO\IOInterface')->getMock();
+
+        $repoConfig = array(
+            'url' => $repoUrl,
+            'asset-type' => $type,
+            'filename' => $filename,
+            'asset-repository-manager' => $this->assetRepositoryManager,
+        );
+
+        $process = $this->getMockBuilder('Composer\Util\ProcessExecutor')->getMock();
+        $process->expects($this->any())
+            ->method('splitLines')
+            ->will($this->returnValue(array()));
+        $process->expects($this->any())
+            ->method('execute')
+            ->will($this->returnCallback(function () {
+                return 0;
+            }));
+
+        /* @var IOInterface $io */
+        /* @var ProcessExecutor $process */
+
+        $gitDriver = new GitDriver($repoConfig, $io, $this->config, $process, null);
+        $gitDriver->initialize();
+
+        $validEmpty = array(
+            '_nonexistent_package' => true,
+        );
+
+        $this->assertSame($validEmpty, $gitDriver->getComposerInformation($identifier));
+    }
+
+    /**
+     * @dataProvider getAssetTypes
+     *
+     * @param string $type
+     * @param string $filename
+     */
+    public function testPublicRepositoryWithSkipUpdate($type, $filename)
+    {
+        $repoUrl = 'https://github.com/fxpio/composer-asset-plugin.git';
+        $identifier = '92bebbfdcde75ef2368317830e54b605bc938123';
+        $io = $this->getMockBuilder('Composer\IO\IOInterface')->getMock();
+
+        $repoConfig = array(
+            'url' => $repoUrl,
+            'asset-type' => $type,
+            'filename' => $filename,
+            'asset-repository-manager' => $this->assetRepositoryManager,
+        );
+
+        $process = $this->getMockBuilder('Composer\Util\ProcessExecutor')->getMock();
+        $process->expects($this->any())
+            ->method('splitLines')
+            ->will($this->returnValue(array()));
+        $process->expects($this->any())
+            ->method('execute')
+            ->will($this->returnCallback(function ($command, &$output = null) use ($identifier, $repoConfig) {
+                if ($command === sprintf('git show %s', sprintf('%s:%s', escapeshellarg($identifier), $repoConfig['filename']))) {
+                    $output = '{"name": "foo"}';
+                } elseif (false !== strpos($command, 'git log')) {
+                    $date = new \DateTime(null, new \DateTimeZone('UTC'));
+                    $output = $date->getTimestamp();
+                }
+
+                return 0;
+            }));
+
+        /* @var IOInterface $io */
+        /* @var ProcessExecutor $process */
+
+        $gitDriver1 = new GitDriver($repoConfig, $io, $this->config, $process, null);
+        $gitDriver1->initialize();
+
+        $gitDriver2 = new GitDriver($repoConfig, $io, $this->config, $process, null);
+        $gitDriver2->initialize();
+
+        $validEmpty = array(
+            '_nonexistent_package' => true,
+        );
+
+        $composer1 = $gitDriver1->getComposerInformation($identifier);
+        $composer2 = $gitDriver2->getComposerInformation($identifier);
+
+        $this->assertNotNull($composer1);
+        $this->assertNotNull($composer2);
+        $this->assertSame($composer1, $composer2);
+        $this->assertNotSame($validEmpty, $composer1);
+        $this->assertNotSame($validEmpty, $composer2);
+    }
+
+    /**
+     * @dataProvider getAssetTypes
+     *
+     * @param string $type
+     * @param string $filename
+     */
+    public function testPublicRepositoryWithCodeCache($type, $filename)
+    {
+        $repoUrl = 'https://github.com/fxpio/composer-asset-plugin.git';
+        $identifier = '92bebbfdcde75ef2368317830e54b605bc938123';
+        $repoConfig = array(
+            'url' => $repoUrl,
+            'asset-type' => $type,
+            'filename' => $filename,
+            'asset-repository-manager' => $this->assetRepositoryManager,
+        );
+        $io = $this->getMockBuilder('Composer\IO\IOInterface')->getMock();
+        $process = $this->getMockBuilder('Composer\Util\ProcessExecutor')->getMock();
+        $process->expects($this->any())
+            ->method('splitLines')
+            ->will($this->returnValue(array()));
+        $process->expects($this->any())
+            ->method('execute')
+            ->will($this->returnCallback(function ($command, &$output = null) use ($identifier, $repoConfig) {
+                if ($command === sprintf('git show %s', sprintf('%s:%s', escapeshellarg($identifier), $repoConfig['filename']))) {
+                    $output = '{"name": "foo"}';
+                } elseif (false !== strpos($command, 'git log')) {
+                    $date = new \DateTime(null, new \DateTimeZone('UTC'));
+                    $output = $date->getTimestamp();
+                }
+
+                return 0;
+            }));
+
+        /* @var IOInterface $io */
+        /* @var ProcessExecutor $process */
+
+        $gitDriver = new GitDriver($repoConfig, $io, $this->config, $process, null);
+        $gitDriver->initialize();
+        $composer1 = $gitDriver->getComposerInformation($identifier);
+        $composer2 = $gitDriver->getComposerInformation($identifier);
+
+        $this->assertNotNull($composer1);
+        $this->assertNotNull($composer2);
+        $this->assertSame($composer1, $composer2);
+    }
+
+    /**
+     * @dataProvider getAssetTypes
+     *
+     * @param string $type
+     * @param string $filename
+     */
+    public function testPublicRepositoryWithFilesystemCache($type, $filename)
+    {
+        $repoUrl = 'https://github.com/fxpio/composer-asset-plugin.git';
+        $identifier = '92bebbfdcde75ef2368317830e54b605bc938123';
+        $repoConfig = array(
+            'url' => $repoUrl,
+            'asset-type' => $type,
+            'filename' => $filename,
+            'asset-repository-manager' => $this->assetRepositoryManager,
+        );
+        $io = $this->getMockBuilder('Composer\IO\IOInterface')->getMock();
+        $process = $this->getMockBuilder('Composer\Util\ProcessExecutor')->getMock();
+        $process->expects($this->any())
+            ->method('splitLines')
+            ->will($this->returnValue(array()));
+        $process->expects($this->any())
+            ->method('execute')
+            ->will($this->returnCallback(function ($command, &$output = null) use ($identifier, $repoConfig) {
+                if ($command === sprintf('git show %s', sprintf('%s:%s', escapeshellarg($identifier), $repoConfig['filename']))) {
+                    $output = '{"name": "foo"}';
+                } elseif (false !== strpos($command, 'git log')) {
+                    $date = new \DateTime(null, new \DateTimeZone('UTC'));
+                    $output = $date->getTimestamp();
+                }
+
+                return 0;
+            }));
+
+        /* @var IOInterface $io */
+        /* @var ProcessExecutor $process */
+
+        $gitDriver1 = new GitDriver($repoConfig, $io, $this->config, $process, null);
+        $gitDriver2 = new GitDriver($repoConfig, $io, $this->config, $process, null);
+        $gitDriver1->initialize();
+        $gitDriver2->initialize();
+        $composer1 = $gitDriver1->getComposerInformation($identifier);
+        $composer2 = $gitDriver2->getComposerInformation($identifier);
+
+        $this->assertNotNull($composer1);
+        $this->assertNotNull($composer2);
+        $this->assertSame($composer1, $composer2);
+    }
+
+    protected function setAttribute($object, $attribute, $value)
+    {
+        $attr = new \ReflectionProperty($object, $attribute);
+        $attr->setAccessible(true);
+        $attr->setValue($object, $value);
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Repository/Vcs/GitHubDriverTest.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Repository/Vcs/GitHubDriverTest.php
new file mode 100644 (file)
index 0000000..32836f7
--- /dev/null
@@ -0,0 +1,1212 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Tests\Repository\Vcs;
+
+use Composer\Cache;
+use Composer\Config;
+use Composer\Config\ConfigSourceInterface;
+use Composer\Downloader\TransportException;
+use Composer\IO\IOInterface;
+use Composer\Util\Filesystem;
+use Composer\Util\ProcessExecutor;
+use Composer\Util\RemoteFilesystem;
+use Fxp\Composer\AssetPlugin\Repository\AssetRepositoryManager;
+use Fxp\Composer\AssetPlugin\Repository\Vcs\GitHubDriver;
+
+/**
+ * Tests of vcs github repository.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class GitHubDriverTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var Config
+     */
+    private $config;
+
+    /**
+     * @var AssetRepositoryManager|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $assetRepositoryManager;
+
+    public function setUp()
+    {
+        $this->config = new Config();
+        $this->config->merge(array(
+            'config' => array(
+                'home' => sys_get_temp_dir().'/composer-test',
+                'cache-repo-dir' => sys_get_temp_dir().'/composer-test-cache',
+            ),
+        ));
+
+        $assetConfig = new \Fxp\Composer\AssetPlugin\Config\Config(array());
+
+        $this->assetRepositoryManager = $this->getMockBuilder(AssetRepositoryManager::class)
+            ->disableOriginalConstructor()->getMock();
+        $this->assetRepositoryManager->expects($this->any())
+            ->method('getConfig')
+            ->willReturn($assetConfig);
+    }
+
+    public function tearDown()
+    {
+        $fs = new Filesystem();
+        $fs->removeDirectory(sys_get_temp_dir().'/composer-test');
+        $fs->removeDirectory(sys_get_temp_dir().'/composer-test-cache');
+    }
+
+    public function getAssetTypes()
+    {
+        return array(
+            array('npm', 'package.json'),
+            array('bower', 'bower.json'),
+        );
+    }
+
+    /**
+     * @dataProvider getAssetTypes
+     *
+     * @param string $type
+     * @param string $filename
+     */
+    public function testPrivateRepository($type, $filename)
+    {
+        $repoUrl = 'http://github.com/composer-test/repo-name';
+        $repoApiUrl = 'https://api.github.com/repos/composer-test/repo-name';
+        $repoSshUrl = 'git@github.com:composer-test/repo-name.git';
+        $packageName = $type.'-asset/repo-name';
+        $identifier = 'v0.0.0';
+        $sha = 'SOMESHA';
+
+        $io = $this->getMockBuilder('Composer\IO\IOInterface')->getMock();
+        $io->expects($this->any())
+            ->method('isInteractive')
+            ->will($this->returnValue(true));
+
+        $remoteFilesystem = $this->getMockBuilder('Composer\Util\RemoteFilesystem')
+            ->setConstructorArgs(array($io))
+            ->getMock();
+
+        $process = $this->getMockBuilder('Composer\Util\ProcessExecutor')->getMock();
+        $process->expects($this->any())
+            ->method('execute')
+            ->will($this->returnValue(1));
+
+        $remoteFilesystem->expects($this->at(0))
+            ->method('getContents')
+            ->with($this->equalTo('github.com'), $this->equalTo($repoApiUrl), $this->equalTo(false))
+            ->will($this->throwException(new TransportException('HTTP/1.1 404 Not Found', 404)));
+
+        $io->expects($this->once())
+            ->method('askAndHideAnswer')
+            ->with($this->equalTo('Token (hidden): '))
+            ->will($this->returnValue('sometoken'));
+
+        $io->expects($this->any())
+            ->method('setAuthentication')
+            ->with($this->equalTo('github.com'), $this->matchesRegularExpression('{sometoken|abcdef}'), $this->matchesRegularExpression('{x-oauth-basic}'));
+
+        $remoteFilesystem->expects($this->at(1))
+            ->method('getContents')
+            ->with($this->equalTo('github.com'), $this->equalTo('https://github.com/composer-test/repo-name'), $this->equalTo(false))
+            ->will($this->returnValue(''));
+
+        $remoteFilesystem->expects($this->at(2))
+            ->method('getContents')
+            ->will($this->returnValue(''));
+
+        $remoteFilesystem->expects($this->at(3))
+            ->method('getContents')
+            ->with($this->equalTo('github.com'), $this->equalTo($repoApiUrl), $this->equalTo(false))
+            ->will($this->throwException(new TransportException('HTTP/1.1 404 Not Found', 404)));
+
+        $remoteFilesystem->expects($this->at(4))
+            ->method('getContents')
+            ->with($this->equalTo('github.com'), $this->equalTo('https://api.github.com/'), $this->equalTo(false))
+            ->will($this->returnValue('{}'));
+
+        $remoteFilesystem->expects($this->at(5))
+            ->method('getContents')
+            ->with($this->equalTo('github.com'), $this->equalTo($repoApiUrl), $this->equalTo(false))
+            ->will($this->returnValue($this->createJsonComposer(array('master_branch' => 'test_master', 'private' => true))));
+
+        $configSource = $this->getMockBuilder('Composer\Config\ConfigSourceInterface')->getMock();
+        $authConfigSource = $this->getMockBuilder('Composer\Config\ConfigSourceInterface')->getMock();
+
+        /* @var ConfigSourceInterface $configSource */
+        /* @var ConfigSourceInterface $authConfigSource */
+        /* @var ProcessExecutor $process */
+        /* @var RemoteFilesystem $remoteFilesystem */
+        /* @var IOInterface $io */
+
+        $this->config->setConfigSource($configSource);
+        $this->config->setAuthConfigSource($authConfigSource);
+
+        $repoConfig = array(
+            'url' => $repoUrl,
+            'asset-type' => $type,
+            'asset-repository-manager' => $this->assetRepositoryManager,
+            'filename' => $filename,
+            'package-name' => $packageName,
+        );
+
+        $gitHubDriver = new GitHubDriver($repoConfig, $io, $this->config, $process, $remoteFilesystem);
+        $gitHubDriver->initialize();
+        $this->setAttribute($gitHubDriver, 'tags', array($identifier => $sha));
+
+        $this->assertEquals('test_master', $gitHubDriver->getRootIdentifier());
+
+        $dist = $gitHubDriver->getDist($sha);
+        $this->assertEquals('zip', $dist['type']);
+        $this->assertEquals('https://api.github.com/repos/composer-test/repo-name/zipball/SOMESHA', $dist['url']);
+        $this->assertEquals('SOMESHA', $dist['reference']);
+
+        $source = $gitHubDriver->getSource($sha);
+        $this->assertEquals('git', $source['type']);
+        $this->assertEquals($repoSshUrl, $source['url']);
+        $this->assertEquals('SOMESHA', $source['reference']);
+    }
+
+    /**
+     * @dataProvider getAssetTypes
+     *
+     * @param string $type
+     * @param string $filename
+     */
+    public function testPublicRepository($type, $filename)
+    {
+        $repoUrl = 'http://github.com/composer-test/repo-name';
+        $repoApiUrl = 'https://api.github.com/repos/composer-test/repo-name';
+        $packageName = $type.'-asset/repo-name';
+        $identifier = 'v0.0.0';
+        $sha = 'SOMESHA';
+
+        $io = $this->getMockBuilder('Composer\IO\IOInterface')->getMock();
+        $io->expects($this->any())
+            ->method('isInteractive')
+            ->will($this->returnValue(true));
+
+        $remoteFilesystem = $this->getMockBuilder('Composer\Util\RemoteFilesystem')
+            ->setConstructorArgs(array($io))
+            ->getMock();
+
+        $remoteFilesystem->expects($this->at(0))
+            ->method('getContents')
+            ->with($this->equalTo('github.com'), $this->equalTo($repoApiUrl), $this->equalTo(false))
+            ->will($this->returnValue($this->createJsonComposer(array('master_branch' => 'test_master'))));
+
+        $repoConfig = array(
+            'url' => $repoUrl,
+            'asset-type' => $type,
+            'asset-repository-manager' => $this->assetRepositoryManager,
+            'filename' => $filename,
+            'package-name' => $packageName,
+        );
+        $repoUrl = 'https://github.com/composer-test/repo-name.git';
+
+        /* @var IOInterface $io */
+        /* @var RemoteFilesystem $remoteFilesystem */
+
+        $gitHubDriver = new GitHubDriver($repoConfig, $io, $this->config, null, $remoteFilesystem);
+        $gitHubDriver->initialize();
+        $this->setAttribute($gitHubDriver, 'tags', array($identifier => $sha));
+
+        $this->assertEquals('test_master', $gitHubDriver->getRootIdentifier());
+
+        $dist = $gitHubDriver->getDist($sha);
+        $this->assertEquals('zip', $dist['type']);
+        $this->assertEquals('https://api.github.com/repos/composer-test/repo-name/zipball/SOMESHA', $dist['url']);
+        $this->assertEquals($sha, $dist['reference']);
+
+        $source = $gitHubDriver->getSource($sha);
+        $this->assertEquals('git', $source['type']);
+        $this->assertEquals($repoUrl, $source['url']);
+        $this->assertEquals($sha, $source['reference']);
+    }
+
+    /**
+     * @dataProvider getAssetTypes
+     *
+     * @param string $type
+     * @param string $filename
+     */
+    public function testPublicRepository2($type, $filename)
+    {
+        $repoUrl = 'http://github.com/composer-test/repo-name';
+        $repoApiUrl = 'https://api.github.com/repos/composer-test/repo-name';
+        $packageName = $type.'-asset/repo-name';
+        $identifier = 'feature/3.2-foo';
+        $sha = 'SOMESHA';
+
+        $io = $this->getMockBuilder('Composer\IO\IOInterface')->getMock();
+        $io->expects($this->any())
+            ->method('isInteractive')
+            ->will($this->returnValue(true));
+
+        $remoteFilesystem = $this->getMockBuilder('Composer\Util\RemoteFilesystem')
+            ->setConstructorArgs(array($io))
+            ->getMock();
+
+        $remoteFilesystem->expects($this->at(0))
+            ->method('getContents')
+            ->with($this->equalTo('github.com'), $this->equalTo($repoApiUrl), $this->equalTo(false))
+            ->will($this->returnValue($this->createJsonComposer(array('master_branch' => 'test_master'))));
+
+        $remoteFilesystem->expects($this->at(1))
+            ->method('getContents')
+            ->with($this->equalTo('github.com'), $this->equalTo('https://api.github.com/repos/composer-test/repo-name/contents/'.$filename.'?ref=feature%2F3.2-foo'), $this->equalTo(false))
+            ->will($this->returnValue('{"encoding":"base64","content":"'.base64_encode('{"support": {"source": "'.$repoUrl.'" }}').'"}'));
+
+        $remoteFilesystem->expects($this->at(2))
+            ->method('getContents')
+            ->with($this->equalTo('github.com'), $this->equalTo('https://api.github.com/repos/composer-test/repo-name/commits/feature%2F3.2-foo'), $this->equalTo(false))
+            ->will($this->returnValue('{"commit": {"committer":{ "date": "2012-09-10"}}}'));
+
+        $repoConfig = array(
+            'url' => $repoUrl,
+            'asset-type' => $type,
+            'asset-repository-manager' => $this->assetRepositoryManager,
+            'filename' => $filename,
+            'package-name' => $packageName,
+        );
+        $repoUrl = 'https://github.com/composer-test/repo-name.git';
+
+        /* @var IOInterface $io */
+        /* @var RemoteFilesystem $remoteFilesystem */
+
+        $gitHubDriver = new GitHubDriver($repoConfig, $io, $this->config, null, $remoteFilesystem);
+        $gitHubDriver->initialize();
+        $this->setAttribute($gitHubDriver, 'tags', array($identifier => $sha));
+
+        $this->assertEquals('test_master', $gitHubDriver->getRootIdentifier());
+
+        $dist = $gitHubDriver->getDist($sha);
+        $this->assertEquals('zip', $dist['type']);
+        $this->assertEquals('https://api.github.com/repos/composer-test/repo-name/zipball/SOMESHA', $dist['url']);
+        $this->assertEquals($sha, $dist['reference']);
+
+        $source = $gitHubDriver->getSource($sha);
+        $this->assertEquals('git', $source['type']);
+        $this->assertEquals($repoUrl, $source['url']);
+        $this->assertEquals($sha, $source['reference']);
+
+        $gitHubDriver->getComposerInformation($identifier);
+    }
+
+    /**
+     * @dataProvider getAssetTypes
+     *
+     * @param string $type
+     * @param string $filename
+     */
+    public function testPrivateRepositoryNoInteraction($type, $filename)
+    {
+        $repoUrl = 'http://github.com/composer-test/repo-name';
+        $repoApiUrl = 'https://api.github.com/repos/composer-test/repo-name';
+        $repoSshUrl = 'git@github.com:composer-test/repo-name.git';
+        $packageName = $type.'-asset/repo-name';
+        $identifier = 'v0.0.0';
+        $sha = 'SOMESHA';
+
+        $process = $this->getMockBuilder('Composer\Util\ProcessExecutor')
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $io = $this->getMockBuilder('Composer\IO\IOInterface')->getMock();
+        $io->expects($this->any())
+            ->method('isInteractive')
+            ->will($this->returnValue(false));
+
+        $remoteFilesystem = $this->getMockBuilder('Composer\Util\RemoteFilesystem')
+            ->setConstructorArgs(array($io))
+            ->getMock();
+
+        $remoteFilesystem->expects($this->at(0))
+            ->method('getContents')
+            ->with($this->equalTo('github.com'), $this->equalTo($repoApiUrl), $this->equalTo(false))
+            ->will($this->throwException(new TransportException('HTTP/1.1 404 Not Found', 404)));
+
+        $remoteFilesystem->expects($this->at(1))
+            ->method('getContents')
+            ->with($this->equalTo('github.com'), $this->equalTo('https://github.com/composer-test/repo-name'), $this->equalTo(false))
+            ->will($this->returnValue(''));
+
+        $remoteFilesystem->expects($this->at(2))
+            ->method('getContents')
+            ->will($this->returnValue(''));
+
+        $remoteFilesystem->expects($this->at(3))
+            ->method('getContents')
+            ->with($this->equalTo('github.com'), $this->equalTo($repoApiUrl), $this->equalTo(false))
+            ->will($this->throwException(new TransportException('HTTP/1.1 404 Not Found', 404)));
+
+        // clean local clone if present
+        $fs = new Filesystem();
+        $fs->removeDirectory(sys_get_temp_dir().'/composer-test');
+
+        $process->expects($this->at(0))
+            ->method('execute')
+            ->with($this->equalTo('git config github.accesstoken'))
+            ->will($this->returnValue(1));
+
+        $process->expects($this->at(1))
+            ->method('execute')
+            ->with($this->stringContains($repoSshUrl))
+            ->will($this->returnValue(0));
+
+        $process->expects($this->at(2))
+            ->method('execute')
+            ->with($this->stringContains('git show-ref --tags'));
+
+        $process->expects($this->at(3))
+            ->method('splitLines')
+            ->will($this->returnValue(array($sha.' refs/tags/'.$identifier)));
+
+        $process->expects($this->at(4))
+            ->method('execute')
+            ->with($this->stringContains('git branch --no-color --no-abbrev -v'));
+
+        $process->expects($this->at(5))
+            ->method('splitLines')
+            ->will($this->returnValue(array('  test_master     edf93f1fccaebd8764383dc12016d0a1a9672d89 Fix test & behavior')));
+
+        $process->expects($this->at(6))
+            ->method('execute')
+            ->with($this->stringContains('git branch --no-color'));
+
+        $process->expects($this->at(7))
+            ->method('splitLines')
+            ->will($this->returnValue(array('* test_master')));
+
+        $repoConfig = array(
+            'url' => $repoUrl,
+            'asset-type' => $type,
+            'asset-repository-manager' => $this->assetRepositoryManager,
+            'filename' => $filename,
+            'package-name' => $packageName,
+        );
+
+        /* @var IOInterface $io */
+        /* @var RemoteFilesystem $remoteFilesystem */
+        /* @var ProcessExecutor $process */
+
+        $gitHubDriver = new GitHubDriver($repoConfig, $io, $this->config, $process, $remoteFilesystem);
+        $gitHubDriver->initialize();
+
+        $this->assertEquals('test_master', $gitHubDriver->getRootIdentifier());
+
+        $dist = $gitHubDriver->getDist($sha);
+        $this->assertEquals('zip', $dist['type']);
+        $this->assertEquals('https://api.github.com/repos/composer-test/repo-name/zipball/SOMESHA', $dist['url']);
+        $this->assertEquals($sha, $dist['reference']);
+
+        $source = $gitHubDriver->getSource($identifier);
+        $this->assertEquals('git', $source['type']);
+        $this->assertEquals($repoSshUrl, $source['url']);
+        $this->assertEquals($identifier, $source['reference']);
+
+        $source = $gitHubDriver->getSource($sha);
+        $this->assertEquals('git', $source['type']);
+        $this->assertEquals($repoSshUrl, $source['url']);
+        $this->assertEquals($sha, $source['reference']);
+    }
+
+    /**
+     * @dataProvider getAssetTypes
+     *
+     * @param string $type
+     * @param string $filename
+     */
+    public function testGetComposerInformationWithGitDriver($type, $filename)
+    {
+        $repoUrl = 'https://github.com/composer-test/repo-name';
+        $identifier = 'v0.0.0';
+
+        $io = $this->getMockBuilder('Composer\IO\IOInterface')->getMock();
+        $io->expects($this->any())
+            ->method('isInteractive')
+            ->will($this->returnValue(true));
+
+        $repoConfig = array(
+            'url' => $repoUrl,
+            'asset-type' => $type,
+            'asset-repository-manager' => $this->assetRepositoryManager,
+            'filename' => $filename,
+            'no-api' => true,
+        );
+
+        $process = $this->getMockBuilder('Composer\Util\ProcessExecutor')->getMock();
+        $process->expects($this->any())
+            ->method('splitLines')
+            ->will($this->returnValue(array()));
+        $process->expects($this->any())
+            ->method('execute')
+            ->will($this->returnCallback(function () {
+                return 0;
+            }));
+
+        /* @var IOInterface $io */
+        /* @var ProcessExecutor $process */
+
+        $gitHubDriver = new GitHubDriver($repoConfig, $io, $this->config, $process, null);
+        $gitHubDriver->initialize();
+
+        $validEmpty = array(
+            '_nonexistent_package' => true,
+        );
+
+        $this->assertSame($validEmpty, $gitHubDriver->getComposerInformation($identifier));
+    }
+
+    /**
+     * @dataProvider getAssetTypes
+     *
+     * @param string $type
+     * @param string $filename
+     */
+    public function testGetComposerInformationWithCodeCache($type, $filename)
+    {
+        $repoUrl = 'http://github.com/composer-test/repo-name';
+        $repoApiUrl = 'https://api.github.com/repos/composer-test/repo-name';
+        $packageName = $type.'-asset/repo-name';
+        $identifier = 'dev-master';
+        $sha = '92bebbfdcde75ef2368317830e54b605bc938123';
+
+        $io = $this->getMockBuilder('Composer\IO\IOInterface')->getMock();
+        $io->expects($this->any())
+            ->method('isInteractive')
+            ->will($this->returnValue(true));
+
+        /* @var IOInterface $io */
+        /* @var RemoteFilesystem $remoteFilesystem */
+        $remoteFilesystem = $this->createMockRremoteFilesystem($io, $repoApiUrl, $filename, $sha, false);
+        $repoConfig = array(
+            'url' => $repoUrl,
+            'asset-type' => $type,
+            'asset-repository-manager' => $this->assetRepositoryManager,
+            'filename' => $filename,
+            'package-name' => $packageName,
+        );
+
+        $gitHubDriver = new GitHubDriver($repoConfig, $io, $this->config, null, $remoteFilesystem);
+        $gitHubDriver->initialize();
+        $this->setAttribute($gitHubDriver, 'tags', array($identifier => $sha));
+        $this->setAttribute($gitHubDriver, 'hasIssues', true);
+
+        $composer1 = $gitHubDriver->getComposerInformation($sha);
+        $composer2 = $gitHubDriver->getComposerInformation($sha);
+
+        $this->assertSame($composer1, $composer2);
+    }
+
+    /**
+     * @dataProvider getAssetTypes
+     *
+     * @param string $type
+     * @param string $filename
+     */
+    public function testGetComposerInformationWithFilesystemCache($type, $filename)
+    {
+        $repoUrl = 'http://github.com/composer-test/repo-name';
+        $repoApiUrl = 'https://api.github.com/repos/composer-test/repo-name';
+        $packageName = $type.'-asset/repo-name';
+        $identifier = 'dev-master';
+        $sha = '92bebbfdcde75ef2368317830e54b605bc938123';
+
+        $io = $this->getMockBuilder('Composer\IO\IOInterface')->getMock();
+        $io->expects($this->any())
+            ->method('isInteractive')
+            ->will($this->returnValue(true));
+
+        /* @var IOInterface $io */
+        /* @var RemoteFilesystem $remoteFilesystem1 */
+        $remoteFilesystem1 = $this->createMockRremoteFilesystem($io, $repoApiUrl, $filename, $sha, false);
+        /* @var RemoteFilesystem $remoteFilesystem2 */
+        $remoteFilesystem2 = $this->createMockRremoteFilesystem($io, $repoApiUrl, $filename, $sha, true);
+        $repoConfig = array(
+            'url' => $repoUrl,
+            'asset-type' => $type,
+            'asset-repository-manager' => $this->assetRepositoryManager,
+            'filename' => $filename,
+            'package-name' => $packageName,
+        );
+
+        $gitHubDriver1 = new GitHubDriver($repoConfig, $io, $this->config, null, $remoteFilesystem1);
+        $gitHubDriver2 = new GitHubDriver($repoConfig, $io, $this->config, null, $remoteFilesystem2);
+        $gitHubDriver1->initialize();
+        $gitHubDriver2->initialize();
+        $this->setAttribute($gitHubDriver1, 'tags', array($identifier => $sha));
+        $this->setAttribute($gitHubDriver1, 'hasIssues', true);
+        $this->setAttribute($gitHubDriver2, 'tags', array($identifier => $sha));
+        $this->setAttribute($gitHubDriver2, 'hasIssues', true);
+
+        $composer1 = $gitHubDriver1->getComposerInformation($sha);
+        $composer2 = $gitHubDriver2->getComposerInformation($sha);
+
+        $this->assertSame($composer1, $composer2);
+    }
+
+    /**
+     * @dataProvider getAssetTypes
+     *
+     * @param string $type
+     * @param string $filename
+     */
+    public function testGetComposerInformationWithEmptyContent($type, $filename)
+    {
+        $repoUrl = 'http://github.com/composer-test/repo-name';
+        $repoApiUrl = 'https://api.github.com/repos/composer-test/repo-name';
+        $packageName = $type.'-asset/repo-name';
+        $identifier = 'v0.0.0';
+
+        $io = $this->getMockBuilder('Composer\IO\IOInterface')->getMock();
+
+        $remoteFilesystem = $this->getMockBuilder('Composer\Util\RemoteFilesystem')
+            ->setConstructorArgs(array($io))
+            ->getMock();
+
+        $remoteFilesystem->expects($this->at(0))
+            ->method('getContents')
+            ->with($this->equalTo('github.com'), $this->equalTo($repoApiUrl), $this->equalTo(false))
+            ->will($this->returnValue($this->createJsonComposer(array('master_branch' => 'test_master'))));
+
+        $remoteFilesystem->expects($this->at(1))
+            ->method('getContents')
+            ->with($this->equalTo('github.com'), $this->equalTo('https://api.github.com/repos/composer-test/repo-name/contents/'.$filename.'?ref='.$identifier), $this->equalTo(false))
+            ->will($this->throwException(new TransportException('Not Found', 404)));
+        $remoteFilesystem->expects($this->at(2))
+            ->method('getContents')
+            ->with($this->equalTo('github.com'), $this->equalTo('https://api.github.com/repos/composer-test/repo-name/contents/'.$filename.'?ref='.$identifier), $this->equalTo(false))
+            ->will($this->throwException(new TransportException('Not Found', 404)));
+
+        $repoConfig = array(
+            'url' => $repoUrl,
+            'asset-type' => $type,
+            'asset-repository-manager' => $this->assetRepositoryManager,
+            'filename' => $filename,
+            'package-name' => $packageName,
+        );
+
+        /* @var IOInterface $io */
+        /* @var RemoteFilesystem $remoteFilesystem */
+
+        $gitHubDriver = new GitHubDriver($repoConfig, $io, $this->config, null, $remoteFilesystem);
+        $gitHubDriver->initialize();
+
+        $validEmpty = array(
+            '_nonexistent_package' => true,
+        );
+
+        $this->assertSame($validEmpty, $gitHubDriver->getComposerInformation($identifier));
+    }
+
+    /**
+     * @dataProvider getAssetTypes
+     *
+     * @param string $type
+     * @param string $filename
+     *
+     * @expectedException \RuntimeException
+     */
+    public function testGetComposerInformationWithRuntimeException($type, $filename)
+    {
+        $repoUrl = 'http://github.com/composer-test/repo-name';
+        $repoApiUrl = 'https://api.github.com/repos/composer-test/repo-name';
+        $packageName = $type.'-asset/repo-name';
+        $identifier = 'v0.0.0';
+
+        $io = $this->getMockBuilder('Composer\IO\IOInterface')->getMock();
+
+        $remoteFilesystem = $this->getMockBuilder('Composer\Util\RemoteFilesystem')
+            ->setConstructorArgs(array($io))
+            ->getMock();
+
+        $remoteFilesystem->expects($this->at(0))
+            ->method('getContents')
+            ->with($this->equalTo('github.com'), $this->equalTo($repoApiUrl), $this->equalTo(false))
+            ->will($this->returnValue($this->createJsonComposer(array('master_branch' => 'test_master'))));
+
+        $remoteFilesystem->expects($this->at(1))
+            ->method('getContents')
+            ->with($this->equalTo('github.com'), $this->equalTo('https://api.github.com/repos/composer-test/repo-name/contents/'.$filename.'?ref='.$identifier), $this->equalTo(false))
+            ->will($this->returnValue('{"encoding":"base64","content":""}'));
+
+        $repoConfig = array(
+            'url' => $repoUrl,
+            'asset-type' => $type,
+            'asset-repository-manager' => $this->assetRepositoryManager,
+            'filename' => $filename,
+            'package-name' => $packageName,
+        );
+
+        /* @var IOInterface $io */
+        /* @var RemoteFilesystem $remoteFilesystem */
+
+        $gitHubDriver = new GitHubDriver($repoConfig, $io, $this->config, null, $remoteFilesystem);
+        $gitHubDriver->initialize();
+
+        $gitHubDriver->getComposerInformation($identifier);
+    }
+
+    /**
+     * @dataProvider getAssetTypes
+     *
+     * @param string $type
+     * @param string $filename
+     *
+     * @expectedException \RuntimeException
+     */
+    public function testGetComposerInformationWithTransportException($type, $filename)
+    {
+        $repoUrl = 'http://github.com/composer-test/repo-name';
+        $repoApiUrl = 'https://api.github.com/repos/composer-test/repo-name';
+        $packageName = $type.'-asset/repo-name';
+        $identifier = 'v0.0.0';
+
+        $io = $this->getMockBuilder('Composer\IO\IOInterface')->getMock();
+
+        $remoteFilesystem = $this->getMockBuilder('Composer\Util\RemoteFilesystem')
+            ->setConstructorArgs(array($io))
+            ->getMock();
+
+        $remoteFilesystem->expects($this->at(0))
+            ->method('getContents')
+            ->with($this->equalTo('github.com'), $this->equalTo($repoApiUrl), $this->equalTo(false))
+            ->will($this->returnValue($this->createJsonComposer(array('master_branch' => 'test_master'))));
+
+        $remoteFilesystem->expects($this->at(1))
+            ->method('getContents')
+            ->with($this->equalTo('github.com'), $this->equalTo('https://api.github.com/repos/composer-test/repo-name/contents/'.$filename.'?ref='.$identifier), $this->equalTo(false))
+            ->will($this->throwException(new TransportException('Mock exception code 404', 404)));
+
+        $remoteFilesystem->expects($this->at(2))
+            ->method('getContents')
+            ->with($this->equalTo('github.com'), $this->equalTo('https://api.github.com/repos/composer-test/repo-name/contents/'.$filename.'?ref='.$identifier), $this->equalTo(false))
+            ->will($this->throwException(new TransportException('Mock exception code 400', 400)));
+
+        $repoConfig = array(
+            'url' => $repoUrl,
+            'asset-type' => $type,
+            'asset-repository-manager' => $this->assetRepositoryManager,
+            'filename' => $filename,
+            'package-name' => $packageName,
+        );
+
+        /* @var IOInterface $io */
+        /* @var RemoteFilesystem $remoteFilesystem */
+
+        $gitHubDriver = new GitHubDriver($repoConfig, $io, $this->config, null, $remoteFilesystem);
+        $gitHubDriver->initialize();
+
+        $gitHubDriver->getComposerInformation($identifier);
+    }
+
+    /**
+     * @dataProvider getAssetTypes
+     *
+     * @param string $type
+     * @param string $filename
+     */
+    public function testRedirectUrlRepository($type, $filename)
+    {
+        $repoUrl = 'http://github.com/composer-test/repo-name';
+        $repoApiUrl = 'https://api.github.com/repos/composer-test/repo-name';
+        $packageName = $type.'-asset/repo-name';
+        $identifier = 'v0.0.0';
+        $sha = 'SOMESHA';
+
+        $io = $this->getMockBuilder('Composer\IO\IOInterface')->getMock();
+        $io->expects($this->any())
+            ->method('isInteractive')
+            ->will($this->returnValue(true));
+
+        $remoteFilesystem = $this->getMockBuilder('Composer\Util\RemoteFilesystem')
+            ->setConstructorArgs(array($io))
+            ->getMock();
+
+        $remoteFilesystem->expects($this->at(0))
+            ->method('getContents')
+            ->with($this->equalTo('github.com'), $this->equalTo($repoApiUrl), $this->equalTo(false))
+            ->will($this->throwException(new TransportException('HTTP/1.1 404 Not Found', 404)));
+
+        $remoteFilesystem->expects($this->at(1))
+            ->method('getContents')
+            ->with($this->equalTo('github.com'), $this->equalTo('https://github.com/composer-test/repo-name'), $this->equalTo(false))
+            ->will($this->returnValue(''));
+
+        $remoteFilesystem->expects($this->at(2))
+            ->method('getLastHeaders')
+            ->will($this->returnValue(array(
+                'HTTP/1.1 301 Moved Permanently',
+                'Header-parameter: test',
+                'Location: '.$repoUrl.'-new',
+            )));
+
+        $remoteFilesystem->expects($this->at(3))
+            ->method('getContents')
+            ->with($this->equalTo('github.com'), $this->equalTo($repoApiUrl.'-new'), $this->equalTo(false))
+            ->will($this->returnValue($this->createJsonComposer(array('master_branch' => 'test_master'))));
+
+        $repoConfig = array(
+            'url' => $repoUrl,
+            'asset-type' => $type,
+            'asset-repository-manager' => $this->assetRepositoryManager,
+            'filename' => $filename,
+            'package-name' => $packageName,
+        );
+        $repoUrl = 'https://github.com/composer-test/repo-name.git';
+
+        /* @var IOInterface $io */
+        /* @var RemoteFilesystem $remoteFilesystem */
+
+        $gitHubDriver = new GitHubDriver($repoConfig, $io, $this->config, null, $remoteFilesystem);
+        $gitHubDriver->initialize();
+        $this->setAttribute($gitHubDriver, 'tags', array($identifier => $sha));
+
+        $this->assertEquals('test_master', $gitHubDriver->getRootIdentifier());
+
+        $dist = $gitHubDriver->getDist($sha);
+        $this->assertEquals('zip', $dist['type']);
+        $this->assertEquals('https://api.github.com/repos/composer-test/repo-name/zipball/SOMESHA', $dist['url']);
+        $this->assertEquals($sha, $dist['reference']);
+
+        $source = $gitHubDriver->getSource($sha);
+        $this->assertEquals('git', $source['type']);
+        $this->assertEquals($repoUrl, $source['url']);
+        $this->assertEquals($sha, $source['reference']);
+    }
+
+    /**
+     * @dataProvider getAssetTypes
+     *
+     * @param string $type
+     * @param string $filename
+     *
+     * @expectedException \RuntimeException
+     */
+    public function testRedirectUrlWithNonexistentRepository($type, $filename)
+    {
+        $repoUrl = 'http://github.com/composer-test/repo-name';
+        $repoApiUrl = 'https://api.github.com/repos/composer-test/repo-name';
+        $packageName = $type.'-asset/repo-name';
+        $identifier = 'v0.0.0';
+
+        $io = $this->getMockBuilder('Composer\IO\IOInterface')->getMock();
+        $io->expects($this->any())
+            ->method('isInteractive')
+            ->will($this->returnValue(true));
+
+        $remoteFilesystem = $this->getMockBuilder('Composer\Util\RemoteFilesystem')
+            ->setConstructorArgs(array($io))
+            ->getMock();
+
+        $remoteFilesystem->expects($this->at(0))
+            ->method('getContents')
+            ->with($this->equalTo('github.com'), $this->equalTo($repoApiUrl), $this->equalTo(false))
+            ->will($this->throwException(new TransportException('HTTP/1.1 404 Not Found', 404)));
+
+        $io->expects($this->once())
+            ->method('askAndHideAnswer')
+            ->with($this->equalTo('Token (hidden): '))
+            ->will($this->returnValue('sometoken'));
+
+        $io->expects($this->any())
+            ->method('setAuthentication')
+            ->with($this->equalTo('github.com'), $this->matchesRegularExpression('{sometoken|abcdef}'), $this->matchesRegularExpression('{x-oauth-basic}'));
+
+        $remoteFilesystem->expects($this->at(1))
+            ->method('getContents')
+            ->with($this->equalTo('github.com'), $this->equalTo('https://github.com/composer-test/repo-name'), $this->equalTo(false))
+            ->will($this->throwException(new TransportException('HTTP/1.1 404 Not Found', 404)));
+
+        $remoteFilesystem->expects($this->at(2))
+            ->method('getContents')
+            ->with($this->equalTo('github.com'), $this->equalTo($repoApiUrl), $this->equalTo(false))
+            ->will($this->throwException(new TransportException('HTTP/1.1 404 Not Found', 404)));
+
+        $remoteFilesystem->expects($this->at(3))
+            ->method('getContents')
+            ->with($this->equalTo('github.com'), $this->equalTo('https://api.github.com/'), $this->equalTo(false))
+            ->will($this->returnValue('{}'));
+
+        $remoteFilesystem->expects($this->at(4))
+            ->method('getContents')
+            ->with($this->equalTo('github.com'), $this->equalTo($repoApiUrl), $this->equalTo(false))
+            ->will($this->throwException(new TransportException('HTTP/1.1 404 Not Found', 404)));
+
+        $remoteFilesystem->expects($this->at(5))
+            ->method('getContents')
+            ->with($this->equalTo('github.com'), $this->equalTo($repoApiUrl.'/contents/'.$filename.'?ref='.$identifier), $this->equalTo(false))
+            ->will($this->throwException(new TransportException('HTTP/1.1 404 Not Found', 404)));
+
+        $configSource = $this->getMockBuilder('Composer\Config\ConfigSourceInterface')->getMock();
+        $authConfigSource = $this->getMockBuilder('Composer\Config\ConfigSourceInterface')->getMock();
+
+        /* @var ConfigSourceInterface $configSource */
+        /* @var ConfigSourceInterface $authConfigSource */
+
+        $this->config->setConfigSource($configSource);
+        $this->config->setAuthConfigSource($authConfigSource);
+
+        $repoConfig = array(
+            'url' => $repoUrl,
+            'asset-type' => $type,
+            'asset-repository-manager' => $this->assetRepositoryManager,
+            'filename' => $filename,
+            'package-name' => $packageName,
+        );
+
+        /* @var IOInterface $io */
+        /* @var RemoteFilesystem $remoteFilesystem */
+
+        $gitHubDriver = new GitHubDriver($repoConfig, $io, $this->config, null, $remoteFilesystem);
+        $firstNonexistent = false;
+
+        try {
+            $gitHubDriver->initialize();
+        } catch (TransportException $e) {
+            $firstNonexistent = true;
+        }
+
+        $this->assertTrue($firstNonexistent);
+
+        $gitHubDriver->getComposerInformation($identifier);
+    }
+
+    /**
+     * @dataProvider getAssetTypes
+     *
+     * @param string $type
+     * @param string $filename
+     */
+    public function testRedirectUrlRepositoryWithCache($type, $filename)
+    {
+        $originUrl = 'github.com';
+        $owner = 'composer-test';
+        $repository = 'repo-name';
+        $repoUrl = 'http://'.$originUrl.'/'.$owner.'/'.$repository;
+        $repoApiUrl = 'https://api.github.com/repos/composer-test/repo-name';
+        $repoApiUrlNew = $repoApiUrl.'-new';
+        $packageName = $type.'-asset/repo-name';
+        $identifier = 'v0.0.0';
+        $sha = 'SOMESHA';
+
+        $io = $this->getMockBuilder('Composer\IO\IOInterface')->getMock();
+        $io->expects($this->any())
+            ->method('isInteractive')
+            ->will($this->returnValue(true));
+
+        $remoteFilesystem = $this->getMockBuilder('Composer\Util\RemoteFilesystem')
+            ->setConstructorArgs(array($io))
+            ->getMock();
+
+        $remoteFilesystem->expects($this->at(0))
+            ->method('getContents')
+            ->with($this->equalTo('github.com'), $this->equalTo($repoApiUrlNew), $this->equalTo(false))
+            ->will($this->returnValue($this->createJsonComposer(array('master_branch' => 'test_master'))));
+
+        $repoConfig = array(
+            'url' => $repoUrl,
+            'asset-type' => $type,
+            'asset-repository-manager' => $this->assetRepositoryManager,
+            'filename' => $filename,
+            'package-name' => $packageName,
+        );
+        $repoUrl = 'https://github.com/composer-test/repo-name.git';
+
+        /* @var IOInterface $io */
+        /* @var RemoteFilesystem $remoteFilesystem */
+
+        $cache = new Cache($io, $this->config->get('cache-repo-dir').'/'.$originUrl.'/'.$owner.'/'.$repository);
+        $cache->write('redirect-api', $repoApiUrlNew);
+
+        $gitHubDriver = new GitHubDriver($repoConfig, $io, $this->config, null, $remoteFilesystem);
+        $gitHubDriver->initialize();
+        $this->setAttribute($gitHubDriver, 'tags', array($identifier => $sha));
+
+        $this->assertEquals('test_master', $gitHubDriver->getRootIdentifier());
+
+        $dist = $gitHubDriver->getDist($sha);
+        $this->assertEquals('zip', $dist['type']);
+        $this->assertEquals('https://api.github.com/repos/composer-test/repo-name/zipball/SOMESHA', $dist['url']);
+        $this->assertEquals($sha, $dist['reference']);
+
+        $source = $gitHubDriver->getSource($sha);
+        $this->assertEquals('git', $source['type']);
+        $this->assertEquals($repoUrl, $source['url']);
+        $this->assertEquals($sha, $source['reference']);
+    }
+
+    public function getDataBranches()
+    {
+        $valid1 = array();
+        $git1 = array();
+        $valid2 = array(
+            'master' => '0123456789abcdef0123456789abcdef01234567',
+        );
+        $git2 = array(
+            'master 0123456789abcdef0123456789abcdef01234567 Comment',
+        );
+        $valid3 = array(
+            'gh-pages' => '0123456789abcdef0123456789abcdef01234567',
+        );
+        $git3 = array(
+            'gh-pages 0123456789abcdef0123456789abcdef01234567 Comment',
+        );
+        $valid4 = array(
+            'master' => '0123456789abcdef0123456789abcdef01234567',
+            'gh-pages' => '0123456789abcdef0123456789abcdef01234567',
+        );
+        $git4 = array(
+            'master 0123456789abcdef0123456789abcdef01234567 Comment',
+            'gh-pages 0123456789abcdef0123456789abcdef01234567 Comment',
+        );
+
+        return array(
+            array('npm', 'package.json', $valid1, $git1),
+            array('npm', 'package.json', $valid2, $git2),
+            array('npm', 'package.json', $valid3, $git3),
+            array('npm', 'package.json', $valid4, $git4),
+            array('bower', 'bower.json', $valid1, $git1),
+            array('bower', 'bower.json', $valid2, $git2),
+            array('bower', 'bower.json', $valid3, $git3),
+            array('bower', 'bower.json', $valid4, $git4),
+        );
+    }
+
+    /**
+     * @dataProvider getDataBranches
+     *
+     * @param string $type
+     * @param string $filename
+     * @param array  $branches
+     * @param array  $gitBranches
+     */
+    public function testGetBranchesWithGitDriver($type, $filename, array $branches, array $gitBranches)
+    {
+        $repoUrl = 'https://github.com/composer-test/repo-name';
+
+        $io = $this->getMockBuilder('Composer\IO\IOInterface')->getMock();
+        $io->expects($this->any())
+            ->method('isInteractive')
+            ->will($this->returnValue(true));
+
+        $repoConfig = array(
+            'url' => $repoUrl,
+            'asset-type' => $type,
+            'asset-repository-manager' => $this->assetRepositoryManager,
+            'filename' => $filename,
+            'no-api' => true,
+        );
+
+        $process = $this->getMockBuilder('Composer\Util\ProcessExecutor')->getMock();
+        $process->expects($this->any())
+            ->method('splitLines')
+            ->will($this->returnValue($gitBranches));
+        $process->expects($this->any())
+            ->method('execute')
+            ->will($this->returnCallback(function () {
+                return 0;
+            }));
+
+        /* @var IOInterface $io */
+        /* @var ProcessExecutor $process */
+
+        $gitHubDriver = new GitHubDriver($repoConfig, $io, $this->config, $process, null);
+        $gitHubDriver->initialize();
+
+        $this->assertSame($branches, $gitHubDriver->getBranches());
+    }
+
+    /**
+     * @dataProvider getDataBranches
+     *
+     * @param string $type
+     * @param string $filename
+     * @param array  $branches
+     */
+    public function testGetBranches($type, $filename, array $branches)
+    {
+        $repoUrl = 'http://github.com/composer-test/repo-name';
+        $repoApiUrl = 'https://api.github.com/repos/composer-test/repo-name';
+        $packageName = $type.'-asset/repo-name';
+        $identifier = 'v0.0.0';
+        $sha = 'SOMESHA';
+
+        $io = $this->getMockBuilder('Composer\IO\IOInterface')->getMock();
+        $io->expects($this->any())
+            ->method('isInteractive')
+            ->will($this->returnValue(true));
+
+        $remoteFilesystem = $this->getMockBuilder('Composer\Util\RemoteFilesystem')
+            ->setConstructorArgs(array($io))
+            ->getMock();
+
+        $remoteFilesystem->expects($this->at(0))
+            ->method('getContents')
+            ->with($this->equalTo('github.com'), $this->equalTo($repoApiUrl), $this->equalTo(false))
+            ->will($this->returnValue($this->createJsonComposer(array('master_branch' => 'gh-pages'))));
+
+        $remoteFilesystem->expects($this->any())
+            ->method('getLastHeaders')
+            ->will($this->returnValue(array()));
+
+        $githubBranches = array();
+        foreach ($branches as $branch => $sha) {
+            $githubBranches[] = array(
+                'ref' => 'refs/heads/'.$branch,
+                'object' => array(
+                    'sha' => $sha,
+                ),
+            );
+        }
+
+        $remoteFilesystem->expects($this->at(1))
+            ->method('getContents')
+            ->will($this->returnValue(json_encode($githubBranches)));
+
+        $repoConfig = array(
+            'url' => $repoUrl,
+            'asset-type' => $type,
+            'asset-repository-manager' => $this->assetRepositoryManager,
+            'filename' => $filename,
+            'package-name' => $packageName,
+        );
+
+        /* @var IOInterface $io */
+        /* @var RemoteFilesystem $remoteFilesystem */
+
+        $gitHubDriver = new GitHubDriver($repoConfig, $io, $this->config, null, $remoteFilesystem);
+        $gitHubDriver->initialize();
+        $this->setAttribute($gitHubDriver, 'tags', array($identifier => $sha));
+
+        $this->assertEquals('gh-pages', $gitHubDriver->getRootIdentifier());
+        $this->assertSame($branches, $gitHubDriver->getBranches());
+    }
+
+    /**
+     * @dataProvider getDataBranches
+     *
+     * @param string $type
+     * @param string $filename
+     * @param array  $branches
+     * @param array  $gitBranches
+     */
+    public function testNoApi($type, $filename, array $branches, array $gitBranches)
+    {
+        $repoUrl = 'https://github.com/composer-test/repo-name';
+        $packageName = $type.'-asset/repo-name';
+
+        $io = $this->getMockBuilder('Composer\IO\IOInterface')->getMock();
+        $io->expects($this->any())
+            ->method('isInteractive')
+            ->will($this->returnValue(true));
+
+        $repoConfig = array(
+            'url' => $repoUrl,
+            'asset-type' => $type,
+            'asset-repository-manager' => $this->assetRepositoryManager,
+            'filename' => $filename,
+            'package-name' => $packageName,
+            'vcs-driver-options' => array(
+                'github-no-api' => true,
+            ),
+        );
+
+        $process = $this->getMockBuilder('Composer\Util\ProcessExecutor')->getMock();
+        $process->expects($this->any())
+            ->method('splitLines')
+            ->will($this->returnValue($gitBranches));
+        $process->expects($this->any())
+            ->method('execute')
+            ->will($this->returnCallback(function () {
+                return 0;
+            }));
+
+        /* @var IOInterface $io */
+        /* @var ProcessExecutor $process */
+
+        $gitHubDriver = new GitHubDriver($repoConfig, $io, $this->config, $process, null);
+        $gitHubDriver->initialize();
+
+        $this->assertSame($branches, $gitHubDriver->getBranches());
+    }
+
+    /**
+     * @param object $object
+     * @param string $attribute
+     * @param mixed  $value
+     */
+    protected function setAttribute($object, $attribute, $value)
+    {
+        $attr = new \ReflectionProperty($object, $attribute);
+        $attr->setAccessible(true);
+        $attr->setValue($object, $value);
+    }
+
+    /**
+     * Creates the json composer content.
+     *
+     * @param array  $content The composer content
+     * @param string $name    The name of repository
+     * @param string $login   The username /organization of repository
+     *
+     * @return string The json content
+     */
+    protected function createJsonComposer(array $content, $name = 'repo-name', $login = 'composer-test')
+    {
+        return json_encode(array_merge_recursive($content, array(
+            'name' => $name,
+            'owner' => array(
+                'login' => $login,
+            ),
+        )));
+    }
+
+    /**
+     * @param IOInterface $io
+     * @param string      $repoApiUrl
+     * @param string      $filename
+     * @param string      $sha
+     * @param bool        $forCache
+     *
+     * @return \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected function createMockRremoteFilesystem($io, $repoApiUrl, $filename, $sha, $forCache)
+    {
+        $remoteFilesystem = $this->getMockBuilder('Composer\Util\RemoteFilesystem')
+            ->setConstructorArgs(array($io))
+            ->getMock();
+
+        $remoteFilesystem->expects($this->at(0))
+            ->method('getContents')
+            ->with($this->equalTo('github.com'), $this->equalTo($repoApiUrl), $this->equalTo(false))
+            ->will($this->returnValue($this->createJsonComposer(array('master_branch' => 'test_master'))));
+
+        if ($forCache) {
+            return $remoteFilesystem;
+        }
+
+        $remoteFilesystem->expects($this->at(1))
+            ->method('getContents')
+            ->with($this->equalTo('github.com'), $this->equalTo('https://api.github.com/repos/composer-test/repo-name/contents/'.$filename.'?ref='.$sha), $this->equalTo(false))
+            ->will($this->returnValue('{"encoding":"base64","content":"'.base64_encode('{"support": {}}').'"}'));
+
+        $remoteFilesystem->expects($this->at(2))
+            ->method('getContents')
+            ->with($this->equalTo('github.com'), $this->equalTo('https://api.github.com/repos/composer-test/repo-name/commits/'.$sha), $this->equalTo(false))
+            ->will($this->returnValue('{"commit": {"committer":{ "date": "2012-09-10"}}}'));
+
+        return $remoteFilesystem;
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Repository/Vcs/HgBitbucketDriverTest.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Repository/Vcs/HgBitbucketDriverTest.php
new file mode 100644 (file)
index 0000000..ad5599a
--- /dev/null
@@ -0,0 +1,200 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Tests\Repository\Vcs;
+
+use Composer\Config;
+use Composer\Downloader\TransportException;
+use Composer\IO\IOInterface;
+use Composer\Util\Filesystem;
+use Composer\Util\RemoteFilesystem;
+use Fxp\Composer\AssetPlugin\Repository\Vcs\HgBitbucketDriver;
+
+/**
+ * Tests of vcs mercurial bitbucket repository.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class HgBitbucketDriverTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var Config
+     */
+    private $config;
+
+    public function setUp()
+    {
+        $this->config = new Config();
+        $this->config->merge(array(
+            'config' => array(
+                'home' => sys_get_temp_dir().'/composer-test',
+                'cache-repo-dir' => sys_get_temp_dir().'/composer-test-cache',
+            ),
+        ));
+    }
+
+    public function tearDown()
+    {
+        $fs = new Filesystem();
+        $fs->removeDirectory(sys_get_temp_dir().'/composer-test');
+        $fs->removeDirectory(sys_get_temp_dir().'/composer-test-cache');
+    }
+
+    public function getAssetTypes()
+    {
+        return array(
+            array('npm', 'package.json'),
+            array('bower', 'bower.json'),
+        );
+    }
+
+    /**
+     * @dataProvider getAssetTypes
+     *
+     * @param string $type
+     * @param string $filename
+     */
+    public function testPublicRepositoryWithComposer($type, $filename)
+    {
+        $repoUrl = 'https://bitbucket.org/composer-test/repo-name';
+        $identifier = 'v0.0.0';
+        $sha = 'SOMESHA';
+
+        $io = $this->getMockBuilder('Composer\IO\IOInterface')->getMock();
+        $io->expects($this->any())
+            ->method('isInteractive')
+            ->will($this->returnValue(true));
+
+        $remoteFilesystem = $this->getMockBuilder('Composer\Util\RemoteFilesystem')
+            ->setConstructorArgs(array($io))
+            ->getMock();
+
+        $remoteFilesystem->expects($this->any())
+            ->method('getContents')
+            ->withConsecutive(
+                array(
+                    'bitbucket.org',
+                    'https://api.bitbucket.org/2.0/repositories/composer-test/repo-name?fields=-project%2C-owner',
+                    false,
+                ),
+                array(
+                    'bitbucket.org',
+                    'https://api.bitbucket.org/1.0/repositories/composer-test/repo-name/main-branch',
+                    false,
+                ),
+                array(
+                    'bitbucket.org',
+                    'https://bitbucket.org/composer-test/repo-name/raw/v0.0.0/'.$filename,
+                    false,
+                )
+            )
+            ->willReturnOnConsecutiveCalls(
+                '{"scm":"hg","website":"","has_wiki":false,"name":"repo","links":{"branches":{"href":"https:\/\/api.bitbucket.org\/2.0\/repositories\/composer-test\/repo-name\/refs\/branches"},"tags":{"href":"https:\/\/api.bitbucket.org\/2.0\/repositories\/composer-test\/repo-name\/refs\/tags"},"clone":[{"href":"https:\/\/user@bitbucket.org\/composer-test\/repo-name","name":"https"}],"html":{"href":"https:\/\/bitbucket.org\/composer-test\/repo-name"}},"language":"php","created_on":"2015-02-18T16:22:24.688+00:00","updated_on":"2016-05-17T13:20:21.993+00:00","is_private":true,"has_issues":false}',
+                '{"name": "test_master"}',
+                '{"name": "composer-test/repo-name","description": "test repo","license": "GPL","authors": [{"name": "Name","email": "local@domain.tld"}],"require": {"creator/package": "^1.0"},"require-dev": {"phpunit/phpunit": "~4.8"}}'
+            );
+
+        $repoConfig = array(
+            'url' => $repoUrl,
+            'asset-type' => $type,
+            'filename' => $filename,
+        );
+
+        /* @var IOInterface $io */
+        /* @var RemoteFilesystem $remoteFilesystem */
+
+        $driver = new HgBitbucketDriver($repoConfig, $io, $this->config, null, $remoteFilesystem);
+        $driver->initialize();
+        $this->setAttribute($driver, 'tags', array($identifier => $sha));
+
+        $this->assertEquals('test_master', $driver->getRootIdentifier());
+
+        $dist = $driver->getDist($sha);
+        $this->assertEquals('zip', $dist['type']);
+        $this->assertEquals($this->getScheme($repoUrl).'/get/SOMESHA.zip', $dist['url']);
+        $this->assertEquals($sha, $dist['reference']);
+
+        $source = $driver->getSource($sha);
+        $this->assertEquals('hg', $source['type']);
+        $this->assertEquals($repoUrl, $source['url']);
+        $this->assertEquals($sha, $source['reference']);
+
+        $driver->getComposerInformation($identifier);
+    }
+
+    /**
+     * @dataProvider getAssetTypes
+     *
+     * @param string $type
+     * @param string $filename
+     */
+    public function testPublicRepositoryWithEmptyComposer($type, $filename)
+    {
+        $repoUrl = 'https://bitbucket.org/composer-test/repo-name';
+        $identifier = 'v0.0.0';
+        $io = $this->getMockBuilder('Composer\IO\IOInterface')->getMock();
+
+        $remoteFilesystem = $this->getMockBuilder('Composer\Util\RemoteFilesystem')
+            ->setConstructorArgs(array($io))
+            ->getMock();
+
+        $remoteFilesystem->expects($this->at(0))
+            ->method('getContents')
+            ->with($this->equalTo('bitbucket.org'), $this->equalTo($this->getScheme($repoUrl).'/raw/'.$identifier.'/'.$filename), $this->equalTo(false))
+            ->will($this->throwException(new TransportException('Not Found', 404)));
+
+        $repoConfig = array(
+            'url' => $repoUrl,
+            'asset-type' => $type,
+            'filename' => $filename,
+        );
+
+        /* @var IOInterface $io */
+        /* @var RemoteFilesystem $remoteFilesystem */
+
+        $driver = new HgBitbucketDriver($repoConfig, $io, $this->config, null, $remoteFilesystem);
+        $driver->initialize();
+
+        $validEmpty = array(
+            '_nonexistent_package' => true,
+        );
+
+        $this->assertSame($validEmpty, $driver->getComposerInformation($identifier));
+    }
+
+    /**
+     * @param object $object
+     * @param string $attribute
+     * @param mixed  $value
+     */
+    protected function setAttribute($object, $attribute, $value)
+    {
+        $attr = new \ReflectionProperty($object, $attribute);
+        $attr->setAccessible(true);
+        $attr->setValue($object, $value);
+    }
+
+    /**
+     * Get the url with https or http protocol depending on SSL support.
+     *
+     * @param string $url
+     *
+     * @return string The correct url
+     */
+    protected function getScheme($url)
+    {
+        if (extension_loaded('openssl')) {
+            return $url;
+        }
+
+        return str_replace('https:', 'http:', $url);
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Repository/Vcs/HgDriverTest.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Repository/Vcs/HgDriverTest.php
new file mode 100644 (file)
index 0000000..10bccaa
--- /dev/null
@@ -0,0 +1,204 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Tests\Repository\Vcs;
+
+use Composer\Config;
+use Composer\IO\IOInterface;
+use Composer\Util\Filesystem;
+use Composer\Util\ProcessExecutor;
+use Fxp\Composer\AssetPlugin\Repository\Vcs\HgDriver;
+
+/**
+ * Tests of vcs mercurial repository.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class HgDriverTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var Config
+     */
+    private $config;
+
+    public function setUp()
+    {
+        $this->config = new Config();
+        $this->config->merge(array(
+            'config' => array(
+                'home' => sys_get_temp_dir().'/composer-test',
+                'cache-repo-dir' => sys_get_temp_dir().'/composer-test-cache',
+            ),
+        ));
+    }
+
+    public function tearDown()
+    {
+        $fs = new Filesystem();
+        $fs->removeDirectory(sys_get_temp_dir().'/composer-test');
+        $fs->removeDirectory(sys_get_temp_dir().'/composer-test-cache');
+    }
+
+    public function getAssetTypes()
+    {
+        return array(
+            array('npm', 'package.json'),
+            array('bower', 'bower.json'),
+        );
+    }
+
+    /**
+     * @dataProvider getAssetTypes
+     *
+     * @param string $type
+     * @param string $filename
+     */
+    public function testPublicRepositoryWithEmptyComposer($type, $filename)
+    {
+        $repoUrl = 'https://bitbucket.org/composer-test/repo-name';
+        $identifier = 'v0.0.0';
+        $io = $this->getMockBuilder('Composer\IO\IOInterface')->getMock();
+
+        $repoConfig = array(
+            'url' => $repoUrl,
+            'asset-type' => $type,
+            'filename' => $filename,
+        );
+
+        $process = $this->getMockBuilder('Composer\Util\ProcessExecutor')->getMock();
+        $process->expects($this->any())
+            ->method('splitLines')
+            ->will($this->returnValue(array()));
+        $process->expects($this->any())
+            ->method('execute')
+            ->will($this->returnCallback(function () {
+                return 0;
+            }));
+
+        /* @var IOInterface $io */
+        /* @var ProcessExecutor $process */
+
+        $driver = new HgDriver($repoConfig, $io, $this->config, $process, null);
+        $driver->initialize();
+
+        $validEmpty = array(
+            '_nonexistent_package' => true,
+        );
+
+        $this->assertSame($validEmpty, $driver->getComposerInformation($identifier));
+    }
+
+    /**
+     * @dataProvider getAssetTypes
+     *
+     * @param string $type
+     * @param string $filename
+     */
+    public function testPublicRepositoryWithCodeCache($type, $filename)
+    {
+        $repoUrl = 'https://bitbucket.org/composer-test/repo-name';
+        $identifier = '92bebbfdcde75ef2368317830e54b605bc938123';
+        $repoConfig = array(
+            'url' => $repoUrl,
+            'asset-type' => $type,
+            'filename' => $filename,
+        );
+        $io = $this->getMockBuilder('Composer\IO\IOInterface')->getMock();
+        $process = $this->getMockBuilder('Composer\Util\ProcessExecutor')->getMock();
+        $process->expects($this->any())
+            ->method('splitLines')
+            ->will($this->returnValue(array()));
+        $process->expects($this->any())
+            ->method('execute')
+            ->will($this->returnCallback(function ($command, &$output = null) use ($identifier, $repoConfig) {
+                if ($command === sprintf('hg cat -r %s %s', ProcessExecutor::escape($identifier), $repoConfig['filename'])) {
+                    $output = '{"name": "foo"}';
+                } elseif (false !== strpos($command, 'hg log')) {
+                    $date = new \DateTime(null, new \DateTimeZone('UTC'));
+                    $output = $date->format(\DateTime::RFC3339);
+                }
+
+                return 0;
+            }));
+
+        /* @var IOInterface $io */
+        /* @var ProcessExecutor $process */
+
+        $driver = new HgDriver($repoConfig, $io, $this->config, $process, null);
+        $driver->initialize();
+        $composer1 = $driver->getComposerInformation($identifier);
+        $composer2 = $driver->getComposerInformation($identifier);
+
+        $this->assertNotNull($composer1);
+        $this->assertNotNull($composer2);
+        $this->assertSame($composer1, $composer2);
+    }
+
+    /**
+     * @dataProvider getAssetTypes
+     *
+     * @param string $type
+     * @param string $filename
+     */
+    public function testPublicRepositoryWithFilesystemCache($type, $filename)
+    {
+        $repoUrl = 'https://bitbucket.org/composer-test/repo-name';
+        $identifier = '92bebbfdcde75ef2368317830e54b605bc938123';
+        $repoConfig = array(
+            'url' => $repoUrl,
+            'asset-type' => $type,
+            'filename' => $filename,
+        );
+        $io = $this->getMockBuilder('Composer\IO\IOInterface')->getMock();
+        $process = $this->getMockBuilder('Composer\Util\ProcessExecutor')->getMock();
+        $process->expects($this->any())
+            ->method('splitLines')
+            ->will($this->returnValue(array()));
+        $process->expects($this->any())
+            ->method('execute')
+            ->will($this->returnCallback(function ($command, &$output = null) use ($identifier, $repoConfig) {
+                if ($command === sprintf('hg cat -r %s %s', ProcessExecutor::escape($identifier), $repoConfig['filename'])) {
+                    $output = '{"name": "foo"}';
+                } elseif (false !== strpos($command, 'hg log')) {
+                    $date = new \DateTime(null, new \DateTimeZone('UTC'));
+                    $output = $date->format(\DateTime::RFC3339);
+                }
+
+                return 0;
+            }));
+
+        /* @var IOInterface $io */
+        /* @var ProcessExecutor $process */
+
+        $driver1 = new HgDriver($repoConfig, $io, $this->config, $process, null);
+        $driver2 = new HgDriver($repoConfig, $io, $this->config, $process, null);
+        $driver1->initialize();
+        $driver2->initialize();
+        $composer1 = $driver1->getComposerInformation($identifier);
+        $composer2 = $driver2->getComposerInformation($identifier);
+
+        $this->assertNotNull($composer1);
+        $this->assertNotNull($composer2);
+        $this->assertSame($composer1, $composer2);
+    }
+
+    /**
+     * @param object $object
+     * @param string $attribute
+     * @param mixed  $value
+     */
+    protected function setAttribute($object, $attribute, $value)
+    {
+        $attr = new \ReflectionProperty($object, $attribute);
+        $attr->setAccessible(true);
+        $attr->setValue($object, $value);
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Repository/Vcs/PerforceDriverTest.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Repository/Vcs/PerforceDriverTest.php
new file mode 100644 (file)
index 0000000..eaff929
--- /dev/null
@@ -0,0 +1,157 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Tests\Repository\Vcs;
+
+use Composer\Test\Repository\Vcs\PerforceDriverTest as BasePerforceDriverTest;
+use Fxp\Composer\AssetPlugin\Repository\Vcs\PerforceDriver;
+use Fxp\Composer\AssetPlugin\Util\Perforce;
+
+/**
+ * Tests of vcs perforce repository.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class PerforceDriverTest extends BasePerforceDriverTest
+{
+    /**
+     * @var PerforceDriver
+     */
+    protected $driver;
+
+    /**
+     * @var Perforce|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $perforce;
+
+    protected function setUp()
+    {
+        parent::setUp();
+
+        $this->driver = new PerforceDriver($this->repoConfig, $this->io, $this->config, $this->process, $this->remoteFileSystem);
+        $this->overrideDriverInternalPerforce($this->perforce);
+    }
+
+    protected function getMockIOInterface()
+    {
+        return $this->getMockBuilder('Composer\IO\IOInterface')->getMock();
+    }
+
+    protected function getMockProcessExecutor()
+    {
+        return $this->getMockBuilder('Composer\Util\ProcessExecutor')->getMock();
+    }
+
+    public function testInitializeCapturesVariablesFromRepoConfig()
+    {
+        $driver = new PerforceDriver($this->repoConfig, $this->io, $this->config, $this->process, $this->remoteFileSystem);
+        $driver->initialize();
+        $this->assertEquals(self::TEST_URL, $driver->getUrl());
+        $this->assertEquals(self::TEST_DEPOT, $driver->getDepot());
+        $this->assertEquals(self::TEST_BRANCH, $driver->getBranch());
+    }
+
+    /**
+     * Test that supports() simply return false.
+     *
+     * @covers \Composer\Repository\Vcs\PerforceDriver::supports
+     */
+    public function testSupportsReturnsFalseNoDeepCheck()
+    {
+        $this->expectOutputString('');
+        $this->assertFalse(PerforceDriver::supports($this->io, $this->config, 'existing.url'));
+    }
+
+    public function testInitializeLogsInAndConnectsClient()
+    {
+        $this->perforce->expects($this->at(0))->method('p4Login');
+        $this->perforce->expects($this->at(1))->method('checkStream');
+        $this->perforce->expects($this->at(2))->method('writeP4ClientSpec');
+        $this->perforce->expects($this->at(3))->method('connectClient');
+        $this->driver->initialize();
+    }
+
+    public function testPublicRepositoryWithEmptyComposer()
+    {
+        $identifier = 'TEST_IDENTIFIER';
+        $this->perforce->expects($this->any())
+            ->method('getComposerInformation')
+            ->with($this->equalTo($identifier))
+            ->will($this->returnValue(''));
+
+        $this->driver->initialize();
+        $validEmpty = array(
+            '_nonexistent_package' => true,
+        );
+
+        $this->assertSame($validEmpty, $this->driver->getComposerInformation($identifier));
+    }
+
+    public function testPublicRepositoryWithCodeCache()
+    {
+        $identifier = 'TEST_IDENTIFIER';
+        $this->perforce->expects($this->any())
+            ->method('getComposerInformation')
+            ->with($this->equalTo($identifier))
+            ->will($this->returnValue(array('name' => 'foo')));
+
+        $this->driver->initialize();
+        $composer1 = $this->driver->getComposerInformation($identifier);
+        $composer2 = $this->driver->getComposerInformation($identifier);
+
+        $this->assertNotNull($composer1);
+        $this->assertNotNull($composer2);
+        $this->assertSame($composer1, $composer2);
+    }
+
+    public function testPublicRepositoryWithFilesystemCache()
+    {
+        $identifier = 'TEST_IDENTIFIER';
+        $this->perforce->expects($this->any())
+            ->method('getComposerInformation')
+            ->with($this->equalTo($identifier))
+            ->will($this->returnValue(array('name' => 'foo')));
+
+        $driver2 = new PerforceDriver($this->repoConfig, $this->io, $this->config, $this->process, $this->remoteFileSystem);
+        $reflectionClass = new \ReflectionClass($driver2);
+        $property = $reflectionClass->getProperty('perforce');
+        $property->setAccessible(true);
+        $property->setValue($driver2, $this->perforce);
+
+        $this->driver->initialize();
+        $driver2->initialize();
+
+        $composer1 = $this->driver->getComposerInformation($identifier);
+        $composer2 = $driver2->getComposerInformation($identifier);
+
+        $this->assertNotNull($composer1);
+        $this->assertNotNull($composer2);
+        $this->assertSame($composer1, $composer2);
+    }
+
+    protected function getTestRepoConfig()
+    {
+        return array_merge(parent::getTestRepoConfig(), array(
+            'asset-type' => 'ASSET',
+            'filename' => 'ASSET.json',
+        ));
+    }
+
+    protected function getMockPerforce()
+    {
+        $methods = array('p4login', 'checkStream', 'writeP4ClientSpec', 'connectClient', 'getComposerInformation', 'cleanupClientSpec');
+
+        return $this->getMockBuilder('Fxp\Composer\AssetPlugin\Util\Perforce')
+            ->disableOriginalConstructor()
+            ->setMethods($methods)
+            ->getMock();
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Repository/Vcs/SvnDriverTest.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Repository/Vcs/SvnDriverTest.php
new file mode 100644 (file)
index 0000000..ed403e4
--- /dev/null
@@ -0,0 +1,367 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Tests\Repository\Vcs;
+
+use Composer\Config;
+use Composer\IO\IOInterface;
+use Composer\Util\Filesystem;
+use Composer\Util\ProcessExecutor;
+use Fxp\Composer\AssetPlugin\Repository\Vcs\SvnDriver;
+
+/**
+ * Tests of vcs svn repository.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class SvnDriverTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var Config
+     */
+    private $config;
+
+    public function setUp()
+    {
+        $this->config = new Config();
+        $this->config->merge(array(
+            'config' => array(
+                'home' => sys_get_temp_dir().'/composer-test',
+                'cache-repo-dir' => sys_get_temp_dir().'/composer-test-cache',
+                'secure-http' => false,
+            ),
+        ));
+    }
+
+    public function tearDown()
+    {
+        $fs = new Filesystem();
+        $fs->removeDirectory(sys_get_temp_dir().'/composer-test');
+        $fs->removeDirectory(sys_get_temp_dir().'/composer-test-cache');
+    }
+
+    public function getAssetTypes()
+    {
+        return array(
+            array('npm', 'package.json', '1234'),
+            array('npm', 'package.json', '/@1234'),
+            array('bower', 'bower.json', '1234'),
+            array('bower', 'bower.json', '/@1234'),
+        );
+    }
+
+    /**
+     * @dataProvider getAssetTypes
+     *
+     * @param string $type
+     * @param string $filename
+     * @param string $identifier
+     */
+    public function testPublicRepositoryWithEmptyComposer($type, $filename, $identifier)
+    {
+        $repoUrl = 'svn://example.tld/composer-test/repo-name/trunk';
+        $io = $this->getMockBuilder('Composer\IO\IOInterface')->getMock();
+
+        $repoConfig = array(
+            'url' => $repoUrl,
+            'asset-type' => $type,
+            'filename' => $filename,
+        );
+
+        $process = $this->getMockBuilder('Composer\Util\ProcessExecutor')->getMock();
+        $process->expects($this->any())
+            ->method('splitLines')
+            ->will($this->returnValue(array()));
+        $process->expects($this->any())
+            ->method('execute')
+            ->will($this->returnCallback(function () {
+                return 0;
+            }));
+
+        /* @var IOInterface $io */
+        /* @var ProcessExecutor $process */
+
+        $driver = new SvnDriver($repoConfig, $io, $this->config, $process, null);
+        $driver->initialize();
+
+        $validEmpty = array(
+            '_nonexistent_package' => true,
+        );
+
+        $this->assertSame($validEmpty, $driver->getComposerInformation($identifier));
+    }
+
+    /**
+     * @dataProvider getAssetTypes
+     *
+     * @param string $type
+     * @param string $filename
+     * @param string $identifier
+     */
+    public function testPrivateRepositoryWithEmptyComposer($type, $filename, $identifier)
+    {
+        $this->config->merge(array(
+            'config' => array(
+                'http-basic' => array(
+                    'example.tld' => array(
+                        'username' => 'peter',
+                        'password' => 'quill',
+                    ),
+                ),
+            ),
+        ));
+
+        $repoBaseUrl = 'svn://example.tld/composer-test/repo-name';
+        $repoUrl = $repoBaseUrl.'/trunk';
+        $io = $this->getMockBuilder('Composer\IO\IOInterface')->getMock();
+
+        $repoConfig = array(
+            'url' => $repoUrl,
+            'asset-type' => $type,
+            'filename' => $filename,
+        );
+
+        $process = $this->getMockBuilder('Composer\Util\ProcessExecutor')->getMock();
+        $process->expects($this->any())
+            ->method('splitLines')
+            ->will($this->returnValue(array()));
+        $process->expects($this->any())
+            ->method('execute')
+            ->will($this->returnCallback(function () {
+                return 0;
+            }));
+
+        /* @var IOInterface $io */
+        /* @var ProcessExecutor $process */
+
+        $driver = new SvnDriver($repoConfig, $io, $this->config, $process, null);
+        $driver->initialize();
+
+        $validEmpty = array(
+            '_nonexistent_package' => true,
+        );
+
+        $this->assertSame($validEmpty, $driver->getComposerInformation($identifier));
+    }
+
+    /**
+     * @dataProvider getAssetTypes
+     *
+     * @param string $type
+     * @param string $filename
+     * @param string $identifier
+     */
+    public function testPublicRepositoryWithCodeCache($type, $filename, $identifier)
+    {
+        $repoBaseUrl = 'svn://example.tld/composer-test/repo-name';
+        $repoUrl = $repoBaseUrl.'/trunk';
+        $repoConfig = array(
+            'url' => $repoUrl,
+            'asset-type' => $type,
+            'filename' => $filename,
+        );
+        $io = $this->getMockBuilder('Composer\IO\IOInterface')->getMock();
+        $process = $this->getMockBuilder('Composer\Util\ProcessExecutor')->getMock();
+        $process->expects($this->any())
+            ->method('splitLines')
+            ->will($this->returnCallback(function ($value) {
+                return is_string($value) ? preg_split('{\r?\n}', $value) : array();
+            }));
+        $process->expects($this->any())
+            ->method('execute')
+            ->will($this->returnCallback(function ($command, &$output) use ($repoBaseUrl, $identifier, $repoConfig) {
+                if ($command === sprintf('svn cat --non-interactive  %s', ProcessExecutor::escape(sprintf('%s/%s/%s', $repoBaseUrl, $identifier, $repoConfig['filename'])))
+                        || $command === sprintf('svn cat --non-interactive  %s', ProcessExecutor::escape(sprintf('%s/%s%s', $repoBaseUrl, $repoConfig['filename'], trim($identifier, '/'))))) {
+                    $output('out', '{"name": "foo"}');
+                } elseif ($command === sprintf('svn info --non-interactive  %s', ProcessExecutor::escape(sprintf('%s/%s/', $repoBaseUrl, $identifier)))
+                        || $command === sprintf('svn info --non-interactive  %s', ProcessExecutor::escape(sprintf('%s/%s', $repoBaseUrl, trim($identifier, '/'))))) {
+                    $date = new \DateTime(null, new \DateTimeZone('UTC'));
+                    $value = array(
+                        'Last Changed Rev: '.$identifier,
+                        'Last Changed Date: '.$date->format('Y-m-d H:i:s O').' ('.$date->format('l, j F Y').')',
+                    );
+
+                    $output('out', implode(PHP_EOL, $value));
+                }
+
+                return 0;
+            }));
+
+        /* @var IOInterface $io */
+        /* @var ProcessExecutor $process */
+
+        $driver = new SvnDriver($repoConfig, $io, $this->config, $process, null);
+        $driver->initialize();
+        $composer1 = $driver->getComposerInformation($identifier);
+        $composer2 = $driver->getComposerInformation($identifier);
+
+        $this->assertNotNull($composer1);
+        $this->assertNotNull($composer2);
+        $this->assertSame($composer1, $composer2);
+        $this->assertArrayHasKey('time', $composer1);
+    }
+
+    /**
+     * @dataProvider getAssetTypes
+     *
+     * @param string $type
+     * @param string $filename
+     * @param string $identifier
+     */
+    public function testPublicRepositoryWithFilesystemCache($type, $filename, $identifier)
+    {
+        $repoBaseUrl = 'svn://example.tld/composer-test/repo-name';
+        $repoUrl = $repoBaseUrl.'/trunk';
+        $repoConfig = array(
+            'url' => $repoUrl,
+            'asset-type' => $type,
+            'filename' => $filename,
+        );
+        $io = $this->getMockBuilder('Composer\IO\IOInterface')->getMock();
+        $process = $this->getMockBuilder('Composer\Util\ProcessExecutor')->getMock();
+        $process->expects($this->any())
+            ->method('splitLines')
+            ->will($this->returnCallback(function ($value) {
+                return is_string($value) ? preg_split('{\r?\n}', $value) : array();
+            }));
+        $process->expects($this->any())
+            ->method('execute')
+            ->will($this->returnCallback(function ($command, &$output) use ($repoBaseUrl, $identifier, $repoConfig) {
+                if ($command === sprintf('svn cat --non-interactive  %s', ProcessExecutor::escape(sprintf('%s/%s/%s', $repoBaseUrl, $identifier, $repoConfig['filename'])))
+                        || $command === sprintf('svn cat --non-interactive  %s', ProcessExecutor::escape(sprintf('%s/%s%s', $repoBaseUrl, $repoConfig['filename'], trim($identifier, '/'))))) {
+                    $output('out', '{"name": "foo"}');
+                } elseif ($command === sprintf('svn info --non-interactive  %s', ProcessExecutor::escape(sprintf('%s/%s/', $repoBaseUrl, $identifier)))
+                        || $command === sprintf('svn info --non-interactive  %s', ProcessExecutor::escape(sprintf('%s/%s', $repoBaseUrl, trim($identifier, '/'))))) {
+                    $date = new \DateTime(null, new \DateTimeZone('UTC'));
+                    $value = array(
+                        'Last Changed Rev: '.$identifier,
+                        'Last Changed Date: '.$date->format('Y-m-d H:i:s O').' ('.$date->format('l, j F Y').')',
+                    );
+
+                    $output('out', implode(PHP_EOL, $value));
+                }
+
+                return 0;
+            }));
+
+        /* @var IOInterface $io */
+        /* @var ProcessExecutor $process */
+
+        $driver1 = new SvnDriver($repoConfig, $io, $this->config, $process, null);
+        $driver2 = new SvnDriver($repoConfig, $io, $this->config, $process, null);
+        $driver1->initialize();
+        $driver2->initialize();
+        $composer1 = $driver1->getComposerInformation($identifier);
+        $composer2 = $driver2->getComposerInformation($identifier);
+
+        $this->assertNotNull($composer1);
+        $this->assertNotNull($composer2);
+        $this->assertSame($composer1, $composer2);
+        $this->assertArrayHasKey('time', $composer1);
+    }
+
+    /**
+     * @dataProvider getAssetTypes
+     *
+     * @param string $type
+     * @param string $filename
+     * @param string $identifier
+     *
+     * @expectedException \Composer\Downloader\TransportException
+     */
+    public function testPublicRepositoryWithInvalidUrl($type, $filename, $identifier)
+    {
+        $repoUrl = 'svn://example.tld/composer-test/repo-name/trunk';
+        $io = $this->getMockBuilder('Composer\IO\IOInterface')->getMock();
+
+        $repoConfig = array(
+            'url' => $repoUrl,
+            'asset-type' => $type,
+            'filename' => $filename,
+        );
+
+        $process = $this->getMockBuilder('Composer\Util\ProcessExecutor')->getMock();
+        $process->expects($this->any())
+            ->method('splitLines')
+            ->will($this->returnValue(array()));
+        $process->expects($this->any())
+            ->method('execute')
+            ->will($this->returnCallback(function ($command) {
+                return 0 === strpos($command, 'svn cat ') ? 1 : 0;
+            }));
+
+        /* @var IOInterface $io */
+        /* @var ProcessExecutor $process */
+
+        $driver = new SvnDriver($repoConfig, $io, $this->config, $process, null);
+        $driver->initialize();
+        $driver->getComposerInformation($identifier);
+    }
+
+    /**
+     * @return array
+     */
+    public function getSupportsUrls()
+    {
+        return array(
+            array('svn://example.tld/trunk',           true,  'svn://example.tld/trunk'),
+            array('svn+ssh://example.tld/trunk',       true,  'svn+ssh://example.tld/trunk'),
+            array('svn://svn.example.tld/trunk',       true,  'svn://svn.example.tld/trunk'),
+            array('svn+ssh://svn.example.tld/trunk',   true,  'svn+ssh://svn.example.tld/trunk'),
+            array('svn+http://svn.example.tld/trunk',  true,  'http://svn.example.tld/trunk'),
+            array('svn+https://svn.example.tld/trunk', true,  'https://svn.example.tld/trunk'),
+            array('http://example.tld/svn/trunk',      true,  'http://example.tld/svn/trunk'),
+            array('https://example.tld/svn/trunk',     true,  'https://example.tld/svn/trunk'),
+            array('http://example.tld/sub',            false, null),
+            array('https://example.tld/sub',           false, null),
+        );
+    }
+
+    /**
+     * @dataProvider getSupportsUrls
+     *
+     * @param string $url
+     * @param string $supperted
+     * @param string $urlUsed
+     */
+    public function testSupports($url, $supperted, $urlUsed)
+    {
+        /* @var IOInterface $io */
+        $io = $this->getMockBuilder('Composer\IO\IOInterface')->getMock();
+
+        $this->assertSame($supperted, SvnDriver::supports($io, $this->config, $url, false));
+
+        if (!$supperted) {
+            return;
+        }
+
+        $process = $this->getMockBuilder('Composer\Util\ProcessExecutor')->getMock();
+        $process->expects($this->any())
+            ->method('execute')
+            ->will($this->returnCallback(function () {
+                return 0;
+            }));
+
+        $repoConfig = array(
+            'url' => $url,
+            'asset-type' => 'bower',
+            'filename' => 'bower.json',
+        );
+
+        /* @var IOInterface $io */
+        /* @var ProcessExecutor $process */
+
+        $driver = new SvnDriver($repoConfig, $io, $this->config, $process, null);
+        $driver->initialize();
+
+        $this->assertEquals($urlUsed, $driver->getUrl());
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Repository/Vcs/UtilTest.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Repository/Vcs/UtilTest.php
new file mode 100644 (file)
index 0000000..27c6585
--- /dev/null
@@ -0,0 +1,66 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Tests\Repository\Vcs;
+
+use Fxp\Composer\AssetPlugin\Repository\Vcs\Util;
+use Fxp\Composer\AssetPlugin\Tests\Fixtures\Repository\Vcs\MockVcsDriver;
+
+/**
+ * Tests of util.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class UtilTest extends \PHPUnit_Framework_TestCase
+{
+    public function getDataProvider()
+    {
+        return array(
+            array('key'),
+            array('key.subkey'),
+            array('key.subkey.subsubkey'),
+        );
+    }
+
+    /**
+     * @dataProvider getDataProvider
+     *
+     * @param string $resourceKey
+     */
+    public function testAddComposerTimeWithSimpleKey($resourceKey)
+    {
+        $composer = array(
+            'name' => 'test',
+        );
+        $driver = new MockVcsDriver();
+
+        $value = null;
+        $keys = explode('.', $resourceKey);
+        $start = count($keys) - 1;
+
+        for ($i = $start; $i >= 0; --$i) {
+            if (null === $value) {
+                $value = 'level '.$i;
+            }
+
+            $value = array($keys[$i] => $value);
+        }
+
+        $driver->contents = json_encode($value);
+        $composerValid = array_merge($composer, array(
+            'time' => 'level '.(count($keys) - 1),
+        ));
+
+        $composer = Util::addComposerTime($composer, $resourceKey, 'http://example.tld', $driver);
+
+        $this->assertSame($composerValid, $composer);
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Repository/VcsPackageFilterTest.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Repository/VcsPackageFilterTest.php
new file mode 100644 (file)
index 0000000..2bf9b77
--- /dev/null
@@ -0,0 +1,696 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Tests\Repository;
+
+use Composer\Composer;
+use Composer\Installer\InstallationManager;
+use Composer\Package\Loader\ArrayLoader;
+use Composer\Package\Package;
+use Composer\Package\RootPackageInterface;
+use Composer\Repository\InstalledFilesystemRepository;
+use Fxp\Composer\AssetPlugin\Config\ConfigBuilder;
+use Fxp\Composer\AssetPlugin\Package\Version\VersionParser;
+use Fxp\Composer\AssetPlugin\Repository\VcsPackageFilter;
+use Fxp\Composer\AssetPlugin\Type\AssetTypeInterface;
+
+/**
+ * Tests of VCS Package Filter.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class VcsPackageFilterTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var Composer|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $composer;
+
+    /**
+     * @var RootPackageInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $package;
+
+    /**
+     * @var InstallationManager|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $installationManager;
+
+    /**
+     * @var InstalledFilesystemRepository|\PHPUnit_Framework_MockObject_MockObject|null
+     */
+    protected $installedRepository;
+
+    /**
+     * @var AssetTypeInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $assetType;
+
+    /**
+     * @var VcsPackageFilter
+     */
+    protected $filter;
+
+    protected function setUp()
+    {
+        $this->composer = $this->getMockBuilder('Composer\Composer')->disableOriginalConstructor()->getMock();
+        $this->package = $this->getMockBuilder('Composer\Package\RootPackageInterface')->getMock();
+        $this->assetType = $this->getMockBuilder('Fxp\Composer\AssetPlugin\Type\AssetTypeInterface')->getMock();
+
+        $versionConverter = $this->getMockBuilder('Fxp\Composer\AssetPlugin\Converter\VersionConverterInterface')->getMock();
+        $versionConverter->expects($this->any())
+            ->method('convertVersion')
+            ->will($this->returnCallback(function ($value) {
+                return $value;
+            }));
+        $this->assetType->expects($this->any())
+            ->method('getVersionConverter')
+            ->will($this->returnValue($versionConverter));
+
+        $this->installationManager = $this->getMockBuilder('Composer\Installer\InstallationManager')
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->installationManager->expects($this->any())
+            ->method('isPackageInstalled')
+            ->will($this->returnValue(true));
+
+        $this->composer->expects($this->any())
+            ->method('getPackage')
+            ->willReturn($this->package);
+    }
+
+    protected function tearDown()
+    {
+        $this->package = null;
+        $this->installedRepository = null;
+        $this->assetType = null;
+        $this->filter = null;
+    }
+
+    public function getDataProvider()
+    {
+        $configSkipPattern = array('pattern-skip-version' => false);
+        $configSkipPatternPath = array('pattern-skip-version' => '(-patch)');
+
+        return array(
+            array('acme/foobar', 'v1.0.0',        'stable', array(),                                    false),
+
+            array('acme/foobar', 'v1.0.0',        'stable', array('acme/foobar' => '>=1.0'),            false),
+            array('acme/foobar', 'v1.0.0-RC1',    'stable', array('acme/foobar' => '>=1.0'),            true),
+            array('acme/foobar', 'v1.0.0-beta1',  'stable', array('acme/foobar' => '>=1.0'),            true),
+            array('acme/foobar', 'v1.0.0-alpha1', 'stable', array('acme/foobar' => '>=1.0'),            true),
+            array('acme/foobar', 'v1.0.0-patch1', 'stable', array('acme/foobar' => '>=1.0'),            false),
+            array('acme/foobar', 'v1.0.0-patch1', 'stable', array('acme/foobar' => '>=1.0'),            false, $configSkipPattern),
+            array('acme/foobar', 'v1.0.0-patch1', 'stable', array('acme/foobar' => '>=1.0'),            true,  $configSkipPatternPath),
+
+            array('acme/foobar', 'v1.0.0',        'RC',     array('acme/foobar' => '>=1.0'),            false),
+            array('acme/foobar', 'v1.0.0-RC1',    'RC',     array('acme/foobar' => '>=1.0'),            false),
+            array('acme/foobar', 'v1.0.0-beta1',  'RC',     array('acme/foobar' => '>=1.0'),            true),
+            array('acme/foobar', 'v1.0.0-alpha1', 'RC',     array('acme/foobar' => '>=1.0'),            true),
+            array('acme/foobar', 'v1.0.0-patch1', 'RC',     array('acme/foobar' => '>=1.0'),            false),
+            array('acme/foobar', 'v1.0.0-patch1', 'RC',     array('acme/foobar' => '>=1.0'),            false, $configSkipPattern),
+            array('acme/foobar', 'v1.0.0-patch1', 'RC',     array('acme/foobar' => '>=1.0'),            true,  $configSkipPatternPath),
+
+            array('acme/foobar', 'v1.0.0',        'beta',   array('acme/foobar' => '>=1.0'),            false),
+            array('acme/foobar', 'v1.0.0-RC1',    'beta',   array('acme/foobar' => '>=1.0'),            false),
+            array('acme/foobar', 'v1.0.0-beta1',  'beta',   array('acme/foobar' => '>=1.0'),            false),
+            array('acme/foobar', 'v1.0.0-alpha1', 'beta',   array('acme/foobar' => '>=1.0'),            true),
+            array('acme/foobar', 'v1.0.0-patch1', 'beta',   array('acme/foobar' => '>=1.0'),            false),
+            array('acme/foobar', 'v1.0.0-patch1', 'beta',   array('acme/foobar' => '>=1.0'),            false, $configSkipPattern),
+            array('acme/foobar', 'v1.0.0-patch1', 'beta',   array('acme/foobar' => '>=1.0'),            true,  $configSkipPatternPath),
+
+            array('acme/foobar', 'v1.0.0',        'alpha',  array('acme/foobar' => '>=1.0'),            false),
+            array('acme/foobar', 'v1.0.0-RC1',    'alpha',  array('acme/foobar' => '>=1.0'),            false),
+            array('acme/foobar', 'v1.0.0-beta1',  'alpha',  array('acme/foobar' => '>=1.0'),            false),
+            array('acme/foobar', 'v1.0.0-alpha1', 'alpha',  array('acme/foobar' => '>=1.0'),            false),
+            array('acme/foobar', 'v1.0.0-patch1', 'alpha',  array('acme/foobar' => '>=1.0'),            false),
+            array('acme/foobar', 'v1.0.0-patch1', 'alpha',  array('acme/foobar' => '>=1.0'),            false, $configSkipPattern),
+            array('acme/foobar', 'v1.0.0-patch1', 'alpha',  array('acme/foobar' => '>=1.0'),            true,  $configSkipPatternPath),
+
+            array('acme/foobar', 'v1.0.0',        'dev',    array('acme/foobar' => '>=1.0'),            false),
+            array('acme/foobar', 'v1.0.0-RC1',    'dev',    array('acme/foobar' => '>=1.0'),            false),
+            array('acme/foobar', 'v1.0.0-beta1',  'dev',    array('acme/foobar' => '>=1.0'),            false),
+            array('acme/foobar', 'v1.0.0-alpha1', 'dev',    array('acme/foobar' => '>=1.0'),            false),
+            array('acme/foobar', 'v1.0.0-patch1', 'dev',    array('acme/foobar' => '>=1.0'),            false),
+            array('acme/foobar', 'v1.0.0-patch1', 'dev',    array('acme/foobar' => '>=1.0'),            false, $configSkipPattern),
+            array('acme/foobar', 'v1.0.0-patch1', 'dev',    array('acme/foobar' => '>=1.0'),            true,  $configSkipPatternPath),
+
+            array('acme/foobar', 'v1.0.0',        'stable', array('acme/foobar' => '>=1.0@stable'),     false),
+            array('acme/foobar', 'v1.0.0',        'stable', array('acme/foobar' => '>=1.0@RC'),         false),
+            array('acme/foobar', 'v1.0.0',        'stable', array('acme/foobar' => '>=1.0@beta'),       false),
+            array('acme/foobar', 'v1.0.0',        'stable', array('acme/foobar' => '>=1.0@alpha'),      false),
+            array('acme/foobar', 'v1.0.0',        'stable', array('acme/foobar' => '>=1.0@dev'),        false),
+            array('acme/foobar', 'v1.0.0',        'RC',     array('acme/foobar' => '>=1.0@stable'),     false),
+            array('acme/foobar', 'v1.0.0',        'RC',     array('acme/foobar' => '>=1.0@RC'),         false),
+            array('acme/foobar', 'v1.0.0',        'RC',     array('acme/foobar' => '>=1.0@beta'),       false),
+            array('acme/foobar', 'v1.0.0',        'RC',     array('acme/foobar' => '>=1.0@alpha'),      false),
+            array('acme/foobar', 'v1.0.0',        'RC',     array('acme/foobar' => '>=1.0@dev'),        false),
+            array('acme/foobar', 'v1.0.0',        'beta',   array('acme/foobar' => '>=1.0@stable'),     false),
+            array('acme/foobar', 'v1.0.0',        'beta',   array('acme/foobar' => '>=1.0@RC'),         false),
+            array('acme/foobar', 'v1.0.0',        'beta',   array('acme/foobar' => '>=1.0@beta'),       false),
+            array('acme/foobar', 'v1.0.0',        'beta',   array('acme/foobar' => '>=1.0@alpha'),      false),
+            array('acme/foobar', 'v1.0.0',        'beta',   array('acme/foobar' => '>=1.0@dev'),        false),
+            array('acme/foobar', 'v1.0.0',        'alpha',  array('acme/foobar' => '>=1.0@stable'),     false),
+            array('acme/foobar', 'v1.0.0',        'alpha',  array('acme/foobar' => '>=1.0@RC'),         false),
+            array('acme/foobar', 'v1.0.0',        'alpha',  array('acme/foobar' => '>=1.0@beta'),       false),
+            array('acme/foobar', 'v1.0.0',        'alpha',  array('acme/foobar' => '>=1.0@alpha'),      false),
+            array('acme/foobar', 'v1.0.0',        'alpha',  array('acme/foobar' => '>=1.0@dev'),        false),
+
+            array('acme/foobar', 'v1.0.0-RC1',    'stable', array('acme/foobar' => '>=1.0@stable'),     true),
+            array('acme/foobar', 'v1.0.0-RC1',    'stable', array('acme/foobar' => '>=1.0@RC'),         false),
+            array('acme/foobar', 'v1.0.0-RC1',    'stable', array('acme/foobar' => '>=1.0@beta'),       false),
+            array('acme/foobar', 'v1.0.0-RC1',    'stable', array('acme/foobar' => '>=1.0@alpha'),      false),
+            array('acme/foobar', 'v1.0.0-RC1',    'stable', array('acme/foobar' => '>=1.0@dev'),        false),
+            array('acme/foobar', 'v1.0.0-RC1',    'RC',     array('acme/foobar' => '>=1.0@stable'),     true),
+            array('acme/foobar', 'v1.0.0-RC1',    'RC',     array('acme/foobar' => '>=1.0@RC'),         false),
+            array('acme/foobar', 'v1.0.0-RC1',    'RC',     array('acme/foobar' => '>=1.0@beta'),       false),
+            array('acme/foobar', 'v1.0.0-RC1',    'RC',     array('acme/foobar' => '>=1.0@alpha'),      false),
+            array('acme/foobar', 'v1.0.0-RC1',    'RC',     array('acme/foobar' => '>=1.0@dev'),        false),
+            array('acme/foobar', 'v1.0.0-RC1',    'beta',   array('acme/foobar' => '>=1.0@stable'),     true),
+            array('acme/foobar', 'v1.0.0-RC1',    'beta',   array('acme/foobar' => '>=1.0@RC'),         false),
+            array('acme/foobar', 'v1.0.0-RC1',    'beta',   array('acme/foobar' => '>=1.0@beta'),       false),
+            array('acme/foobar', 'v1.0.0-RC1',    'beta',   array('acme/foobar' => '>=1.0@alpha'),      false),
+            array('acme/foobar', 'v1.0.0-RC1',    'beta',   array('acme/foobar' => '>=1.0@dev'),        false),
+            array('acme/foobar', 'v1.0.0-RC1',    'alpha',  array('acme/foobar' => '>=1.0@stable'),     true),
+            array('acme/foobar', 'v1.0.0-RC1',    'alpha',  array('acme/foobar' => '>=1.0@RC'),         false),
+            array('acme/foobar', 'v1.0.0-RC1',    'alpha',  array('acme/foobar' => '>=1.0@beta'),       false),
+            array('acme/foobar', 'v1.0.0-RC1',    'alpha',  array('acme/foobar' => '>=1.0@alpha'),      false),
+            array('acme/foobar', 'v1.0.0-RC1',    'alpha',  array('acme/foobar' => '>=1.0@dev'),        false),
+
+            array('acme/foobar', 'v1.0.0-beta1',  'stable', array('acme/foobar' => '>=1.0@stable'),      true),
+            array('acme/foobar', 'v1.0.0-beta1',  'stable', array('acme/foobar' => '>=1.0@RC'),          true),
+            array('acme/foobar', 'v1.0.0-beta1',  'stable', array('acme/foobar' => '>=1.0@beta'),        false),
+            array('acme/foobar', 'v1.0.0-beta1',  'stable', array('acme/foobar' => '>=1.0@alpha'),       false),
+            array('acme/foobar', 'v1.0.0-beta1',  'stable', array('acme/foobar' => '>=1.0@dev'),         false),
+            array('acme/foobar', 'v1.0.0-beta1',  'RC',     array('acme/foobar' => '>=1.0@stable'),      true),
+            array('acme/foobar', 'v1.0.0-beta1',  'RC',     array('acme/foobar' => '>=1.0@RC'),          true),
+            array('acme/foobar', 'v1.0.0-beta1',  'RC',     array('acme/foobar' => '>=1.0@beta'),        false),
+            array('acme/foobar', 'v1.0.0-beta1',  'RC',     array('acme/foobar' => '>=1.0@alpha'),       false),
+            array('acme/foobar', 'v1.0.0-beta1',  'RC',     array('acme/foobar' => '>=1.0@dev'),         false),
+            array('acme/foobar', 'v1.0.0-beta1',  'beta',   array('acme/foobar' => '>=1.0@stable'),      true),
+            array('acme/foobar', 'v1.0.0-beta1',  'beta',   array('acme/foobar' => '>=1.0@RC'),          true),
+            array('acme/foobar', 'v1.0.0-beta1',  'beta',   array('acme/foobar' => '>=1.0@beta'),        false),
+            array('acme/foobar', 'v1.0.0-beta1',  'beta',   array('acme/foobar' => '>=1.0@alpha'),       false),
+            array('acme/foobar', 'v1.0.0-beta1',  'beta',   array('acme/foobar' => '>=1.0@dev'),         false),
+            array('acme/foobar', 'v1.0.0-beta1',  'alpha',  array('acme/foobar' => '>=1.0@stable'),      true),
+            array('acme/foobar', 'v1.0.0-beta1',  'alpha',  array('acme/foobar' => '>=1.0@RC'),          true),
+            array('acme/foobar', 'v1.0.0-beta1',  'alpha',  array('acme/foobar' => '>=1.0@beta'),        false),
+            array('acme/foobar', 'v1.0.0-beta1',  'alpha',  array('acme/foobar' => '>=1.0@alpha'),       false),
+            array('acme/foobar', 'v1.0.0-beta1',  'alpha',  array('acme/foobar' => '>=1.0@dev'),         false),
+
+            array('acme/foobar', 'v1.0.0-alpha1', 'stable', array('acme/foobar' => '>=1.0@stable'),      true),
+            array('acme/foobar', 'v1.0.0-alpha1', 'stable', array('acme/foobar' => '>=1.0@RC'),          true),
+            array('acme/foobar', 'v1.0.0-alpha1', 'stable', array('acme/foobar' => '>=1.0@beta'),        true),
+            array('acme/foobar', 'v1.0.0-alpha1', 'stable', array('acme/foobar' => '>=1.0@alpha'),       false),
+            array('acme/foobar', 'v1.0.0-alpha1', 'stable', array('acme/foobar' => '>=1.0@dev'),         false),
+            array('acme/foobar', 'v1.0.0-alpha1', 'RC',     array('acme/foobar' => '>=1.0@stable'),      true),
+            array('acme/foobar', 'v1.0.0-alpha1', 'RC',     array('acme/foobar' => '>=1.0@RC'),          true),
+            array('acme/foobar', 'v1.0.0-alpha1', 'RC',     array('acme/foobar' => '>=1.0@beta'),        true),
+            array('acme/foobar', 'v1.0.0-alpha1', 'RC',     array('acme/foobar' => '>=1.0@alpha'),       false),
+            array('acme/foobar', 'v1.0.0-alpha1', 'RC',     array('acme/foobar' => '>=1.0@dev'),         false),
+            array('acme/foobar', 'v1.0.0-alpha1', 'beta',   array('acme/foobar' => '>=1.0@stable'),      true),
+            array('acme/foobar', 'v1.0.0-alpha1', 'beta',   array('acme/foobar' => '>=1.0@RC'),          true),
+            array('acme/foobar', 'v1.0.0-alpha1', 'beta',   array('acme/foobar' => '>=1.0@beta'),        true),
+            array('acme/foobar', 'v1.0.0-alpha1', 'beta',   array('acme/foobar' => '>=1.0@alpha'),       false),
+            array('acme/foobar', 'v1.0.0-alpha1', 'beta',   array('acme/foobar' => '>=1.0@dev'),         false),
+            array('acme/foobar', 'v1.0.0-alpha1', 'alpha',  array('acme/foobar' => '>=1.0@stable'),      true),
+            array('acme/foobar', 'v1.0.0-alpha1', 'alpha',  array('acme/foobar' => '>=1.0@RC'),          true),
+            array('acme/foobar', 'v1.0.0-alpha1', 'alpha',  array('acme/foobar' => '>=1.0@beta'),        true),
+            array('acme/foobar', 'v1.0.0-alpha1', 'alpha',  array('acme/foobar' => '>=1.0@alpha'),       false),
+            array('acme/foobar', 'v1.0.0-alpha1', 'alpha',  array('acme/foobar' => '>=1.0@dev'),         false),
+
+            array('acme/foobar', 'v1.0.0-patch1', 'stable', array('acme/foobar' => '>=1.0@stable'),      false),
+            array('acme/foobar', 'v1.0.0-patch1', 'stable', array('acme/foobar' => '>=1.0@stable'),      false, $configSkipPattern),
+            array('acme/foobar', 'v1.0.0-patch1', 'stable', array('acme/foobar' => '>=1.0@stable'),      true,  $configSkipPatternPath),
+            array('acme/foobar', 'v1.0.0-patch1', 'stable', array('acme/foobar' => '>=1.0@RC'),          false),
+            array('acme/foobar', 'v1.0.0-patch1', 'stable', array('acme/foobar' => '>=1.0@RC'),          false, $configSkipPattern),
+            array('acme/foobar', 'v1.0.0-patch1', 'stable', array('acme/foobar' => '>=1.0@RC'),          true,  $configSkipPatternPath),
+            array('acme/foobar', 'v1.0.0-patch1', 'stable', array('acme/foobar' => '>=1.0@beta'),        false),
+            array('acme/foobar', 'v1.0.0-patch1', 'stable', array('acme/foobar' => '>=1.0@beta'),        false, $configSkipPattern),
+            array('acme/foobar', 'v1.0.0-patch1', 'stable', array('acme/foobar' => '>=1.0@beta'),        true,  $configSkipPatternPath),
+            array('acme/foobar', 'v1.0.0-patch1', 'stable', array('acme/foobar' => '>=1.0@alpha'),       false),
+            array('acme/foobar', 'v1.0.0-patch1', 'stable', array('acme/foobar' => '>=1.0@alpha'),       false, $configSkipPattern),
+            array('acme/foobar', 'v1.0.0-patch1', 'stable', array('acme/foobar' => '>=1.0@alpha'),       true,  $configSkipPatternPath),
+            array('acme/foobar', 'v1.0.0-patch1', 'stable', array('acme/foobar' => '>=1.0@dev'),         false),
+            array('acme/foobar', 'v1.0.0-patch1', 'stable', array('acme/foobar' => '>=1.0@dev'),         false, $configSkipPattern),
+            array('acme/foobar', 'v1.0.0-patch1', 'stable', array('acme/foobar' => '>=1.0@dev'),         true,  $configSkipPatternPath),
+            array('acme/foobar', 'v1.0.0-patch1', 'RC',     array('acme/foobar' => '>=1.0@stable'),      false),
+            array('acme/foobar', 'v1.0.0-patch1', 'RC',     array('acme/foobar' => '>=1.0@stable'),      false, $configSkipPattern),
+            array('acme/foobar', 'v1.0.0-patch1', 'RC',     array('acme/foobar' => '>=1.0@stable'),      true,  $configSkipPatternPath),
+            array('acme/foobar', 'v1.0.0-patch1', 'RC',     array('acme/foobar' => '>=1.0@RC'),          false),
+            array('acme/foobar', 'v1.0.0-patch1', 'RC',     array('acme/foobar' => '>=1.0@RC'),          false, $configSkipPattern),
+            array('acme/foobar', 'v1.0.0-patch1', 'RC',     array('acme/foobar' => '>=1.0@RC'),          true,  $configSkipPatternPath),
+            array('acme/foobar', 'v1.0.0-patch1', 'RC',     array('acme/foobar' => '>=1.0@beta'),        false),
+            array('acme/foobar', 'v1.0.0-patch1', 'RC',     array('acme/foobar' => '>=1.0@beta'),        false, $configSkipPattern),
+            array('acme/foobar', 'v1.0.0-patch1', 'RC',     array('acme/foobar' => '>=1.0@beta'),        true,  $configSkipPatternPath),
+            array('acme/foobar', 'v1.0.0-patch1', 'RC',     array('acme/foobar' => '>=1.0@alpha'),       false),
+            array('acme/foobar', 'v1.0.0-patch1', 'RC',     array('acme/foobar' => '>=1.0@alpha'),       false, $configSkipPattern),
+            array('acme/foobar', 'v1.0.0-patch1', 'RC',     array('acme/foobar' => '>=1.0@alpha'),       true,  $configSkipPatternPath),
+            array('acme/foobar', 'v1.0.0-patch1', 'RC',     array('acme/foobar' => '>=1.0@dev'),         false),
+            array('acme/foobar', 'v1.0.0-patch1', 'RC',     array('acme/foobar' => '>=1.0@dev'),         false, $configSkipPattern),
+            array('acme/foobar', 'v1.0.0-patch1', 'RC',     array('acme/foobar' => '>=1.0@dev'),         true,  $configSkipPatternPath),
+            array('acme/foobar', 'v1.0.0-patch1', 'beta',   array('acme/foobar' => '>=1.0@stable'),      false),
+            array('acme/foobar', 'v1.0.0-patch1', 'beta',   array('acme/foobar' => '>=1.0@stable'),      false, $configSkipPattern),
+            array('acme/foobar', 'v1.0.0-patch1', 'beta',   array('acme/foobar' => '>=1.0@stable'),      true,  $configSkipPatternPath),
+            array('acme/foobar', 'v1.0.0-patch1', 'beta',   array('acme/foobar' => '>=1.0@RC'),          false),
+            array('acme/foobar', 'v1.0.0-patch1', 'beta',   array('acme/foobar' => '>=1.0@RC'),          false, $configSkipPattern),
+            array('acme/foobar', 'v1.0.0-patch1', 'beta',   array('acme/foobar' => '>=1.0@RC'),          true,  $configSkipPatternPath),
+            array('acme/foobar', 'v1.0.0-patch1', 'beta',   array('acme/foobar' => '>=1.0@beta'),        false),
+            array('acme/foobar', 'v1.0.0-patch1', 'beta',   array('acme/foobar' => '>=1.0@beta'),        false, $configSkipPattern),
+            array('acme/foobar', 'v1.0.0-patch1', 'beta',   array('acme/foobar' => '>=1.0@beta'),        true,  $configSkipPatternPath),
+            array('acme/foobar', 'v1.0.0-patch1', 'beta',   array('acme/foobar' => '>=1.0@alpha'),       false),
+            array('acme/foobar', 'v1.0.0-patch1', 'beta',   array('acme/foobar' => '>=1.0@alpha'),       false, $configSkipPattern),
+            array('acme/foobar', 'v1.0.0-patch1', 'beta',   array('acme/foobar' => '>=1.0@alpha'),       true,  $configSkipPatternPath),
+            array('acme/foobar', 'v1.0.0-patch1', 'beta',   array('acme/foobar' => '>=1.0@dev'),         false),
+            array('acme/foobar', 'v1.0.0-patch1', 'beta',   array('acme/foobar' => '>=1.0@dev'),         false, $configSkipPattern),
+            array('acme/foobar', 'v1.0.0-patch1', 'beta',   array('acme/foobar' => '>=1.0@dev'),         true,  $configSkipPatternPath),
+            array('acme/foobar', 'v1.0.0-patch1', 'alpha',  array('acme/foobar' => '>=1.0@stable'),      false),
+            array('acme/foobar', 'v1.0.0-patch1', 'alpha',  array('acme/foobar' => '>=1.0@stable'),      false, $configSkipPattern),
+            array('acme/foobar', 'v1.0.0-patch1', 'alpha',  array('acme/foobar' => '>=1.0@stable'),      true,  $configSkipPatternPath),
+            array('acme/foobar', 'v1.0.0-patch1', 'alpha',  array('acme/foobar' => '>=1.0@RC'),          false),
+            array('acme/foobar', 'v1.0.0-patch1', 'alpha',  array('acme/foobar' => '>=1.0@RC'),          false, $configSkipPattern),
+            array('acme/foobar', 'v1.0.0-patch1', 'alpha',  array('acme/foobar' => '>=1.0@RC'),          true,  $configSkipPatternPath),
+            array('acme/foobar', 'v1.0.0-patch1', 'alpha',  array('acme/foobar' => '>=1.0@beta'),        false),
+            array('acme/foobar', 'v1.0.0-patch1', 'alpha',  array('acme/foobar' => '>=1.0@beta'),        false, $configSkipPattern),
+            array('acme/foobar', 'v1.0.0-patch1', 'alpha',  array('acme/foobar' => '>=1.0@beta'),        true,  $configSkipPatternPath),
+            array('acme/foobar', 'v1.0.0-patch1', 'alpha',  array('acme/foobar' => '>=1.0@alpha'),       false),
+            array('acme/foobar', 'v1.0.0-patch1', 'alpha',  array('acme/foobar' => '>=1.0@alpha'),       false, $configSkipPattern),
+            array('acme/foobar', 'v1.0.0-patch1', 'alpha',  array('acme/foobar' => '>=1.0@alpha'),       true,  $configSkipPatternPath),
+            array('acme/foobar', 'v1.0.0-patch1', 'alpha',  array('acme/foobar' => '>=1.0@dev'),         false),
+            array('acme/foobar', 'v1.0.0-patch1', 'alpha',  array('acme/foobar' => '>=1.0@dev'),         false, $configSkipPattern),
+            array('acme/foobar', 'v1.0.0-patch1', 'alpha',  array('acme/foobar' => '>=1.0@dev'),         true,  $configSkipPatternPath),
+
+            array('acme/foobar', 'v1.0.0',        'stable', array('acme/foobar' => '~1.0'),              false),
+            array('acme/foobar', 'v1.0.0-RC1',    'stable', array('acme/foobar' => '~1.0'),              true),
+            array('acme/foobar', 'v1.0.0-beta1',  'stable', array('acme/foobar' => '~1.0'),              true),
+            array('acme/foobar', 'v1.0.0-alpha1', 'stable', array('acme/foobar' => '~1.0'),              true),
+            array('acme/foobar', 'v1.0.0-patch1', 'stable', array('acme/foobar' => '~1.0'),              false),
+            array('acme/foobar', 'v1.0.0-patch1', 'stable', array('acme/foobar' => '~1.0'),              false, $configSkipPattern),
+            array('acme/foobar', 'v1.0.0-patch1', 'stable', array('acme/foobar' => '~1.0'),              true,  $configSkipPatternPath),
+
+            array('acme/foobar', 'v1.0.0',        'stable', array('acme/foobar' => '1.0'),               false),
+            array('acme/foobar', 'v1.0.0-RC1',    'stable', array('acme/foobar' => '1.0'),               true),
+            array('acme/foobar', 'v1.0.0-beta1',  'stable', array('acme/foobar' => '1.0'),               true),
+            array('acme/foobar', 'v1.0.0-alpha1', 'stable', array('acme/foobar' => '1.0'),               true),
+            array('acme/foobar', 'v1.0.0-patch1', 'stable', array('acme/foobar' => '1.0'),               false),
+            array('acme/foobar', 'v1.0.0-patch1', 'stable', array('acme/foobar' => '1.0'),               false, $configSkipPattern),
+            array('acme/foobar', 'v1.0.0-patch1', 'stable', array('acme/foobar' => '1.0'),               true,  $configSkipPatternPath),
+
+            array('acme/foobar', 'v1.0.0',        'stable', array('acme/foobar' => '@stable'),           false),
+            array('acme/foobar', 'v1.0.0',        'stable', array('acme/foobar' => '@RC'),               false),
+            array('acme/foobar', 'v1.0.0',        'stable', array('acme/foobar' => '@beta'),             false),
+            array('acme/foobar', 'v1.0.0',        'stable', array('acme/foobar' => '@alpha'),            false),
+            array('acme/foobar', 'v1.0.0',        'stable', array('acme/foobar' => '@dev'),              false),
+
+            array('acme/foobar', 'v1.0.0-RC1',    'stable', array('acme/foobar' => '@stable'),           true),
+            array('acme/foobar', 'v1.0.0-RC1',    'stable', array('acme/foobar' => '@RC'),               false),
+            array('acme/foobar', 'v1.0.0-RC1',    'stable', array('acme/foobar' => '@beta'),             false),
+            array('acme/foobar', 'v1.0.0-RC1',    'stable', array('acme/foobar' => '@alpha'),            false),
+            array('acme/foobar', 'v1.0.0-RC1',    'stable', array('acme/foobar' => '@dev'),              false),
+
+            array('acme/foobar', 'v1.0.0-beta1',  'stable', array('acme/foobar' => '@stable'),           true),
+            array('acme/foobar', 'v1.0.0-beta1',  'stable', array('acme/foobar' => '@RC'),               true),
+            array('acme/foobar', 'v1.0.0-beta1',  'stable', array('acme/foobar' => '@beta'),             false),
+            array('acme/foobar', 'v1.0.0-beta1',  'stable', array('acme/foobar' => '@alpha'),            false),
+            array('acme/foobar', 'v1.0.0-beta1',  'stable', array('acme/foobar' => '@dev'),              false),
+
+            array('acme/foobar', 'v1.0.0-alpha1', 'stable', array('acme/foobar' => '@stable'),           true),
+            array('acme/foobar', 'v1.0.0-alpha1', 'stable', array('acme/foobar' => '@RC'),               true),
+            array('acme/foobar', 'v1.0.0-alpha1', 'stable', array('acme/foobar' => '@beta'),             true),
+            array('acme/foobar', 'v1.0.0-alpha1', 'stable', array('acme/foobar' => '@alpha'),            false),
+            array('acme/foobar', 'v1.0.0-alpha1', 'stable', array('acme/foobar' => '@dev'),              false),
+
+            array('acme/foobar', 'v1.0.0-patch1', 'stable', array('acme/foobar' => '@stable'),           false),
+            array('acme/foobar', 'v1.0.0-patch1', 'stable', array('acme/foobar' => '@stable'),           false, $configSkipPattern),
+            array('acme/foobar', 'v1.0.0-patch1', 'stable', array('acme/foobar' => '@stable'),           true,  $configSkipPatternPath),
+            array('acme/foobar', 'v1.0.0-patch1', 'stable', array('acme/foobar' => '@RC'),               false),
+            array('acme/foobar', 'v1.0.0-patch1', 'stable', array('acme/foobar' => '@RC'),               false, $configSkipPattern),
+            array('acme/foobar', 'v1.0.0-patch1', 'stable', array('acme/foobar' => '@RC'),               true,  $configSkipPatternPath),
+            array('acme/foobar', 'v1.0.0-patch1', 'stable', array('acme/foobar' => '@beta'),             false),
+            array('acme/foobar', 'v1.0.0-patch1', 'stable', array('acme/foobar' => '@beta'),             false, $configSkipPattern),
+            array('acme/foobar', 'v1.0.0-patch1', 'stable', array('acme/foobar' => '@beta'),             true,  $configSkipPatternPath),
+            array('acme/foobar', 'v1.0.0-patch1', 'stable', array('acme/foobar' => '@alpha'),            false),
+            array('acme/foobar', 'v1.0.0-patch1', 'stable', array('acme/foobar' => '@alpha'),            false, $configSkipPattern),
+            array('acme/foobar', 'v1.0.0-patch1', 'stable', array('acme/foobar' => '@alpha'),            true,  $configSkipPatternPath),
+            array('acme/foobar', 'v1.0.0-patch1', 'stable', array('acme/foobar' => '@dev'),              false),
+            array('acme/foobar', 'v1.0.0-patch1', 'stable', array('acme/foobar' => '@dev'),              false, $configSkipPattern),
+            array('acme/foobar', 'v1.0.0-patch1', 'stable', array('acme/foobar' => '@dev'),              true,  $configSkipPatternPath),
+
+            array('acme/foobar', 'v1.0.0',        'stable', array('acme/foobar' => '1.0'),               false),
+            array('acme/foobar', 'v1.0.0-RC1',    'stable', array('acme/foobar' => '1.0-RC1'),           true),
+            array('acme/foobar', 'v1.0.0-beta1',  'stable', array('acme/foobar' => '1.0-beta1'),         true),
+            array('acme/foobar', 'v1.0.0-alpha1', 'stable', array('acme/foobar' => '1.0-alpha1'),        true),
+            array('acme/foobar', 'v1.0.0-patch1', 'stable', array('acme/foobar' => '1.0-patch1'),        false),
+            array('acme/foobar', 'v1.0.0-patch1', 'stable', array('acme/foobar' => '1.0-patch1'),        false, $configSkipPattern),
+            array('acme/foobar', 'v1.0.0-patch1', 'stable', array('acme/foobar' => '1.0-patch1'),        true,  $configSkipPatternPath),
+
+            array('acme/foobar', 'v1.0.0',        'RC',     array('acme/foobar' => '1.0'),               false),
+            array('acme/foobar', 'v1.0.0-RC1',    'RC',     array('acme/foobar' => '1.0-RC1'),           false),
+            array('acme/foobar', 'v1.0.0-beta1',  'RC',     array('acme/foobar' => '1.0-beta1'),         true),
+            array('acme/foobar', 'v1.0.0-alpha1', 'RC',     array('acme/foobar' => '1.0-alpha1'),        true),
+            array('acme/foobar', 'v1.0.0-patch1', 'RC',     array('acme/foobar' => '1.0-patch1'),        false),
+            array('acme/foobar', 'v1.0.0-patch1', 'RC',     array('acme/foobar' => '1.0-patch1'),        false, $configSkipPattern),
+            array('acme/foobar', 'v1.0.0-patch1', 'RC',     array('acme/foobar' => '1.0-patch1'),        true,  $configSkipPatternPath),
+
+            array('acme/foobar', 'v1.0.0',        'beta',   array('acme/foobar' => '1.0'),               false),
+            array('acme/foobar', 'v1.0.0-RC1',    'beta',   array('acme/foobar' => '1.0-RC1'),           false),
+            array('acme/foobar', 'v1.0.0-beta1',  'beta',   array('acme/foobar' => '1.0-beta1'),         false),
+            array('acme/foobar', 'v1.0.0-alpha1', 'beta',   array('acme/foobar' => '1.0-alpha1'),        true),
+            array('acme/foobar', 'v1.0.0-patch1', 'beta',   array('acme/foobar' => '1.0-patch1'),        false),
+            array('acme/foobar', 'v1.0.0-patch1', 'beta',   array('acme/foobar' => '1.0-patch1'),        false, $configSkipPattern),
+            array('acme/foobar', 'v1.0.0-patch1', 'beta',   array('acme/foobar' => '1.0-patch1'),        true,  $configSkipPatternPath),
+
+            array('acme/foobar', 'v1.0.0',        'alpha',  array('acme/foobar' => '1.0'),               false),
+            array('acme/foobar', 'v1.0.0-RC1',    'alpha',  array('acme/foobar' => '1.0-RC1'),           false),
+            array('acme/foobar', 'v1.0.0-beta1',  'alpha',  array('acme/foobar' => '1.0-beta1'),         false),
+            array('acme/foobar', 'v1.0.0-alpha1', 'alpha',  array('acme/foobar' => '1.0-alpha1'),        false),
+            array('acme/foobar', 'v1.0.0-patch1', 'alpha',  array('acme/foobar' => '1.0-patch1'),        false),
+            array('acme/foobar', 'v1.0.0-patch1', 'alpha',  array('acme/foobar' => '1.0-patch1'),        false, $configSkipPattern),
+            array('acme/foobar', 'v1.0.0-patch1', 'alpha',  array('acme/foobar' => '1.0-patch1'),        true,  $configSkipPatternPath),
+
+            array('acme/foobar', 'v1.0.0',        'dev',    array('acme/foobar' => '1.0'),               false),
+            array('acme/foobar', 'v1.0.0-RC1',    'dev',    array('acme/foobar' => '1.0-RC1'),           false),
+            array('acme/foobar', 'v1.0.0-beta1',  'dev',    array('acme/foobar' => '1.0-beta1'),         false),
+            array('acme/foobar', 'v1.0.0-alpha1', 'dev',    array('acme/foobar' => '1.0-alpha1'),        false),
+            array('acme/foobar', 'v1.0.0-patch1', 'dev',    array('acme/foobar' => '1.0-patch1'),        false),
+            array('acme/foobar', 'v1.0.0-patch1', 'dev',    array('acme/foobar' => '1.0-patch1'),        false, $configSkipPattern),
+            array('acme/foobar', 'v1.0.0-patch1', 'dev',    array('acme/foobar' => '1.0-patch1'),        true,  $configSkipPatternPath),
+
+            array('acme/foobar', 'v1.0.0',        'stable', array('acme/foobar' => '1.0@stable'),        false),
+            array('acme/foobar', 'v1.0.0-RC1',    'stable', array('acme/foobar' => '1.0-RC1@stable'),    true),
+            array('acme/foobar', 'v1.0.0-beta1',  'stable', array('acme/foobar' => '1.0-beta1@stable'),  true),
+            array('acme/foobar', 'v1.0.0-alpha1', 'stable', array('acme/foobar' => '1.0-alpha1@stable'), true),
+            array('acme/foobar', 'v1.0.0-patch1', 'stable', array('acme/foobar' => '1.0-patch1@stable'), false),
+            array('acme/foobar', 'v1.0.0-patch1', 'stable', array('acme/foobar' => '1.0-patch1@stable'), false, $configSkipPattern),
+            array('acme/foobar', 'v1.0.0-patch1', 'stable', array('acme/foobar' => '1.0-patch1@stable'), true,  $configSkipPatternPath),
+
+            array('acme/foobar', 'v1.0.0',        'stable', array('acme/foobar' => '1.0@RC'),            false),
+            array('acme/foobar', 'v1.0.0-RC1',    'stable', array('acme/foobar' => '1.0-RC1@RC'),        false),
+            array('acme/foobar', 'v1.0.0-beta1',  'stable', array('acme/foobar' => '1.0-beta1@RC'),      true),
+            array('acme/foobar', 'v1.0.0-alpha1', 'stable', array('acme/foobar' => '1.0-alpha1@RC'),     true),
+            array('acme/foobar', 'v1.0.0-patch1', 'stable', array('acme/foobar' => '1.0-patch1@RC'),     false),
+            array('acme/foobar', 'v1.0.0-patch1', 'stable', array('acme/foobar' => '1.0-patch1@RC'),     false, $configSkipPattern),
+            array('acme/foobar', 'v1.0.0-patch1', 'stable', array('acme/foobar' => '1.0-patch1@RC'),     true,  $configSkipPatternPath),
+
+            array('acme/foobar', 'v1.0.0',        'stable', array('acme/foobar' => '1.0@beta'),          false),
+            array('acme/foobar', 'v1.0.0-RC1',    'stable', array('acme/foobar' => '1.0-RC1@beta'),      false),
+            array('acme/foobar', 'v1.0.0-beta1',  'stable', array('acme/foobar' => '1.0-beta1@beta'),    false),
+            array('acme/foobar', 'v1.0.0-alpha1', 'stable', array('acme/foobar' => '1.0-alpha1@beta'),   true),
+            array('acme/foobar', 'v1.0.0-patch1', 'stable', array('acme/foobar' => '1.0-patch1@beta'),   false),
+            array('acme/foobar', 'v1.0.0-patch1', 'stable', array('acme/foobar' => '1.0-patch1@beta'),   false, $configSkipPattern),
+            array('acme/foobar', 'v1.0.0-patch1', 'stable', array('acme/foobar' => '1.0-patch1@beta'),   true,  $configSkipPatternPath),
+
+            array('acme/foobar', 'v1.0.0',        'stable', array('acme/foobar' => '1.0@alpha'),         false),
+            array('acme/foobar', 'v1.0.0-RC1',    'stable', array('acme/foobar' => '1.0-RC1@alpha'),     false),
+            array('acme/foobar', 'v1.0.0-beta1',  'stable', array('acme/foobar' => '1.0-beta1@alpha'),   false),
+            array('acme/foobar', 'v1.0.0-alpha1', 'stable', array('acme/foobar' => '1.0-alpha1@alpha'),  false),
+            array('acme/foobar', 'v1.0.0-patch1', 'stable', array('acme/foobar' => '1.0-patch1@alpha'),  false),
+            array('acme/foobar', 'v1.0.0-patch1', 'stable', array('acme/foobar' => '1.0-patch1@alpha'),  false, $configSkipPattern),
+            array('acme/foobar', 'v1.0.0-patch1', 'stable', array('acme/foobar' => '1.0-patch1@alpha'),  true,  $configSkipPatternPath),
+
+            array('acme/foobar', 'v1.0.0',        'stable', array('acme/foobar' => '1.0@dev'),           false),
+            array('acme/foobar', 'v1.0.0-RC1',    'stable', array('acme/foobar' => '1.0-RC1@dev'),       false),
+            array('acme/foobar', 'v1.0.0-beta1',  'stable', array('acme/foobar' => '1.0-beta1@dev'),     false),
+            array('acme/foobar', 'v1.0.0-alpha1', 'stable', array('acme/foobar' => '1.0-alpha1@dev'),    false),
+            array('acme/foobar', 'v1.0.0-patch1', 'stable', array('acme/foobar' => '1.0-patch1@dev'),    false),
+            array('acme/foobar', 'v1.0.0-patch1', 'stable', array('acme/foobar' => '1.0-patch1@dev'),    false,  $configSkipPattern),
+            array('acme/foobar', 'v1.0.0-patch1', 'stable', array('acme/foobar' => '1.0-patch1@dev'),    true,   $configSkipPatternPath),
+
+            array('acme/foobar', 'v1.0.0',        'stable', array('acme/foobar' => '1.0@dev | 1.0.*@RC'), false),
+            array('acme/foobar', 'v1.0.0-RC1',    'stable', array('acme/foobar' => '1.0@dev | 1.0.*@RC'), false),
+            array('acme/foobar', 'v1.0.0-beta1',  'stable', array('acme/foobar' => '1.0@dev | 1.0.*@RC'), false),
+            array('acme/foobar', 'v1.0.0-alpha1', 'stable', array('acme/foobar' => '1.0@dev | 1.0.*@RC'), false),
+            array('acme/foobar', 'v1.0.0-patch1', 'stable', array('acme/foobar' => '1.0@dev | 1.0.*@RC'), false),
+            array('acme/foobar', 'v1.0.0-patch1', 'stable', array('acme/foobar' => '1.0@dev | 1.0.*@RC'), false, $configSkipPattern),
+            array('acme/foobar', 'v1.0.0-patch1', 'stable', array('acme/foobar' => '1.0@dev | 1.0.*@RC'), true,  $configSkipPatternPath),
+
+            array('acme/foobar', 'v1.0.0',        'stable', array('acme/foobar' => '1.0 | 1.0.*@RC'),    false),
+            array('acme/foobar', 'v1.0.0-RC1',    'stable', array('acme/foobar' => '1.0 | 1.0.*@RC'),    false),
+            array('acme/foobar', 'v1.0.0-beta1',  'stable', array('acme/foobar' => '1.0 | 1.0.*@RC'),    true),
+            array('acme/foobar', 'v1.0.0-alpha1', 'stable', array('acme/foobar' => '1.0 | 1.0.*@RC'),    true),
+            array('acme/foobar', 'v1.0.0-patch1', 'stable', array('acme/foobar' => '1.0 | 1.0.*@RC'),    false),
+            array('acme/foobar', 'v1.0.0-patch1', 'stable', array('acme/foobar' => '1.0 | 1.0.*@RC'),    false, $configSkipPattern),
+            array('acme/foobar', 'v1.0.0-patch1', 'stable', array('acme/foobar' => '1.0 | 1.0.*@RC'),    true,  $configSkipPatternPath),
+
+            array('acme/foobar', 'v1.0.0',        'stable', array('acme/foobar' => '1.0@dev | 1.0.*'),   false),
+            array('acme/foobar', 'v1.0.0-RC1',    'stable', array('acme/foobar' => '1.0@dev|1.0.*@RC'),  false),
+            array('acme/foobar', 'v1.0.0-beta1',  'stable', array('acme/foobar' => '1.0@dev | 1.0.*'),   false),
+            array('acme/foobar', 'v1.0.0-alpha1', 'stable', array('acme/foobar' => '1.0@dev | 1.0.*'),   false),
+            array('acme/foobar', 'v1.0.0-patch1', 'stable', array('acme/foobar' => '1.0@dev | 1.0.*'),   false),
+            array('acme/foobar', 'v1.0.0-patch1', 'stable', array('acme/foobar' => '1.0@dev | 1.0.*'),   false, $configSkipPattern),
+            array('acme/foobar', 'v1.0.0-patch1', 'stable', array('acme/foobar' => '1.0@dev | 1.0.*'),   true,  $configSkipPatternPath),
+
+            array('acme/foobar', 'standard/1.0.0', 'stable', array('acme/foobar' => '>=1.0'),            true),
+        );
+    }
+
+    /**
+     * @dataProvider getDataProvider
+     *
+     * @param string $packageName
+     * @param string $version
+     * @param string $minimumStability
+     * @param array  $rootRequires
+     * @param bool   $validSkip
+     * @param array  $rootConfig
+     */
+    public function testSkipVersion($packageName, $version, $minimumStability, array $rootRequires, $validSkip, array $rootConfig = array())
+    {
+        $this->init($rootRequires, $minimumStability, $rootConfig);
+
+        $this->assertSame($validSkip, $this->filter->skip($this->assetType, $packageName, $version));
+    }
+
+    public function getDataProviderForDisableTest()
+    {
+        return array(
+            array('acme/foobar', 'v1.0.0',        'stable', array(),                         false),
+
+            array('acme/foobar', 'v1.0.0',        'stable', array('acme/foobar' => '>=1.0'), false),
+            array('acme/foobar', 'v1.0.0-RC1',    'stable', array('acme/foobar' => '>=1.0'), false),
+            array('acme/foobar', 'v1.0.0-beta1',  'stable', array('acme/foobar' => '>=1.0'), false),
+            array('acme/foobar', 'v1.0.0-alpha1', 'stable', array('acme/foobar' => '>=1.0'), false),
+            array('acme/foobar', 'v1.0.0-patch1', 'stable', array('acme/foobar' => '>=1.0'), false),
+        );
+    }
+
+    /**
+     * @dataProvider getDataProviderForDisableTest
+     *
+     * @param $packageName
+     * @param $version
+     * @param $minimumStability
+     * @param array $rootRequires
+     * @param $validSkip
+     */
+    public function testDisabledFilterWithInstalledPackage($packageName, $version, $minimumStability, array $rootRequires, $validSkip)
+    {
+        $this->init($rootRequires, $minimumStability);
+        $this->filter->setEnabled(false);
+
+        $this->assertSame($validSkip, $this->filter->skip($this->assetType, $packageName, $version));
+    }
+
+    public function getDataForInstalledTests()
+    {
+        $optn = 'optimize-with-installed-packages';
+        $optn2 = 'optimize-with-conjunctive';
+
+        $opt1 = array();
+        $opt2 = array($optn => true, $optn2 => true);
+        $opt3 = array($optn => false, $optn2 => true);
+        $opt4 = array($optn => true, $optn2 => false);
+
+        return array(
+            array($opt1, 'acme/foobar', 'v1.0.0', 'stable', '>=0.9', '1.0.0', true),
+            array($opt2, 'acme/foobar', 'v1.0.0', 'stable', '>=0.9', '1.0.0', true),
+            array($opt3, 'acme/foobar', 'v1.0.0', 'stable', '>=0.9', '1.0.0', false),
+            array($opt4, 'acme/foobar', 'v1.0.0', 'stable', '>=0.9', '1.0.0', false),
+            array($opt1, 'acme/foobar', 'v0.9.0', 'stable', '>=0.9', '1.0.0', true),
+            array($opt2, 'acme/foobar', 'v0.9.0', 'stable', '>=0.9', '1.0.0', true),
+            array($opt3, 'acme/foobar', 'v0.9.0', 'stable', '>=0.9', '1.0.0', false),
+            array($opt4, 'acme/foobar', 'v0.9.0', 'stable', '>=0.9', '1.0.0', false),
+
+            array($opt1, 'acme/foobar', 'v1.0.0', 'stable', '>=0.9', null,    false),
+            array($opt2, 'acme/foobar', 'v1.0.0', 'stable', '>=0.9', null,    false),
+            array($opt3, 'acme/foobar', 'v1.0.0', 'stable', '>=0.9', null,    false),
+            array($opt4, 'acme/foobar', 'v1.0.0', 'stable', '>=0.9', null,    false),
+            array($opt1, 'acme/foobar', 'v0.9.0', 'stable', '>=0.9', null,    false),
+            array($opt2, 'acme/foobar', 'v0.9.0', 'stable', '>=0.9', null,    false),
+            array($opt3, 'acme/foobar', 'v0.9.0', 'stable', '>=0.9', null,    false),
+            array($opt4, 'acme/foobar', 'v0.9.0', 'stable', '>=0.9', null,    false),
+
+            array($opt1, 'acme/foobar', 'v1.0.0', 'stable', null,    '1.0.0', true),
+            array($opt2, 'acme/foobar', 'v1.0.0', 'stable', null,    '1.0.0', true),
+            array($opt3, 'acme/foobar', 'v1.0.0', 'stable', null,    '1.0.0', false),
+            array($opt4, 'acme/foobar', 'v1.0.0', 'stable', null,    '1.0.0', true),
+            array($opt1, 'acme/foobar', 'v0.9.0', 'stable', null,    '1.0.0', true),
+            array($opt2, 'acme/foobar', 'v0.9.0', 'stable', null,    '1.0.0', true),
+            array($opt3, 'acme/foobar', 'v0.9.0', 'stable', null,    '1.0.0', false),
+            array($opt4, 'acme/foobar', 'v0.9.0', 'stable', null,    '1.0.0', true),
+
+            array($opt1, 'acme/foobar', 'v1.0.0', 'stable', null,    null,    false),
+            array($opt2, 'acme/foobar', 'v1.0.0', 'stable', null,    null,    false),
+            array($opt3, 'acme/foobar', 'v1.0.0', 'stable', null,    null,    false),
+            array($opt4, 'acme/foobar', 'v1.0.0', 'stable', null,    null,    false),
+            array($opt1, 'acme/foobar', 'v0.9.0', 'stable', null,    null,    false),
+            array($opt2, 'acme/foobar', 'v0.9.0', 'stable', null,    null,    false),
+            array($opt3, 'acme/foobar', 'v0.9.0', 'stable', null,    null,    false),
+            array($opt4, 'acme/foobar', 'v0.9.0', 'stable', null,    null,    false),
+
+            array($opt1, 'acme/foobar', 'v1.0.0', 'dev',   '>=0.9@stable', '1.0.0', true),
+            array($opt2, 'acme/foobar', 'v1.0.0', 'dev',   '>=0.9@stable', '1.0.0', true),
+            array($opt3, 'acme/foobar', 'v1.0.0', 'dev',   '>=0.9@stable', '1.0.0', false),
+            array($opt4, 'acme/foobar', 'v1.0.0', 'dev',   '>=0.9@stable', '1.0.0', false),
+            array($opt1, 'acme/foobar', 'v0.9.0', 'dev',   '>=0.9@stable', '1.0.0', true),
+            array($opt2, 'acme/foobar', 'v0.9.0', 'dev',   '>=0.9@stable', '1.0.0', true),
+            array($opt3, 'acme/foobar', 'v0.9.0', 'dev',   '>=0.9@stable', '1.0.0', false),
+            array($opt4, 'acme/foobar', 'v0.9.0', 'dev',   '>=0.9@stable', '1.0.0', false),
+
+            array($opt1, 'acme/foobar', 'v1.0.0', 'dev',   '>=0.9@stable', null,    false),
+            array($opt2, 'acme/foobar', 'v1.0.0', 'dev',   '>=0.9@stable', null,    false),
+            array($opt3, 'acme/foobar', 'v1.0.0', 'dev',   '>=0.9@stable', null,    false),
+            array($opt4, 'acme/foobar', 'v1.0.0', 'dev',   '>=0.9@stable', null,    false),
+            array($opt1, 'acme/foobar', 'v0.9.0', 'dev',   '>=0.9@stable', null,    false),
+            array($opt2, 'acme/foobar', 'v0.9.0', 'dev',   '>=0.9@stable', null,    false),
+            array($opt3, 'acme/foobar', 'v0.9.0', 'dev',   '>=0.9@stable', null,    false),
+            array($opt4, 'acme/foobar', 'v0.9.0', 'dev',   '>=0.9@stable', null,    false),
+        );
+    }
+
+    /**
+     * @dataProvider getDataForInstalledTests
+     *
+     * @param array       $config
+     * @param string      $packageName
+     * @param string      $version
+     * @param string      $minimumStability
+     * @param string|null $rootRequireVersion
+     * @param string|null $installedVersion
+     * @param bool        $validSkip
+     */
+    public function testFilterWithInstalledPackage(array $config, $packageName, $version, $minimumStability, $rootRequireVersion, $installedVersion, $validSkip)
+    {
+        $installed = null === $installedVersion
+            ? array()
+            : array($packageName => $installedVersion);
+
+        $require = null === $rootRequireVersion
+            ? array()
+            : array($packageName => $rootRequireVersion);
+
+        $this->installedRepository = $this->getMockBuilder('Composer\Repository\InstalledFilesystemRepository')
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->installedRepository->expects($this->any())
+            ->method('getPackages')
+            ->will($this->returnValue($this->convertInstalled($installed)));
+
+        $this->init($require, $minimumStability, $config);
+
+        $this->assertSame($validSkip, $this->filter->skip($this->assetType, $packageName, $version));
+    }
+
+    /**
+     * Init test.
+     *
+     * @param array  $requires
+     * @param string $minimumStability
+     * @param array  $config
+     */
+    protected function init(array $requires = array(), $minimumStability = 'stable', array $config = array())
+    {
+        $parser = new ArrayLoader();
+        $linkRequires = $parser->parseLinks('__ROOT__', '1.0.0', 'requires', $requires);
+
+        $stabilityFlags = $this->findStabilityFlags($requires);
+
+        $this->package->expects($this->any())
+            ->method('getRequires')
+            ->will($this->returnValue($linkRequires));
+        $this->package->expects($this->any())
+            ->method('getDevRequires')
+            ->will($this->returnValue(array()));
+        $this->package->expects($this->any())
+            ->method('getMinimumStability')
+            ->will($this->returnValue($minimumStability));
+        $this->package->expects($this->any())
+            ->method('getStabilityFlags')
+            ->will($this->returnValue($stabilityFlags));
+        $this->package->expects($this->any())
+            ->method('getConfig')
+            ->will($this->returnValue(array(
+                'fxp-asset' => $config,
+            )));
+
+        /* @var RootPackageInterface $package */
+        $package = $this->package;
+        $config = ConfigBuilder::build($this->composer);
+
+        $this->filter = new VcsPackageFilter($config, $package, $this->installationManager, $this->installedRepository);
+    }
+
+    /**
+     * Convert the installed package data tests to mock package instance.
+     *
+     * @param array $installed The config of installed packages
+     *
+     * @return array The package instance of installed packages
+     */
+    protected function convertInstalled(array $installed)
+    {
+        $packages = array();
+        $parser = new VersionParser();
+
+        foreach ($installed as $name => $version) {
+            $package = $this->getMockBuilder('Composer\Package\PackageInterface')->getMock();
+
+            $package->expects($this->any())
+                ->method('getName')
+                ->will($this->returnValue($name));
+
+            $package->expects($this->any())
+                ->method('getVersion')
+                ->will($this->returnValue($parser->normalize($version)));
+
+            $package->expects($this->any())
+                ->method('getPrettyVersion')
+                ->will($this->returnValue($version));
+
+            $packages[] = $package;
+        }
+
+        return $packages;
+    }
+
+    /**
+     * Find the stability flag of requires.
+     *
+     * @param array $requires The require dependencies
+     *
+     * @return array
+     */
+    protected function findStabilityFlags(array $requires)
+    {
+        $flags = array();
+        $stabilities = Package::$stabilities;
+
+        foreach ($requires as $require => $prettyConstraint) {
+            if (preg_match_all('/@('.implode('|', array_keys($stabilities)).')/', $prettyConstraint, $matches)) {
+                $flags[$require] = $stabilities[$matches[1][0]];
+            }
+        }
+
+        return $flags;
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Type/AbstractAssetTypeTest.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Type/AbstractAssetTypeTest.php
new file mode 100644 (file)
index 0000000..34ab1f8
--- /dev/null
@@ -0,0 +1,58 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Tests\Type;
+
+use Fxp\Composer\AssetPlugin\Converter\PackageConverterInterface;
+use Fxp\Composer\AssetPlugin\Converter\VersionConverterInterface;
+use Fxp\Composer\AssetPlugin\Type\AssetTypeInterface;
+
+/**
+ * Abstract class for tests of asset type.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+abstract class AbstractAssetTypeTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var PackageConverterInterface
+     */
+    protected $packageConverter;
+
+    /**
+     * @var VersionConverterInterface
+     */
+    protected $versionConverter;
+
+    /**
+     * @var AssetTypeInterface
+     */
+    protected $type;
+
+    protected function setUp()
+    {
+        $this->packageConverter = $this->getMockBuilder('Fxp\Composer\AssetPlugin\Converter\PackageConverterInterface')->getMock();
+        $this->versionConverter = $this->getMockBuilder('Fxp\Composer\AssetPlugin\Converter\VersionConverterInterface')->getMock();
+    }
+
+    protected function tearDown()
+    {
+        $this->packageConverter = null;
+        $this->versionConverter = null;
+        $this->type = null;
+    }
+
+    public function testConverter()
+    {
+        $this->assertInstanceOf('Fxp\Composer\AssetPlugin\Converter\PackageConverterInterface', $this->type->getPackageConverter());
+        $this->assertInstanceOf('Fxp\Composer\AssetPlugin\Converter\VersionConverterInterface', $this->type->getVersionConverter());
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Type/BowerAssetTypeTest.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Type/BowerAssetTypeTest.php
new file mode 100644 (file)
index 0000000..2ebe31d
--- /dev/null
@@ -0,0 +1,39 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Tests\Type;
+
+use Fxp\Composer\AssetPlugin\Type\BowerAssetType;
+
+/**
+ * Tests of bower asset type.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class BowerAssetTypeTest extends AbstractAssetTypeTest
+{
+    protected function setUp()
+    {
+        parent::setUp();
+
+        $this->type = new BowerAssetType($this->packageConverter, $this->versionConverter);
+    }
+
+    public function testInformations()
+    {
+        $this->assertSame('bower', $this->type->getName());
+        $this->assertSame('bower-asset', $this->type->getComposerVendorName());
+        $this->assertSame('bower-asset-library', $this->type->getComposerType());
+        $this->assertSame('bower.json', $this->type->getFilename());
+        $this->assertSame('bower-asset/foobar', $this->type->formatComposerName('foobar'));
+        $this->assertSame('bower-asset/foobar', $this->type->formatComposerName('bower-asset/foobar'));
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Type/NpmAssetTypeTest.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Type/NpmAssetTypeTest.php
new file mode 100644 (file)
index 0000000..ac7e35d
--- /dev/null
@@ -0,0 +1,39 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Tests\Type;
+
+use Fxp\Composer\AssetPlugin\Type\NpmAssetType;
+
+/**
+ * Tests of npm asset type.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class NpmAssetTypeTest extends AbstractAssetTypeTest
+{
+    protected function setUp()
+    {
+        parent::setUp();
+
+        $this->type = new NpmAssetType($this->packageConverter, $this->versionConverter);
+    }
+
+    public function testInformations()
+    {
+        $this->assertSame('npm', $this->type->getName());
+        $this->assertSame('npm-asset', $this->type->getComposerVendorName());
+        $this->assertSame('npm-asset-library', $this->type->getComposerType());
+        $this->assertSame('package.json', $this->type->getFilename());
+        $this->assertSame('npm-asset/foobar', $this->type->formatComposerName('foobar'));
+        $this->assertSame('npm-asset/foobar', $this->type->formatComposerName('npm-asset/foobar'));
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Util/PerforceTest.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Util/PerforceTest.php
new file mode 100644 (file)
index 0000000..34b4deb
--- /dev/null
@@ -0,0 +1,328 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Tests\Util;
+
+use Composer\IO\IOInterface;
+use Composer\Test\Util\PerforceTest as BasePerforceTest;
+use Composer\Util\Filesystem;
+use Composer\Util\ProcessExecutor;
+use Fxp\Composer\AssetPlugin\Util\Perforce;
+
+/**
+ * Tests for the perforce.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class PerforceTest extends BasePerforceTest
+{
+    /**
+     * @var Perforce
+     */
+    protected $perforce;
+
+    /**
+     * @var ProcessExecutor|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $processExecutor;
+
+    /**
+     * @var array
+     */
+    protected $repoConfig;
+
+    protected function setUp()
+    {
+        $this->processExecutor = $this->getMockBuilder('Composer\Util\ProcessExecutor')->getMock();
+        $this->repoConfig = $this->getTestRepoConfig();
+        $this->io = $this->getMockIOInterface();
+        $this->createNewPerforceWithWindowsFlag(true);
+    }
+
+    protected function tearDown()
+    {
+        parent::tearDown();
+
+        $fs = new Filesystem();
+        $fs->remove($this::TEST_PATH);
+    }
+
+    /**
+     * @return IOInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    public function getMockIOInterface()
+    {
+        return $this->getMockBuilder('Composer\IO\IOInterface')->getMock();
+    }
+
+    public function testQueryP4PasswordWithPasswordAlreadySet()
+    {
+        $repoConfig = array(
+            'depot' => 'depot',
+            'branch' => 'branch',
+            'p4user' => 'user',
+            'p4password' => 'TEST_PASSWORD',
+            'filename' => 'ASSET.json',
+        );
+        $this->perforce = new Perforce($repoConfig, 'port', 'path', $this->processExecutor, false, $this->getMockIOInterface(), 'TEST');
+        $password = $this->perforce->queryP4Password();
+        $this->assertEquals('TEST_PASSWORD', $password);
+    }
+
+    public function getTestRepoConfig()
+    {
+        return array_merge(parent::getTestRepoConfig(), array(
+            'filename' => 'ASSET.json',
+        ));
+    }
+
+    public function testGetComposerInformationWithoutLabelWithoutStream()
+    {
+        $expectedCommand = 'p4 -u user -c composer_perforce_TEST_depot -p port  print //depot/ASSET.json';
+        $this->processExecutor->expects($this->at(0))
+            ->method('execute')
+            ->with($this->equalTo($expectedCommand))
+            ->will(
+                $this->returnCallback(
+                    function ($command, &$output) {
+                        $output = PerforceTest::getComposerJson();
+
+                        return $command ? true : true;
+                    }
+                )
+            );
+
+        $result = $this->perforce->getComposerInformation('//depot');
+        $expected = array(
+            'name' => 'test/perforce',
+            'description' => 'Basic project for testing',
+            'minimum-stability' => 'dev',
+            'autoload' => array('psr-0' => array()),
+        );
+        $this->assertEquals($expected, $result);
+    }
+
+    public function testGetComposerInformationWithLabelWithoutStream()
+    {
+        $expectedCommand = 'p4 -u user -p port  files //depot/ASSET.json@0.0.1';
+        $this->processExecutor->expects($this->at(0))
+            ->method('execute')
+            ->with($this->equalTo($expectedCommand))
+            ->will(
+                $this->returnCallback(
+                    function ($command, &$output) {
+                        $output = '//depot/ASSET.json#1 - branch change 10001 (text)';
+
+                        return $command ? true : true;
+                    }
+                )
+            );
+
+        $expectedCommand = 'p4 -u user -c composer_perforce_TEST_depot -p port  print //depot/ASSET.json@10001';
+        $this->processExecutor->expects($this->at(1))
+            ->method('execute')
+            ->with($this->equalTo($expectedCommand))
+            ->will(
+                $this->returnCallback(
+                    function ($command, &$output) {
+                        $output = PerforceTest::getComposerJson();
+
+                        return $command ? true : true;
+                    }
+                )
+            );
+
+        $result = $this->perforce->getComposerInformation('//depot@0.0.1');
+
+        $expected = array(
+            'name' => 'test/perforce',
+            'description' => 'Basic project for testing',
+            'minimum-stability' => 'dev',
+            'autoload' => array('psr-0' => array()),
+        );
+        $this->assertEquals($expected, $result);
+    }
+
+    public function testGetComposerInformationWithoutLabelWithStream()
+    {
+        $this->setAssetPerforceToStream();
+
+        $expectedCommand = 'p4 -u user -c composer_perforce_TEST_depot_branch -p port  print //depot/branch/ASSET.json';
+        $this->processExecutor->expects($this->at(0))
+            ->method('execute')
+            ->with($this->equalTo($expectedCommand))
+            ->will(
+                $this->returnCallback(
+                    function ($command, &$output) {
+                        $output = PerforceTest::getComposerJson();
+
+                        return $command ? true : true;
+                    }
+                )
+            );
+
+        $result = $this->perforce->getComposerInformation('//depot/branch');
+
+        $expected = array(
+            'name' => 'test/perforce',
+            'description' => 'Basic project for testing',
+            'minimum-stability' => 'dev',
+            'autoload' => array('psr-0' => array()),
+        );
+        $this->assertEquals($expected, $result);
+    }
+
+    public function testGetComposerInformationWithLabelWithStream()
+    {
+        $this->setAssetPerforceToStream();
+        $expectedCommand = 'p4 -u user -p port  files //depot/branch/ASSET.json@0.0.1';
+        $this->processExecutor->expects($this->at(0))
+            ->method('execute')
+            ->with($this->equalTo($expectedCommand))
+            ->will(
+                $this->returnCallback(
+                    function ($command, &$output) {
+                        $output = '//depot/ASSET.json#1 - branch change 10001 (text)';
+
+                        return $command ? true : true;
+                    }
+                )
+            );
+
+        $expectedCommand = 'p4 -u user -c composer_perforce_TEST_depot_branch -p port  print //depot/branch/ASSET.json@10001';
+        $this->processExecutor->expects($this->at(1))
+            ->method('execute')
+            ->with($this->equalTo($expectedCommand))
+            ->will(
+                $this->returnCallback(
+                    function ($command, &$output) {
+                        $output = PerforceTest::getComposerJson();
+
+                        return $command ? true : true;
+                    }
+                )
+            );
+
+        $result = $this->perforce->getComposerInformation('//depot/branch@0.0.1');
+
+        $expected = array(
+            'name' => 'test/perforce',
+            'description' => 'Basic project for testing',
+            'minimum-stability' => 'dev',
+            'autoload' => array('psr-0' => array()),
+        );
+        $this->assertEquals($expected, $result);
+    }
+
+    public function testGetComposerInformationWithLabelButNoSuchFile()
+    {
+        $this->setAssetPerforceToStream();
+        $expectedCommand = 'p4 -u user -p port  files //depot/branch/ASSET.json@0.0.1';
+        $this->processExecutor->expects($this->at(0))
+            ->method('execute')
+            ->with($this->equalTo($expectedCommand))
+            ->will(
+                $this->returnCallback(
+                    function ($command, &$output) {
+                        $output = 'no such file(s).';
+
+                        return $command ? true : true;
+                    }
+                )
+            );
+
+        $result = $this->perforce->getComposerInformation('//depot/branch@0.0.1');
+
+        $this->assertNull($result);
+    }
+
+    public function testGetComposerInformationWithLabelWithStreamWithNoChange()
+    {
+        $this->setAssetPerforceToStream();
+        $expectedCommand = 'p4 -u user -p port  files //depot/branch/ASSET.json@0.0.1';
+        $this->processExecutor->expects($this->at(0))
+            ->method('execute')
+            ->with($this->equalTo($expectedCommand))
+            ->will(
+                $this->returnCallback(
+                    function ($command, &$output) {
+                        $output = '//depot/ASSET.json#1 - branch 10001 (text)';
+
+                        return $command ? true : true;
+                    }
+                )
+            );
+
+        $result = $this->perforce->getComposerInformation('//depot/branch@0.0.1');
+
+        $this->assertNull($result);
+    }
+
+    public function testCheckServerExists()
+    {
+        /* @var ProcessExecutor|\PHPUnit_Framework_MockObject_MockObject $processExecutor */
+        $processExecutor = $this->getMockBuilder('Composer\Util\ProcessExecutor')->getMock();
+
+        $expectedCommand = 'p4 -p perforce.does.exist:port info -s';
+        $processExecutor->expects($this->at(0))
+            ->method('execute')
+            ->with($this->equalTo($expectedCommand), $this->equalTo(null))
+            ->will($this->returnValue(0));
+
+        $result = $this->perforce->checkServerExists('perforce.does.exist:port', $processExecutor);
+        $this->assertTrue($result);
+    }
+
+    /**
+     * Test if "p4" command is missing.
+     *
+     * @covers \Composer\Util\Perforce::checkServerExists
+     */
+    public function testCheckServerClientError()
+    {
+        /* @var ProcessExecutor|\PHPUnit_Framework_MockObject_MockObject $processExecutor */
+        $processExecutor = $this->getMockBuilder('Composer\Util\ProcessExecutor')->getMock();
+
+        $expectedCommand = 'p4 -p perforce.does.exist:port info -s';
+        $processExecutor->expects($this->at(0))
+            ->method('execute')
+            ->with($this->equalTo($expectedCommand), $this->equalTo(null))
+            ->will($this->returnValue(127));
+
+        $result = $this->perforce->checkServerExists('perforce.does.exist:port', $processExecutor);
+        $this->assertFalse($result);
+    }
+
+    public function testCleanupClientSpecShouldDeleteClient()
+    {
+        /* @var Filesystem|\PHPUnit_Framework_MockObject_MockObject $fs */
+        $fs = $this->getMockBuilder('Composer\Util\Filesystem')->getMock();
+        $this->perforce->setFilesystem($fs);
+
+        $testClient = $this->perforce->getClient();
+        $expectedCommand = 'p4 -u '.self::TEST_P4USER.' -p '.self::TEST_PORT.' client -d '.$testClient;
+        $this->processExecutor->expects($this->once())->method('execute')->with($this->equalTo($expectedCommand));
+
+        $fs->expects($this->once())->method('remove')->with($this->perforce->getP4ClientSpec());
+
+        $this->perforce->cleanupClientSpec();
+    }
+
+    protected function createNewPerforceWithWindowsFlag($flag)
+    {
+        $this->perforce = new Perforce($this->repoConfig, self::TEST_PORT, self::TEST_PATH, $this->processExecutor, $flag, $this->io);
+    }
+
+    private function setAssetPerforceToStream()
+    {
+        $this->perforce->setStream('//depot/branch');
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Util/ValidatorTest.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/Util/ValidatorTest.php
new file mode 100644 (file)
index 0000000..0027cf8
--- /dev/null
@@ -0,0 +1,68 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Tests\Util;
+
+use Fxp\Composer\AssetPlugin\Assets;
+use Fxp\Composer\AssetPlugin\Util\Validator;
+
+/**
+ * Tests for the validator.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class ValidatorTest extends \PHPUnit_Framework_TestCase
+{
+    public function testValidBranch()
+    {
+        $this->assertNotFalse(Validator::validateBranch('master'));
+    }
+
+    public function testInvalidBranch()
+    {
+        $this->assertFalse(Validator::validateBranch('1.x'));
+    }
+
+    /**
+     * Data provider.
+     *
+     * @return array
+     */
+    public function getAssetTypes()
+    {
+        return array(
+            array('npm'),
+            array('bower'),
+        );
+    }
+
+    /**
+     * @param $type
+     *
+     * @dataProvider getAssetTypes
+     */
+    public function testValidTag($type)
+    {
+        $assetType = Assets::createType($type);
+        $this->assertNotFalse(Validator::validateTag('1.0.0', $assetType));
+    }
+
+    /**
+     * @param $type
+     *
+     * @dataProvider getAssetTypes
+     */
+    public function testInvalidTag($type)
+    {
+        $assetType = Assets::createType($type);
+        $this->assertFalse(Validator::validateTag('version', $assetType));
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/bootstrap.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Tests/bootstrap.php
new file mode 100644 (file)
index 0000000..7179a0b
--- /dev/null
@@ -0,0 +1,18 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+require __DIR__.'/../vendor/autoload.php';
+
+if (!class_exists('\PHPUnit_Framework_TestCase') && class_exists('\PHPUnit\Framework\TestCase')) {
+    class_alias('\PHPUnit\Framework\TestCase', '\PHPUnit_Framework_TestCase');
+}
+
+require __DIR__.'/../vendor/composer/composer/tests/Composer/TestCase.php';
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Type/AbstractAssetType.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Type/AbstractAssetType.php
new file mode 100644 (file)
index 0000000..a2c826e
--- /dev/null
@@ -0,0 +1,105 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Type;
+
+use Fxp\Composer\AssetPlugin\Converter\PackageConverterInterface;
+use Fxp\Composer\AssetPlugin\Converter\SemverConverter;
+use Fxp\Composer\AssetPlugin\Converter\VersionConverterInterface;
+
+/**
+ * Abstract asset type.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+abstract class AbstractAssetType implements AssetTypeInterface
+{
+    /**
+     * @var PackageConverterInterface
+     */
+    protected $packageConverter;
+
+    /**
+     * @var VersionConverterInterface
+     */
+    protected $versionConverter;
+
+    /**
+     * Constructor.
+     *
+     * @param PackageConverterInterface $packageConverter
+     * @param VersionConverterInterface $versionConverter
+     */
+    public function __construct(PackageConverterInterface $packageConverter = null, VersionConverterInterface $versionConverter = null)
+    {
+        $this->packageConverter = !$packageConverter ? $this->createPackageConverter() : $packageConverter;
+        $this->versionConverter = !$versionConverter ? new SemverConverter() : $versionConverter;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getComposerVendorName()
+    {
+        return $this->getName().'-asset';
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getComposerType()
+    {
+        return $this->getName().'-asset-library';
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getFilename()
+    {
+        return $this->getName().'.json';
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getPackageConverter()
+    {
+        return $this->packageConverter;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getVersionConverter()
+    {
+        return $this->versionConverter;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function formatComposerName($name)
+    {
+        $prefix = $this->getComposerVendorName().'/';
+
+        if (preg_match('/(\:\/\/)|\@/', $name) || 0 === strpos($name, $prefix)) {
+            return $name;
+        }
+
+        return $prefix.$name;
+    }
+
+    /**
+     * @return PackageConverterInterface
+     */
+    abstract protected function createPackageConverter();
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Type/AssetTypeInterface.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Type/AssetTypeInterface.php
new file mode 100644 (file)
index 0000000..4b46a04
--- /dev/null
@@ -0,0 +1,74 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Type;
+
+use Fxp\Composer\AssetPlugin\Converter\PackageConverterInterface;
+use Fxp\Composer\AssetPlugin\Converter\VersionConverterInterface;
+
+/**
+ * Asset type interface.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+interface AssetTypeInterface
+{
+    /**
+     * Gets the name of asset package mapping.
+     *
+     * @return string
+     */
+    public function getName();
+
+    /**
+     * Gets the composer vendor name.
+     *
+     * @return string
+     */
+    public function getComposerVendorName();
+
+    /**
+     * Gets the type of the composer package.
+     *
+     * @return string
+     */
+    public function getComposerType();
+
+    /**
+     * Gets the filename of asset package.
+     *
+     * @return string
+     */
+    public function getFilename();
+
+    /**
+     * Gets the version converter.
+     *
+     * @return VersionConverterInterface
+     */
+    public function getVersionConverter();
+
+    /**
+     * Gets the package converter.
+     *
+     * @return PackageConverterInterface
+     */
+    public function getPackageConverter();
+
+    /**
+     * Formats the package name with composer vendor if the name is not an URL.
+     *
+     * @param string $name The package name
+     *
+     * @return string
+     */
+    public function formatComposerName($name);
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Type/BowerAssetType.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Type/BowerAssetType.php
new file mode 100644 (file)
index 0000000..7250a8e
--- /dev/null
@@ -0,0 +1,38 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Type;
+
+use Fxp\Composer\AssetPlugin\Converter\BowerPackageConverter;
+
+/**
+ * Bower asset type.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class BowerAssetType extends AbstractAssetType
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function getName()
+    {
+        return 'bower';
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function createPackageConverter()
+    {
+        return new BowerPackageConverter($this);
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Type/NpmAssetType.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Type/NpmAssetType.php
new file mode 100644 (file)
index 0000000..22ced44
--- /dev/null
@@ -0,0 +1,46 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Type;
+
+use Fxp\Composer\AssetPlugin\Converter\NpmPackageConverter;
+
+/**
+ * NPM asset type.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class NpmAssetType extends AbstractAssetType
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function getName()
+    {
+        return 'npm';
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getFilename()
+    {
+        return 'package.json';
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function createPackageConverter()
+    {
+        return new NpmPackageConverter($this);
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Util/AssetPlugin.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Util/AssetPlugin.php
new file mode 100644 (file)
index 0000000..5288e01
--- /dev/null
@@ -0,0 +1,149 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Util;
+
+use Composer\Composer;
+use Composer\IO\IOInterface;
+use Composer\Package\Package;
+use Composer\Package\PackageInterface;
+use Composer\Repository\RepositoryManager;
+use Fxp\Composer\AssetPlugin\Assets;
+use Fxp\Composer\AssetPlugin\Config\Config;
+use Fxp\Composer\AssetPlugin\Installer\AssetInstaller;
+use Fxp\Composer\AssetPlugin\Installer\BowerInstaller;
+use Fxp\Composer\AssetPlugin\Repository\AssetRepositoryManager;
+use Fxp\Composer\AssetPlugin\Repository\VcsPackageFilter;
+
+/**
+ * Helper for FxpAssetPlugin.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class AssetPlugin
+{
+    /**
+     * Adds asset installers.
+     *
+     * @param Config      $config
+     * @param Composer    $composer
+     * @param IOInterface $io
+     */
+    public static function addInstallers(Config $config, Composer $composer, IOInterface $io)
+    {
+        $im = $composer->getInstallationManager();
+
+        $im->addInstaller(new BowerInstaller($config, $io, $composer, Assets::createType('bower')));
+        $im->addInstaller(new AssetInstaller($config, $io, $composer, Assets::createType('npm')));
+    }
+
+    /**
+     * Creates the asset options.
+     *
+     * @param array  $config    The composer config section of asset options
+     * @param string $assetType The asset type
+     *
+     * @return array The asset registry options
+     */
+    public static function createAssetOptions(array $config, $assetType)
+    {
+        $options = array();
+
+        foreach ($config as $key => $value) {
+            if (0 === strpos($key, $assetType.'-')) {
+                $key = substr($key, strlen($assetType) + 1);
+                $options[$key] = $value;
+            }
+        }
+
+        return $options;
+    }
+
+    /**
+     * Create the repository config.
+     *
+     * @param AssetRepositoryManager $arm       The asset repository manager
+     * @param VcsPackageFilter       $filter    The vcs package filter
+     * @param Config                 $config    The plugin config
+     * @param string                 $assetType The asset type
+     *
+     * @return array
+     */
+    public static function createRepositoryConfig(AssetRepositoryManager $arm, VcsPackageFilter $filter, Config $config, $assetType)
+    {
+        return array(
+            'asset-repository-manager' => $arm,
+            'vcs-package-filter' => $filter,
+            'asset-options' => static::createAssetOptions($config->getArray('registry-options'), $assetType),
+            'vcs-driver-options' => $config->getArray('vcs-driver-options'),
+        );
+    }
+
+    /**
+     * Adds asset registry repositories.
+     *
+     * @param AssetRepositoryManager $arm
+     * @param VcsPackageFilter       $filter
+     * @param Config                 $config
+     */
+    public static function addRegistryRepositories(AssetRepositoryManager $arm, VcsPackageFilter $filter, Config $config)
+    {
+        foreach (Assets::getRegistryFactories() as $registryType => $factoryClass) {
+            $ref = new \ReflectionClass($factoryClass);
+
+            if ($ref->implementsInterface('Fxp\Composer\AssetPlugin\Repository\RegistryFactoryInterface')) {
+                call_user_func(array($factoryClass, 'create'), $arm, $filter, $config);
+            }
+        }
+    }
+
+    /**
+     * Sets vcs type repositories.
+     *
+     * @param RepositoryManager $rm
+     */
+    public static function setVcsTypeRepositories(RepositoryManager $rm)
+    {
+        foreach (Assets::getTypes() as $assetType) {
+            foreach (Assets::getVcsRepositoryDrivers() as $driverType => $repositoryClass) {
+                $rm->setRepositoryClass($assetType.'-'.$driverType, $repositoryClass);
+            }
+        }
+    }
+
+    /**
+     * Adds the main file definitions from the root package.
+     *
+     * @param Config           $config
+     * @param PackageInterface $package
+     * @param string           $section
+     *
+     * @return PackageInterface
+     */
+    public static function addMainFiles(Config $config, PackageInterface $package, $section = 'main-files')
+    {
+        if ($package instanceof Package) {
+            $packageExtra = $package->getExtra();
+            $rootMainFiles = $config->getArray($section);
+
+            foreach ($rootMainFiles as $packageName => $files) {
+                if ($packageName === $package->getName()) {
+                    $packageExtra['bower-asset-main'] = $files;
+                    break;
+                }
+            }
+
+            $package->setExtra($packageExtra);
+        }
+
+        return $package;
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Util/Perforce.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Util/Perforce.php
new file mode 100644 (file)
index 0000000..3d5b8bd
--- /dev/null
@@ -0,0 +1,72 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Util;
+
+use Composer\IO\IOInterface;
+use Composer\Util\Perforce as BasePerforce;
+use Composer\Util\ProcessExecutor;
+
+/**
+ * Helper for perforce driver.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class Perforce extends BasePerforce
+{
+    /**
+     * @var string
+     */
+    protected $filename;
+
+    /**
+     * @param array $repoConfig
+     */
+    public function initialize($repoConfig)
+    {
+        parent::initialize($repoConfig);
+
+        $this->filename = (string) $repoConfig['filename'];
+    }
+
+    /**
+     * @param string $identifier
+     *
+     * @return array|string
+     */
+    public function getComposerInformation($identifier)
+    {
+        $composerFileContent = $this->getFileContent($this->filename, $identifier);
+
+        return !$composerFileContent
+            ? null
+            : json_decode($composerFileContent, true);
+    }
+
+    /**
+     * Create perforce helper.
+     *
+     * @param array           $repoConfig
+     * @param int|string      $port
+     * @param string          $path
+     * @param ProcessExecutor $process
+     * @param IOInterface     $io
+     *
+     * @return Perforce
+     */
+    public static function create($repoConfig, $port, $path, ProcessExecutor $process, IOInterface $io)
+    {
+        $isWindows = defined('PHP_WINDOWS_VERSION_BUILD');
+        $perforce = new self($repoConfig, $port, $path, $process, $isWindows, $io);
+
+        return $perforce;
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Util/Validator.php b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Util/Validator.php
new file mode 100644 (file)
index 0000000..bb59d26
--- /dev/null
@@ -0,0 +1,75 @@
+<?php
+
+/*
+ * This file is part of the Fxp Composer Asset Plugin package.
+ *
+ * (c) François Pluchino <francois.pluchino@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Fxp\Composer\AssetPlugin\Util;
+
+use Fxp\Composer\AssetPlugin\Package\Version\VersionParser;
+use Fxp\Composer\AssetPlugin\Type\AssetTypeInterface;
+
+/**
+ * Helper for validate branches and tags of the VCS repository.
+ *
+ * @author François Pluchino <francois.pluchino@gmail.com>
+ */
+class Validator
+{
+    /**
+     * Validates the branch.
+     *
+     * @param string             $branch
+     * @param VersionParser|null $parser
+     *
+     * @return false|string
+     */
+    public static function validateBranch($branch, VersionParser $parser = null)
+    {
+        if (null === $parser) {
+            $parser = new VersionParser();
+        }
+
+        $normalize = $parser->normalizeBranch($branch);
+
+        if (false !== strpos($normalize, '.9999999-dev')) {
+            return false;
+        }
+
+        return $normalize;
+    }
+
+    /**
+     * Validates the tag.
+     *
+     * @param string             $tag
+     * @param AssetTypeInterface $assetType
+     * @param VersionParser|null $parser
+     *
+     * @return false|string
+     */
+    public static function validateTag($tag, AssetTypeInterface $assetType, VersionParser $parser = null)
+    {
+        if (in_array($tag, array('master', 'trunk', 'default'))) {
+            return false;
+        }
+
+        if (null === $parser) {
+            $parser = new VersionParser();
+        }
+
+        try {
+            $tag = $assetType->getVersionConverter()->convertVersion($tag);
+            $tag = $parser->normalize($tag);
+        } catch (\Exception $e) {
+            $tag = false;
+        }
+
+        return $tag;
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/composer.json b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/composer.json
new file mode 100644 (file)
index 0000000..84efba1
--- /dev/null
@@ -0,0 +1,38 @@
+{
+    "name": "fxp/composer-asset-plugin",
+    "description": "NPM/Bower Dependency Manager for Composer",
+    "keywords": ["npm", "bower", "dependency manager", "package", "asset", "composer", "nodejs"],
+    "homepage": "https://github.com/fxpio/composer-asset-plugin",
+    "type": "composer-plugin",
+    "license": "MIT",
+    "authors": [
+        {
+            "name": "François Pluchino",
+            "email": "francois.pluchino@gmail.com"
+        }
+    ],
+    "require": {
+        "php": ">=5.3.3",
+        "composer-plugin-api": "^1.0"
+    },
+    "require-dev": {
+        "composer/composer": "^1.4.0"
+    },
+    "autoload": {
+        "psr-4": {
+            "Fxp\\Composer\\AssetPlugin\\": ""
+        },
+        "exclude-from-classmap": [
+            "/Tests/"
+        ]
+    },
+    "autoload-dev": {
+        "psr-0": { "Composer\\Test": "vendor/composer/composer/tests/" }
+    },
+    "extra": {
+        "class": "Fxp\\Composer\\AssetPlugin\\FxpAssetPlugin",
+        "branch-alias": {
+            "dev-master": "1.4-dev"
+        }
+    }
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/composer.lock b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/composer.lock
new file mode 100644 (file)
index 0000000..53a0644
--- /dev/null
@@ -0,0 +1,864 @@
+{
+    "_readme": [
+        "This file locks the dependencies of your project to a known state",
+        "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
+        "This file is @generated automatically"
+    ],
+    "content-hash": "11c6ba2583e3e46593055e56ed82b4f6",
+    "packages": [],
+    "packages-dev": [
+        {
+            "name": "composer/ca-bundle",
+            "version": "1.0.7",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/composer/ca-bundle.git",
+                "reference": "b17e6153cb7f33c7e44eb59578dc12eee5dc8e12"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/composer/ca-bundle/zipball/b17e6153cb7f33c7e44eb59578dc12eee5dc8e12",
+                "reference": "b17e6153cb7f33c7e44eb59578dc12eee5dc8e12",
+                "shasum": ""
+            },
+            "require": {
+                "ext-openssl": "*",
+                "ext-pcre": "*",
+                "php": "^5.3.2 || ^7.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^4.5",
+                "psr/log": "^1.0",
+                "symfony/process": "^2.5 || ^3.0"
+            },
+            "suggest": {
+                "symfony/process": "This is necessary to reliably check whether openssl_x509_parse is vulnerable on older php versions, but can be ignored on PHP 5.5.6+"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Composer\\CaBundle\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Jordi Boggiano",
+                    "email": "j.boggiano@seld.be",
+                    "homepage": "http://seld.be"
+                }
+            ],
+            "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.",
+            "keywords": [
+                "cabundle",
+                "cacert",
+                "certificate",
+                "ssl",
+                "tls"
+            ],
+            "time": "2017-03-06T11:59:08+00:00"
+        },
+        {
+            "name": "composer/composer",
+            "version": "1.5.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/composer/composer.git",
+                "reference": "d60a1ff0cb421fcd2811c3f2b57f7e3e2b6c9d0e"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/composer/composer/zipball/d60a1ff0cb421fcd2811c3f2b57f7e3e2b6c9d0e",
+                "reference": "d60a1ff0cb421fcd2811c3f2b57f7e3e2b6c9d0e",
+                "shasum": ""
+            },
+            "require": {
+                "composer/ca-bundle": "^1.0",
+                "composer/semver": "^1.0",
+                "composer/spdx-licenses": "^1.0",
+                "justinrainbow/json-schema": "^3.0 || ^4.0 || ^5.0",
+                "php": "^5.3.2 || ^7.0",
+                "psr/log": "^1.0",
+                "seld/cli-prompt": "^1.0",
+                "seld/jsonlint": "^1.4",
+                "seld/phar-utils": "^1.0",
+                "symfony/console": "^2.7 || ^3.0",
+                "symfony/filesystem": "^2.7 || ^3.0",
+                "symfony/finder": "^2.7 || ^3.0",
+                "symfony/process": "^2.7 || ^3.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^4.5 || ^5.0.5",
+                "phpunit/phpunit-mock-objects": "^2.3 || ^3.0"
+            },
+            "suggest": {
+                "ext-openssl": "Enabling the openssl extension allows you to access https URLs for repositories and packages",
+                "ext-zip": "Enabling the zip extension allows you to unzip archives",
+                "ext-zlib": "Allow gzip compression of HTTP requests"
+            },
+            "bin": [
+                "bin/composer"
+            ],
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.5-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Composer\\": "src/Composer"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nils Adermann",
+                    "email": "naderman@naderman.de",
+                    "homepage": "http://www.naderman.de"
+                },
+                {
+                    "name": "Jordi Boggiano",
+                    "email": "j.boggiano@seld.be",
+                    "homepage": "http://seld.be"
+                }
+            ],
+            "description": "Composer helps you declare, manage and install dependencies of PHP projects, ensuring you have the right stack everywhere.",
+            "homepage": "https://getcomposer.org/",
+            "keywords": [
+                "autoload",
+                "dependency",
+                "package"
+            ],
+            "time": "2017-08-09T14:07:22+00:00"
+        },
+        {
+            "name": "composer/semver",
+            "version": "1.4.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/composer/semver.git",
+                "reference": "c7cb9a2095a074d131b65a8a0cd294479d785573"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/composer/semver/zipball/c7cb9a2095a074d131b65a8a0cd294479d785573",
+                "reference": "c7cb9a2095a074d131b65a8a0cd294479d785573",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^5.3.2 || ^7.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^4.5 || ^5.0.5",
+                "phpunit/phpunit-mock-objects": "2.3.0 || ^3.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Composer\\Semver\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nils Adermann",
+                    "email": "naderman@naderman.de",
+                    "homepage": "http://www.naderman.de"
+                },
+                {
+                    "name": "Jordi Boggiano",
+                    "email": "j.boggiano@seld.be",
+                    "homepage": "http://seld.be"
+                },
+                {
+                    "name": "Rob Bast",
+                    "email": "rob.bast@gmail.com",
+                    "homepage": "http://robbast.nl"
+                }
+            ],
+            "description": "Semver library that offers utilities, version constraint parsing and validation.",
+            "keywords": [
+                "semantic",
+                "semver",
+                "validation",
+                "versioning"
+            ],
+            "time": "2016-08-30T16:08:34+00:00"
+        },
+        {
+            "name": "composer/spdx-licenses",
+            "version": "1.1.6",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/composer/spdx-licenses.git",
+                "reference": "2603a0d7ddc00a015deb576fa5297ca43dee6b1c"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/2603a0d7ddc00a015deb576fa5297ca43dee6b1c",
+                "reference": "2603a0d7ddc00a015deb576fa5297ca43dee6b1c",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^5.3.2 || ^7.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^4.5 || ^5.0.5",
+                "phpunit/phpunit-mock-objects": "2.3.0 || ^3.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Composer\\Spdx\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nils Adermann",
+                    "email": "naderman@naderman.de",
+                    "homepage": "http://www.naderman.de"
+                },
+                {
+                    "name": "Jordi Boggiano",
+                    "email": "j.boggiano@seld.be",
+                    "homepage": "http://seld.be"
+                },
+                {
+                    "name": "Rob Bast",
+                    "email": "rob.bast@gmail.com",
+                    "homepage": "http://robbast.nl"
+                }
+            ],
+            "description": "SPDX licenses list and validation library.",
+            "keywords": [
+                "license",
+                "spdx",
+                "validator"
+            ],
+            "time": "2017-04-03T19:08:52+00:00"
+        },
+        {
+            "name": "justinrainbow/json-schema",
+            "version": "5.2.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/justinrainbow/json-schema.git",
+                "reference": "429be236f296ca249d61c65649cdf2652f4a5e80"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/429be236f296ca249d61c65649cdf2652f4a5e80",
+                "reference": "429be236f296ca249d61c65649cdf2652f4a5e80",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "require-dev": {
+                "friendsofphp/php-cs-fixer": "^2.1",
+                "json-schema/json-schema-test-suite": "1.2.0",
+                "phpdocumentor/phpdocumentor": "^2.7",
+                "phpunit/phpunit": "^4.8.22"
+            },
+            "bin": [
+                "bin/validate-json"
+            ],
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "5.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "JsonSchema\\": "src/JsonSchema/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Bruno Prieto Reis",
+                    "email": "bruno.p.reis@gmail.com"
+                },
+                {
+                    "name": "Justin Rainbow",
+                    "email": "justin.rainbow@gmail.com"
+                },
+                {
+                    "name": "Igor Wiedler",
+                    "email": "igor@wiedler.ch"
+                },
+                {
+                    "name": "Robert Schönthal",
+                    "email": "seroscho@googlemail.com"
+                }
+            ],
+            "description": "A library to validate a json schema.",
+            "homepage": "https://github.com/justinrainbow/json-schema",
+            "keywords": [
+                "json",
+                "schema"
+            ],
+            "time": "2017-05-16T21:06:09+00:00"
+        },
+        {
+            "name": "psr/log",
+            "version": "1.0.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-fig/log.git",
+                "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-fig/log/zipball/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d",
+                "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Psr\\Log\\": "Psr/Log/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP-FIG",
+                    "homepage": "http://www.php-fig.org/"
+                }
+            ],
+            "description": "Common interface for logging libraries",
+            "homepage": "https://github.com/php-fig/log",
+            "keywords": [
+                "log",
+                "psr",
+                "psr-3"
+            ],
+            "time": "2016-10-10T12:19:37+00:00"
+        },
+        {
+            "name": "seld/cli-prompt",
+            "version": "1.0.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/Seldaek/cli-prompt.git",
+                "reference": "a19a7376a4689d4d94cab66ab4f3c816019ba8dd"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/Seldaek/cli-prompt/zipball/a19a7376a4689d4d94cab66ab4f3c816019ba8dd",
+                "reference": "a19a7376a4689d4d94cab66ab4f3c816019ba8dd",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Seld\\CliPrompt\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Jordi Boggiano",
+                    "email": "j.boggiano@seld.be"
+                }
+            ],
+            "description": "Allows you to prompt for user input on the command line, and optionally hide the characters they type",
+            "keywords": [
+                "cli",
+                "console",
+                "hidden",
+                "input",
+                "prompt"
+            ],
+            "time": "2017-03-18T11:32:45+00:00"
+        },
+        {
+            "name": "seld/jsonlint",
+            "version": "1.6.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/Seldaek/jsonlint.git",
+                "reference": "50d63f2858d87c4738d5b76a7dcbb99fa8cf7c77"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/50d63f2858d87c4738d5b76a7dcbb99fa8cf7c77",
+                "reference": "50d63f2858d87c4738d5b76a7dcbb99fa8cf7c77",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^5.3 || ^7.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^4.5"
+            },
+            "bin": [
+                "bin/jsonlint"
+            ],
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Seld\\JsonLint\\": "src/Seld/JsonLint/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Jordi Boggiano",
+                    "email": "j.boggiano@seld.be",
+                    "homepage": "http://seld.be"
+                }
+            ],
+            "description": "JSON Linter",
+            "keywords": [
+                "json",
+                "linter",
+                "parser",
+                "validator"
+            ],
+            "time": "2017-06-18T15:11:04+00:00"
+        },
+        {
+            "name": "seld/phar-utils",
+            "version": "1.0.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/Seldaek/phar-utils.git",
+                "reference": "7009b5139491975ef6486545a39f3e6dad5ac30a"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/7009b5139491975ef6486545a39f3e6dad5ac30a",
+                "reference": "7009b5139491975ef6486545a39f3e6dad5ac30a",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Seld\\PharUtils\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Jordi Boggiano",
+                    "email": "j.boggiano@seld.be"
+                }
+            ],
+            "description": "PHAR file format utilities, for when PHP phars you up",
+            "keywords": [
+                "phra"
+            ],
+            "time": "2015-10-13T18:44:15+00:00"
+        },
+        {
+            "name": "symfony/console",
+            "version": "v3.3.8",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/console.git",
+                "reference": "d6596cb5022b6a0bd940eae54a1de78646a5fda6"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/console/zipball/d6596cb5022b6a0bd940eae54a1de78646a5fda6",
+                "reference": "d6596cb5022b6a0bd940eae54a1de78646a5fda6",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^5.5.9|>=7.0.8",
+                "symfony/debug": "~2.8|~3.0",
+                "symfony/polyfill-mbstring": "~1.0"
+            },
+            "conflict": {
+                "symfony/dependency-injection": "<3.3"
+            },
+            "require-dev": {
+                "psr/log": "~1.0",
+                "symfony/config": "~3.3",
+                "symfony/dependency-injection": "~3.3",
+                "symfony/event-dispatcher": "~2.8|~3.0",
+                "symfony/filesystem": "~2.8|~3.0",
+                "symfony/process": "~2.8|~3.0"
+            },
+            "suggest": {
+                "psr/log": "For using the console logger",
+                "symfony/event-dispatcher": "",
+                "symfony/filesystem": "",
+                "symfony/process": ""
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.3-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Console\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony Console Component",
+            "homepage": "https://symfony.com",
+            "time": "2017-08-27T14:52:21+00:00"
+        },
+        {
+            "name": "symfony/debug",
+            "version": "v3.3.8",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/debug.git",
+                "reference": "084d804fe35808eb2ef596ec83d85d9768aa6c9d"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/debug/zipball/084d804fe35808eb2ef596ec83d85d9768aa6c9d",
+                "reference": "084d804fe35808eb2ef596ec83d85d9768aa6c9d",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^5.5.9|>=7.0.8",
+                "psr/log": "~1.0"
+            },
+            "conflict": {
+                "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2"
+            },
+            "require-dev": {
+                "symfony/http-kernel": "~2.8|~3.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.3-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Debug\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony Debug Component",
+            "homepage": "https://symfony.com",
+            "time": "2017-08-27T14:52:21+00:00"
+        },
+        {
+            "name": "symfony/filesystem",
+            "version": "v3.3.8",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/filesystem.git",
+                "reference": "b32a0e5f928d0fa3d1dd03c78d020777e50c10cb"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/filesystem/zipball/b32a0e5f928d0fa3d1dd03c78d020777e50c10cb",
+                "reference": "b32a0e5f928d0fa3d1dd03c78d020777e50c10cb",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^5.5.9|>=7.0.8"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.3-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Filesystem\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony Filesystem Component",
+            "homepage": "https://symfony.com",
+            "time": "2017-07-29T21:54:42+00:00"
+        },
+        {
+            "name": "symfony/finder",
+            "version": "v3.3.8",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/finder.git",
+                "reference": "b2260dbc80f3c4198f903215f91a1ac7fe9fe09e"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/finder/zipball/b2260dbc80f3c4198f903215f91a1ac7fe9fe09e",
+                "reference": "b2260dbc80f3c4198f903215f91a1ac7fe9fe09e",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^5.5.9|>=7.0.8"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.3-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Finder\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony Finder Component",
+            "homepage": "https://symfony.com",
+            "time": "2017-07-29T21:54:42+00:00"
+        },
+        {
+            "name": "symfony/polyfill-mbstring",
+            "version": "v1.5.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-mbstring.git",
+                "reference": "7c8fae0ac1d216eb54349e6a8baa57d515fe8803"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/7c8fae0ac1d216eb54349e6a8baa57d515fe8803",
+                "reference": "7c8fae0ac1d216eb54349e6a8baa57d515fe8803",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "suggest": {
+                "ext-mbstring": "For best performance"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.5-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Polyfill\\Mbstring\\": ""
+                },
+                "files": [
+                    "bootstrap.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony polyfill for the Mbstring extension",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compatibility",
+                "mbstring",
+                "polyfill",
+                "portable",
+                "shim"
+            ],
+            "time": "2017-06-14T15:44:48+00:00"
+        },
+        {
+            "name": "symfony/process",
+            "version": "v3.3.8",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/process.git",
+                "reference": "b7666e9b438027a1ea0e1ee813ec5042d5d7f6f0"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/process/zipball/b7666e9b438027a1ea0e1ee813ec5042d5d7f6f0",
+                "reference": "b7666e9b438027a1ea0e1ee813ec5042d5d7f6f0",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^5.5.9|>=7.0.8"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.3-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Process\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony Process Component",
+            "homepage": "https://symfony.com",
+            "time": "2017-07-29T21:54:42+00:00"
+        }
+    ],
+    "aliases": [],
+    "minimum-stability": "stable",
+    "stability-flags": [],
+    "prefer-stable": false,
+    "prefer-lowest": false,
+    "platform": {
+        "php": ">=5.3.3"
+    },
+    "platform-dev": []
+}
diff --git a/advancedcontentfilter/vendor/fxp/composer-asset-plugin/phpunit.xml.dist b/advancedcontentfilter/vendor/fxp/composer-asset-plugin/phpunit.xml.dist
new file mode 100644 (file)
index 0000000..1ec1af8
--- /dev/null
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<phpunit backupGlobals="false"
+         backupStaticAttributes="false"
+         colors="true"
+         convertErrorsToExceptions="true"
+         convertNoticesToExceptions="true"
+         convertWarningsToExceptions="true"
+         processIsolation="false"
+         stopOnFailure="false"
+         syntaxCheck="false"
+         bootstrap="Tests/bootstrap.php"
+        >
+
+    <testsuites>
+        <testsuite name="Fxp Composer Asset Plugin Test Suite">
+            <directory>./Tests/</directory>
+        </testsuite>
+    </testsuites>
+
+    <filter>
+        <whitelist>
+            <directory>./</directory>
+            <exclude>
+                <directory>./Tests</directory>
+                <directory>./Resources</directory>
+                <directory>./vendor</directory>
+            </exclude>
+        </whitelist>
+    </filter>
+</phpunit>
diff --git a/advancedcontentfilter/vendor/nikic/fast-route/.gitignore b/advancedcontentfilter/vendor/nikic/fast-route/.gitignore
new file mode 100644 (file)
index 0000000..e378a07
--- /dev/null
@@ -0,0 +1,5 @@
+/vendor/
+.idea/
+
+# ignore lock file since we have no extra dependencies
+composer.lock
diff --git a/advancedcontentfilter/vendor/nikic/fast-route/.hhconfig b/advancedcontentfilter/vendor/nikic/fast-route/.hhconfig
new file mode 100644 (file)
index 0000000..0c2153c
--- /dev/null
@@ -0,0 +1 @@
+assume_php=false
diff --git a/advancedcontentfilter/vendor/nikic/fast-route/.travis.yml b/advancedcontentfilter/vendor/nikic/fast-route/.travis.yml
new file mode 100644 (file)
index 0000000..10f8381
--- /dev/null
@@ -0,0 +1,20 @@
+sudo: false
+language: php
+
+php:
+  - 5.4
+  - 5.5
+  - 5.6
+  - 7.0
+  - 7.1
+  - 7.2
+  - hhvm
+
+script:
+  - ./vendor/bin/phpunit
+
+before_install:
+  - travis_retry composer self-update
+
+install:
+  - composer install
diff --git a/advancedcontentfilter/vendor/nikic/fast-route/FastRoute.hhi b/advancedcontentfilter/vendor/nikic/fast-route/FastRoute.hhi
new file mode 100644 (file)
index 0000000..8d50738
--- /dev/null
@@ -0,0 +1,126 @@
+<?hh // decl
+
+namespace FastRoute {
+    class BadRouteException extends \LogicException {
+    }
+
+    interface RouteParser {
+        public function parse(string $route): array<array>;
+    }
+
+    class RouteCollector {
+        public function __construct(RouteParser $routeParser, DataGenerator $dataGenerator);
+        public function addRoute(mixed $httpMethod, string $route, mixed $handler): void;
+        public function getData(): array;
+    }
+
+    class Route {
+        public function __construct(string $httpMethod, mixed $handler, string $regex, array $variables);
+        public function matches(string $str): bool;
+    }
+
+    interface DataGenerator {
+        public function addRoute(string $httpMethod, array $routeData, mixed $handler);
+        public function getData(): array;
+    }
+
+    interface Dispatcher {
+        const int NOT_FOUND = 0;
+        const int FOUND = 1;
+        const int METHOD_NOT_ALLOWED = 2;
+        public function dispatch(string $httpMethod, string $uri): array;
+    }
+
+    function simpleDispatcher(
+        (function(RouteCollector): void) $routeDefinitionCallback,
+        shape(
+          ?'routeParser' => classname<RouteParser>,
+          ?'dataGenerator' => classname<DataGenerator>,
+          ?'dispatcher' => classname<Dispatcher>,
+          ?'routeCollector' => classname<RouteCollector>,
+        ) $options = shape()): Dispatcher;
+
+    function cachedDispatcher(
+        (function(RouteCollector): void) $routeDefinitionCallback,
+        shape(
+          ?'routeParser' => classname<RouteParser>,
+          ?'dataGenerator' => classname<DataGenerator>,
+          ?'dispatcher' => classname<Dispatcher>,
+          ?'routeCollector' => classname<RouteCollector>,
+          ?'cacheDisabled' => bool,
+          ?'cacheFile' => string,
+        ) $options = shape()): Dispatcher;
+}
+
+namespace FastRoute\DataGenerator {
+    abstract class RegexBasedAbstract implements \FastRoute\DataGenerator {
+        protected abstract function getApproxChunkSize();
+        protected abstract function processChunk($regexToRoutesMap);
+
+        public function addRoute(string $httpMethod, array $routeData, mixed $handler): void;
+        public function getData(): array;
+    }
+
+    class CharCountBased extends RegexBasedAbstract {
+        protected function getApproxChunkSize(): int;
+        protected function processChunk(array<string, string> $regexToRoutesMap): array<string, mixed>;
+    }
+
+    class GroupCountBased extends RegexBasedAbstract {
+        protected function getApproxChunkSize(): int;
+        protected function processChunk(array<string, string> $regexToRoutesMap): array<string, mixed>;
+    }
+
+    class GroupPosBased extends RegexBasedAbstract {
+        protected function getApproxChunkSize(): int;
+        protected function processChunk(array<string, string> $regexToRoutesMap): array<string, mixed>;
+    }
+
+    class MarkBased extends RegexBasedAbstract {
+        protected function getApproxChunkSize(): int;
+        protected function processChunk(array<string, string> $regexToRoutesMap): array<string, mixed>;
+    }
+}
+
+namespace FastRoute\Dispatcher {
+    abstract class RegexBasedAbstract implements \FastRoute\Dispatcher {
+        protected abstract function dispatchVariableRoute(array<array> $routeData, string $uri): array;
+
+        public function dispatch(string $httpMethod, string $uri): array;
+    }
+
+    class GroupPosBased extends RegexBasedAbstract {
+        public function __construct(array $data);
+        protected function dispatchVariableRoute(array<array> $routeData, string $uri): array;
+    }
+
+    class GroupCountBased extends RegexBasedAbstract {
+        public function __construct(array $data);
+        protected function dispatchVariableRoute(array<array> $routeData, string $uri): array;
+    }
+
+    class CharCountBased extends RegexBasedAbstract {
+        public function __construct(array $data);
+        protected function dispatchVariableRoute(array<array> $routeData, string $uri): array;
+    }
+
+    class MarkBased extends RegexBasedAbstract {
+        public function __construct(array $data);
+        protected function dispatchVariableRoute(array<array> $routeData, string $uri): array;
+    }
+}
+
+namespace FastRoute\RouteParser {
+    class Std implements \FastRoute\RouteParser {
+        const string VARIABLE_REGEX = <<<'REGEX'
+\{
+    \s* ([a-zA-Z][a-zA-Z0-9_]*) \s*
+    (?:
+        : \s* ([^{}]*(?:\{(?-1)\}[^{}]*)*)
+    )?
+\}
+REGEX;
+        const string DEFAULT_DISPATCH_REGEX = '[^/]+';
+        public function parse(string $route): array<array>;
+    }
+}
diff --git a/advancedcontentfilter/vendor/nikic/fast-route/LICENSE b/advancedcontentfilter/vendor/nikic/fast-route/LICENSE
new file mode 100644 (file)
index 0000000..478e764
--- /dev/null
@@ -0,0 +1,31 @@
+Copyright (c) 2013 by Nikita Popov.
+
+Some rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+
+    * The names of the contributors may not be used to endorse or
+      promote products derived from this software without specific
+      prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/advancedcontentfilter/vendor/nikic/fast-route/README.md b/advancedcontentfilter/vendor/nikic/fast-route/README.md
new file mode 100644 (file)
index 0000000..91bd466
--- /dev/null
@@ -0,0 +1,313 @@
+FastRoute - Fast request router for PHP
+=======================================
+
+This library provides a fast implementation of a regular expression based router. [Blog post explaining how the
+implementation works and why it is fast.][blog_post]
+
+Install
+-------
+
+To install with composer:
+
+```sh
+composer require nikic/fast-route
+```
+
+Requires PHP 5.4 or newer.
+
+Usage
+-----
+
+Here's a basic usage example:
+
+```php
+<?php
+
+require '/path/to/vendor/autoload.php';
+
+$dispatcher = FastRoute\simpleDispatcher(function(FastRoute\RouteCollector $r) {
+    $r->addRoute('GET', '/users', 'get_all_users_handler');
+    // {id} must be a number (\d+)
+    $r->addRoute('GET', '/user/{id:\d+}', 'get_user_handler');
+    // The /{title} suffix is optional
+    $r->addRoute('GET', '/articles/{id:\d+}[/{title}]', 'get_article_handler');
+});
+
+// Fetch method and URI from somewhere
+$httpMethod = $_SERVER['REQUEST_METHOD'];
+$uri = $_SERVER['REQUEST_URI'];
+
+// Strip query string (?foo=bar) and decode URI
+if (false !== $pos = strpos($uri, '?')) {
+    $uri = substr($uri, 0, $pos);
+}
+$uri = rawurldecode($uri);
+
+$routeInfo = $dispatcher->dispatch($httpMethod, $uri);
+switch ($routeInfo[0]) {
+    case FastRoute\Dispatcher::NOT_FOUND:
+        // ... 404 Not Found
+        break;
+    case FastRoute\Dispatcher::METHOD_NOT_ALLOWED:
+        $allowedMethods = $routeInfo[1];
+        // ... 405 Method Not Allowed
+        break;
+    case FastRoute\Dispatcher::FOUND:
+        $handler = $routeInfo[1];
+        $vars = $routeInfo[2];
+        // ... call $handler with $vars
+        break;
+}
+```
+
+### Defining routes
+
+The routes are defined by calling the `FastRoute\simpleDispatcher()` function, which accepts
+a callable taking a `FastRoute\RouteCollector` instance. The routes are added by calling
+`addRoute()` on the collector instance:
+
+```php
+$r->addRoute($method, $routePattern, $handler);
+```
+
+The `$method` is an uppercase HTTP method string for which a certain route should match. It
+is possible to specify multiple valid methods using an array:
+
+```php
+// These two calls
+$r->addRoute('GET', '/test', 'handler');
+$r->addRoute('POST', '/test', 'handler');
+// Are equivalent to this one call
+$r->addRoute(['GET', 'POST'], '/test', 'handler');
+```
+
+By default the `$routePattern` uses a syntax where `{foo}` specifies a placeholder with name `foo`
+and matching the regex `[^/]+`. To adjust the pattern the placeholder matches, you can specify
+a custom pattern by writing `{bar:[0-9]+}`. Some examples:
+
+```php
+// Matches /user/42, but not /user/xyz
+$r->addRoute('GET', '/user/{id:\d+}', 'handler');
+
+// Matches /user/foobar, but not /user/foo/bar
+$r->addRoute('GET', '/user/{name}', 'handler');
+
+// Matches /user/foo/bar as well
+$r->addRoute('GET', '/user/{name:.+}', 'handler');
+```
+
+Custom patterns for route placeholders cannot use capturing groups. For example `{lang:(en|de)}`
+is not a valid placeholder, because `()` is a capturing group. Instead you can use either
+`{lang:en|de}` or `{lang:(?:en|de)}`.
+
+Furthermore parts of the route enclosed in `[...]` are considered optional, so that `/foo[bar]`
+will match both `/foo` and `/foobar`. Optional parts are only supported in a trailing position,
+not in the middle of a route.
+
+```php
+// This route
+$r->addRoute('GET', '/user/{id:\d+}[/{name}]', 'handler');
+// Is equivalent to these two routes
+$r->addRoute('GET', '/user/{id:\d+}', 'handler');
+$r->addRoute('GET', '/user/{id:\d+}/{name}', 'handler');
+
+// Multiple nested optional parts are possible as well
+$r->addRoute('GET', '/user[/{id:\d+}[/{name}]]', 'handler');
+
+// This route is NOT valid, because optional parts can only occur at the end
+$r->addRoute('GET', '/user[/{id:\d+}]/{name}', 'handler');
+```
+
+The `$handler` parameter does not necessarily have to be a callback, it could also be a controller
+class name or any other kind of data you wish to associate with the route. FastRoute only tells you
+which handler corresponds to your URI, how you interpret it is up to you.
+
+#### Shorcut methods for common request methods
+
+For the `GET`, `POST`, `PUT`, `PATCH`, `DELETE` and `HEAD` request methods shortcut methods are available. For example:
+
+```php
+$r->get('/get-route', 'get_handler');
+$r->post('/post-route', 'post_handler');
+```
+
+Is equivalent to:
+
+```php
+$r->addRoute('GET', '/get-route', 'get_handler');
+$r->addRoute('POST', '/post-route', 'post_handler');
+```
+
+#### Route Groups
+
+Additionally, you can specify routes inside of a group. All routes defined inside a group will have a common prefix.
+
+For example, defining your routes as:
+
+```php
+$r->addGroup('/admin', function (RouteCollector $r) {
+    $r->addRoute('GET', '/do-something', 'handler');
+    $r->addRoute('GET', '/do-another-thing', 'handler');
+    $r->addRoute('GET', '/do-something-else', 'handler');
+});
+```
+
+Will have the same result as:
+
+ ```php
+$r->addRoute('GET', '/admin/do-something', 'handler');
+$r->addRoute('GET', '/admin/do-another-thing', 'handler');
+$r->addRoute('GET', '/admin/do-something-else', 'handler');
+ ```
+
+Nested groups are also supported, in which case the prefixes of all the nested groups are combined.
+
+### Caching
+
+The reason `simpleDispatcher` accepts a callback for defining the routes is to allow seamless
+caching. By using `cachedDispatcher` instead of `simpleDispatcher` you can cache the generated
+routing data and construct the dispatcher from the cached information:
+
+```php
+<?php
+
+$dispatcher = FastRoute\cachedDispatcher(function(FastRoute\RouteCollector $r) {
+    $r->addRoute('GET', '/user/{name}/{id:[0-9]+}', 'handler0');
+    $r->addRoute('GET', '/user/{id:[0-9]+}', 'handler1');
+    $r->addRoute('GET', '/user/{name}', 'handler2');
+}, [
+    'cacheFile' => __DIR__ . '/route.cache', /* required */
+    'cacheDisabled' => IS_DEBUG_ENABLED,     /* optional, enabled by default */
+]);
+```
+
+The second parameter to the function is an options array, which can be used to specify the cache
+file location, among other things.
+
+### Dispatching a URI
+
+A URI is dispatched by calling the `dispatch()` method of the created dispatcher. This method
+accepts the HTTP method and a URI. Getting those two bits of information (and normalizing them
+appropriately) is your job - this library is not bound to the PHP web SAPIs.
+
+The `dispatch()` method returns an array whose first element contains a status code. It is one
+of `Dispatcher::NOT_FOUND`, `Dispatcher::METHOD_NOT_ALLOWED` and `Dispatcher::FOUND`. For the
+method not allowed status the second array element contains a list of HTTP methods allowed for
+the supplied URI. For example:
+
+    [FastRoute\Dispatcher::METHOD_NOT_ALLOWED, ['GET', 'POST']]
+
+> **NOTE:** The HTTP specification requires that a `405 Method Not Allowed` response include the
+`Allow:` header to detail available methods for the requested resource. Applications using FastRoute
+should use the second array element to add this header when relaying a 405 response.
+
+For the found status the second array element is the handler that was associated with the route
+and the third array element is a dictionary of placeholder names to their values. For example:
+
+    /* Routing against GET /user/nikic/42 */
+
+    [FastRoute\Dispatcher::FOUND, 'handler0', ['name' => 'nikic', 'id' => '42']]
+
+### Overriding the route parser and dispatcher
+
+The routing process makes use of three components: A route parser, a data generator and a
+dispatcher. The three components adhere to the following interfaces:
+
+```php
+<?php
+
+namespace FastRoute;
+
+interface RouteParser {
+    public function parse($route);
+}
+
+interface DataGenerator {
+    public function addRoute($httpMethod, $routeData, $handler);
+    public function getData();
+}
+
+interface Dispatcher {
+    const NOT_FOUND = 0, FOUND = 1, METHOD_NOT_ALLOWED = 2;
+
+    public function dispatch($httpMethod, $uri);
+}
+```
+
+The route parser takes a route pattern string and converts it into an array of route infos, where
+each route info is again an array of it's parts. The structure is best understood using an example:
+
+    /* The route /user/{id:\d+}[/{name}] converts to the following array: */
+    [
+        [
+            '/user/',
+            ['id', '\d+'],
+        ],
+        [
+            '/user/',
+            ['id', '\d+'],
+            '/',
+            ['name', '[^/]+'],
+        ],
+    ]
+
+This array can then be passed to the `addRoute()` method of a data generator. After all routes have
+been added the `getData()` of the generator is invoked, which returns all the routing data required
+by the dispatcher. The format of this data is not further specified - it is tightly coupled to
+the corresponding dispatcher.
+
+The dispatcher accepts the routing data via a constructor and provides a `dispatch()` method, which
+you're already familiar with.
+
+The route parser can be overwritten individually (to make use of some different pattern syntax),
+however the data generator and dispatcher should always be changed as a pair, as the output from
+the former is tightly coupled to the input of the latter. The reason the generator and the
+dispatcher are separate is that only the latter is needed when using caching (as the output of
+the former is what is being cached.)
+
+When using the `simpleDispatcher` / `cachedDispatcher` functions from above the override happens
+through the options array:
+
+```php
+<?php
+
+$dispatcher = FastRoute\simpleDispatcher(function(FastRoute\RouteCollector $r) {
+    /* ... */
+}, [
+    'routeParser' => 'FastRoute\\RouteParser\\Std',
+    'dataGenerator' => 'FastRoute\\DataGenerator\\GroupCountBased',
+    'dispatcher' => 'FastRoute\\Dispatcher\\GroupCountBased',
+]);
+```
+
+The above options array corresponds to the defaults. By replacing `GroupCountBased` by
+`GroupPosBased` you could switch to a different dispatching strategy.
+
+### A Note on HEAD Requests
+
+The HTTP spec requires servers to [support both GET and HEAD methods][2616-511]:
+
+> The methods GET and HEAD MUST be supported by all general-purpose servers
+
+To avoid forcing users to manually register HEAD routes for each resource we fallback to matching an
+available GET route for a given resource. The PHP web SAPI transparently removes the entity body
+from HEAD responses so this behavior has no effect on the vast majority of users.
+
+However, implementers using FastRoute outside the web SAPI environment (e.g. a custom server) MUST
+NOT send entity bodies generated in response to HEAD requests. If you are a non-SAPI user this is
+*your responsibility*; FastRoute has no purview to prevent you from breaking HTTP in such cases.
+
+Finally, note that applications MAY always specify their own HEAD method route for a given
+resource to bypass this behavior entirely.
+
+### Credits
+
+This library is based on a router that [Levi Morrison][levi] implemented for the Aerys server.
+
+A large number of tests, as well as HTTP compliance considerations, were provided by [Daniel Lowrey][rdlowrey].
+
+
+[2616-511]: http://www.w3.org/Protocols/rfc2616/rfc2616-sec5.html#sec5.1.1 "RFC 2616 Section 5.1.1"
+[blog_post]: http://nikic.github.io/2014/02/18/Fast-request-routing-using-regular-expressions.html
+[levi]: https://github.com/morrisonlevi
+[rdlowrey]: https://github.com/rdlowrey
diff --git a/advancedcontentfilter/vendor/nikic/fast-route/composer.json b/advancedcontentfilter/vendor/nikic/fast-route/composer.json
new file mode 100644 (file)
index 0000000..fb446a2
--- /dev/null
@@ -0,0 +1,24 @@
+{
+  "name": "nikic/fast-route",
+  "description": "Fast request router for PHP",
+  "keywords": ["routing", "router"],
+  "license": "BSD-3-Clause",
+  "authors": [
+    {
+      "name": "Nikita Popov",
+      "email": "nikic@php.net"
+    }
+  ],
+  "autoload": {
+    "psr-4": {
+      "FastRoute\\": "src/"
+    },
+    "files": ["src/functions.php"]
+  },
+  "require": {
+    "php": ">=5.4.0"
+  },
+  "require-dev": {
+    "phpunit/phpunit": "^4.8.35|~5.7"
+  }
+}
diff --git a/advancedcontentfilter/vendor/nikic/fast-route/phpunit.xml b/advancedcontentfilter/vendor/nikic/fast-route/phpunit.xml
new file mode 100644 (file)
index 0000000..3c807b6
--- /dev/null
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<phpunit backupGlobals="false"
+         backupStaticAttributes="false"
+         colors="true"
+         convertErrorsToExceptions="true"
+         convertNoticesToExceptions="true"
+         convertWarningsToExceptions="true"
+         processIsolation="false"
+         syntaxCheck="false"
+         bootstrap="test/bootstrap.php"
+        >
+    <testsuites>
+        <testsuite name="FastRoute Tests">
+            <directory>./test/</directory>
+        </testsuite>
+    </testsuites>
+
+    <filter>
+        <whitelist>
+            <directory>./src/</directory>
+        </whitelist>
+    </filter>
+</phpunit>
diff --git a/advancedcontentfilter/vendor/nikic/fast-route/psalm.xml b/advancedcontentfilter/vendor/nikic/fast-route/psalm.xml
new file mode 100644 (file)
index 0000000..0dca5d7
--- /dev/null
@@ -0,0 +1,28 @@
+<?xml version="1.0"?>
+<psalm
+    name="Example Psalm config with recommended defaults"
+    stopOnFirstError="false"
+    useDocblockTypes="true"
+    totallyTyped="false"
+    requireVoidReturnType="false"
+>
+    <projectFiles>
+        <directory name="src" />
+    </projectFiles>
+
+    <issueHandlers>
+        <LessSpecificReturnType errorLevel="info" />
+
+        <!-- level 3 issues - slightly lazy code writing, but provably low false-negatives -->
+        <DeprecatedMethod errorLevel="info" />
+
+        <MissingClosureReturnType errorLevel="info" />
+        <MissingReturnType errorLevel="info" />
+        <MissingPropertyType errorLevel="info" />
+        <InvalidDocblock errorLevel="info" />
+        <MisplacedRequiredParam errorLevel="info" />
+
+        <PropertyNotSetInConstructor errorLevel="info" />
+        <MissingConstructor errorLevel="info" />
+    </issueHandlers>
+</psalm>
diff --git a/advancedcontentfilter/vendor/nikic/fast-route/src/BadRouteException.php b/advancedcontentfilter/vendor/nikic/fast-route/src/BadRouteException.php
new file mode 100644 (file)
index 0000000..62262ec
--- /dev/null
@@ -0,0 +1,7 @@
+<?php
+
+namespace FastRoute;
+
+class BadRouteException extends \LogicException
+{
+}
diff --git a/advancedcontentfilter/vendor/nikic/fast-route/src/DataGenerator.php b/advancedcontentfilter/vendor/nikic/fast-route/src/DataGenerator.php
new file mode 100644 (file)
index 0000000..af577cd
--- /dev/null
@@ -0,0 +1,26 @@
+<?php
+
+namespace FastRoute;
+
+interface DataGenerator
+{
+    /**
+     * Adds a route to the data generator. The route data uses the
+     * same format that is returned by RouterParser::parser().
+     *
+     * The handler doesn't necessarily need to be a callable, it
+     * can be arbitrary data that will be returned when the route
+     * matches.
+     *
+     * @param string $httpMethod
+     * @param array $routeData
+     * @param mixed $handler
+     */
+    public function addRoute($httpMethod, $routeData, $handler);
+
+    /**
+     * Returns dispatcher data in some unspecified format, which
+     * depends on the used method of dispatch.
+     */
+    public function getData();
+}
diff --git a/advancedcontentfilter/vendor/nikic/fast-route/src/DataGenerator/CharCountBased.php b/advancedcontentfilter/vendor/nikic/fast-route/src/DataGenerator/CharCountBased.php
new file mode 100644 (file)
index 0000000..3cfeed6
--- /dev/null
@@ -0,0 +1,31 @@
+<?php
+
+namespace FastRoute\DataGenerator;
+
+class CharCountBased extends RegexBasedAbstract
+{
+    protected function getApproxChunkSize()
+    {
+        return 30;
+    }
+
+    protected function processChunk($regexToRoutesMap)
+    {
+        $routeMap = [];
+        $regexes = [];
+
+        $suffixLen = 0;
+        $suffix = '';
+        $count = count($regexToRoutesMap);
+        foreach ($regexToRoutesMap as $regex => $route) {
+            $suffixLen++;
+            $suffix .= "\t";
+
+            $regexes[] = '(?:' . $regex . '/(\t{' . $suffixLen . '})\t{' . ($count - $suffixLen) . '})';
+            $routeMap[$suffix] = [$route->handler, $route->variables];
+        }
+
+        $regex = '~^(?|' . implode('|', $regexes) . ')$~';
+        return ['regex' => $regex, 'suffix' => '/' . $suffix, 'routeMap' => $routeMap];
+    }
+}
diff --git a/advancedcontentfilter/vendor/nikic/fast-route/src/DataGenerator/GroupCountBased.php b/advancedcontentfilter/vendor/nikic/fast-route/src/DataGenerator/GroupCountBased.php
new file mode 100644 (file)
index 0000000..54d9a05
--- /dev/null
@@ -0,0 +1,30 @@
+<?php
+
+namespace FastRoute\DataGenerator;
+
+class GroupCountBased extends RegexBasedAbstract
+{
+    protected function getApproxChunkSize()
+    {
+        return 10;
+    }
+
+    protected function processChunk($regexToRoutesMap)
+    {
+        $routeMap = [];
+        $regexes = [];
+        $numGroups = 0;
+        foreach ($regexToRoutesMap as $regex => $route) {
+            $numVariables = count($route->variables);
+            $numGroups = max($numGroups, $numVariables);
+
+            $regexes[] = $regex . str_repeat('()', $numGroups - $numVariables);
+            $routeMap[$numGroups + 1] = [$route->handler, $route->variables];
+
+            ++$numGroups;
+        }
+
+        $regex = '~^(?|' . implode('|', $regexes) . ')$~';
+        return ['regex' => $regex, 'routeMap' => $routeMap];
+    }
+}
diff --git a/advancedcontentfilter/vendor/nikic/fast-route/src/DataGenerator/GroupPosBased.php b/advancedcontentfilter/vendor/nikic/fast-route/src/DataGenerator/GroupPosBased.php
new file mode 100644 (file)
index 0000000..fc4dc0a
--- /dev/null
@@ -0,0 +1,27 @@
+<?php
+
+namespace FastRoute\DataGenerator;
+
+class GroupPosBased extends RegexBasedAbstract
+{
+    protected function getApproxChunkSize()
+    {
+        return 10;
+    }
+
+    protected function processChunk($regexToRoutesMap)
+    {
+        $routeMap = [];
+        $regexes = [];
+        $offset = 1;
+        foreach ($regexToRoutesMap as $regex => $route) {
+            $regexes[] = $regex;
+            $routeMap[$offset] = [$route->handler, $route->variables];
+
+            $offset += count($route->variables);
+        }
+
+        $regex = '~^(?:' . implode('|', $regexes) . ')$~';
+        return ['regex' => $regex, 'routeMap' => $routeMap];
+    }
+}
diff --git a/advancedcontentfilter/vendor/nikic/fast-route/src/DataGenerator/MarkBased.php b/advancedcontentfilter/vendor/nikic/fast-route/src/DataGenerator/MarkBased.php
new file mode 100644 (file)
index 0000000..0aebed9
--- /dev/null
@@ -0,0 +1,27 @@
+<?php
+
+namespace FastRoute\DataGenerator;
+
+class MarkBased extends RegexBasedAbstract
+{
+    protected function getApproxChunkSize()
+    {
+        return 30;
+    }
+
+    protected function processChunk($regexToRoutesMap)
+    {
+        $routeMap = [];
+        $regexes = [];
+        $markName = 'a';
+        foreach ($regexToRoutesMap as $regex => $route) {
+            $regexes[] = $regex . '(*MARK:' . $markName . ')';
+            $routeMap[$markName] = [$route->handler, $route->variables];
+
+            ++$markName;
+        }
+
+        $regex = '~^(?|' . implode('|', $regexes) . ')$~';
+        return ['regex' => $regex, 'routeMap' => $routeMap];
+    }
+}
diff --git a/advancedcontentfilter/vendor/nikic/fast-route/src/DataGenerator/RegexBasedAbstract.php b/advancedcontentfilter/vendor/nikic/fast-route/src/DataGenerator/RegexBasedAbstract.php
new file mode 100644 (file)
index 0000000..6457290
--- /dev/null
@@ -0,0 +1,186 @@
+<?php
+
+namespace FastRoute\DataGenerator;
+
+use FastRoute\BadRouteException;
+use FastRoute\DataGenerator;
+use FastRoute\Route;
+
+abstract class RegexBasedAbstract implements DataGenerator
+{
+    /** @var mixed[][] */
+    protected $staticRoutes = [];
+
+    /** @var Route[][] */
+    protected $methodToRegexToRoutesMap = [];
+
+    /**
+     * @return int
+     */
+    abstract protected function getApproxChunkSize();
+
+    /**
+     * @return mixed[]
+     */
+    abstract protected function processChunk($regexToRoutesMap);
+
+    public function addRoute($httpMethod, $routeData, $handler)
+    {
+        if ($this->isStaticRoute($routeData)) {
+            $this->addStaticRoute($httpMethod, $routeData, $handler);
+        } else {
+            $this->addVariableRoute($httpMethod, $routeData, $handler);
+        }
+    }
+
+    /**
+     * @return mixed[]
+     */
+    public function getData()
+    {
+        if (empty($this->methodToRegexToRoutesMap)) {
+            return [$this->staticRoutes, []];
+        }
+
+        return [$this->staticRoutes, $this->generateVariableRouteData()];
+    }
+
+    /**
+     * @return mixed[]
+     */
+    private function generateVariableRouteData()
+    {
+        $data = [];
+        foreach ($this->methodToRegexToRoutesMap as $method => $regexToRoutesMap) {
+            $chunkSize = $this->computeChunkSize(count($regexToRoutesMap));
+            $chunks = array_chunk($regexToRoutesMap, $chunkSize, true);
+            $data[$method] = array_map([$this, 'processChunk'], $chunks);
+        }
+        return $data;
+    }
+
+    /**
+     * @param int
+     * @return int
+     */
+    private function computeChunkSize($count)
+    {
+        $numParts = max(1, round($count / $this->getApproxChunkSize()));
+        return (int) ceil($count / $numParts);
+    }
+
+    /**
+     * @param mixed[]
+     * @return bool
+     */
+    private function isStaticRoute($routeData)
+    {
+        return count($routeData) === 1 && is_string($routeData[0]);
+    }
+
+    private function addStaticRoute($httpMethod, $routeData, $handler)
+    {
+        $routeStr = $routeData[0];
+
+        if (isset($this->staticRoutes[$httpMethod][$routeStr])) {
+            throw new BadRouteException(sprintf(
+                'Cannot register two routes matching "%s" for method "%s"',
+                $routeStr, $httpMethod
+            ));
+        }
+
+        if (isset($this->methodToRegexToRoutesMap[$httpMethod])) {
+            foreach ($this->methodToRegexToRoutesMap[$httpMethod] as $route) {
+                if ($route->matches($routeStr)) {
+                    throw new BadRouteException(sprintf(
+                        'Static route "%s" is shadowed by previously defined variable route "%s" for method "%s"',
+                        $routeStr, $route->regex, $httpMethod
+                    ));
+                }
+            }
+        }
+
+        $this->staticRoutes[$httpMethod][$routeStr] = $handler;
+    }
+
+    private function addVariableRoute($httpMethod, $routeData, $handler)
+    {
+        list($regex, $variables) = $this->buildRegexForRoute($routeData);
+
+        if (isset($this->methodToRegexToRoutesMap[$httpMethod][$regex])) {
+            throw new BadRouteException(sprintf(
+                'Cannot register two routes matching "%s" for method "%s"',
+                $regex, $httpMethod
+            ));
+        }
+
+        $this->methodToRegexToRoutesMap[$httpMethod][$regex] = new Route(
+            $httpMethod, $handler, $regex, $variables
+        );
+    }
+
+    /**
+     * @param mixed[]
+     * @return mixed[]
+     */
+    private function buildRegexForRoute($routeData)
+    {
+        $regex = '';
+        $variables = [];
+        foreach ($routeData as $part) {
+            if (is_string($part)) {
+                $regex .= preg_quote($part, '~');
+                continue;
+            }
+
+            list($varName, $regexPart) = $part;
+
+            if (isset($variables[$varName])) {
+                throw new BadRouteException(sprintf(
+                    'Cannot use the same placeholder "%s" twice', $varName
+                ));
+            }
+
+            if ($this->regexHasCapturingGroups($regexPart)) {
+                throw new BadRouteException(sprintf(
+                    'Regex "%s" for parameter "%s" contains a capturing group',
+                    $regexPart, $varName
+                ));
+            }
+
+            $variables[$varName] = $varName;
+            $regex .= '(' . $regexPart . ')';
+        }
+
+        return [$regex, $variables];
+    }
+
+    /**
+     * @param string
+     * @return bool
+     */
+    private function regexHasCapturingGroups($regex)
+    {
+        if (false === strpos($regex, '(')) {
+            // Needs to have at least a ( to contain a capturing group
+            return false;
+        }
+
+        // Semi-accurate detection for capturing groups
+        return (bool) preg_match(
+            '~
+                (?:
+                    \(\?\(
+                  | \[ [^\]\\\\]* (?: \\\\ . [^\]\\\\]* )* \]
+                  | \\\\ .
+                ) (*SKIP)(*FAIL) |
+                \(
+                (?!
+                    \? (?! <(?![!=]) | P< | \' )
+                  | \*
+                )
+            ~x',
+            $regex
+        );
+    }
+}
diff --git a/advancedcontentfilter/vendor/nikic/fast-route/src/Dispatcher.php b/advancedcontentfilter/vendor/nikic/fast-route/src/Dispatcher.php
new file mode 100644 (file)
index 0000000..4ae72a3
--- /dev/null
@@ -0,0 +1,26 @@
+<?php
+
+namespace FastRoute;
+
+interface Dispatcher
+{
+    const NOT_FOUND = 0;
+    const FOUND = 1;
+    const METHOD_NOT_ALLOWED = 2;
+
+    /**
+     * Dispatches against the provided HTTP method verb and URI.
+     *
+     * Returns array with one of the following formats:
+     *
+     *     [self::NOT_FOUND]
+     *     [self::METHOD_NOT_ALLOWED, ['GET', 'OTHER_ALLOWED_METHODS']]
+     *     [self::FOUND, $handler, ['varName' => 'value', ...]]
+     *
+     * @param string $httpMethod
+     * @param string $uri
+     *
+     * @return array
+     */
+    public function dispatch($httpMethod, $uri);
+}
diff --git a/advancedcontentfilter/vendor/nikic/fast-route/src/Dispatcher/CharCountBased.php b/advancedcontentfilter/vendor/nikic/fast-route/src/Dispatcher/CharCountBased.php
new file mode 100644 (file)
index 0000000..ef1eec1
--- /dev/null
@@ -0,0 +1,31 @@
+<?php
+
+namespace FastRoute\Dispatcher;
+
+class CharCountBased extends RegexBasedAbstract
+{
+    public function __construct($data)
+    {
+        list($this->staticRouteMap, $this->variableRouteData) = $data;
+    }
+
+    protected function dispatchVariableRoute($routeData, $uri)
+    {
+        foreach ($routeData as $data) {
+            if (!preg_match($data['regex'], $uri . $data['suffix'], $matches)) {
+                continue;
+            }
+
+            list($handler, $varNames) = $data['routeMap'][end($matches)];
+
+            $vars = [];
+            $i = 0;
+            foreach ($varNames as $varName) {
+                $vars[$varName] = $matches[++$i];
+            }
+            return [self::FOUND, $handler, $vars];
+        }
+
+        return [self::NOT_FOUND];
+    }
+}
diff --git a/advancedcontentfilter/vendor/nikic/fast-route/src/Dispatcher/GroupCountBased.php b/advancedcontentfilter/vendor/nikic/fast-route/src/Dispatcher/GroupCountBased.php
new file mode 100644 (file)
index 0000000..493e7a9
--- /dev/null
@@ -0,0 +1,31 @@
+<?php
+
+namespace FastRoute\Dispatcher;
+
+class GroupCountBased extends RegexBasedAbstract
+{
+    public function __construct($data)
+    {
+        list($this->staticRouteMap, $this->variableRouteData) = $data;
+    }
+
+    protected function dispatchVariableRoute($routeData, $uri)
+    {
+        foreach ($routeData as $data) {
+            if (!preg_match($data['regex'], $uri, $matches)) {
+                continue;
+            }
+
+            list($handler, $varNames) = $data['routeMap'][count($matches)];
+
+            $vars = [];
+            $i = 0;
+            foreach ($varNames as $varName) {
+                $vars[$varName] = $matches[++$i];
+            }
+            return [self::FOUND, $handler, $vars];
+        }
+
+        return [self::NOT_FOUND];
+    }
+}
diff --git a/advancedcontentfilter/vendor/nikic/fast-route/src/Dispatcher/GroupPosBased.php b/advancedcontentfilter/vendor/nikic/fast-route/src/Dispatcher/GroupPosBased.php
new file mode 100644 (file)
index 0000000..498220e
--- /dev/null
@@ -0,0 +1,33 @@
+<?php
+
+namespace FastRoute\Dispatcher;
+
+class GroupPosBased extends RegexBasedAbstract
+{
+    public function __construct($data)
+    {
+        list($this->staticRouteMap, $this->variableRouteData) = $data;
+    }
+
+    protected function dispatchVariableRoute($routeData, $uri)
+    {
+        foreach ($routeData as $data) {
+            if (!preg_match($data['regex'], $uri, $matches)) {
+                continue;
+            }
+
+            // find first non-empty match
+            for ($i = 1; '' === $matches[$i]; ++$i);
+
+            list($handler, $varNames) = $data['routeMap'][$i];
+
+            $vars = [];
+            foreach ($varNames as $varName) {
+                $vars[$varName] = $matches[$i++];
+            }
+            return [self::FOUND, $handler, $vars];
+        }
+
+        return [self::NOT_FOUND];
+    }
+}
diff --git a/advancedcontentfilter/vendor/nikic/fast-route/src/Dispatcher/MarkBased.php b/advancedcontentfilter/vendor/nikic/fast-route/src/Dispatcher/MarkBased.php
new file mode 100644 (file)
index 0000000..22eb09b
--- /dev/null
@@ -0,0 +1,31 @@
+<?php
+
+namespace FastRoute\Dispatcher;
+
+class MarkBased extends RegexBasedAbstract
+{
+    public function __construct($data)
+    {
+        list($this->staticRouteMap, $this->variableRouteData) = $data;
+    }
+
+    protected function dispatchVariableRoute($routeData, $uri)
+    {
+        foreach ($routeData as $data) {
+            if (!preg_match($data['regex'], $uri, $matches)) {
+                continue;
+            }
+
+            list($handler, $varNames) = $data['routeMap'][$matches['MARK']];
+
+            $vars = [];
+            $i = 0;
+            foreach ($varNames as $varName) {
+                $vars[$varName] = $matches[++$i];
+            }
+            return [self::FOUND, $handler, $vars];
+        }
+
+        return [self::NOT_FOUND];
+    }
+}
diff --git a/advancedcontentfilter/vendor/nikic/fast-route/src/Dispatcher/RegexBasedAbstract.php b/advancedcontentfilter/vendor/nikic/fast-route/src/Dispatcher/RegexBasedAbstract.php
new file mode 100644 (file)
index 0000000..206e879
--- /dev/null
@@ -0,0 +1,88 @@
+<?php
+
+namespace FastRoute\Dispatcher;
+
+use FastRoute\Dispatcher;
+
+abstract class RegexBasedAbstract implements Dispatcher
+{
+    /** @var mixed[][] */
+    protected $staticRouteMap = [];
+
+    /** @var mixed[] */
+    protected $variableRouteData = [];
+
+    /**
+     * @return mixed[]
+     */
+    abstract protected function dispatchVariableRoute($routeData, $uri);
+
+    public function dispatch($httpMethod, $uri)
+    {
+        if (isset($this->staticRouteMap[$httpMethod][$uri])) {
+            $handler = $this->staticRouteMap[$httpMethod][$uri];
+            return [self::FOUND, $handler, []];
+        }
+
+        $varRouteData = $this->variableRouteData;
+        if (isset($varRouteData[$httpMethod])) {
+            $result = $this->dispatchVariableRoute($varRouteData[$httpMethod], $uri);
+            if ($result[0] === self::FOUND) {
+                return $result;
+            }
+        }
+
+        // For HEAD requests, attempt fallback to GET
+        if ($httpMethod === 'HEAD') {
+            if (isset($this->staticRouteMap['GET'][$uri])) {
+                $handler = $this->staticRouteMap['GET'][$uri];
+                return [self::FOUND, $handler, []];
+            }
+            if (isset($varRouteData['GET'])) {
+                $result = $this->dispatchVariableRoute($varRouteData['GET'], $uri);
+                if ($result[0] === self::FOUND) {
+                    return $result;
+                }
+            }
+        }
+
+        // If nothing else matches, try fallback routes
+        if (isset($this->staticRouteMap['*'][$uri])) {
+            $handler = $this->staticRouteMap['*'][$uri];
+            return [self::FOUND, $handler, []];
+        }
+        if (isset($varRouteData['*'])) {
+            $result = $this->dispatchVariableRoute($varRouteData['*'], $uri);
+            if ($result[0] === self::FOUND) {
+                return $result;
+            }
+        }
+
+        // Find allowed methods for this URI by matching against all other HTTP methods as well
+        $allowedMethods = [];
+
+        foreach ($this->staticRouteMap as $method => $uriMap) {
+            if ($method !== $httpMethod && isset($uriMap[$uri])) {
+                $allowedMethods[] = $method;
+            }
+        }
+
+        foreach ($varRouteData as $method => $routeData) {
+            if ($method === $httpMethod) {
+                continue;
+            }
+
+            $result = $this->dispatchVariableRoute($routeData, $uri);
+            if ($result[0] === self::FOUND) {
+                $allowedMethods[] = $method;
+            }
+        }
+
+        // If there are no allowed methods the route simply does not exist
+        if ($allowedMethods) {
+            return [self::METHOD_NOT_ALLOWED, $allowedMethods];
+        }
+
+        return [self::NOT_FOUND];
+    }
+}
diff --git a/advancedcontentfilter/vendor/nikic/fast-route/src/Route.php b/advancedcontentfilter/vendor/nikic/fast-route/src/Route.php
new file mode 100644 (file)
index 0000000..e1bf7dd
--- /dev/null
@@ -0,0 +1,47 @@
+<?php
+
+namespace FastRoute;
+
+class Route
+{
+    /** @var string */
+    public $httpMethod;
+
+    /** @var string */
+    public $regex;
+
+    /** @var array */
+    public $variables;
+
+    /** @var mixed */
+    public $handler;
+
+    /**
+     * Constructs a route (value object).
+     *
+     * @param string $httpMethod
+     * @param mixed  $handler
+     * @param string $regex
+     * @param array  $variables
+     */
+    public function __construct($httpMethod, $handler, $regex, $variables)
+    {
+        $this->httpMethod = $httpMethod;
+        $this->handler = $handler;
+        $this->regex = $regex;
+        $this->variables = $variables;
+    }
+
+    /**
+     * Tests whether this route matches the given string.
+     *
+     * @param string $str
+     *
+     * @return bool
+     */
+    public function matches($str)
+    {
+        $regex = '~^' . $this->regex . '$~';
+        return (bool) preg_match($regex, $str);
+    }
+}
diff --git a/advancedcontentfilter/vendor/nikic/fast-route/src/RouteCollector.php b/advancedcontentfilter/vendor/nikic/fast-route/src/RouteCollector.php
new file mode 100644 (file)
index 0000000..c1c1762
--- /dev/null
@@ -0,0 +1,152 @@
+<?php
+
+namespace FastRoute;
+
+class RouteCollector
+{
+    /** @var RouteParser */
+    protected $routeParser;
+
+    /** @var DataGenerator */
+    protected $dataGenerator;
+
+    /** @var string */
+    protected $currentGroupPrefix;
+
+    /**
+     * Constructs a route collector.
+     *
+     * @param RouteParser   $routeParser
+     * @param DataGenerator $dataGenerator
+     */
+    public function __construct(RouteParser $routeParser, DataGenerator $dataGenerator)
+    {
+        $this->routeParser = $routeParser;
+        $this->dataGenerator = $dataGenerator;
+        $this->currentGroupPrefix = '';
+    }
+
+    /**
+     * Adds a route to the collection.
+     *
+     * The syntax used in the $route string depends on the used route parser.
+     *
+     * @param string|string[] $httpMethod
+     * @param string $route
+     * @param mixed  $handler
+     */
+    public function addRoute($httpMethod, $route, $handler)
+    {
+        $route = $this->currentGroupPrefix . $route;
+        $routeDatas = $this->routeParser->parse($route);
+        foreach ((array) $httpMethod as $method) {
+            foreach ($routeDatas as $routeData) {
+                $this->dataGenerator->addRoute($method, $routeData, $handler);
+            }
+        }
+    }
+
+    /**
+     * Create a route group with a common prefix.
+     *
+     * All routes created in the passed callback will have the given group prefix prepended.
+     *
+     * @param string $prefix
+     * @param callable $callback
+     */
+    public function addGroup($prefix, callable $callback)
+    {
+        $previousGroupPrefix = $this->currentGroupPrefix;
+        $this->currentGroupPrefix = $previousGroupPrefix . $prefix;
+        $callback($this);
+        $this->currentGroupPrefix = $previousGroupPrefix;
+    }
+
+    /**
+     * Adds a GET route to the collection
+     * 
+     * This is simply an alias of $this->addRoute('GET', $route, $handler)
+     *
+     * @param string $route
+     * @param mixed  $handler
+     */
+    public function get($route, $handler)
+    {
+        $this->addRoute('GET', $route, $handler);
+    }
+
+    /**
+     * Adds a POST route to the collection
+     * 
+     * This is simply an alias of $this->addRoute('POST', $route, $handler)
+     *
+     * @param string $route
+     * @param mixed  $handler
+     */
+    public function post($route, $handler)
+    {
+        $this->addRoute('POST', $route, $handler);
+    }
+
+    /**
+     * Adds a PUT route to the collection
+     * 
+     * This is simply an alias of $this->addRoute('PUT', $route, $handler)
+     *
+     * @param string $route
+     * @param mixed  $handler
+     */
+    public function put($route, $handler)
+    {
+        $this->addRoute('PUT', $route, $handler);
+    }
+
+    /**
+     * Adds a DELETE route to the collection
+     * 
+     * This is simply an alias of $this->addRoute('DELETE', $route, $handler)
+     *
+     * @param string $route
+     * @param mixed  $handler
+     */
+    public function delete($route, $handler)
+    {
+        $this->addRoute('DELETE', $route, $handler);
+    }
+
+    /**
+     * Adds a PATCH route to the collection
+     * 
+     * This is simply an alias of $this->addRoute('PATCH', $route, $handler)
+     *
+     * @param string $route
+     * @param mixed  $handler
+     */
+    public function patch($route, $handler)
+    {
+        $this->addRoute('PATCH', $route, $handler);
+    }
+
+    /**
+     * Adds a HEAD route to the collection
+     *
+     * This is simply an alias of $this->addRoute('HEAD', $route, $handler)
+     *
+     * @param string $route
+     * @param mixed  $handler
+     */
+    public function head($route, $handler)
+    {
+        $this->addRoute('HEAD', $route, $handler);
+    }
+
+    /**
+     * Returns the collected route data, as provided by the data generator.
+     *
+     * @return array
+     */
+    public function getData()
+    {
+        return $this->dataGenerator->getData();
+    }
+}
diff --git a/advancedcontentfilter/vendor/nikic/fast-route/src/RouteParser.php b/advancedcontentfilter/vendor/nikic/fast-route/src/RouteParser.php
new file mode 100644 (file)
index 0000000..6a7685c
--- /dev/null
@@ -0,0 +1,37 @@
+<?php
+
+namespace FastRoute;
+
+interface RouteParser
+{
+    /**
+     * Parses a route string into multiple route data arrays.
+     *
+     * The expected output is defined using an example:
+     *
+     * For the route string "/fixedRoutePart/{varName}[/moreFixed/{varName2:\d+}]", if {varName} is interpreted as
+     * a placeholder and [...] is interpreted as an optional route part, the expected result is:
+     *
+     * [
+     *     // first route: without optional part
+     *     [
+     *         "/fixedRoutePart/",
+     *         ["varName", "[^/]+"],
+     *     ],
+     *     // second route: with optional part
+     *     [
+     *         "/fixedRoutePart/",
+     *         ["varName", "[^/]+"],
+     *         "/moreFixed/",
+     *         ["varName2", [0-9]+"],
+     *     ],
+     * ]
+     *
+     * Here one route string was converted into two route data arrays.
+     *
+     * @param string $route Route string to parse
+     *
+     * @return mixed[][] Array of route data arrays
+     */
+    public function parse($route);
+}
diff --git a/advancedcontentfilter/vendor/nikic/fast-route/src/RouteParser/Std.php b/advancedcontentfilter/vendor/nikic/fast-route/src/RouteParser/Std.php
new file mode 100644 (file)
index 0000000..4fbdee1
--- /dev/null
@@ -0,0 +1,87 @@
+<?php
+
+namespace FastRoute\RouteParser;
+
+use FastRoute\BadRouteException;
+use FastRoute\RouteParser;
+
+/**
+ * Parses route strings of the following form:
+ *
+ * "/user/{name}[/{id:[0-9]+}]"
+ */
+class Std implements RouteParser
+{
+    const VARIABLE_REGEX = <<<'REGEX'
+\{
+    \s* ([a-zA-Z_][a-zA-Z0-9_-]*) \s*
+    (?:
+        : \s* ([^{}]*(?:\{(?-1)\}[^{}]*)*)
+    )?
+\}
+REGEX;
+    const DEFAULT_DISPATCH_REGEX = '[^/]+';
+
+    public function parse($route)
+    {
+        $routeWithoutClosingOptionals = rtrim($route, ']');
+        $numOptionals = strlen($route) - strlen($routeWithoutClosingOptionals);
+
+        // Split on [ while skipping placeholders
+        $segments = preg_split('~' . self::VARIABLE_REGEX . '(*SKIP)(*F) | \[~x', $routeWithoutClosingOptionals);
+        if ($numOptionals !== count($segments) - 1) {
+            // If there are any ] in the middle of the route, throw a more specific error message
+            if (preg_match('~' . self::VARIABLE_REGEX . '(*SKIP)(*F) | \]~x', $routeWithoutClosingOptionals)) {
+                throw new BadRouteException('Optional segments can only occur at the end of a route');
+            }
+            throw new BadRouteException("Number of opening '[' and closing ']' does not match");
+        }
+
+        $currentRoute = '';
+        $routeDatas = [];
+        foreach ($segments as $n => $segment) {
+            if ($segment === '' && $n !== 0) {
+                throw new BadRouteException('Empty optional part');
+            }
+
+            $currentRoute .= $segment;
+            $routeDatas[] = $this->parsePlaceholders($currentRoute);
+        }
+        return $routeDatas;
+    }
+
+    /**
+     * Parses a route string that does not contain optional segments.
+     *
+     * @param string
+     * @return mixed[]
+     */
+    private function parsePlaceholders($route)
+    {
+        if (!preg_match_all(
+            '~' . self::VARIABLE_REGEX . '~x', $route, $matches,
+            PREG_OFFSET_CAPTURE | PREG_SET_ORDER
+        )) {
+            return [$route];
+        }
+
+        $offset = 0;
+        $routeData = [];
+        foreach ($matches as $set) {
+            if ($set[0][1] > $offset) {
+                $routeData[] = substr($route, $offset, $set[0][1] - $offset);
+            }
+            $routeData[] = [
+                $set[1][0],
+                isset($set[2]) ? trim($set[2][0]) : self::DEFAULT_DISPATCH_REGEX
+            ];
+            $offset = $set[0][1] + strlen($set[0][0]);
+        }
+
+        if ($offset !== strlen($route)) {
+            $routeData[] = substr($route, $offset);
+        }
+
+        return $routeData;
+    }
+}
diff --git a/advancedcontentfilter/vendor/nikic/fast-route/src/bootstrap.php b/advancedcontentfilter/vendor/nikic/fast-route/src/bootstrap.php
new file mode 100644 (file)
index 0000000..0bce3a4
--- /dev/null
@@ -0,0 +1,12 @@
+<?php
+
+namespace FastRoute;
+
+require __DIR__ . '/functions.php';
+
+spl_autoload_register(function ($class) {
+    if (strpos($class, 'FastRoute\\') === 0) {
+        $name = substr($class, strlen('FastRoute'));
+        require __DIR__ . strtr($name, '\\', DIRECTORY_SEPARATOR) . '.php';
+    }
+});
diff --git a/advancedcontentfilter/vendor/nikic/fast-route/src/functions.php b/advancedcontentfilter/vendor/nikic/fast-route/src/functions.php
new file mode 100644 (file)
index 0000000..876a5d9
--- /dev/null
@@ -0,0 +1,74 @@
+<?php
+
+namespace FastRoute;
+
+if (!function_exists('FastRoute\simpleDispatcher')) {
+    /**
+     * @param callable $routeDefinitionCallback
+     * @param array $options
+     *
+     * @return Dispatcher
+     */
+    function simpleDispatcher(callable $routeDefinitionCallback, array $options = [])
+    {
+        $options += [
+            'routeParser' => 'FastRoute\\RouteParser\\Std',
+            'dataGenerator' => 'FastRoute\\DataGenerator\\GroupCountBased',
+            'dispatcher' => 'FastRoute\\Dispatcher\\GroupCountBased',
+            'routeCollector' => 'FastRoute\\RouteCollector',
+        ];
+
+        /** @var RouteCollector $routeCollector */
+        $routeCollector = new $options['routeCollector'](
+            new $options['routeParser'], new $options['dataGenerator']
+        );
+        $routeDefinitionCallback($routeCollector);
+
+        return new $options['dispatcher']($routeCollector->getData());
+    }
+
+    /**
+     * @param callable $routeDefinitionCallback
+     * @param array $options
+     *
+     * @return Dispatcher
+     */
+    function cachedDispatcher(callable $routeDefinitionCallback, array $options = [])
+    {
+        $options += [
+            'routeParser' => 'FastRoute\\RouteParser\\Std',
+            'dataGenerator' => 'FastRoute\\DataGenerator\\GroupCountBased',
+            'dispatcher' => 'FastRoute\\Dispatcher\\GroupCountBased',
+            'routeCollector' => 'FastRoute\\RouteCollector',
+            'cacheDisabled' => false,
+        ];
+
+        if (!isset($options['cacheFile'])) {
+            throw new \LogicException('Must specify "cacheFile" option');
+        }
+
+        if (!$options['cacheDisabled'] && file_exists($options['cacheFile'])) {
+            $dispatchData = require $options['cacheFile'];
+            if (!is_array($dispatchData)) {
+                throw new \RuntimeException('Invalid cache file "' . $options['cacheFile'] . '"');
+            }
+            return new $options['dispatcher']($dispatchData);
+        }
+
+        $routeCollector = new $options['routeCollector'](
+            new $options['routeParser'], new $options['dataGenerator']
+        );
+        $routeDefinitionCallback($routeCollector);
+
+        /** @var RouteCollector $routeCollector */
+        $dispatchData = $routeCollector->getData();
+        if (!$options['cacheDisabled']) {
+            file_put_contents(
+                $options['cacheFile'],
+                '<?php return ' . var_export($dispatchData, true) . ';'
+            );
+        }
+
+        return new $options['dispatcher']($dispatchData);
+    }
+}
diff --git a/advancedcontentfilter/vendor/nikic/fast-route/test/Dispatcher/CharCountBasedTest.php b/advancedcontentfilter/vendor/nikic/fast-route/test/Dispatcher/CharCountBasedTest.php
new file mode 100644 (file)
index 0000000..e15ff8b
--- /dev/null
@@ -0,0 +1,16 @@
+<?php
+
+namespace FastRoute\Dispatcher;
+
+class CharCountBasedTest extends DispatcherTest
+{
+    protected function getDispatcherClass()
+    {
+        return 'FastRoute\\Dispatcher\\CharCountBased';
+    }
+
+    protected function getDataGeneratorClass()
+    {
+        return 'FastRoute\\DataGenerator\\CharCountBased';
+    }
+}
diff --git a/advancedcontentfilter/vendor/nikic/fast-route/test/Dispatcher/DispatcherTest.php b/advancedcontentfilter/vendor/nikic/fast-route/test/Dispatcher/DispatcherTest.php
new file mode 100644 (file)
index 0000000..c2edf8c
--- /dev/null
@@ -0,0 +1,581 @@
+<?php
+
+namespace FastRoute\Dispatcher;
+
+use FastRoute\RouteCollector;
+use PHPUnit\Framework\TestCase;
+
+abstract class DispatcherTest extends TestCase
+{
+    /**
+     * Delegate dispatcher selection to child test classes
+     */
+    abstract protected function getDispatcherClass();
+
+    /**
+     * Delegate dataGenerator selection to child test classes
+     */
+    abstract protected function getDataGeneratorClass();
+
+    /**
+     * Set appropriate options for the specific Dispatcher class we're testing
+     */
+    private function generateDispatcherOptions()
+    {
+        return [
+            'dataGenerator' => $this->getDataGeneratorClass(),
+            'dispatcher' => $this->getDispatcherClass()
+        ];
+    }
+
+    /**
+     * @dataProvider provideFoundDispatchCases
+     */
+    public function testFoundDispatches($method, $uri, $callback, $handler, $argDict)
+    {
+        $dispatcher = \FastRoute\simpleDispatcher($callback, $this->generateDispatcherOptions());
+        $info = $dispatcher->dispatch($method, $uri);
+        $this->assertSame($dispatcher::FOUND, $info[0]);
+        $this->assertSame($handler, $info[1]);
+        $this->assertSame($argDict, $info[2]);
+    }
+
+    /**
+     * @dataProvider provideNotFoundDispatchCases
+     */
+    public function testNotFoundDispatches($method, $uri, $callback)
+    {
+        $dispatcher = \FastRoute\simpleDispatcher($callback, $this->generateDispatcherOptions());
+        $routeInfo = $dispatcher->dispatch($method, $uri);
+        $this->assertArrayNotHasKey(1, $routeInfo,
+            'NOT_FOUND result must only contain a single element in the returned info array'
+        );
+        $this->assertSame($dispatcher::NOT_FOUND, $routeInfo[0]);
+    }
+
+    /**
+     * @dataProvider provideMethodNotAllowedDispatchCases
+     */
+    public function testMethodNotAllowedDispatches($method, $uri, $callback, $availableMethods)
+    {
+        $dispatcher = \FastRoute\simpleDispatcher($callback, $this->generateDispatcherOptions());
+        $routeInfo = $dispatcher->dispatch($method, $uri);
+        $this->assertArrayHasKey(1, $routeInfo,
+            'METHOD_NOT_ALLOWED result must return an array of allowed methods at index 1'
+        );
+
+        list($routedStatus, $methodArray) = $dispatcher->dispatch($method, $uri);
+        $this->assertSame($dispatcher::METHOD_NOT_ALLOWED, $routedStatus);
+        $this->assertSame($availableMethods, $methodArray);
+    }
+
+    /**
+     * @expectedException \FastRoute\BadRouteException
+     * @expectedExceptionMessage Cannot use the same placeholder "test" twice
+     */
+    public function testDuplicateVariableNameError()
+    {
+        \FastRoute\simpleDispatcher(function (RouteCollector $r) {
+            $r->addRoute('GET', '/foo/{test}/{test:\d+}', 'handler0');
+        }, $this->generateDispatcherOptions());
+    }
+
+    /**
+     * @expectedException \FastRoute\BadRouteException
+     * @expectedExceptionMessage Cannot register two routes matching "/user/([^/]+)" for method "GET"
+     */
+    public function testDuplicateVariableRoute()
+    {
+        \FastRoute\simpleDispatcher(function (RouteCollector $r) {
+            $r->addRoute('GET', '/user/{id}', 'handler0'); // oops, forgot \d+ restriction ;)
+            $r->addRoute('GET', '/user/{name}', 'handler1');
+        }, $this->generateDispatcherOptions());
+    }
+
+    /**
+     * @expectedException \FastRoute\BadRouteException
+     * @expectedExceptionMessage Cannot register two routes matching "/user" for method "GET"
+     */
+    public function testDuplicateStaticRoute()
+    {
+        \FastRoute\simpleDispatcher(function (RouteCollector $r) {
+            $r->addRoute('GET', '/user', 'handler0');
+            $r->addRoute('GET', '/user', 'handler1');
+        }, $this->generateDispatcherOptions());
+    }
+
+    /**
+     * @expectedException \FastRoute\BadRouteException
+     * @expectedExceptionMessage Static route "/user/nikic" is shadowed by previously defined variable route "/user/([^/]+)" for method "GET"
+     */
+    public function testShadowedStaticRoute()
+    {
+        \FastRoute\simpleDispatcher(function (RouteCollector $r) {
+            $r->addRoute('GET', '/user/{name}', 'handler0');
+            $r->addRoute('GET', '/user/nikic', 'handler1');
+        }, $this->generateDispatcherOptions());
+    }
+
+    /**
+     * @expectedException \FastRoute\BadRouteException
+     * @expectedExceptionMessage Regex "(en|de)" for parameter "lang" contains a capturing group
+     */
+    public function testCapturing()
+    {
+        \FastRoute\simpleDispatcher(function (RouteCollector $r) {
+            $r->addRoute('GET', '/{lang:(en|de)}', 'handler0');
+        }, $this->generateDispatcherOptions());
+    }
+
+    public function provideFoundDispatchCases()
+    {
+        $cases = [];
+
+        // 0 -------------------------------------------------------------------------------------->
+
+        $callback = function (RouteCollector $r) {
+            $r->addRoute('GET', '/resource/123/456', 'handler0');
+        };
+
+        $method = 'GET';
+        $uri = '/resource/123/456';
+        $handler = 'handler0';
+        $argDict = [];
+
+        $cases[] = [$method, $uri, $callback, $handler, $argDict];
+
+        // 1 -------------------------------------------------------------------------------------->
+
+        $callback = function (RouteCollector $r) {
+            $r->addRoute('GET', '/handler0', 'handler0');
+            $r->addRoute('GET', '/handler1', 'handler1');
+            $r->addRoute('GET', '/handler2', 'handler2');
+        };
+
+        $method = 'GET';
+        $uri = '/handler2';
+        $handler = 'handler2';
+        $argDict = [];
+
+        $cases[] = [$method, $uri, $callback, $handler, $argDict];
+
+        // 2 -------------------------------------------------------------------------------------->
+
+        $callback = function (RouteCollector $r) {
+            $r->addRoute('GET', '/user/{name}/{id:[0-9]+}', 'handler0');
+            $r->addRoute('GET', '/user/{id:[0-9]+}', 'handler1');
+            $r->addRoute('GET', '/user/{name}', 'handler2');
+        };
+
+        $method = 'GET';
+        $uri = '/user/rdlowrey';
+        $handler = 'handler2';
+        $argDict = ['name' => 'rdlowrey'];
+
+        $cases[] = [$method, $uri, $callback, $handler, $argDict];
+
+        // 3 -------------------------------------------------------------------------------------->
+
+        // reuse $callback from #2
+
+        $method = 'GET';
+        $uri = '/user/12345';
+        $handler = 'handler1';
+        $argDict = ['id' => '12345'];
+
+        $cases[] = [$method, $uri, $callback, $handler, $argDict];
+
+        // 4 -------------------------------------------------------------------------------------->
+
+        // reuse $callback from #3
+
+        $method = 'GET';
+        $uri = '/user/NaN';
+        $handler = 'handler2';
+        $argDict = ['name' => 'NaN'];
+
+        $cases[] = [$method, $uri, $callback, $handler, $argDict];
+
+        // 5 -------------------------------------------------------------------------------------->
+
+        // reuse $callback from #4
+
+        $method = 'GET';
+        $uri = '/user/rdlowrey/12345';
+        $handler = 'handler0';
+        $argDict = ['name' => 'rdlowrey', 'id' => '12345'];
+
+        $cases[] = [$method, $uri, $callback, $handler, $argDict];
+
+        // 6 -------------------------------------------------------------------------------------->
+
+        $callback = function (RouteCollector $r) {
+            $r->addRoute('GET', '/user/{id:[0-9]+}', 'handler0');
+            $r->addRoute('GET', '/user/12345/extension', 'handler1');
+            $r->addRoute('GET', '/user/{id:[0-9]+}.{extension}', 'handler2');
+        };
+
+        $method = 'GET';
+        $uri = '/user/12345.svg';
+        $handler = 'handler2';
+        $argDict = ['id' => '12345', 'extension' => 'svg'];
+
+        $cases[] = [$method, $uri, $callback, $handler, $argDict];
+
+        // 7 ----- Test GET method fallback on HEAD route miss ------------------------------------>
+
+        $callback = function (RouteCollector $r) {
+            $r->addRoute('GET', '/user/{name}', 'handler0');
+            $r->addRoute('GET', '/user/{name}/{id:[0-9]+}', 'handler1');
+            $r->addRoute('GET', '/static0', 'handler2');
+            $r->addRoute('GET', '/static1', 'handler3');
+            $r->addRoute('HEAD', '/static1', 'handler4');
+        };
+
+        $method = 'HEAD';
+        $uri = '/user/rdlowrey';
+        $handler = 'handler0';
+        $argDict = ['name' => 'rdlowrey'];
+
+        $cases[] = [$method, $uri, $callback, $handler, $argDict];
+
+        // 8 ----- Test GET method fallback on HEAD route miss ------------------------------------>
+
+        // reuse $callback from #7
+
+        $method = 'HEAD';
+        $uri = '/user/rdlowrey/1234';
+        $handler = 'handler1';
+        $argDict = ['name' => 'rdlowrey', 'id' => '1234'];
+
+        $cases[] = [$method, $uri, $callback, $handler, $argDict];
+
+        // 9 ----- Test GET method fallback on HEAD route miss ------------------------------------>
+
+        // reuse $callback from #8
+
+        $method = 'HEAD';
+        $uri = '/static0';
+        $handler = 'handler2';
+        $argDict = [];
+
+        $cases[] = [$method, $uri, $callback, $handler, $argDict];
+
+        // 10 ---- Test existing HEAD route used if available (no fallback) ----------------------->
+
+        // reuse $callback from #9
+
+        $method = 'HEAD';
+        $uri = '/static1';
+        $handler = 'handler4';
+        $argDict = [];
+
+        $cases[] = [$method, $uri, $callback, $handler, $argDict];
+
+        // 11 ---- More specified routes are not shadowed by less specific of another method ------>
+
+        $callback = function (RouteCollector $r) {
+            $r->addRoute('GET', '/user/{name}', 'handler0');
+            $r->addRoute('POST', '/user/{name:[a-z]+}', 'handler1');
+        };
+
+        $method = 'POST';
+        $uri = '/user/rdlowrey';
+        $handler = 'handler1';
+        $argDict = ['name' => 'rdlowrey'];
+
+        $cases[] = [$method, $uri, $callback, $handler, $argDict];
+
+        // 12 ---- Handler of more specific routes is used, if it occurs first -------------------->
+
+        $callback = function (RouteCollector $r) {
+            $r->addRoute('GET', '/user/{name}', 'handler0');
+            $r->addRoute('POST', '/user/{name:[a-z]+}', 'handler1');
+            $r->addRoute('POST', '/user/{name}', 'handler2');
+        };
+
+        $method = 'POST';
+        $uri = '/user/rdlowrey';
+        $handler = 'handler1';
+        $argDict = ['name' => 'rdlowrey'];
+
+        $cases[] = [$method, $uri, $callback, $handler, $argDict];
+
+        // 13 ---- Route with constant suffix ----------------------------------------------------->
+
+        $callback = function (RouteCollector $r) {
+            $r->addRoute('GET', '/user/{name}', 'handler0');
+            $r->addRoute('GET', '/user/{name}/edit', 'handler1');
+        };
+
+        $method = 'GET';
+        $uri = '/user/rdlowrey/edit';
+        $handler = 'handler1';
+        $argDict = ['name' => 'rdlowrey'];
+
+        $cases[] = [$method, $uri, $callback, $handler, $argDict];
+
+        // 14 ---- Handle multiple methods with the same handler ---------------------------------->
+
+        $callback = function (RouteCollector $r) {
+            $r->addRoute(['GET', 'POST'], '/user', 'handlerGetPost');
+            $r->addRoute(['DELETE'], '/user', 'handlerDelete');
+            $r->addRoute([], '/user', 'handlerNone');
+        };
+
+        $argDict = [];
+        $cases[] = ['GET', '/user', $callback, 'handlerGetPost', $argDict];
+        $cases[] = ['POST', '/user', $callback, 'handlerGetPost', $argDict];
+        $cases[] = ['DELETE', '/user', $callback, 'handlerDelete', $argDict];
+
+        // 17 ----
+
+        $callback = function (RouteCollector $r) {
+            $r->addRoute('POST', '/user.json', 'handler0');
+            $r->addRoute('GET', '/{entity}.json', 'handler1');
+        };
+
+        $cases[] = ['GET', '/user.json', $callback, 'handler1', ['entity' => 'user']];
+
+        // 18 ----
+
+        $callback = function (RouteCollector $r) {
+            $r->addRoute('GET', '', 'handler0');
+        };
+
+        $cases[] = ['GET', '', $callback, 'handler0', []];
+
+        // 19 ----
+
+        $callback = function (RouteCollector $r) {
+            $r->addRoute('HEAD', '/a/{foo}', 'handler0');
+            $r->addRoute('GET', '/b/{foo}', 'handler1');
+        };
+
+        $cases[] = ['HEAD', '/b/bar', $callback, 'handler1', ['foo' => 'bar']];
+
+        // 20 ----
+
+        $callback = function (RouteCollector $r) {
+            $r->addRoute('HEAD', '/a', 'handler0');
+            $r->addRoute('GET', '/b', 'handler1');
+        };
+
+        $cases[] = ['HEAD', '/b', $callback, 'handler1', []];
+
+        // 21 ----
+
+        $callback = function (RouteCollector $r) {
+            $r->addRoute('GET', '/foo', 'handler0');
+            $r->addRoute('HEAD', '/{bar}', 'handler1');
+        };
+
+        $cases[] = ['HEAD', '/foo', $callback, 'handler1', ['bar' => 'foo']];
+
+        // 22 ----
+
+        $callback = function (RouteCollector $r) {
+            $r->addRoute('*', '/user', 'handler0');
+            $r->addRoute('*', '/{user}', 'handler1');
+            $r->addRoute('GET', '/user', 'handler2');
+        };
+
+        $cases[] = ['GET', '/user', $callback, 'handler2', []];
+
+        // 23 ----
+
+        $callback = function (RouteCollector $r) {
+            $r->addRoute('*', '/user', 'handler0');
+            $r->addRoute('GET', '/user', 'handler1');
+        };
+
+        $cases[] = ['POST', '/user', $callback, 'handler0', []];
+
+        // 24 ----
+
+        $cases[] = ['HEAD', '/user', $callback, 'handler1', []];
+
+        // 25 ----
+
+        $callback = function (RouteCollector $r) {
+            $r->addRoute('GET', '/{bar}', 'handler0');
+            $r->addRoute('*', '/foo', 'handler1');
+        };
+
+        $cases[] = ['GET', '/foo', $callback, 'handler0', ['bar' => 'foo']];
+
+        // 26 ----
+
+        $callback = function(RouteCollector $r) {
+            $r->addRoute('GET', '/user', 'handler0');
+            $r->addRoute('*', '/{foo:.*}', 'handler1');
+        };
+
+        $cases[] = ['POST', '/bar', $callback, 'handler1', ['foo' => 'bar']];
+
+        // x -------------------------------------------------------------------------------------->
+
+        return $cases;
+    }
+
+    public function provideNotFoundDispatchCases()
+    {
+        $cases = [];
+
+        // 0 -------------------------------------------------------------------------------------->
+
+        $callback = function (RouteCollector $r) {
+            $r->addRoute('GET', '/resource/123/456', 'handler0');
+        };
+
+        $method = 'GET';
+        $uri = '/not-found';
+
+        $cases[] = [$method, $uri, $callback];
+
+        // 1 -------------------------------------------------------------------------------------->
+
+        // reuse callback from #0
+        $method = 'POST';
+        $uri = '/not-found';
+
+        $cases[] = [$method, $uri, $callback];
+
+        // 2 -------------------------------------------------------------------------------------->
+
+        // reuse callback from #1
+        $method = 'PUT';
+        $uri = '/not-found';
+
+        $cases[] = [$method, $uri, $callback];
+
+        // 3 -------------------------------------------------------------------------------------->
+
+        $callback = function (RouteCollector $r) {
+            $r->addRoute('GET', '/handler0', 'handler0');
+            $r->addRoute('GET', '/handler1', 'handler1');
+            $r->addRoute('GET', '/handler2', 'handler2');
+        };
+
+        $method = 'GET';
+        $uri = '/not-found';
+
+        $cases[] = [$method, $uri, $callback];
+
+        // 4 -------------------------------------------------------------------------------------->
+
+        $callback = function (RouteCollector $r) {
+            $r->addRoute('GET', '/user/{name}/{id:[0-9]+}', 'handler0');
+            $r->addRoute('GET', '/user/{id:[0-9]+}', 'handler1');
+            $r->addRoute('GET', '/user/{name}', 'handler2');
+        };
+
+        $method = 'GET';
+        $uri = '/not-found';
+
+        $cases[] = [$method, $uri, $callback];
+
+        // 5 -------------------------------------------------------------------------------------->
+
+        // reuse callback from #4
+        $method = 'GET';
+        $uri = '/user/rdlowrey/12345/not-found';
+
+        $cases[] = [$method, $uri, $callback];
+
+        // 6 -------------------------------------------------------------------------------------->
+
+        // reuse callback from #5
+        $method = 'HEAD';
+
+        $cases[] = [$method, $uri, $callback];
+
+        // x -------------------------------------------------------------------------------------->
+
+        return $cases;
+    }
+
+    public function provideMethodNotAllowedDispatchCases()
+    {
+        $cases = [];
+
+        // 0 -------------------------------------------------------------------------------------->
+
+        $callback = function (RouteCollector $r) {
+            $r->addRoute('GET', '/resource/123/456', 'handler0');
+        };
+
+        $method = 'POST';
+        $uri = '/resource/123/456';
+        $allowedMethods = ['GET'];
+
+        $cases[] = [$method, $uri, $callback, $allowedMethods];
+
+        // 1 -------------------------------------------------------------------------------------->
+
+        $callback = function (RouteCollector $r) {
+            $r->addRoute('GET', '/resource/123/456', 'handler0');
+            $r->addRoute('POST', '/resource/123/456', 'handler1');
+            $r->addRoute('PUT', '/resource/123/456', 'handler2');
+            $r->addRoute('*', '/', 'handler3');
+        };
+
+        $method = 'DELETE';
+        $uri = '/resource/123/456';
+        $allowedMethods = ['GET', 'POST', 'PUT'];
+
+        $cases[] = [$method, $uri, $callback, $allowedMethods];
+
+        // 2 -------------------------------------------------------------------------------------->
+
+        $callback = function (RouteCollector $r) {
+            $r->addRoute('GET', '/user/{name}/{id:[0-9]+}', 'handler0');
+            $r->addRoute('POST', '/user/{name}/{id:[0-9]+}', 'handler1');
+            $r->addRoute('PUT', '/user/{name}/{id:[0-9]+}', 'handler2');
+            $r->addRoute('PATCH', '/user/{name}/{id:[0-9]+}', 'handler3');
+        };
+
+        $method = 'DELETE';
+        $uri = '/user/rdlowrey/42';
+        $allowedMethods = ['GET', 'POST', 'PUT', 'PATCH'];
+
+        $cases[] = [$method, $uri, $callback, $allowedMethods];
+
+        // 3 -------------------------------------------------------------------------------------->
+
+        $callback = function (RouteCollector $r) {
+            $r->addRoute('POST', '/user/{name}', 'handler1');
+            $r->addRoute('PUT', '/user/{name:[a-z]+}', 'handler2');
+            $r->addRoute('PATCH', '/user/{name:[a-z]+}', 'handler3');
+        };
+
+        $method = 'GET';
+        $uri = '/user/rdlowrey';
+        $allowedMethods = ['POST', 'PUT', 'PATCH'];
+
+        $cases[] = [$method, $uri, $callback, $allowedMethods];
+
+        // 4 -------------------------------------------------------------------------------------->
+
+        $callback = function (RouteCollector $r) {
+            $r->addRoute(['GET', 'POST'], '/user', 'handlerGetPost');
+            $r->addRoute(['DELETE'], '/user', 'handlerDelete');
+            $r->addRoute([], '/user', 'handlerNone');
+        };
+
+        $cases[] = ['PUT', '/user', $callback, ['GET', 'POST', 'DELETE']];
+
+        // 5
+
+        $callback = function (RouteCollector $r) {
+            $r->addRoute('POST', '/user.json', 'handler0');
+            $r->addRoute('GET', '/{entity}.json', 'handler1');
+        };
+
+        $cases[] = ['PUT', '/user.json', $callback, ['POST', 'GET']];
+
+        // x -------------------------------------------------------------------------------------->
+
+        return $cases;
+    }
+}
diff --git a/advancedcontentfilter/vendor/nikic/fast-route/test/Dispatcher/GroupCountBasedTest.php b/advancedcontentfilter/vendor/nikic/fast-route/test/Dispatcher/GroupCountBasedTest.php
new file mode 100644 (file)
index 0000000..f821ef5
--- /dev/null
@@ -0,0 +1,16 @@
+<?php
+
+namespace FastRoute\Dispatcher;
+
+class GroupCountBasedTest extends DispatcherTest
+{
+    protected function getDispatcherClass()
+    {
+        return 'FastRoute\\Dispatcher\\GroupCountBased';
+    }
+
+    protected function getDataGeneratorClass()
+    {
+        return 'FastRoute\\DataGenerator\\GroupCountBased';
+    }
+}
diff --git a/advancedcontentfilter/vendor/nikic/fast-route/test/Dispatcher/GroupPosBasedTest.php b/advancedcontentfilter/vendor/nikic/fast-route/test/Dispatcher/GroupPosBasedTest.php
new file mode 100644 (file)
index 0000000..b5c9567
--- /dev/null
@@ -0,0 +1,16 @@
+<?php
+
+namespace FastRoute\Dispatcher;
+
+class GroupPosBasedTest extends DispatcherTest
+{
+    protected function getDispatcherClass()
+    {
+        return 'FastRoute\\Dispatcher\\GroupPosBased';
+    }
+
+    protected function getDataGeneratorClass()
+    {
+        return 'FastRoute\\DataGenerator\\GroupPosBased';
+    }
+}
diff --git a/advancedcontentfilter/vendor/nikic/fast-route/test/Dispatcher/MarkBasedTest.php b/advancedcontentfilter/vendor/nikic/fast-route/test/Dispatcher/MarkBasedTest.php
new file mode 100644 (file)
index 0000000..b3b27dd
--- /dev/null
@@ -0,0 +1,24 @@
+<?php
+
+namespace FastRoute\Dispatcher;
+
+class MarkBasedTest extends DispatcherTest
+{
+    public function setUp()
+    {
+        preg_match('/(*MARK:A)a/', 'a', $matches);
+        if (!isset($matches['MARK'])) {
+            $this->markTestSkipped('PHP 5.6 required for MARK support');
+        }
+    }
+
+    protected function getDispatcherClass()
+    {
+        return 'FastRoute\\Dispatcher\\MarkBased';
+    }
+
+    protected function getDataGeneratorClass()
+    {
+        return 'FastRoute\\DataGenerator\\MarkBased';
+    }
+}
diff --git a/advancedcontentfilter/vendor/nikic/fast-route/test/HackTypechecker/HackTypecheckerTest.php b/advancedcontentfilter/vendor/nikic/fast-route/test/HackTypechecker/HackTypecheckerTest.php
new file mode 100644 (file)
index 0000000..b6fc53f
--- /dev/null
@@ -0,0 +1,44 @@
+<?php
+
+namespace FastRoute;
+
+use PHPUnit\Framework\TestCase;
+
+class HackTypecheckerTest extends TestCase
+{
+    const SERVER_ALREADY_RUNNING_CODE = 77;
+
+    public function testTypechecks($recurse = true)
+    {
+        if (!defined('HHVM_VERSION')) {
+            $this->markTestSkipped('HHVM only');
+        }
+        if (!version_compare(HHVM_VERSION, '3.9.0', '>=')) {
+          $this->markTestSkipped('classname<T> requires HHVM 3.9+');
+        }
+
+        // The typechecker recurses the whole tree, so it makes sure
+        // that everything in fixtures/ is valid when this runs.
+
+        $output = [];
+        $exit_code = null;
+        exec(
+            'hh_server --check ' . escapeshellarg(__DIR__ . '/../../') . ' 2>&1',
+            $output,
+            $exit_code
+        );
+        if ($exit_code === self::SERVER_ALREADY_RUNNING_CODE) {
+            $this->assertTrue(
+              $recurse,
+              'Typechecker still running after running hh_client stop'
+            );
+            // Server already running - 3.10 => 3.11 regression:
+            // https://github.com/facebook/hhvm/issues/6646
+            exec('hh_client stop 2>/dev/null');
+            $this->testTypechecks(/* recurse = */ false);
+            return;
+
+        }
+        $this->assertSame(0, $exit_code, implode("\n", $output));
+    }
+}
diff --git a/advancedcontentfilter/vendor/nikic/fast-route/test/HackTypechecker/fixtures/all_options.php b/advancedcontentfilter/vendor/nikic/fast-route/test/HackTypechecker/fixtures/all_options.php
new file mode 100644 (file)
index 0000000..05a9af2
--- /dev/null
@@ -0,0 +1,29 @@
+<?hh
+
+namespace FastRoute\TestFixtures;
+
+function all_options_simple(): \FastRoute\Dispatcher {
+    return \FastRoute\simpleDispatcher(
+      $collector ==> {},
+      shape(
+        'routeParser' => \FastRoute\RouteParser\Std::class,
+        'dataGenerator' => \FastRoute\DataGenerator\GroupCountBased::class,
+        'dispatcher' => \FastRoute\Dispatcher\GroupCountBased::class,
+        'routeCollector' => \FastRoute\RouteCollector::class,
+      ),
+    );
+}
+
+function all_options_cached(): \FastRoute\Dispatcher {
+    return \FastRoute\cachedDispatcher(
+      $collector ==> {},
+      shape(
+        'routeParser' => \FastRoute\RouteParser\Std::class,
+        'dataGenerator' => \FastRoute\DataGenerator\GroupCountBased::class,
+        'dispatcher' => \FastRoute\Dispatcher\GroupCountBased::class,
+        'routeCollector' => \FastRoute\RouteCollector::class,
+        'cacheFile' => '/dev/null',
+        'cacheDisabled' => false,
+      ),
+    );
+}
diff --git a/advancedcontentfilter/vendor/nikic/fast-route/test/HackTypechecker/fixtures/empty_options.php b/advancedcontentfilter/vendor/nikic/fast-route/test/HackTypechecker/fixtures/empty_options.php
new file mode 100644 (file)
index 0000000..61eb541
--- /dev/null
@@ -0,0 +1,11 @@
+<?hh
+
+namespace FastRoute\TestFixtures;
+
+function empty_options_simple(): \FastRoute\Dispatcher {
+    return \FastRoute\simpleDispatcher($collector ==> {}, shape());
+}
+
+function empty_options_cached(): \FastRoute\Dispatcher {
+    return \FastRoute\cachedDispatcher($collector ==> {}, shape());
+}
diff --git a/advancedcontentfilter/vendor/nikic/fast-route/test/HackTypechecker/fixtures/no_options.php b/advancedcontentfilter/vendor/nikic/fast-route/test/HackTypechecker/fixtures/no_options.php
new file mode 100644 (file)
index 0000000..44b5422
--- /dev/null
@@ -0,0 +1,11 @@
+<?hh
+
+namespace FastRoute\TestFixtures;
+
+function no_options_simple(): \FastRoute\Dispatcher {
+    return \FastRoute\simpleDispatcher($collector ==> {});
+}
+
+function no_options_cached(): \FastRoute\Dispatcher {
+    return \FastRoute\cachedDispatcher($collector ==> {});
+}
diff --git a/advancedcontentfilter/vendor/nikic/fast-route/test/RouteCollectorTest.php b/advancedcontentfilter/vendor/nikic/fast-route/test/RouteCollectorTest.php
new file mode 100644 (file)
index 0000000..cc54407
--- /dev/null
@@ -0,0 +1,108 @@
+<?php
+
+namespace FastRoute;
+
+use PHPUnit\Framework\TestCase;
+
+class RouteCollectorTest extends TestCase
+{
+    public function testShortcuts()
+    {
+        $r = new DummyRouteCollector();
+
+        $r->delete('/delete', 'delete');
+        $r->get('/get', 'get');
+        $r->head('/head', 'head');
+        $r->patch('/patch', 'patch');
+        $r->post('/post', 'post');
+        $r->put('/put', 'put');
+
+        $expected = [
+            ['DELETE', '/delete', 'delete'],
+            ['GET', '/get', 'get'],
+            ['HEAD', '/head', 'head'],
+            ['PATCH', '/patch', 'patch'],
+            ['POST', '/post', 'post'],
+            ['PUT', '/put', 'put'],
+        ];
+
+        $this->assertSame($expected, $r->routes);
+    }
+
+    public function testGroups()
+    {
+        $r = new DummyRouteCollector();
+
+        $r->delete('/delete', 'delete');
+        $r->get('/get', 'get');
+        $r->head('/head', 'head');
+        $r->patch('/patch', 'patch');
+        $r->post('/post', 'post');
+        $r->put('/put', 'put');
+
+        $r->addGroup('/group-one', function (DummyRouteCollector $r) {
+            $r->delete('/delete', 'delete');
+            $r->get('/get', 'get');
+            $r->head('/head', 'head');
+            $r->patch('/patch', 'patch');
+            $r->post('/post', 'post');
+            $r->put('/put', 'put');
+
+            $r->addGroup('/group-two', function (DummyRouteCollector $r) {
+                $r->delete('/delete', 'delete');
+                $r->get('/get', 'get');
+                $r->head('/head', 'head');
+                $r->patch('/patch', 'patch');
+                $r->post('/post', 'post');
+                $r->put('/put', 'put');
+            });
+        });
+
+        $r->addGroup('/admin', function (DummyRouteCollector $r) {
+            $r->get('-some-info', 'admin-some-info');
+        });
+        $r->addGroup('/admin-', function (DummyRouteCollector $r) {
+            $r->get('more-info', 'admin-more-info');
+        });
+
+        $expected = [
+            ['DELETE', '/delete', 'delete'],
+            ['GET', '/get', 'get'],
+            ['HEAD', '/head', 'head'],
+            ['PATCH', '/patch', 'patch'],
+            ['POST', '/post', 'post'],
+            ['PUT', '/put', 'put'],
+            ['DELETE', '/group-one/delete', 'delete'],
+            ['GET', '/group-one/get', 'get'],
+            ['HEAD', '/group-one/head', 'head'],
+            ['PATCH', '/group-one/patch', 'patch'],
+            ['POST', '/group-one/post', 'post'],
+            ['PUT', '/group-one/put', 'put'],
+            ['DELETE', '/group-one/group-two/delete', 'delete'],
+            ['GET', '/group-one/group-two/get', 'get'],
+            ['HEAD', '/group-one/group-two/head', 'head'],
+            ['PATCH', '/group-one/group-two/patch', 'patch'],
+            ['POST', '/group-one/group-two/post', 'post'],
+            ['PUT', '/group-one/group-two/put', 'put'],
+            ['GET', '/admin-some-info', 'admin-some-info'],
+            ['GET', '/admin-more-info', 'admin-more-info'],
+        ];
+
+        $this->assertSame($expected, $r->routes);
+    }
+}
+
+class DummyRouteCollector extends RouteCollector
+{
+    public $routes = [];
+
+    public function __construct()
+    {
+    }
+
+    public function addRoute($method, $route, $handler)
+    {
+        $route = $this->currentGroupPrefix . $route;
+        $this->routes[] = [$method, $route, $handler];
+    }
+}
diff --git a/advancedcontentfilter/vendor/nikic/fast-route/test/RouteParser/StdTest.php b/advancedcontentfilter/vendor/nikic/fast-route/test/RouteParser/StdTest.php
new file mode 100644 (file)
index 0000000..e13e4de
--- /dev/null
@@ -0,0 +1,154 @@
+<?php
+
+namespace FastRoute\RouteParser;
+
+use PHPUnit\Framework\TestCase;
+
+class StdTest extends TestCase
+{
+    /** @dataProvider provideTestParse */
+    public function testParse($routeString, $expectedRouteDatas)
+    {
+        $parser = new Std();
+        $routeDatas = $parser->parse($routeString);
+        $this->assertSame($expectedRouteDatas, $routeDatas);
+    }
+
+    /** @dataProvider provideTestParseError */
+    public function testParseError($routeString, $expectedExceptionMessage)
+    {
+        $parser = new Std();
+        $this->setExpectedException('FastRoute\\BadRouteException', $expectedExceptionMessage);
+        $parser->parse($routeString);
+    }
+
+    public function provideTestParse()
+    {
+        return [
+            [
+                '/test',
+                [
+                    ['/test'],
+                ]
+            ],
+            [
+                '/test/{param}',
+                [
+                    ['/test/', ['param', '[^/]+']],
+                ]
+            ],
+            [
+                '/te{ param }st',
+                [
+                    ['/te', ['param', '[^/]+'], 'st']
+                ]
+            ],
+            [
+                '/test/{param1}/test2/{param2}',
+                [
+                    ['/test/', ['param1', '[^/]+'], '/test2/', ['param2', '[^/]+']]
+                ]
+            ],
+            [
+                '/test/{param:\d+}',
+                [
+                    ['/test/', ['param', '\d+']]
+                ]
+            ],
+            [
+                '/test/{ param : \d{1,9} }',
+                [
+                    ['/test/', ['param', '\d{1,9}']]
+                ]
+            ],
+            [
+                '/test[opt]',
+                [
+                    ['/test'],
+                    ['/testopt'],
+                ]
+            ],
+            [
+                '/test[/{param}]',
+                [
+                    ['/test'],
+                    ['/test/', ['param', '[^/]+']],
+                ]
+            ],
+            [
+                '/{param}[opt]',
+                [
+                    ['/', ['param', '[^/]+']],
+                    ['/', ['param', '[^/]+'], 'opt']
+                ]
+            ],
+            [
+                '/test[/{name}[/{id:[0-9]+}]]',
+                [
+                    ['/test'],
+                    ['/test/', ['name', '[^/]+']],
+                    ['/test/', ['name', '[^/]+'], '/', ['id', '[0-9]+']],
+                ]
+            ],
+            [
+                '',
+                [
+                    [''],
+                ]
+            ],
+            [
+                '[test]',
+                [
+                    [''],
+                    ['test'],
+                ]
+            ],
+            [
+                '/{foo-bar}',
+                [
+                    ['/', ['foo-bar', '[^/]+']]
+                ]
+            ],
+            [
+                '/{_foo:.*}',
+                [
+                    ['/', ['_foo', '.*']]
+                ]
+            ],
+        ];
+    }
+
+    public function provideTestParseError()
+    {
+        return [
+            [
+                '/test[opt',
+                "Number of opening '[' and closing ']' does not match"
+            ],
+            [
+                '/test[opt[opt2]',
+                "Number of opening '[' and closing ']' does not match"
+            ],
+            [
+                '/testopt]',
+                "Number of opening '[' and closing ']' does not match"
+            ],
+            [
+                '/test[]',
+                'Empty optional part'
+            ],
+            [
+                '/test[[opt]]',
+                'Empty optional part'
+            ],
+            [
+                '[[test]]',
+                'Empty optional part'
+            ],
+            [
+                '/test[/opt]/required',
+                'Optional segments can only occur at the end of a route'
+            ],
+        ];
+    }
+}
diff --git a/advancedcontentfilter/vendor/nikic/fast-route/test/bootstrap.php b/advancedcontentfilter/vendor/nikic/fast-route/test/bootstrap.php
new file mode 100644 (file)
index 0000000..3023f41
--- /dev/null
@@ -0,0 +1,11 @@
+<?php
+
+require_once __DIR__ . '/../src/functions.php';
+
+spl_autoload_register(function ($class) {
+    if (strpos($class, 'FastRoute\\') === 0) {
+        $dir = strcasecmp(substr($class, -4), 'Test') ? 'src/' : 'test/';
+        $name = substr($class, strlen('FastRoute'));
+        require __DIR__ . '/../' . $dir . strtr($name, '\\', DIRECTORY_SEPARATOR) . '.php';
+    }
+});
diff --git a/advancedcontentfilter/vendor/npm-asset/cacheable-request/LICENSE b/advancedcontentfilter/vendor/npm-asset/cacheable-request/LICENSE
new file mode 100644 (file)
index 0000000..f27ee9b
--- /dev/null
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2017 Luke Childs
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/advancedcontentfilter/vendor/npm-asset/cacheable-request/README.md b/advancedcontentfilter/vendor/npm-asset/cacheable-request/README.md
new file mode 100644 (file)
index 0000000..84a5568
--- /dev/null
@@ -0,0 +1,190 @@
+# cacheable-request
+
+> Wrap native HTTP requests with RFC compliant cache support
+
+[![Build Status](https://travis-ci.org/lukechilds/cacheable-request.svg?branch=master)](https://travis-ci.org/lukechilds/cacheable-request)
+[![Coverage Status](https://coveralls.io/repos/github/lukechilds/cacheable-request/badge.svg?branch=master)](https://coveralls.io/github/lukechilds/cacheable-request?branch=master)
+[![npm](https://img.shields.io/npm/dm/cacheable-request.svg)](https://www.npmjs.com/package/cacheable-request)
+[![npm](https://img.shields.io/npm/v/cacheable-request.svg)](https://www.npmjs.com/package/cacheable-request)
+
+[RFC 7234](http://httpwg.org/specs/rfc7234.html) compliant HTTP caching for native Node.js HTTP/HTTPS requests. Caching works out of the box in memory or is easily pluggable with a wide range of storage adapters.
+
+**Note:** This is a low level wrapper around the core HTTP modules, it's not a high level request library.
+
+## Features
+
+- Only stores cacheable responses as defined by RFC 7234
+- Fresh cache entries are served directly from cache
+- Stale cache entries are revalidated with `If-None-Match`/`If-Modified-Since` headers
+- 304 responses from revalidation requests use cached body
+- Updates `Age` header on cached responses
+- Can completely bypass cache on a per request basis
+- In memory cache by default
+- Official support for Redis, MongoDB, SQLite, PostgreSQL and MySQL storage adapters
+- Easily plug in your own or third-party storage adapters
+- If DB connection fails, cache is automatically bypassed ([disabled by default](#optsautomaticfailover))
+- Adds cache support to any existing HTTP code with minimal changes
+- Uses [http-cache-semantics](https://github.com/pornel/http-cache-semantics) internally for HTTP RFC 7234 compliance
+
+## Install
+
+```shell
+npm install --save cacheable-request
+```
+
+## Usage
+
+```js
+const http = require('http');
+const CacheableRequest = require('cacheable-request');
+
+// Then instead of
+const req = http.request('http://example.com', cb);
+req.end();
+
+// You can do
+const cacheableRequest = new CacheableRequest(http.request);
+const cacheReq = cacheableRequest('http://example.com', cb);
+cacheReq.on('request', req => req.end());
+// Future requests to 'example.com' will be returned from cache if still valid
+
+// You pass in any other http.request API compatible method to be wrapped with cache support:
+const cacheableRequest = new CacheableRequest(https.request);
+const cacheableRequest = new CacheableRequest(electron.net);
+```
+
+## Storage Adapters
+
+`cacheable-request` uses [Keyv](https://github.com/lukechilds/keyv) to support a wide range of storage adapters.
+
+For example, to use Redis as a cache backend, you just need to install the official Redis Keyv storage adapter:
+
+```
+npm install --save @keyv/redis
+```
+
+And then you can pass `CacheableRequest` your connection string:
+
+```js
+const cacheableRequest = new CacheableRequest(http.request, 'redis://user:pass@localhost:6379');
+```
+
+[View all official Keyv storage adapters.](https://github.com/lukechilds/keyv#official-storage-adapters)
+
+Keyv also supports anything that follows the Map API so it's easy to write your own storage adapter or use a third-party solution.
+
+e.g The following are all valid storage adapters
+
+```js
+const storageAdapter = new Map();
+// or
+const storageAdapter = require('./my-storage-adapter');
+// or
+const QuickLRU = require('quick-lru');
+const storageAdapter = new QuickLRU({ maxSize: 1000 });
+
+const cacheableRequest = new CacheableRequest(http.request, storageAdapter);
+```
+
+View the [Keyv docs](https://github.com/lukechilds/keyv) for more information on how to use storage adapters.
+
+## API
+
+### new cacheableRequest(request, [storageAdapter])
+
+Returns the provided request function wrapped with cache support.
+
+#### request
+
+Type: `function`
+
+Request function to wrap with cache support. Should be [`http.request`](https://nodejs.org/api/http.html#http_http_request_options_callback) or a similar API compatible request function.
+
+#### storageAdapter
+
+Type: `Keyv storage adapter`<br>
+Default: `new Map()`
+
+A [Keyv](https://github.com/lukechilds/keyv) storage adapter instance, or connection string if using with an official Keyv storage adapter.
+
+### Instance
+
+#### cacheableRequest(opts, [cb])
+
+Returns an event emitter.
+
+##### opts
+
+Type: `object`, `string`
+
+Any of the default request functions options plus:
+
+###### opts.cache
+
+Type: `boolean`<br>
+Default: `true`
+
+If the cache should be used. Setting this to false will completely bypass the cache for the current request.
+
+###### opts.strictTtl
+
+Type: `boolean`<br>
+Default: `false`
+
+If set to `false`, after a cached resource's TTL expires it is kept in the cache and will be revalidated on the next request with `If-None-Match`/`If-Modified-Since` headers.
+
+If set to `true` once a cached resource has expired it is deleted and will have to be re-requested.
+
+###### opts.automaticFailover
+
+Type: `boolean`<br>
+Default: `false`
+
+When set to `true`, if the DB connection fails we will automatically fallback to a network request. DB errors will still be emitted to notify you of the problem even though the request callback may succeed.
+
+##### cb
+
+Type: `function`
+
+The callback function which will receive the response as an argument.
+
+The response can be either a [Node.js HTTP response stream](https://nodejs.org/api/http.html#http_class_http_incomingmessage) or a [responselike object](https://github.com/lukechilds/responselike). The response will also have a `fromCache` property set with a boolean value.
+
+##### .on('request', request)
+
+`request` event to get the request object of the request.
+
+**Note:** This event will only fire if an HTTP request is actually made, not when a response is retrieved from cache. However, you should always handle the `request` event to end the request and handle any potential request errors.
+
+##### .on('response', response)
+
+`response` event to get the response object from the HTTP request or cache.
+
+##### .on('error', error)
+
+`error` event emitted in case of an error with the cache.
+
+Errors emitted here will be an instance of `CacheableRequest.RequestError` or `CacheableRequest.CacheError`. You will only ever receive a `RequestError` if the request function throws (normally caused by invalid user input). Normal request errors should be handled inside the `request` event.
+
+To properly handle all error scenarios you should use the following pattern:
+
+```js
+cacheableRequest('example.com', cb)
+  .on('error', err => {
+    if (err instanceof CacheableRequest.CacheError) {
+      handleCacheError(err); // Cache error
+    } else if (err instanceof CacheableRequest.RequestError) {
+      handleRequestError(err); // Request function thrown
+    }
+  })
+  .on('request', req => {
+    req.on('error', handleRequestError); // Request error emitted
+    req.end();
+  });
+```
+
+**Note:** Database connection errors are emitted here, however `cacheable-request` will attempt to re-request the resource and bypass the cache on a connection error. Therefore a database connection error doesn't necessarily mean the request won't be fulfilled.
+
+## License
+
+MIT © Luke Childs
diff --git a/advancedcontentfilter/vendor/npm-asset/cacheable-request/package.json b/advancedcontentfilter/vendor/npm-asset/cacheable-request/package.json
new file mode 100644 (file)
index 0000000..0448312
--- /dev/null
@@ -0,0 +1,57 @@
+{
+  "name": "cacheable-request",
+  "version": "2.1.4",
+  "description": "Wrap native HTTP requests with RFC compliant cache support",
+  "main": "src/index.js",
+  "scripts": {
+    "test": "xo && nyc ava",
+    "coverage": "nyc report --reporter=text-lcov | coveralls"
+  },
+  "xo": {
+    "extends": "xo-lukechilds"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/lukechilds/cacheable-request.git"
+  },
+  "keywords": [
+    "HTTP",
+    "HTTPS",
+    "cache",
+    "caching",
+    "layer",
+    "cacheable",
+    "RFC 7234",
+    "RFC",
+    "7234",
+    "compliant"
+  ],
+  "author": "Luke Childs <lukechilds123@gmail.com> (http://lukechilds.co.uk)",
+  "license": "MIT",
+  "bugs": {
+    "url": "https://github.com/lukechilds/cacheable-request/issues"
+  },
+  "homepage": "https://github.com/lukechilds/cacheable-request",
+  "dependencies": {
+    "clone-response": "1.0.2",
+    "get-stream": "3.0.0",
+    "http-cache-semantics": "3.8.1",
+    "keyv": "3.0.0",
+    "lowercase-keys": "1.0.0",
+    "normalize-url": "2.0.1",
+    "responselike": "1.0.2"
+  },
+  "devDependencies": {
+    "@keyv/sqlite": "^1.2.6",
+    "ava": "^0.24.0",
+    "coveralls": "^3.0.0",
+    "create-test-server": "^2.0.0",
+    "delay": "^2.0.0",
+    "eslint-config-xo-lukechilds": "^1.0.0",
+    "nyc": "^11.0.2",
+    "pify": "^3.0.0",
+    "sqlite3": "^3.1.9",
+    "this": "^1.0.2",
+    "xo": "^0.19.0"
+  }
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/cacheable-request/src/index.js b/advancedcontentfilter/vendor/npm-asset/cacheable-request/src/index.js
new file mode 100644 (file)
index 0000000..1935b2d
--- /dev/null
@@ -0,0 +1,155 @@
+'use strict';
+
+const EventEmitter = require('events');
+const urlLib = require('url');
+const normalizeUrl = require('normalize-url');
+const getStream = require('get-stream');
+const CachePolicy = require('http-cache-semantics');
+const Response = require('responselike');
+const lowercaseKeys = require('lowercase-keys');
+const cloneResponse = require('clone-response');
+const Keyv = require('keyv');
+
+class CacheableRequest {
+       constructor(request, cacheAdapter) {
+               if (typeof request !== 'function') {
+                       throw new TypeError('Parameter `request` must be a function');
+               }
+
+               this.cache = new Keyv({
+                       uri: typeof cacheAdapter === 'string' && cacheAdapter,
+                       store: typeof cacheAdapter !== 'string' && cacheAdapter,
+                       namespace: 'cacheable-request'
+               });
+
+               return this.createCacheableRequest(request);
+       }
+
+       createCacheableRequest(request) {
+               return (opts, cb) => {
+                       if (typeof opts === 'string') {
+                               opts = urlLib.parse(opts);
+                       }
+                       opts = Object.assign({
+                               headers: {},
+                               method: 'GET',
+                               cache: true,
+                               strictTtl: false,
+                               automaticFailover: false
+                       }, opts);
+                       opts.headers = lowercaseKeys(opts.headers);
+
+                       const ee = new EventEmitter();
+                       const url = normalizeUrl(urlLib.format(opts));
+                       const key = `${opts.method}:${url}`;
+                       let revalidate = false;
+                       let madeRequest = false;
+
+                       const makeRequest = opts => {
+                               madeRequest = true;
+                               const handler = response => {
+                                       if (revalidate) {
+                                               const revalidatedPolicy = CachePolicy.fromObject(revalidate.cachePolicy).revalidatedPolicy(opts, response);
+                                               if (!revalidatedPolicy.modified) {
+                                                       const headers = revalidatedPolicy.policy.responseHeaders();
+                                                       response = new Response(response.statusCode, headers, revalidate.body, revalidate.url);
+                                                       response.cachePolicy = revalidatedPolicy.policy;
+                                                       response.fromCache = true;
+                                               }
+                                       }
+
+                                       if (!response.fromCache) {
+                                               response.cachePolicy = new CachePolicy(opts, response);
+                                               response.fromCache = false;
+                                       }
+
+                                       let clonedResponse;
+                                       if (opts.cache && response.cachePolicy.storable()) {
+                                               clonedResponse = cloneResponse(response);
+                                               getStream.buffer(response)
+                                                       .then(body => {
+                                                               const value = {
+                                                                       cachePolicy: response.cachePolicy.toObject(),
+                                                                       url: response.url,
+                                                                       statusCode: response.fromCache ? revalidate.statusCode : response.statusCode,
+                                                                       body
+                                                               };
+                                                               const ttl = opts.strictTtl ? response.cachePolicy.timeToLive() : undefined;
+                                                               return this.cache.set(key, value, ttl);
+                                                       })
+                                                       .catch(err => ee.emit('error', new CacheableRequest.CacheError(err)));
+                                       } else if (opts.cache && revalidate) {
+                                               this.cache.delete(key)
+                                                       .catch(err => ee.emit('error', new CacheableRequest.CacheError(err)));
+                                       }
+
+                                       ee.emit('response', clonedResponse || response);
+                                       if (typeof cb === 'function') {
+                                               cb(clonedResponse || response);
+                                       }
+                               };
+
+                               try {
+                                       const req = request(opts, handler);
+                                       ee.emit('request', req);
+                               } catch (err) {
+                                       ee.emit('error', new CacheableRequest.RequestError(err));
+                               }
+                       };
+
+                       const get = opts => Promise.resolve()
+                               .then(() => opts.cache ? this.cache.get(key) : undefined)
+                               .then(cacheEntry => {
+                                       if (typeof cacheEntry === 'undefined') {
+                                               return makeRequest(opts);
+                                       }
+
+                                       const policy = CachePolicy.fromObject(cacheEntry.cachePolicy);
+                                       if (policy.satisfiesWithoutRevalidation(opts)) {
+                                               const headers = policy.responseHeaders();
+                                               const response = new Response(cacheEntry.statusCode, headers, cacheEntry.body, cacheEntry.url);
+                                               response.cachePolicy = policy;
+                                               response.fromCache = true;
+
+                                               ee.emit('response', response);
+                                               if (typeof cb === 'function') {
+                                                       cb(response);
+                                               }
+                                       } else {
+                                               revalidate = cacheEntry;
+                                               opts.headers = policy.revalidationHeaders(opts);
+                                               makeRequest(opts);
+                                       }
+                               });
+
+                       this.cache.on('error', err => ee.emit('error', new CacheableRequest.CacheError(err)));
+
+                       get(opts).catch(err => {
+                               if (opts.automaticFailover && !madeRequest) {
+                                       makeRequest(opts);
+                               }
+                               ee.emit('error', new CacheableRequest.CacheError(err));
+                       });
+
+                       return ee;
+               };
+       }
+}
+
+CacheableRequest.RequestError = class extends Error {
+       constructor(err) {
+               super(err.message);
+               this.name = 'RequestError';
+               Object.assign(this, err);
+       }
+};
+
+CacheableRequest.CacheError = class extends Error {
+       constructor(err) {
+               super(err.message);
+               this.name = 'CacheError';
+               Object.assign(this, err);
+       }
+};
+
+module.exports = CacheableRequest;
diff --git a/advancedcontentfilter/vendor/npm-asset/clone-response/LICENSE b/advancedcontentfilter/vendor/npm-asset/clone-response/LICENSE
new file mode 100644 (file)
index 0000000..f27ee9b
--- /dev/null
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2017 Luke Childs
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/advancedcontentfilter/vendor/npm-asset/clone-response/README.md b/advancedcontentfilter/vendor/npm-asset/clone-response/README.md
new file mode 100644 (file)
index 0000000..d037cfe
--- /dev/null
@@ -0,0 +1,62 @@
+# clone-response
+
+> Clone a Node.js HTTP response stream
+
+[![Build Status](https://travis-ci.org/lukechilds/clone-response.svg?branch=master)](https://travis-ci.org/lukechilds/clone-response)
+[![Coverage Status](https://coveralls.io/repos/github/lukechilds/clone-response/badge.svg?branch=master)](https://coveralls.io/github/lukechilds/clone-response?branch=master)
+[![npm](https://img.shields.io/npm/dm/clone-response.svg)](https://www.npmjs.com/package/clone-response)
+[![npm](https://img.shields.io/npm/v/clone-response.svg)](https://www.npmjs.com/package/clone-response)
+
+Returns a new stream and copies over all properties and methods from the original response giving you a complete duplicate.
+
+This is useful in situations where you need to consume the response stream but also want to pass an unconsumed stream somewhere else to be consumed later.
+
+## Install
+
+```shell
+npm install --save clone-response
+```
+
+## Usage
+
+```js
+const http = require('http');
+const cloneResponse = require('clone-response');
+
+http.get('http://example.com', response => {
+  const clonedResponse = cloneResponse(response);
+  response.pipe(process.stdout);
+
+  setImmediate(() => {
+    // The response stream has already been consumed by the time this executes,
+    // however the cloned response stream is still available.
+    doSomethingWithResponse(clonedResponse);
+  });
+});
+```
+
+Please bear in mind that the process of cloning a stream consumes it. However, you can consume a stream multiple times in the same tick, therefore allowing you to create multiple clones. e.g:
+
+```js
+const clone1 = cloneResponse(response);
+const clone2 = cloneResponse(response);
+// response can still be consumed in this tick but cannot be consumed if passed
+// into any async callbacks. clone1 and clone2 can be passed around and be
+// consumed in the future.
+```
+
+## API
+
+### cloneResponse(response)
+
+Returns a clone of the passed in response.
+
+#### response
+
+Type: `stream`
+
+A [Node.js HTTP response stream](https://nodejs.org/api/http.html#http_class_http_incomingmessage) to clone.
+
+## License
+
+MIT © Luke Childs
diff --git a/advancedcontentfilter/vendor/npm-asset/clone-response/package.json b/advancedcontentfilter/vendor/npm-asset/clone-response/package.json
new file mode 100644 (file)
index 0000000..2cb9aa6
--- /dev/null
@@ -0,0 +1,44 @@
+{
+  "name": "clone-response",
+  "version": "1.0.2",
+  "description": "Clone a Node.js HTTP response stream",
+  "main": "src/index.js",
+  "scripts": {
+    "test": "xo && nyc ava",
+    "coverage": "nyc report --reporter=text-lcov | coveralls"
+  },
+  "xo": {
+    "extends": "xo-lukechilds"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/lukechilds/clone-response.git"
+  },
+  "keywords": [
+    "clone",
+    "duplicate",
+    "copy",
+    "response",
+    "HTTP",
+    "stream"
+  ],
+  "author": "Luke Childs <lukechilds123@gmail.com> (http://lukechilds.co.uk)",
+  "license": "MIT",
+  "bugs": {
+    "url": "https://github.com/lukechilds/clone-response/issues"
+  },
+  "homepage": "https://github.com/lukechilds/clone-response",
+  "dependencies": {
+    "mimic-response": "^1.0.0"
+  },
+  "devDependencies": {
+    "ava": "^0.22.0",
+    "coveralls": "^2.13.1",
+    "create-test-server": "^2.0.1",
+    "eslint-config-xo-lukechilds": "^1.0.0",
+    "get-stream": "^3.0.0",
+    "nyc": "^11.0.2",
+    "pify": "^3.0.0",
+    "xo": "^0.19.0"
+  }
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/clone-response/src/index.js b/advancedcontentfilter/vendor/npm-asset/clone-response/src/index.js
new file mode 100644 (file)
index 0000000..0285dff
--- /dev/null
@@ -0,0 +1,17 @@
+'use strict';
+
+const PassThrough = require('stream').PassThrough;
+const mimicResponse = require('mimic-response');
+
+const cloneResponse = response => {
+       if (!(response && response.pipe)) {
+               throw new TypeError('Parameter `response` must be a response stream.');
+       }
+
+       const clone = new PassThrough();
+       mimicResponse(response, clone);
+
+       return response.pipe(clone);
+};
+
+module.exports = cloneResponse;
diff --git a/advancedcontentfilter/vendor/npm-asset/core-util-is/LICENSE b/advancedcontentfilter/vendor/npm-asset/core-util-is/LICENSE
new file mode 100644 (file)
index 0000000..d8d7f94
--- /dev/null
@@ -0,0 +1,19 @@
+Copyright Node.js contributors. All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to
+deal in the Software without restriction, including without limitation the
+rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+sell copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+IN THE SOFTWARE.
diff --git a/advancedcontentfilter/vendor/npm-asset/core-util-is/README.md b/advancedcontentfilter/vendor/npm-asset/core-util-is/README.md
new file mode 100644 (file)
index 0000000..5a76b41
--- /dev/null
@@ -0,0 +1,3 @@
+# core-util-is
+
+The `util.is*` functions introduced in Node v0.12.
diff --git a/advancedcontentfilter/vendor/npm-asset/core-util-is/float.patch b/advancedcontentfilter/vendor/npm-asset/core-util-is/float.patch
new file mode 100644 (file)
index 0000000..a06d5c0
--- /dev/null
@@ -0,0 +1,604 @@
+diff --git a/lib/util.js b/lib/util.js
+index a03e874..9074e8e 100644
+--- a/lib/util.js
++++ b/lib/util.js
+@@ -19,430 +19,6 @@
+ // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ // USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+-var formatRegExp = /%[sdj%]/g;
+-exports.format = function(f) {
+-  if (!isString(f)) {
+-    var objects = [];
+-    for (var i = 0; i < arguments.length; i++) {
+-      objects.push(inspect(arguments[i]));
+-    }
+-    return objects.join(' ');
+-  }
+-
+-  var i = 1;
+-  var args = arguments;
+-  var len = args.length;
+-  var str = String(f).replace(formatRegExp, function(x) {
+-    if (x === '%%') return '%';
+-    if (i >= len) return x;
+-    switch (x) {
+-      case '%s': return String(args[i++]);
+-      case '%d': return Number(args[i++]);
+-      case '%j':
+-        try {
+-          return JSON.stringify(args[i++]);
+-        } catch (_) {
+-          return '[Circular]';
+-        }
+-      default:
+-        return x;
+-    }
+-  });
+-  for (var x = args[i]; i < len; x = args[++i]) {
+-    if (isNull(x) || !isObject(x)) {
+-      str += ' ' + x;
+-    } else {
+-      str += ' ' + inspect(x);
+-    }
+-  }
+-  return str;
+-};
+-
+-
+-// Mark that a method should not be used.
+-// Returns a modified function which warns once by default.
+-// If --no-deprecation is set, then it is a no-op.
+-exports.deprecate = function(fn, msg) {
+-  // Allow for deprecating things in the process of starting up.
+-  if (isUndefined(global.process)) {
+-    return function() {
+-      return exports.deprecate(fn, msg).apply(this, arguments);
+-    };
+-  }
+-
+-  if (process.noDeprecation === true) {
+-    return fn;
+-  }
+-
+-  var warned = false;
+-  function deprecated() {
+-    if (!warned) {
+-      if (process.throwDeprecation) {
+-        throw new Error(msg);
+-      } else if (process.traceDeprecation) {
+-        console.trace(msg);
+-      } else {
+-        console.error(msg);
+-      }
+-      warned = true;
+-    }
+-    return fn.apply(this, arguments);
+-  }
+-
+-  return deprecated;
+-};
+-
+-
+-var debugs = {};
+-var debugEnviron;
+-exports.debuglog = function(set) {
+-  if (isUndefined(debugEnviron))
+-    debugEnviron = process.env.NODE_DEBUG || '';
+-  set = set.toUpperCase();
+-  if (!debugs[set]) {
+-    if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) {
+-      var pid = process.pid;
+-      debugs[set] = function() {
+-        var msg = exports.format.apply(exports, arguments);
+-        console.error('%s %d: %s', set, pid, msg);
+-      };
+-    } else {
+-      debugs[set] = function() {};
+-    }
+-  }
+-  return debugs[set];
+-};
+-
+-
+-/**
+- * Echos the value of a value. Trys to print the value out
+- * in the best way possible given the different types.
+- *
+- * @param {Object} obj The object to print out.
+- * @param {Object} opts Optional options object that alters the output.
+- */
+-/* legacy: obj, showHidden, depth, colors*/
+-function inspect(obj, opts) {
+-  // default options
+-  var ctx = {
+-    seen: [],
+-    stylize: stylizeNoColor
+-  };
+-  // legacy...
+-  if (arguments.length >= 3) ctx.depth = arguments[2];
+-  if (arguments.length >= 4) ctx.colors = arguments[3];
+-  if (isBoolean(opts)) {
+-    // legacy...
+-    ctx.showHidden = opts;
+-  } else if (opts) {
+-    // got an "options" object
+-    exports._extend(ctx, opts);
+-  }
+-  // set default options
+-  if (isUndefined(ctx.showHidden)) ctx.showHidden = false;
+-  if (isUndefined(ctx.depth)) ctx.depth = 2;
+-  if (isUndefined(ctx.colors)) ctx.colors = false;
+-  if (isUndefined(ctx.customInspect)) ctx.customInspect = true;
+-  if (ctx.colors) ctx.stylize = stylizeWithColor;
+-  return formatValue(ctx, obj, ctx.depth);
+-}
+-exports.inspect = inspect;
+-
+-
+-// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics
+-inspect.colors = {
+-  'bold' : [1, 22],
+-  'italic' : [3, 23],
+-  'underline' : [4, 24],
+-  'inverse' : [7, 27],
+-  'white' : [37, 39],
+-  'grey' : [90, 39],
+-  'black' : [30, 39],
+-  'blue' : [34, 39],
+-  'cyan' : [36, 39],
+-  'green' : [32, 39],
+-  'magenta' : [35, 39],
+-  'red' : [31, 39],
+-  'yellow' : [33, 39]
+-};
+-
+-// Don't use 'blue' not visible on cmd.exe
+-inspect.styles = {
+-  'special': 'cyan',
+-  'number': 'yellow',
+-  'boolean': 'yellow',
+-  'undefined': 'grey',
+-  'null': 'bold',
+-  'string': 'green',
+-  'date': 'magenta',
+-  // "name": intentionally not styling
+-  'regexp': 'red'
+-};
+-
+-
+-function stylizeWithColor(str, styleType) {
+-  var style = inspect.styles[styleType];
+-
+-  if (style) {
+-    return '\u001b[' + inspect.colors[style][0] + 'm' + str +
+-           '\u001b[' + inspect.colors[style][1] + 'm';
+-  } else {
+-    return str;
+-  }
+-}
+-
+-
+-function stylizeNoColor(str, styleType) {
+-  return str;
+-}
+-
+-
+-function arrayToHash(array) {
+-  var hash = {};
+-
+-  array.forEach(function(val, idx) {
+-    hash[val] = true;
+-  });
+-
+-  return hash;
+-}
+-
+-
+-function formatValue(ctx, value, recurseTimes) {
+-  // Provide a hook for user-specified inspect functions.
+-  // Check that value is an object with an inspect function on it
+-  if (ctx.customInspect &&
+-      value &&
+-      isFunction(value.inspect) &&
+-      // Filter out the util module, it's inspect function is special
+-      value.inspect !== exports.inspect &&
+-      // Also filter out any prototype objects using the circular check.
+-      !(value.constructor && value.constructor.prototype === value)) {
+-    var ret = value.inspect(recurseTimes, ctx);
+-    if (!isString(ret)) {
+-      ret = formatValue(ctx, ret, recurseTimes);
+-    }
+-    return ret;
+-  }
+-
+-  // Primitive types cannot have properties
+-  var primitive = formatPrimitive(ctx, value);
+-  if (primitive) {
+-    return primitive;
+-  }
+-
+-  // Look up the keys of the object.
+-  var keys = Object.keys(value);
+-  var visibleKeys = arrayToHash(keys);
+-
+-  if (ctx.showHidden) {
+-    keys = Object.getOwnPropertyNames(value);
+-  }
+-
+-  // Some type of object without properties can be shortcutted.
+-  if (keys.length === 0) {
+-    if (isFunction(value)) {
+-      var name = value.name ? ': ' + value.name : '';
+-      return ctx.stylize('[Function' + name + ']', 'special');
+-    }
+-    if (isRegExp(value)) {
+-      return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
+-    }
+-    if (isDate(value)) {
+-      return ctx.stylize(Date.prototype.toString.call(value), 'date');
+-    }
+-    if (isError(value)) {
+-      return formatError(value);
+-    }
+-  }
+-
+-  var base = '', array = false, braces = ['{', '}'];
+-
+-  // Make Array say that they are Array
+-  if (isArray(value)) {
+-    array = true;
+-    braces = ['[', ']'];
+-  }
+-
+-  // Make functions say that they are functions
+-  if (isFunction(value)) {
+-    var n = value.name ? ': ' + value.name : '';
+-    base = ' [Function' + n + ']';
+-  }
+-
+-  // Make RegExps say that they are RegExps
+-  if (isRegExp(value)) {
+-    base = ' ' + RegExp.prototype.toString.call(value);
+-  }
+-
+-  // Make dates with properties first say the date
+-  if (isDate(value)) {
+-    base = ' ' + Date.prototype.toUTCString.call(value);
+-  }
+-
+-  // Make error with message first say the error
+-  if (isError(value)) {
+-    base = ' ' + formatError(value);
+-  }
+-
+-  if (keys.length === 0 && (!array || value.length == 0)) {
+-    return braces[0] + base + braces[1];
+-  }
+-
+-  if (recurseTimes < 0) {
+-    if (isRegExp(value)) {
+-      return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
+-    } else {
+-      return ctx.stylize('[Object]', 'special');
+-    }
+-  }
+-
+-  ctx.seen.push(value);
+-
+-  var output;
+-  if (array) {
+-    output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);
+-  } else {
+-    output = keys.map(function(key) {
+-      return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);
+-    });
+-  }
+-
+-  ctx.seen.pop();
+-
+-  return reduceToSingleString(output, base, braces);
+-}
+-
+-
+-function formatPrimitive(ctx, value) {
+-  if (isUndefined(value))
+-    return ctx.stylize('undefined', 'undefined');
+-  if (isString(value)) {
+-    var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '')
+-                                             .replace(/'/g, "\\'")
+-                                             .replace(/\\"/g, '"') + '\'';
+-    return ctx.stylize(simple, 'string');
+-  }
+-  if (isNumber(value)) {
+-    // Format -0 as '-0'. Strict equality won't distinguish 0 from -0,
+-    // so instead we use the fact that 1 / -0 < 0 whereas 1 / 0 > 0 .
+-    if (value === 0 && 1 / value < 0)
+-      return ctx.stylize('-0', 'number');
+-    return ctx.stylize('' + value, 'number');
+-  }
+-  if (isBoolean(value))
+-    return ctx.stylize('' + value, 'boolean');
+-  // For some reason typeof null is "object", so special case here.
+-  if (isNull(value))
+-    return ctx.stylize('null', 'null');
+-}
+-
+-
+-function formatError(value) {
+-  return '[' + Error.prototype.toString.call(value) + ']';
+-}
+-
+-
+-function formatArray(ctx, value, recurseTimes, visibleKeys, keys) {
+-  var output = [];
+-  for (var i = 0, l = value.length; i < l; ++i) {
+-    if (hasOwnProperty(value, String(i))) {
+-      output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
+-          String(i), true));
+-    } else {
+-      output.push('');
+-    }
+-  }
+-  keys.forEach(function(key) {
+-    if (!key.match(/^\d+$/)) {
+-      output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
+-          key, true));
+-    }
+-  });
+-  return output;
+-}
+-
+-
+-function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {
+-  var name, str, desc;
+-  desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] };
+-  if (desc.get) {
+-    if (desc.set) {
+-      str = ctx.stylize('[Getter/Setter]', 'special');
+-    } else {
+-      str = ctx.stylize('[Getter]', 'special');
+-    }
+-  } else {
+-    if (desc.set) {
+-      str = ctx.stylize('[Setter]', 'special');
+-    }
+-  }
+-  if (!hasOwnProperty(visibleKeys, key)) {
+-    name = '[' + key + ']';
+-  }
+-  if (!str) {
+-    if (ctx.seen.indexOf(desc.value) < 0) {
+-      if (isNull(recurseTimes)) {
+-        str = formatValue(ctx, desc.value, null);
+-      } else {
+-        str = formatValue(ctx, desc.value, recurseTimes - 1);
+-      }
+-      if (str.indexOf('\n') > -1) {
+-        if (array) {
+-          str = str.split('\n').map(function(line) {
+-            return '  ' + line;
+-          }).join('\n').substr(2);
+-        } else {
+-          str = '\n' + str.split('\n').map(function(line) {
+-            return '   ' + line;
+-          }).join('\n');
+-        }
+-      }
+-    } else {
+-      str = ctx.stylize('[Circular]', 'special');
+-    }
+-  }
+-  if (isUndefined(name)) {
+-    if (array && key.match(/^\d+$/)) {
+-      return str;
+-    }
+-    name = JSON.stringify('' + key);
+-    if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) {
+-      name = name.substr(1, name.length - 2);
+-      name = ctx.stylize(name, 'name');
+-    } else {
+-      name = name.replace(/'/g, "\\'")
+-                 .replace(/\\"/g, '"')
+-                 .replace(/(^"|"$)/g, "'");
+-      name = ctx.stylize(name, 'string');
+-    }
+-  }
+-
+-  return name + ': ' + str;
+-}
+-
+-
+-function reduceToSingleString(output, base, braces) {
+-  var numLinesEst = 0;
+-  var length = output.reduce(function(prev, cur) {
+-    numLinesEst++;
+-    if (cur.indexOf('\n') >= 0) numLinesEst++;
+-    return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1;
+-  }, 0);
+-
+-  if (length > 60) {
+-    return braces[0] +
+-           (base === '' ? '' : base + '\n ') +
+-           ' ' +
+-           output.join(',\n  ') +
+-           ' ' +
+-           braces[1];
+-  }
+-
+-  return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];
+-}
+-
+-
+ // NOTE: These type checking functions intentionally don't use `instanceof`
+ // because it is fragile and can be easily faked with `Object.create()`.
+ function isArray(ar) {
+@@ -522,166 +98,10 @@ function isPrimitive(arg) {
+ exports.isPrimitive = isPrimitive;
+
+ function isBuffer(arg) {
+-  return arg instanceof Buffer;
++  return Buffer.isBuffer(arg);
+ }
+ exports.isBuffer = isBuffer;
+
+ function objectToString(o) {
+   return Object.prototype.toString.call(o);
+-}
+-
+-
+-function pad(n) {
+-  return n < 10 ? '0' + n.toString(10) : n.toString(10);
+-}
+-
+-
+-var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',
+-              'Oct', 'Nov', 'Dec'];
+-
+-// 26 Feb 16:19:34
+-function timestamp() {
+-  var d = new Date();
+-  var time = [pad(d.getHours()),
+-              pad(d.getMinutes()),
+-              pad(d.getSeconds())].join(':');
+-  return [d.getDate(), months[d.getMonth()], time].join(' ');
+-}
+-
+-
+-// log is just a thin wrapper to console.log that prepends a timestamp
+-exports.log = function() {
+-  console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments));
+-};
+-
+-
+-/**
+- * Inherit the prototype methods from one constructor into another.
+- *
+- * The Function.prototype.inherits from lang.js rewritten as a standalone
+- * function (not on Function.prototype). NOTE: If this file is to be loaded
+- * during bootstrapping this function needs to be rewritten using some native
+- * functions as prototype setup using normal JavaScript does not work as
+- * expected during bootstrapping (see mirror.js in r114903).
+- *
+- * @param {function} ctor Constructor function which needs to inherit the
+- *     prototype.
+- * @param {function} superCtor Constructor function to inherit prototype from.
+- */
+-exports.inherits = function(ctor, superCtor) {
+-  ctor.super_ = superCtor;
+-  ctor.prototype = Object.create(superCtor.prototype, {
+-    constructor: {
+-      value: ctor,
+-      enumerable: false,
+-      writable: true,
+-      configurable: true
+-    }
+-  });
+-};
+-
+-exports._extend = function(origin, add) {
+-  // Don't do anything if add isn't an object
+-  if (!add || !isObject(add)) return origin;
+-
+-  var keys = Object.keys(add);
+-  var i = keys.length;
+-  while (i--) {
+-    origin[keys[i]] = add[keys[i]];
+-  }
+-  return origin;
+-};
+-
+-function hasOwnProperty(obj, prop) {
+-  return Object.prototype.hasOwnProperty.call(obj, prop);
+-}
+-
+-
+-// Deprecated old stuff.
+-
+-exports.p = exports.deprecate(function() {
+-  for (var i = 0, len = arguments.length; i < len; ++i) {
+-    console.error(exports.inspect(arguments[i]));
+-  }
+-}, 'util.p: Use console.error() instead');
+-
+-
+-exports.exec = exports.deprecate(function() {
+-  return require('child_process').exec.apply(this, arguments);
+-}, 'util.exec is now called `child_process.exec`.');
+-
+-
+-exports.print = exports.deprecate(function() {
+-  for (var i = 0, len = arguments.length; i < len; ++i) {
+-    process.stdout.write(String(arguments[i]));
+-  }
+-}, 'util.print: Use console.log instead');
+-
+-
+-exports.puts = exports.deprecate(function() {
+-  for (var i = 0, len = arguments.length; i < len; ++i) {
+-    process.stdout.write(arguments[i] + '\n');
+-  }
+-}, 'util.puts: Use console.log instead');
+-
+-
+-exports.debug = exports.deprecate(function(x) {
+-  process.stderr.write('DEBUG: ' + x + '\n');
+-}, 'util.debug: Use console.error instead');
+-
+-
+-exports.error = exports.deprecate(function(x) {
+-  for (var i = 0, len = arguments.length; i < len; ++i) {
+-    process.stderr.write(arguments[i] + '\n');
+-  }
+-}, 'util.error: Use console.error instead');
+-
+-
+-exports.pump = exports.deprecate(function(readStream, writeStream, callback) {
+-  var callbackCalled = false;
+-
+-  function call(a, b, c) {
+-    if (callback && !callbackCalled) {
+-      callback(a, b, c);
+-      callbackCalled = true;
+-    }
+-  }
+-
+-  readStream.addListener('data', function(chunk) {
+-    if (writeStream.write(chunk) === false) readStream.pause();
+-  });
+-
+-  writeStream.addListener('drain', function() {
+-    readStream.resume();
+-  });
+-
+-  readStream.addListener('end', function() {
+-    writeStream.end();
+-  });
+-
+-  readStream.addListener('close', function() {
+-    call();
+-  });
+-
+-  readStream.addListener('error', function(err) {
+-    writeStream.end();
+-    call(err);
+-  });
+-
+-  writeStream.addListener('error', function(err) {
+-    readStream.destroy();
+-    call(err);
+-  });
+-}, 'util.pump(): Use readableStream.pipe() instead');
+-
+-
+-var uv;
+-exports._errnoException = function(err, syscall) {
+-  if (isUndefined(uv)) uv = process.binding('uv');
+-  var errname = uv.errname(err);
+-  var e = new Error(syscall + ' ' + errname);
+-  e.code = errname;
+-  e.errno = errname;
+-  e.syscall = syscall;
+-  return e;
+-};
++}
\ No newline at end of file
diff --git a/advancedcontentfilter/vendor/npm-asset/core-util-is/lib/util.js b/advancedcontentfilter/vendor/npm-asset/core-util-is/lib/util.js
new file mode 100644 (file)
index 0000000..ff4c851
--- /dev/null
@@ -0,0 +1,107 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+// NOTE: These type checking functions intentionally don't use `instanceof`
+// because it is fragile and can be easily faked with `Object.create()`.
+
+function isArray(arg) {
+  if (Array.isArray) {
+    return Array.isArray(arg);
+  }
+  return objectToString(arg) === '[object Array]';
+}
+exports.isArray = isArray;
+
+function isBoolean(arg) {
+  return typeof arg === 'boolean';
+}
+exports.isBoolean = isBoolean;
+
+function isNull(arg) {
+  return arg === null;
+}
+exports.isNull = isNull;
+
+function isNullOrUndefined(arg) {
+  return arg == null;
+}
+exports.isNullOrUndefined = isNullOrUndefined;
+
+function isNumber(arg) {
+  return typeof arg === 'number';
+}
+exports.isNumber = isNumber;
+
+function isString(arg) {
+  return typeof arg === 'string';
+}
+exports.isString = isString;
+
+function isSymbol(arg) {
+  return typeof arg === 'symbol';
+}
+exports.isSymbol = isSymbol;
+
+function isUndefined(arg) {
+  return arg === void 0;
+}
+exports.isUndefined = isUndefined;
+
+function isRegExp(re) {
+  return objectToString(re) === '[object RegExp]';
+}
+exports.isRegExp = isRegExp;
+
+function isObject(arg) {
+  return typeof arg === 'object' && arg !== null;
+}
+exports.isObject = isObject;
+
+function isDate(d) {
+  return objectToString(d) === '[object Date]';
+}
+exports.isDate = isDate;
+
+function isError(e) {
+  return (objectToString(e) === '[object Error]' || e instanceof Error);
+}
+exports.isError = isError;
+
+function isFunction(arg) {
+  return typeof arg === 'function';
+}
+exports.isFunction = isFunction;
+
+function isPrimitive(arg) {
+  return arg === null ||
+         typeof arg === 'boolean' ||
+         typeof arg === 'number' ||
+         typeof arg === 'string' ||
+         typeof arg === 'symbol' ||  // ES6 symbol
+         typeof arg === 'undefined';
+}
+exports.isPrimitive = isPrimitive;
+
+exports.isBuffer = Buffer.isBuffer;
+
+function objectToString(o) {
+  return Object.prototype.toString.call(o);
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/core-util-is/package.json b/advancedcontentfilter/vendor/npm-asset/core-util-is/package.json
new file mode 100644 (file)
index 0000000..3368e95
--- /dev/null
@@ -0,0 +1,32 @@
+{
+  "name": "core-util-is",
+  "version": "1.0.2",
+  "description": "The `util.is*` functions introduced in Node v0.12.",
+  "main": "lib/util.js",
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/isaacs/core-util-is"
+  },
+  "keywords": [
+    "util",
+    "isBuffer",
+    "isArray",
+    "isNumber",
+    "isString",
+    "isRegExp",
+    "isThis",
+    "isThat",
+    "polyfill"
+  ],
+  "author": "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me/)",
+  "license": "MIT",
+  "bugs": {
+    "url": "https://github.com/isaacs/core-util-is/issues"
+  },
+  "scripts": {
+    "test": "tap test.js"
+  },
+  "devDependencies": {
+    "tap": "^2.3.0"
+  }
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/core-util-is/test.js b/advancedcontentfilter/vendor/npm-asset/core-util-is/test.js
new file mode 100644 (file)
index 0000000..1a490c6
--- /dev/null
@@ -0,0 +1,68 @@
+var assert = require('tap');
+
+var t = require('./lib/util');
+
+assert.equal(t.isArray([]), true);
+assert.equal(t.isArray({}), false);
+
+assert.equal(t.isBoolean(null), false);
+assert.equal(t.isBoolean(true), true);
+assert.equal(t.isBoolean(false), true);
+
+assert.equal(t.isNull(null), true);
+assert.equal(t.isNull(undefined), false);
+assert.equal(t.isNull(false), false);
+assert.equal(t.isNull(), false);
+
+assert.equal(t.isNullOrUndefined(null), true);
+assert.equal(t.isNullOrUndefined(undefined), true);
+assert.equal(t.isNullOrUndefined(false), false);
+assert.equal(t.isNullOrUndefined(), true);
+
+assert.equal(t.isNumber(null), false);
+assert.equal(t.isNumber('1'), false);
+assert.equal(t.isNumber(1), true);
+
+assert.equal(t.isString(null), false);
+assert.equal(t.isString('1'), true);
+assert.equal(t.isString(1), false);
+
+assert.equal(t.isSymbol(null), false);
+assert.equal(t.isSymbol('1'), false);
+assert.equal(t.isSymbol(1), false);
+assert.equal(t.isSymbol(Symbol()), true);
+
+assert.equal(t.isUndefined(null), false);
+assert.equal(t.isUndefined(undefined), true);
+assert.equal(t.isUndefined(false), false);
+assert.equal(t.isUndefined(), true);
+
+assert.equal(t.isRegExp(null), false);
+assert.equal(t.isRegExp('1'), false);
+assert.equal(t.isRegExp(new RegExp()), true);
+
+assert.equal(t.isObject({}), true);
+assert.equal(t.isObject([]), true);
+assert.equal(t.isObject(new RegExp()), true);
+assert.equal(t.isObject(new Date()), true);
+
+assert.equal(t.isDate(null), false);
+assert.equal(t.isDate('1'), false);
+assert.equal(t.isDate(new Date()), true);
+
+assert.equal(t.isError(null), false);
+assert.equal(t.isError({ err: true }), false);
+assert.equal(t.isError(new Error()), true);
+
+assert.equal(t.isFunction(null), false);
+assert.equal(t.isFunction({ }), false);
+assert.equal(t.isFunction(function() {}), true);
+
+assert.equal(t.isPrimitive(null), true);
+assert.equal(t.isPrimitive(''), true);
+assert.equal(t.isPrimitive(0), true);
+assert.equal(t.isPrimitive(new Date()), false);
+
+assert.equal(t.isBuffer(null), false);
+assert.equal(t.isBuffer({}), false);
+assert.equal(t.isBuffer(new Buffer(0)), true);
diff --git a/advancedcontentfilter/vendor/npm-asset/decode-uri-component/index.js b/advancedcontentfilter/vendor/npm-asset/decode-uri-component/index.js
new file mode 100644 (file)
index 0000000..691499b
--- /dev/null
@@ -0,0 +1,94 @@
+'use strict';
+var token = '%[a-f0-9]{2}';
+var singleMatcher = new RegExp(token, 'gi');
+var multiMatcher = new RegExp('(' + token + ')+', 'gi');
+
+function decodeComponents(components, split) {
+       try {
+               // Try to decode the entire string first
+               return decodeURIComponent(components.join(''));
+       } catch (err) {
+               // Do nothing
+       }
+
+       if (components.length === 1) {
+               return components;
+       }
+
+       split = split || 1;
+
+       // Split the array in 2 parts
+       var left = components.slice(0, split);
+       var right = components.slice(split);
+
+       return Array.prototype.concat.call([], decodeComponents(left), decodeComponents(right));
+}
+
+function decode(input) {
+       try {
+               return decodeURIComponent(input);
+       } catch (err) {
+               var tokens = input.match(singleMatcher);
+
+               for (var i = 1; i < tokens.length; i++) {
+                       input = decodeComponents(tokens, i).join('');
+
+                       tokens = input.match(singleMatcher);
+               }
+
+               return input;
+       }
+}
+
+function customDecodeURIComponent(input) {
+       // Keep track of all the replacements and prefill the map with the `BOM`
+       var replaceMap = {
+               '%FE%FF': '\uFFFD\uFFFD',
+               '%FF%FE': '\uFFFD\uFFFD'
+       };
+
+       var match = multiMatcher.exec(input);
+       while (match) {
+               try {
+                       // Decode as big chunks as possible
+                       replaceMap[match[0]] = decodeURIComponent(match[0]);
+               } catch (err) {
+                       var result = decode(match[0]);
+
+                       if (result !== match[0]) {
+                               replaceMap[match[0]] = result;
+                       }
+               }
+
+               match = multiMatcher.exec(input);
+       }
+
+       // Add `%C2` at the end of the map to make sure it does not replace the combinator before everything else
+       replaceMap['%C2'] = '\uFFFD';
+
+       var entries = Object.keys(replaceMap);
+
+       for (var i = 0; i < entries.length; i++) {
+               // Replace all decoded components
+               var key = entries[i];
+               input = input.replace(new RegExp(key, 'g'), replaceMap[key]);
+       }
+
+       return input;
+}
+
+module.exports = function (encodedURI) {
+       if (typeof encodedURI !== 'string') {
+               throw new TypeError('Expected `encodedURI` to be of type `string`, got `' + typeof encodedURI + '`');
+       }
+
+       try {
+               encodedURI = encodedURI.replace(/\+/g, ' ');
+
+               // Try the built in decoder first
+               return decodeURIComponent(encodedURI);
+       } catch (err) {
+               // Fallback to a more advanced decoder
+               return customDecodeURIComponent(encodedURI);
+       }
+};
diff --git a/advancedcontentfilter/vendor/npm-asset/decode-uri-component/license b/advancedcontentfilter/vendor/npm-asset/decode-uri-component/license
new file mode 100644 (file)
index 0000000..78b0855
--- /dev/null
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) Sam Verschueren <sam.verschueren@gmail.com> (github.com/SamVerschueren)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/advancedcontentfilter/vendor/npm-asset/decode-uri-component/package.json b/advancedcontentfilter/vendor/npm-asset/decode-uri-component/package.json
new file mode 100644 (file)
index 0000000..183bd7c
--- /dev/null
@@ -0,0 +1,37 @@
+{
+  "name": "decode-uri-component",
+  "version": "0.2.0",
+  "description": "A better decodeURIComponent",
+  "license": "MIT",
+  "repository": "SamVerschueren/decode-uri-component",
+  "author": {
+    "name": "Sam Verschueren",
+    "email": "sam.verschueren@gmail.com",
+    "url": "github.com/SamVerschueren"
+  },
+  "engines": {
+    "node": ">=0.10"
+  },
+  "scripts": {
+    "test": "xo && nyc ava",
+    "coveralls": "nyc report --reporter=text-lcov | coveralls"
+  },
+  "files": [
+    "index.js"
+  ],
+  "keywords": [
+    "decode",
+    "uri",
+    "component",
+    "decodeuricomponent",
+    "components",
+    "decoder",
+    "url"
+  ],
+  "devDependencies": {
+    "ava": "^0.17.0",
+    "coveralls": "^2.13.1",
+    "nyc": "^10.3.2",
+    "xo": "^0.16.0"
+  }
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/decode-uri-component/readme.md b/advancedcontentfilter/vendor/npm-asset/decode-uri-component/readme.md
new file mode 100644 (file)
index 0000000..795c87f
--- /dev/null
@@ -0,0 +1,70 @@
+# decode-uri-component
+
+[![Build Status](https://travis-ci.org/SamVerschueren/decode-uri-component.svg?branch=master)](https://travis-ci.org/SamVerschueren/decode-uri-component) [![Coverage Status](https://coveralls.io/repos/SamVerschueren/decode-uri-component/badge.svg?branch=master&service=github)](https://coveralls.io/github/SamVerschueren/decode-uri-component?branch=master)
+
+> A better [decodeURIComponent](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent)
+
+
+## Why?
+
+- Decodes `+` to a space.
+- Converts the [BOM](https://en.wikipedia.org/wiki/Byte_order_mark) to a [replacement character](https://en.wikipedia.org/wiki/Specials_(Unicode_block)#Replacement_character) `�`.
+- Does not throw with invalid encoded input.
+- Decodes as much of the string as possible.
+
+
+## Install
+
+```
+$ npm install --save decode-uri-component
+```
+
+
+## Usage
+
+```js
+const decodeUriComponent = require('decode-uri-component');
+
+decodeUriComponent('%25');
+//=> '%'
+
+decodeUriComponent('%');
+//=> '%'
+
+decodeUriComponent('st%C3%A5le');
+//=> 'ståle'
+
+decodeUriComponent('%st%C3%A5le%');
+//=> '%ståle%'
+
+decodeUriComponent('%%7Bst%C3%A5le%7D%');
+//=> '%{ståle}%'
+
+decodeUriComponent('%7B%ab%%7C%de%%7D');
+//=> '{%ab%|%de%}'
+
+decodeUriComponent('%FE%FF');
+//=> '\uFFFD\uFFFD'
+
+decodeUriComponent('%C2');
+//=> '\uFFFD'
+
+decodeUriComponent('%C2%B5');
+//=> 'µ'
+```
+
+
+## API
+
+### decodeUriComponent(encodedURI)
+
+#### encodedURI
+
+Type: `string`
+
+An encoded component of a Uniform Resource Identifier.
+
+
+## License
+
+MIT © [Sam Verschueren](https://github.com/SamVerschueren)
diff --git a/advancedcontentfilter/vendor/npm-asset/decompress-response/index.js b/advancedcontentfilter/vendor/npm-asset/decompress-response/index.js
new file mode 100644 (file)
index 0000000..d8acd4a
--- /dev/null
@@ -0,0 +1,29 @@
+'use strict';
+const PassThrough = require('stream').PassThrough;
+const zlib = require('zlib');
+const mimicResponse = require('mimic-response');
+
+module.exports = response => {
+       // TODO: Use Array#includes when targeting Node.js 6
+       if (['gzip', 'deflate'].indexOf(response.headers['content-encoding']) === -1) {
+               return response;
+       }
+
+       const unzip = zlib.createUnzip();
+       const stream = new PassThrough();
+
+       mimicResponse(response, stream);
+
+       unzip.on('error', err => {
+               if (err.code === 'Z_BUF_ERROR') {
+                       stream.end();
+                       return;
+               }
+
+               stream.emit('error', err);
+       });
+
+       response.pipe(unzip).pipe(stream);
+
+       return stream;
+};
diff --git a/advancedcontentfilter/vendor/npm-asset/decompress-response/license b/advancedcontentfilter/vendor/npm-asset/decompress-response/license
new file mode 100644 (file)
index 0000000..32a16ce
--- /dev/null
@@ -0,0 +1,21 @@
+`The MIT License (MIT)
+
+Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/advancedcontentfilter/vendor/npm-asset/decompress-response/package.json b/advancedcontentfilter/vendor/npm-asset/decompress-response/package.json
new file mode 100644 (file)
index 0000000..3574dc2
--- /dev/null
@@ -0,0 +1,53 @@
+{
+  "name": "decompress-response",
+  "version": "3.3.0",
+  "description": "Decompress a HTTP response if needed",
+  "license": "MIT",
+  "repository": "sindresorhus/decompress-response",
+  "maintainers": [
+    {
+      "name": "Sindre Sorhus",
+      "email": "sindresorhus@gmail.com",
+      "url": "sindresorhus.com"
+    },
+    {
+      "name": "Vsevolod Strukchinsky",
+      "email": "floatdrop@gmail.com",
+      "url": "github.com/floatdrop"
+    }
+  ],
+  "engines": {
+    "node": ">=4"
+  },
+  "scripts": {
+    "test": "xo && ava"
+  },
+  "files": [
+    "index.js"
+  ],
+  "keywords": [
+    "decompress",
+    "response",
+    "http",
+    "https",
+    "zlib",
+    "gzip",
+    "zip",
+    "deflate",
+    "unzip",
+    "ungzip",
+    "incoming",
+    "message",
+    "stream",
+    "compressed"
+  ],
+  "dependencies": {
+    "mimic-response": "^1.0.0"
+  },
+  "devDependencies": {
+    "ava": "*",
+    "get-stream": "^3.0.0",
+    "pify": "^3.0.0",
+    "xo": "*"
+  }
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/decompress-response/readme.md b/advancedcontentfilter/vendor/npm-asset/decompress-response/readme.md
new file mode 100644 (file)
index 0000000..1b98767
--- /dev/null
@@ -0,0 +1,31 @@
+# decompress-response [![Build Status](https://travis-ci.org/sindresorhus/decompress-response.svg?branch=master)](https://travis-ci.org/sindresorhus/decompress-response)
+
+> Decompress a HTTP response if needed
+
+Decompresses the [response](https://nodejs.org/api/http.html#http_class_http_incomingmessage) from [`http.request`](https://nodejs.org/api/http.html#http_http_request_options_callback) if it's gzipped or deflated, otherwise just passes it through.
+
+Used by [`got`](https://github.com/sindresorhus/got).
+
+
+## Install
+
+```
+$ npm install decompress-response
+```
+
+
+## Usage
+
+```js
+const http = require('http');
+const decompressResponse = require('decompress-response');
+
+http.get('http://sindresorhus.com', response => {
+       response = decompressResponse(response);
+});
+```
+
+
+## License
+
+MIT © [Sindre Sorhus](https://sindresorhus.com)
diff --git a/advancedcontentfilter/vendor/npm-asset/duplexer3/LICENSE.md b/advancedcontentfilter/vendor/npm-asset/duplexer3/LICENSE.md
new file mode 100644 (file)
index 0000000..547189a
--- /dev/null
@@ -0,0 +1,26 @@
+Copyright (c) 2013, Deoxxa Development
+======================================
+All rights reserved.
+--------------------
+  
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:  
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.  
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.  
+3. Neither the name of Deoxxa Development nor the names of its contributors
+   may be used to endorse or promote products derived from this software
+   without specific prior written permission.  
+  
+THIS SOFTWARE IS PROVIDED BY DEOXXA DEVELOPMENT ''AS IS'' AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL DEOXXA DEVELOPMENT BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/advancedcontentfilter/vendor/npm-asset/duplexer3/README.md b/advancedcontentfilter/vendor/npm-asset/duplexer3/README.md
new file mode 100644 (file)
index 0000000..9f95ddf
--- /dev/null
@@ -0,0 +1,115 @@
+# duplexer3 [![Build Status](https://travis-ci.org/floatdrop/duplexer3.svg?branch=master)](https://travis-ci.org/floatdrop/duplexer3) [![Coverage Status](https://coveralls.io/repos/floatdrop/duplexer3/badge.svg?branch=master&service=github)](https://coveralls.io/github/floatdrop/duplexer3?branch=master)
+
+Like [duplexer2](https://github.com/deoxxa/duplexer2) but using Streams3 without readable-stream dependency
+
+```javascript
+var stream = require("stream");
+
+var duplexer3 = require("duplexer3");
+
+var writable = new stream.Writable({objectMode: true}),
+    readable = new stream.Readable({objectMode: true});
+
+writable._write = function _write(input, encoding, done) {
+  if (readable.push(input)) {
+    return done();
+  } else {
+    readable.once("drain", done);
+  }
+};
+
+readable._read = function _read(n) {
+  // no-op
+};
+
+// simulate the readable thing closing after a bit
+writable.once("finish", function() {
+  setTimeout(function() {
+    readable.push(null);
+  }, 500);
+});
+
+var duplex = duplexer3(writable, readable);
+
+duplex.on("data", function(e) {
+  console.log("got data", JSON.stringify(e));
+});
+
+duplex.on("finish", function() {
+  console.log("got finish event");
+});
+
+duplex.on("end", function() {
+  console.log("got end event");
+});
+
+duplex.write("oh, hi there", function() {
+  console.log("finished writing");
+});
+
+duplex.end(function() {
+  console.log("finished ending");
+});
+```
+
+```
+got data "oh, hi there"
+finished writing
+got finish event
+finished ending
+got end event
+```
+
+## Overview
+
+This is a reimplementation of [duplexer](https://www.npmjs.com/package/duplexer) using the
+Streams3 API which is standard in Node as of v4. Everything largely
+works the same.
+
+
+
+## Installation
+
+[Available via `npm`](https://docs.npmjs.com/cli/install):
+
+```
+$ npm i duplexer3
+```
+
+## API
+
+### duplexer3
+
+Creates a new `DuplexWrapper` object, which is the actual class that implements
+most of the fun stuff. All that fun stuff is hidden. DON'T LOOK.
+
+```javascript
+duplexer3([options], writable, readable)
+```
+
+```javascript
+const duplex = duplexer3(new stream.Writable(), new stream.Readable());
+```
+
+Arguments
+
+* __options__ - an object specifying the regular `stream.Duplex` options, as
+  well as the properties described below.
+* __writable__ - a writable stream
+* __readable__ - a readable stream
+
+Options
+
+* __bubbleErrors__ - a boolean value that specifies whether to bubble errors
+  from the underlying readable/writable streams. Default is `true`.
+
+
+## License
+
+3-clause BSD. [A copy](./LICENSE) is included with the source.
+
+## Contact
+
+* GitHub ([deoxxa](http://github.com/deoxxa))
+* Twitter ([@deoxxa](http://twitter.com/deoxxa))
+* Email ([deoxxa@fknsrs.biz](mailto:deoxxa@fknsrs.biz))
diff --git a/advancedcontentfilter/vendor/npm-asset/duplexer3/index.js b/advancedcontentfilter/vendor/npm-asset/duplexer3/index.js
new file mode 100644 (file)
index 0000000..1339ffc
--- /dev/null
@@ -0,0 +1,76 @@
+"use strict";
+
+var stream = require("stream");
+
+function DuplexWrapper(options, writable, readable) {
+  if (typeof readable === "undefined") {
+    readable = writable;
+    writable = options;
+    options = null;
+  }
+
+  stream.Duplex.call(this, options);
+
+  if (typeof readable.read !== "function") {
+    readable = (new stream.Readable(options)).wrap(readable);
+  }
+
+  this._writable = writable;
+  this._readable = readable;
+  this._waiting = false;
+
+  var self = this;
+
+  writable.once("finish", function() {
+    self.end();
+  });
+
+  this.once("finish", function() {
+    writable.end();
+  });
+
+  readable.on("readable", function() {
+    if (self._waiting) {
+      self._waiting = false;
+      self._read();
+    }
+  });
+
+  readable.once("end", function() {
+    self.push(null);
+  });
+
+  if (!options || typeof options.bubbleErrors === "undefined" || options.bubbleErrors) {
+    writable.on("error", function(err) {
+      self.emit("error", err);
+    });
+
+    readable.on("error", function(err) {
+      self.emit("error", err);
+    });
+  }
+}
+
+DuplexWrapper.prototype = Object.create(stream.Duplex.prototype, {constructor: {value: DuplexWrapper}});
+
+DuplexWrapper.prototype._write = function _write(input, encoding, done) {
+  this._writable.write(input, encoding, done);
+};
+
+DuplexWrapper.prototype._read = function _read() {
+  var buf;
+  var reads = 0;
+  while ((buf = this._readable.read()) !== null) {
+    this.push(buf);
+    reads++;
+  }
+  if (reads === 0) {
+    this._waiting = true;
+  }
+};
+
+module.exports = function duplex2(options, writable, readable) {
+  return new DuplexWrapper(options, writable, readable);
+};
+
+module.exports.DuplexWrapper = DuplexWrapper;
diff --git a/advancedcontentfilter/vendor/npm-asset/duplexer3/package.json b/advancedcontentfilter/vendor/npm-asset/duplexer3/package.json
new file mode 100644 (file)
index 0000000..251f78f
--- /dev/null
@@ -0,0 +1,28 @@
+{
+  "name": "duplexer3",
+  "version": "0.1.4",
+  "description": "Like duplexer but using streams3",
+  "engine": {
+      "node": ">=4"
+  },
+  "files": [
+    "index.js"
+  ],
+  "scripts": {
+    "test": "mocha -R tap"
+  },
+  "repository": "floatdrop/duplexer3",
+  "keywords": [
+    "duplex",
+    "duplexer",
+    "stream",
+    "stream3",
+    "join",
+    "combine"
+  ],
+  "author": "Conrad Pankoff <deoxxa@fknsrs.biz> (http://www.fknsrs.biz/)",
+  "license": "BSD-3-Clause",
+  "devDependencies": {
+    "mocha": "^2.2.5"
+  }
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/from2/.travis.yml b/advancedcontentfilter/vendor/npm-asset/from2/.travis.yml
new file mode 100644 (file)
index 0000000..b03ffab
--- /dev/null
@@ -0,0 +1,8 @@
+language: node_js
+before_install:
+  - npm install -g npm
+node_js:
+  - "0.8"
+  - "0.10"
+  - "0.12"
+  - "iojs"
diff --git a/advancedcontentfilter/vendor/npm-asset/from2/LICENSE.md b/advancedcontentfilter/vendor/npm-asset/from2/LICENSE.md
new file mode 100644 (file)
index 0000000..146cb32
--- /dev/null
@@ -0,0 +1,21 @@
+## The MIT License (MIT) ##
+
+Copyright (c) 2014 Hugh Kennedy
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/advancedcontentfilter/vendor/npm-asset/from2/README.md b/advancedcontentfilter/vendor/npm-asset/from2/README.md
new file mode 100644 (file)
index 0000000..3e041a4
--- /dev/null
@@ -0,0 +1,70 @@
+# from2 [![Flattr this!](https://api.flattr.com/button/flattr-badge-large.png)](https://flattr.com/submit/auto?user_id=hughskennedy&url=http://github.com/hughsk/from2&title=from2&description=hughsk/from2%20on%20GitHub&language=en_GB&tags=flattr,github,javascript&category=software)[![experimental](http://hughsk.github.io/stability-badges/dist/experimental.svg)](http://github.com/hughsk/stability-badges) #
+
+`from2` is a high-level module for creating readable streams that properly handle backpressure.
+
+Convience wrapper for
+[readable-stream](http://github.com/isaacs/readable-stream)'s `ReadableStream`
+base class, with an API lifted from
+[from](http://github.com/dominictarr/from) and
+[through2](http://github.com/rvagg/through2).
+
+## Usage ##
+
+[![from2](https://nodei.co/npm/from2.png?mini=true)](https://nodei.co/npm/from2)
+
+### `stream = from2([opts], read)` ###
+
+Where `opts` are the options to pass on to the `ReadableStream` constructor,
+and `read(size, next)` is called when data is requested from the stream.
+
+* `size` is the recommended amount of data (in bytes) to retrieve.
+* `next(err)` should be called when you're ready to emit more data.
+
+For example, here's a readable stream that emits the contents of a given
+string:
+
+``` javascript
+var from = require('from2')
+
+function fromString(string) {
+  return from(function(size, next) {
+    // if there's no more content
+    // left in the string, close the stream.
+    if (string.length <= 0) return next(null, null)
+
+    // Pull in a new chunk of text,
+    // removing it from the string.
+    var chunk = string.slice(0, size)
+    string = string.slice(size)
+
+    // Emit "chunk" from the stream.
+    next(null, chunk)
+  })
+}
+
+// pipe "hello world" out
+// to stdout.
+fromString('hello world').pipe(process.stdout)
+```
+
+### `stream = from2.obj([opts], read)` ###
+
+Shorthand for `from2({ objectMode: true }, read)`.
+
+### `createStream = from2.ctor([opts], read)` ###
+
+If you're creating similar streams in quick succession you can improve
+performance by generating a stream **constructor** that you can reuse instead
+of creating one-off streams on each call.
+
+Takes the same options as `from2`, instead returning a constructor which you
+can use to create new streams.
+
+### See Also
+
+- [from2-array](https://github.com/binocarlos/from2-array) - Create a from2 stream based on an array of source values.
+- [from2-string](https://github.com/yoshuawuyts/from2-string) - Create a stream from a string. Sugary wrapper around from2.
+
+## License ##
+
+MIT. See [LICENSE.md](http://github.com/hughsk/from2/blob/master/LICENSE.md) for details.
diff --git a/advancedcontentfilter/vendor/npm-asset/from2/index.js b/advancedcontentfilter/vendor/npm-asset/from2/index.js
new file mode 100644 (file)
index 0000000..cb200c6
--- /dev/null
@@ -0,0 +1,103 @@
+var Readable = require('readable-stream').Readable
+var inherits = require('inherits')
+
+module.exports = from2
+
+from2.ctor = ctor
+from2.obj = obj
+
+var Proto = ctor()
+
+function toFunction(list) {
+  list = list.slice()
+  return function (_, cb) {
+    var err = null
+    var item = list.length ? list.shift() : null
+    if (item instanceof Error) {
+      err = item
+      item = null
+    }
+
+    cb(err, item)
+  }
+}
+
+function from2(opts, read) {
+  if (typeof opts !== 'object' || Array.isArray(opts)) {
+    read = opts
+    opts = {}
+  }
+
+  var rs = new Proto(opts)
+  rs._from = Array.isArray(read) ? toFunction(read) : (read || noop)
+  return rs
+}
+
+function ctor(opts, read) {
+  if (typeof opts === 'function') {
+    read = opts
+    opts = {}
+  }
+
+  opts = defaults(opts)
+
+  inherits(Class, Readable)
+  function Class(override) {
+    if (!(this instanceof Class)) return new Class(override)
+    this._reading = false
+    this._callback = check
+    this.destroyed = false
+    Readable.call(this, override || opts)
+
+    var self = this
+    var hwm = this._readableState.highWaterMark
+
+    function check(err, data) {
+      if (self.destroyed) return
+      if (err) return self.destroy(err)
+      if (data === null) return self.push(null)
+      self._reading = false
+      if (self.push(data)) self._read(hwm)
+    }
+  }
+
+  Class.prototype._from = read || noop
+  Class.prototype._read = function(size) {
+    if (this._reading || this.destroyed) return
+    this._reading = true
+    this._from(size, this._callback)
+  }
+
+  Class.prototype.destroy = function(err) {
+    if (this.destroyed) return
+    this.destroyed = true
+
+    var self = this
+    process.nextTick(function() {
+      if (err) self.emit('error', err)
+      self.emit('close')
+    })
+  }
+
+  return Class
+}
+
+function obj(opts, read) {
+  if (typeof opts === 'function' || Array.isArray(opts)) {
+    read = opts
+    opts = {}
+  }
+
+  opts = defaults(opts)
+  opts.objectMode = true
+  opts.highWaterMark = 16
+
+  return from2(opts, read)
+}
+
+function noop () {}
+
+function defaults(opts) {
+  opts = opts || {}
+  return opts
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/from2/package.json b/advancedcontentfilter/vendor/npm-asset/from2/package.json
new file mode 100644 (file)
index 0000000..943b8a8
--- /dev/null
@@ -0,0 +1,37 @@
+{
+  "name": "from2",
+  "description": "Convenience wrapper for ReadableStream, with an API lifted from \"from\" and \"through2\"",
+  "version": "2.3.0",
+  "main": "index.js",
+  "scripts": {
+    "test": "node test"
+  },
+  "dependencies": {
+    "inherits": "^2.0.1",
+    "readable-stream": "^2.0.0"
+  },
+  "devDependencies": {
+    "tape": "^4.0.0"
+  },
+  "author": "Hugh Kennedy <hughskennedy@gmail.com> (http://hughsk.io/)",
+  "contributors": [
+    "Mathias Buus <mathiasbuus@gmail.com>"
+  ],
+  "license": "MIT",
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/hughsk/from2"
+  },
+  "bugs": {
+    "url": "https://github.com/hughsk/from2/issues"
+  },
+  "homepage": "https://github.com/hughsk/from2",
+  "keywords": [
+    "from",
+    "stream",
+    "readable",
+    "pull",
+    "convenience",
+    "wrapper"
+  ]
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/from2/test.js b/advancedcontentfilter/vendor/npm-asset/from2/test.js
new file mode 100644 (file)
index 0000000..b11bd6c
--- /dev/null
@@ -0,0 +1,123 @@
+var test = require('tape')
+var path = require('path')
+var from = require('./')
+var fs   = require('fs')
+
+var tmp = path.resolve(
+  __dirname, 'tmp.txt'
+)
+
+function fromString(string) {
+  return from(function(size, next) {
+    if (string.length <= 0) return next(null, null)
+    var chunk = string.slice(0, size)
+    string = string.slice(size)
+    next(null, chunk)
+  })
+}
+
+test('from2', function(t) {
+  var contents = fs.readFileSync(__filename, 'utf8')
+  var stream = fromString(contents)
+
+  stream
+    .pipe(fs.createWriteStream(tmp))
+    .on('close', function() {
+      t.equal(fs.readFileSync(tmp, 'utf8'), contents)
+      fs.unlinkSync(tmp)
+      t.end()
+    })
+})
+
+test('old mode', function(t) {
+  var contents = fs.readFileSync(__filename, 'utf8')
+  var stream = fromString(contents)
+  var buffer = ''
+
+  stream.on('data', function(data) {
+    buffer += data
+  }).on('end', function() {
+    t.equal(buffer, contents)
+    t.end()
+  })
+})
+
+test('destroy', function(t) {
+  var stream = from(function(size, next) {
+    process.nextTick(function() {
+      next(null, 'no')
+    })
+  })
+
+  stream.on('data', function(data) {
+    t.ok(false)
+  }).on('close', function() {
+    t.ok(true)
+    t.end()
+  })
+
+  stream.destroy()
+})
+
+test('arrays', function (t) {
+  var input = ['a', 'b', 'c']
+  var stream = from(input)
+  var output = []
+  stream.on('data', function (letter) {
+    output.push(letter.toString())
+  })
+  stream.on('end', function () {
+    t.deepEqual(input, output)
+    t.end()
+  })
+})
+
+test('obj arrays', function (t) {
+  var input = [{foo:'a'}, {foo:'b'}, {foo:'c'}]
+  var stream = from.obj(input)
+  var output = []
+  stream.on('data', function (letter) {
+    output.push(letter)
+  })
+  stream.on('end', function () {
+    t.deepEqual(input, output)
+    t.end()
+  })
+})
+
+
+test('arrays can emit errors', function (t) {
+  var input = ['a', 'b', new Error('ooops'), 'c']
+  var stream = from(input)
+  var output = []
+  stream.on('data', function (letter) {
+    output.push(letter.toString())
+  })
+  stream.on('error', function(e){
+    t.deepEqual(['a', 'b'], output)
+    t.equal('ooops', e.message)
+    t.end()
+  })  
+  stream.on('end', function () {
+    t.fail('the stream should have errored')
+  })
+})
+
+test('obj arrays can emit errors', function (t) {
+  var input = [{foo:'a'}, {foo:'b'}, new Error('ooops'), {foo:'c'}]
+  var stream = from.obj(input)
+  var output = []
+  stream.on('data', function (letter) {
+    output.push(letter)
+  })
+  stream.on('error', function(e){
+    t.deepEqual([{foo:'a'}, {foo:'b'}], output)
+    t.equal('ooops', e.message)
+    t.end()
+  })
+  stream.on('end', function () {
+    t.fail('the stream should have errored')
+  })
+})
+
+
diff --git a/advancedcontentfilter/vendor/npm-asset/get-stream/buffer-stream.js b/advancedcontentfilter/vendor/npm-asset/get-stream/buffer-stream.js
new file mode 100644 (file)
index 0000000..ae45d3d
--- /dev/null
@@ -0,0 +1,51 @@
+'use strict';
+const PassThrough = require('stream').PassThrough;
+
+module.exports = opts => {
+       opts = Object.assign({}, opts);
+
+       const array = opts.array;
+       let encoding = opts.encoding;
+       const buffer = encoding === 'buffer';
+       let objectMode = false;
+
+       if (array) {
+               objectMode = !(encoding || buffer);
+       } else {
+               encoding = encoding || 'utf8';
+       }
+
+       if (buffer) {
+               encoding = null;
+       }
+
+       let len = 0;
+       const ret = [];
+       const stream = new PassThrough({objectMode});
+
+       if (encoding) {
+               stream.setEncoding(encoding);
+       }
+
+       stream.on('data', chunk => {
+               ret.push(chunk);
+
+               if (objectMode) {
+                       len = ret.length;
+               } else {
+                       len += chunk.length;
+               }
+       });
+
+       stream.getBufferedValue = () => {
+               if (array) {
+                       return ret;
+               }
+
+               return buffer ? Buffer.concat(ret, len) : ret.join('');
+       };
+
+       stream.getBufferedLength = () => len;
+
+       return stream;
+};
diff --git a/advancedcontentfilter/vendor/npm-asset/get-stream/index.js b/advancedcontentfilter/vendor/npm-asset/get-stream/index.js
new file mode 100644 (file)
index 0000000..2dc5ee9
--- /dev/null
@@ -0,0 +1,51 @@
+'use strict';
+const bufferStream = require('./buffer-stream');
+
+function getStream(inputStream, opts) {
+       if (!inputStream) {
+               return Promise.reject(new Error('Expected a stream'));
+       }
+
+       opts = Object.assign({maxBuffer: Infinity}, opts);
+
+       const maxBuffer = opts.maxBuffer;
+       let stream;
+       let clean;
+
+       const p = new Promise((resolve, reject) => {
+               const error = err => {
+                       if (err) { // null check
+                               err.bufferedData = stream.getBufferedValue();
+                       }
+
+                       reject(err);
+               };
+
+               stream = bufferStream(opts);
+               inputStream.once('error', error);
+               inputStream.pipe(stream);
+
+               stream.on('data', () => {
+                       if (stream.getBufferedLength() > maxBuffer) {
+                               reject(new Error('maxBuffer exceeded'));
+                       }
+               });
+               stream.once('error', error);
+               stream.on('end', resolve);
+
+               clean = () => {
+                       // some streams doesn't implement the `stream.Readable` interface correctly
+                       if (inputStream.unpipe) {
+                               inputStream.unpipe(stream);
+                       }
+               };
+       });
+
+       p.then(clean, clean);
+
+       return p.then(() => stream.getBufferedValue());
+}
+
+module.exports = getStream;
+module.exports.buffer = (stream, opts) => getStream(stream, Object.assign({}, opts, {encoding: 'buffer'}));
+module.exports.array = (stream, opts) => getStream(stream, Object.assign({}, opts, {array: true}));
diff --git a/advancedcontentfilter/vendor/npm-asset/get-stream/license b/advancedcontentfilter/vendor/npm-asset/get-stream/license
new file mode 100644 (file)
index 0000000..654d0bf
--- /dev/null
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/advancedcontentfilter/vendor/npm-asset/get-stream/package.json b/advancedcontentfilter/vendor/npm-asset/get-stream/package.json
new file mode 100644 (file)
index 0000000..2f2adf0
--- /dev/null
@@ -0,0 +1,48 @@
+{
+  "name": "get-stream",
+  "version": "3.0.0",
+  "description": "Get a stream as a string, buffer, or array",
+  "license": "MIT",
+  "repository": "sindresorhus/get-stream",
+  "author": {
+    "name": "Sindre Sorhus",
+    "email": "sindresorhus@gmail.com",
+    "url": "sindresorhus.com"
+  },
+  "engines": {
+    "node": ">=4"
+  },
+  "scripts": {
+    "test": "xo && ava"
+  },
+  "files": [
+    "index.js",
+    "buffer-stream.js"
+  ],
+  "keywords": [
+    "get",
+    "stream",
+    "promise",
+    "concat",
+    "string",
+    "str",
+    "text",
+    "buffer",
+    "read",
+    "data",
+    "consume",
+    "readable",
+    "readablestream",
+    "array",
+    "object",
+    "obj"
+  ],
+  "devDependencies": {
+    "ava": "*",
+    "into-stream": "^3.0.0",
+    "xo": "*"
+  },
+  "xo": {
+    "esnext": true
+  }
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/get-stream/readme.md b/advancedcontentfilter/vendor/npm-asset/get-stream/readme.md
new file mode 100644 (file)
index 0000000..73b188f
--- /dev/null
@@ -0,0 +1,117 @@
+# get-stream [![Build Status](https://travis-ci.org/sindresorhus/get-stream.svg?branch=master)](https://travis-ci.org/sindresorhus/get-stream)
+
+> Get a stream as a string, buffer, or array
+
+
+## Install
+
+```
+$ npm install --save get-stream
+```
+
+
+## Usage
+
+```js
+const fs = require('fs');
+const getStream = require('get-stream');
+const stream = fs.createReadStream('unicorn.txt');
+
+getStream(stream).then(str => {
+       console.log(str);
+       /*
+                     ,,))))))));,
+                  __)))))))))))))),
+       \|/       -\(((((''''((((((((.
+       -*-==//////((''  .     `)))))),
+       /|\      ))| o    ;-.    '(((((                                  ,(,
+                ( `|    /  )    ;))))'                               ,_))^;(~
+                   |   |   |   ,))((((_     _____------~~~-.        %,;(;(>';'~
+                   o_);   ;    )))(((` ~---~  `::           \      %%~~)(v;(`('~
+                         ;    ''''````         `:       `:::|\,__,%%    );`'; ~
+                        |   _                )     /      `:|`----'     `-'
+                  ______/\/~    |                 /        /
+                /~;;.____/;;'  /          ___--,-(   `;;;/
+               / //  _;______;'------~~~~~    /;;/\    /
+              //  | |                        / ;   \;;,\
+             (<_  | ;                      /',/-----'  _>
+              \_| ||_                     //~;~~~~~~~~~
+                  `\_|                   (,~~
+                                          \~\
+                                           ~~
+       */
+});
+```
+
+
+## API
+
+The methods returns a promise that resolves when the `end` event fires on the stream, indicating that there is no more data to be read. The stream is switched to flowing mode.
+
+### getStream(stream, [options])
+
+Get the `stream` as a string.
+
+#### options
+
+##### encoding
+
+Type: `string`<br>
+Default: `utf8`
+
+[Encoding](https://nodejs.org/api/buffer.html#buffer_buffer) of the incoming stream.
+
+##### maxBuffer
+
+Type: `number`<br>
+Default: `Infinity`
+
+Maximum length of the returned string. If it exceeds this value before the stream ends, the promise will be rejected.
+
+### getStream.buffer(stream, [options])
+
+Get the `stream` as a buffer.
+
+It honors the `maxBuffer` option as above, but it refers to byte length rather than string length.
+
+### getStream.array(stream, [options])
+
+Get the `stream` as an array of values.
+
+It honors both the `maxBuffer` and `encoding` options. The behavior changes slightly based on the encoding chosen:
+
+- When `encoding` is unset, it assumes an [object mode stream](https://nodesource.com/blog/understanding-object-streams/) and collects values emitted from `stream` unmodified. In this case `maxBuffer` refers to the number of items in the array (not the sum of their sizes).
+
+- When `encoding` is set to `buffer`, it collects an array of buffers. `maxBuffer` refers to the summed byte lengths of every buffer in the array.
+
+- When `encoding` is set to anything else, it collects an array of strings. `maxBuffer` refers to the summed character lengths of every string in the array.
+
+
+## Errors
+
+If the input stream emits an `error` event, the promise will be rejected with the error. The buffered data will be attached to the `bufferedData` property of the error.
+
+```js
+getStream(streamThatErrorsAtTheEnd('unicorn'))
+       .catch(err => {
+               console.log(err.bufferedData);
+               //=> 'unicorn'
+       });
+```
+
+
+## FAQ
+
+### How is this different from [`concat-stream`](https://github.com/maxogden/concat-stream)?
+
+This module accepts a stream instead of being one and returns a promise instead of using a callback. The API is simpler and it only supports returning a string, buffer, or array. It doesn't have a fragile type inference. You explicitly choose what you want. And it doesn't depend on the huge `readable-stream` package.
+
+
+## Related
+
+- [get-stdin](https://github.com/sindresorhus/get-stdin) - Get stdin as a string or buffer
+
+
+## License
+
+MIT © [Sindre Sorhus](https://sindresorhus.com)
diff --git a/advancedcontentfilter/vendor/npm-asset/got/errors.js b/advancedcontentfilter/vendor/npm-asset/got/errors.js
new file mode 100644 (file)
index 0000000..ad83388
--- /dev/null
@@ -0,0 +1,92 @@
+'use strict';
+const urlLib = require('url');
+const http = require('http');
+const PCancelable = require('p-cancelable');
+const is = require('@sindresorhus/is');
+
+class GotError extends Error {
+       constructor(message, error, opts) {
+               super(message);
+               Error.captureStackTrace(this, this.constructor);
+               this.name = 'GotError';
+
+               if (!is.undefined(error.code)) {
+                       this.code = error.code;
+               }
+
+               Object.assign(this, {
+                       host: opts.host,
+                       hostname: opts.hostname,
+                       method: opts.method,
+                       path: opts.path,
+                       protocol: opts.protocol,
+                       url: opts.href
+               });
+       }
+}
+
+module.exports.GotError = GotError;
+
+module.exports.CacheError = class extends GotError {
+       constructor(error, opts) {
+               super(error.message, error, opts);
+               this.name = 'CacheError';
+       }
+};
+
+module.exports.RequestError = class extends GotError {
+       constructor(error, opts) {
+               super(error.message, error, opts);
+               this.name = 'RequestError';
+       }
+};
+
+module.exports.ReadError = class extends GotError {
+       constructor(error, opts) {
+               super(error.message, error, opts);
+               this.name = 'ReadError';
+       }
+};
+
+module.exports.ParseError = class extends GotError {
+       constructor(error, statusCode, opts, data) {
+               super(`${error.message} in "${urlLib.format(opts)}": \n${data.slice(0, 77)}...`, error, opts);
+               this.name = 'ParseError';
+               this.statusCode = statusCode;
+               this.statusMessage = http.STATUS_CODES[this.statusCode];
+       }
+};
+
+module.exports.HTTPError = class extends GotError {
+       constructor(statusCode, statusMessage, headers, opts) {
+               if (statusMessage) {
+                       statusMessage = statusMessage.replace(/\r?\n/g, ' ').trim();
+               } else {
+                       statusMessage = http.STATUS_CODES[statusCode];
+               }
+               super(`Response code ${statusCode} (${statusMessage})`, {}, opts);
+               this.name = 'HTTPError';
+               this.statusCode = statusCode;
+               this.statusMessage = statusMessage;
+               this.headers = headers;
+       }
+};
+
+module.exports.MaxRedirectsError = class extends GotError {
+       constructor(statusCode, redirectUrls, opts) {
+               super('Redirected 10 times. Aborting.', {}, opts);
+               this.name = 'MaxRedirectsError';
+               this.statusCode = statusCode;
+               this.statusMessage = http.STATUS_CODES[this.statusCode];
+               this.redirectUrls = redirectUrls;
+       }
+};
+
+module.exports.UnsupportedProtocolError = class extends GotError {
+       constructor(opts) {
+               super(`Unsupported protocol "${opts.protocol}"`, {}, opts);
+               this.name = 'UnsupportedProtocolError';
+       }
+};
+
+module.exports.CancelError = PCancelable.CancelError;
diff --git a/advancedcontentfilter/vendor/npm-asset/got/index.js b/advancedcontentfilter/vendor/npm-asset/got/index.js
new file mode 100644 (file)
index 0000000..2ca8862
--- /dev/null
@@ -0,0 +1,661 @@
+'use strict';
+const EventEmitter = require('events');
+const http = require('http');
+const https = require('https');
+const PassThrough = require('stream').PassThrough;
+const Transform = require('stream').Transform;
+const urlLib = require('url');
+const fs = require('fs');
+const querystring = require('querystring');
+const CacheableRequest = require('cacheable-request');
+const duplexer3 = require('duplexer3');
+const intoStream = require('into-stream');
+const is = require('@sindresorhus/is');
+const getStream = require('get-stream');
+const timedOut = require('timed-out');
+const urlParseLax = require('url-parse-lax');
+const urlToOptions = require('url-to-options');
+const lowercaseKeys = require('lowercase-keys');
+const decompressResponse = require('decompress-response');
+const mimicResponse = require('mimic-response');
+const isRetryAllowed = require('is-retry-allowed');
+const isURL = require('isurl');
+const PCancelable = require('p-cancelable');
+const pTimeout = require('p-timeout');
+const pify = require('pify');
+const Buffer = require('safe-buffer').Buffer;
+const pkg = require('./package.json');
+const errors = require('./errors');
+
+const getMethodRedirectCodes = new Set([300, 301, 302, 303, 304, 305, 307, 308]);
+const allMethodRedirectCodes = new Set([300, 303, 307, 308]);
+
+const isFormData = body => is.nodeStream(body) && is.function(body.getBoundary);
+
+const getBodySize = opts => {
+       const body = opts.body;
+
+       if (opts.headers['content-length']) {
+               return Number(opts.headers['content-length']);
+       }
+
+       if (!body && !opts.stream) {
+               return 0;
+       }
+
+       if (is.string(body)) {
+               return Buffer.byteLength(body);
+       }
+
+       if (isFormData(body)) {
+               return pify(body.getLength.bind(body))();
+       }
+
+       if (body instanceof fs.ReadStream) {
+               return pify(fs.stat)(body.path).then(stat => stat.size);
+       }
+
+       if (is.nodeStream(body) && is.buffer(body._buffer)) {
+               return body._buffer.length;
+       }
+
+       return null;
+};
+
+function requestAsEventEmitter(opts) {
+       opts = opts || {};
+
+       const ee = new EventEmitter();
+       const requestUrl = opts.href || urlLib.resolve(urlLib.format(opts), opts.path);
+       const redirects = [];
+       const agents = is.object(opts.agent) ? opts.agent : null;
+       let retryCount = 0;
+       let redirectUrl;
+       let uploadBodySize;
+       let uploaded = 0;
+
+       const get = opts => {
+               if (opts.protocol !== 'http:' && opts.protocol !== 'https:') {
+                       ee.emit('error', new got.UnsupportedProtocolError(opts));
+                       return;
+               }
+
+               let fn = opts.protocol === 'https:' ? https : http;
+
+               if (agents) {
+                       const protocolName = opts.protocol === 'https:' ? 'https' : 'http';
+                       opts.agent = agents[protocolName] || opts.agent;
+               }
+
+               if (opts.useElectronNet && process.versions.electron) {
+                       const electron = require('electron');
+                       fn = electron.net || electron.remote.net;
+               }
+
+               let progressInterval;
+
+               const cacheableRequest = new CacheableRequest(fn.request, opts.cache);
+               const cacheReq = cacheableRequest(opts, res => {
+                       clearInterval(progressInterval);
+
+                       ee.emit('uploadProgress', {
+                               percent: 1,
+                               transferred: uploaded,
+                               total: uploadBodySize
+                       });
+
+                       const statusCode = res.statusCode;
+
+                       res.url = redirectUrl || requestUrl;
+                       res.requestUrl = requestUrl;
+
+                       const followRedirect = opts.followRedirect && 'location' in res.headers;
+                       const redirectGet = followRedirect && getMethodRedirectCodes.has(statusCode);
+                       const redirectAll = followRedirect && allMethodRedirectCodes.has(statusCode);
+
+                       if (redirectAll || (redirectGet && (opts.method === 'GET' || opts.method === 'HEAD'))) {
+                               res.resume();
+
+                               if (statusCode === 303) {
+                                       // Server responded with "see other", indicating that the resource exists at another location,
+                                       // and the client should request it from that location via GET or HEAD.
+                                       opts.method = 'GET';
+                               }
+
+                               if (redirects.length >= 10) {
+                                       ee.emit('error', new got.MaxRedirectsError(statusCode, redirects, opts), null, res);
+                                       return;
+                               }
+
+                               const bufferString = Buffer.from(res.headers.location, 'binary').toString();
+
+                               redirectUrl = urlLib.resolve(urlLib.format(opts), bufferString);
+
+                               redirects.push(redirectUrl);
+
+                               const redirectOpts = Object.assign({}, opts, urlLib.parse(redirectUrl));
+
+                               ee.emit('redirect', res, redirectOpts);
+
+                               get(redirectOpts);
+
+                               return;
+                       }
+
+                       setImmediate(() => {
+                               try {
+                                       getResponse(res, opts, ee, redirects);
+                               } catch (e) {
+                                       ee.emit('error', e);
+                               }
+                       });
+               });
+
+               cacheReq.on('error', err => {
+                       if (err instanceof CacheableRequest.RequestError) {
+                               ee.emit('error', new got.RequestError(err, opts));
+                       } else {
+                               ee.emit('error', new got.CacheError(err, opts));
+                       }
+               });
+
+               cacheReq.once('request', req => {
+                       let aborted = false;
+                       req.once('abort', _ => {
+                               aborted = true;
+                       });
+
+                       req.once('error', err => {
+                               clearInterval(progressInterval);
+
+                               if (aborted) {
+                                       return;
+                               }
+
+                               const backoff = opts.retries(++retryCount, err);
+
+                               if (backoff) {
+                                       setTimeout(get, backoff, opts);
+                                       return;
+                               }
+
+                               ee.emit('error', new got.RequestError(err, opts));
+                       });
+
+                       ee.once('request', req => {
+                               ee.emit('uploadProgress', {
+                                       percent: 0,
+                                       transferred: 0,
+                                       total: uploadBodySize
+                               });
+
+                               const socket = req.connection;
+                               if (socket) {
+                                       // `._connecting` was the old property which was made public in node v6.1.0
+                                       const isConnecting = socket.connecting === undefined ? socket._connecting : socket.connecting;
+
+                                       const onSocketConnect = () => {
+                                               const uploadEventFrequency = 150;
+
+                                               progressInterval = setInterval(() => {
+                                                       const lastUploaded = uploaded;
+                                                       const headersSize = Buffer.byteLength(req._header);
+                                                       uploaded = socket.bytesWritten - headersSize;
+
+                                                       // Prevent the known issue of `bytesWritten` being larger than body size
+                                                       if (uploadBodySize && uploaded > uploadBodySize) {
+                                                               uploaded = uploadBodySize;
+                                                       }
+
+                                                       // Don't emit events with unchanged progress and
+                                                       // prevent last event from being emitted, because
+                                                       // it's emitted when `response` is emitted
+                                                       if (uploaded === lastUploaded || uploaded === uploadBodySize) {
+                                                               return;
+                                                       }
+
+                                                       ee.emit('uploadProgress', {
+                                                               percent: uploadBodySize ? uploaded / uploadBodySize : 0,
+                                                               transferred: uploaded,
+                                                               total: uploadBodySize
+                                                       });
+                                               }, uploadEventFrequency);
+                                       };
+
+                                       // Only subscribe to 'connect' event if we're actually connecting a new
+                                       // socket, otherwise if we're already connected (because this is a
+                                       // keep-alive connection) do not bother. This is important since we won't
+                                       // get a 'connect' event for an already connected socket.
+                                       if (isConnecting) {
+                                               socket.once('connect', onSocketConnect);
+                                       } else {
+                                               onSocketConnect();
+                                       }
+                               }
+                       });
+
+                       if (opts.gotTimeout) {
+                               clearInterval(progressInterval);
+                               timedOut(req, opts.gotTimeout);
+                       }
+
+                       setImmediate(() => {
+                               ee.emit('request', req);
+                       });
+               });
+       };
+
+       setImmediate(() => {
+               Promise.resolve(getBodySize(opts))
+                       .then(size => {
+                               uploadBodySize = size;
+                               get(opts);
+                       })
+                       .catch(err => {
+                               ee.emit('error', err);
+                       });
+       });
+
+       return ee;
+}
+
+function getResponse(res, opts, ee, redirects) {
+       const downloadBodySize = Number(res.headers['content-length']) || null;
+       let downloaded = 0;
+
+       const progressStream = new Transform({
+               transform(chunk, encoding, callback) {
+                       downloaded += chunk.length;
+
+                       const percent = downloadBodySize ? downloaded / downloadBodySize : 0;
+
+                       // Let flush() be responsible for emitting the last event
+                       if (percent < 1) {
+                               ee.emit('downloadProgress', {
+                                       percent,
+                                       transferred: downloaded,
+                                       total: downloadBodySize
+                               });
+                       }
+
+                       callback(null, chunk);
+               },
+
+               flush(callback) {
+                       ee.emit('downloadProgress', {
+                               percent: 1,
+                               transferred: downloaded,
+                               total: downloadBodySize
+                       });
+
+                       callback();
+               }
+       });
+
+       mimicResponse(res, progressStream);
+       progressStream.redirectUrls = redirects;
+
+       const response = opts.decompress === true &&
+               is.function(decompressResponse) &&
+               opts.method !== 'HEAD' ? decompressResponse(progressStream) : progressStream;
+
+       if (!opts.decompress && ['gzip', 'deflate'].indexOf(res.headers['content-encoding']) !== -1) {
+               opts.encoding = null;
+       }
+
+       ee.emit('response', response);
+
+       ee.emit('downloadProgress', {
+               percent: 0,
+               transferred: 0,
+               total: downloadBodySize
+       });
+
+       res.pipe(progressStream);
+}
+
+function asPromise(opts) {
+       const timeoutFn = requestPromise => opts.gotTimeout && opts.gotTimeout.request ?
+               pTimeout(requestPromise, opts.gotTimeout.request, new got.RequestError({message: 'Request timed out', code: 'ETIMEDOUT'}, opts)) :
+               requestPromise;
+
+       const proxy = new EventEmitter();
+
+       const cancelable = new PCancelable((resolve, reject, onCancel) => {
+               const ee = requestAsEventEmitter(opts);
+               let cancelOnRequest = false;
+
+               onCancel(() => {
+                       cancelOnRequest = true;
+               });
+
+               ee.on('request', req => {
+                       if (cancelOnRequest) {
+                               req.abort();
+                       }
+
+                       onCancel(() => {
+                               req.abort();
+                       });
+
+                       if (is.nodeStream(opts.body)) {
+                               opts.body.pipe(req);
+                               opts.body = undefined;
+                               return;
+                       }
+
+                       req.end(opts.body);
+               });
+
+               ee.on('response', res => {
+                       const stream = is.null(opts.encoding) ? getStream.buffer(res) : getStream(res, opts);
+
+                       stream
+                               .catch(err => reject(new got.ReadError(err, opts)))
+                               .then(data => {
+                                       const statusCode = res.statusCode;
+                                       const limitStatusCode = opts.followRedirect ? 299 : 399;
+
+                                       res.body = data;
+
+                                       if (opts.json && res.body) {
+                                               try {
+                                                       res.body = JSON.parse(res.body);
+                                               } catch (err) {
+                                                       if (statusCode >= 200 && statusCode < 300) {
+                                                               throw new got.ParseError(err, statusCode, opts, data);
+                                                       }
+                                               }
+                                       }
+
+                                       if (opts.throwHttpErrors && statusCode !== 304 && (statusCode < 200 || statusCode > limitStatusCode)) {
+                                               throw new got.HTTPError(statusCode, res.statusMessage, res.headers, opts);
+                                       }
+
+                                       resolve(res);
+                               })
+                               .catch(err => {
+                                       Object.defineProperty(err, 'response', {value: res});
+                                       reject(err);
+                               });
+               });
+
+               ee.once('error', reject);
+               ee.on('redirect', proxy.emit.bind(proxy, 'redirect'));
+               ee.on('uploadProgress', proxy.emit.bind(proxy, 'uploadProgress'));
+               ee.on('downloadProgress', proxy.emit.bind(proxy, 'downloadProgress'));
+       });
+
+       // Preserve backwards-compatibility
+       // TODO: Remove this in the next major version
+       Object.defineProperty(cancelable, 'canceled', {
+               get() {
+                       return cancelable.isCanceled;
+               }
+       });
+
+       const promise = timeoutFn(cancelable);
+
+       promise.cancel = cancelable.cancel.bind(cancelable);
+
+       promise.on = (name, fn) => {
+               proxy.on(name, fn);
+               return promise;
+       };
+
+       return promise;
+}
+
+function asStream(opts) {
+       opts.stream = true;
+
+       const input = new PassThrough();
+       const output = new PassThrough();
+       const proxy = duplexer3(input, output);
+       let timeout;
+
+       if (opts.gotTimeout && opts.gotTimeout.request) {
+               timeout = setTimeout(() => {
+                       proxy.emit('error', new got.RequestError({message: 'Request timed out', code: 'ETIMEDOUT'}, opts));
+               }, opts.gotTimeout.request);
+       }
+
+       if (opts.json) {
+               throw new Error('Got can not be used as a stream when the `json` option is used');
+       }
+
+       if (opts.body) {
+               proxy.write = () => {
+                       throw new Error('Got\'s stream is not writable when the `body` option is used');
+               };
+       }
+
+       const ee = requestAsEventEmitter(opts);
+
+       ee.on('request', req => {
+               proxy.emit('request', req);
+
+               if (is.nodeStream(opts.body)) {
+                       opts.body.pipe(req);
+                       return;
+               }
+
+               if (opts.body) {
+                       req.end(opts.body);
+                       return;
+               }
+
+               if (opts.method === 'POST' || opts.method === 'PUT' || opts.method === 'PATCH') {
+                       input.pipe(req);
+                       return;
+               }
+
+               req.end();
+       });
+
+       ee.on('response', res => {
+               clearTimeout(timeout);
+
+               const statusCode = res.statusCode;
+
+               res.on('error', err => {
+                       proxy.emit('error', new got.ReadError(err, opts));
+               });
+
+               res.pipe(output);
+
+               if (opts.throwHttpErrors && statusCode !== 304 && (statusCode < 200 || statusCode > 299)) {
+                       proxy.emit('error', new got.HTTPError(statusCode, res.statusMessage, res.headers, opts), null, res);
+                       return;
+               }
+
+               proxy.emit('response', res);
+       });
+
+       ee.on('error', proxy.emit.bind(proxy, 'error'));
+       ee.on('redirect', proxy.emit.bind(proxy, 'redirect'));
+       ee.on('uploadProgress', proxy.emit.bind(proxy, 'uploadProgress'));
+       ee.on('downloadProgress', proxy.emit.bind(proxy, 'downloadProgress'));
+
+       return proxy;
+}
+
+function normalizeArguments(url, opts) {
+       if (!is.string(url) && !is.object(url)) {
+               throw new TypeError(`Parameter \`url\` must be a string or object, not ${is(url)}`);
+       } else if (is.string(url)) {
+               url = url.replace(/^unix:/, 'http://$&');
+
+               try {
+                       decodeURI(url);
+               } catch (err) {
+                       throw new Error('Parameter `url` must contain valid UTF-8 character sequences');
+               }
+
+               url = urlParseLax(url);
+               if (url.auth) {
+                       throw new Error('Basic authentication must be done with the `auth` option');
+               }
+       } else if (isURL.lenient(url)) {
+               url = urlToOptions(url);
+       }
+
+       opts = Object.assign(
+               {
+                       path: '',
+                       retries: 2,
+                       cache: false,
+                       decompress: true,
+                       useElectronNet: false,
+                       throwHttpErrors: true
+               },
+               url,
+               {
+                       protocol: url.protocol || 'http:' // Override both null/undefined with default protocol
+               },
+               opts
+       );
+
+       const headers = lowercaseKeys(opts.headers);
+       for (const key of Object.keys(headers)) {
+               if (is.nullOrUndefined(headers[key])) {
+                       delete headers[key];
+               }
+       }
+
+       opts.headers = Object.assign({
+               'user-agent': `${pkg.name}/${pkg.version} (https://github.com/sindresorhus/got)`
+       }, headers);
+
+       if (opts.decompress) {
+               opts.headers['accept-encoding'] = 'gzip,deflate';
+       }
+
+       const query = opts.query;
+
+       if (query) {
+               if (!is.string(query)) {
+                       opts.query = querystring.stringify(query);
+               }
+
+               opts.path = `${opts.path.split('?')[0]}?${opts.query}`;
+               delete opts.query;
+       }
+
+       if (opts.json && is.undefined(opts.headers.accept)) {
+               opts.headers.accept = 'application/json';
+       }
+
+       const body = opts.body;
+       if (is.nullOrUndefined(body)) {
+               opts.method = (opts.method || 'GET').toUpperCase();
+       } else {
+               const headers = opts.headers;
+               if (!is.nodeStream(body) && !is.string(body) && !is.buffer(body) && !(opts.form || opts.json)) {
+                       throw new TypeError('The `body` option must be a stream.Readable, string, Buffer or plain Object');
+               }
+
+               const canBodyBeStringified = is.plainObject(body) || is.array(body);
+               if ((opts.form || opts.json) && !canBodyBeStringified) {
+                       throw new TypeError('The `body` option must be a plain Object or Array when the `form` or `json` option is used');
+               }
+
+               if (isFormData(body)) {
+                       // Special case for https://github.com/form-data/form-data
+                       headers['content-type'] = headers['content-type'] || `multipart/form-data; boundary=${body.getBoundary()}`;
+               } else if (opts.form && canBodyBeStringified) {
+                       headers['content-type'] = headers['content-type'] || 'application/x-www-form-urlencoded';
+                       opts.body = querystring.stringify(body);
+               } else if (opts.json && canBodyBeStringified) {
+                       headers['content-type'] = headers['content-type'] || 'application/json';
+                       opts.body = JSON.stringify(body);
+               }
+
+               if (is.undefined(headers['content-length']) && is.undefined(headers['transfer-encoding']) && !is.nodeStream(body)) {
+                       const length = is.string(opts.body) ? Buffer.byteLength(opts.body) : opts.body.length;
+                       headers['content-length'] = length;
+               }
+
+               // Convert buffer to stream to receive upload progress events
+               // see https://github.com/sindresorhus/got/pull/322
+               if (is.buffer(body)) {
+                       opts.body = intoStream(body);
+                       opts.body._buffer = body;
+               }
+
+               opts.method = (opts.method || 'POST').toUpperCase();
+       }
+
+       if (opts.hostname === 'unix') {
+               const matches = /(.+?):(.+)/.exec(opts.path);
+
+               if (matches) {
+                       opts.socketPath = matches[1];
+                       opts.path = matches[2];
+                       opts.host = null;
+               }
+       }
+
+       if (!is.function(opts.retries)) {
+               const retries = opts.retries;
+
+               opts.retries = (iter, err) => {
+                       if (iter > retries || !isRetryAllowed(err)) {
+                               return 0;
+                       }
+
+                       const noise = Math.random() * 100;
+
+                       return ((1 << iter) * 1000) + noise;
+               };
+       }
+
+       if (is.undefined(opts.followRedirect)) {
+               opts.followRedirect = true;
+       }
+
+       if (opts.timeout) {
+               if (is.number(opts.timeout)) {
+                       opts.gotTimeout = {request: opts.timeout};
+               } else {
+                       opts.gotTimeout = opts.timeout;
+               }
+               delete opts.timeout;
+       }
+
+       return opts;
+}
+
+function got(url, opts) {
+       try {
+               const normalizedArgs = normalizeArguments(url, opts);
+
+               if (normalizedArgs.stream) {
+                       return asStream(normalizedArgs);
+               }
+
+               return asPromise(normalizedArgs);
+       } catch (err) {
+               return Promise.reject(err);
+       }
+}
+
+got.stream = (url, opts) => asStream(normalizeArguments(url, opts));
+
+const methods = [
+       'get',
+       'post',
+       'put',
+       'patch',
+       'head',
+       'delete'
+];
+
+for (const method of methods) {
+       got[method] = (url, opts) => got(url, Object.assign({}, opts, {method}));
+       got.stream[method] = (url, opts) => got.stream(url, Object.assign({}, opts, {method}));
+}
+
+Object.assign(got, errors);
+
+module.exports = got;
diff --git a/advancedcontentfilter/vendor/npm-asset/got/license b/advancedcontentfilter/vendor/npm-asset/got/license
new file mode 100644 (file)
index 0000000..e7af2f7
--- /dev/null
@@ -0,0 +1,9 @@
+MIT License
+
+Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/advancedcontentfilter/vendor/npm-asset/got/package.json b/advancedcontentfilter/vendor/npm-asset/got/package.json
new file mode 100644 (file)
index 0000000..3ed248b
--- /dev/null
@@ -0,0 +1,95 @@
+{
+       "name": "got",
+       "version": "8.3.0",
+       "description": "Simplified HTTP requests",
+       "license": "MIT",
+       "repository": "sindresorhus/got",
+       "maintainers": [
+               {
+                       "name": "Sindre Sorhus",
+                       "email": "sindresorhus@gmail.com",
+                       "url": "sindresorhus.com"
+               },
+               {
+                       "name": "Vsevolod Strukchinsky",
+                       "email": "floatdrop@gmail.com",
+                       "url": "github.com/floatdrop"
+               },
+               {
+                       "name": "Alexander Tesfamichael",
+                       "email": "alex.tesfamichael@gmail.com",
+                       "url": "alextes.me"
+               }
+       ],
+       "engines": {
+               "node": ">=4"
+       },
+       "scripts": {
+               "test": "xo && nyc ava",
+               "coveralls": "nyc report --reporter=text-lcov | coveralls"
+       },
+       "files": [
+               "index.js",
+               "errors.js"
+       ],
+       "keywords": [
+               "http",
+               "https",
+               "get",
+               "got",
+               "url",
+               "uri",
+               "request",
+               "util",
+               "utility",
+               "simple",
+               "curl",
+               "wget",
+               "fetch",
+               "net",
+               "network",
+               "electron"
+       ],
+       "dependencies": {
+               "@sindresorhus/is": "^0.7.0",
+               "cacheable-request": "^2.1.1",
+               "decompress-response": "^3.3.0",
+               "duplexer3": "^0.1.4",
+               "get-stream": "^3.0.0",
+               "into-stream": "^3.1.0",
+               "is-retry-allowed": "^1.1.0",
+               "isurl": "^1.0.0-alpha5",
+               "lowercase-keys": "^1.0.0",
+               "mimic-response": "^1.0.0",
+               "p-cancelable": "^0.4.0",
+               "p-timeout": "^2.0.1",
+               "pify": "^3.0.0",
+               "safe-buffer": "^5.1.1",
+               "timed-out": "^4.0.1",
+               "url-parse-lax": "^3.0.0",
+               "url-to-options": "^1.0.1"
+       },
+       "devDependencies": {
+               "ava": "^0.25.0",
+               "coveralls": "^3.0.0",
+               "form-data": "^2.1.1",
+               "get-port": "^3.0.0",
+               "nyc": "^11.0.2",
+               "p-event": "^1.3.0",
+               "pem": "^1.4.4",
+               "proxyquire": "^1.8.0",
+               "sinon": "^4.0.0",
+               "slow-stream": "0.0.4",
+               "tempfile": "^2.0.0",
+               "tempy": "^0.2.1",
+               "universal-url": "1.0.0-alpha",
+               "xo": "^0.20.0"
+       },
+       "ava": {
+               "concurrency": 4
+       },
+       "browser": {
+               "decompress-response": false,
+               "electron": false
+       }
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/got/readme.md b/advancedcontentfilter/vendor/npm-asset/got/readme.md
new file mode 100644 (file)
index 0000000..1691276
--- /dev/null
@@ -0,0 +1,650 @@
+<div align="center">
+       <br>
+       <br>
+       <img width="360" src="https://rawgit.com/sindresorhus/got/master/media/logo.svg" alt="got">
+       <br>
+       <br>
+       <br>
+       <p align="center">Huge thanks to <a href="https://moxy.studio"><img src="https://sindresorhus.com/assets/thanks/moxy-logo.svg" width="150"></a> for sponsoring me!
+       </p>
+       <br>
+       <br>
+</div>
+
+> Simplified HTTP requests
+
+[![Build Status](https://travis-ci.org/sindresorhus/got.svg?branch=master)](https://travis-ci.org/sindresorhus/got) [![Coverage Status](https://coveralls.io/repos/github/sindresorhus/got/badge.svg?branch=master)](https://coveralls.io/github/sindresorhus/got?branch=master) [![Downloads](https://img.shields.io/npm/dm/got.svg)](https://npmjs.com/got)
+
+A nicer interface to the built-in [`http`](http://nodejs.org/api/http.html) module.
+
+Created because [`request`](https://github.com/request/request) is bloated *(several megabytes!)*.
+
+
+## Highlights
+
+- [Promise & stream API](#api)
+- [Request cancelation](#aborting-the-request)
+- [RFC compliant caching](#cache-adapters)
+- [Follows redirects](#followredirect)
+- [Retries on network failure](#retries)
+- [Progress events](#onuploadprogress-progress)
+- [Handles gzip/deflate](#decompress)
+- [Timeout handling](#timeout)
+- [Errors with metadata](#errors)
+- [JSON mode](#json)
+- [WHATWG URL support](#url)
+- [Electron support](#useelectronnet)
+
+
+## Install
+
+```
+$ npm install got
+```
+
+<a href="https://www.patreon.com/sindresorhus">
+       <img src="https://c5.patreon.com/external/logo/become_a_patron_button@2x.png" width="160">
+</a>
+
+
+## Usage
+
+```js
+const got = require('got');
+
+(async () => {
+       try {
+               const response = await got('sindresorhus.com');
+               console.log(response.body);
+               //=> '<!doctype html> ...'
+       } catch (error) {
+               console.log(error.response.body);
+               //=> 'Internal server error ...'
+       }
+})();
+```
+
+###### Streams
+
+```js
+const fs = require('fs');
+const got = require('got');
+
+got.stream('sindresorhus.com').pipe(fs.createWriteStream('index.html'));
+
+// For POST, PUT, and PATCH methods `got.stream` returns a `stream.Writable`
+fs.createReadStream('index.html').pipe(got.stream.post('sindresorhus.com'));
+```
+
+
+### API
+
+It's a `GET` request by default, but can be changed by using different methods or in the `options`.
+
+#### got(url, [options])
+
+Returns a Promise for a `response` object with a `body` property, a `url` property with the request URL or the final URL after redirects, and a `requestUrl` property with the original request URL.
+
+The response object will normally be a [Node.js HTTP response stream](https://nodejs.org/api/http.html#http_class_http_incomingmessage), however if returned from the cache it will be a [responselike object](https://github.com/lukechilds/responselike) which behaves in the same way.
+
+The response will also have a `fromCache` property set with a boolean value.
+
+##### url
+
+Type: `string` `Object`
+
+The URL to request as simple string, a [`http.request` options](https://nodejs.org/api/http.html#http_http_request_options_callback), or a [WHATWG `URL`](https://nodejs.org/api/url.html#url_class_url).
+
+Properties from `options` will override properties in the parsed `url`.
+
+If no protocol is specified, it will default to `https`.
+
+##### options
+
+Type: `Object`
+
+Any of the [`http.request`](http://nodejs.org/api/http.html#http_http_request_options_callback) options.
+
+###### stream
+
+Type: `boolean`<br>
+Default: `false`
+
+Returns a `Stream` instead of a `Promise`. This is equivalent to calling `got.stream(url, [options])`.
+
+###### body
+
+Type: `string` `Buffer` `stream.Readable`
+
+*This is mutually exclusive with stream mode.*
+
+Body that will be sent with a `POST` request.
+
+If present in `options` and `options.method` is not set, `options.method` will be set to `POST`.
+
+If `content-length` or `transfer-encoding` is not set in `options.headers` and `body` is a string or buffer, `content-length` will be set to the body length.
+
+###### encoding
+
+Type: `string` `null`<br>
+Default: `'utf8'`
+
+[Encoding](https://nodejs.org/api/buffer.html#buffer_buffers_and_character_encodings) to be used on `setEncoding` of the response data. If `null`, the body is returned as a [`Buffer`](https://nodejs.org/api/buffer.html) (binary data).
+
+###### form
+
+Type: `boolean`<br>
+Default: `false`
+
+*This is mutually exclusive with stream mode.*
+
+If set to `true` and `Content-Type` header is not set, it will be set to `application/x-www-form-urlencoded`.
+
+`body` must be a plain object or array and will be stringified.
+
+###### json
+
+Type: `boolean`<br>
+Default: `false`
+
+*This is mutually exclusive with stream mode.*
+
+If set to `true` and `Content-Type` header is not set, it will be set to `application/json`.
+
+Parse response body with `JSON.parse` and set `accept` header to `application/json`. If used in conjunction with the `form` option, the `body` will the stringified as querystring and the response parsed as JSON.
+
+`body` must be a plain object or array and will be stringified.
+
+###### query
+
+Type: `string` `Object`<br>
+
+Query string object that will be added to the request URL. This will override the query string in `url`.
+
+###### timeout
+
+Type: `number` `Object`
+
+Milliseconds to wait for the server to end the response before aborting request with `ETIMEDOUT` error.
+
+This also accepts an object with separate `connect`, `socket`, and `request` fields for connection, socket, and entire request timeouts.
+
+###### retries
+
+Type: `number` `Function`<br>
+Default: `2`
+
+Number of request retries when network errors happens. Delays between retries counts with function `1000 * Math.pow(2, retry) + Math.random() * 100`, where `retry` is attempt number (starts from 0).
+
+Option accepts `function` with `retry` and `error` arguments. Function must return delay in milliseconds (`0` return value cancels retry).
+
+**Note:** if `retries` is `number`, `ENOTFOUND` and `ENETUNREACH` error will not be retried (see full list in [`is-retry-allowed`](https://github.com/floatdrop/is-retry-allowed/blob/master/index.js#L12) module).
+
+###### followRedirect
+
+Type: `boolean`<br>
+Default: `true`
+
+Defines if redirect responses should be followed automatically.
+
+Note that if a `303` is sent by the server in response to any request type (`POST`, `DELETE`, etc.), got will automatically
+request the resource pointed to in the location header via `GET`. This is in accordance with [the spec](https://tools.ietf.org/html/rfc7231#section-6.4.4).
+
+###### decompress
+
+Type: `boolean`<br>
+Default: `true`
+
+Decompress the response automatically.
+
+If this is disabled, a compressed response is returned as a `Buffer`. This may be useful if you want to handle decompression yourself or stream the raw compressed data.
+
+###### cache
+
+Type: `Object`<br>
+Default: `false`
+
+[Cache adapter instance](#cache-adapters) for storing cached data.
+
+###### useElectronNet
+
+Type: `boolean`<br>
+Default: `false`
+
+When used in Electron, Got will use [`electron.net`](https://electronjs.org/docs/api/net/) instead of the Node.js `http` module. According to the Electron docs, it should be fully compatible, but it's not entirely. See [#315](https://github.com/sindresorhus/got/issues/315).
+
+###### throwHttpErrors
+
+Type: `boolean`<br>
+Default: `true`
+
+Determines if a `got.HTTPError` is thrown for error responses (non-2xx status codes).
+
+If this is disabled, requests that encounter an error status code will be resolved with the `response` instead of throwing. This may be useful if you are checking for resource availability and are expecting error responses.
+
+#### Streams
+
+#### got.stream(url, [options])
+
+`stream` method will return Duplex stream with additional events:
+
+##### .on('request', request)
+
+`request` event to get the request object of the request.
+
+**Tip**: You can use `request` event to abort request:
+
+```js
+got.stream('github.com')
+       .on('request', req => setTimeout(() => req.abort(), 50));
+```
+
+##### .on('response', response)
+
+`response` event to get the response object of the final request.
+
+##### .on('redirect', response, nextOptions)
+
+`redirect` event to get the response object of a redirect. The second argument is options for the next request to the redirect location.
+
+##### .on('uploadProgress', progress)
+##### .on('downloadProgress', progress)
+
+Progress events for uploading (sending request) and downloading (receiving response). The `progress` argument is an object like:
+
+```js
+{
+       percent: 0.1,
+       transferred: 1024,
+       total: 10240
+}
+```
+
+If it's not possible to retrieve the body size (can happen when streaming), `total` will be `null`.
+
+**Note**: Progress events can also be used with promises.
+
+```js
+(async () => {
+       const response = await got('sindresorhus.com')
+               .on('downloadProgress', progress => {
+                       // Report download progress
+               })
+               .on('uploadProgress', progress => {
+                       // Report upload progress
+               });
+
+       console.log(response);
+})();
+```
+
+##### .on('error', error, body, response)
+
+`error` event emitted in case of protocol error (like `ENOTFOUND` etc.) or status error (4xx or 5xx). The second argument is the body of the server response in case of status error. The third argument is response object.
+
+#### got.get(url, [options])
+#### got.post(url, [options])
+#### got.put(url, [options])
+#### got.patch(url, [options])
+#### got.head(url, [options])
+#### got.delete(url, [options])
+
+Sets `options.method` to the method name and makes a request.
+
+
+## Errors
+
+Each error contains (if available) `statusCode`, `statusMessage`, `host`, `hostname`, `method`, `path`, `protocol` and `url` properties to make debugging easier.
+
+In Promise mode, the `response` is attached to the error.
+
+#### got.CacheError
+
+When a cache method fails, for example if the database goes down, or there's a filesystem error.
+
+#### got.RequestError
+
+When a request fails. Contains a `code` property with error class code, like `ECONNREFUSED`.
+
+#### got.ReadError
+
+When reading from response stream fails.
+
+#### got.ParseError
+
+When `json` option is enabled, server response code is 2xx, and `JSON.parse` fails.
+
+#### got.HTTPError
+
+When server response code is not 2xx. Includes `statusCode`, `statusMessage`, and `redirectUrls` properties.
+
+#### got.MaxRedirectsError
+
+When server redirects you more than 10 times. Includes a `redirectUrls` property, which is an array of the URLs Got was redirected to before giving up.
+
+#### got.UnsupportedProtocolError
+
+When given an unsupported protocol.
+
+#### got.CancelError
+
+When the request is aborted with `.cancel()`.
+
+
+## Aborting the request
+
+The promise returned by Got has a [`.cancel()`](https://github.com/sindresorhus/p-cancelable) method which, when called, aborts the request.
+
+```js
+(async () => {
+       const request = got(url, options);
+
+       …
+
+       // In another part of the code
+       if (something) {
+               request.cancel();
+       }
+
+       …
+
+       try {
+               await request;
+       } catch (error) {
+               if (request.isCanceled) { // Or `error instanceof got.CancelError`
+                       // Handle cancelation
+               }
+
+               // Handle other errors
+       }
+})();
+```
+
+<a name="cache-adapters"></a>
+## Cache
+
+Got implements [RFC 7234](http://httpwg.org/specs/rfc7234.html) compliant HTTP caching which works out of the box in memory or is easily pluggable with a wide range of storage adapters. Fresh cache entries are served directly from cache and stale cache entries are revalidated with `If-None-Match`/`If-Modified-Since` headers. You can read more about the underlying cache behaviour in the `cacheable-request` [documentation](https://github.com/lukechilds/cacheable-request).
+
+You can use the JavaScript `Map` type as an in memory cache:
+
+```js
+const got = require('got');
+const map = new Map();
+
+(async () => {
+               let response = await got('sindresorhus.com', {cache: map});
+               console.log(response.fromCache);
+               //=> false
+
+               response = await got('sindresorhus.com', {cache: map});
+               console.log(response.fromCache);
+               //=> true
+})();
+```
+
+Got uses [Keyv](https://github.com/lukechilds/keyv) internally to support a wide range of storage adapters. For something more scalable you could use an [official Keyv storage adapter](https://github.com/lukechilds/keyv#official-storage-adapters):
+
+```
+$ npm install @keyv/redis
+```
+
+```js
+const got = require('got');
+const KeyvRedis = require('@keyv/redis');
+
+const redis = new KeyvRedis('redis://user:pass@localhost:6379');
+
+got('sindresorhus.com', {cache: redis});
+```
+
+Got supports anything that follows the Map API, so it's easy to write your own storage adapter or use a third-party solution.
+
+For example, the following are all valid storage adapters:
+
+```js
+const storageAdapter = new Map();
+// or
+const storageAdapter = require('./my-storage-adapter');
+// or
+const QuickLRU = require('quick-lru');
+const storageAdapter = new QuickLRU({maxSize: 1000});
+
+got('sindresorhus.com', {cache: storageAdapter});
+```
+
+View the [Keyv docs](https://github.com/lukechilds/keyv) for more information on how to use storage adapters.
+
+
+## Proxies
+
+You can use the [`tunnel`](https://github.com/koichik/node-tunnel) module with the `agent` option to work with proxies:
+
+```js
+const got = require('got');
+const tunnel = require('tunnel');
+
+got('sindresorhus.com', {
+       agent: tunnel.httpOverHttp({
+               proxy: {
+                       host: 'localhost'
+               }
+       })
+});
+```
+
+If you require different agents for different protocols, you can pass a map of agents to the `agent` option. This is necessary because a request to one protocol might redirect to another. In such a scenario, `got` will switch over to the right protocol agent for you.
+
+```js
+const got = require('got');
+const HttpAgent = require('agentkeepalive');
+const HttpsAgent = HttpAgent.HttpsAgent;
+
+got('sindresorhus.com', {
+       agent: {
+               http: new HttpAgent(),
+               https: new HttpsAgent()
+       }
+});
+```
+
+
+## Cookies
+
+You can use the [`cookie`](https://github.com/jshttp/cookie) module to include cookies in a request:
+
+```js
+const got = require('got');
+const cookie = require('cookie');
+
+got('google.com', {
+       headers: {
+               cookie: cookie.serialize('foo', 'bar')
+       }
+});
+```
+
+
+## Form data
+
+You can use the [`form-data`](https://github.com/form-data/form-data) module to create POST request with form data:
+
+```js
+const fs = require('fs');
+const got = require('got');
+const FormData = require('form-data');
+const form = new FormData();
+
+form.append('my_file', fs.createReadStream('/foo/bar.jpg'));
+
+got.post('google.com', {
+       body: form
+});
+```
+
+
+## OAuth
+
+You can use the [`oauth-1.0a`](https://github.com/ddo/oauth-1.0a) module to create a signed OAuth request:
+
+```js
+const got = require('got');
+const crypto  = require('crypto');
+const OAuth = require('oauth-1.0a');
+
+const oauth = OAuth({
+       consumer: {
+               key: process.env.CONSUMER_KEY,
+               secret: process.env.CONSUMER_SECRET
+       },
+       signature_method: 'HMAC-SHA1',
+       hash_function: (baseString, key) => crypto.createHmac('sha1', key).update(baseString).digest('base64')
+});
+
+const token = {
+       key: process.env.ACCESS_TOKEN,
+       secret: process.env.ACCESS_TOKEN_SECRET
+};
+
+const url = 'https://api.twitter.com/1.1/statuses/home_timeline.json';
+
+got(url, {
+       headers: oauth.toHeader(oauth.authorize({url, method: 'GET'}, token)),
+       json: true
+});
+```
+
+
+## Unix Domain Sockets
+
+Requests can also be sent via [unix domain sockets](http://serverfault.com/questions/124517/whats-the-difference-between-unix-socket-and-tcp-ip-socket). Use the following URL scheme: `PROTOCOL://unix:SOCKET:PATH`.
+
+- `PROTOCOL` - `http` or `https` *(optional)*
+- `SOCKET` - absolute path to a unix domain socket, e.g. `/var/run/docker.sock`
+- `PATH` - request path, e.g. `/v2/keys`
+
+```js
+got('http://unix:/var/run/docker.sock:/containers/json');
+
+// or without protocol (http by default)
+got('unix:/var/run/docker.sock:/containers/json');
+```
+
+## AWS
+
+Requests to AWS services need to have their headers signed. This can be accomplished by using the [`aws4`](https://www.npmjs.com/package/aws4) package. This is an example for querying an ["Elasticsearch Service"](https://aws.amazon.com/elasticsearch-service/) host with a signed request.
+
+```js
+const url = require('url');
+const AWS = require('aws-sdk');
+const aws4 = require('aws4');
+const got = require('got');
+const config = require('./config');
+
+// Reads keys from the environment or `~/.aws/credentials`. Could be a plain object.
+const awsConfig = new AWS.Config({ region: config.region });
+
+function request(uri, options) {
+       const awsOpts = {
+               region: awsConfig.region,
+               headers: {
+                       accept: 'application/json',
+                       'content-type': 'application/json'
+               },
+               method: 'GET',
+               json: true
+       };
+
+       // We need to parse the URL before passing it to `got` so `aws4` can sign the request
+       const opts = Object.assign(url.parse(uri), awsOpts, options);
+       aws4.sign(opts, awsConfig.credentials);
+
+       return got(opts);
+}
+
+request(`https://${config.host}/production/users/1`);
+
+request(`https://${config.host}/production/`, {
+       // All usual `got` options
+});
+```
+
+
+## Testing
+
+You can test your requests by using the [`nock`](https://github.com/node-nock/nock) module to mock an endpoint:
+
+```js
+const got = require('got');
+const nock = require('nock');
+
+nock('https://sindresorhus.com')
+       .get('/')
+       .reply(200, 'Hello world!');
+
+(async () => {
+       const response = await got('sindresorhus.com');
+       console.log(response.body);
+       //=> 'Hello world!'
+})();
+```
+
+If you need real integration tests you can use [`create-test-server`](https://github.com/lukechilds/create-test-server):
+
+```js
+const got = require('got');
+const createTestServer = require('create-test-server');
+
+(async () => {
+       const server = await createTestServer();
+       server.get('/', 'Hello world!');
+
+       const response = await got(server.url);
+       console.log(response.body);
+       //=> 'Hello world!'
+
+       await server.close();
+})();
+```
+
+
+## Tips
+
+### User Agent
+
+It's a good idea to set the `'user-agent'` header so the provider can more easily see how their resource is used. By default, it's the URL to this repo.
+
+```js
+const got = require('got');
+const pkg = require('./package.json');
+
+got('sindresorhus.com', {
+       headers: {
+               'user-agent': `my-module/${pkg.version} (https://github.com/username/my-module)`
+       }
+});
+```
+
+### 304 Responses
+
+Bear in mind, if you send an `if-modified-since` header and receive a `304 Not Modified` response, the body will be empty. It's your responsibility to cache and retrieve the body contents.
+
+
+## Related
+
+- [gh-got](https://github.com/sindresorhus/gh-got) - Got convenience wrapper to interact with the GitHub API
+- [gl-got](https://github.com/singapore/gl-got) - Got convenience wrapper to interact with the GitLab API
+- [travis-got](https://github.com/samverschueren/travis-got) - Got convenience wrapper to interact with the Travis API
+- [graphql-got](https://github.com/kevva/graphql-got) - Got convenience wrapper to interact with GraphQL
+- [GotQL](https://github.com/khaosdoctor/gotql) - Got convenience wrapper to interact with GraphQL using JSON-parsed queries instead of strings
+
+
+## Created by
+
+[![Sindre Sorhus](https://github.com/sindresorhus.png?size=100)](https://sindresorhus.com) | [![Vsevolod Strukchinsky](https://github.com/floatdrop.png?size=100)](https://github.com/floatdrop) | [![Alexander Tesfamichael](https://github.com/AlexTes.png?size=100)](https://github.com/AlexTes) | [![Luke Childs](https://github.com/lukechilds.png?size=100)](https://github.com/lukechilds)
+---|---|---|---
+[Sindre Sorhus](https://sindresorhus.com) | [Vsevolod Strukchinsky](https://github.com/floatdrop) | [Alexander Tesfamichael](https://alextes.me) | [Luke Childs](https://github.com/lukechilds)
+
+
+## License
+
+MIT
diff --git a/advancedcontentfilter/vendor/npm-asset/has-symbol-support-x/.editorconfig b/advancedcontentfilter/vendor/npm-asset/has-symbol-support-x/.editorconfig
new file mode 100644 (file)
index 0000000..ec24598
--- /dev/null
@@ -0,0 +1,26 @@
+# This file is for unifying the coding style for different editors and IDEs
+# editorconfig.org
+
+# top-most EditorConfig file
+root = true
+
+# every file
+[*]
+charset = utf-8
+end_of_line = lf
+indent_size = 2
+indent_style = space
+insert_final_newline = true
+trim_trailing_whitespace = true
+
+# 4 space indentation
+[*.py]
+indent_style = space
+indent_size = 4
+
+# Tab indentation (no size specified)
+[Makefile]
+indent_style = tab
+
+[*.md]
+trim_trailing_whitespace = false
diff --git a/advancedcontentfilter/vendor/npm-asset/has-symbol-support-x/.eslintignore b/advancedcontentfilter/vendor/npm-asset/has-symbol-support-x/.eslintignore
new file mode 100644 (file)
index 0000000..cdecab1
--- /dev/null
@@ -0,0 +1 @@
+lib/*
diff --git a/advancedcontentfilter/vendor/npm-asset/has-symbol-support-x/.eslintrc.json b/advancedcontentfilter/vendor/npm-asset/has-symbol-support-x/.eslintrc.json
new file mode 100644 (file)
index 0000000..7d4d3dd
--- /dev/null
@@ -0,0 +1,6 @@
+{
+  "root": true,
+  "extends": [
+    "@xotic750/eslint-config-standard-x"
+  ]
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/has-symbol-support-x/.nvmrc b/advancedcontentfilter/vendor/npm-asset/has-symbol-support-x/.nvmrc
new file mode 100644 (file)
index 0000000..b009dfb
--- /dev/null
@@ -0,0 +1 @@
+lts/*
diff --git a/advancedcontentfilter/vendor/npm-asset/has-symbol-support-x/.travis.yml b/advancedcontentfilter/vendor/npm-asset/has-symbol-support-x/.travis.yml
new file mode 100644 (file)
index 0000000..a45e260
--- /dev/null
@@ -0,0 +1,111 @@
+sudo: false
+language: node_js
+branches:
+  only:
+    - master
+    - /^greenkeeper/.*$/
+notifications:
+  email: false
+node_js:
+  - "9.6"
+  - "9.5"
+  - "9.4"
+  - "9.3"
+  - "9.2"
+  - "9.1"
+  - "9.0"
+  - "8.9"
+  - "8.8"
+  - "8.7"
+  - "8.6"
+  - "8.5"
+  - "8.4"
+  - "8.3"
+  - "8.2"
+  - "8.1"
+  - "8.0"
+  - "7.10"
+  - "7.9"
+  - "7.8"
+  - "7.7"
+  - "7.6"
+  - "7.5"
+  - "7.4"
+  - "7.3"
+  - "7.2"
+  - "7.1"
+  - "7.0"
+  - "6.11"
+  - "6.10"
+  - "6.9"
+  - "6.8"
+  - "6.7"
+  - "6.6"
+  - "6.5"
+  - "6.4"
+  - "6.3"
+  - "6.2"
+  - "6.1"
+  - "6.0"
+  - "5.12"
+  - "5.11"
+  - "5.10"
+  - "5.9"
+  - "5.8"
+  - "5.7"
+  - "5.6"
+  - "5.5"
+  - "5.4"
+  - "5.3"
+  - "5.2"
+  - "5.1"
+  - "5.0"
+  - "4.8"
+  - "4.7"
+  - "4.6"
+  - "4.5"
+  - "4.4"
+  - "4.3"
+  - "4.2"
+  - "4.1"
+  - "4.0"
+  - "iojs-v3.3"
+  - "iojs-v3.2"
+  - "iojs-v3.1"
+  - "iojs-v3.0"
+  - "iojs-v2.5"
+  - "iojs-v2.4"
+  - "iojs-v2.3"
+  - "iojs-v2.2"
+  - "iojs-v2.1"
+  - "iojs-v2.0"
+  - "iojs-v1.8"
+  - "iojs-v1.7"
+  - "iojs-v1.6"
+  - "iojs-v1.5"
+  - "iojs-v1.4"
+  - "iojs-v1.3"
+  - "iojs-v1.2"
+  - "iojs-v1.1"
+  - "iojs-v1.0"
+  - "0.12"
+  - "0.11"
+  - "0.10"
+  - "0.9"
+  - "0.8"
+  - "0.6"
+  - "0.4"
+before_install:
+  - 'if [ "${TRAVIS_NODE_VERSION}" = "0.6" ]; then npm install -g npm@1.3 ; elif [ "${TRAVIS_NODE_VERSION}" != "0.9" ]; then case "$(npm --version)" in 1.*) npm install -g npm@1.4.28 ;; 2.*) npm install -g npm@2 ; esac ; fi'
+  - 'if [ "${TRAVIS_NODE_VERSION}" != "0.6" ] && [ "${TRAVIS_NODE_VERSION}" != "0.9" ]; then if [ "${TRAVIS_NODE_VERSION%${TRAVIS_NODE_VERSION#[0-9]}}" = "0" ] || [ "${TRAVIS_NODE_VERSION:0:4}" = "iojs" ]; then npm install -g npm@4.5; elif [[ "${TRAVIS_NODE_VERSION%${TRAVIS_NODE_VERSION#[0-9]}}" =~ ^[4-5]+$ ]]; then npm install -g npm@5.3; else npm install -g npm; fi; fi'
+install:
+  - 'if [ "${TRAVIS_NODE_VERSION}" = "0.6" ]; then nvm install 0.8 && npm install -g npm@1.3 && npm install -g npm@1.4.28 && npm install -g npm@2 && npm install && nvm use --delete-prefix "${TRAVIS_NODE_VERSION}"; else npm install; fi;'
+script:
+  - 'npm test'
+matrix:
+  fast_finish: true
+  allow_failures:
+    - node_js: "0.11"
+    - node_js: "0.9"
+    - node_js: "0.6"
+    - node_js: "0.4"
diff --git a/advancedcontentfilter/vendor/npm-asset/has-symbol-support-x/.uglifyjsrc.json b/advancedcontentfilter/vendor/npm-asset/has-symbol-support-x/.uglifyjsrc.json
new file mode 100644 (file)
index 0000000..2d26277
--- /dev/null
@@ -0,0 +1,17 @@
+{
+  "warnings": false,
+  "parse": {},
+  "compress": {
+    "keep_fnames": true
+  },
+  "mangle": false,
+  "output": {
+    "ascii_only": true,
+    "beautify": false,
+    "comments": "some"
+  },
+  "sourceMap": {},
+  "nameCache": null,
+  "toplevel": false,
+  "ie8": true
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/has-symbol-support-x/LICENSE b/advancedcontentfilter/vendor/npm-asset/has-symbol-support-x/LICENSE
new file mode 100644 (file)
index 0000000..0d2b266
--- /dev/null
@@ -0,0 +1,21 @@
+https://opensource.org/licenses/MIT
+
+Copyright (c) 2015-present Graham Fairweather.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/advancedcontentfilter/vendor/npm-asset/has-symbol-support-x/README.md b/advancedcontentfilter/vendor/npm-asset/has-symbol-support-x/README.md
new file mode 100644 (file)
index 0000000..f9503ae
--- /dev/null
@@ -0,0 +1,36 @@
+<a href="https://travis-ci.org/Xotic750/has-symbol-support-x"
+   title="Travis status">
+<img
+   src="https://travis-ci.org/Xotic750/has-symbol-support-x.svg?branch=master"
+   alt="Travis status" height="18"/>
+</a>
+<a href="https://david-dm.org/Xotic750/has-symbol-support-x"
+   title="Dependency status">
+<img src="https://david-dm.org/Xotic750/has-symbol-support-x.svg"
+   alt="Dependency status" height="18"/>
+</a>
+<a href="https://david-dm.org/Xotic750/has-symbol-support-x#info=devDependencies"
+   title="devDependency status">
+<img src="https://david-dm.org/Xotic750/has-symbol-support-x/dev-status.svg"
+   alt="devDependency status" height="18"/>
+</a>
+<a href="https://badge.fury.io/js/has-symbol-support-x" title="npm version">
+<img src="https://badge.fury.io/js/has-symbol-support-x.svg"
+   alt="npm version" height="18"/>
+</a>
+<a name="module_has-symbol-support-x"></a>
+
+## has-symbol-support-x
+Tests if ES6 Symbol is supported.
+
+**Version**: 1.4.2  
+**Author**: Xotic750 <Xotic750@gmail.com>  
+**License**: [MIT](&lt;https://opensource.org/licenses/MIT&gt;)  
+**Copyright**: Xotic750  
+<a name="exp_module_has-symbol-support-x--module.exports"></a>
+
+### `module.exports` : <code>boolean</code> ⏏
+Indicates if `Symbol`exists and creates the correct type.
+`true`, if it exists and creates the correct type, otherwise `false`.
+
+**Kind**: Exported member  
diff --git a/advancedcontentfilter/vendor/npm-asset/has-symbol-support-x/badges.html b/advancedcontentfilter/vendor/npm-asset/has-symbol-support-x/badges.html
new file mode 100644 (file)
index 0000000..a3b8352
--- /dev/null
@@ -0,0 +1,20 @@
+<a href="https://travis-ci.org/Xotic750/@{PACKAGE-NAME}"
+   title="Travis status">
+<img
+   src="https://travis-ci.org/Xotic750/@{PACKAGE-NAME}.svg?branch=master"
+   alt="Travis status" height="18"/>
+</a>
+<a href="https://david-dm.org/Xotic750/@{PACKAGE-NAME}"
+   title="Dependency status">
+<img src="https://david-dm.org/Xotic750/@{PACKAGE-NAME}.svg"
+   alt="Dependency status" height="18"/>
+</a>
+<a href="https://david-dm.org/Xotic750/@{PACKAGE-NAME}#info=devDependencies"
+   title="devDependency status">
+<img src="https://david-dm.org/Xotic750/@{PACKAGE-NAME}/dev-status.svg"
+   alt="devDependency status" height="18"/>
+</a>
+<a href="https://badge.fury.io/js/@{PACKAGE-NAME}" title="npm version">
+<img src="https://badge.fury.io/js/@{PACKAGE-NAME}.svg"
+   alt="npm version" height="18"/>
+</a>
diff --git a/advancedcontentfilter/vendor/npm-asset/has-symbol-support-x/index.js b/advancedcontentfilter/vendor/npm-asset/has-symbol-support-x/index.js
new file mode 100644 (file)
index 0000000..20a9581
--- /dev/null
@@ -0,0 +1,18 @@
+/**
+ * @file Tests if ES6 Symbol is supported.
+ * @version 1.4.2
+ * @author Xotic750 <Xotic750@gmail.com>
+ * @copyright  Xotic750
+ * @license {@link <https://opensource.org/licenses/MIT> MIT}
+ * @module has-symbol-support-x
+ */
+
+'use strict';
+
+/**
+ * Indicates if `Symbol`exists and creates the correct type.
+ * `true`, if it exists and creates the correct type, otherwise `false`.
+ *
+ * @type boolean
+ */
+module.exports = typeof Symbol === 'function' && typeof Symbol('') === 'symbol';
diff --git a/advancedcontentfilter/vendor/npm-asset/has-symbol-support-x/lib/has-symbol-support-x.js b/advancedcontentfilter/vendor/npm-asset/has-symbol-support-x/lib/has-symbol-support-x.js
new file mode 100644 (file)
index 0000000..62a6b14
--- /dev/null
@@ -0,0 +1,22 @@
+(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.returnExports = f()}})(function(){var define,module,exports;return (function(){function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s}return e})()({1:[function(_dereq_,module,exports){
+/**
+ * @file Tests if ES6 Symbol is supported.
+ * @version 1.4.2
+ * @author Xotic750 <Xotic750@gmail.com>
+ * @copyright  Xotic750
+ * @license {@link <https://opensource.org/licenses/MIT> MIT}
+ * @module has-symbol-support-x
+ */
+
+'use strict';
+
+/**
+ * Indicates if `Symbol`exists and creates the correct type.
+ * `true`, if it exists and creates the correct type, otherwise `false`.
+ *
+ * @type boolean
+ */
+module.exports = typeof Symbol === 'function' && typeof Symbol('') === 'symbol';
+
+},{}]},{},[1])(1)
+});
\ No newline at end of file
diff --git a/advancedcontentfilter/vendor/npm-asset/has-symbol-support-x/lib/has-symbol-support-x.min.js b/advancedcontentfilter/vendor/npm-asset/has-symbol-support-x/lib/has-symbol-support-x.min.js
new file mode 100644 (file)
index 0000000..035d36f
--- /dev/null
@@ -0,0 +1,10 @@
+!function(f){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=f();else if("function"==typeof define&&define.amd)define([],f);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).returnExports=f()}}(function(){return function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a="function"==typeof require&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n||e)},l,l.exports,e,t,n,r)}return n[o].exports}for(var i="function"==typeof require&&require,o=0;o<r.length;o++)s(r[o]);return s}({1:[function(_dereq_,module,exports){
+/**
+ * @file Tests if ES6 Symbol is supported.
+ * @version 1.4.2
+ * @author Xotic750 <Xotic750@gmail.com>
+ * @copyright  Xotic750
+ * @license {@link <https://opensource.org/licenses/MIT> MIT}
+ * @module has-symbol-support-x
+ */
+"use strict";module.exports="function"==typeof Symbol&&"symbol"==typeof Symbol("")},{}]},{},[1])(1)});
\ No newline at end of file
diff --git a/advancedcontentfilter/vendor/npm-asset/has-symbol-support-x/lib/has-symbol-support-x.min.js.map b/advancedcontentfilter/vendor/npm-asset/has-symbol-support-x/lib/has-symbol-support-x.min.js.map
new file mode 100644 (file)
index 0000000..b700755
--- /dev/null
@@ -0,0 +1 @@
+{"version":3,"sources":["lib/has-symbol-support-x.js"],"names":["f","exports","module","define","amd","window","global","self","this","returnExports","e","t","n","r","s","o","u","a","require","i","Error","code","l","call","length","1","_dereq_","Symbol"],"mappings":"CAAA,SAAUA,GAAG,GAAoB,iBAAVC,SAAoC,oBAATC,OAAsBA,OAAOD,QAAQD,SAAS,GAAmB,mBAATG,QAAqBA,OAAOC,IAAKD,UAAUH,OAAO,EAA0B,oBAATK,OAAwBA,OAA+B,oBAATC,OAAwBA,OAA6B,oBAAPC,KAAsBA,KAAYC,MAAOC,cAAgBT,KAAlU,CAAyU,WAAqC,OAAmB,SAASU,EAAEC,EAAEC,EAAEC,GAAG,SAASC,EAAEC,EAAEC,GAAG,IAAIJ,EAAEG,GAAG,CAAC,IAAIJ,EAAEI,GAAG,CAAC,IAAIE,EAAkB,mBAATC,SAAqBA,QAAQ,IAAIF,GAAGC,EAAE,OAAOA,EAAEF,GAAE,GAAI,GAAGI,EAAE,OAAOA,EAAEJ,GAAE,GAAI,IAAIf,EAAE,IAAIoB,MAAM,uBAAuBL,EAAE,KAAK,MAAMf,EAAEqB,KAAK,mBAAmBrB,EAAE,IAAIsB,EAAEV,EAAEG,IAAId,YAAYU,EAAEI,GAAG,GAAGQ,KAAKD,EAAErB,QAAQ,SAASS,GAAG,IAAIE,EAAED,EAAEI,GAAG,GAAGL,GAAG,OAAOI,EAAEF,GAAIF,IAAIY,EAAEA,EAAErB,QAAQS,EAAEC,EAAEC,EAAEC,GAAG,OAAOD,EAAEG,GAAGd,QAAkD,IAA1C,IAAIkB,EAAkB,mBAATD,SAAqBA,QAAgBH,EAAE,EAAEA,EAAEF,EAAEW,OAAOT,IAAID,EAAED,EAAEE,IAAI,OAAOD,EAAlc,EAAkdW,GAAG,SAASC,QAAQxB,OAAOD;;;;;;;;;AAUl2B,aAQAC,OAAOD,QAA4B,mBAAX0B,QAA+C,iBAAfA,OAAO,cAEpD,GApB0W,CAoBtW"}
\ No newline at end of file
diff --git a/advancedcontentfilter/vendor/npm-asset/has-symbol-support-x/package.json b/advancedcontentfilter/vendor/npm-asset/has-symbol-support-x/package.json
new file mode 100644 (file)
index 0000000..5e251df
--- /dev/null
@@ -0,0 +1,86 @@
+{
+  "name": "has-symbol-support-x",
+  "version": "1.4.2",
+  "description": "Tests if ES6 Symbol is supported.",
+  "homepage": "https://github.com/Xotic750/has-symbol-support-x",
+  "author": {
+    "name": "Graham Fairweather",
+    "email": "xotic750@gmail.com"
+  },
+  "copyright": "Copyright (c) 2015-present",
+  "keywords": [
+    "ES6",
+    "hasSymbolSupport",
+    "module",
+    "javascript",
+    "nodejs",
+    "browser"
+  ],
+  "main": "index.js",
+  "engines": {
+    "node": "*"
+  },
+  "license": "MIT",
+  "repository": {
+    "type": "git",
+    "url": "https://github.com/Xotic750/has-symbol-support-x.git"
+  },
+  "bugs": {
+    "url": "https://github.com/Xotic750/has-symbol-support-x/issues"
+  },
+  "dependencies": {},
+  "devDependencies": {
+    "@xotic750/eslint-config-standard-x": "^3.1.1",
+    "ajv": "^6.1.1",
+    "browserify": "^16.1.0",
+    "browserify-derequire": "^0.9.4",
+    "cross-env": "^5.1.3",
+    "es5-shim": "^4.5.10",
+    "es6-shim": "^0.35.3",
+    "es7-shim": "^6.0.0",
+    "eslint": "^4.18.1",
+    "eslint-plugin-compat": "^2.2.0",
+    "eslint-plugin-css-modules": "^2.7.5",
+    "eslint-plugin-eslint-comments": "^2.0.2",
+    "eslint-plugin-jsdoc": "^3.5.0",
+    "eslint-plugin-json": "^1.2.0",
+    "eslint-plugin-no-use-extend-native": "^0.3.12",
+    "husky": "^0.13.4",
+    "jasmine-node": "^1.14.5",
+    "jsdoc-to-markdown": "^4.0.1",
+    "json3": "^3.3.2",
+    "make-jasmine-spec-runner-html": "^1.3.0",
+    "ncp": "^2.0.0",
+    "nodemon": "^1.15.1",
+    "nsp": "^3.2.1",
+    "parallelshell": "^3.0.2",
+    "replace-x": "^1.5.0",
+    "rimraf": "^2.6.2",
+    "serve": "^6.4.11",
+    "uglify-js": "^3.3.12"
+  },
+  "scripts": {
+    "clean": "rimraf README.md lib/*",
+    "clean:jasmine": "rimraf tests/index.html tests/run.js",
+    "clean:all": "npm run clean:jasmine && npm run clean",
+    "build": "npm run clean && npm run lint && npm run browserify && npm run uglify && npm run docs && npm test && npm run security",
+    "build:jasmine": "npm run clean:jasmine && make-jasmine-spec-runner-html",
+    "build:setver": "replace-x \" @version .*\" \" @version $(node -p -e \"require('./package.json').version\")\" index.js",
+    "build:name": "replace-x \" @module .*\" \" @module $(node -p -e \"require('./package.json').name\")\" index.js",
+    "build:description": "replace-x \" @file .*\" \" @file $(node -p -e \"require('./package.json').description\")\" index.js",
+    "build:replace": "npm run build:setver && npm run build:name && npm run build:description",
+    "production": "npm run clean:all && npm run build:jasmine && npm run build:replace && npm run build",
+    "start": "parallelshell \"serve\" \"nodemon --watch index.js --exec 'npm run build'\"",
+    "docs:name": "replace-x \"@{PACKAGE-NAME}\" \"$(node -p -e \"require('./package.json').name\")\" README.md",
+    "docs:badges": "ncp badges.html README.md && npm run docs:name",
+    "docs": "npm run docs:badges && jsdoc2md --name-format --example-lang js index.js >> README.md",
+    "lint": "eslint *.js tests/spec/*.js",
+    "lint-fix": "npm run lint -- --fix",
+    "security": "nsp check",
+    "test": "jasmine-node --matchall tests/spec/",
+    "browserify": "browserify -p browserify-derequire -e index.js -o lib/has-symbol-support-x.js -u 'crypto' -s returnExports",
+    "uglify": "uglifyjs lib/has-symbol-support-x.js -o lib/has-symbol-support-x.min.js --config-file .uglifyjsrc.json",
+    "precommit": "npm run production",
+    "prepush": "npm run production"
+  }
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/has-symbol-support-x/tests/index.html b/advancedcontentfilter/vendor/npm-asset/has-symbol-support-x/tests/index.html
new file mode 100644 (file)
index 0000000..9c027d4
--- /dev/null
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+       <meta charset="utf-8" />
+       <title>Jasmine Spec Runner: has-symbol-support-x</title>
+
+       <link rel="icon" href="http://jasmine.github.io/images/jasmine.ico" sizes="16x16">
+       <link rel="icon" href="http://jasmine.github.io//images/jasmine_32x32.ico" sizes="32x32">
+
+       <link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/jasmine/1.3.1/jasmine.min.css">
+       <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/es5-shim/4.5.10/es5-shim.min.js"></script>
+       <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/es5-shim/4.5.10/es5-sham.min.js"></script>
+       <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/json3/3.3.2/json3.min.js"></script>
+       <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/es6-shim/0.35.3/es6-shim.js"></script>
+       <script type="text/javascript" src="https://wzrd.in/standalone/es7-shim@latest"></script>
+       <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jasmine/1.3.1/jasmine.min.js"></script>
+       <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jasmine/1.3.1/jasmine-html.min.js"></script>
+
+       <!-- include helper files here... -->
+
+       <!-- include source files here... -->
+       <script src="../lib/has-symbol-support-x.min.js"></script>
+
+       <!-- include spec files here... -->
+       <script src="spec/test.js"></script>
+
+       <!-- run the tests -->
+       <script src="./run.js"></script>
+
+</head>
+
+<body>
+</body>
+</html>
diff --git a/advancedcontentfilter/vendor/npm-asset/has-symbol-support-x/tests/run.js b/advancedcontentfilter/vendor/npm-asset/has-symbol-support-x/tests/run.js
new file mode 100644 (file)
index 0000000..76efd69
--- /dev/null
@@ -0,0 +1,25 @@
+/* global window, jasmine */
+/* eslint strict: 0 */
+(function () {
+  var jasmineEnv = jasmine.getEnv();
+  jasmineEnv.updateInterval = 1000;
+
+  var trivialReporter = new jasmine.TrivialReporter();
+
+  jasmineEnv.addReporter(trivialReporter);
+
+  jasmineEnv.specFilter = function (spec) {
+    return trivialReporter.specFilter(spec);
+  };
+
+  var currentWindowOnload = window.onload;
+  var execJasmine = function () {
+    jasmineEnv.execute();
+  };
+  window.onload = function () {
+    if (currentWindowOnload) {
+      currentWindowOnload();
+    }
+    execJasmine();
+  };
+}());
diff --git a/advancedcontentfilter/vendor/npm-asset/has-symbol-support-x/tests/spec/test.js b/advancedcontentfilter/vendor/npm-asset/has-symbol-support-x/tests/spec/test.js
new file mode 100644 (file)
index 0000000..0868973
--- /dev/null
@@ -0,0 +1,29 @@
+'use strict';
+
+var hasSymbolSupport;
+if (typeof module === 'object' && module.exports) {
+  require('es5-shim');
+  require('es5-shim/es5-sham');
+  if (typeof JSON === 'undefined') {
+    JSON = {};
+  }
+  require('json3').runInContext(null, JSON);
+  require('es6-shim');
+  var es7 = require('es7-shim');
+  Object.keys(es7).forEach(function (key) {
+    var obj = es7[key];
+    if (typeof obj.shim === 'function') {
+      obj.shim();
+    }
+  });
+  hasSymbolSupport = require('../../index.js');
+} else {
+  hasSymbolSupport = returnExports;
+}
+
+describe('Basic tests', function () {
+  it('results should match', function () {
+    var expected = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol';
+    expect(hasSymbolSupport).toBe(expected);
+  });
+});
diff --git a/advancedcontentfilter/vendor/npm-asset/has-to-string-tag-x/.editorconfig b/advancedcontentfilter/vendor/npm-asset/has-to-string-tag-x/.editorconfig
new file mode 100644 (file)
index 0000000..ec24598
--- /dev/null
@@ -0,0 +1,26 @@
+# This file is for unifying the coding style for different editors and IDEs
+# editorconfig.org
+
+# top-most EditorConfig file
+root = true
+
+# every file
+[*]
+charset = utf-8
+end_of_line = lf
+indent_size = 2
+indent_style = space
+insert_final_newline = true
+trim_trailing_whitespace = true
+
+# 4 space indentation
+[*.py]
+indent_style = space
+indent_size = 4
+
+# Tab indentation (no size specified)
+[Makefile]
+indent_style = tab
+
+[*.md]
+trim_trailing_whitespace = false
diff --git a/advancedcontentfilter/vendor/npm-asset/has-to-string-tag-x/.eslintignore b/advancedcontentfilter/vendor/npm-asset/has-to-string-tag-x/.eslintignore
new file mode 100644 (file)
index 0000000..cdecab1
--- /dev/null
@@ -0,0 +1 @@
+lib/*
diff --git a/advancedcontentfilter/vendor/npm-asset/has-to-string-tag-x/.eslintrc.json b/advancedcontentfilter/vendor/npm-asset/has-to-string-tag-x/.eslintrc.json
new file mode 100644 (file)
index 0000000..7d4d3dd
--- /dev/null
@@ -0,0 +1,6 @@
+{
+  "root": true,
+  "extends": [
+    "@xotic750/eslint-config-standard-x"
+  ]
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/has-to-string-tag-x/.nvmrc b/advancedcontentfilter/vendor/npm-asset/has-to-string-tag-x/.nvmrc
new file mode 100644 (file)
index 0000000..b009dfb
--- /dev/null
@@ -0,0 +1 @@
+lts/*
diff --git a/advancedcontentfilter/vendor/npm-asset/has-to-string-tag-x/.travis.yml b/advancedcontentfilter/vendor/npm-asset/has-to-string-tag-x/.travis.yml
new file mode 100644 (file)
index 0000000..1304ed4
--- /dev/null
@@ -0,0 +1,93 @@
+sudo: false
+language: node_js
+branches:
+  only:
+    - master
+    - /^greenkeeper/.*$/
+notifications:
+  email: false
+node_js:
+  - "8.4"
+  - "8.3"
+  - "8.2"
+  - "8.1"
+  - "8.0"
+  - "7.10"
+  - "7.9"
+  - "7.8"
+  - "7.7"
+  - "7.6"
+  - "7.5"
+  - "7.4"
+  - "7.3"
+  - "7.2"
+  - "7.1"
+  - "7.0"
+  - "6.9"
+  - "6.8"
+  - "6.7"
+  - "6.6"
+  - "6.5"
+  - "6.4"
+  - "6.3"
+  - "6.2"
+  - "6.1"
+  - "6.0"
+  - "5.12"
+  - "5.11"
+  - "5.10"
+  - "5.9"
+  - "5.8"
+  - "5.7"
+  - "5.6"
+  - "5.5"
+  - "5.4"
+  - "5.3"
+  - "5.2"
+  - "5.1"
+  - "5.0"
+  - "4.4"
+  - "4.3"
+  - "4.2"
+  - "4.1"
+  - "4.0"
+  - "iojs-v3.3"
+  - "iojs-v3.2"
+  - "iojs-v3.1"
+  - "iojs-v3.0"
+  - "iojs-v2.5"
+  - "iojs-v2.4"
+  - "iojs-v2.3"
+  - "iojs-v2.2"
+  - "iojs-v2.1"
+  - "iojs-v2.0"
+  - "iojs-v1.8"
+  - "iojs-v1.7"
+  - "iojs-v1.6"
+  - "iojs-v1.5"
+  - "iojs-v1.4"
+  - "iojs-v1.3"
+  - "iojs-v1.2"
+  - "iojs-v1.1"
+  - "iojs-v1.0"
+  - "0.12"
+  - "0.11"
+  - "0.10"
+  - "0.9"
+  - "0.8"
+  - "0.6"
+  - "0.4"
+before_install:
+  - 'if [ "${TRAVIS_NODE_VERSION}" = "0.6" ]; then npm install -g npm@1.3 ; elif [ "${TRAVIS_NODE_VERSION}" != "0.9" ]; then case "$(npm --version)" in 1.*) npm install -g npm@1.4.28 ;; 2.*) npm install -g npm@2 ;; esac ; fi'
+  - 'if [ "${TRAVIS_NODE_VERSION%${TRAVIS_NODE_VERSION#[0-9]}}" = "0" ] || [ "${TRAVIS_NODE_VERSION:0:4}" = "iojs" ]; then npm install -g npm@4.5 ; elif [ "${TRAVIS_NODE_VERSION}" != "0.6" ] && [ "${TRAVIS_NODE_VERSION}" != "0.9" ]; then npm install -g npm; fi'
+install:
+  - 'if [ "${TRAVIS_NODE_VERSION}" = "0.6" ]; then nvm install 0.8 && npm install -g npm@1.3 && npm install -g npm@1.4.28 && npm install -g npm@2 && npm install && nvm use --delete-prefix "${TRAVIS_NODE_VERSION}"; else npm install; fi;'
+script:
+  - 'npm test'
+matrix:
+  fast_finish: true
+  allow_failures:
+    - node_js: "0.11"
+    - node_js: "0.9"
+    - node_js: "0.6"
+    - node_js: "0.4"
diff --git a/advancedcontentfilter/vendor/npm-asset/has-to-string-tag-x/.uglifyjsrc.json b/advancedcontentfilter/vendor/npm-asset/has-to-string-tag-x/.uglifyjsrc.json
new file mode 100644 (file)
index 0000000..2d26277
--- /dev/null
@@ -0,0 +1,17 @@
+{
+  "warnings": false,
+  "parse": {},
+  "compress": {
+    "keep_fnames": true
+  },
+  "mangle": false,
+  "output": {
+    "ascii_only": true,
+    "beautify": false,
+    "comments": "some"
+  },
+  "sourceMap": {},
+  "nameCache": null,
+  "toplevel": false,
+  "ie8": true
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/has-to-string-tag-x/LICENSE b/advancedcontentfilter/vendor/npm-asset/has-to-string-tag-x/LICENSE
new file mode 100644 (file)
index 0000000..73c4669
--- /dev/null
@@ -0,0 +1,21 @@
+https://opensource.org/licenses/MIT
+
+Copyright (c) 2015-2017 Graham Fairweather.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/advancedcontentfilter/vendor/npm-asset/has-to-string-tag-x/README.md b/advancedcontentfilter/vendor/npm-asset/has-to-string-tag-x/README.md
new file mode 100644 (file)
index 0000000..b545e80
--- /dev/null
@@ -0,0 +1,37 @@
+<a href="https://travis-ci.org/Xotic750/has-to-string-tag-x"
+   title="Travis status">
+<img
+   src="https://travis-ci.org/Xotic750/has-to-string-tag-x.svg?branch=master"
+   alt="Travis status" height="18"/>
+</a>
+<a href="https://david-dm.org/Xotic750/has-to-string-tag-x"
+   title="Dependency status">
+<img src="https://david-dm.org/Xotic750/has-to-string-tag-x.svg"
+   alt="Dependency status" height="18"/>
+</a>
+<a href="https://david-dm.org/Xotic750/has-to-string-tag-x#info=devDependencies"
+   title="devDependency status">
+<img src="https://david-dm.org/Xotic750/has-to-string-tag-x/dev-status.svg"
+   alt="devDependency status" height="18"/>
+</a>
+<a href="https://badge.fury.io/js/has-to-string-tag-x" title="npm version">
+<img src="https://badge.fury.io/js/has-to-string-tag-x.svg"
+   alt="npm version" height="18"/>
+</a>
+<a name="module_has-to-string-tag-x"></a>
+
+## has-to-string-tag-x
+Tests if ES6 @@toStringTag is supported.
+
+**See**: [26.3.1 @@toStringTag](http://www.ecma-international.org/ecma-262/6.0/#sec-@@tostringtag)  
+**Version**: 1.4.1  
+**Author**: Xotic750 <Xotic750@gmail.com>  
+**License**: [MIT](&lt;https://opensource.org/licenses/MIT&gt;)  
+**Copyright**: Xotic750  
+<a name="exp_module_has-to-string-tag-x--module.exports"></a>
+
+### `module.exports` : <code>boolean</code> ⏏
+Indicates if `Symbol.toStringTag`exists and is the correct type.
+`true`, if it exists and is the correct type, otherwise `false`.
+
+**Kind**: Exported member  
diff --git a/advancedcontentfilter/vendor/npm-asset/has-to-string-tag-x/badges.html b/advancedcontentfilter/vendor/npm-asset/has-to-string-tag-x/badges.html
new file mode 100644 (file)
index 0000000..a3b8352
--- /dev/null
@@ -0,0 +1,20 @@
+<a href="https://travis-ci.org/Xotic750/@{PACKAGE-NAME}"
+   title="Travis status">
+<img
+   src="https://travis-ci.org/Xotic750/@{PACKAGE-NAME}.svg?branch=master"
+   alt="Travis status" height="18"/>
+</a>
+<a href="https://david-dm.org/Xotic750/@{PACKAGE-NAME}"
+   title="Dependency status">
+<img src="https://david-dm.org/Xotic750/@{PACKAGE-NAME}.svg"
+   alt="Dependency status" height="18"/>
+</a>
+<a href="https://david-dm.org/Xotic750/@{PACKAGE-NAME}#info=devDependencies"
+   title="devDependency status">
+<img src="https://david-dm.org/Xotic750/@{PACKAGE-NAME}/dev-status.svg"
+   alt="devDependency status" height="18"/>
+</a>
+<a href="https://badge.fury.io/js/@{PACKAGE-NAME}" title="npm version">
+<img src="https://badge.fury.io/js/@{PACKAGE-NAME}.svg"
+   alt="npm version" height="18"/>
+</a>
diff --git a/advancedcontentfilter/vendor/npm-asset/has-to-string-tag-x/index.js b/advancedcontentfilter/vendor/npm-asset/has-to-string-tag-x/index.js
new file mode 100644 (file)
index 0000000..abc608d
--- /dev/null
@@ -0,0 +1,19 @@
+/**
+ * @file Tests if ES6 @@toStringTag is supported.
+ * @see {@link http://www.ecma-international.org/ecma-262/6.0/#sec-@@tostringtag|26.3.1 @@toStringTag}
+ * @version 1.4.1
+ * @author Xotic750 <Xotic750@gmail.com>
+ * @copyright  Xotic750
+ * @license {@link <https://opensource.org/licenses/MIT> MIT}
+ * @module has-to-string-tag-x
+ */
+
+'use strict';
+
+/**
+ * Indicates if `Symbol.toStringTag`exists and is the correct type.
+ * `true`, if it exists and is the correct type, otherwise `false`.
+ *
+ * @type boolean
+ */
+module.exports = require('has-symbol-support-x') && typeof Symbol.toStringTag === 'symbol';
diff --git a/advancedcontentfilter/vendor/npm-asset/has-to-string-tag-x/lib/has-to-string-tag-x.js b/advancedcontentfilter/vendor/npm-asset/has-to-string-tag-x/lib/has-to-string-tag-x.js
new file mode 100644 (file)
index 0000000..52ef849
--- /dev/null
@@ -0,0 +1,43 @@
+(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.returnExports = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(_dereq_,module,exports){
+/**
+ * @file Tests if ES6 @@toStringTag is supported.
+ * @see {@link http://www.ecma-international.org/ecma-262/6.0/#sec-@@tostringtag|26.3.1 @@toStringTag}
+ * @version 1.4.1
+ * @author Xotic750 <Xotic750@gmail.com>
+ * @copyright  Xotic750
+ * @license {@link <https://opensource.org/licenses/MIT> MIT}
+ * @module has-to-string-tag-x
+ */
+
+'use strict';
+
+/**
+ * Indicates if `Symbol.toStringTag`exists and is the correct type.
+ * `true`, if it exists and is the correct type, otherwise `false`.
+ *
+ * @type boolean
+ */
+module.exports = _dereq_('has-symbol-support-x') && typeof Symbol.toStringTag === 'symbol';
+
+},{"has-symbol-support-x":2}],2:[function(_dereq_,module,exports){
+/**
+ * @file Tests if ES6 Symbol is supported.
+ * @version 1.4.1
+ * @author Xotic750 <Xotic750@gmail.com>
+ * @copyright  Xotic750
+ * @license {@link <https://opensource.org/licenses/MIT> MIT}
+ * @module has-symbol-support-x
+ */
+
+'use strict';
+
+/**
+ * Indicates if `Symbol`exists and creates the correct type.
+ * `true`, if it exists and creates the correct type, otherwise `false`.
+ *
+ * @type boolean
+ */
+module.exports = typeof Symbol === 'function' && typeof Symbol('') === 'symbol';
+
+},{}]},{},[1])(1)
+});
\ No newline at end of file
diff --git a/advancedcontentfilter/vendor/npm-asset/has-to-string-tag-x/lib/has-to-string-tag-x.min.js b/advancedcontentfilter/vendor/npm-asset/has-to-string-tag-x/lib/has-to-string-tag-x.min.js
new file mode 100644 (file)
index 0000000..307f21a
--- /dev/null
@@ -0,0 +1,18 @@
+!function(f){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=f();else if("function"==typeof define&&define.amd)define([],f);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).returnExports=f()}}(function(){return function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a="function"==typeof require&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n||e)},l,l.exports,e,t,n,r)}return n[o].exports}for(var i="function"==typeof require&&require,o=0;o<r.length;o++)s(r[o]);return s}({1:[function(_dereq_,module,exports){/**
+ * @file Tests if ES6 @@toStringTag is supported.
+ * @see {@link http://www.ecma-international.org/ecma-262/6.0/#sec-@@tostringtag|26.3.1 @@toStringTag}
+ * @version 1.4.1
+ * @author Xotic750 <Xotic750@gmail.com>
+ * @copyright  Xotic750
+ * @license {@link <https://opensource.org/licenses/MIT> MIT}
+ * @module has-to-string-tag-x
+ */
+"use strict";module.exports=_dereq_("has-symbol-support-x")&&"symbol"==typeof Symbol.toStringTag},{"has-symbol-support-x":2}],2:[function(_dereq_,module,exports){/**
+ * @file Tests if ES6 Symbol is supported.
+ * @version 1.4.1
+ * @author Xotic750 <Xotic750@gmail.com>
+ * @copyright  Xotic750
+ * @license {@link <https://opensource.org/licenses/MIT> MIT}
+ * @module has-symbol-support-x
+ */
+"use strict";module.exports="function"==typeof Symbol&&"symbol"==typeof Symbol("")},{}]},{},[1])(1)});
\ No newline at end of file
diff --git a/advancedcontentfilter/vendor/npm-asset/has-to-string-tag-x/lib/has-to-string-tag-x.min.js.map b/advancedcontentfilter/vendor/npm-asset/has-to-string-tag-x/lib/has-to-string-tag-x.min.js.map
new file mode 100644 (file)
index 0000000..772a237
--- /dev/null
@@ -0,0 +1 @@
+{"version":3,"sources":["lib/has-to-string-tag-x.js"],"names":["f","exports","module","define","amd","window","global","self","this","returnExports","e","t","n","r","s","o","u","a","require","i","Error","code","l","call","length","1","_dereq_","Symbol","toStringTag","has-symbol-support-x","2"],"mappings":"CAAA,SAAUA,GAAG,GAAoB,iBAAVC,SAAoC,oBAATC,OAAsBA,OAAOD,QAAQD,SAAS,GAAmB,mBAATG,QAAqBA,OAAOC,IAAKD,UAAUH,OAAO,EAA0B,oBAATK,OAAwBA,OAA+B,oBAATC,OAAwBA,OAA6B,oBAAPC,KAAsBA,KAAYC,MAAOC,cAAgBT,KAAlU,CAAyU,WAAqC,OAAO,SAAUU,EAAEC,EAAEC,EAAEC,GAAG,SAASC,EAAEC,EAAEC,GAAG,IAAIJ,EAAEG,GAAG,CAAC,IAAIJ,EAAEI,GAAG,CAAC,IAAIE,EAAkB,mBAATC,SAAqBA,QAAQ,IAAIF,GAAGC,EAAE,OAAOA,EAAEF,GAAE,GAAI,GAAGI,EAAE,OAAOA,EAAEJ,GAAE,GAAI,IAAIf,EAAE,IAAIoB,MAAM,uBAAuBL,EAAE,KAAK,MAAMf,EAAEqB,KAAK,mBAAmBrB,EAAE,IAAIsB,EAAEV,EAAEG,IAAId,YAAYU,EAAEI,GAAG,GAAGQ,KAAKD,EAAErB,QAAQ,SAASS,GAAG,IAAIE,EAAED,EAAEI,GAAG,GAAGL,GAAG,OAAOI,EAAEF,GAAIF,IAAIY,EAAEA,EAAErB,QAAQS,EAAEC,EAAEC,EAAEC,GAAG,OAAOD,EAAEG,GAAGd,QAAkD,IAAI,IAA1CkB,EAAkB,mBAATD,SAAqBA,QAAgBH,EAAE,EAAEA,EAAEF,EAAEW,OAAOT,IAAID,EAAED,EAAEE,IAAI,OAAOD,EAAvb,EAA4bW,GAAG,SAASC,QAAQxB,OAAOD;;;;;;;;;AAW50B,aAQAC,OAAOD,QAAUyB,QAAQ,yBAAyD,iBAAvBC,OAAOC,cAE/DC,uBAAuB,IAAIC,GAAG,SAASJ,QAAQxB,OAAOD;;;;;;;;AAUzD,aAQAC,OAAOD,QAA4B,mBAAX0B,QAA+C,iBAAfA,OAAO,cAEpD,IAAI"}
\ No newline at end of file
diff --git a/advancedcontentfilter/vendor/npm-asset/has-to-string-tag-x/package.json b/advancedcontentfilter/vendor/npm-asset/has-to-string-tag-x/package.json
new file mode 100644 (file)
index 0000000..0aaca52
--- /dev/null
@@ -0,0 +1,87 @@
+{
+  "name": "has-to-string-tag-x",
+  "version": "1.4.1",
+  "description": "Tests if ES6 @@toStringTag is supported.",
+  "homepage": "https://github.com/Xotic750/has-to-string-tag-x",
+  "author": {
+    "name": "Graham Fairweather",
+    "email": "xotic750@gmail.com"
+  },
+  "copyright": "Copyright (c) 2015-2017",
+  "keywords": [
+    "ES6",
+    "hasToStringTag",
+    "module",
+    "javascript",
+    "nodejs",
+    "browser"
+  ],
+  "main": "index.js",
+  "engines": {
+    "node": "*"
+  },
+  "license": "MIT",
+  "repository": {
+    "type": "git",
+    "url": "https://github.com/Xotic750/has-to-string-tag-x.git"
+  },
+  "bugs": {
+    "url": "https://github.com/Xotic750/has-to-string-tag-x/issues"
+  },
+  "dependencies": {
+    "has-symbol-support-x": "^1.4.1"
+  },
+  "devDependencies": {
+    "@xotic750/eslint-config-standard-x": "^2.2.1",
+    "browserify": "^14.4.0",
+    "browserify-derequire": "^0.9.4",
+    "cross-env": "^5.0.1",
+    "es5-shim": "^4.5.9",
+    "es6-shim": "^0.35.3",
+    "es7-shim": "^6.0.0",
+    "eslint": "^4.2.0",
+    "eslint-plugin-compat": "^1.0.4",
+    "eslint-plugin-css-modules": "^2.7.2",
+    "eslint-plugin-eslint-comments": "^1.0.2",
+    "eslint-plugin-jsdoc": "^3.1.1",
+    "eslint-plugin-json": "^1.2.0",
+    "eslint-plugin-no-use-extend-native": "^0.3.12",
+    "husky": "^0.13.4",
+    "jasmine-node": "^1.14.5",
+    "jsdoc-to-markdown": "^3.0.0",
+    "json3": "^3.3.2",
+    "make-jasmine-spec-runner-html": "^1.3.0",
+    "ncp": "^2.0.0",
+    "nodemon": "^1.11.0",
+    "nsp": "^2.6.3",
+    "parallelshell": "^3.0.1",
+    "replace-x": "^1.5.0",
+    "rimraf": "^2.6.1",
+    "serve": "^6.0.2",
+    "uglify-js": "^3.0.24"
+  },
+  "scripts": {
+    "clean": "rimraf README.md lib/*",
+    "clean:jasmine": "rimraf tests/index.html tests/run.js",
+    "clean:all": "npm run clean:jasmine && npm run clean",
+    "build": "npm run clean && npm run lint && npm run browserify && npm run uglify && npm run docs && npm test && npm run security",
+    "build:jasmine": "npm run clean:jasmine && make-jasmine-spec-runner-html",
+    "build:setver": "replace-x \" @version .*\" \" @version $(node -p -e \"require('./package.json').version\")\" index.js",
+    "build:name": "replace-x \" @module .*\" \" @module $(node -p -e \"require('./package.json').name\")\" index.js",
+    "build:description": "replace-x \" @file .*\" \" @file $(node -p -e \"require('./package.json').description\")\" index.js",
+    "build:replace": "npm run build:setver && npm run build:name && npm run build:description",
+    "production": "npm run clean:all && npm run build:jasmine && npm run build:replace && npm run build",
+    "start": "parallelshell \"serve\" \"nodemon --watch index.js --exec 'npm run build'\"",
+    "docs:name": "replace-x \"@{PACKAGE-NAME}\" \"$(node -p -e \"require('./package.json').name\")\" README.md",
+    "docs:badges": "ncp badges.html README.md && npm run docs:name",
+    "docs": "npm run docs:badges && jsdoc2md --name-format --example-lang js index.js >> README.md",
+    "lint": "eslint *.js tests/spec/*.js",
+    "lint-fix": "npm run lint -- --fix",
+    "security": "nsp check",
+    "test": "jasmine-node --matchall tests/spec/",
+    "browserify": "browserify -p browserify-derequire -e index.js -o lib/has-to-string-tag-x.js -u 'crypto' -s returnExports",
+    "uglify": "uglifyjs lib/has-to-string-tag-x.js -o lib/has-to-string-tag-x.min.js --config-file .uglifyjsrc.json",
+    "precommit": "npm run production",
+    "prepush": "npm run production"
+  }
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/http-cache-semantics/README.md b/advancedcontentfilter/vendor/npm-asset/http-cache-semantics/README.md
new file mode 100644 (file)
index 0000000..99069fc
--- /dev/null
@@ -0,0 +1,177 @@
+# Can I cache this? [![Build Status](https://travis-ci.org/pornel/http-cache-semantics.svg?branch=master)](https://travis-ci.org/pornel/http-cache-semantics)
+
+`CachePolicy` tells when responses can be reused from a cache, taking into account [HTTP RFC 7234](http://httpwg.org/specs/rfc7234.html) rules for user agents and shared caches. It's aware of many tricky details such as the `Vary` header, proxy revalidation, and authenticated responses.
+
+## Usage
+
+Cacheability of an HTTP response depends on how it was requested, so both `request` and `response` are required to create the policy.
+
+```js
+const policy = new CachePolicy(request, response, options);
+
+if (!policy.storable()) {
+    // throw the response away, it's not usable at all
+    return;
+}
+
+// Cache the data AND the policy object in your cache
+// (this is pseudocode, roll your own cache (lru-cache package works))
+letsPretendThisIsSomeCache.set(request.url, {policy, response}, policy.timeToLive());
+```
+
+```js
+// And later, when you receive a new request:
+const {policy, response} = letsPretendThisIsSomeCache.get(newRequest.url);
+
+// It's not enough that it exists in the cache, it has to match the new request, too:
+if (policy && policy.satisfiesWithoutRevalidation(newRequest)) {
+    // OK, the previous response can be used to respond to the `newRequest`.
+    // Response headers have to be updated, e.g. to add Age and remove uncacheable headers.
+    response.headers = policy.responseHeaders();
+    return response;
+}
+```
+
+It may be surprising, but it's not enough for an HTTP response to be [fresh](#yo-fresh) to satisfy a request. It may need to match request headers specified in `Vary`. Even a matching fresh response may still not be usable if the new request restricted cacheability, etc.
+
+The key method is `satisfiesWithoutRevalidation(newRequest)`, which checks whether the `newRequest` is compatible with the original request and whether all caching conditions are met.
+
+### Constructor options
+
+Request and response must have a `headers` property with all header names in lower case. `url`, `status` and `method` are optional (defaults are any URL, status `200`, and `GET` method).
+
+```js
+const request = {
+    url: '/',
+    method: 'GET',
+    headers: {
+        accept: '*/*',
+    },
+};
+
+const response = {
+    status: 200,
+    headers: {
+        'cache-control': 'public, max-age=7234',
+    },
+};
+
+const options = {
+    shared: true,
+    cacheHeuristic: 0.1,
+    immutableMinTimeToLive: 24*3600*1000, // 24h
+    ignoreCargoCult: false,
+};
+```
+
+If `options.shared` is `true` (default), then the response is evaluated from a perspective of a shared cache (i.e. `private` is not cacheable and `s-maxage` is respected). If `options.shared` is `false`, then the response is evaluated from a perspective of a single-user cache (i.e. `private` is cacheable and `s-maxage` is ignored).
+
+`options.cacheHeuristic` is a fraction of response's age that is used as a fallback cache duration. The default is 0.1 (10%), e.g. if a file hasn't been modified for 100 days, it'll be cached for 100*0.1 = 10 days.
+
+`options.immutableMinTimeToLive` is a number of milliseconds to assume as the default time to cache responses with `Cache-Control: immutable`. Note that [per RFC](http://httpwg.org/http-extensions/immutable.html) these can become stale, so `max-age` still overrides the default.
+
+If `options.ignoreCargoCult` is true, common anti-cache directives will be completely ignored if the non-standard `pre-check` and `post-check` directives are present. These two useless directives are most commonly found in bad StackOverflow answers and PHP's "session limiter" defaults.
+
+### `storable()`
+
+Returns `true` if the response can be stored in a cache. If it's `false` then you MUST NOT store either the request or the response.
+
+### `satisfiesWithoutRevalidation(newRequest)`
+
+This is the most important method. Use this method to check whether the cached response is still fresh in the context of the new request.
+
+If it returns `true`, then the given `request` matches the original response this cache policy has been created with, and the response can be reused without contacting the server. Note that the old response can't be returned without being updated, see `responseHeaders()`.
+
+If it returns `false`, then the response may not be matching at all (e.g. it's for a different URL or method), or may require to be refreshed first (see `revalidationHeaders()`).
+
+### `responseHeaders()`
+
+Returns updated, filtered set of response headers to return to clients receiving the cached response. This function is necessary, because proxies MUST always remove hop-by-hop headers (such as `TE` and `Connection`) and update response's `Age` to avoid doubling cache time.
+
+```js
+cachedResponse.headers = cachePolicy.responseHeaders(cachedResponse);
+```
+
+### `timeToLive()`
+
+Returns approximate time in *milliseconds* until the response becomes stale (i.e. not fresh).
+
+After that time (when `timeToLive() <= 0`) the response might not be usable without revalidation. However, there are exceptions, e.g. a client can explicitly allow stale responses, so always check with `satisfiesWithoutRevalidation()`.
+
+### `toObject()`/`fromObject(json)`
+
+Chances are you'll want to store the `CachePolicy` object along with the cached response. `obj = policy.toObject()` gives a plain JSON-serializable object. `policy = CachePolicy.fromObject(obj)` creates an instance from it.
+
+### Refreshing stale cache (revalidation)
+
+When a cached response has expired, it can be made fresh again by making a request to the origin server. The server may respond with status 304 (Not Modified) without sending the response body again, saving bandwidth.
+
+The following methods help perform the update efficiently and correctly.
+
+#### `revalidationHeaders(newRequest)`
+
+Returns updated, filtered set of request headers to send to the origin server to check if the cached response can be reused. These headers allow the origin server to return status 304 indicating the response is still fresh. All headers unrelated to caching are passed through as-is.
+
+Use this method when updating cache from the origin server.
+
+```js
+updateRequest.headers = cachePolicy.revalidationHeaders(updateRequest);
+```
+
+#### `revalidatedPolicy(revalidationRequest, revalidationResponse)`
+
+Use this method to update the cache after receiving a new response from the origin server. It returns an object with two keys:
+
+* `policy` — A new `CachePolicy` with HTTP headers updated from `revalidationResponse`. You can always replace the old cached `CachePolicy` with the new one.
+* `modified` — Boolean indicating whether the response body has changed.
+   * If `false`, then a valid 304 Not Modified response has been received, and you can reuse the old cached response body.
+   * If `true`, you should use new response's body (if present), or make another request to the origin server without any conditional headers (i.e. don't use `revalidationHeaders()` this time) to get the new resource.
+
+```js
+// When serving requests from cache:
+const {oldPolicy, oldResponse} = letsPretendThisIsSomeCache.get(newRequest.url);
+
+if (!oldPolicy.satisfiesWithoutRevalidation(newRequest)) {
+    // Change the request to ask the origin server if the cached response can be used
+    newRequest.headers = oldPolicy.revalidationHeaders(newRequest);
+
+    // Send request to the origin server. The server may respond with status 304
+    const newResponse = await makeRequest(newResponse);
+
+    // Create updated policy and combined response from the old and new data
+    const {policy, modified} = oldPolicy.revalidatedPolicy(newRequest, newResponse);
+    const response = modified ? newResponse : oldResponse;
+
+    // Update the cache with the newer/fresher response
+    letsPretendThisIsSomeCache.set(newRequest.url, {policy, response}, policy.timeToLive());
+
+    // And proceed returning cached response as usual
+    response.headers = policy.responseHeaders();
+    return response;
+}
+```
+
+# Yo, FRESH
+
+![satisfiesWithoutRevalidation](fresh.jpg)
+
+## Used by
+
+* [ImageOptim API](https://imageoptim.com/api), [make-fetch-happen](https://github.com/zkat/make-fetch-happen), [cacheable-request](https://www.npmjs.com/package/cacheable-request), [npm/registry-fetch](https://github.com/npm/registry-fetch), [etc.](https://github.com/pornel/http-cache-semantics/network/dependents)
+
+## Implemented
+
+* `Cache-Control` response header with all the quirks.
+* `Expires` with check for bad clocks.
+* `Pragma` response header.
+* `Age` response header.
+* `Vary` response header.
+* Default cacheability of statuses and methods.
+* Requests for stale data.
+* Filtering of hop-by-hop headers.
+* Basic revalidation request
+
+## Unimplemented
+
+* Merging of range requests, If-Range (but correctly supports them as non-cacheable)
+* Revalidation of multiple representations
diff --git a/advancedcontentfilter/vendor/npm-asset/http-cache-semantics/node4/index.js b/advancedcontentfilter/vendor/npm-asset/http-cache-semantics/node4/index.js
new file mode 100644 (file)
index 0000000..bcdaebe
--- /dev/null
@@ -0,0 +1,559 @@
+'use strict';
+// rfc7231 6.1
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+var statusCodeCacheableByDefault = [200, 203, 204, 206, 300, 301, 404, 405, 410, 414, 501];
+
+// This implementation does not understand partial responses (206)
+var understoodStatuses = [200, 203, 204, 300, 301, 302, 303, 307, 308, 404, 405, 410, 414, 501];
+
+var hopByHopHeaders = { 'connection': true, 'keep-alive': true, 'proxy-authenticate': true, 'proxy-authorization': true, 'te': true, 'trailer': true, 'transfer-encoding': true, 'upgrade': true };
+var excludedFromRevalidationUpdate = {
+    // Since the old body is reused, it doesn't make sense to change properties of the body
+    'content-length': true, 'content-encoding': true, 'transfer-encoding': true,
+    'content-range': true
+};
+
+function parseCacheControl(header) {
+    var cc = {};
+    if (!header) return cc;
+
+    // TODO: When there is more than one value present for a given directive (e.g., two Expires header fields, multiple Cache-Control: max-age directives),
+    // the directive's value is considered invalid. Caches are encouraged to consider responses that have invalid freshness information to be stale
+    var parts = header.trim().split(/\s*,\s*/); // TODO: lame parsing
+    for (var _iterator = parts, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {
+        var _ref;
+
+        if (_isArray) {
+            if (_i >= _iterator.length) break;
+            _ref = _iterator[_i++];
+        } else {
+            _i = _iterator.next();
+            if (_i.done) break;
+            _ref = _i.value;
+        }
+
+        var part = _ref;
+
+        var _part$split = part.split(/\s*=\s*/, 2),
+            k = _part$split[0],
+            v = _part$split[1];
+
+        cc[k] = v === undefined ? true : v.replace(/^"|"$/g, ''); // TODO: lame unquoting
+    }
+
+    return cc;
+}
+
+function formatCacheControl(cc) {
+    var parts = [];
+    for (var k in cc) {
+        var v = cc[k];
+        parts.push(v === true ? k : k + '=' + v);
+    }
+    if (!parts.length) {
+        return undefined;
+    }
+    return parts.join(', ');
+}
+
+module.exports = function () {
+    function CachePolicy(req, res) {
+        var _ref2 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},
+            shared = _ref2.shared,
+            cacheHeuristic = _ref2.cacheHeuristic,
+            immutableMinTimeToLive = _ref2.immutableMinTimeToLive,
+            ignoreCargoCult = _ref2.ignoreCargoCult,
+            _fromObject = _ref2._fromObject;
+
+        _classCallCheck(this, CachePolicy);
+
+        if (_fromObject) {
+            this._fromObject(_fromObject);
+            return;
+        }
+
+        if (!res || !res.headers) {
+            throw Error("Response headers missing");
+        }
+        this._assertRequestHasHeaders(req);
+
+        this._responseTime = this.now();
+        this._isShared = shared !== false;
+        this._cacheHeuristic = undefined !== cacheHeuristic ? cacheHeuristic : 0.1; // 10% matches IE
+        this._immutableMinTtl = undefined !== immutableMinTimeToLive ? immutableMinTimeToLive : 24 * 3600 * 1000;
+
+        this._status = 'status' in res ? res.status : 200;
+        this._resHeaders = res.headers;
+        this._rescc = parseCacheControl(res.headers['cache-control']);
+        this._method = 'method' in req ? req.method : 'GET';
+        this._url = req.url;
+        this._host = req.headers.host;
+        this._noAuthorization = !req.headers.authorization;
+        this._reqHeaders = res.headers.vary ? req.headers : null; // Don't keep all request headers if they won't be used
+        this._reqcc = parseCacheControl(req.headers['cache-control']);
+
+        // Assume that if someone uses legacy, non-standard uncecessary options they don't understand caching,
+        // so there's no point stricly adhering to the blindly copy&pasted directives.
+        if (ignoreCargoCult && "pre-check" in this._rescc && "post-check" in this._rescc) {
+            delete this._rescc['pre-check'];
+            delete this._rescc['post-check'];
+            delete this._rescc['no-cache'];
+            delete this._rescc['no-store'];
+            delete this._rescc['must-revalidate'];
+            this._resHeaders = Object.assign({}, this._resHeaders, { 'cache-control': formatCacheControl(this._rescc) });
+            delete this._resHeaders.expires;
+            delete this._resHeaders.pragma;
+        }
+
+        // When the Cache-Control header field is not present in a request, caches MUST consider the no-cache request pragma-directive
+        // as having the same effect as if "Cache-Control: no-cache" were present (see Section 5.2.1).
+        if (!res.headers['cache-control'] && /no-cache/.test(res.headers.pragma)) {
+            this._rescc['no-cache'] = true;
+        }
+    }
+
+    CachePolicy.prototype.now = function now() {
+        return Date.now();
+    };
+
+    CachePolicy.prototype.storable = function storable() {
+        // The "no-store" request directive indicates that a cache MUST NOT store any part of either this request or any response to it.
+        return !!(!this._reqcc['no-store'] && (
+        // A cache MUST NOT store a response to any request, unless:
+        // The request method is understood by the cache and defined as being cacheable, and
+        'GET' === this._method || 'HEAD' === this._method || 'POST' === this._method && this._hasExplicitExpiration()) &&
+        // the response status code is understood by the cache, and
+        understoodStatuses.indexOf(this._status) !== -1 &&
+        // the "no-store" cache directive does not appear in request or response header fields, and
+        !this._rescc['no-store'] && (
+        // the "private" response directive does not appear in the response, if the cache is shared, and
+        !this._isShared || !this._rescc.private) && (
+        // the Authorization header field does not appear in the request, if the cache is shared,
+        !this._isShared || this._noAuthorization || this._allowsStoringAuthenticated()) && (
+        // the response either:
+
+        // contains an Expires header field, or
+        this._resHeaders.expires ||
+        // contains a max-age response directive, or
+        // contains a s-maxage response directive and the cache is shared, or
+        // contains a public response directive.
+        this._rescc.public || this._rescc['max-age'] || this._rescc['s-maxage'] ||
+        // has a status code that is defined as cacheable by default
+        statusCodeCacheableByDefault.indexOf(this._status) !== -1));
+    };
+
+    CachePolicy.prototype._hasExplicitExpiration = function _hasExplicitExpiration() {
+        // 4.2.1 Calculating Freshness Lifetime
+        return this._isShared && this._rescc['s-maxage'] || this._rescc['max-age'] || this._resHeaders.expires;
+    };
+
+    CachePolicy.prototype._assertRequestHasHeaders = function _assertRequestHasHeaders(req) {
+        if (!req || !req.headers) {
+            throw Error("Request headers missing");
+        }
+    };
+
+    CachePolicy.prototype.satisfiesWithoutRevalidation = function satisfiesWithoutRevalidation(req) {
+        this._assertRequestHasHeaders(req);
+
+        // When presented with a request, a cache MUST NOT reuse a stored response, unless:
+        // the presented request does not contain the no-cache pragma (Section 5.4), nor the no-cache cache directive,
+        // unless the stored response is successfully validated (Section 4.3), and
+        var requestCC = parseCacheControl(req.headers['cache-control']);
+        if (requestCC['no-cache'] || /no-cache/.test(req.headers.pragma)) {
+            return false;
+        }
+
+        if (requestCC['max-age'] && this.age() > requestCC['max-age']) {
+            return false;
+        }
+
+        if (requestCC['min-fresh'] && this.timeToLive() < 1000 * requestCC['min-fresh']) {
+            return false;
+        }
+
+        // the stored response is either:
+        // fresh, or allowed to be served stale
+        if (this.stale()) {
+            var allowsStale = requestCC['max-stale'] && !this._rescc['must-revalidate'] && (true === requestCC['max-stale'] || requestCC['max-stale'] > this.age() - this.maxAge());
+            if (!allowsStale) {
+                return false;
+            }
+        }
+
+        return this._requestMatches(req, false);
+    };
+
+    CachePolicy.prototype._requestMatches = function _requestMatches(req, allowHeadMethod) {
+        // The presented effective request URI and that of the stored response match, and
+        return (!this._url || this._url === req.url) && this._host === req.headers.host && (
+        // the request method associated with the stored response allows it to be used for the presented request, and
+        !req.method || this._method === req.method || allowHeadMethod && 'HEAD' === req.method) &&
+        // selecting header fields nominated by the stored response (if any) match those presented, and
+        this._varyMatches(req);
+    };
+
+    CachePolicy.prototype._allowsStoringAuthenticated = function _allowsStoringAuthenticated() {
+        //  following Cache-Control response directives (Section 5.2.2) have such an effect: must-revalidate, public, and s-maxage.
+        return this._rescc['must-revalidate'] || this._rescc.public || this._rescc['s-maxage'];
+    };
+
+    CachePolicy.prototype._varyMatches = function _varyMatches(req) {
+        if (!this._resHeaders.vary) {
+            return true;
+        }
+
+        // A Vary header field-value of "*" always fails to match
+        if (this._resHeaders.vary === '*') {
+            return false;
+        }
+
+        var fields = this._resHeaders.vary.trim().toLowerCase().split(/\s*,\s*/);
+        for (var _iterator2 = fields, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) {
+            var _ref3;
+
+            if (_isArray2) {
+                if (_i2 >= _iterator2.length) break;
+                _ref3 = _iterator2[_i2++];
+            } else {
+                _i2 = _iterator2.next();
+                if (_i2.done) break;
+                _ref3 = _i2.value;
+            }
+
+            var name = _ref3;
+
+            if (req.headers[name] !== this._reqHeaders[name]) return false;
+        }
+        return true;
+    };
+
+    CachePolicy.prototype._copyWithoutHopByHopHeaders = function _copyWithoutHopByHopHeaders(inHeaders) {
+        var headers = {};
+        for (var name in inHeaders) {
+            if (hopByHopHeaders[name]) continue;
+            headers[name] = inHeaders[name];
+        }
+        // 9.1.  Connection
+        if (inHeaders.connection) {
+            var tokens = inHeaders.connection.trim().split(/\s*,\s*/);
+            for (var _iterator3 = tokens, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) {
+                var _ref4;
+
+                if (_isArray3) {
+                    if (_i3 >= _iterator3.length) break;
+                    _ref4 = _iterator3[_i3++];
+                } else {
+                    _i3 = _iterator3.next();
+                    if (_i3.done) break;
+                    _ref4 = _i3.value;
+                }
+
+                var _name = _ref4;
+
+                delete headers[_name];
+            }
+        }
+        if (headers.warning) {
+            var warnings = headers.warning.split(/,/).filter(function (warning) {
+                return !/^\s*1[0-9][0-9]/.test(warning);
+            });
+            if (!warnings.length) {
+                delete headers.warning;
+            } else {
+                headers.warning = warnings.join(',').trim();
+            }
+        }
+        return headers;
+    };
+
+    CachePolicy.prototype.responseHeaders = function responseHeaders() {
+        var headers = this._copyWithoutHopByHopHeaders(this._resHeaders);
+        var age = this.age();
+
+        // A cache SHOULD generate 113 warning if it heuristically chose a freshness
+        // lifetime greater than 24 hours and the response's age is greater than 24 hours.
+        if (age > 3600 * 24 && !this._hasExplicitExpiration() && this.maxAge() > 3600 * 24) {
+            headers.warning = (headers.warning ? `${headers.warning}, ` : '') + '113 - "rfc7234 5.5.4"';
+        }
+        headers.age = `${Math.round(age)}`;
+        return headers;
+    };
+
+    /**
+     * Value of the Date response header or current time if Date was demed invalid
+     * @return timestamp
+     */
+
+
+    CachePolicy.prototype.date = function date() {
+        var dateValue = Date.parse(this._resHeaders.date);
+        var maxClockDrift = 8 * 3600 * 1000;
+        if (Number.isNaN(dateValue) || dateValue < this._responseTime - maxClockDrift || dateValue > this._responseTime + maxClockDrift) {
+            return this._responseTime;
+        }
+        return dateValue;
+    };
+
+    /**
+     * Value of the Age header, in seconds, updated for the current time.
+     * May be fractional.
+     *
+     * @return Number
+     */
+
+
+    CachePolicy.prototype.age = function age() {
+        var age = Math.max(0, (this._responseTime - this.date()) / 1000);
+        if (this._resHeaders.age) {
+            var ageValue = this._ageValue();
+            if (ageValue > age) age = ageValue;
+        }
+
+        var residentTime = (this.now() - this._responseTime) / 1000;
+        return age + residentTime;
+    };
+
+    CachePolicy.prototype._ageValue = function _ageValue() {
+        var ageValue = parseInt(this._resHeaders.age);
+        return isFinite(ageValue) ? ageValue : 0;
+    };
+
+    /**
+     * Value of applicable max-age (or heuristic equivalent) in seconds. This counts since response's `Date`.
+     *
+     * For an up-to-date value, see `timeToLive()`.
+     *
+     * @return Number
+     */
+
+
+    CachePolicy.prototype.maxAge = function maxAge() {
+        if (!this.storable() || this._rescc['no-cache']) {
+            return 0;
+        }
+
+        // Shared responses with cookies are cacheable according to the RFC, but IMHO it'd be unwise to do so by default
+        // so this implementation requires explicit opt-in via public header
+        if (this._isShared && this._resHeaders['set-cookie'] && !this._rescc.public && !this._rescc.immutable) {
+            return 0;
+        }
+
+        if (this._resHeaders.vary === '*') {
+            return 0;
+        }
+
+        if (this._isShared) {
+            if (this._rescc['proxy-revalidate']) {
+                return 0;
+            }
+            // if a response includes the s-maxage directive, a shared cache recipient MUST ignore the Expires field.
+            if (this._rescc['s-maxage']) {
+                return parseInt(this._rescc['s-maxage'], 10);
+            }
+        }
+
+        // If a response includes a Cache-Control field with the max-age directive, a recipient MUST ignore the Expires field.
+        if (this._rescc['max-age']) {
+            return parseInt(this._rescc['max-age'], 10);
+        }
+
+        var defaultMinTtl = this._rescc.immutable ? this._immutableMinTtl : 0;
+
+        var dateValue = this.date();
+        if (this._resHeaders.expires) {
+            var expires = Date.parse(this._resHeaders.expires);
+            // A cache recipient MUST interpret invalid date formats, especially the value "0", as representing a time in the past (i.e., "already expired").
+            if (Number.isNaN(expires) || expires < dateValue) {
+                return 0;
+            }
+            return Math.max(defaultMinTtl, (expires - dateValue) / 1000);
+        }
+
+        if (this._resHeaders['last-modified']) {
+            var lastModified = Date.parse(this._resHeaders['last-modified']);
+            if (isFinite(lastModified) && dateValue > lastModified) {
+                return Math.max(defaultMinTtl, (dateValue - lastModified) / 1000 * this._cacheHeuristic);
+            }
+        }
+
+        return defaultMinTtl;
+    };
+
+    CachePolicy.prototype.timeToLive = function timeToLive() {
+        return Math.max(0, this.maxAge() - this.age()) * 1000;
+    };
+
+    CachePolicy.prototype.stale = function stale() {
+        return this.maxAge() <= this.age();
+    };
+
+    CachePolicy.fromObject = function fromObject(obj) {
+        return new this(undefined, undefined, { _fromObject: obj });
+    };
+
+    CachePolicy.prototype._fromObject = function _fromObject(obj) {
+        if (this._responseTime) throw Error("Reinitialized");
+        if (!obj || obj.v !== 1) throw Error("Invalid serialization");
+
+        this._responseTime = obj.t;
+        this._isShared = obj.sh;
+        this._cacheHeuristic = obj.ch;
+        this._immutableMinTtl = obj.imm !== undefined ? obj.imm : 24 * 3600 * 1000;
+        this._status = obj.st;
+        this._resHeaders = obj.resh;
+        this._rescc = obj.rescc;
+        this._method = obj.m;
+        this._url = obj.u;
+        this._host = obj.h;
+        this._noAuthorization = obj.a;
+        this._reqHeaders = obj.reqh;
+        this._reqcc = obj.reqcc;
+    };
+
+    CachePolicy.prototype.toObject = function toObject() {
+        return {
+            v: 1,
+            t: this._responseTime,
+            sh: this._isShared,
+            ch: this._cacheHeuristic,
+            imm: this._immutableMinTtl,
+            st: this._status,
+            resh: this._resHeaders,
+            rescc: this._rescc,
+            m: this._method,
+            u: this._url,
+            h: this._host,
+            a: this._noAuthorization,
+            reqh: this._reqHeaders,
+            reqcc: this._reqcc
+        };
+    };
+
+    /**
+     * Headers for sending to the origin server to revalidate stale response.
+     * Allows server to return 304 to allow reuse of the previous response.
+     *
+     * Hop by hop headers are always stripped.
+     * Revalidation headers may be added or removed, depending on request.
+     */
+
+
+    CachePolicy.prototype.revalidationHeaders = function revalidationHeaders(incomingReq) {
+        this._assertRequestHasHeaders(incomingReq);
+        var headers = this._copyWithoutHopByHopHeaders(incomingReq.headers);
+
+        // This implementation does not understand range requests
+        delete headers['if-range'];
+
+        if (!this._requestMatches(incomingReq, true) || !this.storable()) {
+            // revalidation allowed via HEAD
+            // not for the same resource, or wasn't allowed to be cached anyway
+            delete headers['if-none-match'];
+            delete headers['if-modified-since'];
+            return headers;
+        }
+
+        /* MUST send that entity-tag in any cache validation request (using If-Match or If-None-Match) if an entity-tag has been provided by the origin server. */
+        if (this._resHeaders.etag) {
+            headers['if-none-match'] = headers['if-none-match'] ? `${headers['if-none-match']}, ${this._resHeaders.etag}` : this._resHeaders.etag;
+        }
+
+        // Clients MAY issue simple (non-subrange) GET requests with either weak validators or strong validators. Clients MUST NOT use weak validators in other forms of request.
+        var forbidsWeakValidators = headers['accept-ranges'] || headers['if-match'] || headers['if-unmodified-since'] || this._method && this._method != 'GET';
+
+        /* SHOULD send the Last-Modified value in non-subrange cache validation requests (using If-Modified-Since) if only a Last-Modified value has been provided by the origin server.
+        Note: This implementation does not understand partial responses (206) */
+        if (forbidsWeakValidators) {
+            delete headers['if-modified-since'];
+
+            if (headers['if-none-match']) {
+                var etags = headers['if-none-match'].split(/,/).filter(function (etag) {
+                    return !/^\s*W\//.test(etag);
+                });
+                if (!etags.length) {
+                    delete headers['if-none-match'];
+                } else {
+                    headers['if-none-match'] = etags.join(',').trim();
+                }
+            }
+        } else if (this._resHeaders['last-modified'] && !headers['if-modified-since']) {
+            headers['if-modified-since'] = this._resHeaders['last-modified'];
+        }
+
+        return headers;
+    };
+
+    /**
+     * Creates new CachePolicy with information combined from the previews response,
+     * and the new revalidation response.
+     *
+     * Returns {policy, modified} where modified is a boolean indicating
+     * whether the response body has been modified, and old cached body can't be used.
+     *
+     * @return {Object} {policy: CachePolicy, modified: Boolean}
+     */
+
+
+    CachePolicy.prototype.revalidatedPolicy = function revalidatedPolicy(request, response) {
+        this._assertRequestHasHeaders(request);
+        if (!response || !response.headers) {
+            throw Error("Response headers missing");
+        }
+
+        // These aren't going to be supported exactly, since one CachePolicy object
+        // doesn't know about all the other cached objects.
+        var matches = false;
+        if (response.status !== undefined && response.status != 304) {
+            matches = false;
+        } else if (response.headers.etag && !/^\s*W\//.test(response.headers.etag)) {
+            // "All of the stored responses with the same strong validator are selected.
+            // If none of the stored responses contain the same strong validator,
+            // then the cache MUST NOT use the new response to update any stored responses."
+            matches = this._resHeaders.etag && this._resHeaders.etag.replace(/^\s*W\//, '') === response.headers.etag;
+        } else if (this._resHeaders.etag && response.headers.etag) {
+            // "If the new response contains a weak validator and that validator corresponds
+            // to one of the cache's stored responses,
+            // then the most recent of those matching stored responses is selected for update."
+            matches = this._resHeaders.etag.replace(/^\s*W\//, '') === response.headers.etag.replace(/^\s*W\//, '');
+        } else if (this._resHeaders['last-modified']) {
+            matches = this._resHeaders['last-modified'] === response.headers['last-modified'];
+        } else {
+            // If the new response does not include any form of validator (such as in the case where
+            // a client generates an If-Modified-Since request from a source other than the Last-Modified
+            // response header field), and there is only one stored response, and that stored response also
+            // lacks a validator, then that stored response is selected for update.
+            if (!this._resHeaders.etag && !this._resHeaders['last-modified'] && !response.headers.etag && !response.headers['last-modified']) {
+                matches = true;
+            }
+        }
+
+        if (!matches) {
+            return {
+                policy: new this.constructor(request, response),
+                modified: true
+            };
+        }
+
+        // use other header fields provided in the 304 (Not Modified) response to replace all instances
+        // of the corresponding header fields in the stored response.
+        var headers = {};
+        for (var k in this._resHeaders) {
+            headers[k] = k in response.headers && !excludedFromRevalidationUpdate[k] ? response.headers[k] : this._resHeaders[k];
+        }
+
+        var newResponse = Object.assign({}, response, {
+            status: this._status,
+            method: this._method,
+            headers
+        });
+        return {
+            policy: new this.constructor(request, newResponse),
+            modified: false
+        };
+    };
+
+    return CachePolicy;
+}();
\ No newline at end of file
diff --git a/advancedcontentfilter/vendor/npm-asset/http-cache-semantics/package.json b/advancedcontentfilter/vendor/npm-asset/http-cache-semantics/package.json
new file mode 100644 (file)
index 0000000..2c96708
--- /dev/null
@@ -0,0 +1,22 @@
+{
+  "name": "http-cache-semantics",
+  "version": "3.8.1",
+  "description": "Parses Cache-Control and other headers. Helps building correct HTTP caches and proxies",
+  "repository": "https://github.com/pornel/http-cache-semantics.git",
+  "main": "node4/index.js",
+  "scripts": {
+    "compile": "babel -d node4/ index.js; babel -d node4/test test",
+    "prepublish": "npm run compile",
+    "test": "npm run compile; mocha node4/test"
+  },
+  "files": [
+    "node4/index.js"
+  ],
+  "author": "Kornel Lesiński <kornel@geekhood.net> (https://kornel.ski/)",
+  "license": "BSD-2-Clause",
+  "devDependencies": {
+    "babel-cli": "^6.24.1",
+    "babel-preset-env": "^1.6.1",
+    "mocha": "^3.4.2"
+  }
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/inherits/LICENSE b/advancedcontentfilter/vendor/npm-asset/inherits/LICENSE
new file mode 100644 (file)
index 0000000..dea3013
--- /dev/null
@@ -0,0 +1,16 @@
+The ISC License
+
+Copyright (c) Isaac Z. Schlueter
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
+REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
+INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+PERFORMANCE OF THIS SOFTWARE.
+
diff --git a/advancedcontentfilter/vendor/npm-asset/inherits/README.md b/advancedcontentfilter/vendor/npm-asset/inherits/README.md
new file mode 100644 (file)
index 0000000..b1c5665
--- /dev/null
@@ -0,0 +1,42 @@
+Browser-friendly inheritance fully compatible with standard node.js
+[inherits](http://nodejs.org/api/util.html#util_util_inherits_constructor_superconstructor).
+
+This package exports standard `inherits` from node.js `util` module in
+node environment, but also provides alternative browser-friendly
+implementation through [browser
+field](https://gist.github.com/shtylman/4339901). Alternative
+implementation is a literal copy of standard one located in standalone
+module to avoid requiring of `util`. It also has a shim for old
+browsers with no `Object.create` support.
+
+While keeping you sure you are using standard `inherits`
+implementation in node.js environment, it allows bundlers such as
+[browserify](https://github.com/substack/node-browserify) to not
+include full `util` package to your client code if all you need is
+just `inherits` function. It worth, because browser shim for `util`
+package is large and `inherits` is often the single function you need
+from it.
+
+It's recommended to use this package instead of
+`require('util').inherits` for any code that has chances to be used
+not only in node.js but in browser too.
+
+## usage
+
+```js
+var inherits = require('inherits');
+// then use exactly as the standard one
+```
+
+## note on version ~1.0
+
+Version ~1.0 had completely different motivation and is not compatible
+neither with 2.0 nor with standard node.js `inherits`.
+
+If you are using version ~1.0 and planning to switch to ~2.0, be
+careful:
+
+* new version uses `super_` instead of `super` for referencing
+  superclass
+* new version overwrites current prototype while old one preserves any
+  existing fields on it
diff --git a/advancedcontentfilter/vendor/npm-asset/inherits/inherits.js b/advancedcontentfilter/vendor/npm-asset/inherits/inherits.js
new file mode 100644 (file)
index 0000000..3b94763
--- /dev/null
@@ -0,0 +1,7 @@
+try {
+  var util = require('util');
+  if (typeof util.inherits !== 'function') throw '';
+  module.exports = util.inherits;
+} catch (e) {
+  module.exports = require('./inherits_browser.js');
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/inherits/inherits_browser.js b/advancedcontentfilter/vendor/npm-asset/inherits/inherits_browser.js
new file mode 100644 (file)
index 0000000..c1e78a7
--- /dev/null
@@ -0,0 +1,23 @@
+if (typeof Object.create === 'function') {
+  // implementation from standard node.js 'util' module
+  module.exports = function inherits(ctor, superCtor) {
+    ctor.super_ = superCtor
+    ctor.prototype = Object.create(superCtor.prototype, {
+      constructor: {
+        value: ctor,
+        enumerable: false,
+        writable: true,
+        configurable: true
+      }
+    });
+  };
+} else {
+  // old school shim for old browsers
+  module.exports = function inherits(ctor, superCtor) {
+    ctor.super_ = superCtor
+    var TempCtor = function () {}
+    TempCtor.prototype = superCtor.prototype
+    ctor.prototype = new TempCtor()
+    ctor.prototype.constructor = ctor
+  }
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/inherits/package.json b/advancedcontentfilter/vendor/npm-asset/inherits/package.json
new file mode 100644 (file)
index 0000000..7cf62b9
--- /dev/null
@@ -0,0 +1,29 @@
+{
+  "name": "inherits",
+  "description": "Browser-friendly inheritance fully compatible with standard node.js inherits()",
+  "version": "2.0.3",
+  "keywords": [
+    "inheritance",
+    "class",
+    "klass",
+    "oop",
+    "object-oriented",
+    "inherits",
+    "browser",
+    "browserify"
+  ],
+  "main": "./inherits.js",
+  "browser": "./inherits_browser.js",
+  "repository": "git://github.com/isaacs/inherits",
+  "license": "ISC",
+  "scripts": {
+    "test": "node test"
+  },
+  "devDependencies": {
+    "tap": "^7.1.0"
+  },
+  "files": [
+    "inherits.js",
+    "inherits_browser.js"
+  ]
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/into-stream/index.js b/advancedcontentfilter/vendor/npm-asset/into-stream/index.js
new file mode 100644 (file)
index 0000000..c35f695
--- /dev/null
@@ -0,0 +1,79 @@
+'use strict';
+const from = require('from2');
+const pIsPromise = require('p-is-promise');
+
+module.exports = x => {
+       if (Array.isArray(x)) {
+               x = x.slice();
+       }
+
+       let promise;
+       let iterator;
+
+       prepare(x);
+
+       function prepare(value) {
+               x = value;
+               promise = pIsPromise(x) ? x : null;
+               // we don't iterate on strings and buffers since slicing them is ~7x faster
+               const shouldIterate = !promise && x[Symbol.iterator] && typeof x !== 'string' && !Buffer.isBuffer(x);
+               iterator = shouldIterate ? x[Symbol.iterator]() : null;
+       }
+
+       return from(function reader(size, cb) {
+               if (promise) {
+                       promise.then(prepare).then(() => reader.call(this, size, cb), cb);
+                       return;
+               }
+
+               if (iterator) {
+                       const obj = iterator.next();
+                       setImmediate(cb, null, obj.done ? null : obj.value);
+                       return;
+               }
+
+               if (x.length === 0) {
+                       setImmediate(cb, null, null);
+                       return;
+               }
+
+               const chunk = x.slice(0, size);
+               x = x.slice(size);
+
+               setImmediate(cb, null, chunk);
+       });
+};
+
+module.exports.obj = x => {
+       if (Array.isArray(x)) {
+               x = x.slice();
+       }
+
+       let promise;
+       let iterator;
+
+       prepare(x);
+
+       function prepare(value) {
+               x = value;
+               promise = pIsPromise(x) ? x : null;
+               iterator = !promise && x[Symbol.iterator] ? x[Symbol.iterator]() : null;
+       }
+
+       return from.obj(function reader(size, cb) {
+               if (promise) {
+                       promise.then(prepare).then(() => reader.call(this, size, cb), cb);
+                       return;
+               }
+
+               if (iterator) {
+                       const obj = iterator.next();
+                       setImmediate(cb, null, obj.done ? null : obj.value);
+                       return;
+               }
+
+               this.push(x);
+
+               setImmediate(cb, null, null);
+       });
+};
diff --git a/advancedcontentfilter/vendor/npm-asset/into-stream/license b/advancedcontentfilter/vendor/npm-asset/into-stream/license
new file mode 100644 (file)
index 0000000..654d0bf
--- /dev/null
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/advancedcontentfilter/vendor/npm-asset/into-stream/package.json b/advancedcontentfilter/vendor/npm-asset/into-stream/package.json
new file mode 100644 (file)
index 0000000..e0241c9
--- /dev/null
@@ -0,0 +1,50 @@
+{
+  "name": "into-stream",
+  "version": "3.1.0",
+  "description": "Convert a buffer/string/array/object/iterable/promise into a stream",
+  "license": "MIT",
+  "repository": "sindresorhus/into-stream",
+  "author": {
+    "name": "Sindre Sorhus",
+    "email": "sindresorhus@gmail.com",
+    "url": "sindresorhus.com"
+  },
+  "engines": {
+    "node": ">=4"
+  },
+  "scripts": {
+    "test": "xo && ava"
+  },
+  "files": [
+    "index.js"
+  ],
+  "keywords": [
+    "stream",
+    "buffer",
+    "string",
+    "object",
+    "array",
+    "iterable",
+    "promise",
+    "promises",
+    "from",
+    "into",
+    "to",
+    "transform",
+    "convert",
+    "readable",
+    "pull",
+    "gulpfriendly",
+    "value",
+    "str"
+  ],
+  "dependencies": {
+    "from2": "^2.1.1",
+    "p-is-promise": "^1.1.0"
+  },
+  "devDependencies": {
+    "ava": "*",
+    "get-stream": "^3.0.0",
+    "xo": "*"
+  }
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/into-stream/readme.md b/advancedcontentfilter/vendor/npm-asset/into-stream/readme.md
new file mode 100644 (file)
index 0000000..6c4ed0b
--- /dev/null
@@ -0,0 +1,42 @@
+# into-stream [![Build Status](https://travis-ci.org/sindresorhus/into-stream.svg?branch=master)](https://travis-ci.org/sindresorhus/into-stream)
+
+> Convert a buffer/string/array/object/iterable/promise into a stream
+
+Correctly chunks up the input and handles backpressure.
+
+
+## Install
+
+```
+$ npm install --save into-stream
+```
+
+
+## Usage
+
+```js
+const intoStream = require('into-stream');
+
+intoStream('unicorn').pipe(process.stdout);
+//=> 'unicorn'
+```
+
+
+## API
+
+### intoStream(input)
+
+Type: `Buffer` `string` `Iterable<Buffer|string>` `Promise`<br>
+Returns: [Readable stream](https://nodejs.org/api/stream.html#stream_class_stream_readable)
+
+Adheres to the requested chunk size, except for `array` where each element will be a chunk.
+
+### intoStream.obj(input)
+
+Type: `Object`, `Iterable<Object>` `Promise`<br>
+Returns: [Readable object stream](https://nodejs.org/api/stream.html#stream_object_mode)
+
+
+## License
+
+MIT © [Sindre Sorhus](https://sindresorhus.com)
diff --git a/advancedcontentfilter/vendor/npm-asset/is-object/.jscs.json b/advancedcontentfilter/vendor/npm-asset/is-object/.jscs.json
new file mode 100644 (file)
index 0000000..97ab933
--- /dev/null
@@ -0,0 +1,55 @@
+{
+  "requireCurlyBraces": ["if", "else", "for", "while", "do", "try", "catch"],
+
+  "requireSpaceAfterKeywords": ["if", "else", "for", "while", "do", "switch", "return", "try", "catch", "function"],
+
+  "disallowSpaceAfterKeywords": [],
+
+  "requireSpacesInAnonymousFunctionExpression": { "beforeOpeningRoundBrace": true, "beforeOpeningCurlyBrace": true },
+  "requireSpacesInNamedFunctionExpression": { "beforeOpeningCurlyBrace": true },
+  "disallowSpacesInNamedFunctionExpression": { "beforeOpeningRoundBrace": true },
+  "requireSpacesInFunctionDeclaration": { "beforeOpeningCurlyBrace": true },
+  "disallowSpacesInFunctionDeclaration": { "beforeOpeningRoundBrace": true },
+
+  "disallowSpacesInsideParentheses": true,
+
+  "disallowSpacesInsideArrayBrackets": true,
+
+  "disallowQuotedKeysInObjects": "allButReserved",
+
+  "disallowSpaceAfterObjectKeys": true,
+
+  "requireCommaBeforeLineBreak": true,
+
+  "disallowSpaceAfterPrefixUnaryOperators": ["++", "--", "+", "-", "~", "!"],
+  "requireSpaceAfterPrefixUnaryOperators": [],
+
+  "disallowSpaceBeforePostfixUnaryOperators": ["++", "--"],
+  "requireSpaceBeforePostfixUnaryOperators": [],
+
+  "disallowSpaceBeforeBinaryOperators": [],
+  "requireSpaceBeforeBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!=="],
+
+  "requireSpaceAfterBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!=="],
+  "disallowSpaceAfterBinaryOperators": [],
+
+  "disallowImplicitTypeConversion": ["binary", "string"],
+
+  "disallowKeywords": ["with", "eval"],
+
+  "validateLineBreaks": "LF",
+
+  "requireKeywordsOnNewLine": [],
+  "disallowKeywordsOnNewLine": ["else"],
+
+  "requireLineFeedAtFileEnd": true,
+
+  "disallowTrailingWhitespace": true,
+
+  "excludeFiles": ["node_modules/**", "vendor/**"],
+
+  "disallowMultipleLineStrings": true,
+
+  "additionalRules": []
+}
+
diff --git a/advancedcontentfilter/vendor/npm-asset/is-object/.npmignore b/advancedcontentfilter/vendor/npm-asset/is-object/.npmignore
new file mode 100644 (file)
index 0000000..fd31f5e
--- /dev/null
@@ -0,0 +1,15 @@
+.DS_Store
+.monitor
+.*.swp
+.nodemonignore
+releases
+*.log
+*.err
+fleet.json
+public/browserify
+bin/*.json
+.bin
+build
+compile
+.lock-wscript
+node_modules
diff --git a/advancedcontentfilter/vendor/npm-asset/is-object/.testem.json b/advancedcontentfilter/vendor/npm-asset/is-object/.testem.json
new file mode 100644 (file)
index 0000000..287edfe
--- /dev/null
@@ -0,0 +1,14 @@
+{
+    "launchers": {
+        "node": {
+            "command": "node ./test"
+        }
+    },
+    "src_files": [
+        "./**/*.js"
+    ],
+    "before_tests": "npm run build",
+    "on_exit": "rm test/static/bundle.js",
+    "test_page": "test/static/index.html",
+    "launch_in_dev": ["node", "phantomjs"]
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/is-object/.travis.yml b/advancedcontentfilter/vendor/npm-asset/is-object/.travis.yml
new file mode 100644 (file)
index 0000000..912080a
--- /dev/null
@@ -0,0 +1,18 @@
+language: node_js
+node_js:
+  - "0.11"
+  - "0.10"
+  - "0.9"
+  - "0.8"
+  - "0.6"
+  - "0.4"
+before_install:
+  - '[ "${TRAVIS_NODE_VERSION}" == "0.6" ] || npm install -g npm@~1.4.6'
+matrix:
+  fast_finish: true
+  allow_failures:
+    - node_js: "0.11"
+    - node_js: "0.9"
+    - node_js: "0.6"
+    - node_js: "0.4"
+
diff --git a/advancedcontentfilter/vendor/npm-asset/is-object/LICENSE b/advancedcontentfilter/vendor/npm-asset/is-object/LICENSE
new file mode 100644 (file)
index 0000000..72d356c
--- /dev/null
@@ -0,0 +1,19 @@
+Copyright (c) 2013 Colingo.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/advancedcontentfilter/vendor/npm-asset/is-object/README.md b/advancedcontentfilter/vendor/npm-asset/is-object/README.md
new file mode 100644 (file)
index 0000000..d6e7b7d
--- /dev/null
@@ -0,0 +1,55 @@
+# is-object <sup>[![Version Badge][12]][11]</sup>
+
+[![build status][1]][2]
+[![dependency status][3]][4]
+[![dev dependency status][9]][10]
+[![License][license-image]][license-url]
+[![Downloads][downloads-image]][downloads-url]
+
+[![npm badge][13]][11]
+
+[![browser support][5]][6]
+
+Checks whether a value is an object
+
+Because `typeof null` is a troll.
+
+## Example
+
+```js
+var isObject = require('is-object');
+var assert = require('assert');
+
+assert.equal(isObject(null), false);
+assert.equal(isObject({}), true);
+```
+
+## Installation
+
+`npm install is-object`
+
+## Contributors
+
+ - [Raynos][7]
+ - [Jordan Harband][8]
+
+## MIT Licensed
+
+  [1]: https://secure.travis-ci.org/ljharb/is-object.svg
+  [2]: http://travis-ci.org/ljharb/is-object
+  [3]: http://david-dm.org/ljharb/is-object/status.svg
+  [4]: http://david-dm.org/ljharb/is-object
+  [5]: http://ci.testling.com/ljharb/is-object.svg
+  [6]: http://ci.testling.com/ljharb/is-object
+  [7]: https://github.com/Raynos
+  [8]: https://github.com/ljharb
+  [9]: https://david-dm.org/ljharb/is-object/dev-status.svg
+  [10]: https://david-dm.org/ljharb/is-object#info=devDependencies
+  [11]: https://npmjs.org/package/is-object
+  [12]: http://vb.teelaun.ch/ljharb/is-object.svg
+  [13]: https://nodei.co/npm/is-object.png?downloads=true&stars=true
+[license-image]: http://img.shields.io/npm/l/is-object.svg
+[license-url]: LICENSE
+[downloads-image]: http://img.shields.io/npm/dm/is-object.svg
+[downloads-url]: http://npm-stat.com/charts.html?package=is-object
+
diff --git a/advancedcontentfilter/vendor/npm-asset/is-object/index.js b/advancedcontentfilter/vendor/npm-asset/is-object/index.js
new file mode 100644 (file)
index 0000000..e618d11
--- /dev/null
@@ -0,0 +1,5 @@
+"use strict";
+
+module.exports = function isObject(x) {
+       return typeof x === "object" && x !== null;
+};
diff --git a/advancedcontentfilter/vendor/npm-asset/is-object/package.json b/advancedcontentfilter/vendor/npm-asset/is-object/package.json
new file mode 100644 (file)
index 0000000..bf7b889
--- /dev/null
@@ -0,0 +1,59 @@
+{
+       "name": "is-object",
+       "version": "1.0.1",
+       "description": "Checks whether a value is an object",
+       "keywords": [],
+       "author": "Raynos <raynos2@gmail.com>",
+       "repository": "git://github.com/ljharb/is-object.git",
+       "main": "index",
+       "homepage": "https://github.com/ljharb/is-object",
+       "contributors": [
+               {
+                       "name": "Raynos"
+               },
+               {
+                       "name": "Jordan Harband",
+                       "url": "https://github.com/ljharb"
+               }
+       ],
+       "bugs": {
+               "url": "https://github.com/ljharb/is-object/issues",
+               "email": "ljharb@gmail.com"
+       },
+       "dependencies": {},
+       "devDependencies": {
+               "tape": "~2.14.0",
+               "covert": "~1.0.0",
+               "jscs": "~1.6.0"
+       },
+    "license": "MIT",
+       "licenses": [
+               {
+                       "type": "MIT",
+                       "url": "http://github.com/ljharb/is-object/raw/master/LICENSE"
+               }
+       ],
+       "scripts": {
+               "test": "npm run lint && node test/index.js && npm run coverage-quiet",
+               "coverage": "covert test/index.js",
+               "coverage-quiet": "covert test/index.js --quiet",
+               "lint": "jscs *.js */*.js"
+       },
+       "testling": {
+               "files": "test/index.js",
+               "browsers": [
+                       "ie/6..latest",
+                       "firefox/3..6",
+                       "firefox/16..latest",
+                       "firefox/nightly",
+                       "chrome/22..latest",
+                       "chrome/canary",
+                       "opera/10.0",
+                       "opera/11..latest",
+                       "opera/next",
+                       "safari/4..latest",
+                       "ipad/6.0..latest",
+                       "iphone/6.0..latest"
+               ]
+       }
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/is-object/test/index.js b/advancedcontentfilter/vendor/npm-asset/is-object/test/index.js
new file mode 100644 (file)
index 0000000..35267a9
--- /dev/null
@@ -0,0 +1,23 @@
+var test = require('tape');
+
+var isObject = require('../index');
+
+test('returns true for objects', function (assert) {
+       assert.equal(isObject({}), true);
+       assert.equal(isObject([]), true);
+
+       assert.end();
+});
+
+test('returns false for null', function (assert) {
+       assert.equal(isObject(null), false);
+
+       assert.end();
+});
+
+test('returns false for primitives', function (assert) {
+       assert.equal(isObject(42), false);
+       assert.equal(isObject('foo'), false);
+
+       assert.end();
+});
diff --git a/advancedcontentfilter/vendor/npm-asset/is-plain-obj/index.js b/advancedcontentfilter/vendor/npm-asset/is-plain-obj/index.js
new file mode 100644 (file)
index 0000000..0d1ba9e
--- /dev/null
@@ -0,0 +1,7 @@
+'use strict';
+var toString = Object.prototype.toString;
+
+module.exports = function (x) {
+       var prototype;
+       return toString.call(x) === '[object Object]' && (prototype = Object.getPrototypeOf(x), prototype === null || prototype === Object.getPrototypeOf({}));
+};
diff --git a/advancedcontentfilter/vendor/npm-asset/is-plain-obj/license b/advancedcontentfilter/vendor/npm-asset/is-plain-obj/license
new file mode 100644 (file)
index 0000000..654d0bf
--- /dev/null
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/advancedcontentfilter/vendor/npm-asset/is-plain-obj/package.json b/advancedcontentfilter/vendor/npm-asset/is-plain-obj/package.json
new file mode 100644 (file)
index 0000000..d331f6e
--- /dev/null
@@ -0,0 +1,36 @@
+{
+  "name": "is-plain-obj",
+  "version": "1.1.0",
+  "description": "Check if a value is a plain object",
+  "license": "MIT",
+  "repository": "sindresorhus/is-plain-obj",
+  "author": {
+    "name": "Sindre Sorhus",
+    "email": "sindresorhus@gmail.com",
+    "url": "sindresorhus.com"
+  },
+  "engines": {
+    "node": ">=0.10.0"
+  },
+  "scripts": {
+    "test": "node test.js"
+  },
+  "files": [
+    "index.js"
+  ],
+  "keywords": [
+    "obj",
+    "object",
+    "is",
+    "check",
+    "test",
+    "type",
+    "plain",
+    "vanilla",
+    "pure",
+    "simple"
+  ],
+  "devDependencies": {
+    "ava": "0.0.4"
+  }
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/is-plain-obj/readme.md b/advancedcontentfilter/vendor/npm-asset/is-plain-obj/readme.md
new file mode 100644 (file)
index 0000000..269e56a
--- /dev/null
@@ -0,0 +1,35 @@
+# is-plain-obj [![Build Status](https://travis-ci.org/sindresorhus/is-plain-obj.svg?branch=master)](https://travis-ci.org/sindresorhus/is-plain-obj)
+
+> Check if a value is a plain object
+
+An object is plain if it's created by either `{}`, `new Object()` or `Object.create(null)`.
+
+
+## Install
+
+```
+$ npm install --save is-plain-obj
+```
+
+
+## Usage
+
+```js
+var isPlainObj = require('is-plain-obj');
+
+isPlainObj({foo: 'bar'});
+//=> true
+
+isPlainObj([1, 2, 3]);
+//=> false
+```
+
+
+## Related
+
+- [is-obj](https://github.com/sindresorhus/is-obj) - Check if a value is an object
+
+
+## License
+
+MIT © [Sindre Sorhus](http://sindresorhus.com)
diff --git a/advancedcontentfilter/vendor/npm-asset/is-retry-allowed/index.js b/advancedcontentfilter/vendor/npm-asset/is-retry-allowed/index.js
new file mode 100644 (file)
index 0000000..663ee33
--- /dev/null
@@ -0,0 +1,60 @@
+'use strict';
+
+var WHITELIST = [
+       'ETIMEDOUT',
+       'ECONNRESET',
+       'EADDRINUSE',
+       'ESOCKETTIMEDOUT',
+       'ECONNREFUSED',
+       'EPIPE'
+];
+
+var BLACKLIST = [
+       'ENOTFOUND',
+       'ENETUNREACH',
+
+       // SSL errors from https://github.com/nodejs/node/blob/ed3d8b13ee9a705d89f9e0397d9e96519e7e47ac/src/node_crypto.cc#L1950
+       'UNABLE_TO_GET_ISSUER_CERT',
+       'UNABLE_TO_GET_CRL',
+       'UNABLE_TO_DECRYPT_CERT_SIGNATURE',
+       'UNABLE_TO_DECRYPT_CRL_SIGNATURE',
+       'UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY',
+       'CERT_SIGNATURE_FAILURE',
+       'CRL_SIGNATURE_FAILURE',
+       'CERT_NOT_YET_VALID',
+       'CERT_HAS_EXPIRED',
+       'CRL_NOT_YET_VALID',
+       'CRL_HAS_EXPIRED',
+       'ERROR_IN_CERT_NOT_BEFORE_FIELD',
+       'ERROR_IN_CERT_NOT_AFTER_FIELD',
+       'ERROR_IN_CRL_LAST_UPDATE_FIELD',
+       'ERROR_IN_CRL_NEXT_UPDATE_FIELD',
+       'OUT_OF_MEM',
+       'DEPTH_ZERO_SELF_SIGNED_CERT',
+       'SELF_SIGNED_CERT_IN_CHAIN',
+       'UNABLE_TO_GET_ISSUER_CERT_LOCALLY',
+       'UNABLE_TO_VERIFY_LEAF_SIGNATURE',
+       'CERT_CHAIN_TOO_LONG',
+       'CERT_REVOKED',
+       'INVALID_CA',
+       'PATH_LENGTH_EXCEEDED',
+       'INVALID_PURPOSE',
+       'CERT_UNTRUSTED',
+       'CERT_REJECTED'
+];
+
+module.exports = function (err) {
+       if (!err || !err.code) {
+               return true;
+       }
+
+       if (WHITELIST.indexOf(err.code) !== -1) {
+               return true;
+       }
+
+       if (BLACKLIST.indexOf(err.code) !== -1) {
+               return false;
+       }
+
+       return true;
+};
diff --git a/advancedcontentfilter/vendor/npm-asset/is-retry-allowed/license b/advancedcontentfilter/vendor/npm-asset/is-retry-allowed/license
new file mode 100644 (file)
index 0000000..1aeb74f
--- /dev/null
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) Vsevolod Strukchinsky <floatdrop@gmail.com> (github.com/floatdrop)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/advancedcontentfilter/vendor/npm-asset/is-retry-allowed/package.json b/advancedcontentfilter/vendor/npm-asset/is-retry-allowed/package.json
new file mode 100644 (file)
index 0000000..452b76f
--- /dev/null
@@ -0,0 +1,29 @@
+{
+  "name": "is-retry-allowed",
+  "version": "1.1.0",
+  "description": "My prime module",
+  "license": "MIT",
+  "repository": "floatdrop/is-retry-allowed",
+  "author": {
+    "name": "Vsevolod Strukchinsky",
+    "email": "floatdrop@gmail.com",
+    "url": "github.com/floatdrop"
+  },
+  "engines": {
+    "node": ">=0.10.0"
+  },
+  "scripts": {
+    "test": "xo && ava"
+  },
+  "files": [
+    "index.js"
+  ],
+  "keywords": [
+    ""
+  ],
+  "dependencies": {},
+  "devDependencies": {
+    "ava": "^0.8.0",
+    "xo": "^0.12.1"
+  }
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/is-retry-allowed/readme.md b/advancedcontentfilter/vendor/npm-asset/is-retry-allowed/readme.md
new file mode 100644 (file)
index 0000000..4212d09
--- /dev/null
@@ -0,0 +1,42 @@
+# is-retry-allowed [![Build Status](https://travis-ci.org/floatdrop/is-retry-allowed.svg?branch=master)](https://travis-ci.org/floatdrop/is-retry-allowed)
+
+Is retry allowed for Error?
+
+
+## Install
+
+```
+$ npm install --save is-retry-allowed
+```
+
+
+## Usage
+
+```js
+const isRetryAllowed = require('is-retry-allowed');
+
+isRetryAllowed({code: 'ETIMEDOUT'});
+//=> true
+
+isRetryAllowed({code: 'ENOTFOUND'});
+//=> false
+
+isRetryAllowed({});
+//=> true
+```
+
+
+## API
+
+### isRetryAllowed(error)
+
+#### error
+
+Type: `object`
+
+Object with `code` property, which will be used to determine retry.
+
+
+## License
+
+MIT © [Vsevolod Strukchinsky](http://github.com/floatdrop)
diff --git a/advancedcontentfilter/vendor/npm-asset/isarray/.npmignore b/advancedcontentfilter/vendor/npm-asset/isarray/.npmignore
new file mode 100644 (file)
index 0000000..3c3629e
--- /dev/null
@@ -0,0 +1 @@
+node_modules
diff --git a/advancedcontentfilter/vendor/npm-asset/isarray/.travis.yml b/advancedcontentfilter/vendor/npm-asset/isarray/.travis.yml
new file mode 100644 (file)
index 0000000..cc4dba2
--- /dev/null
@@ -0,0 +1,4 @@
+language: node_js
+node_js:
+  - "0.8"
+  - "0.10"
diff --git a/advancedcontentfilter/vendor/npm-asset/isarray/Makefile b/advancedcontentfilter/vendor/npm-asset/isarray/Makefile
new file mode 100644 (file)
index 0000000..787d56e
--- /dev/null
@@ -0,0 +1,6 @@
+
+test:
+       @node_modules/.bin/tape test.js
+
+.PHONY: test
+
diff --git a/advancedcontentfilter/vendor/npm-asset/isarray/README.md b/advancedcontentfilter/vendor/npm-asset/isarray/README.md
new file mode 100644 (file)
index 0000000..16d2c59
--- /dev/null
@@ -0,0 +1,60 @@
+
+# isarray
+
+`Array#isArray` for older browsers.
+
+[![build status](https://secure.travis-ci.org/juliangruber/isarray.svg)](http://travis-ci.org/juliangruber/isarray)
+[![downloads](https://img.shields.io/npm/dm/isarray.svg)](https://www.npmjs.org/package/isarray)
+
+[![browser support](https://ci.testling.com/juliangruber/isarray.png)
+](https://ci.testling.com/juliangruber/isarray)
+
+## Usage
+
+```js
+var isArray = require('isarray');
+
+console.log(isArray([])); // => true
+console.log(isArray({})); // => false
+```
+
+## Installation
+
+With [npm](http://npmjs.org) do
+
+```bash
+$ npm install isarray
+```
+
+Then bundle for the browser with
+[browserify](https://github.com/substack/browserify).
+
+With [component](http://component.io) do
+
+```bash
+$ component install juliangruber/isarray
+```
+
+## License
+
+(MIT)
+
+Copyright (c) 2013 Julian Gruber &lt;julian@juliangruber.com&gt;
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/advancedcontentfilter/vendor/npm-asset/isarray/component.json b/advancedcontentfilter/vendor/npm-asset/isarray/component.json
new file mode 100644 (file)
index 0000000..9e31b68
--- /dev/null
@@ -0,0 +1,19 @@
+{
+  "name" : "isarray",
+  "description" : "Array#isArray for older browsers",
+  "version" : "0.0.1",
+  "repository" : "juliangruber/isarray",
+  "homepage": "https://github.com/juliangruber/isarray",
+  "main" : "index.js",
+  "scripts" : [
+    "index.js"
+  ],
+  "dependencies" : {},
+  "keywords": ["browser","isarray","array"],
+  "author": {
+    "name": "Julian Gruber",
+    "email": "mail@juliangruber.com",
+    "url": "http://juliangruber.com"
+  },
+  "license": "MIT"
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/isarray/index.js b/advancedcontentfilter/vendor/npm-asset/isarray/index.js
new file mode 100644 (file)
index 0000000..a57f634
--- /dev/null
@@ -0,0 +1,5 @@
+var toString = {}.toString;
+
+module.exports = Array.isArray || function (arr) {
+  return toString.call(arr) == '[object Array]';
+};
diff --git a/advancedcontentfilter/vendor/npm-asset/isarray/package.json b/advancedcontentfilter/vendor/npm-asset/isarray/package.json
new file mode 100644 (file)
index 0000000..1a4317a
--- /dev/null
@@ -0,0 +1,45 @@
+{
+  "name": "isarray",
+  "description": "Array#isArray for older browsers",
+  "version": "1.0.0",
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/juliangruber/isarray.git"
+  },
+  "homepage": "https://github.com/juliangruber/isarray",
+  "main": "index.js",
+  "dependencies": {},
+  "devDependencies": {
+    "tape": "~2.13.4"
+  },
+  "keywords": [
+    "browser",
+    "isarray",
+    "array"
+  ],
+  "author": {
+    "name": "Julian Gruber",
+    "email": "mail@juliangruber.com",
+    "url": "http://juliangruber.com"
+  },
+  "license": "MIT",
+  "testling": {
+    "files": "test.js",
+    "browsers": [
+      "ie/8..latest",
+      "firefox/17..latest",
+      "firefox/nightly",
+      "chrome/22..latest",
+      "chrome/canary",
+      "opera/12..latest",
+      "opera/next",
+      "safari/5.1..latest",
+      "ipad/6.0..latest",
+      "iphone/6.0..latest",
+      "android-browser/4.2..latest"
+    ]
+  },
+  "scripts": {
+    "test": "tape test.js"
+  }
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/isarray/test.js b/advancedcontentfilter/vendor/npm-asset/isarray/test.js
new file mode 100644 (file)
index 0000000..e0c3444
--- /dev/null
@@ -0,0 +1,20 @@
+var isArray = require('./');
+var test = require('tape');
+
+test('is array', function(t){
+  t.ok(isArray([]));
+  t.notOk(isArray({}));
+  t.notOk(isArray(null));
+  t.notOk(isArray(false));
+
+  var obj = {};
+  obj[0] = true;
+  t.notOk(isArray(obj));
+
+  var arr = [];
+  arr.foo = 'bar';
+  t.ok(isArray(arr));
+
+  t.end();
+});
+
diff --git a/advancedcontentfilter/vendor/npm-asset/isurl/LICENSE b/advancedcontentfilter/vendor/npm-asset/isurl/LICENSE
new file mode 100644 (file)
index 0000000..274147a
--- /dev/null
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2017 Steven Vachon
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/advancedcontentfilter/vendor/npm-asset/isurl/README.md b/advancedcontentfilter/vendor/npm-asset/isurl/README.md
new file mode 100644 (file)
index 0000000..6903ac7
--- /dev/null
@@ -0,0 +1,39 @@
+# isurl [![NPM Version][npm-image]][npm-url] [![Build Status][travis-image]][travis-url]
+
+> Checks whether a value is a WHATWG [`URL`](https://developer.mozilla.org/en/docs/Web/API/URL).
+
+
+Works cross-realm/iframe and despite @@toStringTag.
+
+
+## Installation
+
+[Node.js](http://nodejs.org/) `>= 4` is required. To install, type this at the command line:
+```shell
+npm install isurl
+```
+
+
+## Usage
+
+```js
+const isURL = require('isurl');
+
+isURL('http://domain/');  //-> false
+isURL(new URL('http://domain/'));  //-> true
+```
+
+Optionally, acceptance can be extended to incomplete `URL` implementations that lack `searchParams` (which are common in many modern web browsers):
+```js
+const url = new URL('http://domain/?query');
+
+console.log(url.searchParams);  //-> undefined
+
+isURL.lenient(url);  //-> true
+```
+
+
+[npm-image]: https://img.shields.io/npm/v/isurl.svg
+[npm-url]: https://npmjs.org/package/isurl
+[travis-image]: https://img.shields.io/travis/stevenvachon/isurl.svg
+[travis-url]: https://travis-ci.org/stevenvachon/isurl
diff --git a/advancedcontentfilter/vendor/npm-asset/isurl/index.js b/advancedcontentfilter/vendor/npm-asset/isurl/index.js
new file mode 100644 (file)
index 0000000..70ed1d7
--- /dev/null
@@ -0,0 +1,58 @@
+"use strict";
+const hasToStringTag = require("has-to-string-tag-x");
+const isObject = require("is-object");
+
+const toString = Object.prototype.toString;
+const urlClass = "[object URL]";
+
+const hash = "hash";
+const host = "host";
+const hostname = "hostname";
+const href = "href";
+const password = "password";
+const pathname = "pathname";
+const port = "port";
+const protocol = "protocol";
+const search = "search";
+const username = "username";
+
+
+
+const isURL = (url, supportIncomplete/*=false*/) =>
+{
+       if (!isObject(url)) return false;
+
+       // Native implementation in older browsers
+       if (!hasToStringTag && toString.call(url) === urlClass) return true;
+
+       if (!(href     in url)) return false;
+       if (!(protocol in url)) return false;
+       if (!(username in url)) return false;
+       if (!(password in url)) return false;
+       if (!(hostname in url)) return false;
+       if (!(port     in url)) return false;
+       if (!(host     in url)) return false;
+       if (!(pathname in url)) return false;
+       if (!(search   in url)) return false;
+       if (!(hash     in url)) return false;
+
+       if (supportIncomplete !== true)
+       {
+               if (!isObject(url.searchParams)) return false;
+
+               // TODO :: write a separate isURLSearchParams ?
+       }
+
+       return true;
+}
+
+
+
+isURL.lenient = url =>
+{
+       return isURL(url, true);
+};
+
+
+
+module.exports = isURL;
diff --git a/advancedcontentfilter/vendor/npm-asset/isurl/package.json b/advancedcontentfilter/vendor/npm-asset/isurl/package.json
new file mode 100644 (file)
index 0000000..0852723
--- /dev/null
@@ -0,0 +1,32 @@
+{
+  "name": "isurl",
+  "description": "Checks whether a value is a WHATWG URL.",
+  "version": "1.0.0",
+  "license": "MIT",
+  "author": "Steven Vachon <contact@svachon.com> (https://www.svachon.com/)",
+  "repository": "stevenvachon/isurl",
+  "dependencies": {
+    "has-to-string-tag-x": "^1.2.0",
+    "is-object": "^1.0.1"
+  },
+  "devDependencies": {
+    "chai": "^4.0.2",
+    "mocha": "^3.4.2",
+    "semver": "^5.3.0",
+    "universal-url": "^1.0.0"
+  },
+  "engines": {
+    "node": ">= 4"
+  },
+  "scripts": {
+    "test": "mocha test --check-leaks --bail"
+  },
+  "files": [
+    "index.js"
+  ],
+  "keywords": [
+    "uri",
+    "url",
+    "whatwg"
+  ]
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/json-buffer/.npmignore b/advancedcontentfilter/vendor/npm-asset/json-buffer/.npmignore
new file mode 100644 (file)
index 0000000..13abef4
--- /dev/null
@@ -0,0 +1,3 @@
+node_modules
+node_modules/*
+npm_debug.log
diff --git a/advancedcontentfilter/vendor/npm-asset/json-buffer/.travis.yml b/advancedcontentfilter/vendor/npm-asset/json-buffer/.travis.yml
new file mode 100644 (file)
index 0000000..244b7e8
--- /dev/null
@@ -0,0 +1,3 @@
+language: node_js
+node_js:
+  - '0.10'
diff --git a/advancedcontentfilter/vendor/npm-asset/json-buffer/LICENSE b/advancedcontentfilter/vendor/npm-asset/json-buffer/LICENSE
new file mode 100644 (file)
index 0000000..b799ec0
--- /dev/null
@@ -0,0 +1,22 @@
+Copyright (c) 2013 Dominic Tarr
+
+Permission is hereby granted, free of charge, 
+to any person obtaining a copy of this software and 
+associated documentation files (the "Software"), to 
+deal in the Software without restriction, including 
+without limitation the rights to use, copy, modify, 
+merge, publish, distribute, sublicense, and/or sell 
+copies of the Software, and to permit persons to whom 
+the Software is furnished to do so, 
+subject to the following conditions:
+
+The above copyright notice and this permission notice 
+shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR 
+ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/advancedcontentfilter/vendor/npm-asset/json-buffer/README.md b/advancedcontentfilter/vendor/npm-asset/json-buffer/README.md
new file mode 100644 (file)
index 0000000..43857bb
--- /dev/null
@@ -0,0 +1,24 @@
+# json-buffer
+
+JSON functions that can convert buffers!
+
+[![build status](https://secure.travis-ci.org/dominictarr/json-buffer.png)](http://travis-ci.org/dominictarr/json-buffer)
+
+[![testling badge](https://ci.testling.com/dominictarr/json-buffer.png)](https://ci.testling.com/dominictarr/json-buffer)
+
+JSON mangles buffers by converting to an array...
+which isn't helpful. json-buffers converts to base64 instead,
+and deconverts base64 to a buffer.
+
+``` js
+var JSONB = require('json-buffer')
+var Buffer = require('buffer').Buffer
+
+var str = JSONB.stringify(new Buffer('hello there!'))
+
+console.log(JSONB.parse(str)) //GET a BUFFER back
+```
+
+## License
+
+MIT
diff --git a/advancedcontentfilter/vendor/npm-asset/json-buffer/index.js b/advancedcontentfilter/vendor/npm-asset/json-buffer/index.js
new file mode 100644 (file)
index 0000000..9cafed8
--- /dev/null
@@ -0,0 +1,58 @@
+//TODO: handle reviver/dehydrate function like normal
+//and handle indentation, like normal.
+//if anyone needs this... please send pull request.
+
+exports.stringify = function stringify (o) {
+  if('undefined' == typeof o) return o
+
+  if(o && Buffer.isBuffer(o))
+    return JSON.stringify(':base64:' + o.toString('base64'))
+
+  if(o && o.toJSON)
+    o =  o.toJSON()
+
+  if(o && 'object' === typeof o) {
+    var s = ''
+    var array = Array.isArray(o)
+    s = array ? '[' : '{'
+    var first = true
+
+    for(var k in o) {
+      var ignore = 'function' == typeof o[k] || (!array && 'undefined' === typeof o[k])
+      if(Object.hasOwnProperty.call(o, k) && !ignore) {
+        if(!first)
+          s += ','
+        first = false
+        if (array) {
+          if(o[k] == undefined)
+            s += 'null'
+          else
+            s += stringify(o[k])
+        } else if (o[k] !== void(0)) {
+          s += stringify(k) + ':' + stringify(o[k])
+        }
+      }
+    }
+
+    s += array ? ']' : '}'
+
+    return s
+  } else if ('string' === typeof o) {
+    return JSON.stringify(/^:/.test(o) ? ':' + o : o)
+  } else if ('undefined' === typeof o) {
+    return 'null';
+  } else
+    return JSON.stringify(o)
+}
+
+exports.parse = function (s) {
+  return JSON.parse(s, function (key, value) {
+    if('string' === typeof value) {
+      if(/^:base64:/.test(value))
+        return new Buffer(value.substring(8), 'base64')
+      else
+        return /^:/.test(value) ? value.substring(1) : value 
+    }
+    return value
+  })
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/json-buffer/package.json b/advancedcontentfilter/vendor/npm-asset/json-buffer/package.json
new file mode 100644 (file)
index 0000000..035df50
--- /dev/null
@@ -0,0 +1,34 @@
+{
+  "name": "json-buffer",
+  "description": "JSON parse & stringify that supports binary via bops & base64",
+  "version": "3.0.0",
+  "homepage": "https://github.com/dominictarr/json-buffer",
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/dominictarr/json-buffer.git"
+  },
+  "devDependencies": {
+    "tape": "^4.6.3"
+  },
+  "scripts": {
+    "test": "set -e; for t in test/*.js; do node $t; done"
+  },
+  "author": "Dominic Tarr <dominic.tarr@gmail.com> (http://dominictarr.com)",
+  "license": "MIT",
+  "testling": {
+    "files": "test/*.js",
+    "browsers": [
+      "ie/8..latest",
+      "firefox/17..latest",
+      "firefox/nightly",
+      "chrome/22..latest",
+      "chrome/canary",
+      "opera/12..latest",
+      "opera/next",
+      "safari/5.1..latest",
+      "ipad/6.0..latest",
+      "iphone/6.0..latest",
+      "android-browser/4.2..latest"
+    ]
+  }
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/json-buffer/test/index.js b/advancedcontentfilter/vendor/npm-asset/json-buffer/test/index.js
new file mode 100644 (file)
index 0000000..8351804
--- /dev/null
@@ -0,0 +1,63 @@
+
+var test = require('tape')
+var _JSON = require('../')
+
+function clone (o) {
+  return JSON.parse(JSON.stringify(o))
+}
+
+var examples = {
+  simple: { foo: [], bar: {}, baz: new Buffer('some binary data') },
+  just_buffer: new Buffer('JUST A BUFFER'),
+  all_types: {
+    string:'hello',
+    number: 3145,
+    null: null,
+    object: {},
+    array: [],
+    boolean: true,
+    boolean2: false
+  },
+  foo: new Buffer('foo'),
+  foo2: new Buffer('foo2'),
+  escape: {
+    buffer: new Buffer('x'),
+    string: _JSON.stringify(new Buffer('x'))
+  },
+  escape2: {
+    buffer: new Buffer('x'),
+    string: ':base64:'+ new Buffer('x').toString('base64')
+  },
+  undefined: {
+    empty: undefined, test: true
+  },
+  undefined2: {
+    first: 1, empty: undefined, test: true
+  },
+  undefinedArray: {
+    array: [undefined, 1, 'two']
+  },
+  fn: {
+    fn: function () {}    
+  },
+  undefined: undefined
+}
+
+for(k in examples)
+(function (value, k) { 
+  test(k, function (t) {
+    var s = _JSON.stringify(value)
+    console.log('parse', s)
+    if(JSON.stringify(value) !== undefined) {
+      console.log(s)
+      var _value = _JSON.parse(s)
+      t.deepEqual(clone(_value), clone(value))
+    }
+    else
+      t.equal(s, undefined)
+    t.end()
+  })
+})(examples[k], k)
+
+
+
diff --git a/advancedcontentfilter/vendor/npm-asset/keyv/LICENSE b/advancedcontentfilter/vendor/npm-asset/keyv/LICENSE
new file mode 100644 (file)
index 0000000..f27ee9b
--- /dev/null
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2017 Luke Childs
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/advancedcontentfilter/vendor/npm-asset/keyv/README.md b/advancedcontentfilter/vendor/npm-asset/keyv/README.md
new file mode 100644 (file)
index 0000000..3c6d6d2
--- /dev/null
@@ -0,0 +1,243 @@
+<h1 align="center">
+       <img width="250" src="https://rawgit.com/lukechilds/keyv/master/media/logo.svg" alt="keyv">
+       <br>
+       <br>
+</h1>
+
+> Simple key-value storage with support for multiple backends
+
+[![Build Status](https://travis-ci.org/lukechilds/keyv.svg?branch=master)](https://travis-ci.org/lukechilds/keyv)
+[![Coverage Status](https://coveralls.io/repos/github/lukechilds/keyv/badge.svg?branch=master)](https://coveralls.io/github/lukechilds/keyv?branch=master)
+[![npm](https://img.shields.io/npm/v/keyv.svg)](https://www.npmjs.com/package/keyv)
+
+Keyv provides a consistent interface for key-value storage across multiple backends via storage adapters. It supports TTL based expiry, making it suitable as a cache or a persistent key-value store.
+
+## Features
+
+There are a few existing modules similar to Keyv, however Keyv is different because it:
+
+- Isn't bloated
+- Has a simple Promise based API
+- Suitable as a TTL based cache or persistent key-value store
+- [Easily embeddable](#add-cache-support-to-your-module) inside another module
+- Works with any storage that implements the [`Map`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map) API
+- Handles all JavaScript types (values can be `Buffer`/`null`/`undefined`)
+- Supports namespaces
+- Wide range of [**efficient, well tested**](#official-storage-adapters) storage adapters
+- Connection errors are passed through (db failures won't kill your app)
+- Supports the current active LTS version of Node.js or higher
+
+## Usage
+
+Install Keyv.
+
+```
+npm install --save keyv
+```
+
+By default everything is stored in memory, you can optionally also install a storage adapter.
+
+```
+npm install --save @keyv/redis
+npm install --save @keyv/mongo
+npm install --save @keyv/sqlite
+npm install --save @keyv/postgres
+npm install --save @keyv/mysql
+```
+
+Create a new Keyv instance, passing your connection string if applicable. Keyv will automatically load the correct storage adapter.
+
+```js
+const Keyv = require('keyv');
+
+// One of the following
+const keyv = new Keyv();
+const keyv = new Keyv('redis://user:pass@localhost:6379');
+const keyv = new Keyv('mongodb://user:pass@localhost:27017/dbname');
+const keyv = new Keyv('sqlite://path/to/database.sqlite');
+const keyv = new Keyv('postgresql://user:pass@localhost:5432/dbname');
+const keyv = new Keyv('mysql://user:pass@localhost:3306/dbname');
+
+// Handle DB connection errors
+keyv.on('error' err => console.log('Connection Error', err));
+
+await keyv.set('foo', 'expires in 1 second', 1000); // true
+await keyv.set('foo', 'never expires'); // true
+await keyv.get('foo'); // 'never expires'
+await keyv.delete('foo'); // true
+await keyv.clear(); // undefined
+```
+
+### Namespaces
+
+You can namespace your Keyv instance to avoid key collisions and allow you to clear only a certain namespace while using the same database.
+
+```js
+const users = new Keyv('redis://user:pass@localhost:6379', { namespace: 'users' });
+const cache = new Keyv('redis://user:pass@localhost:6379', { namespace: 'cache' });
+
+await users.set('foo', 'users'); // true
+await cache.set('foo', 'cache'); // true
+await users.get('foo'); // 'users'
+await cache.get('foo'); // 'cache'
+await users.clear(); // undefined
+await users.get('foo'); // undefined
+await cache.get('foo'); // 'cache'
+```
+
+## Official Storage Adapters
+
+The official storage adapters are covered by [over 150 integration tests](https://travis-ci.org/lukechilds/keyv/jobs/260418145) to guarantee consistent behaviour. They are lightweight, efficient wrappers over the DB clients making use of indexes and native TTLs where available.
+
+Database | Adapter | Native TTL | Status
+---|---|---|---
+Redis | [@keyv/redis](https://github.com/lukechilds/keyv-redis) | Yes | [![Build Status](https://travis-ci.org/lukechilds/keyv-redis.svg?branch=master)](https://travis-ci.org/lukechilds/keyv-redis) [![Coverage Status](https://coveralls.io/repos/github/lukechilds/keyv-redis/badge.svg?branch=master)](https://coveralls.io/github/lukechilds/keyv-redis?branch=master)
+MongoDB | [@keyv/mongo](https://github.com/lukechilds/keyv-mongo) | Yes | [![Build Status](https://travis-ci.org/lukechilds/keyv-mongo.svg?branch=master)](https://travis-ci.org/lukechilds/keyv-mongo) [![Coverage Status](https://coveralls.io/repos/github/lukechilds/keyv-mongo/badge.svg?branch=master)](https://coveralls.io/github/lukechilds/keyv-mongo?branch=master)
+SQLite | [@keyv/sqlite](https://github.com/lukechilds/keyv-sqlite) | No | [![Build Status](https://travis-ci.org/lukechilds/keyv-sqlite.svg?branch=master)](https://travis-ci.org/lukechilds/keyv-sqlite) [![Coverage Status](https://coveralls.io/repos/github/lukechilds/keyv-sqlite/badge.svg?branch=master)](https://coveralls.io/github/lukechilds/keyv-sqlite?branch=master)
+PostgreSQL | [@keyv/postgres](https://github.com/lukechilds/keyv-postgres) | No | [![Build Status](https://travis-ci.org/lukechilds/keyv-postgres.svg?branch=master)](https://travis-ci.org/lukechildskeyv-postgreskeyv) [![Coverage Status](https://coveralls.io/repos/github/lukechilds/keyv-postgres/badge.svg?branch=master)](https://coveralls.io/github/lukechilds/keyv-postgres?branch=master)
+MySQL | [@keyv/mysql](https://github.com/lukechilds/keyv-mysql) | No | [![Build Status](https://travis-ci.org/lukechilds/keyv-mysql.svg?branch=master)](https://travis-ci.org/lukechilds/keyv-mysql) [![Coverage Status](https://coveralls.io/repos/github/lukechilds/keyv-mysql/badge.svg?branch=master)](https://coveralls.io/github/lukechilds/keyv-mysql?branch=master)
+
+## Third-party Storage Adapters
+
+You can also use third-party storage adapters or build your own. Keyv will wrap these storage adapters in TTL functionality and handle complex types internally.
+
+```js
+const Keyv = require('keyv');
+const myAdapter = require('./my-storage-adapter');
+
+const keyv = new Keyv({ store: myAdapter });
+```
+
+Any store that follows the [`Map`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map) api will work.
+
+```js
+new Keyv({ store: new Map() });
+```
+
+For example, [`quick-lru`](https://github.com/sindresorhus/quick-lru) is a completely unrelated module that implements the Map API.
+
+```js
+const Keyv = require('keyv');
+const QuickLRU = require('quick-lru');
+
+const lru = new QuickLRU({ maxSize: 1000 });
+const keyv = new Keyv({ store: lru });
+```
+
+## Add Cache Support to your Module
+
+Keyv is designed to be easily embedded into other modules to add cache support. The recommended pattern is to expose a `cache` option in your modules options which is passed through to Keyv. Caching will work in memory by default and users have the option to also install a Keyv storage adapter and pass in a connection string, or any other storage that implements the `Map` API.
+
+You should also set a namespace for your module so you can safely call `.clear()` without clearing unrelated app data.
+
+Inside your module:
+
+```js
+class AwesomeModule {
+       constructor(opts) {
+               this.cache = new Keyv({
+                       uri: typeof opts.cache === 'string' && opts.cache,
+                       store: typeof opts.cache !== 'string' && opts.cache,
+                       namespace: 'awesome-module'
+               });
+       }
+}
+```
+
+Now it can be consumed like this:
+
+```js
+const AwesomeModule = require('awesome-module');
+
+// Caches stuff in memory by default
+const awesomeModule = new AwesomeModule();
+
+// After npm install --save keyv-redis
+const awesomeModule = new AwesomeModule({ cache: 'redis://localhost' });
+
+// Some third-party module that implements the Map API
+const awesomeModule = new AwesomeModule({ cache: some3rdPartyStore });
+```
+
+## API
+
+### new Keyv([uri], [options])
+
+Returns a new Keyv instance.
+
+The Keyv instance is also an `EventEmitter` that will emit an `'error'` event if the storage adapter connection fails.
+
+### uri
+
+Type: `String`<br>
+Default: `undefined`
+
+The connection string URI.
+
+Merged into the options object as options.uri.
+
+### options
+
+Type: `Object`
+
+The options object is also passed through to the storage adapter. Check your storage adapter docs for any extra options.
+
+#### options.namespace
+
+Type: `String`<br>
+Default: `'keyv'`
+
+Namespace for the current instance.
+
+#### options.ttl
+
+Type: `Number`<br>
+Default: `undefined`
+
+Default TTL. Can be overridden by specififying a TTL on `.set()`.
+
+#### options.store
+
+Type: `Storage adapter instance`<br>
+Default: `new Map()`
+
+The storage adapter instance to be used by Keyv.
+
+#### options.adapter
+
+Type: `String`<br>
+Default: `undefined`
+
+Specify an adapter to use. e.g `'redis'` or `'mongodb'`.
+
+### Instance
+
+Keys must always be strings. Values can be of any type.
+
+#### .set(key, value, [ttl])
+
+Set a value.
+
+By default keys are persistent. You can set an expiry TTL in milliseconds.
+
+Returns `true`.
+
+#### .get(key)
+
+Returns the value.
+
+#### .delete(key)
+
+Deletes an entry.
+
+Returns `true` if the key existed, `false` if not.
+
+#### .clear()
+
+Delete all entries in the current namespace.
+
+Returns `undefined`.
+
+## License
+
+MIT © Luke Childs
diff --git a/advancedcontentfilter/vendor/npm-asset/keyv/package.json b/advancedcontentfilter/vendor/npm-asset/keyv/package.json
new file mode 100644 (file)
index 0000000..3962885
--- /dev/null
@@ -0,0 +1,49 @@
+{
+  "name": "keyv",
+  "version": "3.0.0",
+  "description": "Simple key-value storage with support for multiple backends",
+  "main": "src/index.js",
+  "scripts": {
+    "test": "xo && nyc ava test/keyv.js",
+    "test:full": "xo && nyc ava --serial",
+    "coverage": "nyc report --reporter=text-lcov | coveralls"
+  },
+  "xo": {
+    "extends": "xo-lukechilds"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/lukechilds/keyv.git"
+  },
+  "keywords": [
+    "key",
+    "value",
+    "store",
+    "cache",
+    "ttl"
+  ],
+  "author": "Luke Childs <lukechilds123@gmail.com> (http://lukechilds.co.uk)",
+  "license": "MIT",
+  "bugs": {
+    "url": "https://github.com/lukechilds/keyv/issues"
+  },
+  "homepage": "https://github.com/lukechilds/keyv",
+  "dependencies": {
+    "json-buffer": "3.0.0"
+  },
+  "devDependencies": {
+    "ava": "^0.22.0",
+    "coveralls": "^3.0.0",
+    "eslint-config-xo-lukechilds": "^1.0.0",
+    "@keyv/mongo": "*",
+    "@keyv/mysql": "*",
+    "@keyv/postgres": "*",
+    "@keyv/redis": "*",
+    "@keyv/sqlite": "*",
+    "@keyv/test-suite": "*",
+    "nyc": "^11.0.3",
+    "this": "^1.0.2",
+    "timekeeper": "^2.0.0",
+    "xo": "^0.19.0"
+  }
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/keyv/src/index.js b/advancedcontentfilter/vendor/npm-asset/keyv/src/index.js
new file mode 100644 (file)
index 0000000..ab714b2
--- /dev/null
@@ -0,0 +1,99 @@
+'use strict';
+
+const EventEmitter = require('events');
+const JSONB = require('json-buffer');
+
+const loadStore = opts => {
+       const adapters = {
+               redis: '@keyv/redis',
+               mongodb: '@keyv/mongo',
+               mongo: '@keyv/mongo',
+               sqlite: '@keyv/sqlite',
+               postgresql: '@keyv/postgres',
+               postgres: '@keyv/postgres',
+               mysql: '@keyv/mysql'
+       };
+       if (opts.adapter || opts.uri) {
+               const adapter = opts.adapter || /^[^:]*/.exec(opts.uri)[0];
+               return new (require(adapters[adapter]))(opts);
+       }
+       return new Map();
+};
+
+class Keyv extends EventEmitter {
+       constructor(uri, opts) {
+               super();
+               this.opts = Object.assign(
+                       { namespace: 'keyv' },
+                       (typeof uri === 'string') ? { uri } : uri,
+                       opts
+               );
+
+               if (!this.opts.store) {
+                       const adapterOpts = Object.assign({}, this.opts);
+                       this.opts.store = loadStore(adapterOpts);
+               }
+
+               if (typeof this.opts.store.on === 'function') {
+                       this.opts.store.on('error', err => this.emit('error', err));
+               }
+
+               this.opts.store.namespace = this.opts.namespace;
+       }
+
+       _getKeyPrefix(key) {
+               return `${this.opts.namespace}:${key}`;
+       }
+
+       get(key) {
+               key = this._getKeyPrefix(key);
+               const store = this.opts.store;
+               return Promise.resolve()
+                       .then(() => store.get(key))
+                       .then(data => {
+                               data = (typeof data === 'string') ? JSONB.parse(data) : data;
+                               if (data === undefined) {
+                                       return undefined;
+                               }
+                               if (typeof data.expires === 'number' && Date.now() > data.expires) {
+                                       this.delete(key);
+                                       return undefined;
+                               }
+                               return data.value;
+                       });
+       }
+
+       set(key, value, ttl) {
+               key = this._getKeyPrefix(key);
+               if (typeof ttl === 'undefined') {
+                       ttl = this.opts.ttl;
+               }
+               if (ttl === 0) {
+                       ttl = undefined;
+               }
+               const store = this.opts.store;
+
+               return Promise.resolve()
+                       .then(() => {
+                               const expires = (typeof ttl === 'number') ? (Date.now() + ttl) : null;
+                               value = { value, expires };
+                               return store.set(key, JSONB.stringify(value), ttl);
+                       })
+                       .then(() => true);
+       }
+
+       delete(key) {
+               key = this._getKeyPrefix(key);
+               const store = this.opts.store;
+               return Promise.resolve()
+                       .then(() => store.delete(key));
+       }
+
+       clear() {
+               const store = this.opts.store;
+               return Promise.resolve()
+                       .then(() => store.clear());
+       }
+}
+
+module.exports = Keyv;
diff --git a/advancedcontentfilter/vendor/npm-asset/lowercase-keys/index.js b/advancedcontentfilter/vendor/npm-asset/lowercase-keys/index.js
new file mode 100644 (file)
index 0000000..b8d8898
--- /dev/null
@@ -0,0 +1,11 @@
+'use strict';
+module.exports = function (obj) {
+       var ret = {};
+       var keys = Object.keys(Object(obj));
+
+       for (var i = 0; i < keys.length; i++) {
+               ret[keys[i].toLowerCase()] = obj[keys[i]];
+       }
+
+       return ret;
+};
diff --git a/advancedcontentfilter/vendor/npm-asset/lowercase-keys/package.json b/advancedcontentfilter/vendor/npm-asset/lowercase-keys/package.json
new file mode 100644 (file)
index 0000000..7e4e396
--- /dev/null
@@ -0,0 +1,35 @@
+{
+  "name": "lowercase-keys",
+  "version": "1.0.0",
+  "description": "Lowercase the keys of an object",
+  "license": "MIT",
+  "repository": "sindresorhus/lowercase-keys",
+  "author": {
+    "name": "Sindre Sorhus",
+    "email": "sindresorhus@gmail.com",
+    "url": "sindresorhus.com"
+  },
+  "engines": {
+    "node": ">=0.10.0"
+  },
+  "scripts": {
+    "test": "node test.js"
+  },
+  "files": [
+    "index.js"
+  ],
+  "keywords": [
+    "object",
+    "assign",
+    "extend",
+    "properties",
+    "lowercase",
+    "lower-case",
+    "case",
+    "keys",
+    "key"
+  ],
+  "devDependencies": {
+    "ava": "0.0.4"
+  }
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/lowercase-keys/readme.md b/advancedcontentfilter/vendor/npm-asset/lowercase-keys/readme.md
new file mode 100644 (file)
index 0000000..dc65770
--- /dev/null
@@ -0,0 +1,33 @@
+# lowercase-keys [![Build Status](https://travis-ci.org/sindresorhus/lowercase-keys.svg?branch=master)](https://travis-ci.org/sindresorhus/lowercase-keys)
+
+> Lowercase the keys of an object
+
+
+## Install
+
+```
+$ npm install --save lowercase-keys
+```
+
+
+## Usage
+
+```js
+var lowercaseKeys = require('lowercase-keys');
+
+lowercaseKeys({FOO: true, bAr: false});
+//=> {foo: true, bar: false}
+```
+
+
+## API
+
+### lowercaseKeys(object)
+
+Lowercases the keys and returns a new object.
+
+
+
+## License
+
+MIT © [Sindre Sorhus](http://sindresorhus.com)
diff --git a/advancedcontentfilter/vendor/npm-asset/mimic-response/index.js b/advancedcontentfilter/vendor/npm-asset/mimic-response/index.js
new file mode 100644 (file)
index 0000000..b8ac769
--- /dev/null
@@ -0,0 +1,33 @@
+'use strict';
+
+// We define these manually to ensure they're always copied
+// even if they would move up the prototype chain
+// https://nodejs.org/api/http.html#http_class_http_incomingmessage
+const knownProps = [
+       'destroy',
+       'setTimeout',
+       'socket',
+       'headers',
+       'trailers',
+       'rawHeaders',
+       'statusCode',
+       'httpVersion',
+       'httpVersionMinor',
+       'httpVersionMajor',
+       'rawTrailers',
+       'statusMessage'
+];
+
+module.exports = (fromStream, toStream) => {
+       const toProps = Object.keys(toStream);
+       const fromProps = new Set(Object.keys(fromStream).concat(knownProps));
+
+       for (const prop of fromProps) {
+               // Don't overwrite existing properties
+               if (toProps.indexOf(prop) !== -1) {
+                       continue;
+               }
+
+               toStream[prop] = typeof fromStream[prop] === 'function' ? fromStream[prop].bind(fromStream) : fromStream[prop];
+       }
+};
diff --git a/advancedcontentfilter/vendor/npm-asset/mimic-response/license b/advancedcontentfilter/vendor/npm-asset/mimic-response/license
new file mode 100644 (file)
index 0000000..e7af2f7
--- /dev/null
@@ -0,0 +1,9 @@
+MIT License
+
+Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/advancedcontentfilter/vendor/npm-asset/mimic-response/package.json b/advancedcontentfilter/vendor/npm-asset/mimic-response/package.json
new file mode 100644 (file)
index 0000000..2ba4434
--- /dev/null
@@ -0,0 +1,37 @@
+{
+  "name": "mimic-response",
+  "version": "1.0.0",
+  "description": "Mimic a Node.js HTTP response stream",
+  "license": "MIT",
+  "repository": "sindresorhus/mimic-response",
+  "author": {
+    "name": "Sindre Sorhus",
+    "email": "sindresorhus@gmail.com",
+    "url": "sindresorhus.com"
+  },
+  "engines": {
+    "node": ">=4"
+  },
+  "scripts": {
+    "test": "xo && ava"
+  },
+  "files": [
+    "index.js"
+  ],
+  "keywords": [
+    "mimic",
+    "response",
+    "stream",
+    "http",
+    "https",
+    "request",
+    "get",
+    "core"
+  ],
+  "devDependencies": {
+    "ava": "*",
+    "create-test-server": "^0.1.0",
+    "pify": "^3.0.0",
+    "xo": "*"
+  }
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/mimic-response/readme.md b/advancedcontentfilter/vendor/npm-asset/mimic-response/readme.md
new file mode 100644 (file)
index 0000000..e07ec66
--- /dev/null
@@ -0,0 +1,54 @@
+# mimic-response [![Build Status](https://travis-ci.org/sindresorhus/mimic-response.svg?branch=master)](https://travis-ci.org/sindresorhus/mimic-response)
+
+> Mimic a [Node.js HTTP response stream](https://nodejs.org/api/http.html#http_class_http_incomingmessage)
+
+
+## Install
+
+```
+$ npm install mimic-response
+```
+
+
+## Usage
+
+```js
+const stream = require('stream');
+const mimicResponse = require('mimic-response');
+
+const responseStream = getHttpResponseStream();
+const myStream = new stream.PassThrough();
+
+mimicResponse(responseStream, myStream);
+
+console.log(myStream.statusCode);
+//=> 200
+```
+
+
+## API
+
+### mimicResponse(from, to)
+
+#### from
+
+Type: `Stream`
+
+[Node.js HTTP response stream.](https://nodejs.org/api/http.html#http_class_http_incomingmessage)
+
+#### to
+
+Type: `Stream`
+
+Any stream.
+
+
+## Related
+
+- [mimic-fn](https://github.com/sindresorhus/mimic-fn) - Make a function mimic another one
+- [clone-response](https://github.com/lukechilds/clone-response) - Clone a Node.js response stream
+
+
+## License
+
+MIT © [Sindre Sorhus](https://sindresorhus.com)
diff --git a/advancedcontentfilter/vendor/npm-asset/normalize-url/index.js b/advancedcontentfilter/vendor/npm-asset/normalize-url/index.js
new file mode 100644 (file)
index 0000000..76d150a
--- /dev/null
@@ -0,0 +1,163 @@
+'use strict';
+const url = require('url');
+const punycode = require('punycode');
+const queryString = require('query-string');
+const prependHttp = require('prepend-http');
+const sortKeys = require('sort-keys');
+
+const DEFAULT_PORTS = {
+       'http:': 80,
+       'https:': 443,
+       'ftp:': 21
+};
+
+// Protocols that always contain a `//`` bit
+const slashedProtocol = {
+       http: true,
+       https: true,
+       ftp: true,
+       gopher: true,
+       file: true,
+       'http:': true,
+       'https:': true,
+       'ftp:': true,
+       'gopher:': true,
+       'file:': true
+};
+
+function testParameter(name, filters) {
+       return filters.some(filter => filter instanceof RegExp ? filter.test(name) : filter === name);
+}
+
+module.exports = (str, opts) => {
+       opts = Object.assign({
+               normalizeProtocol: true,
+               normalizeHttps: false,
+               stripFragment: true,
+               stripWWW: true,
+               removeQueryParameters: [/^utm_\w+/i],
+               removeTrailingSlash: true,
+               removeDirectoryIndex: false,
+               sortQueryParameters: true
+       }, opts);
+
+       if (typeof str !== 'string') {
+               throw new TypeError('Expected a string');
+       }
+
+       const hasRelativeProtocol = str.startsWith('//');
+
+       // Prepend protocol
+       str = prependHttp(str.trim()).replace(/^\/\//, 'http://');
+
+       const urlObj = url.parse(str);
+
+       if (opts.normalizeHttps && urlObj.protocol === 'https:') {
+               urlObj.protocol = 'http:';
+       }
+
+       if (!urlObj.hostname && !urlObj.pathname) {
+               throw new Error('Invalid URL');
+       }
+
+       // Prevent these from being used by `url.format`
+       delete urlObj.host;
+       delete urlObj.query;
+
+       // Remove fragment
+       if (opts.stripFragment) {
+               delete urlObj.hash;
+       }
+
+       // Remove default port
+       const port = DEFAULT_PORTS[urlObj.protocol];
+       if (Number(urlObj.port) === port) {
+               delete urlObj.port;
+       }
+
+       // Remove duplicate slashes
+       if (urlObj.pathname) {
+               urlObj.pathname = urlObj.pathname.replace(/\/{2,}/g, '/');
+       }
+
+       // Decode URI octets
+       if (urlObj.pathname) {
+               urlObj.pathname = decodeURI(urlObj.pathname);
+       }
+
+       // Remove directory index
+       if (opts.removeDirectoryIndex === true) {
+               opts.removeDirectoryIndex = [/^index\.[a-z]+$/];
+       }
+
+       if (Array.isArray(opts.removeDirectoryIndex) && opts.removeDirectoryIndex.length > 0) {
+               let pathComponents = urlObj.pathname.split('/');
+               const lastComponent = pathComponents[pathComponents.length - 1];
+
+               if (testParameter(lastComponent, opts.removeDirectoryIndex)) {
+                       pathComponents = pathComponents.slice(0, pathComponents.length - 1);
+                       urlObj.pathname = pathComponents.slice(1).join('/') + '/';
+               }
+       }
+
+       // Resolve relative paths, but only for slashed protocols
+       if (slashedProtocol[urlObj.protocol]) {
+               const domain = urlObj.protocol + '//' + urlObj.hostname;
+               const relative = url.resolve(domain, urlObj.pathname);
+               urlObj.pathname = relative.replace(domain, '');
+       }
+
+       if (urlObj.hostname) {
+               // IDN to Unicode
+               urlObj.hostname = punycode.toUnicode(urlObj.hostname).toLowerCase();
+
+               // Remove trailing dot
+               urlObj.hostname = urlObj.hostname.replace(/\.$/, '');
+
+               // Remove `www.`
+               if (opts.stripWWW) {
+                       urlObj.hostname = urlObj.hostname.replace(/^www\./, '');
+               }
+       }
+
+       // Remove URL with empty query string
+       if (urlObj.search === '?') {
+               delete urlObj.search;
+       }
+
+       const queryParameters = queryString.parse(urlObj.search);
+
+       // Remove query unwanted parameters
+       if (Array.isArray(opts.removeQueryParameters)) {
+               for (const key in queryParameters) {
+                       if (testParameter(key, opts.removeQueryParameters)) {
+                               delete queryParameters[key];
+                       }
+               }
+       }
+
+       // Sort query parameters
+       if (opts.sortQueryParameters) {
+               urlObj.search = queryString.stringify(sortKeys(queryParameters));
+       }
+
+       // Decode query parameters
+       if (urlObj.search !== null) {
+               urlObj.search = decodeURIComponent(urlObj.search);
+       }
+
+       // Take advantage of many of the Node `url` normalizations
+       str = url.format(urlObj);
+
+       // Remove ending `/`
+       if (opts.removeTrailingSlash || urlObj.pathname === '/') {
+               str = str.replace(/\/$/, '');
+       }
+
+       // Restore relative protocol, if applicable
+       if (hasRelativeProtocol && !opts.normalizeProtocol) {
+               str = str.replace(/^http:\/\//, '//');
+       }
+
+       return str;
+};
diff --git a/advancedcontentfilter/vendor/npm-asset/normalize-url/license b/advancedcontentfilter/vendor/npm-asset/normalize-url/license
new file mode 100644 (file)
index 0000000..e7af2f7
--- /dev/null
@@ -0,0 +1,9 @@
+MIT License
+
+Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/advancedcontentfilter/vendor/npm-asset/normalize-url/package.json b/advancedcontentfilter/vendor/npm-asset/normalize-url/package.json
new file mode 100644 (file)
index 0000000..c9d834c
--- /dev/null
@@ -0,0 +1,46 @@
+{
+  "name": "normalize-url",
+  "version": "2.0.1",
+  "description": "Normalize a URL",
+  "license": "MIT",
+  "repository": "sindresorhus/normalize-url",
+  "author": {
+    "name": "Sindre Sorhus",
+    "email": "sindresorhus@gmail.com",
+    "url": "sindresorhus.com"
+  },
+  "engines": {
+    "node": ">=4"
+  },
+  "scripts": {
+    "test": "xo && ava"
+  },
+  "files": [
+    "index.js"
+  ],
+  "keywords": [
+    "normalize",
+    "url",
+    "uri",
+    "address",
+    "string",
+    "normalization",
+    "normalisation",
+    "query",
+    "querystring",
+    "unicode",
+    "simplify",
+    "strip",
+    "trim",
+    "canonical"
+  ],
+  "dependencies": {
+    "prepend-http": "^2.0.0",
+    "query-string": "^5.0.1",
+    "sort-keys": "^2.0.0"
+  },
+  "devDependencies": {
+    "ava": "*",
+    "xo": "*"
+  }
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/normalize-url/readme.md b/advancedcontentfilter/vendor/npm-asset/normalize-url/readme.md
new file mode 100644 (file)
index 0000000..fceee8a
--- /dev/null
@@ -0,0 +1,172 @@
+# normalize-url [![Build Status](https://travis-ci.org/sindresorhus/normalize-url.svg?branch=master)](https://travis-ci.org/sindresorhus/normalize-url)
+
+> [Normalize](https://en.wikipedia.org/wiki/URL_normalization) a URL
+
+Useful when you need to display, store, deduplicate, sort, compare, etc, URLs.
+
+
+## Install
+
+```
+$ npm install normalize-url
+```
+
+
+## Usage
+
+```js
+const normalizeUrl = require('normalize-url');
+
+normalizeUrl('sindresorhus.com');
+//=> 'http://sindresorhus.com'
+
+normalizeUrl('HTTP://xn--xample-hva.com:80/?b=bar&a=foo');
+//=> 'http://êxample.com/?a=foo&b=bar'
+```
+
+
+## API
+
+### normalizeUrl(url, [options])
+
+#### url
+
+Type: `string`
+
+URL to normalize.
+
+#### options
+
+Type: `Object`
+
+##### normalizeProtocol
+
+Type: `boolean`<br>
+Default: `true`
+
+Prepend `http:` to the URL if it's protocol-relative.
+
+```js
+normalizeUrl('//sindresorhus.com:80/');
+//=> 'http://sindresorhus.com'
+
+normalizeUrl('//sindresorhus.com:80/', {normalizeProtocol: false});
+//=> '//sindresorhus.com'
+```
+
+##### normalizeHttps
+
+Type: `boolean`<br>
+Default: `false`
+
+Normalize `https:` URLs to `http:`.
+
+```js
+normalizeUrl('https://sindresorhus.com:80/');
+//=> 'https://sindresorhus.com'
+
+normalizeUrl('https://sindresorhus.com:80/', {normalizeHttps: true});
+//=> 'http://sindresorhus.com'
+```
+
+##### stripFragment
+
+Type: `boolean`<br>
+Default: `true`
+
+Remove the fragment at the end of the URL.
+
+```js
+normalizeUrl('sindresorhus.com/about.html#contact');
+//=> 'http://sindresorhus.com/about.html'
+
+normalizeUrl('sindresorhus.com/about.html#contact', {stripFragment: false});
+//=> 'http://sindresorhus.com/about.html#contact'
+```
+
+##### stripWWW
+
+Type: `boolean`<br>
+Default: `true`
+
+Remove `www.` from the URL.
+
+```js
+normalizeUrl('http://www.sindresorhus.com/about.html#contact');
+//=> 'http://sindresorhus.com/about.html#contact'
+
+normalizeUrl('http://www.sindresorhus.com/about.html#contact', {stripWWW: false});
+//=> 'http://www.sindresorhus.com/about.html#contact'
+```
+
+##### removeQueryParameters
+
+Type: `Array<RegExp|string>`<br>
+Default: `[/^utm_\w+/i]`
+
+Remove query parameters that matches any of the provided strings or regexes.
+
+```js
+normalizeUrl('www.sindresorhus.com?foo=bar&ref=test_ref', {
+       removeQueryParameters: ['ref']
+});
+//=> 'http://sindresorhus.com/?foo=bar'
+```
+
+##### removeTrailingSlash
+
+Type: `boolean`<br>
+Default: `true`
+
+Remove trailing slash.
+
+**Note:** Trailing slash is always removed if the URL doesn't have a pathname.
+
+```js
+normalizeUrl('http://sindresorhus.com/redirect/');
+//=> 'http://sindresorhus.com/redirect'
+
+normalizeUrl('http://sindresorhus.com/redirect/', {removeTrailingSlash: false});
+//=> 'http://sindresorhus.com/redirect/'
+
+normalizeUrl('http://sindresorhus.com/', {removeTrailingSlash: false});
+//=> 'http://sindresorhus.com'
+```
+
+##### removeDirectoryIndex
+
+Type: `boolean` `Array<RegExp|string>`<br>
+Default: `false`
+
+Remove the default directory index file from path that matches any of the provided strings or regexes. When `true`, the regex `/^index\.[a-z]+$/` is used.
+
+```js
+normalizeUrl('www.sindresorhus.com/foo/default.php', {
+       removeDirectoryIndex: [/^default\.[a-z]+$/]
+});
+//=> 'http://sindresorhus.com/foo'
+```
+
+##### sortQueryParameters
+
+Type: `boolean`<br>
+Default: `true`
+
+Sort the query parameters alphabetically by key.
+
+```js
+normalizeUrl('www.sindresorhus.com?b=two&a=one&c=three', {
+       sortQueryParameters: false
+});
+//=> 'http://sindresorhus.com/?b=two&a=one&c=three'
+```
+
+
+## Related
+
+- [compare-urls](https://github.com/sindresorhus/compare-urls) - Compare URLs by first normalizing them
+
+
+## License
+
+MIT © [Sindre Sorhus](https://sindresorhus.com)
diff --git a/advancedcontentfilter/vendor/npm-asset/object-assign/index.js b/advancedcontentfilter/vendor/npm-asset/object-assign/index.js
new file mode 100644 (file)
index 0000000..0930cf8
--- /dev/null
@@ -0,0 +1,90 @@
+/*
+object-assign
+(c) Sindre Sorhus
+@license MIT
+*/
+
+'use strict';
+/* eslint-disable no-unused-vars */
+var getOwnPropertySymbols = Object.getOwnPropertySymbols;
+var hasOwnProperty = Object.prototype.hasOwnProperty;
+var propIsEnumerable = Object.prototype.propertyIsEnumerable;
+
+function toObject(val) {
+       if (val === null || val === undefined) {
+               throw new TypeError('Object.assign cannot be called with null or undefined');
+       }
+
+       return Object(val);
+}
+
+function shouldUseNative() {
+       try {
+               if (!Object.assign) {
+                       return false;
+               }
+
+               // Detect buggy property enumeration order in older V8 versions.
+
+               // https://bugs.chromium.org/p/v8/issues/detail?id=4118
+               var test1 = new String('abc');  // eslint-disable-line no-new-wrappers
+               test1[5] = 'de';
+               if (Object.getOwnPropertyNames(test1)[0] === '5') {
+                       return false;
+               }
+
+               // https://bugs.chromium.org/p/v8/issues/detail?id=3056
+               var test2 = {};
+               for (var i = 0; i < 10; i++) {
+                       test2['_' + String.fromCharCode(i)] = i;
+               }
+               var order2 = Object.getOwnPropertyNames(test2).map(function (n) {
+                       return test2[n];
+               });
+               if (order2.join('') !== '0123456789') {
+                       return false;
+               }
+
+               // https://bugs.chromium.org/p/v8/issues/detail?id=3056
+               var test3 = {};
+               'abcdefghijklmnopqrst'.split('').forEach(function (letter) {
+                       test3[letter] = letter;
+               });
+               if (Object.keys(Object.assign({}, test3)).join('') !==
+                               'abcdefghijklmnopqrst') {
+                       return false;
+               }
+
+               return true;
+       } catch (err) {
+               // We don't expect any of the above to throw, but better to be safe.
+               return false;
+       }
+}
+
+module.exports = shouldUseNative() ? Object.assign : function (target, source) {
+       var from;
+       var to = toObject(target);
+       var symbols;
+
+       for (var s = 1; s < arguments.length; s++) {
+               from = Object(arguments[s]);
+
+               for (var key in from) {
+                       if (hasOwnProperty.call(from, key)) {
+                               to[key] = from[key];
+                       }
+               }
+
+               if (getOwnPropertySymbols) {
+                       symbols = getOwnPropertySymbols(from);
+                       for (var i = 0; i < symbols.length; i++) {
+                               if (propIsEnumerable.call(from, symbols[i])) {
+                                       to[symbols[i]] = from[symbols[i]];
+                               }
+                       }
+               }
+       }
+
+       return to;
+};
diff --git a/advancedcontentfilter/vendor/npm-asset/object-assign/license b/advancedcontentfilter/vendor/npm-asset/object-assign/license
new file mode 100644 (file)
index 0000000..654d0bf
--- /dev/null
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/advancedcontentfilter/vendor/npm-asset/object-assign/package.json b/advancedcontentfilter/vendor/npm-asset/object-assign/package.json
new file mode 100644 (file)
index 0000000..503eb1e
--- /dev/null
@@ -0,0 +1,42 @@
+{
+  "name": "object-assign",
+  "version": "4.1.1",
+  "description": "ES2015 `Object.assign()` ponyfill",
+  "license": "MIT",
+  "repository": "sindresorhus/object-assign",
+  "author": {
+    "name": "Sindre Sorhus",
+    "email": "sindresorhus@gmail.com",
+    "url": "sindresorhus.com"
+  },
+  "engines": {
+    "node": ">=0.10.0"
+  },
+  "scripts": {
+    "test": "xo && ava",
+    "bench": "matcha bench.js"
+  },
+  "files": [
+    "index.js"
+  ],
+  "keywords": [
+    "object",
+    "assign",
+    "extend",
+    "properties",
+    "es2015",
+    "ecmascript",
+    "harmony",
+    "ponyfill",
+    "prollyfill",
+    "polyfill",
+    "shim",
+    "browser"
+  ],
+  "devDependencies": {
+    "ava": "^0.16.0",
+    "lodash": "^4.16.4",
+    "matcha": "^0.7.0",
+    "xo": "^0.16.0"
+  }
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/object-assign/readme.md b/advancedcontentfilter/vendor/npm-asset/object-assign/readme.md
new file mode 100644 (file)
index 0000000..1be09d3
--- /dev/null
@@ -0,0 +1,61 @@
+# object-assign [![Build Status](https://travis-ci.org/sindresorhus/object-assign.svg?branch=master)](https://travis-ci.org/sindresorhus/object-assign)
+
+> ES2015 [`Object.assign()`](http://www.2ality.com/2014/01/object-assign.html) [ponyfill](https://ponyfill.com)
+
+
+## Use the built-in
+
+Node.js 4 and up, as well as every evergreen browser (Chrome, Edge, Firefox, Opera, Safari),
+support `Object.assign()` :tada:. If you target only those environments, then by all
+means, use `Object.assign()` instead of this package.
+
+
+## Install
+
+```
+$ npm install --save object-assign
+```
+
+
+## Usage
+
+```js
+const objectAssign = require('object-assign');
+
+objectAssign({foo: 0}, {bar: 1});
+//=> {foo: 0, bar: 1}
+
+// multiple sources
+objectAssign({foo: 0}, {bar: 1}, {baz: 2});
+//=> {foo: 0, bar: 1, baz: 2}
+
+// overwrites equal keys
+objectAssign({foo: 0}, {foo: 1}, {foo: 2});
+//=> {foo: 2}
+
+// ignores null and undefined sources
+objectAssign({foo: 0}, null, {bar: 1}, undefined);
+//=> {foo: 0, bar: 1}
+```
+
+
+## API
+
+### objectAssign(target, [source, ...])
+
+Assigns enumerable own properties of `source` objects to the `target` object and returns the `target` object. Additional `source` objects will overwrite previous ones.
+
+
+## Resources
+
+- [ES2015 spec - Object.assign](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.assign)
+
+
+## Related
+
+- [deep-assign](https://github.com/sindresorhus/deep-assign) - Recursive `Object.assign()`
+
+
+## License
+
+MIT © [Sindre Sorhus](https://sindresorhus.com)
diff --git a/advancedcontentfilter/vendor/npm-asset/p-cancelable/index.js b/advancedcontentfilter/vendor/npm-asset/p-cancelable/index.js
new file mode 100644 (file)
index 0000000..cdd0cfa
--- /dev/null
@@ -0,0 +1,88 @@
+'use strict';
+
+class CancelError extends Error {
+       constructor() {
+               super('Promise was canceled');
+               this.name = 'CancelError';
+       }
+
+       get isCanceled() {
+               return true;
+       }
+}
+
+class PCancelable {
+       static fn(userFn) {
+               return function () {
+                       const args = [].slice.apply(arguments);
+                       return new PCancelable((resolve, reject, onCancel) => {
+                               args.push(onCancel);
+                               userFn.apply(null, args).then(resolve, reject);
+                       });
+               };
+       }
+
+       constructor(executor) {
+               this._cancelHandlers = [];
+               this._isPending = true;
+               this._isCanceled = false;
+
+               this._promise = new Promise((resolve, reject) => {
+                       this._reject = reject;
+
+                       return executor(
+                               value => {
+                                       this._isPending = false;
+                                       resolve(value);
+                               },
+                               error => {
+                                       this._isPending = false;
+                                       reject(error);
+                               },
+                               handler => {
+                                       this._cancelHandlers.push(handler);
+                               }
+                       );
+               });
+       }
+
+       then(onFulfilled, onRejected) {
+               return this._promise.then(onFulfilled, onRejected);
+       }
+
+       catch(onRejected) {
+               return this._promise.catch(onRejected);
+       }
+
+       finally(onFinally) {
+               return this._promise.finally(onFinally);
+       }
+
+       cancel() {
+               if (!this._isPending || this._isCanceled) {
+                       return;
+               }
+
+               if (this._cancelHandlers.length > 0) {
+                       try {
+                               for (const handler of this._cancelHandlers) {
+                                       handler();
+                               }
+                       } catch (err) {
+                               this._reject(err);
+                       }
+               }
+
+               this._isCanceled = true;
+               this._reject(new CancelError());
+       }
+
+       get isCanceled() {
+               return this._isCanceled;
+       }
+}
+
+Object.setPrototypeOf(PCancelable.prototype, Promise.prototype);
+
+module.exports = PCancelable;
+module.exports.CancelError = CancelError;
diff --git a/advancedcontentfilter/vendor/npm-asset/p-cancelable/license b/advancedcontentfilter/vendor/npm-asset/p-cancelable/license
new file mode 100644 (file)
index 0000000..e7af2f7
--- /dev/null
@@ -0,0 +1,9 @@
+MIT License
+
+Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/advancedcontentfilter/vendor/npm-asset/p-cancelable/package.json b/advancedcontentfilter/vendor/npm-asset/p-cancelable/package.json
new file mode 100644 (file)
index 0000000..c17dff8
--- /dev/null
@@ -0,0 +1,47 @@
+{
+       "name": "p-cancelable",
+       "version": "0.4.1",
+       "description": "Create a promise that can be canceled",
+       "license": "MIT",
+       "repository": "sindresorhus/p-cancelable",
+       "author": {
+               "name": "Sindre Sorhus",
+               "email": "sindresorhus@gmail.com",
+               "url": "sindresorhus.com"
+       },
+       "engines": {
+               "node": ">=4"
+       },
+       "scripts": {
+               "test": "xo && ava"
+       },
+       "files": [
+               "index.js"
+       ],
+       "keywords": [
+               "promise",
+               "cancelable",
+               "cancel",
+               "canceled",
+               "canceling",
+               "cancellable",
+               "cancellation",
+               "abort",
+               "abortable",
+               "aborting",
+               "cleanup",
+               "task",
+               "token",
+               "async",
+               "function",
+               "await",
+               "promises",
+               "bluebird"
+       ],
+       "devDependencies": {
+               "ava": "*",
+               "delay": "^2.0.0",
+               "promise.prototype.finally": "^3.1.0",
+               "xo": "*"
+       }
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/p-cancelable/readme.md b/advancedcontentfilter/vendor/npm-asset/p-cancelable/readme.md
new file mode 100644 (file)
index 0000000..62ec32e
--- /dev/null
@@ -0,0 +1,135 @@
+# p-cancelable [![Build Status](https://travis-ci.org/sindresorhus/p-cancelable.svg?branch=master)](https://travis-ci.org/sindresorhus/p-cancelable)
+
+> Create a promise that can be canceled
+
+Useful for animation, loading resources, long-running async computations, async iteration, etc.
+
+
+## Install
+
+```
+$ npm install p-cancelable
+```
+
+
+## Usage
+
+```js
+const PCancelable = require('p-cancelable');
+
+const cancelablePromise = new PCancelable((resolve, reject, onCancel) => {
+       const worker = new SomeLongRunningOperation();
+
+       onCancel(() => {
+               worker.close();
+       });
+
+       worker.on('finish', resolve);
+       worker.on('error', reject);
+});
+
+cancelablePromise
+       .then(value => {
+               console.log('Operation finished successfully:', value);
+       })
+       .catch(error => {
+               if (cancelablePromise.isCanceled) {
+                       // Handle the cancelation here
+                       console.log('Operation was canceled');
+                       return;
+               }
+
+               throw error;
+       });
+
+// Cancel the operation after 10 seconds
+setTimeout(() => {
+       cancelablePromise.cancel();
+}, 10000);
+```
+
+
+## API
+
+### new PCancelable(executor)
+
+Same as the [`Promise` constructor](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise), but with an appended `onCancel` parameter in `executor`.
+
+`PCancelable` is a subclass of `Promise`.
+
+#### onCanceled(fn)
+
+Type: `Function`
+
+Accepts a function that is called when the promise is canceled.
+
+You're not required to call this function. You can call this function multiple times to add multiple cancel handlers.
+
+### PCancelable#cancel()
+
+Type: `Function`
+
+Cancel the promise.
+
+The cancellation is synchronous. Calling it after the promise has settled or multiple times does nothing.
+
+### PCancelable#isCanceled
+
+Type: `boolean`
+
+Whether the promise is canceled.
+
+### PCancelable.CancelError
+
+Type: `Error`
+
+Rejection reason when `.cancel()` is called.
+
+It includes a `.isCanceled` property for convenience.
+
+### PCancelable.fn(fn)
+
+Convenience method to make your promise-returning or async function cancelable.
+
+The function you specify will have `onCancel` appended to its parameters.
+
+```js
+const fn = PCancelable.fn((input, onCancel) => {
+       const job = new Job();
+
+       onCancel(() => {
+               job.cleanup();
+       });
+
+       return job.start(); //=> Promise
+});
+
+const promise = fn('input'); //=> PCancelable
+
+// …
+
+promise.cancel();
+```
+
+
+## FAQ
+
+### Cancelable vs. Cancellable
+
+[In American English, the verb cancel is usually inflected canceled and canceling—with one l.](http://grammarist.com/spelling/cancel/)<br>Both a [browser API](https://developer.mozilla.org/en-US/docs/Web/API/Event/cancelable) and the [Cancelable Promises proposal](https://github.com/tc39/proposal-cancelable-promises) use this spelling.
+
+### What about the official [Cancelable Promises proposal](https://github.com/tc39/proposal-cancelable-promises)?
+
+~~It's still an early draft and I don't really like its current direction. It complicates everything and will require deep changes in the ecosystem to adapt to it. And the way you have to use cancel tokens is verbose and convoluted. I much prefer the more pragmatic and less invasive approach in this module.~~ The proposal was withdrawn.
+
+
+## Related
+
+- [p-progress](https://github.com/sindresorhus/p-progress) - Create a promise that reports progress
+- [p-lazy](https://github.com/sindresorhus/p-lazy) - Create a lazy promise that defers execution until `.then()` or `.catch()` is called
+- [More…](https://github.com/sindresorhus/promise-fun)
+
+
+## License
+
+MIT © [Sindre Sorhus](https://sindresorhus.com)
diff --git a/advancedcontentfilter/vendor/npm-asset/p-finally/index.js b/advancedcontentfilter/vendor/npm-asset/p-finally/index.js
new file mode 100644 (file)
index 0000000..52b7b49
--- /dev/null
@@ -0,0 +1,15 @@
+'use strict';
+module.exports = (promise, onFinally) => {
+       onFinally = onFinally || (() => {});
+
+       return promise.then(
+               val => new Promise(resolve => {
+                       resolve(onFinally());
+               }).then(() => val),
+               err => new Promise(resolve => {
+                       resolve(onFinally());
+               }).then(() => {
+                       throw err;
+               })
+       );
+};
diff --git a/advancedcontentfilter/vendor/npm-asset/p-finally/license b/advancedcontentfilter/vendor/npm-asset/p-finally/license
new file mode 100644 (file)
index 0000000..654d0bf
--- /dev/null
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/advancedcontentfilter/vendor/npm-asset/p-finally/package.json b/advancedcontentfilter/vendor/npm-asset/p-finally/package.json
new file mode 100644 (file)
index 0000000..b26ab51
--- /dev/null
@@ -0,0 +1,42 @@
+{
+  "name": "p-finally",
+  "version": "1.0.0",
+  "description": "`Promise#finally()` ponyfill - Invoked when the promise is settled regardless of outcome",
+  "license": "MIT",
+  "repository": "sindresorhus/p-finally",
+  "author": {
+    "name": "Sindre Sorhus",
+    "email": "sindresorhus@gmail.com",
+    "url": "sindresorhus.com"
+  },
+  "engines": {
+    "node": ">=4"
+  },
+  "scripts": {
+    "test": "xo && ava"
+  },
+  "files": [
+    "index.js"
+  ],
+  "keywords": [
+    "promise",
+    "finally",
+    "handler",
+    "function",
+    "async",
+    "await",
+    "promises",
+    "settled",
+    "ponyfill",
+    "polyfill",
+    "shim",
+    "bluebird"
+  ],
+  "devDependencies": {
+    "ava": "*",
+    "xo": "*"
+  },
+  "xo": {
+    "esnext": true
+  }
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/p-finally/readme.md b/advancedcontentfilter/vendor/npm-asset/p-finally/readme.md
new file mode 100644 (file)
index 0000000..09ef364
--- /dev/null
@@ -0,0 +1,47 @@
+# p-finally [![Build Status](https://travis-ci.org/sindresorhus/p-finally.svg?branch=master)](https://travis-ci.org/sindresorhus/p-finally)
+
+> [`Promise#finally()`](https://github.com/tc39/proposal-promise-finally) [ponyfill](https://ponyfill.com) - Invoked when the promise is settled regardless of outcome
+
+Useful for cleanup.
+
+
+## Install
+
+```
+$ npm install --save p-finally
+```
+
+
+## Usage
+
+```js
+const pFinally = require('p-finally');
+
+const dir = createTempDir();
+
+pFinally(write(dir), () => cleanup(dir));
+```
+
+
+## API
+
+### pFinally(promise, [onFinally])
+
+Returns a `Promise`.
+
+#### onFinally
+
+Type: `Function`
+
+Note: Throwing or returning a rejected promise will reject `promise` with the rejection reason.
+
+
+## Related
+
+- [p-try](https://github.com/sindresorhus/p-try) - `Promise#try()` ponyfill - Starts a promise chain
+- [More…](https://github.com/sindresorhus/promise-fun)
+
+
+## License
+
+MIT © [Sindre Sorhus](https://sindresorhus.com)
diff --git a/advancedcontentfilter/vendor/npm-asset/p-is-promise/index.js b/advancedcontentfilter/vendor/npm-asset/p-is-promise/index.js
new file mode 100644 (file)
index 0000000..8f64f85
--- /dev/null
@@ -0,0 +1,10 @@
+'use strict';
+module.exports = x => (
+       x instanceof Promise ||
+       (
+               x !== null &&
+               typeof x === 'object' &&
+               typeof x.then === 'function' &&
+               typeof x.catch === 'function'
+       )
+);
diff --git a/advancedcontentfilter/vendor/npm-asset/p-is-promise/license b/advancedcontentfilter/vendor/npm-asset/p-is-promise/license
new file mode 100644 (file)
index 0000000..654d0bf
--- /dev/null
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/advancedcontentfilter/vendor/npm-asset/p-is-promise/package.json b/advancedcontentfilter/vendor/npm-asset/p-is-promise/package.json
new file mode 100644 (file)
index 0000000..45b9b44
--- /dev/null
@@ -0,0 +1,43 @@
+{
+  "name": "p-is-promise",
+  "version": "1.1.0",
+  "description": "Check if something is a promise",
+  "license": "MIT",
+  "repository": "sindresorhus/p-is-promise",
+  "author": {
+    "name": "Sindre Sorhus",
+    "email": "sindresorhus@gmail.com",
+    "url": "sindresorhus.com"
+  },
+  "engines": {
+    "node": ">=4"
+  },
+  "scripts": {
+    "test": "xo && ava"
+  },
+  "files": [
+    "index.js"
+  ],
+  "keywords": [
+    "promise",
+    "is",
+    "detect",
+    "check",
+    "kind",
+    "type",
+    "thenable",
+    "es2015",
+    "async",
+    "await",
+    "promises",
+    "bluebird"
+  ],
+  "devDependencies": {
+    "ava": "*",
+    "bluebird": "^3.4.6",
+    "xo": "*"
+  },
+  "xo": {
+    "esnext": true
+  }
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/p-is-promise/readme.md b/advancedcontentfilter/vendor/npm-asset/p-is-promise/readme.md
new file mode 100644 (file)
index 0000000..15edbf2
--- /dev/null
@@ -0,0 +1,43 @@
+# p-is-promise [![Build Status](https://travis-ci.org/sindresorhus/p-is-promise.svg?branch=master)](https://travis-ci.org/sindresorhus/p-is-promise)
+
+> Check if something is a promise
+
+Why not [`is-promise`](https://github.com/then/is-promise)? That module [checks for a thenable](https://github.com/then/is-promise/issues/6), not an ES2015 promise. This one is stricter.
+
+You most likely don't need this. Just pass your value to `Promise.resolve()` and let it handle it.
+
+Can be useful if you need to create a fast path for a synchronous operation.
+
+
+## Install
+
+```
+$ npm install --save p-is-promise
+```
+
+
+## Usage
+
+```js
+const pIsPromise = require('p-is-promise');
+const Bluebird = require('bluebird');
+
+pIsPromise(Promise.resolve('🦄'));
+//=> true
+
+pIsPromise(Bluebird.resolve('🦄'));
+//=> true
+
+pIsPromise('🦄');
+//=> false
+```
+
+
+## Related
+
+- [More…](https://github.com/sindresorhus/promise-fun)
+
+
+## License
+
+MIT © [Sindre Sorhus](https://sindresorhus.com)
diff --git a/advancedcontentfilter/vendor/npm-asset/p-timeout/index.js b/advancedcontentfilter/vendor/npm-asset/p-timeout/index.js
new file mode 100644 (file)
index 0000000..8393646
--- /dev/null
@@ -0,0 +1,44 @@
+'use strict';
+const pFinally = require('p-finally');
+
+class TimeoutError extends Error {
+       constructor(message) {
+               super(message);
+               this.name = 'TimeoutError';
+       }
+}
+
+module.exports = (promise, ms, fallback) => new Promise((resolve, reject) => {
+       if (typeof ms !== 'number' || ms < 0) {
+               throw new TypeError('Expected `ms` to be a positive number');
+       }
+
+       const timer = setTimeout(() => {
+               if (typeof fallback === 'function') {
+                       try {
+                               resolve(fallback());
+                       } catch (err) {
+                               reject(err);
+                       }
+                       return;
+               }
+
+               const message = typeof fallback === 'string' ? fallback : `Promise timed out after ${ms} milliseconds`;
+               const err = fallback instanceof Error ? fallback : new TimeoutError(message);
+
+               if (typeof promise.cancel === 'function') {
+                       promise.cancel();
+               }
+
+               reject(err);
+       }, ms);
+
+       pFinally(
+               promise.then(resolve, reject),
+               () => {
+                       clearTimeout(timer);
+               }
+       );
+});
+
+module.exports.TimeoutError = TimeoutError;
diff --git a/advancedcontentfilter/vendor/npm-asset/p-timeout/license b/advancedcontentfilter/vendor/npm-asset/p-timeout/license
new file mode 100644 (file)
index 0000000..e7af2f7
--- /dev/null
@@ -0,0 +1,9 @@
+MIT License
+
+Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/advancedcontentfilter/vendor/npm-asset/p-timeout/package.json b/advancedcontentfilter/vendor/npm-asset/p-timeout/package.json
new file mode 100644 (file)
index 0000000..48cb322
--- /dev/null
@@ -0,0 +1,43 @@
+{
+  "name": "p-timeout",
+  "version": "2.0.1",
+  "description": "Timeout a promise after a specified amount of time",
+  "license": "MIT",
+  "repository": "sindresorhus/p-timeout",
+  "author": {
+    "name": "Sindre Sorhus",
+    "email": "sindresorhus@gmail.com",
+    "url": "sindresorhus.com"
+  },
+  "engines": {
+    "node": ">=4"
+  },
+  "scripts": {
+    "test": "xo && ava"
+  },
+  "files": [
+    "index.js"
+  ],
+  "keywords": [
+    "promise",
+    "timeout",
+    "error",
+    "invalidate",
+    "async",
+    "await",
+    "promises",
+    "time",
+    "out",
+    "cancel",
+    "bluebird"
+  ],
+  "dependencies": {
+    "p-finally": "^1.0.0"
+  },
+  "devDependencies": {
+    "ava": "*",
+    "delay": "^2.0.0",
+    "p-cancelable": "^0.3.0",
+    "xo": "*"
+  }
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/p-timeout/readme.md b/advancedcontentfilter/vendor/npm-asset/p-timeout/readme.md
new file mode 100644 (file)
index 0000000..94ff3e3
--- /dev/null
@@ -0,0 +1,89 @@
+# p-timeout [![Build Status](https://travis-ci.org/sindresorhus/p-timeout.svg?branch=master)](https://travis-ci.org/sindresorhus/p-timeout)
+
+> Timeout a promise after a specified amount of time
+
+
+## Install
+
+```
+$ npm install p-timeout
+```
+
+
+## Usage
+
+```js
+const delay = require('delay');
+const pTimeout = require('p-timeout');
+
+const delayedPromise = delay(200);
+
+pTimeout(delayedPromise, 50).then(() => 'foo');
+//=> [TimeoutError: Promise timed out after 50 milliseconds]
+```
+
+
+## API
+
+### pTimeout(input, ms, [message | fallback])
+
+Returns a decorated `input` that times out after `ms` time.
+
+If you pass in a cancelable promise, specifically a promise with a `.cancel()` method, that method will be called when the `pTimeout` promise times out.
+
+#### input
+
+Type: `Promise`
+
+Promise to decorate.
+
+#### ms
+
+Type: `number`
+
+Milliseconds before timing out.
+
+#### message
+
+Type: `string` `Error`<br>
+Default: `'Promise timed out after 50 milliseconds'`
+
+Specify a custom error message or error.
+
+If you do a custom error, it's recommended to sub-class `pTimeout.TimeoutError`.
+
+#### fallback
+
+Type: `Function`
+
+Do something other than rejecting with an error on timeout.
+
+You could for example retry:
+
+```js
+const delay = require('delay');
+const pTimeout = require('p-timeout');
+
+const delayedPromise = () => delay(200);
+
+pTimeout(delayedPromise(), 50, () => {
+       return pTimeout(delayedPromise(), 300);
+});
+```
+
+### pTimeout.TimeoutError
+
+Exposed for instance checking and sub-classing.
+
+
+## Related
+
+- [delay](https://github.com/sindresorhus/delay) - Delay a promise a specified amount of time
+- [p-min-delay](https://github.com/sindresorhus/p-min-delay) - Delay a promise a minimum amount of time
+- [p-retry](https://github.com/sindresorhus/p-retry) - Retry a promise-returning function
+- [More…](https://github.com/sindresorhus/promise-fun)
+
+
+## License
+
+MIT © [Sindre Sorhus](https://sindresorhus.com)
diff --git a/advancedcontentfilter/vendor/npm-asset/pify/index.js b/advancedcontentfilter/vendor/npm-asset/pify/index.js
new file mode 100644 (file)
index 0000000..1dee43a
--- /dev/null
@@ -0,0 +1,84 @@
+'use strict';
+
+const processFn = (fn, opts) => function () {
+       const P = opts.promiseModule;
+       const args = new Array(arguments.length);
+
+       for (let i = 0; i < arguments.length; i++) {
+               args[i] = arguments[i];
+       }
+
+       return new P((resolve, reject) => {
+               if (opts.errorFirst) {
+                       args.push(function (err, result) {
+                               if (opts.multiArgs) {
+                                       const results = new Array(arguments.length - 1);
+
+                                       for (let i = 1; i < arguments.length; i++) {
+                                               results[i - 1] = arguments[i];
+                                       }
+
+                                       if (err) {
+                                               results.unshift(err);
+                                               reject(results);
+                                       } else {
+                                               resolve(results);
+                                       }
+                               } else if (err) {
+                                       reject(err);
+                               } else {
+                                       resolve(result);
+                               }
+                       });
+               } else {
+                       args.push(function (result) {
+                               if (opts.multiArgs) {
+                                       const results = new Array(arguments.length - 1);
+
+                                       for (let i = 0; i < arguments.length; i++) {
+                                               results[i] = arguments[i];
+                                       }
+
+                                       resolve(results);
+                               } else {
+                                       resolve(result);
+                               }
+                       });
+               }
+
+               fn.apply(this, args);
+       });
+};
+
+module.exports = (obj, opts) => {
+       opts = Object.assign({
+               exclude: [/.+(Sync|Stream)$/],
+               errorFirst: true,
+               promiseModule: Promise
+       }, opts);
+
+       const filter = key => {
+               const match = pattern => typeof pattern === 'string' ? key === pattern : pattern.test(key);
+               return opts.include ? opts.include.some(match) : !opts.exclude.some(match);
+       };
+
+       let ret;
+       if (typeof obj === 'function') {
+               ret = function () {
+                       if (opts.excludeMain) {
+                               return obj.apply(this, arguments);
+                       }
+
+                       return processFn(obj, opts).apply(this, arguments);
+               };
+       } else {
+               ret = Object.create(Object.getPrototypeOf(obj));
+       }
+
+       for (const key in obj) { // eslint-disable-line guard-for-in
+               const x = obj[key];
+               ret[key] = typeof x === 'function' && filter(key) ? processFn(x, opts) : x;
+       }
+
+       return ret;
+};
diff --git a/advancedcontentfilter/vendor/npm-asset/pify/license b/advancedcontentfilter/vendor/npm-asset/pify/license
new file mode 100644 (file)
index 0000000..e7af2f7
--- /dev/null
@@ -0,0 +1,9 @@
+MIT License
+
+Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/advancedcontentfilter/vendor/npm-asset/pify/package.json b/advancedcontentfilter/vendor/npm-asset/pify/package.json
new file mode 100644 (file)
index 0000000..468d857
--- /dev/null
@@ -0,0 +1,51 @@
+{
+  "name": "pify",
+  "version": "3.0.0",
+  "description": "Promisify a callback-style function",
+  "license": "MIT",
+  "repository": "sindresorhus/pify",
+  "author": {
+    "name": "Sindre Sorhus",
+    "email": "sindresorhus@gmail.com",
+    "url": "sindresorhus.com"
+  },
+  "engines": {
+    "node": ">=4"
+  },
+  "scripts": {
+    "test": "xo && ava && npm run optimization-test",
+    "optimization-test": "node --allow-natives-syntax optimization-test.js"
+  },
+  "files": [
+    "index.js"
+  ],
+  "keywords": [
+    "promise",
+    "promises",
+    "promisify",
+    "all",
+    "denodify",
+    "denodeify",
+    "callback",
+    "cb",
+    "node",
+    "then",
+    "thenify",
+    "convert",
+    "transform",
+    "wrap",
+    "wrapper",
+    "bind",
+    "to",
+    "async",
+    "await",
+    "es2015",
+    "bluebird"
+  ],
+  "devDependencies": {
+    "ava": "*",
+    "pinkie-promise": "^2.0.0",
+    "v8-natives": "^1.0.0",
+    "xo": "*"
+  }
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/pify/readme.md b/advancedcontentfilter/vendor/npm-asset/pify/readme.md
new file mode 100644 (file)
index 0000000..376ca4e
--- /dev/null
@@ -0,0 +1,131 @@
+# pify [![Build Status](https://travis-ci.org/sindresorhus/pify.svg?branch=master)](https://travis-ci.org/sindresorhus/pify)
+
+> Promisify a callback-style function
+
+
+## Install
+
+```
+$ npm install --save pify
+```
+
+
+## Usage
+
+```js
+const fs = require('fs');
+const pify = require('pify');
+
+// Promisify a single function
+pify(fs.readFile)('package.json', 'utf8').then(data => {
+       console.log(JSON.parse(data).name);
+       //=> 'pify'
+});
+
+// Promisify all methods in a module
+pify(fs).readFile('package.json', 'utf8').then(data => {
+       console.log(JSON.parse(data).name);
+       //=> 'pify'
+});
+```
+
+
+## API
+
+### pify(input, [options])
+
+Returns a `Promise` wrapped version of the supplied function or module.
+
+#### input
+
+Type: `Function` `Object`
+
+Callback-style function or module whose methods you want to promisify.
+
+#### options
+
+##### multiArgs
+
+Type: `boolean`<br>
+Default: `false`
+
+By default, the promisified function will only return the second argument from the callback, which works fine for most APIs. This option can be useful for modules like `request` that return multiple arguments. Turning this on will make it return an array of all arguments from the callback, excluding the error argument, instead of just the second argument. This also applies to rejections, where it returns an array of all the callback arguments, including the error.
+
+```js
+const request = require('request');
+const pify = require('pify');
+
+pify(request, {multiArgs: true})('https://sindresorhus.com').then(result => {
+       const [httpResponse, body] = result;
+});
+```
+
+##### include
+
+Type: `string[]` `RegExp[]`
+
+Methods in a module to promisify. Remaining methods will be left untouched.
+
+##### exclude
+
+Type: `string[]` `RegExp[]`<br>
+Default: `[/.+(Sync|Stream)$/]`
+
+Methods in a module **not** to promisify. Methods with names ending with `'Sync'` are excluded by default.
+
+##### excludeMain
+
+Type: `boolean`<br>
+Default: `false`
+
+If given module is a function itself, it will be promisified. Turn this option on if you want to promisify only methods of the module.
+
+```js
+const pify = require('pify');
+
+function fn() {
+       return true;
+}
+
+fn.method = (data, callback) => {
+       setImmediate(() => {
+               callback(null, data);
+       });
+};
+
+// Promisify methods but not `fn()`
+const promiseFn = pify(fn, {excludeMain: true});
+
+if (promiseFn()) {
+       promiseFn.method('hi').then(data => {
+               console.log(data);
+       });
+}
+```
+
+##### errorFirst
+
+Type: `boolean`<br>
+Default: `true`
+
+Whether the callback has an error as the first argument. You'll want to set this to `false` if you're dealing with an API that doesn't have an error as the first argument, like `fs.exists()`, some browser APIs, Chrome Extension APIs, etc.
+
+##### promiseModule
+
+Type: `Function`
+
+Custom promise module to use instead of the native one.
+
+Check out [`pinkie-promise`](https://github.com/floatdrop/pinkie-promise) if you need a tiny promise polyfill.
+
+
+## Related
+
+- [p-event](https://github.com/sindresorhus/p-event) - Promisify an event by waiting for it to be emitted
+- [p-map](https://github.com/sindresorhus/p-map) - Map over promises concurrently
+- [More…](https://github.com/sindresorhus/promise-fun)
+
+
+## License
+
+MIT © [Sindre Sorhus](https://sindresorhus.com)
diff --git a/advancedcontentfilter/vendor/npm-asset/prepend-http/index.js b/advancedcontentfilter/vendor/npm-asset/prepend-http/index.js
new file mode 100644 (file)
index 0000000..82b3a6b
--- /dev/null
@@ -0,0 +1,15 @@
+'use strict';
+module.exports = (url, opts) => {
+       if (typeof url !== 'string') {
+               throw new TypeError(`Expected \`url\` to be of type \`string\`, got \`${typeof url}\``);
+       }
+
+       url = url.trim();
+       opts = Object.assign({https: false}, opts);
+
+       if (/^\.*\/|^(?!localhost)\w+:/.test(url)) {
+               return url;
+       }
+
+       return url.replace(/^(?!(?:\w+:)?\/\/)/, opts.https ? 'https://' : 'http://');
+};
diff --git a/advancedcontentfilter/vendor/npm-asset/prepend-http/license b/advancedcontentfilter/vendor/npm-asset/prepend-http/license
new file mode 100644 (file)
index 0000000..e7af2f7
--- /dev/null
@@ -0,0 +1,9 @@
+MIT License
+
+Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/advancedcontentfilter/vendor/npm-asset/prepend-http/package.json b/advancedcontentfilter/vendor/npm-asset/prepend-http/package.json
new file mode 100644 (file)
index 0000000..cbfac02
--- /dev/null
@@ -0,0 +1,35 @@
+{
+  "name": "prepend-http",
+  "version": "2.0.0",
+  "description": "Prepend `http://` to humanized URLs like todomvc.com and localhost",
+  "license": "MIT",
+  "repository": "sindresorhus/prepend-http",
+  "author": {
+    "name": "Sindre Sorhus",
+    "email": "sindresorhus@gmail.com",
+    "url": "sindresorhus.com"
+  },
+  "engines": {
+    "node": ">=4"
+  },
+  "scripts": {
+    "test": "xo && ava"
+  },
+  "files": [
+    "index.js"
+  ],
+  "keywords": [
+    "prepend",
+    "protocol",
+    "scheme",
+    "url",
+    "uri",
+    "http",
+    "https",
+    "humanized"
+  ],
+  "devDependencies": {
+    "ava": "*",
+    "xo": "*"
+  }
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/prepend-http/readme.md b/advancedcontentfilter/vendor/npm-asset/prepend-http/readme.md
new file mode 100644 (file)
index 0000000..55d640d
--- /dev/null
@@ -0,0 +1,56 @@
+# prepend-http [![Build Status](https://travis-ci.org/sindresorhus/prepend-http.svg?branch=master)](https://travis-ci.org/sindresorhus/prepend-http)
+
+> Prepend `http://` to humanized URLs like `todomvc.com` and `localhost`
+
+
+## Install
+
+```
+$ npm install prepend-http
+```
+
+
+## Usage
+
+```js
+const prependHttp = require('prepend-http');
+
+prependHttp('todomvc.com');
+//=> 'http://todomvc.com'
+
+prependHttp('localhost');
+//=> 'http://localhost'
+
+prependHttp('http://todomvc.com');
+//=> 'http://todomvc.com'
+
+prependHttp('todomvc.com', {https: true});
+//=> 'https://todomvc.com'
+```
+
+
+## API
+
+### prependHttp(url, [options])
+
+#### url
+
+Type: `string`
+
+URL to prepend `http://` on.
+
+#### options
+
+Type: `Object`
+
+##### https
+
+Type: `boolean`<br>
+Default: `false`
+
+Prepend `https://` instead of `http://`.
+
+
+## License
+
+MIT © [Sindre Sorhus](https://sindresorhus.com)
diff --git a/advancedcontentfilter/vendor/npm-asset/process-nextick-args/index.js b/advancedcontentfilter/vendor/npm-asset/process-nextick-args/index.js
new file mode 100644 (file)
index 0000000..5f585e8
--- /dev/null
@@ -0,0 +1,44 @@
+'use strict';
+
+if (!process.version ||
+    process.version.indexOf('v0.') === 0 ||
+    process.version.indexOf('v1.') === 0 && process.version.indexOf('v1.8.') !== 0) {
+  module.exports = { nextTick: nextTick };
+} else {
+  module.exports = process
+}
+
+function nextTick(fn, arg1, arg2, arg3) {
+  if (typeof fn !== 'function') {
+    throw new TypeError('"callback" argument must be a function');
+  }
+  var len = arguments.length;
+  var args, i;
+  switch (len) {
+  case 0:
+  case 1:
+    return process.nextTick(fn);
+  case 2:
+    return process.nextTick(function afterTickOne() {
+      fn.call(null, arg1);
+    });
+  case 3:
+    return process.nextTick(function afterTickTwo() {
+      fn.call(null, arg1, arg2);
+    });
+  case 4:
+    return process.nextTick(function afterTickThree() {
+      fn.call(null, arg1, arg2, arg3);
+    });
+  default:
+    args = new Array(len - 1);
+    i = 0;
+    while (i < args.length) {
+      args[i++] = arguments[i];
+    }
+    return process.nextTick(function afterTick() {
+      fn.apply(null, args);
+    });
+  }
+}
+
diff --git a/advancedcontentfilter/vendor/npm-asset/process-nextick-args/license.md b/advancedcontentfilter/vendor/npm-asset/process-nextick-args/license.md
new file mode 100644 (file)
index 0000000..c67e353
--- /dev/null
@@ -0,0 +1,19 @@
+# Copyright (c) 2015 Calvin Metcalf
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+**THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.**
diff --git a/advancedcontentfilter/vendor/npm-asset/process-nextick-args/package.json b/advancedcontentfilter/vendor/npm-asset/process-nextick-args/package.json
new file mode 100644 (file)
index 0000000..42c5b67
--- /dev/null
@@ -0,0 +1,25 @@
+{
+  "name": "process-nextick-args",
+  "version": "2.0.0",
+  "description": "process.nextTick but always with args",
+  "main": "index.js",
+  "files": [
+    "index.js"
+  ],
+  "scripts": {
+    "test": "node test.js"
+  },
+  "repository": {
+    "type": "git",
+    "url": "https://github.com/calvinmetcalf/process-nextick-args.git"
+  },
+  "author": "",
+  "license": "MIT",
+  "bugs": {
+    "url": "https://github.com/calvinmetcalf/process-nextick-args/issues"
+  },
+  "homepage": "https://github.com/calvinmetcalf/process-nextick-args",
+  "devDependencies": {
+    "tap": "~0.2.6"
+  }
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/process-nextick-args/readme.md b/advancedcontentfilter/vendor/npm-asset/process-nextick-args/readme.md
new file mode 100644 (file)
index 0000000..ecb432c
--- /dev/null
@@ -0,0 +1,18 @@
+process-nextick-args
+=====
+
+[![Build Status](https://travis-ci.org/calvinmetcalf/process-nextick-args.svg?branch=master)](https://travis-ci.org/calvinmetcalf/process-nextick-args)
+
+```bash
+npm install --save process-nextick-args
+```
+
+Always be able to pass arguments to process.nextTick, no matter the platform
+
+```js
+var pna = require('process-nextick-args');
+
+pna.nextTick(function (a, b, c) {
+  console.log(a, b, c);
+}, 'step', 3,  'profit');
+```
diff --git a/advancedcontentfilter/vendor/npm-asset/query-string/index.js b/advancedcontentfilter/vendor/npm-asset/query-string/index.js
new file mode 100644 (file)
index 0000000..10f156a
--- /dev/null
@@ -0,0 +1,224 @@
+'use strict';
+var strictUriEncode = require('strict-uri-encode');
+var objectAssign = require('object-assign');
+var decodeComponent = require('decode-uri-component');
+
+function encoderForArrayFormat(opts) {
+       switch (opts.arrayFormat) {
+               case 'index':
+                       return function (key, value, index) {
+                               return value === null ? [
+                                       encode(key, opts),
+                                       '[',
+                                       index,
+                                       ']'
+                               ].join('') : [
+                                       encode(key, opts),
+                                       '[',
+                                       encode(index, opts),
+                                       ']=',
+                                       encode(value, opts)
+                               ].join('');
+                       };
+
+               case 'bracket':
+                       return function (key, value) {
+                               return value === null ? encode(key, opts) : [
+                                       encode(key, opts),
+                                       '[]=',
+                                       encode(value, opts)
+                               ].join('');
+                       };
+
+               default:
+                       return function (key, value) {
+                               return value === null ? encode(key, opts) : [
+                                       encode(key, opts),
+                                       '=',
+                                       encode(value, opts)
+                               ].join('');
+                       };
+       }
+}
+
+function parserForArrayFormat(opts) {
+       var result;
+
+       switch (opts.arrayFormat) {
+               case 'index':
+                       return function (key, value, accumulator) {
+                               result = /\[(\d*)\]$/.exec(key);
+
+                               key = key.replace(/\[\d*\]$/, '');
+
+                               if (!result) {
+                                       accumulator[key] = value;
+                                       return;
+                               }
+
+                               if (accumulator[key] === undefined) {
+                                       accumulator[key] = {};
+                               }
+
+                               accumulator[key][result[1]] = value;
+                       };
+
+               case 'bracket':
+                       return function (key, value, accumulator) {
+                               result = /(\[\])$/.exec(key);
+                               key = key.replace(/\[\]$/, '');
+
+                               if (!result) {
+                                       accumulator[key] = value;
+                                       return;
+                               } else if (accumulator[key] === undefined) {
+                                       accumulator[key] = [value];
+                                       return;
+                               }
+
+                               accumulator[key] = [].concat(accumulator[key], value);
+                       };
+
+               default:
+                       return function (key, value, accumulator) {
+                               if (accumulator[key] === undefined) {
+                                       accumulator[key] = value;
+                                       return;
+                               }
+
+                               accumulator[key] = [].concat(accumulator[key], value);
+                       };
+       }
+}
+
+function encode(value, opts) {
+       if (opts.encode) {
+               return opts.strict ? strictUriEncode(value) : encodeURIComponent(value);
+       }
+
+       return value;
+}
+
+function keysSorter(input) {
+       if (Array.isArray(input)) {
+               return input.sort();
+       } else if (typeof input === 'object') {
+               return keysSorter(Object.keys(input)).sort(function (a, b) {
+                       return Number(a) - Number(b);
+               }).map(function (key) {
+                       return input[key];
+               });
+       }
+
+       return input;
+}
+
+function extract(str) {
+       var queryStart = str.indexOf('?');
+       if (queryStart === -1) {
+               return '';
+       }
+       return str.slice(queryStart + 1);
+}
+
+function parse(str, opts) {
+       opts = objectAssign({arrayFormat: 'none'}, opts);
+
+       var formatter = parserForArrayFormat(opts);
+
+       // Create an object with no prototype
+       // https://github.com/sindresorhus/query-string/issues/47
+       var ret = Object.create(null);
+
+       if (typeof str !== 'string') {
+               return ret;
+       }
+
+       str = str.trim().replace(/^[?#&]/, '');
+
+       if (!str) {
+               return ret;
+       }
+
+       str.split('&').forEach(function (param) {
+               var parts = param.replace(/\+/g, ' ').split('=');
+               // Firefox (pre 40) decodes `%3D` to `=`
+               // https://github.com/sindresorhus/query-string/pull/37
+               var key = parts.shift();
+               var val = parts.length > 0 ? parts.join('=') : undefined;
+
+               // missing `=` should be `null`:
+               // http://w3.org/TR/2012/WD-url-20120524/#collect-url-parameters
+               val = val === undefined ? null : decodeComponent(val);
+
+               formatter(decodeComponent(key), val, ret);
+       });
+
+       return Object.keys(ret).sort().reduce(function (result, key) {
+               var val = ret[key];
+               if (Boolean(val) && typeof val === 'object' && !Array.isArray(val)) {
+                       // Sort object keys, not values
+                       result[key] = keysSorter(val);
+               } else {
+                       result[key] = val;
+               }
+
+               return result;
+       }, Object.create(null));
+}
+
+exports.extract = extract;
+exports.parse = parse;
+
+exports.stringify = function (obj, opts) {
+       var defaults = {
+               encode: true,
+               strict: true,
+               arrayFormat: 'none'
+       };
+
+       opts = objectAssign(defaults, opts);
+
+       if (opts.sort === false) {
+               opts.sort = function () {};
+       }
+
+       var formatter = encoderForArrayFormat(opts);
+
+       return obj ? Object.keys(obj).sort(opts.sort).map(function (key) {
+               var val = obj[key];
+
+               if (val === undefined) {
+                       return '';
+               }
+
+               if (val === null) {
+                       return encode(key, opts);
+               }
+
+               if (Array.isArray(val)) {
+                       var result = [];
+
+                       val.slice().forEach(function (val2) {
+                               if (val2 === undefined) {
+                                       return;
+                               }
+
+                               result.push(formatter(key, val2, result.length));
+                       });
+
+                       return result.join('&');
+               }
+
+               return encode(key, opts) + '=' + encode(val, opts);
+       }).filter(function (x) {
+               return x.length > 0;
+       }).join('&') : '';
+};
+
+exports.parseUrl = function (str, opts) {
+       return {
+               url: str.split('?')[0] || '',
+               query: parse(extract(str), opts)
+       };
+};
diff --git a/advancedcontentfilter/vendor/npm-asset/query-string/license b/advancedcontentfilter/vendor/npm-asset/query-string/license
new file mode 100644 (file)
index 0000000..e7af2f7
--- /dev/null
@@ -0,0 +1,9 @@
+MIT License
+
+Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/advancedcontentfilter/vendor/npm-asset/query-string/package.json b/advancedcontentfilter/vendor/npm-asset/query-string/package.json
new file mode 100644 (file)
index 0000000..2de4bd3
--- /dev/null
@@ -0,0 +1,45 @@
+{
+       "name": "query-string",
+       "version": "5.1.1",
+       "description": "Parse and stringify URL query strings",
+       "license": "MIT",
+       "repository": "sindresorhus/query-string",
+       "author": {
+               "name": "Sindre Sorhus",
+               "email": "sindresorhus@gmail.com",
+               "url": "sindresorhus.com"
+       },
+       "engines": {
+               "node": ">=0.10.0"
+       },
+       "scripts": {
+               "test": "xo && ava"
+       },
+       "files": [
+               "index.js"
+       ],
+       "keywords": [
+               "browser",
+               "querystring",
+               "query",
+               "string",
+               "qs",
+               "param",
+               "parameter",
+               "url",
+               "uri",
+               "parse",
+               "stringify",
+               "encode",
+               "decode"
+       ],
+       "dependencies": {
+               "decode-uri-component": "^0.2.0",
+               "object-assign": "^4.1.0",
+               "strict-uri-encode": "^1.0.0"
+       },
+       "devDependencies": {
+               "ava": "^0.17.0",
+               "xo": "^0.16.0"
+       }
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/query-string/readme.md b/advancedcontentfilter/vendor/npm-asset/query-string/readme.md
new file mode 100644 (file)
index 0000000..c9273ea
--- /dev/null
@@ -0,0 +1,224 @@
+# query-string [![Build Status](https://travis-ci.org/sindresorhus/query-string.svg?branch=master)](https://travis-ci.org/sindresorhus/query-string)
+
+> Parse and stringify URL [query strings](https://en.wikipedia.org/wiki/Query_string)
+
+---
+
+<p align="center"><b>🔥 Want to strengthen your core JavaScript skills and master ES6?</b><br>I would personally recommend this awesome <a href="https://ES6.io/friend/AWESOME">ES6 course</a> by Wes Bos.<br>Also check out his <a href="https://LearnNode.com/friend/AWESOME">Node.js</a>, <a href="https://ReactForBeginners.com/friend/AWESOME">React</a>, <a href="https://SublimeTextBook.com/friend/AWESOME">Sublime</a> courses.</p>
+
+---
+
+
+## Install
+
+```
+$ npm install query-string
+```
+
+<a href="https://www.patreon.com/sindresorhus">
+       <img src="https://c5.patreon.com/external/logo/become_a_patron_button@2x.png" width="160">
+</a>
+
+
+## Usage
+
+```js
+const queryString = require('query-string');
+
+console.log(location.search);
+//=> '?foo=bar'
+
+const parsed = queryString.parse(location.search);
+console.log(parsed);
+//=> {foo: 'bar'}
+
+console.log(location.hash);
+//=> '#token=bada55cafe'
+
+const parsedHash = queryString.parse(location.hash);
+console.log(parsedHash);
+//=> {token: 'bada55cafe'}
+
+parsed.foo = 'unicorn';
+parsed.ilike = 'pizza';
+
+const stringified = queryString.stringify(parsed);
+//=> 'foo=unicorn&ilike=pizza'
+
+location.search = stringified;
+// note that `location.search` automatically prepends a question mark
+console.log(location.search);
+//=> '?foo=unicorn&ilike=pizza'
+```
+
+
+## API
+
+### .parse(*string*, *[options]*)
+
+Parse a query string into an object. Leading `?` or `#` are ignored, so you can pass `location.search` or `location.hash` directly.
+
+The returned object is created with [`Object.create(null)`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create) and thus does not have a `prototype`.
+
+URI components are decoded with [`decode-uri-component`](https://github.com/SamVerschueren/decode-uri-component).
+
+#### arrayFormat
+
+Type: `string`<br>
+Default: `'none'`
+
+Supports both `index` for an indexed array representation or `bracket` for a *bracketed* array representation.
+
+- `bracket`: stands for parsing correctly arrays with bracket representation on the query string, such as:
+
+```js
+queryString.parse('foo[]=1&foo[]=2&foo[]=3', {arrayFormat: 'bracket'});
+//=> foo: [1,2,3]
+```
+
+- `index`: stands for parsing taking the index into account, such as:
+
+```js
+queryString.parse('foo[0]=1&foo[1]=2&foo[3]=3', {arrayFormat: 'index'});
+//=> foo: [1,2,3]
+```
+
+- `none`: is the **default** option and removes any bracket representation, such as:
+
+```js
+queryString.parse('foo=1&foo=2&foo=3');
+//=> foo: [1,2,3]
+```
+
+### .stringify(*object*, *[options]*)
+
+Stringify an object into a query string, sorting the keys.
+
+#### strict
+
+Type: `boolean`<br>
+Default: `true`
+
+Strictly encode URI components with [strict-uri-encode](https://github.com/kevva/strict-uri-encode). It uses [encodeURIComponent](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent)
+if set to false. You probably [don't care](https://github.com/sindresorhus/query-string/issues/42) about this option.
+
+#### encode
+
+Type: `boolean`<br>
+Default: `true`
+
+[URL encode](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent) the keys and values.
+
+#### arrayFormat
+
+Type: `string`<br>
+Default: `'none'`
+
+Supports both `index` for an indexed array representation or `bracket` for a *bracketed* array representation.
+
+- `bracket`: stands for parsing correctly arrays with bracket representation on the query string, such as:
+
+```js
+queryString.stringify({foo: [1,2,3]}, {arrayFormat: 'bracket'});
+// => foo[]=1&foo[]=2&foo[]=3
+```
+
+- `index`: stands for parsing taking the index into account, such as:
+
+```js
+queryString.stringify({foo: [1,2,3]}, {arrayFormat: 'index'});
+// => foo[0]=1&foo[1]=2&foo[3]=3
+```
+
+- `none`: is the __default__ option and removes any bracket representation, such as:
+
+```js
+queryString.stringify({foo: [1,2,3]});
+// => foo=1&foo=2&foo=3
+```
+
+#### sort
+
+Type: `Function` `boolean`
+
+Supports both `Function` as a custom sorting function or `false` to disable sorting.
+
+```js
+const order = ['c', 'a', 'b'];
+queryString.stringify({ a: 1, b: 2, c: 3}, {
+       sort: (m, n) => order.indexOf(m) >= order.indexOf(n)
+});
+// => 'c=3&a=1&b=2'
+```
+
+```js
+queryString.stringify({ b: 1, c: 2, a: 3}, {sort: false});
+// => 'c=3&a=1&b=2'
+```
+
+If omitted, keys are sorted using `Array#sort`, which means, converting them to strings and comparing strings in Unicode code point order.
+
+### .extract(*string*)
+
+Extract a query string from a URL that can be passed into `.parse()`.
+
+### .parseUrl(*string*, *[options]*)
+
+Extract the URL and the query string as an object.
+
+The `options` are the same as for `.parse()`.
+
+Returns an object with a `url` and `query` property.
+
+```js
+queryString.parseUrl('https://foo.bar?foo=bar');
+//=> {url: 'https://foo.bar', query: {foo: 'bar'}}
+```
+
+
+## Nesting
+
+This module intentionally doesn't support nesting as it's not spec'd and varies between implementations, which causes a lot of [edge cases](https://github.com/visionmedia/node-querystring/issues).
+
+You're much better off just converting the object to a JSON string:
+
+```js
+queryString.stringify({
+       foo: 'bar',
+       nested: JSON.stringify({
+               unicorn: 'cake'
+       })
+});
+//=> 'foo=bar&nested=%7B%22unicorn%22%3A%22cake%22%7D'
+```
+
+However, there is support for multiple instances of the same key:
+
+```js
+queryString.parse('likes=cake&name=bob&likes=icecream');
+//=> {likes: ['cake', 'icecream'], name: 'bob'}
+
+queryString.stringify({color: ['taupe', 'chartreuse'], id: '515'});
+//=> 'color=chartreuse&color=taupe&id=515'
+```
+
+
+## Falsy values
+
+Sometimes you want to unset a key, or maybe just make it present without assigning a value to it. Here is how falsy values are stringified:
+
+```js
+queryString.stringify({foo: false});
+//=> 'foo=false'
+
+queryString.stringify({foo: null});
+//=> 'foo'
+
+queryString.stringify({foo: undefined});
+//=> ''
+```
+
+
+## License
+
+MIT © [Sindre Sorhus](https://sindresorhus.com)
diff --git a/advancedcontentfilter/vendor/npm-asset/readable-stream/.travis.yml b/advancedcontentfilter/vendor/npm-asset/readable-stream/.travis.yml
new file mode 100644 (file)
index 0000000..4099255
--- /dev/null
@@ -0,0 +1,55 @@
+sudo: false
+language: node_js
+before_install:
+  - npm install -g npm@2
+  - test $NPM_LEGACY && npm install -g npm@latest-3 || npm install npm -g
+notifications:
+  email: false
+matrix:
+  fast_finish: true
+  include:
+  - node_js: '0.8'
+    env:
+      - TASK=test
+      - NPM_LEGACY=true
+  - node_js: '0.10'
+    env:
+      - TASK=test
+      - NPM_LEGACY=true
+  - node_js: '0.11'
+    env:
+      - TASK=test
+      - NPM_LEGACY=true
+  - node_js: '0.12'
+    env:
+      - TASK=test
+      - NPM_LEGACY=true
+  - node_js: 1
+    env:
+      - TASK=test
+      - NPM_LEGACY=true
+  - node_js: 2
+    env:
+      - TASK=test
+      - NPM_LEGACY=true
+  - node_js: 3
+    env:
+      - TASK=test
+      - NPM_LEGACY=true
+  - node_js: 4
+    env: TASK=test
+  - node_js: 5
+    env: TASK=test
+  - node_js: 6
+    env: TASK=test
+  - node_js: 7
+    env: TASK=test
+  - node_js: 8
+    env: TASK=test
+  - node_js: 9
+    env: TASK=test
+script: "npm run $TASK"
+env:
+  global:
+  - secure: rE2Vvo7vnjabYNULNyLFxOyt98BoJexDqsiOnfiD6kLYYsiQGfr/sbZkPMOFm9qfQG7pjqx+zZWZjGSswhTt+626C0t/njXqug7Yps4c3dFblzGfreQHp7wNX5TFsvrxd6dAowVasMp61sJcRnB2w8cUzoe3RAYUDHyiHktwqMc=
+  - secure: g9YINaKAdMatsJ28G9jCGbSaguXCyxSTy+pBO6Ch0Cf57ZLOTka3HqDj8p3nV28LUIHZ3ut5WO43CeYKwt4AUtLpBS3a0dndHdY6D83uY6b2qh5hXlrcbeQTq2cvw2y95F7hm4D1kwrgZ7ViqaKggRcEupAL69YbJnxeUDKWEdI=
diff --git a/advancedcontentfilter/vendor/npm-asset/readable-stream/CONTRIBUTING.md b/advancedcontentfilter/vendor/npm-asset/readable-stream/CONTRIBUTING.md
new file mode 100644 (file)
index 0000000..f478d58
--- /dev/null
@@ -0,0 +1,38 @@
+# Developer's Certificate of Origin 1.1
+
+By making a contribution to this project, I certify that:
+
+* (a) The contribution was created in whole or in part by me and I
+  have the right to submit it under the open source license
+  indicated in the file; or
+
+* (b) The contribution is based upon previous work that, to the best
+  of my knowledge, is covered under an appropriate open source
+  license and I have the right under that license to submit that
+  work with modifications, whether created in whole or in part
+  by me, under the same open source license (unless I am
+  permitted to submit under a different license), as indicated
+  in the file; or
+
+* (c) The contribution was provided directly to me by some other
+  person who certified (a), (b) or (c) and I have not modified
+  it.
+
+* (d) I understand and agree that this project and the contribution
+  are public and that a record of the contribution (including all
+  personal information I submit with it, including my sign-off) is
+  maintained indefinitely and may be redistributed consistent with
+  this project or the open source license(s) involved.
+
+## Moderation Policy
+
+The [Node.js Moderation Policy] applies to this WG.
+
+## Code of Conduct
+
+The [Node.js Code of Conduct][] applies to this WG.
+
+[Node.js Code of Conduct]:
+https://github.com/nodejs/node/blob/master/CODE_OF_CONDUCT.md
+[Node.js Moderation Policy]:
+https://github.com/nodejs/TSC/blob/master/Moderation-Policy.md
diff --git a/advancedcontentfilter/vendor/npm-asset/readable-stream/GOVERNANCE.md b/advancedcontentfilter/vendor/npm-asset/readable-stream/GOVERNANCE.md
new file mode 100644 (file)
index 0000000..16ffb93
--- /dev/null
@@ -0,0 +1,136 @@
+### Streams Working Group
+
+The Node.js Streams is jointly governed by a Working Group
+(WG)
+that is responsible for high-level guidance of the project.
+
+The WG has final authority over this project including:
+
+* Technical direction
+* Project governance and process (including this policy)
+* Contribution policy
+* GitHub repository hosting
+* Conduct guidelines
+* Maintaining the list of additional Collaborators
+
+For the current list of WG members, see the project
+[README.md](./README.md#current-project-team-members).
+
+### Collaborators
+
+The readable-stream GitHub repository is
+maintained by the WG and additional Collaborators who are added by the
+WG on an ongoing basis.
+
+Individuals making significant and valuable contributions are made
+Collaborators and given commit-access to the project. These
+individuals are identified by the WG and their addition as
+Collaborators is discussed during the WG meeting.
+
+_Note:_ If you make a significant contribution and are not considered
+for commit-access log an issue or contact a WG member directly and it
+will be brought up in the next WG meeting.
+
+Modifications of the contents of the readable-stream repository are
+made on
+a collaborative basis. Anybody with a GitHub account may propose a
+modification via pull request and it will be considered by the project
+Collaborators. All pull requests must be reviewed and accepted by a
+Collaborator with sufficient expertise who is able to take full
+responsibility for the change. In the case of pull requests proposed
+by an existing Collaborator, an additional Collaborator is required
+for sign-off. Consensus should be sought if additional Collaborators
+participate and there is disagreement around a particular
+modification. See _Consensus Seeking Process_ below for further detail
+on the consensus model used for governance.
+
+Collaborators may opt to elevate significant or controversial
+modifications, or modifications that have not found consensus to the
+WG for discussion by assigning the ***WG-agenda*** tag to a pull
+request or issue. The WG should serve as the final arbiter where
+required.
+
+For the current list of Collaborators, see the project
+[README.md](./README.md#members).
+
+### WG Membership
+
+WG seats are not time-limited.  There is no fixed size of the WG.
+However, the expected target is between 6 and 12, to ensure adequate
+coverage of important areas of expertise, balanced with the ability to
+make decisions efficiently.
+
+There is no specific set of requirements or qualifications for WG
+membership beyond these rules.
+
+The WG may add additional members to the WG by unanimous consensus.
+
+A WG member may be removed from the WG by voluntary resignation, or by
+unanimous consensus of all other WG members.
+
+Changes to WG membership should be posted in the agenda, and may be
+suggested as any other agenda item (see "WG Meetings" below).
+
+If an addition or removal is proposed during a meeting, and the full
+WG is not in attendance to participate, then the addition or removal
+is added to the agenda for the subsequent meeting.  This is to ensure
+that all members are given the opportunity to participate in all
+membership decisions.  If a WG member is unable to attend a meeting
+where a planned membership decision is being made, then their consent
+is assumed.
+
+No more than 1/3 of the WG members may be affiliated with the same
+employer.  If removal or resignation of a WG member, or a change of
+employment by a WG member, creates a situation where more than 1/3 of
+the WG membership shares an employer, then the situation must be
+immediately remedied by the resignation or removal of one or more WG
+members affiliated with the over-represented employer(s).
+
+### WG Meetings
+
+The WG meets occasionally on a Google Hangout On Air. A designated moderator
+approved by the WG runs the meeting. Each meeting should be
+published to YouTube.
+
+Items are added to the WG agenda that are considered contentious or
+are modifications of governance, contribution policy, WG membership,
+or release process.
+
+The intention of the agenda is not to approve or review all patches;
+that should happen continuously on GitHub and be handled by the larger
+group of Collaborators.
+
+Any community member or contributor can ask that something be added to
+the next meeting's agenda by logging a GitHub Issue. Any Collaborator,
+WG member or the moderator can add the item to the agenda by adding
+the ***WG-agenda*** tag to the issue.
+
+Prior to each WG meeting the moderator will share the Agenda with
+members of the WG. WG members can add any items they like to the
+agenda at the beginning of each meeting. The moderator and the WG
+cannot veto or remove items.
+
+The WG may invite persons or representatives from certain projects to
+participate in a non-voting capacity.
+
+The moderator is responsible for summarizing the discussion of each
+agenda item and sends it as a pull request after the meeting.
+
+### Consensus Seeking Process
+
+The WG follows a
+[Consensus
+Seeking](http://en.wikipedia.org/wiki/Consensus-seeking_decision-making)
+decision-making model.
+
+When an agenda item has appeared to reach a consensus the moderator
+will ask "Does anyone object?" as a final call for dissent from the
+consensus.
+
+If an agenda item cannot reach a consensus a WG member can call for
+either a closing vote or a vote to table the issue to the next
+meeting. The call for a vote must be seconded by a majority of the WG
+or else the discussion will continue. Simple majority wins.
+
+Note that changes to WG membership require a majority consensus.  See
+"WG Membership" above.
diff --git a/advancedcontentfilter/vendor/npm-asset/readable-stream/LICENSE b/advancedcontentfilter/vendor/npm-asset/readable-stream/LICENSE
new file mode 100644 (file)
index 0000000..2873b3b
--- /dev/null
@@ -0,0 +1,47 @@
+Node.js is licensed for use as follows:
+
+"""
+Copyright Node.js contributors. All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to
+deal in the Software without restriction, including without limitation the
+rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+sell copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+IN THE SOFTWARE.
+"""
+
+This license applies to parts of Node.js originating from the
+https://github.com/joyent/node repository:
+
+"""
+Copyright Joyent, Inc. and other Node contributors. All rights reserved.
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to
+deal in the Software without restriction, including without limitation the
+rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+sell copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+IN THE SOFTWARE.
+"""
diff --git a/advancedcontentfilter/vendor/npm-asset/readable-stream/README.md b/advancedcontentfilter/vendor/npm-asset/readable-stream/README.md
new file mode 100644 (file)
index 0000000..23fe3f3
--- /dev/null
@@ -0,0 +1,58 @@
+# readable-stream
+
+***Node-core v8.11.1 streams for userland*** [![Build Status](https://travis-ci.org/nodejs/readable-stream.svg?branch=master)](https://travis-ci.org/nodejs/readable-stream)
+
+
+[![NPM](https://nodei.co/npm/readable-stream.png?downloads=true&downloadRank=true)](https://nodei.co/npm/readable-stream/)
+[![NPM](https://nodei.co/npm-dl/readable-stream.png?&months=6&height=3)](https://nodei.co/npm/readable-stream/)
+
+
+[![Sauce Test Status](https://saucelabs.com/browser-matrix/readable-stream.svg)](https://saucelabs.com/u/readable-stream)
+
+```bash
+npm install --save readable-stream
+```
+
+***Node-core streams for userland***
+
+This package is a mirror of the Streams2 and Streams3 implementations in
+Node-core.
+
+Full documentation may be found on the [Node.js website](https://nodejs.org/dist/v8.11.1/docs/api/stream.html).
+
+If you want to guarantee a stable streams base, regardless of what version of
+Node you, or the users of your libraries are using, use **readable-stream** *only* and avoid the *"stream"* module in Node-core, for background see [this blogpost](http://r.va.gg/2014/06/why-i-dont-use-nodes-core-stream-module.html).
+
+As of version 2.0.0 **readable-stream** uses semantic versioning.
+
+# Streams Working Group
+
+`readable-stream` is maintained by the Streams Working Group, which
+oversees the development and maintenance of the Streams API within
+Node.js. The responsibilities of the Streams Working Group include:
+
+* Addressing stream issues on the Node.js issue tracker.
+* Authoring and editing stream documentation within the Node.js project.
+* Reviewing changes to stream subclasses within the Node.js project.
+* Redirecting changes to streams from the Node.js project to this
+  project.
+* Assisting in the implementation of stream providers within Node.js.
+* Recommending versions of `readable-stream` to be included in Node.js.
+* Messaging about the future of streams to give the community advance
+  notice of changes.
+
+<a name="members"></a>
+## Team Members
+
+* **Chris Dickinson** ([@chrisdickinson](https://github.com/chrisdickinson)) &lt;christopher.s.dickinson@gmail.com&gt;
+  - Release GPG key: 9554F04D7259F04124DE6B476D5A82AC7E37093B
+* **Calvin Metcalf** ([@calvinmetcalf](https://github.com/calvinmetcalf)) &lt;calvin.metcalf@gmail.com&gt;
+  - Release GPG key: F3EF5F62A87FC27A22E643F714CE4FF5015AA242
+* **Rod Vagg** ([@rvagg](https://github.com/rvagg)) &lt;rod@vagg.org&gt;
+  - Release GPG key: DD8F2338BAE7501E3DD5AC78C273792F7D83545D
+* **Sam Newman** ([@sonewman](https://github.com/sonewman)) &lt;newmansam@outlook.com&gt;
+* **Mathias Buus** ([@mafintosh](https://github.com/mafintosh)) &lt;mathiasbuus@gmail.com&gt;
+* **Domenic Denicola** ([@domenic](https://github.com/domenic)) &lt;d@domenic.me&gt;
+* **Matteo Collina** ([@mcollina](https://github.com/mcollina)) &lt;matteo.collina@gmail.com&gt;
+  - Release GPG key: 3ABC01543F22DD2239285CDD818674489FBC127E
+* **Irina Shestak** ([@lrlna](https://github.com/lrlna)) &lt;shestak.irina@gmail.com&gt;
diff --git a/advancedcontentfilter/vendor/npm-asset/readable-stream/doc/wg-meetings/2015-01-30.md b/advancedcontentfilter/vendor/npm-asset/readable-stream/doc/wg-meetings/2015-01-30.md
new file mode 100644 (file)
index 0000000..83275f1
--- /dev/null
@@ -0,0 +1,60 @@
+# streams WG Meeting 2015-01-30
+
+## Links
+
+* **Google Hangouts Video**: http://www.youtube.com/watch?v=I9nDOSGfwZg
+* **GitHub Issue**: https://github.com/iojs/readable-stream/issues/106
+* **Original Minutes Google Doc**: https://docs.google.com/document/d/17aTgLnjMXIrfjgNaTUnHQO7m3xgzHR2VXBTmi03Qii4/
+
+## Agenda
+
+Extracted from https://github.com/iojs/readable-stream/labels/wg-agenda prior to meeting.
+
+* adopt a charter [#105](https://github.com/iojs/readable-stream/issues/105)
+* release and versioning strategy [#101](https://github.com/iojs/readable-stream/issues/101)
+* simpler stream creation [#102](https://github.com/iojs/readable-stream/issues/102)
+* proposal: deprecate implicit flowing of streams [#99](https://github.com/iojs/readable-stream/issues/99)
+
+## Minutes
+
+### adopt a charter
+
+* group: +1's all around
+
+### What versioning scheme should be adopted?
+* group: +1’s 3.0.0
+* domenic+group: pulling in patches from other sources where appropriate
+* mikeal: version independently, suggesting versions for io.js
+* mikeal+domenic: work with TC to notify in advance of changes
+simpler stream creation
+
+### streamline creation of streams
+* sam: streamline creation of streams
+* domenic: nice simple solution posted
+  but, we lose the opportunity to change the model
+  may not be backwards incompatible (double check keys)
+
+  **action item:** domenic will check
+
+### remove implicit flowing of streams on(‘data’)
+* add isFlowing / isPaused
+* mikeal: worrying that we’re documenting polyfill methods – confuses users
+* domenic: more reflective API is probably good, with warning labels for users
+* new section for mad scientists (reflective stream access)
+* calvin: name the “third state”
+* mikeal: maybe borrow the name from whatwg?
+* domenic: we’re missing the “third state”
+* consensus: kind of difficult to name the third state
+* mikeal: figure out differences in states / compat
+* mathias: always flow on data – eliminates third state
+  * explore what it breaks
+
+**action items:**
+* ask isaac for ability to list packages by what public io.js APIs they use (esp. Stream)
+* ask rod/build for infrastructure
+* **chris**: explore the “flow on data” approach
+* add isPaused/isFlowing
+* add new docs section
+* move isPaused to that section
+
+
diff --git a/advancedcontentfilter/vendor/npm-asset/readable-stream/duplex-browser.js b/advancedcontentfilter/vendor/npm-asset/readable-stream/duplex-browser.js
new file mode 100644 (file)
index 0000000..f8b2db8
--- /dev/null
@@ -0,0 +1 @@
+module.exports = require('./lib/_stream_duplex.js');
diff --git a/advancedcontentfilter/vendor/npm-asset/readable-stream/duplex.js b/advancedcontentfilter/vendor/npm-asset/readable-stream/duplex.js
new file mode 100644 (file)
index 0000000..46924cb
--- /dev/null
@@ -0,0 +1 @@
+module.exports = require('./readable').Duplex
diff --git a/advancedcontentfilter/vendor/npm-asset/readable-stream/lib/_stream_duplex.js b/advancedcontentfilter/vendor/npm-asset/readable-stream/lib/_stream_duplex.js
new file mode 100644 (file)
index 0000000..a1ca813
--- /dev/null
@@ -0,0 +1,131 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+// a duplex stream is just a stream that is both readable and writable.
+// Since JS doesn't have multiple prototypal inheritance, this class
+// prototypally inherits from Readable, and then parasitically from
+// Writable.
+
+'use strict';
+
+/*<replacement>*/
+
+var pna = require('process-nextick-args');
+/*</replacement>*/
+
+/*<replacement>*/
+var objectKeys = Object.keys || function (obj) {
+  var keys = [];
+  for (var key in obj) {
+    keys.push(key);
+  }return keys;
+};
+/*</replacement>*/
+
+module.exports = Duplex;
+
+/*<replacement>*/
+var util = require('core-util-is');
+util.inherits = require('inherits');
+/*</replacement>*/
+
+var Readable = require('./_stream_readable');
+var Writable = require('./_stream_writable');
+
+util.inherits(Duplex, Readable);
+
+{
+  // avoid scope creep, the keys array can then be collected
+  var keys = objectKeys(Writable.prototype);
+  for (var v = 0; v < keys.length; v++) {
+    var method = keys[v];
+    if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method];
+  }
+}
+
+function Duplex(options) {
+  if (!(this instanceof Duplex)) return new Duplex(options);
+
+  Readable.call(this, options);
+  Writable.call(this, options);
+
+  if (options && options.readable === false) this.readable = false;
+
+  if (options && options.writable === false) this.writable = false;
+
+  this.allowHalfOpen = true;
+  if (options && options.allowHalfOpen === false) this.allowHalfOpen = false;
+
+  this.once('end', onend);
+}
+
+Object.defineProperty(Duplex.prototype, 'writableHighWaterMark', {
+  // making it explicit this property is not enumerable
+  // because otherwise some prototype manipulation in
+  // userland will fail
+  enumerable: false,
+  get: function () {
+    return this._writableState.highWaterMark;
+  }
+});
+
+// the no-half-open enforcer
+function onend() {
+  // if we allow half-open state, or if the writable side ended,
+  // then we're ok.
+  if (this.allowHalfOpen || this._writableState.ended) return;
+
+  // no more data can be written.
+  // But allow more writes to happen in this tick.
+  pna.nextTick(onEndNT, this);
+}
+
+function onEndNT(self) {
+  self.end();
+}
+
+Object.defineProperty(Duplex.prototype, 'destroyed', {
+  get: function () {
+    if (this._readableState === undefined || this._writableState === undefined) {
+      return false;
+    }
+    return this._readableState.destroyed && this._writableState.destroyed;
+  },
+  set: function (value) {
+    // we ignore the value if the stream
+    // has not been initialized yet
+    if (this._readableState === undefined || this._writableState === undefined) {
+      return;
+    }
+
+    // backward compatibility, the user is explicitly
+    // managing destroyed
+    this._readableState.destroyed = value;
+    this._writableState.destroyed = value;
+  }
+});
+
+Duplex.prototype._destroy = function (err, cb) {
+  this.push(null);
+  this.end();
+
+  pna.nextTick(cb, err);
+};
\ No newline at end of file
diff --git a/advancedcontentfilter/vendor/npm-asset/readable-stream/lib/_stream_passthrough.js b/advancedcontentfilter/vendor/npm-asset/readable-stream/lib/_stream_passthrough.js
new file mode 100644 (file)
index 0000000..a9c8358
--- /dev/null
@@ -0,0 +1,47 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+// a passthrough stream.
+// basically just the most minimal sort of Transform stream.
+// Every written chunk gets output as-is.
+
+'use strict';
+
+module.exports = PassThrough;
+
+var Transform = require('./_stream_transform');
+
+/*<replacement>*/
+var util = require('core-util-is');
+util.inherits = require('inherits');
+/*</replacement>*/
+
+util.inherits(PassThrough, Transform);
+
+function PassThrough(options) {
+  if (!(this instanceof PassThrough)) return new PassThrough(options);
+
+  Transform.call(this, options);
+}
+
+PassThrough.prototype._transform = function (chunk, encoding, cb) {
+  cb(null, chunk);
+};
\ No newline at end of file
diff --git a/advancedcontentfilter/vendor/npm-asset/readable-stream/lib/_stream_readable.js b/advancedcontentfilter/vendor/npm-asset/readable-stream/lib/_stream_readable.js
new file mode 100644 (file)
index 0000000..bf34ac6
--- /dev/null
@@ -0,0 +1,1019 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+'use strict';
+
+/*<replacement>*/
+
+var pna = require('process-nextick-args');
+/*</replacement>*/
+
+module.exports = Readable;
+
+/*<replacement>*/
+var isArray = require('isarray');
+/*</replacement>*/
+
+/*<replacement>*/
+var Duplex;
+/*</replacement>*/
+
+Readable.ReadableState = ReadableState;
+
+/*<replacement>*/
+var EE = require('events').EventEmitter;
+
+var EElistenerCount = function (emitter, type) {
+  return emitter.listeners(type).length;
+};
+/*</replacement>*/
+
+/*<replacement>*/
+var Stream = require('./internal/streams/stream');
+/*</replacement>*/
+
+/*<replacement>*/
+
+var Buffer = require('safe-buffer').Buffer;
+var OurUint8Array = global.Uint8Array || function () {};
+function _uint8ArrayToBuffer(chunk) {
+  return Buffer.from(chunk);
+}
+function _isUint8Array(obj) {
+  return Buffer.isBuffer(obj) || obj instanceof OurUint8Array;
+}
+
+/*</replacement>*/
+
+/*<replacement>*/
+var util = require('core-util-is');
+util.inherits = require('inherits');
+/*</replacement>*/
+
+/*<replacement>*/
+var debugUtil = require('util');
+var debug = void 0;
+if (debugUtil && debugUtil.debuglog) {
+  debug = debugUtil.debuglog('stream');
+} else {
+  debug = function () {};
+}
+/*</replacement>*/
+
+var BufferList = require('./internal/streams/BufferList');
+var destroyImpl = require('./internal/streams/destroy');
+var StringDecoder;
+
+util.inherits(Readable, Stream);
+
+var kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume'];
+
+function prependListener(emitter, event, fn) {
+  // Sadly this is not cacheable as some libraries bundle their own
+  // event emitter implementation with them.
+  if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn);
+
+  // This is a hack to make sure that our error handler is attached before any
+  // userland ones.  NEVER DO THIS. This is here only because this code needs
+  // to continue to work with older versions of Node.js that do not include
+  // the prependListener() method. The goal is to eventually remove this hack.
+  if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]];
+}
+
+function ReadableState(options, stream) {
+  Duplex = Duplex || require('./_stream_duplex');
+
+  options = options || {};
+
+  // Duplex streams are both readable and writable, but share
+  // the same options object.
+  // However, some cases require setting options to different
+  // values for the readable and the writable sides of the duplex stream.
+  // These options can be provided separately as readableXXX and writableXXX.
+  var isDuplex = stream instanceof Duplex;
+
+  // object stream flag. Used to make read(n) ignore n and to
+  // make all the buffer merging and length checks go away
+  this.objectMode = !!options.objectMode;
+
+  if (isDuplex) this.objectMode = this.objectMode || !!options.readableObjectMode;
+
+  // the point at which it stops calling _read() to fill the buffer
+  // Note: 0 is a valid value, means "don't call _read preemptively ever"
+  var hwm = options.highWaterMark;
+  var readableHwm = options.readableHighWaterMark;
+  var defaultHwm = this.objectMode ? 16 : 16 * 1024;
+
+  if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (readableHwm || readableHwm === 0)) this.highWaterMark = readableHwm;else this.highWaterMark = defaultHwm;
+
+  // cast to ints.
+  this.highWaterMark = Math.floor(this.highWaterMark);
+
+  // A linked list is used to store data chunks instead of an array because the
+  // linked list can remove elements from the beginning faster than
+  // array.shift()
+  this.buffer = new BufferList();
+  this.length = 0;
+  this.pipes = null;
+  this.pipesCount = 0;
+  this.flowing = null;
+  this.ended = false;
+  this.endEmitted = false;
+  this.reading = false;
+
+  // a flag to be able to tell if the event 'readable'/'data' is emitted
+  // immediately, or on a later tick.  We set this to true at first, because
+  // any actions that shouldn't happen until "later" should generally also
+  // not happen before the first read call.
+  this.sync = true;
+
+  // whenever we return null, then we set a flag to say
+  // that we're awaiting a 'readable' event emission.
+  this.needReadable = false;
+  this.emittedReadable = false;
+  this.readableListening = false;
+  this.resumeScheduled = false;
+
+  // has it been destroyed
+  this.destroyed = false;
+
+  // Crypto is kind of old and crusty.  Historically, its default string
+  // encoding is 'binary' so we have to make this configurable.
+  // Everything else in the universe uses 'utf8', though.
+  this.defaultEncoding = options.defaultEncoding || 'utf8';
+
+  // the number of writers that are awaiting a drain event in .pipe()s
+  this.awaitDrain = 0;
+
+  // if true, a maybeReadMore has been scheduled
+  this.readingMore = false;
+
+  this.decoder = null;
+  this.encoding = null;
+  if (options.encoding) {
+    if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder;
+    this.decoder = new StringDecoder(options.encoding);
+    this.encoding = options.encoding;
+  }
+}
+
+function Readable(options) {
+  Duplex = Duplex || require('./_stream_duplex');
+
+  if (!(this instanceof Readable)) return new Readable(options);
+
+  this._readableState = new ReadableState(options, this);
+
+  // legacy
+  this.readable = true;
+
+  if (options) {
+    if (typeof options.read === 'function') this._read = options.read;
+
+    if (typeof options.destroy === 'function') this._destroy = options.destroy;
+  }
+
+  Stream.call(this);
+}
+
+Object.defineProperty(Readable.prototype, 'destroyed', {
+  get: function () {
+    if (this._readableState === undefined) {
+      return false;
+    }
+    return this._readableState.destroyed;
+  },
+  set: function (value) {
+    // we ignore the value if the stream
+    // has not been initialized yet
+    if (!this._readableState) {
+      return;
+    }
+
+    // backward compatibility, the user is explicitly
+    // managing destroyed
+    this._readableState.destroyed = value;
+  }
+});
+
+Readable.prototype.destroy = destroyImpl.destroy;
+Readable.prototype._undestroy = destroyImpl.undestroy;
+Readable.prototype._destroy = function (err, cb) {
+  this.push(null);
+  cb(err);
+};
+
+// Manually shove something into the read() buffer.
+// This returns true if the highWaterMark has not been hit yet,
+// similar to how Writable.write() returns true if you should
+// write() some more.
+Readable.prototype.push = function (chunk, encoding) {
+  var state = this._readableState;
+  var skipChunkCheck;
+
+  if (!state.objectMode) {
+    if (typeof chunk === 'string') {
+      encoding = encoding || state.defaultEncoding;
+      if (encoding !== state.encoding) {
+        chunk = Buffer.from(chunk, encoding);
+        encoding = '';
+      }
+      skipChunkCheck = true;
+    }
+  } else {
+    skipChunkCheck = true;
+  }
+
+  return readableAddChunk(this, chunk, encoding, false, skipChunkCheck);
+};
+
+// Unshift should *always* be something directly out of read()
+Readable.prototype.unshift = function (chunk) {
+  return readableAddChunk(this, chunk, null, true, false);
+};
+
+function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) {
+  var state = stream._readableState;
+  if (chunk === null) {
+    state.reading = false;
+    onEofChunk(stream, state);
+  } else {
+    var er;
+    if (!skipChunkCheck) er = chunkInvalid(state, chunk);
+    if (er) {
+      stream.emit('error', er);
+    } else if (state.objectMode || chunk && chunk.length > 0) {
+      if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) {
+        chunk = _uint8ArrayToBuffer(chunk);
+      }
+
+      if (addToFront) {
+        if (state.endEmitted) stream.emit('error', new Error('stream.unshift() after end event'));else addChunk(stream, state, chunk, true);
+      } else if (state.ended) {
+        stream.emit('error', new Error('stream.push() after EOF'));
+      } else {
+        state.reading = false;
+        if (state.decoder && !encoding) {
+          chunk = state.decoder.write(chunk);
+          if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);else maybeReadMore(stream, state);
+        } else {
+          addChunk(stream, state, chunk, false);
+        }
+      }
+    } else if (!addToFront) {
+      state.reading = false;
+    }
+  }
+
+  return needMoreData(state);
+}
+
+function addChunk(stream, state, chunk, addToFront) {
+  if (state.flowing && state.length === 0 && !state.sync) {
+    stream.emit('data', chunk);
+    stream.read(0);
+  } else {
+    // update the buffer info.
+    state.length += state.objectMode ? 1 : chunk.length;
+    if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk);
+
+    if (state.needReadable) emitReadable(stream);
+  }
+  maybeReadMore(stream, state);
+}
+
+function chunkInvalid(state, chunk) {
+  var er;
+  if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) {
+    er = new TypeError('Invalid non-string/buffer chunk');
+  }
+  return er;
+}
+
+// if it's past the high water mark, we can push in some more.
+// Also, if we have no data yet, we can stand some
+// more bytes.  This is to work around cases where hwm=0,
+// such as the repl.  Also, if the push() triggered a
+// readable event, and the user called read(largeNumber) such that
+// needReadable was set, then we ought to push more, so that another
+// 'readable' event will be triggered.
+function needMoreData(state) {
+  return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0);
+}
+
+Readable.prototype.isPaused = function () {
+  return this._readableState.flowing === false;
+};
+
+// backwards compatibility.
+Readable.prototype.setEncoding = function (enc) {
+  if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder;
+  this._readableState.decoder = new StringDecoder(enc);
+  this._readableState.encoding = enc;
+  return this;
+};
+
+// Don't raise the hwm > 8MB
+var MAX_HWM = 0x800000;
+function computeNewHighWaterMark(n) {
+  if (n >= MAX_HWM) {
+    n = MAX_HWM;
+  } else {
+    // Get the next highest power of 2 to prevent increasing hwm excessively in
+    // tiny amounts
+    n--;
+    n |= n >>> 1;
+    n |= n >>> 2;
+    n |= n >>> 4;
+    n |= n >>> 8;
+    n |= n >>> 16;
+    n++;
+  }
+  return n;
+}
+
+// This function is designed to be inlinable, so please take care when making
+// changes to the function body.
+function howMuchToRead(n, state) {
+  if (n <= 0 || state.length === 0 && state.ended) return 0;
+  if (state.objectMode) return 1;
+  if (n !== n) {
+    // Only flow one buffer at a time
+    if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length;
+  }
+  // If we're asking for more than the current hwm, then raise the hwm.
+  if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n);
+  if (n <= state.length) return n;
+  // Don't have enough
+  if (!state.ended) {
+    state.needReadable = true;
+    return 0;
+  }
+  return state.length;
+}
+
+// you can override either this method, or the async _read(n) below.
+Readable.prototype.read = function (n) {
+  debug('read', n);
+  n = parseInt(n, 10);
+  var state = this._readableState;
+  var nOrig = n;
+
+  if (n !== 0) state.emittedReadable = false;
+
+  // if we're doing read(0) to trigger a readable event, but we
+  // already have a bunch of data in the buffer, then just trigger
+  // the 'readable' event and move on.
+  if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) {
+    debug('read: emitReadable', state.length, state.ended);
+    if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this);
+    return null;
+  }
+
+  n = howMuchToRead(n, state);
+
+  // if we've ended, and we're now clear, then finish it up.
+  if (n === 0 && state.ended) {
+    if (state.length === 0) endReadable(this);
+    return null;
+  }
+
+  // All the actual chunk generation logic needs to be
+  // *below* the call to _read.  The reason is that in certain
+  // synthetic stream cases, such as passthrough streams, _read
+  // may be a completely synchronous operation which may change
+  // the state of the read buffer, providing enough data when
+  // before there was *not* enough.
+  //
+  // So, the steps are:
+  // 1. Figure out what the state of things will be after we do
+  // a read from the buffer.
+  //
+  // 2. If that resulting state will trigger a _read, then call _read.
+  // Note that this may be asynchronous, or synchronous.  Yes, it is
+  // deeply ugly to write APIs this way, but that still doesn't mean
+  // that the Readable class should behave improperly, as streams are
+  // designed to be sync/async agnostic.
+  // Take note if the _read call is sync or async (ie, if the read call
+  // has returned yet), so that we know whether or not it's safe to emit
+  // 'readable' etc.
+  //
+  // 3. Actually pull the requested chunks out of the buffer and return.
+
+  // if we need a readable event, then we need to do some reading.
+  var doRead = state.needReadable;
+  debug('need readable', doRead);
+
+  // if we currently have less than the highWaterMark, then also read some
+  if (state.length === 0 || state.length - n < state.highWaterMark) {
+    doRead = true;
+    debug('length less than watermark', doRead);
+  }
+
+  // however, if we've ended, then there's no point, and if we're already
+  // reading, then it's unnecessary.
+  if (state.ended || state.reading) {
+    doRead = false;
+    debug('reading or ended', doRead);
+  } else if (doRead) {
+    debug('do read');
+    state.reading = true;
+    state.sync = true;
+    // if the length is currently zero, then we *need* a readable event.
+    if (state.length === 0) state.needReadable = true;
+    // call internal read method
+    this._read(state.highWaterMark);
+    state.sync = false;
+    // If _read pushed data synchronously, then `reading` will be false,
+    // and we need to re-evaluate how much data we can return to the user.
+    if (!state.reading) n = howMuchToRead(nOrig, state);
+  }
+
+  var ret;
+  if (n > 0) ret = fromList(n, state);else ret = null;
+
+  if (ret === null) {
+    state.needReadable = true;
+    n = 0;
+  } else {
+    state.length -= n;
+  }
+
+  if (state.length === 0) {
+    // If we have nothing in the buffer, then we want to know
+    // as soon as we *do* get something into the buffer.
+    if (!state.ended) state.needReadable = true;
+
+    // If we tried to read() past the EOF, then emit end on the next tick.
+    if (nOrig !== n && state.ended) endReadable(this);
+  }
+
+  if (ret !== null) this.emit('data', ret);
+
+  return ret;
+};
+
+function onEofChunk(stream, state) {
+  if (state.ended) return;
+  if (state.decoder) {
+    var chunk = state.decoder.end();
+    if (chunk && chunk.length) {
+      state.buffer.push(chunk);
+      state.length += state.objectMode ? 1 : chunk.length;
+    }
+  }
+  state.ended = true;
+
+  // emit 'readable' now to make sure it gets picked up.
+  emitReadable(stream);
+}
+
+// Don't emit readable right away in sync mode, because this can trigger
+// another read() call => stack overflow.  This way, it might trigger
+// a nextTick recursion warning, but that's not so bad.
+function emitReadable(stream) {
+  var state = stream._readableState;
+  state.needReadable = false;
+  if (!state.emittedReadable) {
+    debug('emitReadable', state.flowing);
+    state.emittedReadable = true;
+    if (state.sync) pna.nextTick(emitReadable_, stream);else emitReadable_(stream);
+  }
+}
+
+function emitReadable_(stream) {
+  debug('emit readable');
+  stream.emit('readable');
+  flow(stream);
+}
+
+// at this point, the user has presumably seen the 'readable' event,
+// and called read() to consume some data.  that may have triggered
+// in turn another _read(n) call, in which case reading = true if
+// it's in progress.
+// However, if we're not ended, or reading, and the length < hwm,
+// then go ahead and try to read some more preemptively.
+function maybeReadMore(stream, state) {
+  if (!state.readingMore) {
+    state.readingMore = true;
+    pna.nextTick(maybeReadMore_, stream, state);
+  }
+}
+
+function maybeReadMore_(stream, state) {
+  var len = state.length;
+  while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) {
+    debug('maybeReadMore read 0');
+    stream.read(0);
+    if (len === state.length)
+      // didn't get any data, stop spinning.
+      break;else len = state.length;
+  }
+  state.readingMore = false;
+}
+
+// abstract method.  to be overridden in specific implementation classes.
+// call cb(er, data) where data is <= n in length.
+// for virtual (non-string, non-buffer) streams, "length" is somewhat
+// arbitrary, and perhaps not very meaningful.
+Readable.prototype._read = function (n) {
+  this.emit('error', new Error('_read() is not implemented'));
+};
+
+Readable.prototype.pipe = function (dest, pipeOpts) {
+  var src = this;
+  var state = this._readableState;
+
+  switch (state.pipesCount) {
+    case 0:
+      state.pipes = dest;
+      break;
+    case 1:
+      state.pipes = [state.pipes, dest];
+      break;
+    default:
+      state.pipes.push(dest);
+      break;
+  }
+  state.pipesCount += 1;
+  debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts);
+
+  var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr;
+
+  var endFn = doEnd ? onend : unpipe;
+  if (state.endEmitted) pna.nextTick(endFn);else src.once('end', endFn);
+
+  dest.on('unpipe', onunpipe);
+  function onunpipe(readable, unpipeInfo) {
+    debug('onunpipe');
+    if (readable === src) {
+      if (unpipeInfo && unpipeInfo.hasUnpiped === false) {
+        unpipeInfo.hasUnpiped = true;
+        cleanup();
+      }
+    }
+  }
+
+  function onend() {
+    debug('onend');
+    dest.end();
+  }
+
+  // when the dest drains, it reduces the awaitDrain counter
+  // on the source.  This would be more elegant with a .once()
+  // handler in flow(), but adding and removing repeatedly is
+  // too slow.
+  var ondrain = pipeOnDrain(src);
+  dest.on('drain', ondrain);
+
+  var cleanedUp = false;
+  function cleanup() {
+    debug('cleanup');
+    // cleanup event handlers once the pipe is broken
+    dest.removeListener('close', onclose);
+    dest.removeListener('finish', onfinish);
+    dest.removeListener('drain', ondrain);
+    dest.removeListener('error', onerror);
+    dest.removeListener('unpipe', onunpipe);
+    src.removeListener('end', onend);
+    src.removeListener('end', unpipe);
+    src.removeListener('data', ondata);
+
+    cleanedUp = true;
+
+    // if the reader is waiting for a drain event from this
+    // specific writer, then it would cause it to never start
+    // flowing again.
+    // So, if this is awaiting a drain, then we just call it now.
+    // If we don't know, then assume that we are waiting for one.
+    if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain();
+  }
+
+  // If the user pushes more data while we're writing to dest then we'll end up
+  // in ondata again. However, we only want to increase awaitDrain once because
+  // dest will only emit one 'drain' event for the multiple writes.
+  // => Introduce a guard on increasing awaitDrain.
+  var increasedAwaitDrain = false;
+  src.on('data', ondata);
+  function ondata(chunk) {
+    debug('ondata');
+    increasedAwaitDrain = false;
+    var ret = dest.write(chunk);
+    if (false === ret && !increasedAwaitDrain) {
+      // If the user unpiped during `dest.write()`, it is possible
+      // to get stuck in a permanently paused state if that write
+      // also returned false.
+      // => Check whether `dest` is still a piping destination.
+      if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) {
+        debug('false write response, pause', src._readableState.awaitDrain);
+        src._readableState.awaitDrain++;
+        increasedAwaitDrain = true;
+      }
+      src.pause();
+    }
+  }
+
+  // if the dest has an error, then stop piping into it.
+  // however, don't suppress the throwing behavior for this.
+  function onerror(er) {
+    debug('onerror', er);
+    unpipe();
+    dest.removeListener('error', onerror);
+    if (EElistenerCount(dest, 'error') === 0) dest.emit('error', er);
+  }
+
+  // Make sure our error handler is attached before userland ones.
+  prependListener(dest, 'error', onerror);
+
+  // Both close and finish should trigger unpipe, but only once.
+  function onclose() {
+    dest.removeListener('finish', onfinish);
+    unpipe();
+  }
+  dest.once('close', onclose);
+  function onfinish() {
+    debug('onfinish');
+    dest.removeListener('close', onclose);
+    unpipe();
+  }
+  dest.once('finish', onfinish);
+
+  function unpipe() {
+    debug('unpipe');
+    src.unpipe(dest);
+  }
+
+  // tell the dest that it's being piped to
+  dest.emit('pipe', src);
+
+  // start the flow if it hasn't been started already.
+  if (!state.flowing) {
+    debug('pipe resume');
+    src.resume();
+  }
+
+  return dest;
+};
+
+function pipeOnDrain(src) {
+  return function () {
+    var state = src._readableState;
+    debug('pipeOnDrain', state.awaitDrain);
+    if (state.awaitDrain) state.awaitDrain--;
+    if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) {
+      state.flowing = true;
+      flow(src);
+    }
+  };
+}
+
+Readable.prototype.unpipe = function (dest) {
+  var state = this._readableState;
+  var unpipeInfo = { hasUnpiped: false };
+
+  // if we're not piping anywhere, then do nothing.
+  if (state.pipesCount === 0) return this;
+
+  // just one destination.  most common case.
+  if (state.pipesCount === 1) {
+    // passed in one, but it's not the right one.
+    if (dest && dest !== state.pipes) return this;
+
+    if (!dest) dest = state.pipes;
+
+    // got a match.
+    state.pipes = null;
+    state.pipesCount = 0;
+    state.flowing = false;
+    if (dest) dest.emit('unpipe', this, unpipeInfo);
+    return this;
+  }
+
+  // slow case. multiple pipe destinations.
+
+  if (!dest) {
+    // remove all.
+    var dests = state.pipes;
+    var len = state.pipesCount;
+    state.pipes = null;
+    state.pipesCount = 0;
+    state.flowing = false;
+
+    for (var i = 0; i < len; i++) {
+      dests[i].emit('unpipe', this, unpipeInfo);
+    }return this;
+  }
+
+  // try to find the right one.
+  var index = indexOf(state.pipes, dest);
+  if (index === -1) return this;
+
+  state.pipes.splice(index, 1);
+  state.pipesCount -= 1;
+  if (state.pipesCount === 1) state.pipes = state.pipes[0];
+
+  dest.emit('unpipe', this, unpipeInfo);
+
+  return this;
+};
+
+// set up data events if they are asked for
+// Ensure readable listeners eventually get something
+Readable.prototype.on = function (ev, fn) {
+  var res = Stream.prototype.on.call(this, ev, fn);
+
+  if (ev === 'data') {
+    // Start flowing on next tick if stream isn't explicitly paused
+    if (this._readableState.flowing !== false) this.resume();
+  } else if (ev === 'readable') {
+    var state = this._readableState;
+    if (!state.endEmitted && !state.readableListening) {
+      state.readableListening = state.needReadable = true;
+      state.emittedReadable = false;
+      if (!state.reading) {
+        pna.nextTick(nReadingNextTick, this);
+      } else if (state.length) {
+        emitReadable(this);
+      }
+    }
+  }
+
+  return res;
+};
+Readable.prototype.addListener = Readable.prototype.on;
+
+function nReadingNextTick(self) {
+  debug('readable nexttick read 0');
+  self.read(0);
+}
+
+// pause() and resume() are remnants of the legacy readable stream API
+// If the user uses them, then switch into old mode.
+Readable.prototype.resume = function () {
+  var state = this._readableState;
+  if (!state.flowing) {
+    debug('resume');
+    state.flowing = true;
+    resume(this, state);
+  }
+  return this;
+};
+
+function resume(stream, state) {
+  if (!state.resumeScheduled) {
+    state.resumeScheduled = true;
+    pna.nextTick(resume_, stream, state);
+  }
+}
+
+function resume_(stream, state) {
+  if (!state.reading) {
+    debug('resume read 0');
+    stream.read(0);
+  }
+
+  state.resumeScheduled = false;
+  state.awaitDrain = 0;
+  stream.emit('resume');
+  flow(stream);
+  if (state.flowing && !state.reading) stream.read(0);
+}
+
+Readable.prototype.pause = function () {
+  debug('call pause flowing=%j', this._readableState.flowing);
+  if (false !== this._readableState.flowing) {
+    debug('pause');
+    this._readableState.flowing = false;
+    this.emit('pause');
+  }
+  return this;
+};
+
+function flow(stream) {
+  var state = stream._readableState;
+  debug('flow', state.flowing);
+  while (state.flowing && stream.read() !== null) {}
+}
+
+// wrap an old-style stream as the async data source.
+// This is *not* part of the readable stream interface.
+// It is an ugly unfortunate mess of history.
+Readable.prototype.wrap = function (stream) {
+  var _this = this;
+
+  var state = this._readableState;
+  var paused = false;
+
+  stream.on('end', function () {
+    debug('wrapped end');
+    if (state.decoder && !state.ended) {
+      var chunk = state.decoder.end();
+      if (chunk && chunk.length) _this.push(chunk);
+    }
+
+    _this.push(null);
+  });
+
+  stream.on('data', function (chunk) {
+    debug('wrapped data');
+    if (state.decoder) chunk = state.decoder.write(chunk);
+
+    // don't skip over falsy values in objectMode
+    if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return;
+
+    var ret = _this.push(chunk);
+    if (!ret) {
+      paused = true;
+      stream.pause();
+    }
+  });
+
+  // proxy all the other methods.
+  // important when wrapping filters and duplexes.
+  for (var i in stream) {
+    if (this[i] === undefined && typeof stream[i] === 'function') {
+      this[i] = function (method) {
+        return function () {
+          return stream[method].apply(stream, arguments);
+        };
+      }(i);
+    }
+  }
+
+  // proxy certain important events.
+  for (var n = 0; n < kProxyEvents.length; n++) {
+    stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n]));
+  }
+
+  // when we try to consume some more bytes, simply unpause the
+  // underlying stream.
+  this._read = function (n) {
+    debug('wrapped _read', n);
+    if (paused) {
+      paused = false;
+      stream.resume();
+    }
+  };
+
+  return this;
+};
+
+Object.defineProperty(Readable.prototype, 'readableHighWaterMark', {
+  // making it explicit this property is not enumerable
+  // because otherwise some prototype manipulation in
+  // userland will fail
+  enumerable: false,
+  get: function () {
+    return this._readableState.highWaterMark;
+  }
+});
+
+// exposed for testing purposes only.
+Readable._fromList = fromList;
+
+// Pluck off n bytes from an array of buffers.
+// Length is the combined lengths of all the buffers in the list.
+// This function is designed to be inlinable, so please take care when making
+// changes to the function body.
+function fromList(n, state) {
+  // nothing buffered
+  if (state.length === 0) return null;
+
+  var ret;
+  if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) {
+    // read it all, truncate the list
+    if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.head.data;else ret = state.buffer.concat(state.length);
+    state.buffer.clear();
+  } else {
+    // read part of list
+    ret = fromListPartial(n, state.buffer, state.decoder);
+  }
+
+  return ret;
+}
+
+// Extracts only enough buffered data to satisfy the amount requested.
+// This function is designed to be inlinable, so please take care when making
+// changes to the function body.
+function fromListPartial(n, list, hasStrings) {
+  var ret;
+  if (n < list.head.data.length) {
+    // slice is the same for buffers and strings
+    ret = list.head.data.slice(0, n);
+    list.head.data = list.head.data.slice(n);
+  } else if (n === list.head.data.length) {
+    // first chunk is a perfect match
+    ret = list.shift();
+  } else {
+    // result spans more than one buffer
+    ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list);
+  }
+  return ret;
+}
+
+// Copies a specified amount of characters from the list of buffered data
+// chunks.
+// This function is designed to be inlinable, so please take care when making
+// changes to the function body.
+function copyFromBufferString(n, list) {
+  var p = list.head;
+  var c = 1;
+  var ret = p.data;
+  n -= ret.length;
+  while (p = p.next) {
+    var str = p.data;
+    var nb = n > str.length ? str.length : n;
+    if (nb === str.length) ret += str;else ret += str.slice(0, n);
+    n -= nb;
+    if (n === 0) {
+      if (nb === str.length) {
+        ++c;
+        if (p.next) list.head = p.next;else list.head = list.tail = null;
+      } else {
+        list.head = p;
+        p.data = str.slice(nb);
+      }
+      break;
+    }
+    ++c;
+  }
+  list.length -= c;
+  return ret;
+}
+
+// Copies a specified amount of bytes from the list of buffered data chunks.
+// This function is designed to be inlinable, so please take care when making
+// changes to the function body.
+function copyFromBuffer(n, list) {
+  var ret = Buffer.allocUnsafe(n);
+  var p = list.head;
+  var c = 1;
+  p.data.copy(ret);
+  n -= p.data.length;
+  while (p = p.next) {
+    var buf = p.data;
+    var nb = n > buf.length ? buf.length : n;
+    buf.copy(ret, ret.length - n, 0, nb);
+    n -= nb;
+    if (n === 0) {
+      if (nb === buf.length) {
+        ++c;
+        if (p.next) list.head = p.next;else list.head = list.tail = null;
+      } else {
+        list.head = p;
+        p.data = buf.slice(nb);
+      }
+      break;
+    }
+    ++c;
+  }
+  list.length -= c;
+  return ret;
+}
+
+function endReadable(stream) {
+  var state = stream._readableState;
+
+  // If we get here before consuming all the bytes, then that is a
+  // bug in node.  Should never happen.
+  if (state.length > 0) throw new Error('"endReadable()" called on non-empty stream');
+
+  if (!state.endEmitted) {
+    state.ended = true;
+    pna.nextTick(endReadableNT, state, stream);
+  }
+}
+
+function endReadableNT(state, stream) {
+  // Check that we didn't get one last unshift.
+  if (!state.endEmitted && state.length === 0) {
+    state.endEmitted = true;
+    stream.readable = false;
+    stream.emit('end');
+  }
+}
+
+function indexOf(xs, x) {
+  for (var i = 0, l = xs.length; i < l; i++) {
+    if (xs[i] === x) return i;
+  }
+  return -1;
+}
\ No newline at end of file
diff --git a/advancedcontentfilter/vendor/npm-asset/readable-stream/lib/_stream_transform.js b/advancedcontentfilter/vendor/npm-asset/readable-stream/lib/_stream_transform.js
new file mode 100644 (file)
index 0000000..5d1f8b8
--- /dev/null
@@ -0,0 +1,214 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+// a transform stream is a readable/writable stream where you do
+// something with the data.  Sometimes it's called a "filter",
+// but that's not a great name for it, since that implies a thing where
+// some bits pass through, and others are simply ignored.  (That would
+// be a valid example of a transform, of course.)
+//
+// While the output is causally related to the input, it's not a
+// necessarily symmetric or synchronous transformation.  For example,
+// a zlib stream might take multiple plain-text writes(), and then
+// emit a single compressed chunk some time in the future.
+//
+// Here's how this works:
+//
+// The Transform stream has all the aspects of the readable and writable
+// stream classes.  When you write(chunk), that calls _write(chunk,cb)
+// internally, and returns false if there's a lot of pending writes
+// buffered up.  When you call read(), that calls _read(n) until
+// there's enough pending readable data buffered up.
+//
+// In a transform stream, the written data is placed in a buffer.  When
+// _read(n) is called, it transforms the queued up data, calling the
+// buffered _write cb's as it consumes chunks.  If consuming a single
+// written chunk would result in multiple output chunks, then the first
+// outputted bit calls the readcb, and subsequent chunks just go into
+// the read buffer, and will cause it to emit 'readable' if necessary.
+//
+// This way, back-pressure is actually determined by the reading side,
+// since _read has to be called to start processing a new chunk.  However,
+// a pathological inflate type of transform can cause excessive buffering
+// here.  For example, imagine a stream where every byte of input is
+// interpreted as an integer from 0-255, and then results in that many
+// bytes of output.  Writing the 4 bytes {ff,ff,ff,ff} would result in
+// 1kb of data being output.  In this case, you could write a very small
+// amount of input, and end up with a very large amount of output.  In
+// such a pathological inflating mechanism, there'd be no way to tell
+// the system to stop doing the transform.  A single 4MB write could
+// cause the system to run out of memory.
+//
+// However, even in such a pathological case, only a single written chunk
+// would be consumed, and then the rest would wait (un-transformed) until
+// the results of the previous transformed chunk were consumed.
+
+'use strict';
+
+module.exports = Transform;
+
+var Duplex = require('./_stream_duplex');
+
+/*<replacement>*/
+var util = require('core-util-is');
+util.inherits = require('inherits');
+/*</replacement>*/
+
+util.inherits(Transform, Duplex);
+
+function afterTransform(er, data) {
+  var ts = this._transformState;
+  ts.transforming = false;
+
+  var cb = ts.writecb;
+
+  if (!cb) {
+    return this.emit('error', new Error('write callback called multiple times'));
+  }
+
+  ts.writechunk = null;
+  ts.writecb = null;
+
+  if (data != null) // single equals check for both `null` and `undefined`
+    this.push(data);
+
+  cb(er);
+
+  var rs = this._readableState;
+  rs.reading = false;
+  if (rs.needReadable || rs.length < rs.highWaterMark) {
+    this._read(rs.highWaterMark);
+  }
+}
+
+function Transform(options) {
+  if (!(this instanceof Transform)) return new Transform(options);
+
+  Duplex.call(this, options);
+
+  this._transformState = {
+    afterTransform: afterTransform.bind(this),
+    needTransform: false,
+    transforming: false,
+    writecb: null,
+    writechunk: null,
+    writeencoding: null
+  };
+
+  // start out asking for a readable event once data is transformed.
+  this._readableState.needReadable = true;
+
+  // we have implemented the _read method, and done the other things
+  // that Readable wants before the first _read call, so unset the
+  // sync guard flag.
+  this._readableState.sync = false;
+
+  if (options) {
+    if (typeof options.transform === 'function') this._transform = options.transform;
+
+    if (typeof options.flush === 'function') this._flush = options.flush;
+  }
+
+  // When the writable side finishes, then flush out anything remaining.
+  this.on('prefinish', prefinish);
+}
+
+function prefinish() {
+  var _this = this;
+
+  if (typeof this._flush === 'function') {
+    this._flush(function (er, data) {
+      done(_this, er, data);
+    });
+  } else {
+    done(this, null, null);
+  }
+}
+
+Transform.prototype.push = function (chunk, encoding) {
+  this._transformState.needTransform = false;
+  return Duplex.prototype.push.call(this, chunk, encoding);
+};
+
+// This is the part where you do stuff!
+// override this function in implementation classes.
+// 'chunk' is an input chunk.
+//
+// Call `push(newChunk)` to pass along transformed output
+// to the readable side.  You may call 'push' zero or more times.
+//
+// Call `cb(err)` when you are done with this chunk.  If you pass
+// an error, then that'll put the hurt on the whole operation.  If you
+// never call cb(), then you'll never get another chunk.
+Transform.prototype._transform = function (chunk, encoding, cb) {
+  throw new Error('_transform() is not implemented');
+};
+
+Transform.prototype._write = function (chunk, encoding, cb) {
+  var ts = this._transformState;
+  ts.writecb = cb;
+  ts.writechunk = chunk;
+  ts.writeencoding = encoding;
+  if (!ts.transforming) {
+    var rs = this._readableState;
+    if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark);
+  }
+};
+
+// Doesn't matter what the args are here.
+// _transform does all the work.
+// That we got here means that the readable side wants more data.
+Transform.prototype._read = function (n) {
+  var ts = this._transformState;
+
+  if (ts.writechunk !== null && ts.writecb && !ts.transforming) {
+    ts.transforming = true;
+    this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform);
+  } else {
+    // mark that we need a transform, so that any data that comes in
+    // will get processed, now that we've asked for it.
+    ts.needTransform = true;
+  }
+};
+
+Transform.prototype._destroy = function (err, cb) {
+  var _this2 = this;
+
+  Duplex.prototype._destroy.call(this, err, function (err2) {
+    cb(err2);
+    _this2.emit('close');
+  });
+};
+
+function done(stream, er, data) {
+  if (er) return stream.emit('error', er);
+
+  if (data != null) // single equals check for both `null` and `undefined`
+    stream.push(data);
+
+  // if there's nothing in the write buffer, then that means
+  // that nothing more will ever be provided
+  if (stream._writableState.length) throw new Error('Calling transform done when ws.length != 0');
+
+  if (stream._transformState.transforming) throw new Error('Calling transform done when still transforming');
+
+  return stream.push(null);
+}
\ No newline at end of file
diff --git a/advancedcontentfilter/vendor/npm-asset/readable-stream/lib/_stream_writable.js b/advancedcontentfilter/vendor/npm-asset/readable-stream/lib/_stream_writable.js
new file mode 100644 (file)
index 0000000..b3f4e85
--- /dev/null
@@ -0,0 +1,687 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+// A bit simpler than readable streams.
+// Implement an async ._write(chunk, encoding, cb), and it'll handle all
+// the drain event emission and buffering.
+
+'use strict';
+
+/*<replacement>*/
+
+var pna = require('process-nextick-args');
+/*</replacement>*/
+
+module.exports = Writable;
+
+/* <replacement> */
+function WriteReq(chunk, encoding, cb) {
+  this.chunk = chunk;
+  this.encoding = encoding;
+  this.callback = cb;
+  this.next = null;
+}
+
+// It seems a linked list but it is not
+// there will be only 2 of these for each stream
+function CorkedRequest(state) {
+  var _this = this;
+
+  this.next = null;
+  this.entry = null;
+  this.finish = function () {
+    onCorkedFinish(_this, state);
+  };
+}
+/* </replacement> */
+
+/*<replacement>*/
+var asyncWrite = !process.browser && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : pna.nextTick;
+/*</replacement>*/
+
+/*<replacement>*/
+var Duplex;
+/*</replacement>*/
+
+Writable.WritableState = WritableState;
+
+/*<replacement>*/
+var util = require('core-util-is');
+util.inherits = require('inherits');
+/*</replacement>*/
+
+/*<replacement>*/
+var internalUtil = {
+  deprecate: require('util-deprecate')
+};
+/*</replacement>*/
+
+/*<replacement>*/
+var Stream = require('./internal/streams/stream');
+/*</replacement>*/
+
+/*<replacement>*/
+
+var Buffer = require('safe-buffer').Buffer;
+var OurUint8Array = global.Uint8Array || function () {};
+function _uint8ArrayToBuffer(chunk) {
+  return Buffer.from(chunk);
+}
+function _isUint8Array(obj) {
+  return Buffer.isBuffer(obj) || obj instanceof OurUint8Array;
+}
+
+/*</replacement>*/
+
+var destroyImpl = require('./internal/streams/destroy');
+
+util.inherits(Writable, Stream);
+
+function nop() {}
+
+function WritableState(options, stream) {
+  Duplex = Duplex || require('./_stream_duplex');
+
+  options = options || {};
+
+  // Duplex streams are both readable and writable, but share
+  // the same options object.
+  // However, some cases require setting options to different
+  // values for the readable and the writable sides of the duplex stream.
+  // These options can be provided separately as readableXXX and writableXXX.
+  var isDuplex = stream instanceof Duplex;
+
+  // object stream flag to indicate whether or not this stream
+  // contains buffers or objects.
+  this.objectMode = !!options.objectMode;
+
+  if (isDuplex) this.objectMode = this.objectMode || !!options.writableObjectMode;
+
+  // the point at which write() starts returning false
+  // Note: 0 is a valid value, means that we always return false if
+  // the entire buffer is not flushed immediately on write()
+  var hwm = options.highWaterMark;
+  var writableHwm = options.writableHighWaterMark;
+  var defaultHwm = this.objectMode ? 16 : 16 * 1024;
+
+  if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (writableHwm || writableHwm === 0)) this.highWaterMark = writableHwm;else this.highWaterMark = defaultHwm;
+
+  // cast to ints.
+  this.highWaterMark = Math.floor(this.highWaterMark);
+
+  // if _final has been called
+  this.finalCalled = false;
+
+  // drain event flag.
+  this.needDrain = false;
+  // at the start of calling end()
+  this.ending = false;
+  // when end() has been called, and returned
+  this.ended = false;
+  // when 'finish' is emitted
+  this.finished = false;
+
+  // has it been destroyed
+  this.destroyed = false;
+
+  // should we decode strings into buffers before passing to _write?
+  // this is here so that some node-core streams can optimize string
+  // handling at a lower level.
+  var noDecode = options.decodeStrings === false;
+  this.decodeStrings = !noDecode;
+
+  // Crypto is kind of old and crusty.  Historically, its default string
+  // encoding is 'binary' so we have to make this configurable.
+  // Everything else in the universe uses 'utf8', though.
+  this.defaultEncoding = options.defaultEncoding || 'utf8';
+
+  // not an actual buffer we keep track of, but a measurement
+  // of how much we're waiting to get pushed to some underlying
+  // socket or file.
+  this.length = 0;
+
+  // a flag to see when we're in the middle of a write.
+  this.writing = false;
+
+  // when true all writes will be buffered until .uncork() call
+  this.corked = 0;
+
+  // a flag to be able to tell if the onwrite cb is called immediately,
+  // or on a later tick.  We set this to true at first, because any
+  // actions that shouldn't happen until "later" should generally also
+  // not happen before the first write call.
+  this.sync = true;
+
+  // a flag to know if we're processing previously buffered items, which
+  // may call the _write() callback in the same tick, so that we don't
+  // end up in an overlapped onwrite situation.
+  this.bufferProcessing = false;
+
+  // the callback that's passed to _write(chunk,cb)
+  this.onwrite = function (er) {
+    onwrite(stream, er);
+  };
+
+  // the callback that the user supplies to write(chunk,encoding,cb)
+  this.writecb = null;
+
+  // the amount that is being written when _write is called.
+  this.writelen = 0;
+
+  this.bufferedRequest = null;
+  this.lastBufferedRequest = null;
+
+  // number of pending user-supplied write callbacks
+  // this must be 0 before 'finish' can be emitted
+  this.pendingcb = 0;
+
+  // emit prefinish if the only thing we're waiting for is _write cbs
+  // This is relevant for synchronous Transform streams
+  this.prefinished = false;
+
+  // True if the error was already emitted and should not be thrown again
+  this.errorEmitted = false;
+
+  // count buffered requests
+  this.bufferedRequestCount = 0;
+
+  // allocate the first CorkedRequest, there is always
+  // one allocated and free to use, and we maintain at most two
+  this.corkedRequestsFree = new CorkedRequest(this);
+}
+
+WritableState.prototype.getBuffer = function getBuffer() {
+  var current = this.bufferedRequest;
+  var out = [];
+  while (current) {
+    out.push(current);
+    current = current.next;
+  }
+  return out;
+};
+
+(function () {
+  try {
+    Object.defineProperty(WritableState.prototype, 'buffer', {
+      get: internalUtil.deprecate(function () {
+        return this.getBuffer();
+      }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.', 'DEP0003')
+    });
+  } catch (_) {}
+})();
+
+// Test _writableState for inheritance to account for Duplex streams,
+// whose prototype chain only points to Readable.
+var realHasInstance;
+if (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') {
+  realHasInstance = Function.prototype[Symbol.hasInstance];
+  Object.defineProperty(Writable, Symbol.hasInstance, {
+    value: function (object) {
+      if (realHasInstance.call(this, object)) return true;
+      if (this !== Writable) return false;
+
+      return object && object._writableState instanceof WritableState;
+    }
+  });
+} else {
+  realHasInstance = function (object) {
+    return object instanceof this;
+  };
+}
+
+function Writable(options) {
+  Duplex = Duplex || require('./_stream_duplex');
+
+  // Writable ctor is applied to Duplexes, too.
+  // `realHasInstance` is necessary because using plain `instanceof`
+  // would return false, as no `_writableState` property is attached.
+
+  // Trying to use the custom `instanceof` for Writable here will also break the
+  // Node.js LazyTransform implementation, which has a non-trivial getter for
+  // `_writableState` that would lead to infinite recursion.
+  if (!realHasInstance.call(Writable, this) && !(this instanceof Duplex)) {
+    return new Writable(options);
+  }
+
+  this._writableState = new WritableState(options, this);
+
+  // legacy.
+  this.writable = true;
+
+  if (options) {
+    if (typeof options.write === 'function') this._write = options.write;
+
+    if (typeof options.writev === 'function') this._writev = options.writev;
+
+    if (typeof options.destroy === 'function') this._destroy = options.destroy;
+
+    if (typeof options.final === 'function') this._final = options.final;
+  }
+
+  Stream.call(this);
+}
+
+// Otherwise people can pipe Writable streams, which is just wrong.
+Writable.prototype.pipe = function () {
+  this.emit('error', new Error('Cannot pipe, not readable'));
+};
+
+function writeAfterEnd(stream, cb) {
+  var er = new Error('write after end');
+  // TODO: defer error events consistently everywhere, not just the cb
+  stream.emit('error', er);
+  pna.nextTick(cb, er);
+}
+
+// Checks that a user-supplied chunk is valid, especially for the particular
+// mode the stream is in. Currently this means that `null` is never accepted
+// and undefined/non-string values are only allowed in object mode.
+function validChunk(stream, state, chunk, cb) {
+  var valid = true;
+  var er = false;
+
+  if (chunk === null) {
+    er = new TypeError('May not write null values to stream');
+  } else if (typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) {
+    er = new TypeError('Invalid non-string/buffer chunk');
+  }
+  if (er) {
+    stream.emit('error', er);
+    pna.nextTick(cb, er);
+    valid = false;
+  }
+  return valid;
+}
+
+Writable.prototype.write = function (chunk, encoding, cb) {
+  var state = this._writableState;
+  var ret = false;
+  var isBuf = !state.objectMode && _isUint8Array(chunk);
+
+  if (isBuf && !Buffer.isBuffer(chunk)) {
+    chunk = _uint8ArrayToBuffer(chunk);
+  }
+
+  if (typeof encoding === 'function') {
+    cb = encoding;
+    encoding = null;
+  }
+
+  if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding;
+
+  if (typeof cb !== 'function') cb = nop;
+
+  if (state.ended) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) {
+    state.pendingcb++;
+    ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb);
+  }
+
+  return ret;
+};
+
+Writable.prototype.cork = function () {
+  var state = this._writableState;
+
+  state.corked++;
+};
+
+Writable.prototype.uncork = function () {
+  var state = this._writableState;
+
+  if (state.corked) {
+    state.corked--;
+
+    if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state);
+  }
+};
+
+Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) {
+  // node::ParseEncoding() requires lower case.
+  if (typeof encoding === 'string') encoding = encoding.toLowerCase();
+  if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding);
+  this._writableState.defaultEncoding = encoding;
+  return this;
+};
+
+function decodeChunk(state, chunk, encoding) {
+  if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') {
+    chunk = Buffer.from(chunk, encoding);
+  }
+  return chunk;
+}
+
+Object.defineProperty(Writable.prototype, 'writableHighWaterMark', {
+  // making it explicit this property is not enumerable
+  // because otherwise some prototype manipulation in
+  // userland will fail
+  enumerable: false,
+  get: function () {
+    return this._writableState.highWaterMark;
+  }
+});
+
+// if we're already writing something, then just put this
+// in the queue, and wait our turn.  Otherwise, call _write
+// If we return false, then we need a drain event, so set that flag.
+function writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) {
+  if (!isBuf) {
+    var newChunk = decodeChunk(state, chunk, encoding);
+    if (chunk !== newChunk) {
+      isBuf = true;
+      encoding = 'buffer';
+      chunk = newChunk;
+    }
+  }
+  var len = state.objectMode ? 1 : chunk.length;
+
+  state.length += len;
+
+  var ret = state.length < state.highWaterMark;
+  // we must ensure that previous needDrain will not be reset to false.
+  if (!ret) state.needDrain = true;
+
+  if (state.writing || state.corked) {
+    var last = state.lastBufferedRequest;
+    state.lastBufferedRequest = {
+      chunk: chunk,
+      encoding: encoding,
+      isBuf: isBuf,
+      callback: cb,
+      next: null
+    };
+    if (last) {
+      last.next = state.lastBufferedRequest;
+    } else {
+      state.bufferedRequest = state.lastBufferedRequest;
+    }
+    state.bufferedRequestCount += 1;
+  } else {
+    doWrite(stream, state, false, len, chunk, encoding, cb);
+  }
+
+  return ret;
+}
+
+function doWrite(stream, state, writev, len, chunk, encoding, cb) {
+  state.writelen = len;
+  state.writecb = cb;
+  state.writing = true;
+  state.sync = true;
+  if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite);
+  state.sync = false;
+}
+
+function onwriteError(stream, state, sync, er, cb) {
+  --state.pendingcb;
+
+  if (sync) {
+    // defer the callback if we are being called synchronously
+    // to avoid piling up things on the stack
+    pna.nextTick(cb, er);
+    // this can emit finish, and it will always happen
+    // after error
+    pna.nextTick(finishMaybe, stream, state);
+    stream._writableState.errorEmitted = true;
+    stream.emit('error', er);
+  } else {
+    // the caller expect this to happen before if
+    // it is async
+    cb(er);
+    stream._writableState.errorEmitted = true;
+    stream.emit('error', er);
+    // this can emit finish, but finish must
+    // always follow error
+    finishMaybe(stream, state);
+  }
+}
+
+function onwriteStateUpdate(state) {
+  state.writing = false;
+  state.writecb = null;
+  state.length -= state.writelen;
+  state.writelen = 0;
+}
+
+function onwrite(stream, er) {
+  var state = stream._writableState;
+  var sync = state.sync;
+  var cb = state.writecb;
+
+  onwriteStateUpdate(state);
+
+  if (er) onwriteError(stream, state, sync, er, cb);else {
+    // Check if we're actually ready to finish, but don't emit yet
+    var finished = needFinish(state);
+
+    if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) {
+      clearBuffer(stream, state);
+    }
+
+    if (sync) {
+      /*<replacement>*/
+      asyncWrite(afterWrite, stream, state, finished, cb);
+      /*</replacement>*/
+    } else {
+      afterWrite(stream, state, finished, cb);
+    }
+  }
+}
+
+function afterWrite(stream, state, finished, cb) {
+  if (!finished) onwriteDrain(stream, state);
+  state.pendingcb--;
+  cb();
+  finishMaybe(stream, state);
+}
+
+// Must force callback to be called on nextTick, so that we don't
+// emit 'drain' before the write() consumer gets the 'false' return
+// value, and has a chance to attach a 'drain' listener.
+function onwriteDrain(stream, state) {
+  if (state.length === 0 && state.needDrain) {
+    state.needDrain = false;
+    stream.emit('drain');
+  }
+}
+
+// if there's something in the buffer waiting, then process it
+function clearBuffer(stream, state) {
+  state.bufferProcessing = true;
+  var entry = state.bufferedRequest;
+
+  if (stream._writev && entry && entry.next) {
+    // Fast case, write everything using _writev()
+    var l = state.bufferedRequestCount;
+    var buffer = new Array(l);
+    var holder = state.corkedRequestsFree;
+    holder.entry = entry;
+
+    var count = 0;
+    var allBuffers = true;
+    while (entry) {
+      buffer[count] = entry;
+      if (!entry.isBuf) allBuffers = false;
+      entry = entry.next;
+      count += 1;
+    }
+    buffer.allBuffers = allBuffers;
+
+    doWrite(stream, state, true, state.length, buffer, '', holder.finish);
+
+    // doWrite is almost always async, defer these to save a bit of time
+    // as the hot path ends with doWrite
+    state.pendingcb++;
+    state.lastBufferedRequest = null;
+    if (holder.next) {
+      state.corkedRequestsFree = holder.next;
+      holder.next = null;
+    } else {
+      state.corkedRequestsFree = new CorkedRequest(state);
+    }
+    state.bufferedRequestCount = 0;
+  } else {
+    // Slow case, write chunks one-by-one
+    while (entry) {
+      var chunk = entry.chunk;
+      var encoding = entry.encoding;
+      var cb = entry.callback;
+      var len = state.objectMode ? 1 : chunk.length;
+
+      doWrite(stream, state, false, len, chunk, encoding, cb);
+      entry = entry.next;
+      state.bufferedRequestCount--;
+      // if we didn't call the onwrite immediately, then
+      // it means that we need to wait until it does.
+      // also, that means that the chunk and cb are currently
+      // being processed, so move the buffer counter past them.
+      if (state.writing) {
+        break;
+      }
+    }
+
+    if (entry === null) state.lastBufferedRequest = null;
+  }
+
+  state.bufferedRequest = entry;
+  state.bufferProcessing = false;
+}
+
+Writable.prototype._write = function (chunk, encoding, cb) {
+  cb(new Error('_write() is not implemented'));
+};
+
+Writable.prototype._writev = null;
+
+Writable.prototype.end = function (chunk, encoding, cb) {
+  var state = this._writableState;
+
+  if (typeof chunk === 'function') {
+    cb = chunk;
+    chunk = null;
+    encoding = null;
+  } else if (typeof encoding === 'function') {
+    cb = encoding;
+    encoding = null;
+  }
+
+  if (chunk !== null && chunk !== undefined) this.write(chunk, encoding);
+
+  // .end() fully uncorks
+  if (state.corked) {
+    state.corked = 1;
+    this.uncork();
+  }
+
+  // ignore unnecessary end() calls.
+  if (!state.ending && !state.finished) endWritable(this, state, cb);
+};
+
+function needFinish(state) {
+  return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing;
+}
+function callFinal(stream, state) {
+  stream._final(function (err) {
+    state.pendingcb--;
+    if (err) {
+      stream.emit('error', err);
+    }
+    state.prefinished = true;
+    stream.emit('prefinish');
+    finishMaybe(stream, state);
+  });
+}
+function prefinish(stream, state) {
+  if (!state.prefinished && !state.finalCalled) {
+    if (typeof stream._final === 'function') {
+      state.pendingcb++;
+      state.finalCalled = true;
+      pna.nextTick(callFinal, stream, state);
+    } else {
+      state.prefinished = true;
+      stream.emit('prefinish');
+    }
+  }
+}
+
+function finishMaybe(stream, state) {
+  var need = needFinish(state);
+  if (need) {
+    prefinish(stream, state);
+    if (state.pendingcb === 0) {
+      state.finished = true;
+      stream.emit('finish');
+    }
+  }
+  return need;
+}
+
+function endWritable(stream, state, cb) {
+  state.ending = true;
+  finishMaybe(stream, state);
+  if (cb) {
+    if (state.finished) pna.nextTick(cb);else stream.once('finish', cb);
+  }
+  state.ended = true;
+  stream.writable = false;
+}
+
+function onCorkedFinish(corkReq, state, err) {
+  var entry = corkReq.entry;
+  corkReq.entry = null;
+  while (entry) {
+    var cb = entry.callback;
+    state.pendingcb--;
+    cb(err);
+    entry = entry.next;
+  }
+  if (state.corkedRequestsFree) {
+    state.corkedRequestsFree.next = corkReq;
+  } else {
+    state.corkedRequestsFree = corkReq;
+  }
+}
+
+Object.defineProperty(Writable.prototype, 'destroyed', {
+  get: function () {
+    if (this._writableState === undefined) {
+      return false;
+    }
+    return this._writableState.destroyed;
+  },
+  set: function (value) {
+    // we ignore the value if the stream
+    // has not been initialized yet
+    if (!this._writableState) {
+      return;
+    }
+
+    // backward compatibility, the user is explicitly
+    // managing destroyed
+    this._writableState.destroyed = value;
+  }
+});
+
+Writable.prototype.destroy = destroyImpl.destroy;
+Writable.prototype._undestroy = destroyImpl.undestroy;
+Writable.prototype._destroy = function (err, cb) {
+  this.end();
+  cb(err);
+};
\ No newline at end of file
diff --git a/advancedcontentfilter/vendor/npm-asset/readable-stream/lib/internal/streams/BufferList.js b/advancedcontentfilter/vendor/npm-asset/readable-stream/lib/internal/streams/BufferList.js
new file mode 100644 (file)
index 0000000..aefc68b
--- /dev/null
@@ -0,0 +1,79 @@
+'use strict';
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+var Buffer = require('safe-buffer').Buffer;
+var util = require('util');
+
+function copyBuffer(src, target, offset) {
+  src.copy(target, offset);
+}
+
+module.exports = function () {
+  function BufferList() {
+    _classCallCheck(this, BufferList);
+
+    this.head = null;
+    this.tail = null;
+    this.length = 0;
+  }
+
+  BufferList.prototype.push = function push(v) {
+    var entry = { data: v, next: null };
+    if (this.length > 0) this.tail.next = entry;else this.head = entry;
+    this.tail = entry;
+    ++this.length;
+  };
+
+  BufferList.prototype.unshift = function unshift(v) {
+    var entry = { data: v, next: this.head };
+    if (this.length === 0) this.tail = entry;
+    this.head = entry;
+    ++this.length;
+  };
+
+  BufferList.prototype.shift = function shift() {
+    if (this.length === 0) return;
+    var ret = this.head.data;
+    if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next;
+    --this.length;
+    return ret;
+  };
+
+  BufferList.prototype.clear = function clear() {
+    this.head = this.tail = null;
+    this.length = 0;
+  };
+
+  BufferList.prototype.join = function join(s) {
+    if (this.length === 0) return '';
+    var p = this.head;
+    var ret = '' + p.data;
+    while (p = p.next) {
+      ret += s + p.data;
+    }return ret;
+  };
+
+  BufferList.prototype.concat = function concat(n) {
+    if (this.length === 0) return Buffer.alloc(0);
+    if (this.length === 1) return this.head.data;
+    var ret = Buffer.allocUnsafe(n >>> 0);
+    var p = this.head;
+    var i = 0;
+    while (p) {
+      copyBuffer(p.data, ret, i);
+      i += p.data.length;
+      p = p.next;
+    }
+    return ret;
+  };
+
+  return BufferList;
+}();
+
+if (util && util.inspect && util.inspect.custom) {
+  module.exports.prototype[util.inspect.custom] = function () {
+    var obj = util.inspect({ length: this.length });
+    return this.constructor.name + ' ' + obj;
+  };
+}
\ No newline at end of file
diff --git a/advancedcontentfilter/vendor/npm-asset/readable-stream/lib/internal/streams/destroy.js b/advancedcontentfilter/vendor/npm-asset/readable-stream/lib/internal/streams/destroy.js
new file mode 100644 (file)
index 0000000..5a0a0d8
--- /dev/null
@@ -0,0 +1,74 @@
+'use strict';
+
+/*<replacement>*/
+
+var pna = require('process-nextick-args');
+/*</replacement>*/
+
+// undocumented cb() API, needed for core, not for public API
+function destroy(err, cb) {
+  var _this = this;
+
+  var readableDestroyed = this._readableState && this._readableState.destroyed;
+  var writableDestroyed = this._writableState && this._writableState.destroyed;
+
+  if (readableDestroyed || writableDestroyed) {
+    if (cb) {
+      cb(err);
+    } else if (err && (!this._writableState || !this._writableState.errorEmitted)) {
+      pna.nextTick(emitErrorNT, this, err);
+    }
+    return this;
+  }
+
+  // we set destroyed to true before firing error callbacks in order
+  // to make it re-entrance safe in case destroy() is called within callbacks
+
+  if (this._readableState) {
+    this._readableState.destroyed = true;
+  }
+
+  // if this is a duplex stream mark the writable part as destroyed as well
+  if (this._writableState) {
+    this._writableState.destroyed = true;
+  }
+
+  this._destroy(err || null, function (err) {
+    if (!cb && err) {
+      pna.nextTick(emitErrorNT, _this, err);
+      if (_this._writableState) {
+        _this._writableState.errorEmitted = true;
+      }
+    } else if (cb) {
+      cb(err);
+    }
+  });
+
+  return this;
+}
+
+function undestroy() {
+  if (this._readableState) {
+    this._readableState.destroyed = false;
+    this._readableState.reading = false;
+    this._readableState.ended = false;
+    this._readableState.endEmitted = false;
+  }
+
+  if (this._writableState) {
+    this._writableState.destroyed = false;
+    this._writableState.ended = false;
+    this._writableState.ending = false;
+    this._writableState.finished = false;
+    this._writableState.errorEmitted = false;
+  }
+}
+
+function emitErrorNT(self, err) {
+  self.emit('error', err);
+}
+
+module.exports = {
+  destroy: destroy,
+  undestroy: undestroy
+};
\ No newline at end of file
diff --git a/advancedcontentfilter/vendor/npm-asset/readable-stream/lib/internal/streams/stream-browser.js b/advancedcontentfilter/vendor/npm-asset/readable-stream/lib/internal/streams/stream-browser.js
new file mode 100644 (file)
index 0000000..9332a3f
--- /dev/null
@@ -0,0 +1 @@
+module.exports = require('events').EventEmitter;
diff --git a/advancedcontentfilter/vendor/npm-asset/readable-stream/lib/internal/streams/stream.js b/advancedcontentfilter/vendor/npm-asset/readable-stream/lib/internal/streams/stream.js
new file mode 100644 (file)
index 0000000..ce2ad5b
--- /dev/null
@@ -0,0 +1 @@
+module.exports = require('stream');
diff --git a/advancedcontentfilter/vendor/npm-asset/readable-stream/package.json b/advancedcontentfilter/vendor/npm-asset/readable-stream/package.json
new file mode 100644 (file)
index 0000000..dbb1da6
--- /dev/null
@@ -0,0 +1,52 @@
+{
+  "name": "readable-stream",
+  "version": "2.3.6",
+  "description": "Streams3, a user-land copy of the stream library from Node.js",
+  "main": "readable.js",
+  "dependencies": {
+    "core-util-is": "~1.0.0",
+    "inherits": "~2.0.3",
+    "isarray": "~1.0.0",
+    "process-nextick-args": "~2.0.0",
+    "safe-buffer": "~5.1.1",
+    "string_decoder": "~1.1.1",
+    "util-deprecate": "~1.0.1"
+  },
+  "devDependencies": {
+    "assert": "^1.4.0",
+    "babel-polyfill": "^6.9.1",
+    "buffer": "^4.9.0",
+    "lolex": "^2.3.2",
+    "nyc": "^6.4.0",
+    "tap": "^0.7.0",
+    "tape": "^4.8.0"
+  },
+  "scripts": {
+    "test": "tap test/parallel/*.js test/ours/*.js && node test/verify-dependencies.js",
+    "ci": "tap test/parallel/*.js test/ours/*.js --tap | tee test.tap && node test/verify-dependencies.js",
+    "cover": "nyc npm test",
+    "report": "nyc report --reporter=lcov"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/nodejs/readable-stream"
+  },
+  "keywords": [
+    "readable",
+    "stream",
+    "pipe"
+  ],
+  "browser": {
+    "util": false,
+    "./readable.js": "./readable-browser.js",
+    "./writable.js": "./writable-browser.js",
+    "./duplex.js": "./duplex-browser.js",
+    "./lib/internal/streams/stream.js": "./lib/internal/streams/stream-browser.js"
+  },
+  "nyc": {
+    "include": [
+      "lib/**.js"
+    ]
+  },
+  "license": "MIT"
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/readable-stream/passthrough.js b/advancedcontentfilter/vendor/npm-asset/readable-stream/passthrough.js
new file mode 100644 (file)
index 0000000..ffd791d
--- /dev/null
@@ -0,0 +1 @@
+module.exports = require('./readable').PassThrough
diff --git a/advancedcontentfilter/vendor/npm-asset/readable-stream/readable-browser.js b/advancedcontentfilter/vendor/npm-asset/readable-stream/readable-browser.js
new file mode 100644 (file)
index 0000000..e503725
--- /dev/null
@@ -0,0 +1,7 @@
+exports = module.exports = require('./lib/_stream_readable.js');
+exports.Stream = exports;
+exports.Readable = exports;
+exports.Writable = require('./lib/_stream_writable.js');
+exports.Duplex = require('./lib/_stream_duplex.js');
+exports.Transform = require('./lib/_stream_transform.js');
+exports.PassThrough = require('./lib/_stream_passthrough.js');
diff --git a/advancedcontentfilter/vendor/npm-asset/readable-stream/readable.js b/advancedcontentfilter/vendor/npm-asset/readable-stream/readable.js
new file mode 100644 (file)
index 0000000..ec89ec5
--- /dev/null
@@ -0,0 +1,19 @@
+var Stream = require('stream');
+if (process.env.READABLE_STREAM === 'disable' && Stream) {
+  module.exports = Stream;
+  exports = module.exports = Stream.Readable;
+  exports.Readable = Stream.Readable;
+  exports.Writable = Stream.Writable;
+  exports.Duplex = Stream.Duplex;
+  exports.Transform = Stream.Transform;
+  exports.PassThrough = Stream.PassThrough;
+  exports.Stream = Stream;
+} else {
+  exports = module.exports = require('./lib/_stream_readable.js');
+  exports.Stream = Stream || exports;
+  exports.Readable = exports;
+  exports.Writable = require('./lib/_stream_writable.js');
+  exports.Duplex = require('./lib/_stream_duplex.js');
+  exports.Transform = require('./lib/_stream_transform.js');
+  exports.PassThrough = require('./lib/_stream_passthrough.js');
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/readable-stream/transform.js b/advancedcontentfilter/vendor/npm-asset/readable-stream/transform.js
new file mode 100644 (file)
index 0000000..b1baba2
--- /dev/null
@@ -0,0 +1 @@
+module.exports = require('./readable').Transform
diff --git a/advancedcontentfilter/vendor/npm-asset/readable-stream/writable-browser.js b/advancedcontentfilter/vendor/npm-asset/readable-stream/writable-browser.js
new file mode 100644 (file)
index 0000000..ebdde6a
--- /dev/null
@@ -0,0 +1 @@
+module.exports = require('./lib/_stream_writable.js');
diff --git a/advancedcontentfilter/vendor/npm-asset/readable-stream/writable.js b/advancedcontentfilter/vendor/npm-asset/readable-stream/writable.js
new file mode 100644 (file)
index 0000000..3211a6f
--- /dev/null
@@ -0,0 +1,8 @@
+var Stream = require("stream")
+var Writable = require("./lib/_stream_writable.js")
+
+if (process.env.READABLE_STREAM === 'disable') {
+  module.exports = Stream && Stream.Writable || Writable
+} else {
+  module.exports = Writable
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/responselike/LICENSE b/advancedcontentfilter/vendor/npm-asset/responselike/LICENSE
new file mode 100644 (file)
index 0000000..8829a00
--- /dev/null
@@ -0,0 +1,19 @@
+Copyright (c) 2017 Luke Childs
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/advancedcontentfilter/vendor/npm-asset/responselike/README.md b/advancedcontentfilter/vendor/npm-asset/responselike/README.md
new file mode 100644 (file)
index 0000000..6361931
--- /dev/null
@@ -0,0 +1,77 @@
+# responselike
+
+> A response-like object for mocking a Node.js HTTP response stream
+
+[![Build Status](https://travis-ci.org/lukechilds/responselike.svg?branch=master)](https://travis-ci.org/lukechilds/responselike)
+[![Coverage Status](https://coveralls.io/repos/github/lukechilds/responselike/badge.svg?branch=master)](https://coveralls.io/github/lukechilds/responselike?branch=master)
+[![npm](https://img.shields.io/npm/dm/responselike.svg)](https://www.npmjs.com/package/responselike)
+[![npm](https://img.shields.io/npm/v/responselike.svg)](https://www.npmjs.com/package/responselike)
+
+Returns a streamable response object similar to a [Node.js HTTP response stream](https://nodejs.org/api/http.html#http_class_http_incomingmessage). Useful for formatting cached responses so they can be consumed by code expecting a real response.
+
+## Install
+
+```shell
+npm install --save responselike
+```
+
+Or if you're just using for testing you'll want:
+
+```shell
+npm install --save-dev responselike
+```
+
+## Usage
+
+```js
+const Response = require('responselike');
+
+const response = new Response(200, { foo: 'bar' }, Buffer.from('Hi!'), 'https://example.com');
+
+response.statusCode;
+// 200
+response.headers;
+// { foo: 'bar' }
+response.body;
+// <Buffer 48 69 21>
+response.url;
+// 'https://example.com'
+
+response.pipe(process.stdout);
+// Hi!
+```
+
+
+## API
+
+### new Response(statusCode, headers, body, url)
+
+Returns a streamable response object similar to a [Node.js HTTP response stream](https://nodejs.org/api/http.html#http_class_http_incomingmessage).
+
+#### statusCode
+
+Type: `number`
+
+HTTP response status code.
+
+#### headers
+
+Type: `object`
+
+HTTP headers object. Keys will be automatically lowercased.
+
+#### body
+
+Type: `buffer`
+
+A Buffer containing the response body. The Buffer contents will be streamable but is also exposed directly as `response.body`.
+
+#### url
+
+Type: `string`
+
+Request URL string.
+
+## License
+
+MIT © Luke Childs
diff --git a/advancedcontentfilter/vendor/npm-asset/responselike/package.json b/advancedcontentfilter/vendor/npm-asset/responselike/package.json
new file mode 100644 (file)
index 0000000..520c8a1
--- /dev/null
@@ -0,0 +1,38 @@
+{
+  "name": "responselike",
+  "version": "1.0.2",
+  "description": "A response-like object for mocking a Node.js HTTP response stream",
+  "main": "src/index.js",
+  "scripts": {
+    "test": "xo && nyc ava",
+    "coverage": "nyc report --reporter=text-lcov | coveralls"
+  },
+  "xo": {
+    "extends": "xo-lukechilds"
+  },
+  "keywords": [
+    "http",
+    "https",
+    "response",
+    "mock",
+    "request",
+    "responselike"
+  ],
+  "repository": {
+    "type": "git",
+    "url": "https://github.com/lukechilds/responselike.git"
+  },
+  "author": "lukechilds",
+  "license": "MIT",
+  "devDependencies": {
+    "ava": "^0.22.0",
+    "coveralls": "^2.13.1",
+    "eslint-config-xo-lukechilds": "^1.0.0",
+    "get-stream": "^3.0.0",
+    "nyc": "^11.1.0",
+    "xo": "^0.19.0"
+  },
+  "dependencies": {
+    "lowercase-keys": "^1.0.0"
+  }
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/responselike/src/index.js b/advancedcontentfilter/vendor/npm-asset/responselike/src/index.js
new file mode 100644 (file)
index 0000000..b17b481
--- /dev/null
@@ -0,0 +1,34 @@
+'use strict';
+
+const Readable = require('stream').Readable;
+const lowercaseKeys = require('lowercase-keys');
+
+class Response extends Readable {
+       constructor(statusCode, headers, body, url) {
+               if (typeof statusCode !== 'number') {
+                       throw new TypeError('Argument `statusCode` should be a number');
+               }
+               if (typeof headers !== 'object') {
+                       throw new TypeError('Argument `headers` should be an object');
+               }
+               if (!(body instanceof Buffer)) {
+                       throw new TypeError('Argument `body` should be a buffer');
+               }
+               if (typeof url !== 'string') {
+                       throw new TypeError('Argument `url` should be a string');
+               }
+
+               super();
+               this.statusCode = statusCode;
+               this.headers = lowercaseKeys(headers);
+               this.body = body;
+               this.url = url;
+       }
+
+       _read() {
+               this.push(this.body);
+               this.push(null);
+       }
+}
+
+module.exports = Response;
diff --git a/advancedcontentfilter/vendor/npm-asset/safe-buffer/.travis.yml b/advancedcontentfilter/vendor/npm-asset/safe-buffer/.travis.yml
new file mode 100644 (file)
index 0000000..7b20f28
--- /dev/null
@@ -0,0 +1,7 @@
+language: node_js
+node_js:
+  - 'node'
+  - '5'
+  - '4'
+  - '0.12'
+  - '0.10'
diff --git a/advancedcontentfilter/vendor/npm-asset/safe-buffer/LICENSE b/advancedcontentfilter/vendor/npm-asset/safe-buffer/LICENSE
new file mode 100644 (file)
index 0000000..0c068ce
--- /dev/null
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) Feross Aboukhadijeh
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/advancedcontentfilter/vendor/npm-asset/safe-buffer/README.md b/advancedcontentfilter/vendor/npm-asset/safe-buffer/README.md
new file mode 100644 (file)
index 0000000..e9a81af
--- /dev/null
@@ -0,0 +1,584 @@
+# safe-buffer [![travis][travis-image]][travis-url] [![npm][npm-image]][npm-url] [![downloads][downloads-image]][downloads-url] [![javascript style guide][standard-image]][standard-url]
+
+[travis-image]: https://img.shields.io/travis/feross/safe-buffer/master.svg
+[travis-url]: https://travis-ci.org/feross/safe-buffer
+[npm-image]: https://img.shields.io/npm/v/safe-buffer.svg
+[npm-url]: https://npmjs.org/package/safe-buffer
+[downloads-image]: https://img.shields.io/npm/dm/safe-buffer.svg
+[downloads-url]: https://npmjs.org/package/safe-buffer
+[standard-image]: https://img.shields.io/badge/code_style-standard-brightgreen.svg
+[standard-url]: https://standardjs.com
+
+#### Safer Node.js Buffer API
+
+**Use the new Node.js Buffer APIs (`Buffer.from`, `Buffer.alloc`,
+`Buffer.allocUnsafe`, `Buffer.allocUnsafeSlow`) in all versions of Node.js.**
+
+**Uses the built-in implementation when available.**
+
+## install
+
+```
+npm install safe-buffer
+```
+
+## usage
+
+The goal of this package is to provide a safe replacement for the node.js `Buffer`.
+
+It's a drop-in replacement for `Buffer`. You can use it by adding one `require` line to
+the top of your node.js modules:
+
+```js
+var Buffer = require('safe-buffer').Buffer
+
+// Existing buffer code will continue to work without issues:
+
+new Buffer('hey', 'utf8')
+new Buffer([1, 2, 3], 'utf8')
+new Buffer(obj)
+new Buffer(16) // create an uninitialized buffer (potentially unsafe)
+
+// But you can use these new explicit APIs to make clear what you want:
+
+Buffer.from('hey', 'utf8') // convert from many types to a Buffer
+Buffer.alloc(16) // create a zero-filled buffer (safe)
+Buffer.allocUnsafe(16) // create an uninitialized buffer (potentially unsafe)
+```
+
+## api
+
+### Class Method: Buffer.from(array)
+<!-- YAML
+added: v3.0.0
+-->
+
+* `array` {Array}
+
+Allocates a new `Buffer` using an `array` of octets.
+
+```js
+const buf = Buffer.from([0x62,0x75,0x66,0x66,0x65,0x72]);
+  // creates a new Buffer containing ASCII bytes
+  // ['b','u','f','f','e','r']
+```
+
+A `TypeError` will be thrown if `array` is not an `Array`.
+
+### Class Method: Buffer.from(arrayBuffer[, byteOffset[, length]])
+<!-- YAML
+added: v5.10.0
+-->
+
+* `arrayBuffer` {ArrayBuffer} The `.buffer` property of a `TypedArray` or
+  a `new ArrayBuffer()`
+* `byteOffset` {Number} Default: `0`
+* `length` {Number} Default: `arrayBuffer.length - byteOffset`
+
+When passed a reference to the `.buffer` property of a `TypedArray` instance,
+the newly created `Buffer` will share the same allocated memory as the
+TypedArray.
+
+```js
+const arr = new Uint16Array(2);
+arr[0] = 5000;
+arr[1] = 4000;
+
+const buf = Buffer.from(arr.buffer); // shares the memory with arr;
+
+console.log(buf);
+  // Prints: <Buffer 88 13 a0 0f>
+
+// changing the TypedArray changes the Buffer also
+arr[1] = 6000;
+
+console.log(buf);
+  // Prints: <Buffer 88 13 70 17>
+```
+
+The optional `byteOffset` and `length` arguments specify a memory range within
+the `arrayBuffer` that will be shared by the `Buffer`.
+
+```js
+const ab = new ArrayBuffer(10);
+const buf = Buffer.from(ab, 0, 2);
+console.log(buf.length);
+  // Prints: 2
+```
+
+A `TypeError` will be thrown if `arrayBuffer` is not an `ArrayBuffer`.
+
+### Class Method: Buffer.from(buffer)
+<!-- YAML
+added: v3.0.0
+-->
+
+* `buffer` {Buffer}
+
+Copies the passed `buffer` data onto a new `Buffer` instance.
+
+```js
+const buf1 = Buffer.from('buffer');
+const buf2 = Buffer.from(buf1);
+
+buf1[0] = 0x61;
+console.log(buf1.toString());
+  // 'auffer'
+console.log(buf2.toString());
+  // 'buffer' (copy is not changed)
+```
+
+A `TypeError` will be thrown if `buffer` is not a `Buffer`.
+
+### Class Method: Buffer.from(str[, encoding])
+<!-- YAML
+added: v5.10.0
+-->
+
+* `str` {String} String to encode.
+* `encoding` {String} Encoding to use, Default: `'utf8'`
+
+Creates a new `Buffer` containing the given JavaScript string `str`. If
+provided, the `encoding` parameter identifies the character encoding.
+If not provided, `encoding` defaults to `'utf8'`.
+
+```js
+const buf1 = Buffer.from('this is a tést');
+console.log(buf1.toString());
+  // prints: this is a tést
+console.log(buf1.toString('ascii'));
+  // prints: this is a tC)st
+
+const buf2 = Buffer.from('7468697320697320612074c3a97374', 'hex');
+console.log(buf2.toString());
+  // prints: this is a tést
+```
+
+A `TypeError` will be thrown if `str` is not a string.
+
+### Class Method: Buffer.alloc(size[, fill[, encoding]])
+<!-- YAML
+added: v5.10.0
+-->
+
+* `size` {Number}
+* `fill` {Value} Default: `undefined`
+* `encoding` {String} Default: `utf8`
+
+Allocates a new `Buffer` of `size` bytes. If `fill` is `undefined`, the
+`Buffer` will be *zero-filled*.
+
+```js
+const buf = Buffer.alloc(5);
+console.log(buf);
+  // <Buffer 00 00 00 00 00>
+```
+
+The `size` must be less than or equal to the value of
+`require('buffer').kMaxLength` (on 64-bit architectures, `kMaxLength` is
+`(2^31)-1`). Otherwise, a [`RangeError`][] is thrown. A zero-length Buffer will
+be created if a `size` less than or equal to 0 is specified.
+
+If `fill` is specified, the allocated `Buffer` will be initialized by calling
+`buf.fill(fill)`. See [`buf.fill()`][] for more information.
+
+```js
+const buf = Buffer.alloc(5, 'a');
+console.log(buf);
+  // <Buffer 61 61 61 61 61>
+```
+
+If both `fill` and `encoding` are specified, the allocated `Buffer` will be
+initialized by calling `buf.fill(fill, encoding)`. For example:
+
+```js
+const buf = Buffer.alloc(11, 'aGVsbG8gd29ybGQ=', 'base64');
+console.log(buf);
+  // <Buffer 68 65 6c 6c 6f 20 77 6f 72 6c 64>
+```
+
+Calling `Buffer.alloc(size)` can be significantly slower than the alternative
+`Buffer.allocUnsafe(size)` but ensures that the newly created `Buffer` instance
+contents will *never contain sensitive data*.
+
+A `TypeError` will be thrown if `size` is not a number.
+
+### Class Method: Buffer.allocUnsafe(size)
+<!-- YAML
+added: v5.10.0
+-->
+
+* `size` {Number}
+
+Allocates a new *non-zero-filled* `Buffer` of `size` bytes.  The `size` must
+be less than or equal to the value of `require('buffer').kMaxLength` (on 64-bit
+architectures, `kMaxLength` is `(2^31)-1`). Otherwise, a [`RangeError`][] is
+thrown. A zero-length Buffer will be created if a `size` less than or equal to
+0 is specified.
+
+The underlying memory for `Buffer` instances created in this way is *not
+initialized*. The contents of the newly created `Buffer` are unknown and
+*may contain sensitive data*. Use [`buf.fill(0)`][] to initialize such
+`Buffer` instances to zeroes.
+
+```js
+const buf = Buffer.allocUnsafe(5);
+console.log(buf);
+  // <Buffer 78 e0 82 02 01>
+  // (octets will be different, every time)
+buf.fill(0);
+console.log(buf);
+  // <Buffer 00 00 00 00 00>
+```
+
+A `TypeError` will be thrown if `size` is not a number.
+
+Note that the `Buffer` module pre-allocates an internal `Buffer` instance of
+size `Buffer.poolSize` that is used as a pool for the fast allocation of new
+`Buffer` instances created using `Buffer.allocUnsafe(size)` (and the deprecated
+`new Buffer(size)` constructor) only when `size` is less than or equal to
+`Buffer.poolSize >> 1` (floor of `Buffer.poolSize` divided by two). The default
+value of `Buffer.poolSize` is `8192` but can be modified.
+
+Use of this pre-allocated internal memory pool is a key difference between
+calling `Buffer.alloc(size, fill)` vs. `Buffer.allocUnsafe(size).fill(fill)`.
+Specifically, `Buffer.alloc(size, fill)` will *never* use the internal Buffer
+pool, while `Buffer.allocUnsafe(size).fill(fill)` *will* use the internal
+Buffer pool if `size` is less than or equal to half `Buffer.poolSize`. The
+difference is subtle but can be important when an application requires the
+additional performance that `Buffer.allocUnsafe(size)` provides.
+
+### Class Method: Buffer.allocUnsafeSlow(size)
+<!-- YAML
+added: v5.10.0
+-->
+
+* `size` {Number}
+
+Allocates a new *non-zero-filled* and non-pooled `Buffer` of `size` bytes.  The
+`size` must be less than or equal to the value of
+`require('buffer').kMaxLength` (on 64-bit architectures, `kMaxLength` is
+`(2^31)-1`). Otherwise, a [`RangeError`][] is thrown. A zero-length Buffer will
+be created if a `size` less than or equal to 0 is specified.
+
+The underlying memory for `Buffer` instances created in this way is *not
+initialized*. The contents of the newly created `Buffer` are unknown and
+*may contain sensitive data*. Use [`buf.fill(0)`][] to initialize such
+`Buffer` instances to zeroes.
+
+When using `Buffer.allocUnsafe()` to allocate new `Buffer` instances,
+allocations under 4KB are, by default, sliced from a single pre-allocated
+`Buffer`. This allows applications to avoid the garbage collection overhead of
+creating many individually allocated Buffers. This approach improves both
+performance and memory usage by eliminating the need to track and cleanup as
+many `Persistent` objects.
+
+However, in the case where a developer may need to retain a small chunk of
+memory from a pool for an indeterminate amount of time, it may be appropriate
+to create an un-pooled Buffer instance using `Buffer.allocUnsafeSlow()` then
+copy out the relevant bits.
+
+```js
+// need to keep around a few small chunks of memory
+const store = [];
+
+socket.on('readable', () => {
+  const data = socket.read();
+  // allocate for retained data
+  const sb = Buffer.allocUnsafeSlow(10);
+  // copy the data into the new allocation
+  data.copy(sb, 0, 0, 10);
+  store.push(sb);
+});
+```
+
+Use of `Buffer.allocUnsafeSlow()` should be used only as a last resort *after*
+a developer has observed undue memory retention in their applications.
+
+A `TypeError` will be thrown if `size` is not a number.
+
+### All the Rest
+
+The rest of the `Buffer` API is exactly the same as in node.js.
+[See the docs](https://nodejs.org/api/buffer.html).
+
+
+## Related links
+
+- [Node.js issue: Buffer(number) is unsafe](https://github.com/nodejs/node/issues/4660)
+- [Node.js Enhancement Proposal: Buffer.from/Buffer.alloc/Buffer.zalloc/Buffer() soft-deprecate](https://github.com/nodejs/node-eps/pull/4)
+
+## Why is `Buffer` unsafe?
+
+Today, the node.js `Buffer` constructor is overloaded to handle many different argument
+types like `String`, `Array`, `Object`, `TypedArrayView` (`Uint8Array`, etc.),
+`ArrayBuffer`, and also `Number`.
+
+The API is optimized for convenience: you can throw any type at it, and it will try to do
+what you want.
+
+Because the Buffer constructor is so powerful, you often see code like this:
+
+```js
+// Convert UTF-8 strings to hex
+function toHex (str) {
+  return new Buffer(str).toString('hex')
+}
+```
+
+***But what happens if `toHex` is called with a `Number` argument?***
+
+### Remote Memory Disclosure
+
+If an attacker can make your program call the `Buffer` constructor with a `Number`
+argument, then they can make it allocate uninitialized memory from the node.js process.
+This could potentially disclose TLS private keys, user data, or database passwords.
+
+When the `Buffer` constructor is passed a `Number` argument, it returns an
+**UNINITIALIZED** block of memory of the specified `size`. When you create a `Buffer` like
+this, you **MUST** overwrite the contents before returning it to the user.
+
+From the [node.js docs](https://nodejs.org/api/buffer.html#buffer_new_buffer_size):
+
+> `new Buffer(size)`
+>
+> - `size` Number
+>
+> The underlying memory for `Buffer` instances created in this way is not initialized.
+> **The contents of a newly created `Buffer` are unknown and could contain sensitive
+> data.** Use `buf.fill(0)` to initialize a Buffer to zeroes.
+
+(Emphasis our own.)
+
+Whenever the programmer intended to create an uninitialized `Buffer` you often see code
+like this:
+
+```js
+var buf = new Buffer(16)
+
+// Immediately overwrite the uninitialized buffer with data from another buffer
+for (var i = 0; i < buf.length; i++) {
+  buf[i] = otherBuf[i]
+}
+```
+
+
+### Would this ever be a problem in real code?
+
+Yes. It's surprisingly common to forget to check the type of your variables in a
+dynamically-typed language like JavaScript.
+
+Usually the consequences of assuming the wrong type is that your program crashes with an
+uncaught exception. But the failure mode for forgetting to check the type of arguments to
+the `Buffer` constructor is more catastrophic.
+
+Here's an example of a vulnerable service that takes a JSON payload and converts it to
+hex:
+
+```js
+// Take a JSON payload {str: "some string"} and convert it to hex
+var server = http.createServer(function (req, res) {
+  var data = ''
+  req.setEncoding('utf8')
+  req.on('data', function (chunk) {
+    data += chunk
+  })
+  req.on('end', function () {
+    var body = JSON.parse(data)
+    res.end(new Buffer(body.str).toString('hex'))
+  })
+})
+
+server.listen(8080)
+```
+
+In this example, an http client just has to send:
+
+```json
+{
+  "str": 1000
+}
+```
+
+and it will get back 1,000 bytes of uninitialized memory from the server.
+
+This is a very serious bug. It's similar in severity to the
+[the Heartbleed bug](http://heartbleed.com/) that allowed disclosure of OpenSSL process
+memory by remote attackers.
+
+
+### Which real-world packages were vulnerable?
+
+#### [`bittorrent-dht`](https://www.npmjs.com/package/bittorrent-dht)
+
+[Mathias Buus](https://github.com/mafintosh) and I
+([Feross Aboukhadijeh](http://feross.org/)) found this issue in one of our own packages,
+[`bittorrent-dht`](https://www.npmjs.com/package/bittorrent-dht). The bug would allow
+anyone on the internet to send a series of messages to a user of `bittorrent-dht` and get
+them to reveal 20 bytes at a time of uninitialized memory from the node.js process.
+
+Here's
+[the commit](https://github.com/feross/bittorrent-dht/commit/6c7da04025d5633699800a99ec3fbadf70ad35b8)
+that fixed it. We released a new fixed version, created a
+[Node Security Project disclosure](https://nodesecurity.io/advisories/68), and deprecated all
+vulnerable versions on npm so users will get a warning to upgrade to a newer version.
+
+#### [`ws`](https://www.npmjs.com/package/ws)
+
+That got us wondering if there were other vulnerable packages. Sure enough, within a short
+period of time, we found the same issue in [`ws`](https://www.npmjs.com/package/ws), the
+most popular WebSocket implementation in node.js.
+
+If certain APIs were called with `Number` parameters instead of `String` or `Buffer` as
+expected, then uninitialized server memory would be disclosed to the remote peer.
+
+These were the vulnerable methods:
+
+```js
+socket.send(number)
+socket.ping(number)
+socket.pong(number)
+```
+
+Here's a vulnerable socket server with some echo functionality:
+
+```js
+server.on('connection', function (socket) {
+  socket.on('message', function (message) {
+    message = JSON.parse(message)
+    if (message.type === 'echo') {
+      socket.send(message.data) // send back the user's message
+    }
+  })
+})
+```
+
+`socket.send(number)` called on the server, will disclose server memory.
+
+Here's [the release](https://github.com/websockets/ws/releases/tag/1.0.1) where the issue
+was fixed, with a more detailed explanation. Props to
+[Arnout Kazemier](https://github.com/3rd-Eden) for the quick fix. Here's the
+[Node Security Project disclosure](https://nodesecurity.io/advisories/67).
+
+
+### What's the solution?
+
+It's important that node.js offers a fast way to get memory otherwise performance-critical
+applications would needlessly get a lot slower.
+
+But we need a better way to *signal our intent* as programmers. **When we want
+uninitialized memory, we should request it explicitly.**
+
+Sensitive functionality should not be packed into a developer-friendly API that loosely
+accepts many different types. This type of API encourages the lazy practice of passing
+variables in without checking the type very carefully.
+
+#### A new API: `Buffer.allocUnsafe(number)`
+
+The functionality of creating buffers with uninitialized memory should be part of another
+API. We propose `Buffer.allocUnsafe(number)`. This way, it's not part of an API that
+frequently gets user input of all sorts of different types passed into it.
+
+```js
+var buf = Buffer.allocUnsafe(16) // careful, uninitialized memory!
+
+// Immediately overwrite the uninitialized buffer with data from another buffer
+for (var i = 0; i < buf.length; i++) {
+  buf[i] = otherBuf[i]
+}
+```
+
+
+### How do we fix node.js core?
+
+We sent [a PR to node.js core](https://github.com/nodejs/node/pull/4514) (merged as
+`semver-major`) which defends against one case:
+
+```js
+var str = 16
+new Buffer(str, 'utf8')
+```
+
+In this situation, it's implied that the programmer intended the first argument to be a
+string, since they passed an encoding as a second argument. Today, node.js will allocate
+uninitialized memory in the case of `new Buffer(number, encoding)`, which is probably not
+what the programmer intended.
+
+But this is only a partial solution, since if the programmer does `new Buffer(variable)`
+(without an `encoding` parameter) there's no way to know what they intended. If `variable`
+is sometimes a number, then uninitialized memory will sometimes be returned.
+
+### What's the real long-term fix?
+
+We could deprecate and remove `new Buffer(number)` and use `Buffer.allocUnsafe(number)` when
+we need uninitialized memory. But that would break 1000s of packages.
+
+~~We believe the best solution is to:~~
+
+~~1. Change `new Buffer(number)` to return safe, zeroed-out memory~~
+
+~~2. Create a new API for creating uninitialized Buffers. We propose: `Buffer.allocUnsafe(number)`~~
+
+#### Update
+
+We now support adding three new APIs:
+
+- `Buffer.from(value)` - convert from any type to a buffer
+- `Buffer.alloc(size)` - create a zero-filled buffer
+- `Buffer.allocUnsafe(size)` - create an uninitialized buffer with given size
+
+This solves the core problem that affected `ws` and `bittorrent-dht` which is
+`Buffer(variable)` getting tricked into taking a number argument.
+
+This way, existing code continues working and the impact on the npm ecosystem will be
+minimal. Over time, npm maintainers can migrate performance-critical code to use
+`Buffer.allocUnsafe(number)` instead of `new Buffer(number)`.
+
+
+### Conclusion
+
+We think there's a serious design issue with the `Buffer` API as it exists today. It
+promotes insecure software by putting high-risk functionality into a convenient API
+with friendly "developer ergonomics".
+
+This wasn't merely a theoretical exercise because we found the issue in some of the
+most popular npm packages.
+
+Fortunately, there's an easy fix that can be applied today. Use `safe-buffer` in place of
+`buffer`.
+
+```js
+var Buffer = require('safe-buffer').Buffer
+```
+
+Eventually, we hope that node.js core can switch to this new, safer behavior. We believe
+the impact on the ecosystem would be minimal since it's not a breaking change.
+Well-maintained, popular packages would be updated to use `Buffer.alloc` quickly, while
+older, insecure packages would magically become safe from this attack vector.
+
+
+## links
+
+- [Node.js PR: buffer: throw if both length and enc are passed](https://github.com/nodejs/node/pull/4514)
+- [Node Security Project disclosure for `ws`](https://nodesecurity.io/advisories/67)
+- [Node Security Project disclosure for`bittorrent-dht`](https://nodesecurity.io/advisories/68)
+
+
+## credit
+
+The original issues in `bittorrent-dht`
+([disclosure](https://nodesecurity.io/advisories/68)) and
+`ws` ([disclosure](https://nodesecurity.io/advisories/67)) were discovered by
+[Mathias Buus](https://github.com/mafintosh) and
+[Feross Aboukhadijeh](http://feross.org/).
+
+Thanks to [Adam Baldwin](https://github.com/evilpacket) for helping disclose these issues
+and for his work running the [Node Security Project](https://nodesecurity.io/).
+
+Thanks to [John Hiesey](https://github.com/jhiesey) for proofreading this README and
+auditing the code.
+
+
+## license
+
+MIT. Copyright (C) [Feross Aboukhadijeh](http://feross.org)
diff --git a/advancedcontentfilter/vendor/npm-asset/safe-buffer/index.js b/advancedcontentfilter/vendor/npm-asset/safe-buffer/index.js
new file mode 100644 (file)
index 0000000..22438da
--- /dev/null
@@ -0,0 +1,62 @@
+/* eslint-disable node/no-deprecated-api */
+var buffer = require('buffer')
+var Buffer = buffer.Buffer
+
+// alternative to using Object.keys for old browsers
+function copyProps (src, dst) {
+  for (var key in src) {
+    dst[key] = src[key]
+  }
+}
+if (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) {
+  module.exports = buffer
+} else {
+  // Copy properties from require('buffer')
+  copyProps(buffer, exports)
+  exports.Buffer = SafeBuffer
+}
+
+function SafeBuffer (arg, encodingOrOffset, length) {
+  return Buffer(arg, encodingOrOffset, length)
+}
+
+// Copy static methods from Buffer
+copyProps(Buffer, SafeBuffer)
+
+SafeBuffer.from = function (arg, encodingOrOffset, length) {
+  if (typeof arg === 'number') {
+    throw new TypeError('Argument must not be a number')
+  }
+  return Buffer(arg, encodingOrOffset, length)
+}
+
+SafeBuffer.alloc = function (size, fill, encoding) {
+  if (typeof size !== 'number') {
+    throw new TypeError('Argument must be a number')
+  }
+  var buf = Buffer(size)
+  if (fill !== undefined) {
+    if (typeof encoding === 'string') {
+      buf.fill(fill, encoding)
+    } else {
+      buf.fill(fill)
+    }
+  } else {
+    buf.fill(0)
+  }
+  return buf
+}
+
+SafeBuffer.allocUnsafe = function (size) {
+  if (typeof size !== 'number') {
+    throw new TypeError('Argument must be a number')
+  }
+  return Buffer(size)
+}
+
+SafeBuffer.allocUnsafeSlow = function (size) {
+  if (typeof size !== 'number') {
+    throw new TypeError('Argument must be a number')
+  }
+  return buffer.SlowBuffer(size)
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/safe-buffer/package.json b/advancedcontentfilter/vendor/npm-asset/safe-buffer/package.json
new file mode 100644 (file)
index 0000000..356d8bf
--- /dev/null
@@ -0,0 +1,37 @@
+{
+  "name": "safe-buffer",
+  "description": "Safer Node.js Buffer API",
+  "version": "5.1.1",
+  "author": {
+    "name": "Feross Aboukhadijeh",
+    "email": "feross@feross.org",
+    "url": "http://feross.org"
+  },
+  "bugs": {
+    "url": "https://github.com/feross/safe-buffer/issues"
+  },
+  "devDependencies": {
+    "standard": "*",
+    "tape": "^4.0.0",
+    "zuul": "^3.0.0"
+  },
+  "homepage": "https://github.com/feross/safe-buffer",
+  "keywords": [
+    "buffer",
+    "buffer allocate",
+    "node security",
+    "safe",
+    "safe-buffer",
+    "security",
+    "uninitialized"
+  ],
+  "license": "MIT",
+  "main": "index.js",
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/feross/safe-buffer.git"
+  },
+  "scripts": {
+    "test": "standard && tape test.js"
+  }
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/safe-buffer/test.js b/advancedcontentfilter/vendor/npm-asset/safe-buffer/test.js
new file mode 100644 (file)
index 0000000..4925059
--- /dev/null
@@ -0,0 +1,101 @@
+/* eslint-disable node/no-deprecated-api */
+
+var test = require('tape')
+var SafeBuffer = require('./').Buffer
+
+test('new SafeBuffer(value) works just like Buffer', function (t) {
+  t.deepEqual(new SafeBuffer('hey'), new Buffer('hey'))
+  t.deepEqual(new SafeBuffer('hey', 'utf8'), new Buffer('hey', 'utf8'))
+  t.deepEqual(new SafeBuffer('686579', 'hex'), new Buffer('686579', 'hex'))
+  t.deepEqual(new SafeBuffer([1, 2, 3]), new Buffer([1, 2, 3]))
+  t.deepEqual(new SafeBuffer(new Uint8Array([1, 2, 3])), new Buffer(new Uint8Array([1, 2, 3])))
+
+  t.equal(typeof SafeBuffer.isBuffer, 'function')
+  t.equal(SafeBuffer.isBuffer(new SafeBuffer('hey')), true)
+  t.equal(Buffer.isBuffer(new SafeBuffer('hey')), true)
+  t.notOk(SafeBuffer.isBuffer({}))
+
+  t.end()
+})
+
+test('SafeBuffer.from(value) converts to a Buffer', function (t) {
+  t.deepEqual(SafeBuffer.from('hey'), new Buffer('hey'))
+  t.deepEqual(SafeBuffer.from('hey', 'utf8'), new Buffer('hey', 'utf8'))
+  t.deepEqual(SafeBuffer.from('686579', 'hex'), new Buffer('686579', 'hex'))
+  t.deepEqual(SafeBuffer.from([1, 2, 3]), new Buffer([1, 2, 3]))
+  t.deepEqual(SafeBuffer.from(new Uint8Array([1, 2, 3])), new Buffer(new Uint8Array([1, 2, 3])))
+
+  t.end()
+})
+
+test('SafeBuffer.alloc(number) returns zeroed-out memory', function (t) {
+  for (var i = 0; i < 10; i++) {
+    var expected1 = new Buffer(1000)
+    expected1.fill(0)
+    t.deepEqual(SafeBuffer.alloc(1000), expected1)
+
+    var expected2 = new Buffer(1000 * 1000)
+    expected2.fill(0)
+    t.deepEqual(SafeBuffer.alloc(1000 * 1000), expected2)
+  }
+  t.end()
+})
+
+test('SafeBuffer.allocUnsafe(number)', function (t) {
+  var buf = SafeBuffer.allocUnsafe(100) // unitialized memory
+  t.equal(buf.length, 100)
+  t.equal(SafeBuffer.isBuffer(buf), true)
+  t.equal(Buffer.isBuffer(buf), true)
+  t.end()
+})
+
+test('SafeBuffer.from() throws with number types', function (t) {
+  t.plan(5)
+  t.throws(function () {
+    SafeBuffer.from(0)
+  })
+  t.throws(function () {
+    SafeBuffer.from(-1)
+  })
+  t.throws(function () {
+    SafeBuffer.from(NaN)
+  })
+  t.throws(function () {
+    SafeBuffer.from(Infinity)
+  })
+  t.throws(function () {
+    SafeBuffer.from(99)
+  })
+})
+
+test('SafeBuffer.allocUnsafe() throws with non-number types', function (t) {
+  t.plan(4)
+  t.throws(function () {
+    SafeBuffer.allocUnsafe('hey')
+  })
+  t.throws(function () {
+    SafeBuffer.allocUnsafe('hey', 'utf8')
+  })
+  t.throws(function () {
+    SafeBuffer.allocUnsafe([1, 2, 3])
+  })
+  t.throws(function () {
+    SafeBuffer.allocUnsafe({})
+  })
+})
+
+test('SafeBuffer.alloc() throws with non-number types', function (t) {
+  t.plan(4)
+  t.throws(function () {
+    SafeBuffer.alloc('hey')
+  })
+  t.throws(function () {
+    SafeBuffer.alloc('hey', 'utf8')
+  })
+  t.throws(function () {
+    SafeBuffer.alloc([1, 2, 3])
+  })
+  t.throws(function () {
+    SafeBuffer.alloc({})
+  })
+})
diff --git a/advancedcontentfilter/vendor/npm-asset/sindresorhus--is/dist/example.d.ts b/advancedcontentfilter/vendor/npm-asset/sindresorhus--is/dist/example.d.ts
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/advancedcontentfilter/vendor/npm-asset/sindresorhus--is/dist/example.js b/advancedcontentfilter/vendor/npm-asset/sindresorhus--is/dist/example.js
new file mode 100644 (file)
index 0000000..4d575fc
--- /dev/null
@@ -0,0 +1,3 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+//# sourceMappingURL=example.js.map
\ No newline at end of file
diff --git a/advancedcontentfilter/vendor/npm-asset/sindresorhus--is/dist/example.js.map b/advancedcontentfilter/vendor/npm-asset/sindresorhus--is/dist/example.js.map
new file mode 100644 (file)
index 0000000..1677c0d
--- /dev/null
@@ -0,0 +1 @@
+{"version":3,"file":"example.js","sourceRoot":"","sources":["../example.ts"],"names":[],"mappings":""}
\ No newline at end of file
diff --git a/advancedcontentfilter/vendor/npm-asset/sindresorhus--is/dist/index.d.ts b/advancedcontentfilter/vendor/npm-asset/sindresorhus--is/dist/index.d.ts
new file mode 100644 (file)
index 0000000..fc54f3a
--- /dev/null
@@ -0,0 +1,95 @@
+/// <reference types="node" />
+export declare const enum TypeName {
+    null = "null",
+    boolean = "boolean",
+    undefined = "undefined",
+    string = "string",
+    number = "number",
+    symbol = "symbol",
+    Function = "Function",
+    Array = "Array",
+    Buffer = "Buffer",
+    Object = "Object",
+    RegExp = "RegExp",
+    Date = "Date",
+    Error = "Error",
+    Map = "Map",
+    Set = "Set",
+    WeakMap = "WeakMap",
+    WeakSet = "WeakSet",
+    Int8Array = "Int8Array",
+    Uint8Array = "Uint8Array",
+    Uint8ClampedArray = "Uint8ClampedArray",
+    Int16Array = "Int16Array",
+    Uint16Array = "Uint16Array",
+    Int32Array = "Int32Array",
+    Uint32Array = "Uint32Array",
+    Float32Array = "Float32Array",
+    Float64Array = "Float64Array",
+    ArrayBuffer = "ArrayBuffer",
+    SharedArrayBuffer = "SharedArrayBuffer",
+    DataView = "DataView",
+    Promise = "Promise",
+}
+declare function is(value: any): TypeName;
+declare namespace is {
+    const undefined: (value: any) => boolean;
+    const string: (value: any) => boolean;
+    const number: (value: any) => boolean;
+    const function_: (value: any) => boolean;
+    const null_: (value: any) => boolean;
+    const class_: (value: any) => any;
+    const boolean: (value: any) => boolean;
+    const symbol: (value: any) => boolean;
+    const array: (arg: any) => arg is any[];
+    const buffer: (obj: any) => obj is Buffer;
+    const nullOrUndefined: (value: any) => boolean;
+    const object: (value: any) => boolean;
+    const iterable: (value: any) => boolean;
+    const generator: (value: any) => boolean;
+    const nativePromise: (value: any) => boolean;
+    const promise: (value: any) => boolean;
+    const generatorFunction: (value: any) => boolean;
+    const asyncFunction: (value: any) => boolean;
+    const boundFunction: (value: any) => boolean;
+    const regExp: (value: any) => boolean;
+    const date: (value: any) => boolean;
+    const error: (value: any) => boolean;
+    const map: (value: any) => boolean;
+    const set: (value: any) => boolean;
+    const weakMap: (value: any) => boolean;
+    const weakSet: (value: any) => boolean;
+    const int8Array: (value: any) => boolean;
+    const uint8Array: (value: any) => boolean;
+    const uint8ClampedArray: (value: any) => boolean;
+    const int16Array: (value: any) => boolean;
+    const uint16Array: (value: any) => boolean;
+    const int32Array: (value: any) => boolean;
+    const uint32Array: (value: any) => boolean;
+    const float32Array: (value: any) => boolean;
+    const float64Array: (value: any) => boolean;
+    const arrayBuffer: (value: any) => boolean;
+    const sharedArrayBuffer: (value: any) => boolean;
+    const dataView: (value: any) => boolean;
+    const directInstanceOf: (instance: any, klass: any) => boolean;
+    const truthy: (value: any) => boolean;
+    const falsy: (value: any) => boolean;
+    const nan: (value: any) => boolean;
+    const primitive: (value: any) => boolean;
+    const integer: (value: any) => boolean;
+    const safeInteger: (value: any) => boolean;
+    const plainObject: (value: any) => boolean;
+    const typedArray: (value: any) => boolean;
+    const arrayLike: (value: any) => boolean;
+    const inRange: (value: number, range: number | number[]) => boolean;
+    const domElement: (value: any) => boolean;
+    const nodeStream: (value: any) => boolean;
+    const infinite: (value: any) => boolean;
+    const even: (rem: number) => boolean;
+    const odd: (rem: number) => boolean;
+    const empty: (value: any) => boolean;
+    const emptyOrWhitespace: (value: any) => boolean;
+    function any(...predicate: any[]): any;
+    function all(...predicate: any[]): any;
+}
+export default is;
diff --git a/advancedcontentfilter/vendor/npm-asset/sindresorhus--is/dist/index.js b/advancedcontentfilter/vendor/npm-asset/sindresorhus--is/dist/index.js
new file mode 100644 (file)
index 0000000..d613b67
--- /dev/null
@@ -0,0 +1,215 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+const util = require("util");
+const toString = Object.prototype.toString;
+const isOfType = (type) => (value) => typeof value === type; // tslint:disable-line:strict-type-predicates
+const getObjectType = (value) => {
+    const objectName = toString.call(value).slice(8, -1);
+    if (objectName) {
+        return objectName;
+    }
+    return null;
+};
+const isObjectOfType = (typeName) => (value) => {
+    return getObjectType(value) === typeName;
+};
+function is(value) {
+    if (value === null) {
+        return "null" /* null */;
+    }
+    if (value === true || value === false) {
+        return "boolean" /* boolean */;
+    }
+    const type = typeof value;
+    if (type === 'undefined') {
+        return "undefined" /* undefined */;
+    }
+    if (type === 'string') {
+        return "string" /* string */;
+    }
+    if (type === 'number') {
+        return "number" /* number */;
+    }
+    if (type === 'symbol') {
+        return "symbol" /* symbol */;
+    }
+    if (is.function_(value)) {
+        return "Function" /* Function */;
+    }
+    if (Array.isArray(value)) {
+        return "Array" /* Array */;
+    }
+    if (Buffer.isBuffer(value)) {
+        return "Buffer" /* Buffer */;
+    }
+    const tagType = getObjectType(value);
+    if (tagType) {
+        return tagType;
+    }
+    if (value instanceof String || value instanceof Boolean || value instanceof Number) {
+        throw new TypeError('Please don\'t use object wrappers for primitive types');
+    }
+    return "Object" /* Object */;
+}
+(function (is) {
+    const isObject = (value) => typeof value === 'object';
+    // tslint:disable:variable-name
+    is.undefined = isOfType('undefined');
+    is.string = isOfType('string');
+    is.number = isOfType('number');
+    is.function_ = isOfType('function');
+    is.null_ = (value) => value === null;
+    is.class_ = (value) => is.function_(value) && value.toString().startsWith('class ');
+    is.boolean = (value) => value === true || value === false;
+    // tslint:enable:variable-name
+    is.symbol = isOfType('symbol');
+    is.array = Array.isArray;
+    is.buffer = Buffer.isBuffer;
+    is.nullOrUndefined = (value) => is.null_(value) || is.undefined(value);
+    is.object = (value) => !is.nullOrUndefined(value) && (is.function_(value) || isObject(value));
+    is.iterable = (value) => !is.nullOrUndefined(value) && is.function_(value[Symbol.iterator]);
+    is.generator = (value) => is.iterable(value) && is.function_(value.next) && is.function_(value.throw);
+    is.nativePromise = isObjectOfType("Promise" /* Promise */);
+    const hasPromiseAPI = (value) => !is.null_(value) &&
+        isObject(value) &&
+        is.function_(value.then) &&
+        is.function_(value.catch);
+    is.promise = (value) => is.nativePromise(value) || hasPromiseAPI(value);
+    // TODO: Change to use `isObjectOfType` once Node.js 6 or higher is targeted
+    const isFunctionOfType = (type) => (value) => is.function_(value) && is.function_(value.constructor) && value.constructor.name === type;
+    is.generatorFunction = isFunctionOfType('GeneratorFunction');
+    is.asyncFunction = isFunctionOfType('AsyncFunction');
+    is.boundFunction = (value) => is.function_(value) && !value.hasOwnProperty('prototype');
+    is.regExp = isObjectOfType("RegExp" /* RegExp */);
+    is.date = isObjectOfType("Date" /* Date */);
+    is.error = isObjectOfType("Error" /* Error */);
+    is.map = isObjectOfType("Map" /* Map */);
+    is.set = isObjectOfType("Set" /* Set */);
+    is.weakMap = isObjectOfType("WeakMap" /* WeakMap */);
+    is.weakSet = isObjectOfType("WeakSet" /* WeakSet */);
+    is.int8Array = isObjectOfType("Int8Array" /* Int8Array */);
+    is.uint8Array = isObjectOfType("Uint8Array" /* Uint8Array */);
+    is.uint8ClampedArray = isObjectOfType("Uint8ClampedArray" /* Uint8ClampedArray */);
+    is.int16Array = isObjectOfType("Int16Array" /* Int16Array */);
+    is.uint16Array = isObjectOfType("Uint16Array" /* Uint16Array */);
+    is.int32Array = isObjectOfType("Int32Array" /* Int32Array */);
+    is.uint32Array = isObjectOfType("Uint32Array" /* Uint32Array */);
+    is.float32Array = isObjectOfType("Float32Array" /* Float32Array */);
+    is.float64Array = isObjectOfType("Float64Array" /* Float64Array */);
+    is.arrayBuffer = isObjectOfType("ArrayBuffer" /* ArrayBuffer */);
+    is.sharedArrayBuffer = isObjectOfType("SharedArrayBuffer" /* SharedArrayBuffer */);
+    is.dataView = isObjectOfType("DataView" /* DataView */);
+    // TODO: Remove `object` checks when targeting ES2015 or higher
+    // See `Notes`: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/getPrototypeOf
+    is.directInstanceOf = (instance, klass) => is.object(instance) && is.object(klass) && Object.getPrototypeOf(instance) === klass.prototype;
+    is.truthy = (value) => Boolean(value);
+    is.falsy = (value) => !value;
+    is.nan = (value) => Number.isNaN(value);
+    const primitiveTypes = new Set([
+        'undefined',
+        'string',
+        'number',
+        'boolean',
+        'symbol'
+    ]);
+    is.primitive = (value) => is.null_(value) || primitiveTypes.has(typeof value);
+    is.integer = (value) => Number.isInteger(value);
+    is.safeInteger = (value) => Number.isSafeInteger(value);
+    is.plainObject = (value) => {
+        // From: https://github.com/sindresorhus/is-plain-obj/blob/master/index.js
+        let prototype;
+        return getObjectType(value) === "Object" /* Object */ &&
+            (prototype = Object.getPrototypeOf(value), prototype === null || // tslint:disable-line:ban-comma-operator
+                prototype === Object.getPrototypeOf({}));
+    };
+    const typedArrayTypes = new Set([
+        "Int8Array" /* Int8Array */,
+        "Uint8Array" /* Uint8Array */,
+        "Uint8ClampedArray" /* Uint8ClampedArray */,
+        "Int16Array" /* Int16Array */,
+        "Uint16Array" /* Uint16Array */,
+        "Int32Array" /* Int32Array */,
+        "Uint32Array" /* Uint32Array */,
+        "Float32Array" /* Float32Array */,
+        "Float64Array" /* Float64Array */
+    ]);
+    is.typedArray = (value) => {
+        const objectType = getObjectType(value);
+        if (objectType === null) {
+            return false;
+        }
+        return typedArrayTypes.has(objectType);
+    };
+    const isValidLength = (value) => is.safeInteger(value) && value > -1;
+    is.arrayLike = (value) => !is.nullOrUndefined(value) && !is.function_(value) && isValidLength(value.length);
+    is.inRange = (value, range) => {
+        if (is.number(range)) {
+            return value >= Math.min(0, range) && value <= Math.max(range, 0);
+        }
+        if (is.array(range) && range.length === 2) {
+            // TODO: Use spread operator here when targeting Node.js 6 or higher
+            return value >= Math.min.apply(null, range) && value <= Math.max.apply(null, range);
+        }
+        throw new TypeError(`Invalid range: ${util.inspect(range)}`);
+    };
+    const NODE_TYPE_ELEMENT = 1;
+    const DOM_PROPERTIES_TO_CHECK = [
+        'innerHTML',
+        'ownerDocument',
+        'style',
+        'attributes',
+        'nodeValue'
+    ];
+    is.domElement = (value) => is.object(value) && value.nodeType === NODE_TYPE_ELEMENT && is.string(value.nodeName) &&
+        !is.plainObject(value) && DOM_PROPERTIES_TO_CHECK.every(property => property in value);
+    is.nodeStream = (value) => !is.nullOrUndefined(value) && isObject(value) && is.function_(value.pipe);
+    is.infinite = (value) => value === Infinity || value === -Infinity;
+    const isAbsoluteMod2 = (value) => (rem) => is.integer(rem) && Math.abs(rem % 2) === value;
+    is.even = isAbsoluteMod2(0);
+    is.odd = isAbsoluteMod2(1);
+    const isWhiteSpaceString = (value) => is.string(value) && /\S/.test(value) === false;
+    const isEmptyStringOrArray = (value) => (is.string(value) || is.array(value)) && value.length === 0;
+    const isEmptyObject = (value) => !is.map(value) && !is.set(value) && is.object(value) && Object.keys(value).length === 0;
+    const isEmptyMapOrSet = (value) => (is.map(value) || is.set(value)) && value.size === 0;
+    is.empty = (value) => is.falsy(value) || isEmptyStringOrArray(value) || isEmptyObject(value) || isEmptyMapOrSet(value);
+    is.emptyOrWhitespace = (value) => is.empty(value) || isWhiteSpaceString(value);
+    const predicateOnArray = (method, predicate, args) => {
+        // `args` is the calling function's "arguments object".
+        // We have to do it this way to keep node v4 support.
+        // So here we convert it to an array and slice off the first item.
+        const values = Array.prototype.slice.call(args, 1);
+        if (is.function_(predicate) === false) {
+            throw new TypeError(`Invalid predicate: ${util.inspect(predicate)}`);
+        }
+        if (values.length === 0) {
+            throw new TypeError('Invalid number of values');
+        }
+        return method.call(values, predicate);
+    };
+    function any(predicate) {
+        return predicateOnArray(Array.prototype.some, predicate, arguments);
+    }
+    is.any = any;
+    function all(predicate) {
+        return predicateOnArray(Array.prototype.every, predicate, arguments);
+    }
+    is.all = all;
+    // tslint:enable:only-arrow-functions no-function-expression
+})(is || (is = {}));
+// Some few keywords are reserved, but we'll populate them for Node.js users
+// See https://github.com/Microsoft/TypeScript/issues/2536
+Object.defineProperties(is, {
+    class: {
+        value: is.class_
+    },
+    function: {
+        value: is.function_
+    },
+    null: {
+        value: is.null_
+    }
+});
+exports.default = is;
+// For CommonJS default export support
+module.exports = is;
+module.exports.default = is;
diff --git a/advancedcontentfilter/vendor/npm-asset/sindresorhus--is/dist/index.js.map b/advancedcontentfilter/vendor/npm-asset/sindresorhus--is/dist/index.js.map
new file mode 100644 (file)
index 0000000..7461e68
--- /dev/null
@@ -0,0 +1 @@
+{"version":3,"file":"index.js","sourceRoot":"","sources":["../source/index.ts"],"names":[],"mappings":";;AAAA,6BAA6B;AAE7B,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC;AAC3C,MAAM,aAAa,GAAG,CAAC,KAAU,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAW,CAAC;AAClF,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,KAAU,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,IAAI,CAAC;AACzE,MAAM,cAAc,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,KAAU,EAAE,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC;AAEvF,YAAY,KAAU;IACrB,EAAE,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC;QACpB,MAAM,CAAC,MAAM,CAAC;IACf,CAAC;IAED,EAAE,CAAC,CAAC,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC;QACvC,MAAM,CAAC,SAAS,CAAC;IAClB,CAAC;IAED,MAAM,IAAI,GAAG,OAAO,KAAK,CAAC;IAE1B,EAAE,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC;QAC1B,MAAM,CAAC,WAAW,CAAC;IACpB,CAAC;IAED,EAAE,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC;QACvB,MAAM,CAAC,QAAQ,CAAC;IACjB,CAAC;IAED,EAAE,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC;QACvB,MAAM,CAAC,QAAQ,CAAC;IACjB,CAAC;IAED,EAAE,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC;QACvB,MAAM,CAAC,QAAQ,CAAC;IACjB,CAAC;IAED,EAAE,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACzB,MAAM,CAAC,UAAU,CAAC;IACnB,CAAC;IAED,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC1B,MAAM,CAAC,OAAO,CAAC;IAChB,CAAC;IAED,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC5B,MAAM,CAAC,QAAQ,CAAC;IACjB,CAAC;IAED,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IACrC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;QACb,MAAM,CAAC,OAAO,CAAC;IAChB,CAAC;IAED,EAAE,CAAC,CAAC,KAAK,YAAY,MAAM,IAAI,KAAK,YAAY,OAAO,IAAI,KAAK,YAAY,MAAM,CAAC,CAAC,CAAC;QACpF,MAAM,IAAI,SAAS,CAAC,uDAAuD,CAAC,CAAC;IAC9E,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC;AACjB,CAAC;AAED,WAAU,EAAE;IACX,MAAM,QAAQ,GAAG,CAAC,KAAU,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC;IAG9C,YAAS,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC;IAClC,SAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC5B,SAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC5B,YAAS,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;IACjC,QAAK,GAAG,CAAC,KAAU,EAAE,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC;IAEvC,SAAM,GAAG,CAAC,KAAU,EAAE,EAAE,CAAC,GAAA,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IACnF,UAAO,GAAG,CAAC,KAAU,EAAE,EAAE,CAAC,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,KAAK,CAAC;IAG5D,SAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAE5B,QAAK,GAAG,KAAK,CAAC,OAAO,CAAC;IACtB,SAAM,GAAG,MAAM,CAAC,QAAQ,CAAC;IAEzB,kBAAe,GAAG,CAAC,KAAU,EAAE,EAAE,CAAC,GAAA,KAAK,CAAC,KAAK,CAAC,IAAI,GAAA,SAAS,CAAC,KAAK,CAAC,CAAC;IACnE,SAAM,GAAG,CAAC,KAAU,EAAE,EAAE,CAAC,CAAC,GAAA,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,GAAA,SAAS,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IAC1F,WAAQ,GAAG,CAAC,KAAU,EAAE,EAAE,CAAC,CAAC,GAAA,eAAe,CAAC,KAAK,CAAC,IAAI,GAAA,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;IACxF,YAAS,GAAG,CAAC,KAAU,EAAE,EAAE,CAAC,GAAA,QAAQ,CAAC,KAAK,CAAC,IAAI,GAAA,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,GAAA,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAE/F,gBAAa,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;IAEvD,MAAM,aAAa,GAAG,CAAC,KAAU,EAAE,EAAE,CACpC,CAAC,GAAA,KAAK,CAAC,KAAK,CAAC;QACb,QAAQ,CAAC,KAAK,CAAC;QACf,GAAA,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC;QACrB,GAAA,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAEX,UAAO,GAAG,CAAC,KAAU,EAAE,EAAE,CAAC,GAAA,aAAa,CAAC,KAAK,CAAC,IAAI,aAAa,CAAC,KAAK,CAAC,CAAC;IAGpF,MAAM,gBAAgB,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,KAAU,EAAE,EAAE,CAAC,GAAA,SAAS,CAAC,KAAK,CAAC,IAAI,GAAA,SAAS,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,WAAW,CAAC,IAAI,KAAK,IAAI,CAAC;IAElI,oBAAiB,GAAG,gBAAgB,CAAC,mBAAmB,CAAC,CAAC;IAC1D,gBAAa,GAAG,gBAAgB,CAAC,eAAe,CAAC,CAAC;IAElD,SAAM,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IAClC,OAAI,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IAC9B,QAAK,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IAChC,MAAG,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IAC5B,MAAG,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IAC5B,UAAO,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;IACpC,UAAO,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;IAEpC,YAAS,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;IACxC,aAAU,GAAG,cAAc,CAAC,YAAY,CAAC,CAAC;IAC1C,oBAAiB,GAAG,cAAc,CAAC,mBAAmB,CAAC,CAAC;IACxD,aAAU,GAAG,cAAc,CAAC,YAAY,CAAC,CAAC;IAC1C,cAAW,GAAG,cAAc,CAAC,aAAa,CAAC,CAAC;IAC5C,aAAU,GAAG,cAAc,CAAC,YAAY,CAAC,CAAC;IAC1C,cAAW,GAAG,cAAc,CAAC,aAAa,CAAC,CAAC;IAC5C,eAAY,GAAG,cAAc,CAAC,cAAc,CAAC,CAAC;IAC9C,eAAY,GAAG,cAAc,CAAC,cAAc,CAAC,CAAC;IAE9C,cAAW,GAAG,cAAc,CAAC,aAAa,CAAC,CAAC;IAC5C,oBAAiB,GAAG,cAAc,CAAC,mBAAmB,CAAC,CAAC;IAExD,SAAM,GAAG,CAAC,KAAU,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACxC,QAAK,GAAG,CAAC,KAAU,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC;IAE/B,MAAG,GAAG,CAAC,KAAU,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAEvD,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC;QAC9B,WAAW;QACX,QAAQ;QACR,QAAQ;QACR,SAAS;QACT,QAAQ;KACR,CAAC,CAAC;IAEU,YAAS,GAAG,CAAC,KAAU,EAAE,EAAE,CAAC,GAAA,KAAK,CAAC,KAAK,CAAC,IAAI,cAAc,CAAC,GAAG,CAAC,OAAO,KAAK,CAAC,CAAC;IAE7E,UAAO,GAAG,CAAC,KAAU,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAClD,cAAW,GAAG,CAAC,KAAU,EAAE,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAE1D,cAAW,GAAG,CAAC,KAAU,EAAE,EAAE;QAEzC,IAAI,SAAS,CAAC;QAEd,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,QAAQ;YACvC,CAAC,SAAS,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,SAAS,KAAK,IAAI;gBAC5D,SAAS,KAAK,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5C,CAAC,CAAC;IAEF,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC;QAC/B,WAAW;QACX,YAAY;QACZ,mBAAmB;QACnB,YAAY;QACZ,aAAa;QACb,YAAY;QACZ,aAAa;QACb,cAAc;QACd,cAAc;KACd,CAAC,CAAC;IACU,aAAU,GAAG,CAAC,KAAU,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;IAEpF,MAAM,aAAa,GAAG,CAAC,KAAU,EAAE,EAAE,CAAC,GAAA,WAAW,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC;IAC1D,YAAS,GAAG,CAAC,KAAU,EAAE,EAAE,CAAC,CAAC,GAAA,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,GAAA,SAAS,CAAC,KAAK,CAAC,IAAI,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAExG,UAAO,GAAG,CAAC,KAAa,EAAE,KAAwB,EAAE,EAAE;QAClE,EAAE,CAAC,CAAC,GAAA,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACnB,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAe,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,KAAe,EAAE,CAAC,CAAC,CAAC;QACvF,CAAC;QAED,EAAE,CAAC,CAAC,GAAA,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC;YAExC,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACrF,CAAC;QAED,MAAM,IAAI,SAAS,CAAC,kBAAkB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC9D,CAAC,CAAC;IAEF,MAAM,iBAAiB,GAAG,CAAC,CAAC;IAC5B,MAAM,uBAAuB,GAAG;QAC/B,WAAW;QACX,eAAe;QACf,OAAO;QACP,YAAY;QACZ,WAAW;KACX,CAAC;IAEW,aAAU,GAAG,CAAC,KAAU,EAAE,EAAE,CAAC,GAAA,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,KAAK,iBAAiB,IAAI,GAAA,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC;QACxH,CAAC,GAAA,WAAW,CAAC,KAAK,CAAC,IAAI,uBAAuB,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,CAAC;IAExE,WAAQ,GAAG,CAAC,KAAU,EAAE,EAAE,CAAC,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,CAAC,QAAQ,CAAC;IAElF,MAAM,cAAc,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,CAAC,GAAW,EAAE,EAAE,CAAC,GAAA,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,KAAK,CAAC;IAC1F,OAAI,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;IACzB,MAAG,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;IAErC,MAAM,kBAAkB,GAAG,CAAC,KAAU,EAAE,EAAE,CAAC,GAAA,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC;IACvF,MAAM,oBAAoB,GAAG,CAAC,KAAU,EAAE,EAAE,CAAC,CAAC,GAAA,MAAM,CAAC,KAAK,CAAC,IAAI,GAAA,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC;IACnG,MAAM,aAAa,GAAG,CAAC,KAAU,EAAE,EAAE,CAAC,CAAC,GAAA,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAA,GAAG,CAAC,KAAK,CAAC,IAAI,GAAA,MAAM,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;IACrH,MAAM,eAAe,GAAG,CAAC,KAAU,EAAE,EAAE,CAAC,CAAC,GAAA,GAAG,CAAC,KAAK,CAAC,IAAI,GAAA,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC;IAE1E,QAAK,GAAG,CAAC,KAAU,EAAE,EAAE,CAAC,GAAA,KAAK,CAAC,KAAK,CAAC,IAAI,oBAAoB,CAAC,KAAK,CAAC,IAAI,aAAa,CAAC,KAAK,CAAC,IAAI,eAAe,CAAC,KAAK,CAAC,CAAC;IACtH,oBAAiB,GAAG,CAAC,KAAU,EAAE,EAAE,CAAC,GAAA,KAAK,CAAC,KAAK,CAAC,IAAI,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAG3F,MAAM,gBAAgB,GAAG,CAAC,MAAmB,EAAE,SAAc,EAAE,IAAgB,EAAE,EAAE;QAIlF,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAEnD,EAAE,CAAC,CAAC,GAAA,SAAS,CAAC,SAAS,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC;YACpC,MAAM,IAAI,SAAS,CAAC,sBAAsB,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QACtE,CAAC;QAED,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC;YACzB,MAAM,IAAI,SAAS,CAAC,0BAA0B,CAAC,CAAC;QACjD,CAAC;QAED,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACvC,CAAC,CAAC;IAMF,aAAoB,SAAc;QACjC,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;IACrE,CAAC;IAFe,MAAG,MAElB,CAAA;IAGD,aAAoB,SAAc;QACjC,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;IACtE,CAAC;IAFe,MAAG,MAElB,CAAA;AAEF,CAAC,EA9KS,EAAE,KAAF,EAAE,QA8KX;AAID,MAAM,CAAC,gBAAgB,CAAC,EAAE,EAAE;IAC3B,KAAK,EAAE;QACN,KAAK,EAAE,EAAE,CAAC,MAAM;KAChB;IACD,QAAQ,EAAE;QACT,KAAK,EAAE,EAAE,CAAC,SAAS;KACnB;IACD,IAAI,EAAE;QACL,KAAK,EAAE,EAAE,CAAC,KAAK;KACf;CACD,CAAC,CAAC;AAEH,kBAAe,EAAE,CAAC;AAGlB,MAAM,CAAC,OAAO,GAAG,EAAE,CAAC;AACpB,MAAM,CAAC,OAAO,CAAC,OAAO,GAAG,EAAE,CAAC"}
\ No newline at end of file
diff --git a/advancedcontentfilter/vendor/npm-asset/sindresorhus--is/dist/source/index.d.ts b/advancedcontentfilter/vendor/npm-asset/sindresorhus--is/dist/source/index.d.ts
new file mode 100644 (file)
index 0000000..f5fe722
--- /dev/null
@@ -0,0 +1,59 @@
+/// <reference types="node" />
+declare function is(value: any): string;
+declare namespace is {
+    const undefined: (value: any) => boolean;
+    const string: (value: any) => boolean;
+    const number: (value: any) => boolean;
+    const function_: (value: any) => boolean;
+    const null_: (value: any) => boolean;
+    const class_: (value: any) => any;
+    const boolean: (value: any) => boolean;
+    const symbol: (value: any) => boolean;
+    const array: (arg: any) => arg is any[];
+    const buffer: (obj: any) => obj is Buffer;
+    const nullOrUndefined: (value: any) => boolean;
+    const object: (value: any) => boolean;
+    const iterable: (value: any) => boolean;
+    const generator: (value: any) => boolean;
+    const nativePromise: (value: any) => boolean;
+    const promise: (value: any) => boolean;
+    const generatorFunction: (value: any) => boolean;
+    const asyncFunction: (value: any) => boolean;
+    const regExp: (value: any) => boolean;
+    const date: (value: any) => boolean;
+    const error: (value: any) => boolean;
+    const map: (value: any) => boolean;
+    const set: (value: any) => boolean;
+    const weakMap: (value: any) => boolean;
+    const weakSet: (value: any) => boolean;
+    const int8Array: (value: any) => boolean;
+    const uint8Array: (value: any) => boolean;
+    const uint8ClampedArray: (value: any) => boolean;
+    const int16Array: (value: any) => boolean;
+    const uint16Array: (value: any) => boolean;
+    const int32Array: (value: any) => boolean;
+    const uint32Array: (value: any) => boolean;
+    const float32Array: (value: any) => boolean;
+    const float64Array: (value: any) => boolean;
+    const arrayBuffer: (value: any) => boolean;
+    const sharedArrayBuffer: (value: any) => boolean;
+    const truthy: (value: any) => boolean;
+    const falsy: (value: any) => boolean;
+    const nan: (value: any) => boolean;
+    const primitive: (value: any) => boolean;
+    const integer: (value: any) => boolean;
+    const safeInteger: (value: any) => boolean;
+    const plainObject: (value: any) => boolean;
+    const typedArray: (value: any) => boolean;
+    const arrayLike: (value: any) => boolean;
+    const inRange: (value: number, range: number | number[]) => boolean;
+    const domElement: (value: any) => boolean;
+    const infinite: (value: any) => boolean;
+    const even: (rem: number) => boolean;
+    const odd: (rem: number) => boolean;
+    const empty: (value: any) => boolean;
+    const emptyOrWhitespace: (value: any) => boolean;
+    function any(...predicate: any[]): any;
+    function all(...predicate: any[]): any;
+}
+export default is;
diff --git a/advancedcontentfilter/vendor/npm-asset/sindresorhus--is/dist/source/index.js b/advancedcontentfilter/vendor/npm-asset/sindresorhus--is/dist/source/index.js
new file mode 100644 (file)
index 0000000..2ff01c9
--- /dev/null
@@ -0,0 +1,182 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+const util = require("util");
+const toString = Object.prototype.toString;
+const getObjectType = (value) => toString.call(value).slice(8, -1);
+const isOfType = (type) => (value) => typeof value === type;
+const isObjectOfType = (type) => (value) => getObjectType(value) === type;
+function is(value) {
+    if (value === null) {
+        return 'null';
+    }
+    if (value === true || value === false) {
+        return 'boolean';
+    }
+    const type = typeof value;
+    if (type === 'undefined') {
+        return 'undefined';
+    }
+    if (type === 'string') {
+        return 'string';
+    }
+    if (type === 'number') {
+        return 'number';
+    }
+    if (type === 'symbol') {
+        return 'symbol';
+    }
+    if (is.function_(value)) {
+        return 'Function';
+    }
+    if (Array.isArray(value)) {
+        return 'Array';
+    }
+    if (Buffer.isBuffer(value)) {
+        return 'Buffer';
+    }
+    const tagType = getObjectType(value);
+    if (tagType) {
+        return tagType;
+    }
+    if (value instanceof String || value instanceof Boolean || value instanceof Number) {
+        throw new TypeError('Please don\'t use object wrappers for primitive types');
+    }
+    return 'Object';
+}
+(function (is) {
+    const isObject = (value) => typeof value === 'object';
+    is.undefined = isOfType('undefined');
+    is.string = isOfType('string');
+    is.number = isOfType('number');
+    is.function_ = isOfType('function');
+    is.null_ = (value) => value === null;
+    is.class_ = (value) => is.function_(value) && value.toString().startsWith('class ');
+    is.boolean = (value) => value === true || value === false;
+    is.symbol = isOfType('symbol');
+    is.array = Array.isArray;
+    is.buffer = Buffer.isBuffer;
+    is.nullOrUndefined = (value) => is.null_(value) || is.undefined(value);
+    is.object = (value) => !is.nullOrUndefined(value) && (is.function_(value) || isObject(value));
+    is.iterable = (value) => !is.nullOrUndefined(value) && is.function_(value[Symbol.iterator]);
+    is.generator = (value) => is.iterable(value) && is.function_(value.next) && is.function_(value.throw);
+    is.nativePromise = isObjectOfType('Promise');
+    const hasPromiseAPI = (value) => !is.null_(value) &&
+        isObject(value) &&
+        is.function_(value.then) &&
+        is.function_(value.catch);
+    is.promise = (value) => is.nativePromise(value) || hasPromiseAPI(value);
+    const isFunctionOfType = (type) => (value) => is.function_(value) && is.function_(value.constructor) && value.constructor.name === type;
+    is.generatorFunction = isFunctionOfType('GeneratorFunction');
+    is.asyncFunction = isFunctionOfType('AsyncFunction');
+    is.regExp = isObjectOfType('RegExp');
+    is.date = isObjectOfType('Date');
+    is.error = isObjectOfType('Error');
+    is.map = isObjectOfType('Map');
+    is.set = isObjectOfType('Set');
+    is.weakMap = isObjectOfType('WeakMap');
+    is.weakSet = isObjectOfType('WeakSet');
+    is.int8Array = isObjectOfType('Int8Array');
+    is.uint8Array = isObjectOfType('Uint8Array');
+    is.uint8ClampedArray = isObjectOfType('Uint8ClampedArray');
+    is.int16Array = isObjectOfType('Int16Array');
+    is.uint16Array = isObjectOfType('Uint16Array');
+    is.int32Array = isObjectOfType('Int32Array');
+    is.uint32Array = isObjectOfType('Uint32Array');
+    is.float32Array = isObjectOfType('Float32Array');
+    is.float64Array = isObjectOfType('Float64Array');
+    is.arrayBuffer = isObjectOfType('ArrayBuffer');
+    is.sharedArrayBuffer = isObjectOfType('SharedArrayBuffer');
+    is.truthy = (value) => Boolean(value);
+    is.falsy = (value) => !value;
+    is.nan = (value) => Number.isNaN(value);
+    const primitiveTypes = new Set([
+        'undefined',
+        'string',
+        'number',
+        'boolean',
+        'symbol'
+    ]);
+    is.primitive = (value) => is.null_(value) || primitiveTypes.has(typeof value);
+    is.integer = (value) => Number.isInteger(value);
+    is.safeInteger = (value) => Number.isSafeInteger(value);
+    is.plainObject = (value) => {
+        let prototype;
+        return getObjectType(value) === 'Object' &&
+            (prototype = Object.getPrototypeOf(value), prototype === null ||
+                prototype === Object.getPrototypeOf({}));
+    };
+    const typedArrayTypes = new Set([
+        'Int8Array',
+        'Uint8Array',
+        'Uint8ClampedArray',
+        'Int16Array',
+        'Uint16Array',
+        'Int32Array',
+        'Uint32Array',
+        'Float32Array',
+        'Float64Array'
+    ]);
+    is.typedArray = (value) => typedArrayTypes.has(getObjectType(value));
+    const isValidLength = (value) => is.safeInteger(value) && value > -1;
+    is.arrayLike = (value) => !is.nullOrUndefined(value) && !is.function_(value) && isValidLength(value.length);
+    is.inRange = (value, range) => {
+        if (is.number(range)) {
+            return value >= Math.min(0, range) && value <= Math.max(range, 0);
+        }
+        if (is.array(range) && range.length === 2) {
+            return value >= Math.min.apply(null, range) && value <= Math.max.apply(null, range);
+        }
+        throw new TypeError(`Invalid range: ${util.inspect(range)}`);
+    };
+    const NODE_TYPE_ELEMENT = 1;
+    const DOM_PROPERTIES_TO_CHECK = [
+        'innerHTML',
+        'ownerDocument',
+        'style',
+        'attributes',
+        'nodeValue'
+    ];
+    is.domElement = (value) => is.object(value) && value.nodeType === NODE_TYPE_ELEMENT && is.string(value.nodeName) &&
+        !is.plainObject(value) && DOM_PROPERTIES_TO_CHECK.every(property => property in value);
+    is.infinite = (value) => value === Infinity || value === -Infinity;
+    const isAbsoluteMod2 = (value) => (rem) => is.integer(rem) && Math.abs(rem % 2) === value;
+    is.even = isAbsoluteMod2(0);
+    is.odd = isAbsoluteMod2(1);
+    const isWhiteSpaceString = (value) => is.string(value) && /\S/.test(value) === false;
+    const isEmptyStringOrArray = (value) => (is.string(value) || is.array(value)) && value.length === 0;
+    const isEmptyObject = (value) => !is.map(value) && !is.set(value) && is.object(value) && Object.keys(value).length === 0;
+    const isEmptyMapOrSet = (value) => (is.map(value) || is.set(value)) && value.size === 0;
+    is.empty = (value) => is.falsy(value) || isEmptyStringOrArray(value) || isEmptyObject(value) || isEmptyMapOrSet(value);
+    is.emptyOrWhitespace = (value) => is.empty(value) || isWhiteSpaceString(value);
+    const predicateOnArray = (method, predicate, args) => {
+        const values = Array.prototype.slice.call(args, 1);
+        if (is.function_(predicate) === false) {
+            throw new TypeError(`Invalid predicate: ${util.inspect(predicate)}`);
+        }
+        if (values.length === 0) {
+            throw new TypeError('Invalid number of values');
+        }
+        return method.call(values, predicate);
+    };
+    function any(predicate) {
+        return predicateOnArray(Array.prototype.some, predicate, arguments);
+    }
+    is.any = any;
+    function all(predicate) {
+        return predicateOnArray(Array.prototype.every, predicate, arguments);
+    }
+    is.all = all;
+})(is || (is = {}));
+Object.defineProperties(is, {
+    class: {
+        value: is.class_
+    },
+    function: {
+        value: is.function_
+    },
+    null: {
+        value: is.null_
+    }
+});
+exports.default = is;
+//# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/advancedcontentfilter/vendor/npm-asset/sindresorhus--is/dist/source/index.js.map b/advancedcontentfilter/vendor/npm-asset/sindresorhus--is/dist/source/index.js.map
new file mode 100644 (file)
index 0000000..5cb0e0c
--- /dev/null
@@ -0,0 +1 @@
+{"version":3,"file":"index.js","sourceRoot":"","sources":["../../source/index.ts"],"names":[],"mappings":";;AAAA,6BAA6B;AAE7B,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC;AAC3C,MAAM,aAAa,GAAG,CAAC,KAAU,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAW,CAAC;AAClF,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,KAAU,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,IAAI,CAAC;AACzE,MAAM,cAAc,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,KAAU,EAAE,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC;AAEvF,YAAY,KAAU;IACrB,EAAE,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC;QACpB,MAAM,CAAC,MAAM,CAAC;IACf,CAAC;IAED,EAAE,CAAC,CAAC,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC;QACvC,MAAM,CAAC,SAAS,CAAC;IAClB,CAAC;IAED,MAAM,IAAI,GAAG,OAAO,KAAK,CAAC;IAE1B,EAAE,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC;QAC1B,MAAM,CAAC,WAAW,CAAC;IACpB,CAAC;IAED,EAAE,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC;QACvB,MAAM,CAAC,QAAQ,CAAC;IACjB,CAAC;IAED,EAAE,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC;QACvB,MAAM,CAAC,QAAQ,CAAC;IACjB,CAAC;IAED,EAAE,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC;QACvB,MAAM,CAAC,QAAQ,CAAC;IACjB,CAAC;IAED,EAAE,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACzB,MAAM,CAAC,UAAU,CAAC;IACnB,CAAC;IAED,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC1B,MAAM,CAAC,OAAO,CAAC;IAChB,CAAC;IAED,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC5B,MAAM,CAAC,QAAQ,CAAC;IACjB,CAAC;IAED,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IACrC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;QACb,MAAM,CAAC,OAAO,CAAC;IAChB,CAAC;IAED,EAAE,CAAC,CAAC,KAAK,YAAY,MAAM,IAAI,KAAK,YAAY,OAAO,IAAI,KAAK,YAAY,MAAM,CAAC,CAAC,CAAC;QACpF,MAAM,IAAI,SAAS,CAAC,uDAAuD,CAAC,CAAC;IAC9E,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC;AACjB,CAAC;AAED,WAAU,EAAE;IACX,MAAM,QAAQ,GAAG,CAAC,KAAU,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC;IAG9C,YAAS,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC;IAClC,SAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC5B,SAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC5B,YAAS,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;IACjC,QAAK,GAAG,CAAC,KAAU,EAAE,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC;IAEvC,SAAM,GAAG,CAAC,KAAU,EAAE,EAAE,CAAC,GAAA,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IACnF,UAAO,GAAG,CAAC,KAAU,EAAE,EAAE,CAAC,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,KAAK,CAAC;IAG5D,SAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAE5B,QAAK,GAAG,KAAK,CAAC,OAAO,CAAC;IACtB,SAAM,GAAG,MAAM,CAAC,QAAQ,CAAC;IAEzB,kBAAe,GAAG,CAAC,KAAU,EAAE,EAAE,CAAC,GAAA,KAAK,CAAC,KAAK,CAAC,IAAI,GAAA,SAAS,CAAC,KAAK,CAAC,CAAC;IACnE,SAAM,GAAG,CAAC,KAAU,EAAE,EAAE,CAAC,CAAC,GAAA,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,GAAA,SAAS,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IAC1F,WAAQ,GAAG,CAAC,KAAU,EAAE,EAAE,CAAC,CAAC,GAAA,eAAe,CAAC,KAAK,CAAC,IAAI,GAAA,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;IACxF,YAAS,GAAG,CAAC,KAAU,EAAE,EAAE,CAAC,GAAA,QAAQ,CAAC,KAAK,CAAC,IAAI,GAAA,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,GAAA,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAE/F,gBAAa,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;IAEvD,MAAM,aAAa,GAAG,CAAC,KAAU,EAAE,EAAE,CACpC,CAAC,GAAA,KAAK,CAAC,KAAK,CAAC;QACb,QAAQ,CAAC,KAAK,CAAC;QACf,GAAA,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC;QACrB,GAAA,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAEX,UAAO,GAAG,CAAC,KAAU,EAAE,EAAE,CAAC,GAAA,aAAa,CAAC,KAAK,CAAC,IAAI,aAAa,CAAC,KAAK,CAAC,CAAC;IAGpF,MAAM,gBAAgB,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,KAAU,EAAE,EAAE,CAAC,GAAA,SAAS,CAAC,KAAK,CAAC,IAAI,GAAA,SAAS,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,WAAW,CAAC,IAAI,KAAK,IAAI,CAAC;IAElI,oBAAiB,GAAG,gBAAgB,CAAC,mBAAmB,CAAC,CAAC;IAC1D,gBAAa,GAAG,gBAAgB,CAAC,eAAe,CAAC,CAAC;IAElD,SAAM,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IAClC,OAAI,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IAC9B,QAAK,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IAChC,MAAG,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IAC5B,MAAG,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IAC5B,UAAO,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;IACpC,UAAO,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;IAEpC,YAAS,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;IACxC,aAAU,GAAG,cAAc,CAAC,YAAY,CAAC,CAAC;IAC1C,oBAAiB,GAAG,cAAc,CAAC,mBAAmB,CAAC,CAAC;IACxD,aAAU,GAAG,cAAc,CAAC,YAAY,CAAC,CAAC;IAC1C,cAAW,GAAG,cAAc,CAAC,aAAa,CAAC,CAAC;IAC5C,aAAU,GAAG,cAAc,CAAC,YAAY,CAAC,CAAC;IAC1C,cAAW,GAAG,cAAc,CAAC,aAAa,CAAC,CAAC;IAC5C,eAAY,GAAG,cAAc,CAAC,cAAc,CAAC,CAAC;IAC9C,eAAY,GAAG,cAAc,CAAC,cAAc,CAAC,CAAC;IAE9C,cAAW,GAAG,cAAc,CAAC,aAAa,CAAC,CAAC;IAC5C,oBAAiB,GAAG,cAAc,CAAC,mBAAmB,CAAC,CAAC;IAExD,SAAM,GAAG,CAAC,KAAU,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACxC,QAAK,GAAG,CAAC,KAAU,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC;IAE/B,MAAG,GAAG,CAAC,KAAU,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAEvD,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC;QAC9B,WAAW;QACX,QAAQ;QACR,QAAQ;QACR,SAAS;QACT,QAAQ;KACR,CAAC,CAAC;IAEU,YAAS,GAAG,CAAC,KAAU,EAAE,EAAE,CAAC,GAAA,KAAK,CAAC,KAAK,CAAC,IAAI,cAAc,CAAC,GAAG,CAAC,OAAO,KAAK,CAAC,CAAC;IAE7E,UAAO,GAAG,CAAC,KAAU,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAClD,cAAW,GAAG,CAAC,KAAU,EAAE,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAE1D,cAAW,GAAG,CAAC,KAAU,EAAE,EAAE;QAEzC,IAAI,SAAS,CAAC;QAEd,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,QAAQ;YACvC,CAAC,SAAS,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,SAAS,KAAK,IAAI;gBAC5D,SAAS,KAAK,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5C,CAAC,CAAC;IAEF,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC;QAC/B,WAAW;QACX,YAAY;QACZ,mBAAmB;QACnB,YAAY;QACZ,aAAa;QACb,YAAY;QACZ,aAAa;QACb,cAAc;QACd,cAAc;KACd,CAAC,CAAC;IACU,aAAU,GAAG,CAAC,KAAU,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;IAEpF,MAAM,aAAa,GAAG,CAAC,KAAU,EAAE,EAAE,CAAC,GAAA,WAAW,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC;IAC1D,YAAS,GAAG,CAAC,KAAU,EAAE,EAAE,CAAC,CAAC,GAAA,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,GAAA,SAAS,CAAC,KAAK,CAAC,IAAI,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAExG,UAAO,GAAG,CAAC,KAAa,EAAE,KAAwB,EAAE,EAAE;QAClE,EAAE,CAAC,CAAC,GAAA,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACnB,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAe,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,KAAe,EAAE,CAAC,CAAC,CAAC;QACvF,CAAC;QAED,EAAE,CAAC,CAAC,GAAA,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC;YAExC,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACrF,CAAC;QAED,MAAM,IAAI,SAAS,CAAC,kBAAkB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC9D,CAAC,CAAC;IAEF,MAAM,iBAAiB,GAAG,CAAC,CAAC;IAC5B,MAAM,uBAAuB,GAAG;QAC/B,WAAW;QACX,eAAe;QACf,OAAO;QACP,YAAY;QACZ,WAAW;KACX,CAAC;IAEW,aAAU,GAAG,CAAC,KAAU,EAAE,EAAE,CAAC,GAAA,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,KAAK,iBAAiB,IAAI,GAAA,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC;QACxH,CAAC,GAAA,WAAW,CAAC,KAAK,CAAC,IAAI,uBAAuB,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,CAAC;IAExE,WAAQ,GAAG,CAAC,KAAU,EAAE,EAAE,CAAC,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,CAAC,QAAQ,CAAC;IAElF,MAAM,cAAc,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,CAAC,GAAW,EAAE,EAAE,CAAC,GAAA,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,KAAK,CAAC;IAC1F,OAAI,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;IACzB,MAAG,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;IAErC,MAAM,kBAAkB,GAAG,CAAC,KAAU,EAAE,EAAE,CAAC,GAAA,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC;IACvF,MAAM,oBAAoB,GAAG,CAAC,KAAU,EAAE,EAAE,CAAC,CAAC,GAAA,MAAM,CAAC,KAAK,CAAC,IAAI,GAAA,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC;IACnG,MAAM,aAAa,GAAG,CAAC,KAAU,EAAE,EAAE,CAAC,CAAC,GAAA,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAA,GAAG,CAAC,KAAK,CAAC,IAAI,GAAA,MAAM,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;IACrH,MAAM,eAAe,GAAG,CAAC,KAAU,EAAE,EAAE,CAAC,CAAC,GAAA,GAAG,CAAC,KAAK,CAAC,IAAI,GAAA,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC;IAE1E,QAAK,GAAG,CAAC,KAAU,EAAE,EAAE,CAAC,GAAA,KAAK,CAAC,KAAK,CAAC,IAAI,oBAAoB,CAAC,KAAK,CAAC,IAAI,aAAa,CAAC,KAAK,CAAC,IAAI,eAAe,CAAC,KAAK,CAAC,CAAC;IACtH,oBAAiB,GAAG,CAAC,KAAU,EAAE,EAAE,CAAC,GAAA,KAAK,CAAC,KAAK,CAAC,IAAI,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAG3F,MAAM,gBAAgB,GAAG,CAAC,MAAmB,EAAE,SAAc,EAAE,IAAgB,EAAE,EAAE;QAIlF,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAEnD,EAAE,CAAC,CAAC,GAAA,SAAS,CAAC,SAAS,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC;YACpC,MAAM,IAAI,SAAS,CAAC,sBAAsB,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QACtE,CAAC;QAED,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC;YACzB,MAAM,IAAI,SAAS,CAAC,0BAA0B,CAAC,CAAC;QACjD,CAAC;QAED,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACvC,CAAC,CAAC;IAMF,aAAoB,SAAc;QACjC,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;IACrE,CAAC;IAFe,MAAG,MAElB,CAAA;IAGD,aAAoB,SAAc;QACjC,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;IACtE,CAAC;IAFe,MAAG,MAElB,CAAA;AAEF,CAAC,EA9KS,EAAE,KAAF,EAAE,QA8KX;AAID,MAAM,CAAC,gBAAgB,CAAC,EAAE,EAAE;IAC3B,KAAK,EAAE;QACN,KAAK,EAAE,EAAE,CAAC,MAAM;KAChB;IACD,QAAQ,EAAE;QACT,KAAK,EAAE,EAAE,CAAC,SAAS;KACnB;IACD,IAAI,EAAE;QACL,KAAK,EAAE,EAAE,CAAC,KAAK;KACf;CACD,CAAC,CAAC;AAEH,kBAAe,EAAE,CAAC"}
\ No newline at end of file
diff --git a/advancedcontentfilter/vendor/npm-asset/sindresorhus--is/dist/source/tests/test.d.ts b/advancedcontentfilter/vendor/npm-asset/sindresorhus--is/dist/source/tests/test.d.ts
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/advancedcontentfilter/vendor/npm-asset/sindresorhus--is/dist/source/tests/test.js b/advancedcontentfilter/vendor/npm-asset/sindresorhus--is/dist/source/tests/test.js
new file mode 100644 (file)
index 0000000..7a35b4d
--- /dev/null
@@ -0,0 +1,622 @@
+"use strict";
+var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
+    return new (P || (P = Promise))(function (resolve, reject) {
+        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+        function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
+        step((generator = generator.apply(thisArg, _arguments || [])).next());
+    });
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const util = require("util");
+const ava_1 = require("ava");
+const jsdom_1 = require("jsdom");
+const __1 = require("..");
+const isNode8orHigher = Number(process.versions.node.split('.')[0]) >= 8;
+class ErrorSubclassFixture extends Error {
+}
+const document = jsdom_1.jsdom();
+const createDomElement = (el) => document.createElement(el);
+const types = new Map([
+    ['undefined', {
+            is: __1.default.undefined,
+            fixtures: [
+                undefined
+            ]
+        }],
+    ['null', {
+            is: __1.default.null_,
+            fixtures: [
+                null
+            ]
+        }],
+    ['string', {
+            is: __1.default.string,
+            fixtures: [
+                '🦄',
+                'hello world',
+                ''
+            ]
+        }],
+    ['number', {
+            is: __1.default.number,
+            fixtures: [
+                6,
+                1.4,
+                0,
+                -0,
+                Infinity,
+                -Infinity
+            ]
+        }],
+    ['boolean', {
+            is: __1.default.boolean,
+            fixtures: [
+                true, false
+            ]
+        }],
+    ['symbol', {
+            is: __1.default.symbol,
+            fixtures: [
+                Symbol('🦄')
+            ]
+        }],
+    ['array', {
+            is: __1.default.array,
+            fixtures: [
+                [1, 2],
+                new Array(2)
+            ]
+        }],
+    ['function', {
+            is: __1.default.function_,
+            fixtures: [
+                function foo() { },
+                function () { },
+                () => { },
+                function () {
+                    return __awaiter(this, void 0, void 0, function* () { });
+                },
+                function* () { }
+            ]
+        }],
+    ['buffer', {
+            is: __1.default.buffer,
+            fixtures: [
+                Buffer.from('🦄')
+            ]
+        }],
+    ['object', {
+            is: __1.default.object,
+            fixtures: [
+                { x: 1 },
+                Object.create({ x: 1 })
+            ]
+        }],
+    ['regExp', {
+            is: __1.default.regExp,
+            fixtures: [
+                /\w/,
+                new RegExp('\\w')
+            ]
+        }],
+    ['date', {
+            is: __1.default.date,
+            fixtures: [
+                new Date()
+            ]
+        }],
+    ['error', {
+            is: __1.default.error,
+            fixtures: [
+                new Error('🦄'),
+                new ErrorSubclassFixture()
+            ]
+        }],
+    ['nativePromise', {
+            is: __1.default.nativePromise,
+            fixtures: [
+                Promise.resolve(),
+            ]
+        }],
+    ['promise', {
+            is: __1.default.promise,
+            fixtures: [
+                { then() { }, catch() { } }
+            ]
+        }],
+    ['generator', {
+            is: __1.default.generator,
+            fixtures: [
+                (function* () { yield 4; })()
+            ]
+        }],
+    ['generatorFunction', {
+            is: __1.default.generatorFunction,
+            fixtures: [
+                function* () { yield 4; }
+            ]
+        }],
+    ['asyncFunction', {
+            is: __1.default.asyncFunction,
+            fixtures: [
+                function () {
+                    return __awaiter(this, void 0, void 0, function* () { });
+                },
+                () => __awaiter(this, void 0, void 0, function* () { })
+            ]
+        }],
+    ['map', {
+            is: __1.default.map,
+            fixtures: [
+                new Map()
+            ]
+        }],
+    ['set', {
+            is: __1.default.set,
+            fixtures: [
+                new Set()
+            ]
+        }],
+    ['weakSet', {
+            is: __1.default.weakSet,
+            fixtures: [
+                new WeakSet()
+            ]
+        }],
+    ['weakMap', {
+            is: __1.default.weakMap,
+            fixtures: [
+                new WeakMap()
+            ]
+        }],
+    ['int8Array', {
+            is: __1.default.int8Array,
+            fixtures: [
+                new Int8Array(0)
+            ]
+        }],
+    ['uint8Array', {
+            is: __1.default.uint8Array,
+            fixtures: [
+                new Uint8Array(0)
+            ]
+        }],
+    ['uint8ClampedArray', {
+            is: __1.default.uint8ClampedArray,
+            fixtures: [
+                new Uint8ClampedArray(0)
+            ]
+        }],
+    ['int16Array', {
+            is: __1.default.int16Array,
+            fixtures: [
+                new Int16Array(0)
+            ]
+        }],
+    ['uint16Array', {
+            is: __1.default.uint16Array,
+            fixtures: [
+                new Uint16Array(0)
+            ]
+        }],
+    ['int32Array', {
+            is: __1.default.int32Array,
+            fixtures: [
+                new Int32Array(0)
+            ]
+        }],
+    ['uint32Array', {
+            is: __1.default.uint32Array,
+            fixtures: [
+                new Uint32Array(0)
+            ]
+        }],
+    ['float32Array', {
+            is: __1.default.float32Array,
+            fixtures: [
+                new Float32Array(0)
+            ]
+        }],
+    ['float64Array', {
+            is: __1.default.float64Array,
+            fixtures: [
+                new Float64Array(0)
+            ]
+        }],
+    ['arrayBuffer', {
+            is: __1.default.arrayBuffer,
+            fixtures: [
+                new ArrayBuffer(10)
+            ]
+        }],
+    ['nan', {
+            is: __1.default.nan,
+            fixtures: [
+                NaN,
+                Number.NaN
+            ]
+        }],
+    ['nullOrUndefined', {
+            is: __1.default.nullOrUndefined,
+            fixtures: [
+                null,
+                undefined
+            ]
+        }],
+    ['plainObject', {
+            is: __1.default.plainObject,
+            fixtures: [
+                { x: 1 },
+                Object.create(null),
+                new Object()
+            ]
+        }],
+    ['integer', {
+            is: __1.default.integer,
+            fixtures: [
+                6
+            ]
+        }],
+    ['safeInteger', {
+            is: __1.default.safeInteger,
+            fixtures: [
+                Math.pow(2, 53) - 1,
+                -Math.pow(2, 53) + 1
+            ]
+        }],
+    ['domElement', {
+            is: __1.default.domElement,
+            fixtures: [
+                'div',
+                'input',
+                'span',
+                'img',
+                'canvas',
+                'script'
+            ].map(createDomElement)
+        }
+    ], ['non-domElements', {
+            is: value => !__1.default.domElement(value),
+            fixtures: [
+                document.createTextNode('data'),
+                document.createProcessingInstruction('xml-stylesheet', 'href="mycss.css" type="text/css"'),
+                document.createComment('This is a comment'),
+                document,
+                document.implementation.createDocumentType('svg:svg', '-//W3C//DTD SVG 1.1//EN', 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'),
+                document.createDocumentFragment()
+            ]
+        }],
+    ['infinite', {
+            is: __1.default.infinite,
+            fixtures: [
+                Infinity,
+                -Infinity
+            ]
+        }]
+]);
+const testType = (t, type, exclude) => {
+    const testData = types.get(type);
+    if (testData === undefined) {
+        t.fail(`is.${type} not defined`);
+        return;
+    }
+    const { is } = testData;
+    for (const [key, { fixtures }] of types) {
+        if (exclude && exclude.indexOf(key) !== -1) {
+            continue;
+        }
+        const assert = key === type ? t.true.bind(t) : t.false.bind(t);
+        for (const fixture of fixtures) {
+            assert(is(fixture), `Value: ${util.inspect(fixture)}`);
+        }
+    }
+};
+ava_1.default('is', t => {
+    t.is(__1.default(null), 'null');
+    t.is(__1.default(undefined), 'undefined');
+});
+ava_1.default('is.undefined', t => {
+    testType(t, 'undefined', ['nullOrUndefined']);
+});
+ava_1.default('is.null', t => {
+    testType(t, 'null', ['nullOrUndefined']);
+});
+ava_1.default('is.string', t => {
+    testType(t, 'string');
+});
+ava_1.default('is.number', t => {
+    testType(t, 'number', ['nan', 'integer', 'safeInteger', 'infinite']);
+});
+ava_1.default('is.boolean', t => {
+    testType(t, 'boolean');
+});
+ava_1.default('is.symbol', t => {
+    testType(t, 'symbol');
+});
+ava_1.default('is.array', t => {
+    testType(t, 'array');
+});
+ava_1.default('is.function', t => {
+    testType(t, 'function', ['generatorFunction', 'asyncFunction']);
+});
+ava_1.default('is.buffer', t => {
+    testType(t, 'buffer');
+});
+ava_1.default('is.object', t => {
+    const testData = types.get('object');
+    if (testData === undefined) {
+        t.fail('is.object not defined');
+        return;
+    }
+    for (const el of testData.fixtures) {
+        t.true(__1.default.object(el));
+    }
+});
+ava_1.default('is.regExp', t => {
+    testType(t, 'regExp');
+});
+ava_1.default('is.date', t => {
+    testType(t, 'date');
+});
+ava_1.default('is.error', t => {
+    testType(t, 'error');
+});
+if (isNode8orHigher) {
+    ava_1.default('is.nativePromise', t => {
+        testType(t, 'nativePromise');
+    });
+    ava_1.default('is.promise', t => {
+        testType(t, 'promise', ['nativePromise']);
+    });
+}
+ava_1.default('is.generator', t => {
+    testType(t, 'generator');
+});
+ava_1.default('is.generatorFunction', t => {
+    testType(t, 'generatorFunction', ['function']);
+});
+ava_1.default('is.map', t => {
+    testType(t, 'map');
+});
+ava_1.default('is.set', t => {
+    testType(t, 'set');
+});
+ava_1.default('is.weakMap', t => {
+    testType(t, 'weakMap');
+});
+ava_1.default('is.weakSet', t => {
+    testType(t, 'weakSet');
+});
+ava_1.default('is.int8Array', t => {
+    testType(t, 'int8Array');
+});
+ava_1.default('is.uint8Array', t => {
+    testType(t, 'uint8Array', ['buffer']);
+});
+ava_1.default('is.uint8ClampedArray', t => {
+    testType(t, 'uint8ClampedArray');
+});
+ava_1.default('is.int16Array', t => {
+    testType(t, 'int16Array');
+});
+ava_1.default('is.uint16Array', t => {
+    testType(t, 'uint16Array');
+});
+ava_1.default('is.int32Array', t => {
+    testType(t, 'int32Array');
+});
+ava_1.default('is.uint32Array', t => {
+    testType(t, 'uint32Array');
+});
+ava_1.default('is.float32Array', t => {
+    testType(t, 'float32Array');
+});
+ava_1.default('is.float64Array', t => {
+    testType(t, 'float64Array');
+});
+ava_1.default('is.arrayBuffer', t => {
+    testType(t, 'arrayBuffer');
+});
+ava_1.default('is.dataView', t => {
+    testType(t, 'arrayBuffer');
+});
+ava_1.default('is.truthy', t => {
+    t.true(__1.default.truthy('unicorn'));
+    t.true(__1.default.truthy('🦄'));
+    t.true(__1.default.truthy(new Set()));
+    t.true(__1.default.truthy(Symbol('🦄')));
+    t.true(__1.default.truthy(true));
+});
+ava_1.default('is.falsy', t => {
+    t.true(__1.default.falsy(false));
+    t.true(__1.default.falsy(0));
+    t.true(__1.default.falsy(''));
+    t.true(__1.default.falsy(null));
+    t.true(__1.default.falsy(undefined));
+    t.true(__1.default.falsy(NaN));
+});
+ava_1.default('is.nan', t => {
+    testType(t, 'nan');
+});
+ava_1.default('is.nullOrUndefined', t => {
+    testType(t, 'nullOrUndefined', ['undefined', 'null']);
+});
+ava_1.default('is.primitive', t => {
+    const primitives = [
+        undefined,
+        null,
+        '🦄',
+        6,
+        Infinity,
+        -Infinity,
+        true,
+        false,
+        Symbol('🦄')
+    ];
+    for (const el of primitives) {
+        t.true(__1.default.primitive(el));
+    }
+});
+ava_1.default('is.integer', t => {
+    testType(t, 'integer', ['number', 'safeInteger']);
+    t.false(__1.default.integer(1.4));
+});
+ava_1.default('is.safeInteger', t => {
+    testType(t, 'safeInteger', ['number', 'integer']);
+    t.false(__1.default.safeInteger(Math.pow(2, 53)));
+    t.false(__1.default.safeInteger(-Math.pow(2, 53)));
+});
+ava_1.default('is.plainObject', t => {
+    testType(t, 'plainObject', ['object', 'promise']);
+});
+ava_1.default('is.iterable', t => {
+    t.true(__1.default.iterable(''));
+    t.true(__1.default.iterable([]));
+    t.true(__1.default.iterable(new Map()));
+    t.false(__1.default.iterable(null));
+    t.false(__1.default.iterable(undefined));
+    t.false(__1.default.iterable(0));
+    t.false(__1.default.iterable(NaN));
+    t.false(__1.default.iterable(Infinity));
+    t.false(__1.default.iterable({}));
+});
+ava_1.default('is.class', t => {
+    class Foo {
+    }
+    const classDeclarations = [
+        Foo,
+        class Bar extends Foo {
+        }
+    ];
+    for (const x of classDeclarations) {
+        t.true(__1.default.class_(x));
+    }
+});
+ava_1.default('is.typedArray', t => {
+    const typedArrays = [
+        new Int8Array(0),
+        new Uint8Array(0),
+        new Uint8ClampedArray(0),
+        new Uint16Array(0),
+        new Int32Array(0),
+        new Uint32Array(0),
+        new Float32Array(0),
+        new Float64Array(0)
+    ];
+    for (const el of typedArrays) {
+        t.true(__1.default.typedArray(el));
+    }
+    t.false(__1.default.typedArray(new ArrayBuffer(1)));
+    t.false(__1.default.typedArray([]));
+    t.false(__1.default.typedArray({}));
+});
+ava_1.default('is.arrayLike', t => {
+    (() => {
+        t.true(__1.default.arrayLike(arguments));
+    })();
+    t.true(__1.default.arrayLike([]));
+    t.true(__1.default.arrayLike('unicorn'));
+    t.false(__1.default.arrayLike({}));
+    t.false(__1.default.arrayLike(() => { }));
+    t.false(__1.default.arrayLike(new Map()));
+});
+ava_1.default('is.inRange', t => {
+    const x = 3;
+    t.true(__1.default.inRange(x, [0, 5]));
+    t.true(__1.default.inRange(x, [5, 0]));
+    t.true(__1.default.inRange(x, [-5, 5]));
+    t.true(__1.default.inRange(x, [5, -5]));
+    t.false(__1.default.inRange(x, [4, 8]));
+    t.true(__1.default.inRange(-7, [-5, -10]));
+    t.true(__1.default.inRange(-5, [-5, -10]));
+    t.true(__1.default.inRange(-10, [-5, -10]));
+    t.true(__1.default.inRange(x, 10));
+    t.true(__1.default.inRange(0, 0));
+    t.true(__1.default.inRange(-2, -3));
+    t.false(__1.default.inRange(x, 2));
+    t.false(__1.default.inRange(-3, -2));
+    t.throws(() => {
+        __1.default.inRange(0, []);
+    });
+    t.throws(() => {
+        __1.default.inRange(0, [5]);
+    });
+    t.throws(() => {
+        __1.default.inRange(0, [1, 2, 3]);
+    });
+});
+ava_1.default('is.domElement', t => {
+    testType(t, 'domElement');
+    t.false(__1.default.domElement({ nodeType: 1, nodeName: 'div' }));
+});
+ava_1.default('is.infinite', t => {
+    testType(t, 'infinite', ['number']);
+});
+ava_1.default('is.even', t => {
+    for (const el of [-6, 2, 4]) {
+        t.true(__1.default.even(el));
+    }
+    for (const el of [-3, 1, 5]) {
+        t.false(__1.default.even(el));
+    }
+});
+ava_1.default('is.odd', t => {
+    for (const el of [-5, 7, 13]) {
+        t.true(__1.default.odd(el));
+    }
+    for (const el of [-8, 8, 10]) {
+        t.false(__1.default.odd(el));
+    }
+});
+ava_1.default('is.empty', t => {
+    t.true(__1.default.empty(null));
+    t.true(__1.default.empty(undefined));
+    t.true(__1.default.empty(false));
+    t.false(__1.default.empty(true));
+    t.true(__1.default.empty(''));
+    t.false(__1.default.empty('🦄'));
+    t.true(__1.default.empty([]));
+    t.false(__1.default.empty(['🦄']));
+    t.true(__1.default.empty({}));
+    t.false(__1.default.empty({ unicorn: '🦄' }));
+    const tempMap = new Map();
+    t.true(__1.default.empty(tempMap));
+    tempMap.set('unicorn', '🦄');
+    t.false(__1.default.empty(tempMap));
+    const tempSet = new Set();
+    t.true(__1.default.empty(tempSet));
+    tempSet.add(1);
+    t.false(__1.default.empty(tempSet));
+});
+ava_1.default('is.emptyOrWhitespace', t => {
+    t.true(__1.default.emptyOrWhitespace(''));
+    t.true(__1.default.emptyOrWhitespace('  '));
+    t.false(__1.default.emptyOrWhitespace('🦄'));
+    t.false(__1.default.emptyOrWhitespace('unicorn'));
+});
+ava_1.default('is.any', t => {
+    t.true(__1.default.any(__1.default.string, {}, true, '🦄'));
+    t.true(__1.default.any(__1.default.object, false, {}, 'unicorns'));
+    t.false(__1.default.any(__1.default.boolean, '🦄', [], 3));
+    t.false(__1.default.any(__1.default.integer, true, 'lol', {}));
+    t.throws(() => {
+        __1.default.any(null, true);
+    });
+    t.throws(() => {
+        __1.default.any(__1.default.string);
+    });
+});
+ava_1.default('is.all', t => {
+    t.true(__1.default.all(__1.default.object, {}, new Set(), new Map()));
+    t.true(__1.default.all(__1.default.boolean, true, false));
+    t.false(__1.default.all(__1.default.string, '🦄', []));
+    t.false(__1.default.all(__1.default.set, new Map(), {}));
+    t.throws(() => {
+        __1.default.all(null, true);
+    });
+    t.throws(() => {
+        __1.default.all(__1.default.string);
+    });
+});
+//# sourceMappingURL=test.js.map
\ No newline at end of file
diff --git a/advancedcontentfilter/vendor/npm-asset/sindresorhus--is/dist/source/tests/test.js.map b/advancedcontentfilter/vendor/npm-asset/sindresorhus--is/dist/source/tests/test.js.map
new file mode 100644 (file)
index 0000000..ab9ec15
--- /dev/null
@@ -0,0 +1 @@
+{"version":3,"file":"test.js","sourceRoot":"","sources":["../../../source/tests/test.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,6BAA6B;AAC7B,6BAA+C;AAC/C,iCAA4B;AAC5B,0BAAmB;AAEnB,MAAM,eAAe,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AAKzE,0BAA2B,SAAQ,KAAK;CAAG;AAE3C,MAAM,QAAQ,GAAG,aAAK,EAAE,CAAC;AACzB,MAAM,gBAAgB,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;AAOpE,MAAM,KAAK,GAAG,IAAI,GAAG,CAAe;IACnC,CAAC,WAAW,EAAE;YACb,EAAE,EAAE,WAAC,CAAC,SAAS;YACf,QAAQ,EAAE;gBACT,SAAS;aACT;SACD,CAAC;IACF,CAAC,MAAM,EAAE;YACR,EAAE,EAAE,WAAC,CAAC,KAAK;YACX,QAAQ,EAAE;gBACT,IAAI;aACJ;SACD,CAAC;IACF,CAAC,QAAQ,EAAE;YACV,EAAE,EAAE,WAAC,CAAC,MAAM;YACZ,QAAQ,EAAE;gBACT,IAAI;gBACJ,aAAa;gBACb,EAAE;aACF;SACD,CAAC;IACF,CAAC,QAAQ,EAAE;YACV,EAAE,EAAE,WAAC,CAAC,MAAM;YACZ,QAAQ,EAAE;gBACT,CAAC;gBACD,GAAG;gBACH,CAAC;gBACD,CAAC,CAAC;gBACF,QAAQ;gBACR,CAAC,QAAQ;aACT;SACD,CAAC;IACF,CAAC,SAAS,EAAE;YACX,EAAE,EAAE,WAAC,CAAC,OAAO;YACb,QAAQ,EAAE;gBACT,IAAI,EAAE,KAAK;aACX;SACD,CAAC;IACF,CAAC,QAAQ,EAAE;YACV,EAAE,EAAE,WAAC,CAAC,MAAM;YACZ,QAAQ,EAAE;gBACT,MAAM,CAAC,IAAI,CAAC;aACZ;SACD,CAAC;IACF,CAAC,OAAO,EAAE;YACT,EAAE,EAAE,WAAC,CAAC,KAAK;YACX,QAAQ,EAAE;gBACT,CAAC,CAAC,EAAE,CAAC,CAAC;gBACN,IAAI,KAAK,CAAC,CAAC,CAAC;aACZ;SACD,CAAC;IACF,CAAC,UAAU,EAAE;YACZ,EAAE,EAAE,WAAC,CAAC,SAAS;YACf,QAAQ,EAAE;gBAET,iBAAgB,CAAC;gBACjB,cAAY,CAAC;gBACb,GAAG,EAAE,GAAE,CAAC;gBACR;0EAAkB,CAAC;iBAAA;gBACnB,QAAS,CAAC,MAAS,CAAC;aAEpB;SACD,CAAC;IACF,CAAC,QAAQ,EAAE;YACV,EAAE,EAAE,WAAC,CAAC,MAAM;YACZ,QAAQ,EAAE;gBACT,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;aACjB;SACD,CAAC;IACF,CAAC,QAAQ,EAAE;YACV,EAAE,EAAE,WAAC,CAAC,MAAM;YACZ,QAAQ,EAAE;gBACT,EAAC,CAAC,EAAE,CAAC,EAAC;gBACN,MAAM,CAAC,MAAM,CAAC,EAAC,CAAC,EAAE,CAAC,EAAC,CAAC;aACrB;SACD,CAAC;IACF,CAAC,QAAQ,EAAE;YACV,EAAE,EAAE,WAAC,CAAC,MAAM;YACZ,QAAQ,EAAE;gBACT,IAAI;gBACJ,IAAI,MAAM,CAAC,KAAK,CAAC;aACjB;SACD,CAAC;IACF,CAAC,MAAM,EAAE;YACR,EAAE,EAAE,WAAC,CAAC,IAAI;YACV,QAAQ,EAAE;gBACT,IAAI,IAAI,EAAE;aACV;SACD,CAAC;IACF,CAAC,OAAO,EAAE;YACT,EAAE,EAAE,WAAC,CAAC,KAAK;YACX,QAAQ,EAAE;gBACT,IAAI,KAAK,CAAC,IAAI,CAAC;gBACf,IAAI,oBAAoB,EAAE;aAC1B;SACD,CAAC;IACF,CAAC,eAAe,EAAE;YACjB,EAAE,EAAE,WAAC,CAAC,aAAa;YACnB,QAAQ,EAAE;gBACT,OAAO,CAAC,OAAO,EAAE;aAEjB;SACD,CAAC;IACF,CAAC,SAAS,EAAE;YACX,EAAE,EAAE,WAAC,CAAC,OAAO;YACb,QAAQ,EAAE;gBACT,EAAC,IAAI,KAAI,CAAC,EAAE,KAAK,KAAI,CAAC,EAAC;aACvB;SACD,CAAC;IACF,CAAC,WAAW,EAAE;YACb,EAAE,EAAE,WAAC,CAAC,SAAS;YACf,QAAQ,EAAE;gBACT,CAAC,QAAS,CAAC,MAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;aAC7B;SACD,CAAC;IACF,CAAC,mBAAmB,EAAE;YACrB,EAAE,EAAE,WAAC,CAAC,iBAAiB;YACvB,QAAQ,EAAE;gBACT,QAAS,CAAC,MAAK,MAAM,CAAC,CAAC,CAAC,CAAC;aACzB;SACD,CAAC;IACF,CAAC,eAAe,EAAE;YACjB,EAAE,EAAE,WAAC,CAAC,aAAa;YACnB,QAAQ,EAAE;gBACT;0EAAkB,CAAC;iBAAA;gBACnB,GAAS,EAAE,gDAAE,CAAC,CAAA;aACd;SACD,CAAC;IACF,CAAC,KAAK,EAAE;YACP,EAAE,EAAE,WAAC,CAAC,GAAG;YACT,QAAQ,EAAE;gBACT,IAAI,GAAG,EAAE;aACT;SACD,CAAC;IACF,CAAC,KAAK,EAAE;YACP,EAAE,EAAE,WAAC,CAAC,GAAG;YACT,QAAQ,EAAE;gBACT,IAAI,GAAG,EAAE;aACT;SACD,CAAC;IACF,CAAC,SAAS,EAAE;YACX,EAAE,EAAE,WAAC,CAAC,OAAO;YACb,QAAQ,EAAE;gBACT,IAAI,OAAO,EAAE;aACb;SACD,CAAC;IACF,CAAC,SAAS,EAAE;YACX,EAAE,EAAE,WAAC,CAAC,OAAO;YACb,QAAQ,EAAE;gBACT,IAAI,OAAO,EAAE;aACb;SACD,CAAC;IACF,CAAC,WAAW,EAAE;YACb,EAAE,EAAE,WAAC,CAAC,SAAS;YACf,QAAQ,EAAE;gBACT,IAAI,SAAS,CAAC,CAAC,CAAC;aAChB;SACD,CAAC;IACF,CAAC,YAAY,EAAE;YACd,EAAE,EAAE,WAAC,CAAC,UAAU;YAChB,QAAQ,EAAE;gBACT,IAAI,UAAU,CAAC,CAAC,CAAC;aACjB;SACD,CAAC;IACF,CAAC,mBAAmB,EAAE;YACrB,EAAE,EAAE,WAAC,CAAC,iBAAiB;YACvB,QAAQ,EAAE;gBACT,IAAI,iBAAiB,CAAC,CAAC,CAAC;aACxB;SACD,CAAC;IACF,CAAC,YAAY,EAAE;YACd,EAAE,EAAE,WAAC,CAAC,UAAU;YAChB,QAAQ,EAAE;gBACT,IAAI,UAAU,CAAC,CAAC,CAAC;aACjB;SACD,CAAC;IACF,CAAC,aAAa,EAAE;YACf,EAAE,EAAE,WAAC,CAAC,WAAW;YACjB,QAAQ,EAAE;gBACT,IAAI,WAAW,CAAC,CAAC,CAAC;aAClB;SACD,CAAC;IACF,CAAC,YAAY,EAAE;YACd,EAAE,EAAE,WAAC,CAAC,UAAU;YAChB,QAAQ,EAAE;gBACT,IAAI,UAAU,CAAC,CAAC,CAAC;aACjB;SACD,CAAC;IACF,CAAC,aAAa,EAAE;YACf,EAAE,EAAE,WAAC,CAAC,WAAW;YACjB,QAAQ,EAAE;gBACT,IAAI,WAAW,CAAC,CAAC,CAAC;aAClB;SACD,CAAC;IACF,CAAC,cAAc,EAAE;YAChB,EAAE,EAAE,WAAC,CAAC,YAAY;YAClB,QAAQ,EAAE;gBACT,IAAI,YAAY,CAAC,CAAC,CAAC;aACnB;SACD,CAAC;IACF,CAAC,cAAc,EAAE;YAChB,EAAE,EAAE,WAAC,CAAC,YAAY;YAClB,QAAQ,EAAE;gBACT,IAAI,YAAY,CAAC,CAAC,CAAC;aACnB;SACD,CAAC;IACF,CAAC,aAAa,EAAE;YACf,EAAE,EAAE,WAAC,CAAC,WAAW;YACjB,QAAQ,EAAE;gBACT,IAAI,WAAW,CAAC,EAAE,CAAC;aACnB;SACD,CAAC;IACF,CAAC,KAAK,EAAE;YACP,EAAE,EAAE,WAAC,CAAC,GAAG;YACT,QAAQ,EAAE;gBACT,GAAG;gBACH,MAAM,CAAC,GAAG;aACV;SACD,CAAC;IACF,CAAC,iBAAiB,EAAE;YACnB,EAAE,EAAE,WAAC,CAAC,eAAe;YACrB,QAAQ,EAAE;gBACT,IAAI;gBACJ,SAAS;aACT;SACD,CAAC;IACF,CAAC,aAAa,EAAE;YACf,EAAE,EAAE,WAAC,CAAC,WAAW;YACjB,QAAQ,EAAE;gBACT,EAAC,CAAC,EAAE,CAAC,EAAC;gBACN,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;gBACnB,IAAI,MAAM,EAAE;aACZ;SACD,CAAC;IACF,CAAC,SAAS,EAAE;YACX,EAAE,EAAE,WAAC,CAAC,OAAO;YACb,QAAQ,EAAE;gBACT,CAAC;aACD;SACD,CAAC;IACF,CAAC,aAAa,EAAE;YACf,EAAE,EAAE,WAAC,CAAC,WAAW;YACjB,QAAQ,EAAE;gBACT,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC;gBACnB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC;aACpB;SACD,CAAC;IACF,CAAC,YAAY,EAAE;YACd,EAAE,EAAE,WAAC,CAAC,UAAU;YAChB,QAAQ,EAAE;gBACT,KAAK;gBACL,OAAO;gBACP,MAAM;gBACN,KAAK;gBACL,QAAQ;gBACR,QAAQ;aACR,CAAC,GAAG,CAAC,gBAAgB,CAAC;SAAE;KACzB,EAAE,CAAC,iBAAiB,EAAE;YACtB,EAAE,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,WAAC,CAAC,UAAU,CAAC,KAAK,CAAC;YACjC,QAAQ,EAAE;gBACT,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC;gBAC/B,QAAQ,CAAC,2BAA2B,CAAC,gBAAgB,EAAE,kCAAkC,CAAC;gBAC1F,QAAQ,CAAC,aAAa,CAAC,mBAAmB,CAAC;gBAC3C,QAAQ;gBACR,QAAQ,CAAC,cAAc,CAAC,kBAAkB,CAAC,SAAS,EAAE,yBAAyB,EAAE,kDAAkD,CAAC;gBACpI,QAAQ,CAAC,sBAAsB,EAAE;aACjC;SACD,CAAC;IACF,CAAC,UAAU,EAAE;YACZ,EAAE,EAAG,WAAC,CAAC,QAAQ;YACf,QAAQ,EAAE;gBACT,QAAQ;gBACR,CAAC,QAAQ;aACT;SACD,CAAC;CACF,CAAC,CAAC;AAGH,MAAM,QAAQ,GAAG,CAAC,CAA6B,EAAE,IAAY,EAAE,OAAkB,EAAE,EAAE;IACpF,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAEjC,EAAE,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC;QAC5B,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI,cAAc,CAAC,CAAC;QAEjC,MAAM,CAAC;IACR,CAAC;IAED,MAAM,EAAC,EAAE,EAAC,GAAG,QAAQ,CAAC;IAEtB,GAAG,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE,EAAC,QAAQ,EAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC;QAGvC,EAAE,CAAC,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5C,QAAQ,CAAC;QACV,CAAC;QAED,MAAM,MAAM,GAAG,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAE/D,GAAG,CAAC,CAAC,MAAM,OAAO,IAAI,QAAQ,CAAC,CAAC,CAAC;YAChC,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,UAAU,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACxD,CAAC;IACF,CAAC;AACF,CAAC,CAAC;AAEF,aAAI,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE;IACd,CAAC,CAAC,EAAE,CAAC,WAAC,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;IACtB,CAAC,CAAC,EAAE,CAAC,WAAC,CAAC,SAAS,CAAC,EAAE,WAAW,CAAC,CAAC;AAGjC,CAAC,CAAC,CAAC;AAEH,aAAI,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE;IACxB,QAAQ,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC;AAC/C,CAAC,CAAC,CAAC;AAEH,aAAI,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC;AAC1C,CAAC,CAAC,CAAC;AAEH,aAAI,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE;IACrB,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;AACvB,CAAC,CAAC,CAAC;AAEH,aAAI,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE;IACrB,QAAQ,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,UAAU,CAAC,CAAC,CAAC;AACtE,CAAC,CAAC,CAAC;AAEH,aAAI,CAAC,YAAY,EAAE,CAAC,CAAC,EAAE;IACtB,QAAQ,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;AACxB,CAAC,CAAC,CAAC;AAEH,aAAI,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE;IACrB,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;AACvB,CAAC,CAAC,CAAC;AAEH,aAAI,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE;IACpB,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACtB,CAAC,CAAC,CAAC;AAEH,aAAI,CAAC,aAAa,EAAE,CAAC,CAAC,EAAE;IACvB,QAAQ,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,mBAAmB,EAAE,eAAe,CAAC,CAAC,CAAC;AACjE,CAAC,CAAC,CAAC;AAEH,aAAI,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE;IACrB,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;AACvB,CAAC,CAAC,CAAC;AAEH,aAAI,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE;IACrB,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAErC,EAAE,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC;QAC5B,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QAEhC,MAAM,CAAC;IACR,CAAC;IAED,GAAG,CAAC,CAAC,MAAM,EAAE,IAAI,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;QACpC,CAAC,CAAC,IAAI,CAAC,WAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IACtB,CAAC;AACF,CAAC,CAAC,CAAC;AAEH,aAAI,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE;IACrB,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;AACvB,CAAC,CAAC,CAAC;AAEH,aAAI,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;AACrB,CAAC,CAAC,CAAC;AAEH,aAAI,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE;IACpB,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACtB,CAAC,CAAC,CAAC;AAEH,EAAE,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC;IACrB,aAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC,EAAE;QAC5B,QAAQ,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,aAAI,CAAC,YAAY,EAAE,CAAC,CAAC,EAAE;QACtB,QAAQ,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;AAKJ,CAAC;AAED,aAAI,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE;IACxB,QAAQ,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;AAC1B,CAAC,CAAC,CAAC;AAEH,aAAI,CAAC,sBAAsB,EAAE,CAAC,CAAC,EAAE;IAChC,QAAQ,CAAC,CAAC,EAAE,mBAAmB,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;AAChD,CAAC,CAAC,CAAC;AAEH,aAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE;IAClB,QAAQ,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;AACpB,CAAC,CAAC,CAAC;AAEH,aAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE;IAClB,QAAQ,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;AACpB,CAAC,CAAC,CAAC;AAEH,aAAI,CAAC,YAAY,EAAE,CAAC,CAAC,EAAE;IACtB,QAAQ,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;AACxB,CAAC,CAAC,CAAC;AAEH,aAAI,CAAC,YAAY,EAAE,CAAC,CAAC,EAAE;IACtB,QAAQ,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;AACxB,CAAC,CAAC,CAAC;AAEH,aAAI,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE;IACxB,QAAQ,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;AAC1B,CAAC,CAAC,CAAC;AAEH,aAAI,CAAC,eAAe,EAAE,CAAC,CAAC,EAAE;IACzB,QAAQ,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;AACvC,CAAC,CAAC,CAAC;AAEH,aAAI,CAAC,sBAAsB,EAAE,CAAC,CAAC,EAAE;IAChC,QAAQ,CAAC,CAAC,EAAE,mBAAmB,CAAC,CAAC;AAClC,CAAC,CAAC,CAAC;AAEH,aAAI,CAAC,eAAe,EAAE,CAAC,CAAC,EAAE;IACzB,QAAQ,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;AAC3B,CAAC,CAAC,CAAC;AAEH,aAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC,EAAE;IAC1B,QAAQ,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC;AAC5B,CAAC,CAAC,CAAC;AAEH,aAAI,CAAC,eAAe,EAAE,CAAC,CAAC,EAAE;IACzB,QAAQ,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;AAC3B,CAAC,CAAC,CAAC;AAEH,aAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC,EAAE;IAC1B,QAAQ,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC;AAC5B,CAAC,CAAC,CAAC;AAEH,aAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC,EAAE;IAC3B,QAAQ,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;AAC7B,CAAC,CAAC,CAAC;AAEH,aAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC,EAAE;IAC3B,QAAQ,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;AAC7B,CAAC,CAAC,CAAC;AAEH,aAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC,EAAE;IAC1B,QAAQ,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC;AAC5B,CAAC,CAAC,CAAC;AAEH,aAAI,CAAC,aAAa,EAAE,CAAC,CAAC,EAAE;IACvB,QAAQ,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC;AAC5B,CAAC,CAAC,CAAC;AAEH,aAAI,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE;IACrB,CAAC,CAAC,IAAI,CAAC,WAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;IAC5B,CAAC,CAAC,IAAI,CAAC,WAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IACvB,CAAC,CAAC,IAAI,CAAC,WAAC,CAAC,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC;IAC5B,CAAC,CAAC,IAAI,CAAC,WAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC/B,CAAC,CAAC,IAAI,CAAC,WAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;AACxB,CAAC,CAAC,CAAC;AAEH,aAAI,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE;IACpB,CAAC,CAAC,IAAI,CAAC,WAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IACvB,CAAC,CAAC,IAAI,CAAC,WAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACnB,CAAC,CAAC,IAAI,CAAC,WAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;IACpB,CAAC,CAAC,IAAI,CAAC,WAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IACtB,CAAC,CAAC,IAAI,CAAC,WAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;IAC3B,CAAC,CAAC,IAAI,CAAC,WAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;AACtB,CAAC,CAAC,CAAC;AAEH,aAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE;IAClB,QAAQ,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;AACpB,CAAC,CAAC,CAAC;AAEH,aAAI,CAAC,oBAAoB,EAAE,CAAC,CAAC,EAAE;IAC9B,QAAQ,CAAC,CAAC,EAAE,iBAAiB,EAAE,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;AACvD,CAAC,CAAC,CAAC;AAEH,aAAI,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE;IACxB,MAAM,UAAU,GAAG;QAClB,SAAS;QACT,IAAI;QACJ,IAAI;QACJ,CAAC;QACD,QAAQ;QACR,CAAC,QAAQ;QACT,IAAI;QACJ,KAAK;QACL,MAAM,CAAC,IAAI,CAAC;KACZ,CAAC;IAEF,GAAG,CAAC,CAAC,MAAM,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC;QAC7B,CAAC,CAAC,IAAI,CAAC,WAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;IACzB,CAAC;AACF,CAAC,CAAC,CAAC;AAEH,aAAI,CAAC,YAAY,EAAE,CAAC,CAAC,EAAE;IACtB,QAAQ,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC;IAClD,CAAC,CAAC,KAAK,CAAC,WAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;AACzB,CAAC,CAAC,CAAC;AAEH,aAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC,EAAE;IAC1B,QAAQ,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;IAClD,CAAC,CAAC,KAAK,CAAC,WAAC,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC,CAAC,KAAK,CAAC,WAAC,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;AAC1C,CAAC,CAAC,CAAC;AAEH,aAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC,EAAE;IAC1B,QAAQ,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;AACnD,CAAC,CAAC,CAAC;AAEH,aAAI,CAAC,aAAa,EAAE,CAAC,CAAC,EAAE;IACvB,CAAC,CAAC,IAAI,CAAC,WAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;IACvB,CAAC,CAAC,IAAI,CAAC,WAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;IACvB,CAAC,CAAC,IAAI,CAAC,WAAC,CAAC,QAAQ,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC;IAC9B,CAAC,CAAC,KAAK,CAAC,WAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1B,CAAC,CAAC,KAAK,CAAC,WAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;IAC/B,CAAC,CAAC,KAAK,CAAC,WAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC,CAAC,KAAK,CAAC,WAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;IACzB,CAAC,CAAC,KAAK,CAAC,WAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC9B,CAAC,CAAC,KAAK,CAAC,WAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;AACzB,CAAC,CAAC,CAAC;AAEH,aAAI,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE;IACpB;KAAY;IACZ,MAAM,iBAAiB,GAAG;QACzB,GAAG;QACH,SAAU,SAAQ,GAAG;SAAG;KACxB,CAAC;IAEF,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,iBAAiB,CAAC,CAAC,CAAC;QACnC,CAAC,CAAC,IAAI,CAAC,WAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACrB,CAAC;AACF,CAAC,CAAC,CAAC;AAEH,aAAI,CAAC,eAAe,EAAE,CAAC,CAAC,EAAE;IAGzB,MAAM,WAAW,GAAG;QACnB,IAAI,SAAS,CAAC,CAAC,CAAC;QAChB,IAAI,UAAU,CAAC,CAAC,CAAC;QACjB,IAAI,iBAAiB,CAAC,CAAC,CAAC;QACxB,IAAI,WAAW,CAAC,CAAC,CAAC;QAClB,IAAI,UAAU,CAAC,CAAC,CAAC;QACjB,IAAI,WAAW,CAAC,CAAC,CAAC;QAClB,IAAI,YAAY,CAAC,CAAC,CAAC;QACnB,IAAI,YAAY,CAAC,CAAC,CAAC;KACnB,CAAC;IAEF,GAAG,CAAC,CAAC,MAAM,EAAE,IAAI,WAAW,CAAC,CAAC,CAAC;QAC9B,CAAC,CAAC,IAAI,CAAC,WAAC,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1B,CAAC;IAED,CAAC,CAAC,KAAK,CAAC,WAAC,CAAC,UAAU,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1C,CAAC,CAAC,KAAK,CAAC,WAAC,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1B,CAAC,CAAC,KAAK,CAAC,WAAC,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;AAC3B,CAAC,CAAC,CAAC;AAEH,aAAI,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE;IACxB,CAAC,GAAG,EAAE;QACL,CAAC,CAAC,IAAI,CAAC,WAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC;IAChC,CAAC,CAAC,EAAE,CAAC;IACL,CAAC,CAAC,IAAI,CAAC,WAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;IACxB,CAAC,CAAC,IAAI,CAAC,WAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC;IAE/B,CAAC,CAAC,KAAK,CAAC,WAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;IACzB,CAAC,CAAC,KAAK,CAAC,WAAC,CAAC,SAAS,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC,CAAC;IAC/B,CAAC,CAAC,KAAK,CAAC,WAAC,CAAC,SAAS,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC;AACjC,CAAC,CAAC,CAAC;AAEH,aAAI,CAAC,YAAY,EAAE,CAAC,CAAC,EAAE;IACtB,MAAM,CAAC,GAAG,CAAC,CAAC;IAEZ,CAAC,CAAC,IAAI,CAAC,WAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7B,CAAC,CAAC,IAAI,CAAC,WAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7B,CAAC,CAAC,IAAI,CAAC,WAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9B,CAAC,CAAC,IAAI,CAAC,WAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9B,CAAC,CAAC,KAAK,CAAC,WAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9B,CAAC,CAAC,IAAI,CAAC,WAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACjC,CAAC,CAAC,IAAI,CAAC,WAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACjC,CAAC,CAAC,IAAI,CAAC,WAAC,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAElC,CAAC,CAAC,IAAI,CAAC,WAAC,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IACzB,CAAC,CAAC,IAAI,CAAC,WAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC,CAAC,IAAI,CAAC,WAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1B,CAAC,CAAC,KAAK,CAAC,WAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACzB,CAAC,CAAC,KAAK,CAAC,WAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAE3B,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE;QACb,WAAC,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE;QACb,WAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACnB,CAAC,CAAC,CAAC;IAEH,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE;QACb,WAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACzB,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,aAAI,CAAC,eAAe,EAAE,CAAC,CAAC,EAAE;IACzB,QAAQ,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;IAC1B,CAAC,CAAC,KAAK,CAAC,WAAC,CAAC,UAAU,CAAC,EAAC,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAC,CAAC,CAAC,CAAC;AACvD,CAAC,CAAC,CAAC;AAEH,aAAI,CAAC,aAAa,EAAE,CAAC,CAAC,EAAE;IACvB,QAAQ,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;AACrC,CAAC,CAAC,CAAC;AAEH,aAAI,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE;IACnB,GAAG,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7B,CAAC,CAAC,IAAI,CAAC,WAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,GAAG,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7B,CAAC,CAAC,KAAK,CAAC,WAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IACrB,CAAC;AACF,CAAC,CAAC,CAAC;AAEH,aAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE;IAClB,GAAG,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9B,CAAC,CAAC,IAAI,CAAC,WAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IACnB,CAAC;IAED,GAAG,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9B,CAAC,CAAC,KAAK,CAAC,WAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IACpB,CAAC;AACF,CAAC,CAAC,CAAC;AAEH,aAAI,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE;IACpB,CAAC,CAAC,IAAI,CAAC,WAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IACtB,CAAC,CAAC,IAAI,CAAC,WAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;IAE3B,CAAC,CAAC,IAAI,CAAC,WAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IACvB,CAAC,CAAC,KAAK,CAAC,WAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IAEvB,CAAC,CAAC,IAAI,CAAC,WAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;IACpB,CAAC,CAAC,KAAK,CAAC,WAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IAEvB,CAAC,CAAC,IAAI,CAAC,WAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;IACpB,CAAC,CAAC,KAAK,CAAC,WAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAEzB,CAAC,CAAC,IAAI,CAAC,WAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;IACpB,CAAC,CAAC,KAAK,CAAC,WAAC,CAAC,KAAK,CAAC,EAAC,OAAO,EAAE,IAAI,EAAC,CAAC,CAAC,CAAC;IAElC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAE,CAAC;IAC1B,CAAC,CAAC,IAAI,CAAC,WAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IAEzB,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAC7B,CAAC,CAAC,KAAK,CAAC,WAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IAE1B,MAAM,OAAO,GAAG,IAAI,GAAG,EAAE,CAAC;IAC1B,CAAC,CAAC,IAAI,CAAC,WAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IAEzB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACf,CAAC,CAAC,KAAK,CAAC,WAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;AAC3B,CAAC,CAAC,CAAC;AAEH,aAAI,CAAC,sBAAsB,EAAE,CAAC,CAAC,EAAE;IAChC,CAAC,CAAC,IAAI,CAAC,WAAC,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC;IAChC,CAAC,CAAC,IAAI,CAAC,WAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC;IAClC,CAAC,CAAC,KAAK,CAAC,WAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC;IACnC,CAAC,CAAC,KAAK,CAAC,WAAC,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAAC;AACzC,CAAC,CAAC,CAAC;AAEH,aAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE;IAClB,CAAC,CAAC,IAAI,CAAC,WAAC,CAAC,GAAG,CAAC,WAAC,CAAC,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IACxC,CAAC,CAAC,IAAI,CAAC,WAAC,CAAC,GAAG,CAAC,WAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC;IAC/C,CAAC,CAAC,KAAK,CAAC,WAAC,CAAC,GAAG,CAAC,WAAC,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC,CAAC,KAAK,CAAC,WAAC,CAAC,GAAG,CAAC,WAAC,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;IAE3C,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE;QACb,WAAC,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACnB,CAAC,CAAC,CAAC;IAEH,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE;QACb,WAAC,CAAC,GAAG,CAAC,WAAC,CAAC,MAAM,CAAC,CAAC;IACjB,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,aAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE;IAClB,CAAC,CAAC,IAAI,CAAC,WAAC,CAAC,GAAG,CAAC,WAAC,CAAC,MAAM,EAAE,EAAE,EAAE,IAAI,GAAG,EAAE,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC;IAClD,CAAC,CAAC,IAAI,CAAC,WAAC,CAAC,GAAG,CAAC,WAAC,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;IACtC,CAAC,CAAC,KAAK,CAAC,WAAC,CAAC,GAAG,CAAC,WAAC,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;IACnC,CAAC,CAAC,KAAK,CAAC,WAAC,CAAC,GAAG,CAAC,WAAC,CAAC,GAAG,EAAE,IAAI,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IAErC,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE;QACb,WAAC,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACnB,CAAC,CAAC,CAAC;IAEH,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE;QACb,WAAC,CAAC,GAAG,CAAC,WAAC,CAAC,MAAM,CAAC,CAAC;IACjB,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC"}
\ No newline at end of file
diff --git a/advancedcontentfilter/vendor/npm-asset/sindresorhus--is/license b/advancedcontentfilter/vendor/npm-asset/sindresorhus--is/license
new file mode 100644 (file)
index 0000000..e7af2f7
--- /dev/null
@@ -0,0 +1,9 @@
+MIT License
+
+Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/advancedcontentfilter/vendor/npm-asset/sindresorhus--is/package.json b/advancedcontentfilter/vendor/npm-asset/sindresorhus--is/package.json
new file mode 100644 (file)
index 0000000..c4a3a24
--- /dev/null
@@ -0,0 +1,62 @@
+{
+       "name": "@sindresorhus/is",
+       "version": "0.7.0",
+       "description": "Type check values: `is.string('🦄') //=> true`",
+       "license": "MIT",
+       "repository": "sindresorhus/is",
+       "author": {
+               "name": "Sindre Sorhus",
+               "email": "sindresorhus@gmail.com",
+               "url": "sindresorhus.com"
+       },
+       "publishConfig": {
+               "access": "public"
+       },
+       "main": "dist/index.js",
+       "engines": {
+               "node": ">=4"
+       },
+       "scripts": {
+               "lint": "tslint --format stylish --project .",
+               "build": "tsc",
+               "test": "npm run lint && npm run build && ava dist/tests",
+               "prepublish": "npm run build && del dist/tests"
+       },
+       "files": [
+               "dist"
+       ],
+       "keywords": [
+               "type",
+               "types",
+               "is",
+               "check",
+               "checking",
+               "validate",
+               "validation",
+               "utility",
+               "util",
+               "typeof",
+               "instanceof",
+               "object",
+               "assert",
+               "assertion",
+               "test",
+               "kind",
+               "primitive",
+               "verify",
+               "compare"
+       ],
+       "devDependencies": {
+               "@types/jsdom": "^2.0.31",
+               "@types/node": "^8.0.47",
+               "@types/tempy": "^0.1.0",
+               "ava": "*",
+               "del-cli": "^1.1.0",
+               "jsdom": "^9.12.0",
+               "tempy": "^0.2.1",
+               "tslint": "^5.8.0",
+               "tslint-xo": "^0.3.0",
+               "typescript": "^2.6.1"
+       },
+       "types": "dist/index.d.ts"
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/sindresorhus--is/readme.md b/advancedcontentfilter/vendor/npm-asset/sindresorhus--is/readme.md
new file mode 100644 (file)
index 0000000..67fad06
--- /dev/null
@@ -0,0 +1,323 @@
+# is [![Build Status](https://travis-ci.org/sindresorhus/is.svg?branch=master)](https://travis-ci.org/sindresorhus/is)
+
+> Type check values: `is.string('🦄') //=> true`
+
+<img src="header.gif" width="182" align="right">
+
+
+## Install
+
+```
+$ npm install @sindresorhus/is
+```
+
+
+## Usage
+
+```js
+const is = require('@sindresorhus/is');
+
+is('🦄');
+//=> 'string'
+
+is(new Map());
+//=> 'Map'
+
+is.number(6);
+//=> true
+```
+
+
+## API
+
+### is(value)
+
+Returns the type of `value`.
+
+Primitives are lowercase and object types are camelcase.
+
+Example:
+
+- `'undefined'`
+- `'null'`
+- `'string'`
+- `'symbol'`
+- `'Array'`
+- `'Function'`
+- `'Object'`
+
+Note: It will throw if you try to feed it object-wrapped primitives, as that's a bad practice. For example `new String('foo')`.
+
+### is.{method}
+
+All the below methods accept a value and returns a boolean for whether the value is of the desired type.
+
+#### Primitives
+
+##### .undefined(value)
+##### .null(value)
+##### .string(value)
+##### .number(value)
+##### .boolean(value)
+##### .symbol(value)
+
+#### Built-in types
+
+##### .array(value)
+##### .function(value)
+##### .buffer(value)
+##### .object(value)
+
+Keep in mind that [functions are objects too](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions).
+
+##### .regExp(value)
+##### .date(value)
+##### .error(value)
+##### .nativePromise(value)
+##### .promise(value)
+
+Returns `true` for any object with a `.then()` and `.catch()` method. Prefer this one over `.nativePromise()` as you usually want to allow userland promise implementations too.
+
+##### .generator(value)
+
+Returns `true` for any object that implements its own `.next()` and `.throw()` methods and has a function definition for `Symbol.iterator`.
+
+##### .generatorFunction(value)
+
+##### .asyncFunction(value)
+
+Returns `true` for any `async` function that can be called with the `await` operator.
+
+```js
+is.asyncFunction(async () => {});
+// => true
+
+is.asyncFunction(() => {});
+// => false
+```
+
+##### .boundFunction(value)
+
+Returns `true` for any `bound` function.
+
+```js
+is.boundFunction(() => {});
+// => true
+
+is.boundFunction(function () {}.bind(null));
+// => true
+
+is.boundFunction(function () {});
+// => false
+```
+
+##### .map(value)
+##### .set(value)
+##### .weakMap(value)
+##### .weakSet(value)
+
+#### Typed arrays
+
+##### .int8Array(value)
+##### .uint8Array(value)
+##### .uint8ClampedArray(value)
+##### .int16Array(value)
+##### .uint16Array(value)
+##### .int32Array(value)
+##### .uint32Array(value)
+##### .float32Array(value)
+##### .float64Array(value)
+
+#### Structured data
+
+##### .arrayBuffer(value)
+##### .sharedArrayBuffer(value)
+##### .dataView(value)
+
+#### Miscellaneous
+
+##### .directInstanceOf(value, class)
+
+Returns `true` if `value` is a direct instance of `class`.
+
+```js
+is.directInstanceOf(new Error(), Error);
+//=> true
+
+class UnicornError extends Error {};
+
+is.directInstanceOf(new UnicornError(), Error);
+//=> false
+```
+
+##### .truthy(value)
+
+Returns `true` for all values that evaluate to true in a boolean context:
+
+```js
+is.truthy('🦄');
+//=> true
+
+is.truthy(undefined);
+//=> false
+```
+
+##### .falsy(value)
+
+Returns `true` if `value` is one of: `false`, `0`, `''`, `null`, `undefined`, `NaN`.
+
+##### .nan(value)
+##### .nullOrUndefined(value)
+##### .primitive(value)
+
+JavaScript primitives are as follows: `null`, `undefined`, `string`, `number`, `boolean`, `symbol`.
+
+##### .integer(value)
+
+##### .safeInteger(value)
+
+Returns `true` if `value` is a [safe integer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isSafeInteger).
+
+##### .plainObject(value)
+
+An object is plain if it's created by either `{}`, `new Object()`, or `Object.create(null)`.
+
+##### .iterable(value)
+##### .class(value)
+
+Returns `true` for instances created by a ES2015 class.
+
+##### .typedArray(value)
+
+##### .arrayLike(value)
+
+A `value` is array-like if it is not a function and has a `value.length` that is a safe integer greater than or equal to 0.
+
+```js
+is.arrayLike(document.forms);
+//=> true
+
+function () {
+    is.arrayLike(arguments);
+    //=> true
+}
+```
+
+##### .inRange(value, range)
+
+Check if `value` (number) is in the given `range`. The range is an array of two values, lower bound and upper bound, in no specific order.
+
+```js
+is.inRange(3, [0, 5]);
+is.inRange(3, [5, 0]);
+is.inRange(0, [-2, 2]);
+```
+
+##### .inRange(value, upperBound)
+
+Check if `value` (number) is in the range of `0` to `upperBound`.
+
+```js
+is.inRange(3, 10);
+```
+
+##### .domElement(value)
+
+Returns `true` if `value` is a DOM Element.
+
+##### .nodeStream(value)
+
+Returns `true` if `value` is a Node.js [stream](https://nodejs.org/api/stream.html).
+
+```js
+const fs = require('fs');
+is.nodeStream(fs.createReadStream('unicorn.png'));
+//=> true
+```
+
+##### .infinite(value)
+
+Check if `value` is `Infinity` or `-Infinity`.
+
+##### .even(value)
+
+Returns `true` if `value` is an even integer.
+
+##### .odd(value)
+
+Returns `true` if `value` is an odd integer.
+
+##### .empty(value)
+
+Returns `true` if `value` is falsy or an empty string, array, object, map, or set.
+
+##### .emptyOrWhitespace(value)
+
+Returns `true` if `is.empty(value)` or a string that is all whitespace.
+
+
+##### .any(predicate, ...values)
+
+Returns `true` if **any** of the input `values` returns true in the `predicate`:
+
+```js
+is.any(is.string, {}, true, '🦄');
+//=> true
+
+is.any(is.boolean, 'unicorns', [], new Map());
+//=> false
+```
+
+##### .all(predicate, ...values)
+
+Returns `true` if **all** of the input `values` returns true in the `predicate`:
+
+```js
+is.all(is.object, {}, new Map(), new Set());
+//=> true
+
+is.all(is.string, '🦄', [], 'unicorns');
+//=> false
+```
+
+## FAQ
+
+### Why yet another type checking module?
+
+There are hundreds of type checking modules on npm, unfortunately, I couldn't find any that fit my needs:
+
+- Includes both type methods and ability to get the type
+- Types of primitives returned as lowercase and object types as camelcase
+- Covers all built-ins
+- Unsurprising behavior
+- Well-maintained
+- Comprehensive test suite
+
+For the ones I found, pick 3 of these.
+
+The most common mistakes I noticed in these modules was using `instanceof` for type checking, forgetting that functions are objects, and omitting `symbol` as a primitive.
+
+
+## Related
+
+- [is-stream](https://github.com/sindresorhus/is-stream) - Check if something is a Node.js stream
+- [is-observable](https://github.com/sindresorhus/is-observable) - Check if a value is an Observable
+- [file-type](https://github.com/sindresorhus/file-type) - Detect the file type of a Buffer/Uint8Array
+- [is-ip](https://github.com/sindresorhus/is-ip) - Check if a string is an IP address
+- [is-array-sorted](https://github.com/sindresorhus/is-array-sorted) - Check if an Array is sorted
+- [is-error-constructor](https://github.com/sindresorhus/is-error-constructor) - Check if a value is an error constructor
+- [is-empty-iterable](https://github.com/sindresorhus/is-empty-iterable) - Check if an Iterable is empty
+- [is-blob](https://github.com/sindresorhus/is-blob) - Check if a value is a Blob - File-like object of immutable, raw data
+- [has-emoji](https://github.com/sindresorhus/has-emoji) - Check whether a string has any emoji
+
+
+## Created by
+
+- [Sindre Sorhus](https://github.com/sindresorhus)
+- [Giora Guttsait](https://github.com/gioragutt)
+- [Brandon Smith](https://github.com/brandon93s)
+
+
+## License
+
+MIT
diff --git a/advancedcontentfilter/vendor/npm-asset/sort-keys/index.js b/advancedcontentfilter/vendor/npm-asset/sort-keys/index.js
new file mode 100644 (file)
index 0000000..53489d7
--- /dev/null
@@ -0,0 +1,55 @@
+'use strict';
+const isPlainObj = require('is-plain-obj');
+
+module.exports = (obj, opts) => {
+       if (!isPlainObj(obj)) {
+               throw new TypeError('Expected a plain object');
+       }
+
+       opts = opts || {};
+
+       // DEPRECATED
+       if (typeof opts === 'function') {
+               throw new TypeError('Specify the compare function as an option instead');
+       }
+
+       const deep = opts.deep;
+       const seenInput = [];
+       const seenOutput = [];
+
+       const sortKeys = x => {
+               const seenIndex = seenInput.indexOf(x);
+
+               if (seenIndex !== -1) {
+                       return seenOutput[seenIndex];
+               }
+
+               const ret = {};
+               const keys = Object.keys(x).sort(opts.compare);
+
+               seenInput.push(x);
+               seenOutput.push(ret);
+
+               for (let i = 0; i < keys.length; i++) {
+                       const key = keys[i];
+                       const val = x[key];
+
+                       if (deep && Array.isArray(val)) {
+                               const retArr = [];
+
+                               for (let j = 0; j < val.length; j++) {
+                                       retArr[j] = isPlainObj(val[j]) ? sortKeys(val[j]) : val[j];
+                               }
+
+                               ret[key] = retArr;
+                               continue;
+                       }
+
+                       ret[key] = deep && isPlainObj(val) ? sortKeys(val) : val;
+               }
+
+               return ret;
+       };
+
+       return sortKeys(obj);
+};
diff --git a/advancedcontentfilter/vendor/npm-asset/sort-keys/license b/advancedcontentfilter/vendor/npm-asset/sort-keys/license
new file mode 100644 (file)
index 0000000..e7af2f7
--- /dev/null
@@ -0,0 +1,9 @@
+MIT License
+
+Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/advancedcontentfilter/vendor/npm-asset/sort-keys/package.json b/advancedcontentfilter/vendor/npm-asset/sort-keys/package.json
new file mode 100644 (file)
index 0000000..3da9c76
--- /dev/null
@@ -0,0 +1,40 @@
+{
+  "name": "sort-keys",
+  "version": "2.0.0",
+  "description": "Sort the keys of an object",
+  "license": "MIT",
+  "repository": "sindresorhus/sort-keys",
+  "author": {
+    "name": "Sindre Sorhus",
+    "email": "sindresorhus@gmail.com",
+    "url": "sindresorhus.com"
+  },
+  "engines": {
+    "node": ">=4"
+  },
+  "scripts": {
+    "test": "xo && ava"
+  },
+  "files": [
+    "index.js"
+  ],
+  "keywords": [
+    "sort",
+    "object",
+    "keys",
+    "obj",
+    "key",
+    "stable",
+    "deterministic",
+    "deep",
+    "recursive",
+    "recursively"
+  ],
+  "dependencies": {
+    "is-plain-obj": "^1.0.0"
+  },
+  "devDependencies": {
+    "ava": "*",
+    "xo": "*"
+  }
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/sort-keys/readme.md b/advancedcontentfilter/vendor/npm-asset/sort-keys/readme.md
new file mode 100644 (file)
index 0000000..a671ffb
--- /dev/null
@@ -0,0 +1,60 @@
+# sort-keys [![Build Status](https://travis-ci.org/sindresorhus/sort-keys.svg?branch=master)](https://travis-ci.org/sindresorhus/sort-keys)
+
+> Sort the keys of an object
+
+Useful to get a deterministically ordered object, as the order of keys can vary between engines.
+
+
+## Install
+
+```
+$ npm install --save sort-keys
+```
+
+
+## Usage
+
+```js
+const sortKeys = require('sort-keys');
+
+sortKeys({c: 0, a: 0, b: 0});
+//=> {a: 0, b: 0, c: 0}
+
+sortKeys({b: {b: 0, a: 0}, a: 0}, {deep: true});
+//=> {a: 0, b: {a: 0, b: 0}}
+
+sortKeys({c: 0, a: 0, b: 0}, {
+       compare: (a, b) => -a.localeCompare(b)
+});
+//=> {c: 0, b: 0, a: 0}
+```
+
+
+## API
+
+### sortKeys(input, [options])
+
+Returns a new object with sorted keys.
+
+#### input
+
+Type: `Object`
+
+#### options
+
+##### deep
+
+Type: `boolean`
+
+Recursively sort keys.
+
+##### compare
+
+Type: `Function`
+
+[Compare function.](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort)
+
+
+## License
+
+MIT © [Sindre Sorhus](https://sindresorhus.com)
diff --git a/advancedcontentfilter/vendor/npm-asset/strict-uri-encode/index.js b/advancedcontentfilter/vendor/npm-asset/strict-uri-encode/index.js
new file mode 100644 (file)
index 0000000..414de96
--- /dev/null
@@ -0,0 +1,6 @@
+'use strict';
+module.exports = function (str) {
+       return encodeURIComponent(str).replace(/[!'()*]/g, function (c) {
+               return '%' + c.charCodeAt(0).toString(16).toUpperCase();
+       });
+};
diff --git a/advancedcontentfilter/vendor/npm-asset/strict-uri-encode/license b/advancedcontentfilter/vendor/npm-asset/strict-uri-encode/license
new file mode 100644 (file)
index 0000000..e0e9158
--- /dev/null
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) Kevin Mårtensson <kevinmartensson@gmail.com> (github.com/kevva)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/advancedcontentfilter/vendor/npm-asset/strict-uri-encode/package.json b/advancedcontentfilter/vendor/npm-asset/strict-uri-encode/package.json
new file mode 100644 (file)
index 0000000..0028e1b
--- /dev/null
@@ -0,0 +1,30 @@
+{
+  "name": "strict-uri-encode",
+  "version": "1.1.0",
+  "description": "A stricter URI encode adhering to RFC 3986",
+  "license": "MIT",
+  "repository": "kevva/strict-uri-encode",
+  "author": {
+    "name": "Kevin Mårtensson",
+    "email": "kevinmartensson@gmail.com",
+    "url": "github.com/kevva"
+  },
+  "engines": {
+    "node": ">=0.10.0"
+  },
+  "scripts": {
+    "test": "node test.js"
+  },
+  "files": [
+    "index.js"
+  ],
+  "keywords": [
+    "component",
+    "encode",
+    "RFC3986",
+    "uri"
+  ],
+  "devDependencies": {
+    "ava": "^0.0.4"
+  }
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/strict-uri-encode/readme.md b/advancedcontentfilter/vendor/npm-asset/strict-uri-encode/readme.md
new file mode 100644 (file)
index 0000000..2763272
--- /dev/null
@@ -0,0 +1,40 @@
+# strict-uri-encode [![Build Status](https://travis-ci.org/kevva/strict-uri-encode.svg?branch=master)](https://travis-ci.org/kevva/strict-uri-encode)
+
+> A stricter URI encode adhering to [RFC 3986](http://tools.ietf.org/html/rfc3986)
+
+
+## Install
+
+```
+$ npm install --save strict-uri-encode
+```
+
+
+## Usage
+
+```js
+var strictUriEncode = require('strict-uri-encode');
+
+strictUriEncode('unicorn!foobar')
+//=> 'unicorn%21foobar'
+
+strictUriEncode('unicorn*foobar')
+//=> 'unicorn%2Afoobar'
+```
+
+
+## API
+
+### strictUriEncode(string)
+
+#### string
+
+*Required*  
+Type: `string`, `number`
+
+String to URI encode.
+
+
+## License
+
+MIT © [Kevin Mårtensson](http://github.com/kevva)
diff --git a/advancedcontentfilter/vendor/npm-asset/string_decoder/.travis.yml b/advancedcontentfilter/vendor/npm-asset/string_decoder/.travis.yml
new file mode 100644 (file)
index 0000000..3347a72
--- /dev/null
@@ -0,0 +1,50 @@
+sudo: false
+language: node_js
+before_install:
+  - npm install -g npm@2
+  - test $NPM_LEGACY && npm install -g npm@latest-3 || npm install npm -g
+notifications:
+  email: false
+matrix:
+  fast_finish: true
+  include:
+  - node_js: '0.8'
+    env:
+      - TASK=test
+      - NPM_LEGACY=true
+  - node_js: '0.10'
+    env:
+      - TASK=test
+      - NPM_LEGACY=true
+  - node_js: '0.11'
+    env:
+      - TASK=test
+      - NPM_LEGACY=true
+  - node_js: '0.12'
+    env:
+      - TASK=test
+      - NPM_LEGACY=true
+  - node_js: 1
+    env:
+      - TASK=test
+      - NPM_LEGACY=true
+  - node_js: 2
+    env:
+      - TASK=test
+      - NPM_LEGACY=true
+  - node_js: 3
+    env:
+      - TASK=test
+      - NPM_LEGACY=true
+  - node_js: 4
+    env: TASK=test
+  - node_js: 5
+    env: TASK=test
+  - node_js: 6
+    env: TASK=test
+  - node_js: 7
+    env: TASK=test
+  - node_js: 8
+    env: TASK=test
+  - node_js: 9
+    env: TASK=test
diff --git a/advancedcontentfilter/vendor/npm-asset/string_decoder/LICENSE b/advancedcontentfilter/vendor/npm-asset/string_decoder/LICENSE
new file mode 100644 (file)
index 0000000..778edb2
--- /dev/null
@@ -0,0 +1,48 @@
+Node.js is licensed for use as follows:
+
+"""
+Copyright Node.js contributors. All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to
+deal in the Software without restriction, including without limitation the
+rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+sell copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+IN THE SOFTWARE.
+"""
+
+This license applies to parts of Node.js originating from the
+https://github.com/joyent/node repository:
+
+"""
+Copyright Joyent, Inc. and other Node contributors. All rights reserved.
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to
+deal in the Software without restriction, including without limitation the
+rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+sell copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+IN THE SOFTWARE.
+"""
+
diff --git a/advancedcontentfilter/vendor/npm-asset/string_decoder/README.md b/advancedcontentfilter/vendor/npm-asset/string_decoder/README.md
new file mode 100644 (file)
index 0000000..5fd5831
--- /dev/null
@@ -0,0 +1,47 @@
+# string_decoder
+
+***Node-core v8.9.4 string_decoder for userland***
+
+
+[![NPM](https://nodei.co/npm/string_decoder.png?downloads=true&downloadRank=true)](https://nodei.co/npm/string_decoder/)
+[![NPM](https://nodei.co/npm-dl/string_decoder.png?&months=6&height=3)](https://nodei.co/npm/string_decoder/)
+
+
+```bash
+npm install --save string_decoder
+```
+
+***Node-core string_decoder for userland***
+
+This package is a mirror of the string_decoder implementation in Node-core.
+
+Full documentation may be found on the [Node.js website](https://nodejs.org/dist/v8.9.4/docs/api/).
+
+As of version 1.0.0 **string_decoder** uses semantic versioning.
+
+## Previous versions
+
+Previous version numbers match the versions found in Node core, e.g. 0.10.24 matches Node 0.10.24, likewise 0.11.10 matches Node 0.11.10.
+
+## Update
+
+The *build/* directory contains a build script that will scrape the source from the [nodejs/node](https://github.com/nodejs/node) repo given a specific Node version.
+
+## Streams Working Group
+
+`string_decoder` is maintained by the Streams Working Group, which
+oversees the development and maintenance of the Streams API within
+Node.js. The responsibilities of the Streams Working Group include:
+
+* Addressing stream issues on the Node.js issue tracker.
+* Authoring and editing stream documentation within the Node.js project.
+* Reviewing changes to stream subclasses within the Node.js project.
+* Redirecting changes to streams from the Node.js project to this
+  project.
+* Assisting in the implementation of stream providers within Node.js.
+* Recommending versions of `readable-stream` to be included in Node.js.
+* Messaging about the future of streams to give the community advance
+  notice of changes.
+
+See [readable-stream](https://github.com/nodejs/readable-stream) for
+more details.
diff --git a/advancedcontentfilter/vendor/npm-asset/string_decoder/lib/string_decoder.js b/advancedcontentfilter/vendor/npm-asset/string_decoder/lib/string_decoder.js
new file mode 100644 (file)
index 0000000..2e89e63
--- /dev/null
@@ -0,0 +1,296 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+'use strict';
+
+/*<replacement>*/
+
+var Buffer = require('safe-buffer').Buffer;
+/*</replacement>*/
+
+var isEncoding = Buffer.isEncoding || function (encoding) {
+  encoding = '' + encoding;
+  switch (encoding && encoding.toLowerCase()) {
+    case 'hex':case 'utf8':case 'utf-8':case 'ascii':case 'binary':case 'base64':case 'ucs2':case 'ucs-2':case 'utf16le':case 'utf-16le':case 'raw':
+      return true;
+    default:
+      return false;
+  }
+};
+
+function _normalizeEncoding(enc) {
+  if (!enc) return 'utf8';
+  var retried;
+  while (true) {
+    switch (enc) {
+      case 'utf8':
+      case 'utf-8':
+        return 'utf8';
+      case 'ucs2':
+      case 'ucs-2':
+      case 'utf16le':
+      case 'utf-16le':
+        return 'utf16le';
+      case 'latin1':
+      case 'binary':
+        return 'latin1';
+      case 'base64':
+      case 'ascii':
+      case 'hex':
+        return enc;
+      default:
+        if (retried) return; // undefined
+        enc = ('' + enc).toLowerCase();
+        retried = true;
+    }
+  }
+};
+
+// Do not cache `Buffer.isEncoding` when checking encoding names as some
+// modules monkey-patch it to support additional encodings
+function normalizeEncoding(enc) {
+  var nenc = _normalizeEncoding(enc);
+  if (typeof nenc !== 'string' && (Buffer.isEncoding === isEncoding || !isEncoding(enc))) throw new Error('Unknown encoding: ' + enc);
+  return nenc || enc;
+}
+
+// StringDecoder provides an interface for efficiently splitting a series of
+// buffers into a series of JS strings without breaking apart multi-byte
+// characters.
+exports.StringDecoder = StringDecoder;
+function StringDecoder(encoding) {
+  this.encoding = normalizeEncoding(encoding);
+  var nb;
+  switch (this.encoding) {
+    case 'utf16le':
+      this.text = utf16Text;
+      this.end = utf16End;
+      nb = 4;
+      break;
+    case 'utf8':
+      this.fillLast = utf8FillLast;
+      nb = 4;
+      break;
+    case 'base64':
+      this.text = base64Text;
+      this.end = base64End;
+      nb = 3;
+      break;
+    default:
+      this.write = simpleWrite;
+      this.end = simpleEnd;
+      return;
+  }
+  this.lastNeed = 0;
+  this.lastTotal = 0;
+  this.lastChar = Buffer.allocUnsafe(nb);
+}
+
+StringDecoder.prototype.write = function (buf) {
+  if (buf.length === 0) return '';
+  var r;
+  var i;
+  if (this.lastNeed) {
+    r = this.fillLast(buf);
+    if (r === undefined) return '';
+    i = this.lastNeed;
+    this.lastNeed = 0;
+  } else {
+    i = 0;
+  }
+  if (i < buf.length) return r ? r + this.text(buf, i) : this.text(buf, i);
+  return r || '';
+};
+
+StringDecoder.prototype.end = utf8End;
+
+// Returns only complete characters in a Buffer
+StringDecoder.prototype.text = utf8Text;
+
+// Attempts to complete a partial non-UTF-8 character using bytes from a Buffer
+StringDecoder.prototype.fillLast = function (buf) {
+  if (this.lastNeed <= buf.length) {
+    buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed);
+    return this.lastChar.toString(this.encoding, 0, this.lastTotal);
+  }
+  buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, buf.length);
+  this.lastNeed -= buf.length;
+};
+
+// Checks the type of a UTF-8 byte, whether it's ASCII, a leading byte, or a
+// continuation byte. If an invalid byte is detected, -2 is returned.
+function utf8CheckByte(byte) {
+  if (byte <= 0x7F) return 0;else if (byte >> 5 === 0x06) return 2;else if (byte >> 4 === 0x0E) return 3;else if (byte >> 3 === 0x1E) return 4;
+  return byte >> 6 === 0x02 ? -1 : -2;
+}
+
+// Checks at most 3 bytes at the end of a Buffer in order to detect an
+// incomplete multi-byte UTF-8 character. The total number of bytes (2, 3, or 4)
+// needed to complete the UTF-8 character (if applicable) are returned.
+function utf8CheckIncomplete(self, buf, i) {
+  var j = buf.length - 1;
+  if (j < i) return 0;
+  var nb = utf8CheckByte(buf[j]);
+  if (nb >= 0) {
+    if (nb > 0) self.lastNeed = nb - 1;
+    return nb;
+  }
+  if (--j < i || nb === -2) return 0;
+  nb = utf8CheckByte(buf[j]);
+  if (nb >= 0) {
+    if (nb > 0) self.lastNeed = nb - 2;
+    return nb;
+  }
+  if (--j < i || nb === -2) return 0;
+  nb = utf8CheckByte(buf[j]);
+  if (nb >= 0) {
+    if (nb > 0) {
+      if (nb === 2) nb = 0;else self.lastNeed = nb - 3;
+    }
+    return nb;
+  }
+  return 0;
+}
+
+// Validates as many continuation bytes for a multi-byte UTF-8 character as
+// needed or are available. If we see a non-continuation byte where we expect
+// one, we "replace" the validated continuation bytes we've seen so far with
+// a single UTF-8 replacement character ('\ufffd'), to match v8's UTF-8 decoding
+// behavior. The continuation byte check is included three times in the case
+// where all of the continuation bytes for a character exist in the same buffer.
+// It is also done this way as a slight performance increase instead of using a
+// loop.
+function utf8CheckExtraBytes(self, buf, p) {
+  if ((buf[0] & 0xC0) !== 0x80) {
+    self.lastNeed = 0;
+    return '\ufffd';
+  }
+  if (self.lastNeed > 1 && buf.length > 1) {
+    if ((buf[1] & 0xC0) !== 0x80) {
+      self.lastNeed = 1;
+      return '\ufffd';
+    }
+    if (self.lastNeed > 2 && buf.length > 2) {
+      if ((buf[2] & 0xC0) !== 0x80) {
+        self.lastNeed = 2;
+        return '\ufffd';
+      }
+    }
+  }
+}
+
+// Attempts to complete a multi-byte UTF-8 character using bytes from a Buffer.
+function utf8FillLast(buf) {
+  var p = this.lastTotal - this.lastNeed;
+  var r = utf8CheckExtraBytes(this, buf, p);
+  if (r !== undefined) return r;
+  if (this.lastNeed <= buf.length) {
+    buf.copy(this.lastChar, p, 0, this.lastNeed);
+    return this.lastChar.toString(this.encoding, 0, this.lastTotal);
+  }
+  buf.copy(this.lastChar, p, 0, buf.length);
+  this.lastNeed -= buf.length;
+}
+
+// Returns all complete UTF-8 characters in a Buffer. If the Buffer ended on a
+// partial character, the character's bytes are buffered until the required
+// number of bytes are available.
+function utf8Text(buf, i) {
+  var total = utf8CheckIncomplete(this, buf, i);
+  if (!this.lastNeed) return buf.toString('utf8', i);
+  this.lastTotal = total;
+  var end = buf.length - (total - this.lastNeed);
+  buf.copy(this.lastChar, 0, end);
+  return buf.toString('utf8', i, end);
+}
+
+// For UTF-8, a replacement character is added when ending on a partial
+// character.
+function utf8End(buf) {
+  var r = buf && buf.length ? this.write(buf) : '';
+  if (this.lastNeed) return r + '\ufffd';
+  return r;
+}
+
+// UTF-16LE typically needs two bytes per character, but even if we have an even
+// number of bytes available, we need to check if we end on a leading/high
+// surrogate. In that case, we need to wait for the next two bytes in order to
+// decode the last character properly.
+function utf16Text(buf, i) {
+  if ((buf.length - i) % 2 === 0) {
+    var r = buf.toString('utf16le', i);
+    if (r) {
+      var c = r.charCodeAt(r.length - 1);
+      if (c >= 0xD800 && c <= 0xDBFF) {
+        this.lastNeed = 2;
+        this.lastTotal = 4;
+        this.lastChar[0] = buf[buf.length - 2];
+        this.lastChar[1] = buf[buf.length - 1];
+        return r.slice(0, -1);
+      }
+    }
+    return r;
+  }
+  this.lastNeed = 1;
+  this.lastTotal = 2;
+  this.lastChar[0] = buf[buf.length - 1];
+  return buf.toString('utf16le', i, buf.length - 1);
+}
+
+// For UTF-16LE we do not explicitly append special replacement characters if we
+// end on a partial character, we simply let v8 handle that.
+function utf16End(buf) {
+  var r = buf && buf.length ? this.write(buf) : '';
+  if (this.lastNeed) {
+    var end = this.lastTotal - this.lastNeed;
+    return r + this.lastChar.toString('utf16le', 0, end);
+  }
+  return r;
+}
+
+function base64Text(buf, i) {
+  var n = (buf.length - i) % 3;
+  if (n === 0) return buf.toString('base64', i);
+  this.lastNeed = 3 - n;
+  this.lastTotal = 3;
+  if (n === 1) {
+    this.lastChar[0] = buf[buf.length - 1];
+  } else {
+    this.lastChar[0] = buf[buf.length - 2];
+    this.lastChar[1] = buf[buf.length - 1];
+  }
+  return buf.toString('base64', i, buf.length - n);
+}
+
+function base64End(buf) {
+  var r = buf && buf.length ? this.write(buf) : '';
+  if (this.lastNeed) return r + this.lastChar.toString('base64', 0, 3 - this.lastNeed);
+  return r;
+}
+
+// Pass bytes on through for single-byte encodings (e.g. ascii, latin1, hex)
+function simpleWrite(buf) {
+  return buf.toString(this.encoding);
+}
+
+function simpleEnd(buf) {
+  return buf && buf.length ? this.write(buf) : '';
+}
\ No newline at end of file
diff --git a/advancedcontentfilter/vendor/npm-asset/string_decoder/package.json b/advancedcontentfilter/vendor/npm-asset/string_decoder/package.json
new file mode 100644 (file)
index 0000000..518c3eb
--- /dev/null
@@ -0,0 +1,31 @@
+{
+  "name": "string_decoder",
+  "version": "1.1.1",
+  "description": "The string_decoder module from Node core",
+  "main": "lib/string_decoder.js",
+  "dependencies": {
+    "safe-buffer": "~5.1.0"
+  },
+  "devDependencies": {
+    "babel-polyfill": "^6.23.0",
+    "core-util-is": "^1.0.2",
+    "inherits": "^2.0.3",
+    "tap": "~0.4.8"
+  },
+  "scripts": {
+    "test": "tap test/parallel/*.js && node test/verify-dependencies",
+    "ci": "tap test/parallel/*.js test/ours/*.js --tap | tee test.tap && node test/verify-dependencies.js"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/nodejs/string_decoder.git"
+  },
+  "homepage": "https://github.com/nodejs/string_decoder",
+  "keywords": [
+    "string",
+    "decoder",
+    "browser",
+    "browserify"
+  ],
+  "license": "MIT"
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/timed-out/index.js b/advancedcontentfilter/vendor/npm-asset/timed-out/index.js
new file mode 100644 (file)
index 0000000..94007a4
--- /dev/null
@@ -0,0 +1,55 @@
+'use strict';
+
+module.exports = function (req, time) {
+       if (req.timeoutTimer) {
+               return req;
+       }
+
+       var delays = isNaN(time) ? time : {socket: time, connect: time};
+       var host = req._headers ? (' to ' + req._headers.host) : '';
+
+       if (delays.connect !== undefined) {
+               req.timeoutTimer = setTimeout(function timeoutHandler() {
+                       req.abort();
+                       var e = new Error('Connection timed out on request' + host);
+                       e.code = 'ETIMEDOUT';
+                       req.emit('error', e);
+               }, delays.connect);
+       }
+
+       // Clear the connection timeout timer once a socket is assigned to the
+       // request and is connected.
+       req.on('socket', function assign(socket) {
+               // Socket may come from Agent pool and may be already connected.
+               if (!(socket.connecting || socket._connecting)) {
+                       connect();
+                       return;
+               }
+
+               socket.once('connect', connect);
+       });
+
+       function clear() {
+               if (req.timeoutTimer) {
+                       clearTimeout(req.timeoutTimer);
+                       req.timeoutTimer = null;
+               }
+       }
+
+       function connect() {
+               clear();
+
+               if (delays.socket !== undefined) {
+                       // Abort the request if there is no activity on the socket for more
+                       // than `delays.socket` milliseconds.
+                       req.setTimeout(delays.socket, function socketTimeoutHandler() {
+                               req.abort();
+                               var e = new Error('Socket timed out on request' + host);
+                               e.code = 'ESOCKETTIMEDOUT';
+                               req.emit('error', e);
+                       });
+               }
+       }
+
+       return req.on('error', clear);
+};
diff --git a/advancedcontentfilter/vendor/npm-asset/timed-out/license b/advancedcontentfilter/vendor/npm-asset/timed-out/license
new file mode 100644 (file)
index 0000000..faadd52
--- /dev/null
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) Vsevolod Strukchinsky <floatdrop@gmail.com>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/advancedcontentfilter/vendor/npm-asset/timed-out/package.json b/advancedcontentfilter/vendor/npm-asset/timed-out/package.json
new file mode 100644 (file)
index 0000000..b86baa7
--- /dev/null
@@ -0,0 +1,36 @@
+{
+  "name": "timed-out",
+  "version": "4.0.1",
+  "description": "Emit `ETIMEDOUT` or `ESOCKETTIMEDOUT` when ClientRequest is hanged",
+  "license": "MIT",
+  "repository": "floatdrop/timed-out",
+  "author": {
+    "name": "Vsevolod Strukchinsky",
+    "email": "floatdrop@gmail.com"
+  },
+  "engines": {
+    "node": ">=0.10.0"
+  },
+  "scripts": {
+    "test": "xo && mocha"
+  },
+  "files": [
+    "index.js"
+  ],
+  "keywords": [
+    "http",
+    "https",
+    "get",
+    "got",
+    "url",
+    "uri",
+    "request",
+    "util",
+    "utility",
+    "simple"
+  ],
+  "devDependencies": {
+    "mocha": "*",
+    "xo": "^0.16.0"
+  }
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/timed-out/readme.md b/advancedcontentfilter/vendor/npm-asset/timed-out/readme.md
new file mode 100644 (file)
index 0000000..fa0a035
--- /dev/null
@@ -0,0 +1,42 @@
+# timed-out [![Build Status](https://travis-ci.org/floatdrop/timed-out.svg?branch=master)](https://travis-ci.org/floatdrop/timed-out)
+
+> Timeout HTTP/HTTPS requests
+
+Emit Error object with `code` property equal `ETIMEDOUT` or `ESOCKETTIMEDOUT` when ClientRequest is hanged.
+
+## Usage
+
+```js
+var get = require('http').get;
+var timeout = require('timed-out');
+
+var req = get('http://www.google.ru');
+timeout(req, 2000); // Set 2 seconds limit
+```
+
+### API
+
+#### timedout(request, time)
+
+##### request
+
+*Required*  
+Type: [`ClientRequest`](http://nodejs.org/api/http.html#http_class_http_clientrequest)
+
+The request to watch on.
+
+##### time
+
+*Required*  
+Type: `number` or `object`
+
+Time in milliseconds to wait for `connect` event on socket and also time to wait on inactive socket.
+
+Or you can pass Object with following fields:
+
+- `connect` - time to wait for connection
+- `socket`  - time to wait for activity on socket
+
+## License
+
+MIT © [Vsevolod Strukchinsky](floatdrop@gmail.com)
diff --git a/advancedcontentfilter/vendor/npm-asset/url-parse-lax/index.js b/advancedcontentfilter/vendor/npm-asset/url-parse-lax/index.js
new file mode 100644 (file)
index 0000000..5c62a58
--- /dev/null
@@ -0,0 +1,12 @@
+'use strict';
+const url = require('url');
+const prependHttp = require('prepend-http');
+
+module.exports = (input, options) => {
+       if (typeof input !== 'string') {
+               throw new TypeError(`Expected \`url\` to be of type \`string\`, got \`${typeof input}\` instead.`);
+       }
+
+       const finalUrl = prependHttp(input, Object.assign({https: true}, options));
+       return url.parse(finalUrl);
+};
diff --git a/advancedcontentfilter/vendor/npm-asset/url-parse-lax/license b/advancedcontentfilter/vendor/npm-asset/url-parse-lax/license
new file mode 100644 (file)
index 0000000..e7af2f7
--- /dev/null
@@ -0,0 +1,9 @@
+MIT License
+
+Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/advancedcontentfilter/vendor/npm-asset/url-parse-lax/package.json b/advancedcontentfilter/vendor/npm-asset/url-parse-lax/package.json
new file mode 100644 (file)
index 0000000..b3c58f9
--- /dev/null
@@ -0,0 +1,42 @@
+{
+  "name": "url-parse-lax",
+  "version": "3.0.0",
+  "description": "Lax url.parse() with support for protocol-less URLs & IPs",
+  "license": "MIT",
+  "repository": "sindresorhus/url-parse-lax",
+  "author": {
+    "name": "Sindre Sorhus",
+    "email": "sindresorhus@gmail.com",
+    "url": "sindresorhus.com"
+  },
+  "engines": {
+    "node": ">=4"
+  },
+  "scripts": {
+    "test": "xo && ava"
+  },
+  "files": [
+    "index.js"
+  ],
+  "keywords": [
+    "url",
+    "uri",
+    "parse",
+    "parser",
+    "loose",
+    "lax",
+    "protocol",
+    "less",
+    "protocol-less",
+    "ip",
+    "ipv4",
+    "ipv6"
+  ],
+  "dependencies": {
+    "prepend-http": "^2.0.0"
+  },
+  "devDependencies": {
+    "ava": "*",
+    "xo": "*"
+  }
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/url-parse-lax/readme.md b/advancedcontentfilter/vendor/npm-asset/url-parse-lax/readme.md
new file mode 100644 (file)
index 0000000..be0d437
--- /dev/null
@@ -0,0 +1,127 @@
+# url-parse-lax [![Build Status](https://travis-ci.org/sindresorhus/url-parse-lax.svg?branch=master)](https://travis-ci.org/sindresorhus/url-parse-lax)
+
+> Lax [`url.parse()`](https://nodejs.org/docs/latest/api/url.html#url_url_parse_urlstr_parsequerystring_slashesdenotehost) with support for protocol-less URLs & IPs
+
+
+## Install
+
+```
+$ npm install url-parse-lax
+```
+
+
+## Usage
+
+```js
+const urlParseLax = require('url-parse-lax');
+
+urlParseLax('sindresorhus.com');
+/*
+{
+       protocol: 'https:',
+       slashes: true,
+       auth: null,
+       host: 'sindresorhus.com',
+       port: null,
+       hostname: 'sindresorhus.com',
+       hash: null,
+       search: null,
+       query: null,
+       pathname: '/',
+       path: '/',
+       href: 'https://sindresorhus.com/'
+}
+*/
+
+urlParseLax('[2001:db8::]:8000');
+/*
+{
+       protocol: null,
+       slashes: true,
+       auth: null,
+       host: '[2001:db8::]:8000',
+       port: '8000',
+       hostname: '2001:db8::',
+       hash: null,
+       search: null,
+       query: null,
+       pathname: '/',
+       path: '/',
+       href: 'http://[2001:db8::]:8000/'
+}
+*/
+```
+
+And with the built-in `url.parse()`:
+
+```js
+const url = require('url');
+
+url.parse('sindresorhus.com');
+/*
+{
+       protocol: null,
+       slashes: null,
+       auth: null,
+       host: null,
+       port: null,
+       hostname: null,
+       hash: null,
+       search: null,
+       query: null,
+       pathname: 'sindresorhus',
+       path: 'sindresorhus',
+       href: 'sindresorhus'
+}
+*/
+
+url.parse('[2001:db8::]:8000');
+/*
+{
+       protocol: null,
+       slashes: null,
+       auth: null,
+       host: null,
+       port: null,
+       hostname: null,
+       hash: null,
+       search: null,
+       query: null,
+       pathname: '[2001:db8::]:8000',
+       path: '[2001:db8::]:8000',
+       href: '[2001:db8::]:8000'
+}
+*/
+```
+
+
+## API
+
+### urlParseLax(url, [options])
+
+#### url
+
+Type: `string`
+
+URL to parse.
+
+#### options
+
+Type: `Object`
+
+##### https
+
+Type: `boolean`<br>
+Default: `true`
+
+Prepend `https://` instead of `http://` to protocol-less URLs.
+
+
+## Related
+
+- [url-format-lax](https://github.com/sindresorhus/url-format-lax) - Lax `url.format()` that formats a hostname and port into IPv6-compatible socket form of `hostname:port`
+
+
+## License
+
+MIT © [Sindre Sorhus](https://sindresorhus.com)
diff --git a/advancedcontentfilter/vendor/npm-asset/url-to-options/LICENSE b/advancedcontentfilter/vendor/npm-asset/url-to-options/LICENSE
new file mode 100644 (file)
index 0000000..274147a
--- /dev/null
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2017 Steven Vachon
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/advancedcontentfilter/vendor/npm-asset/url-to-options/README.md b/advancedcontentfilter/vendor/npm-asset/url-to-options/README.md
new file mode 100644 (file)
index 0000000..5158636
--- /dev/null
@@ -0,0 +1,29 @@
+# url-to-options [![NPM Version][npm-image]][npm-url] [![Build Status][travis-image]][travis-url]
+
+Convert a WHATWG [URL](https://developer.mozilla.org/en/docs/Web/API/URL) to an `http.request`/`https.request` options object.
+
+
+## Installation
+
+[Node.js](http://nodejs.org/) `>= 4` is required. To install, type this at the command line:
+```shell
+npm install url-to-options
+```
+
+
+## Usage
+
+```js
+const urlToOptions = require('url-to-options');
+
+const url = new URL('http://user:pass@hostname:8080/');
+
+const opts = urlToOptions(url);
+//-> { auth:'user:pass', port:8080, … }
+```
+
+
+[npm-image]: https://img.shields.io/npm/v/url-to-options.svg
+[npm-url]: https://npmjs.org/package/url-to-options
+[travis-image]: https://img.shields.io/travis/stevenvachon/url-to-options.svg
+[travis-url]: https://travis-ci.org/stevenvachon/url-to-options
diff --git a/advancedcontentfilter/vendor/npm-asset/url-to-options/index.js b/advancedcontentfilter/vendor/npm-asset/url-to-options/index.js
new file mode 100644 (file)
index 0000000..25ef0bd
--- /dev/null
@@ -0,0 +1,28 @@
+'use strict';
+
+
+
+// Copied from https://github.com/nodejs/node/blob/master/lib/internal/url.js
+
+function urlToOptions(url) {
+  var options = {
+    protocol: url.protocol,
+    hostname: url.hostname,
+    hash: url.hash,
+    search: url.search,
+    pathname: url.pathname,
+    path: `${url.pathname}${url.search}`,
+    href: url.href
+  };
+  if (url.port !== '') {
+    options.port = Number(url.port);
+  }
+  if (url.username || url.password) {
+    options.auth = `${url.username}:${url.password}`;
+  }
+  return options;
+}
+
+
+
+module.exports = urlToOptions;
diff --git a/advancedcontentfilter/vendor/npm-asset/url-to-options/package.json b/advancedcontentfilter/vendor/npm-asset/url-to-options/package.json
new file mode 100644 (file)
index 0000000..0dce30d
--- /dev/null
@@ -0,0 +1,24 @@
+{
+  "name": "url-to-options",
+  "description": "Convert a WHATWG URL to an http(s).request options object.",
+  "version": "1.0.1",
+  "license": "MIT",
+  "author": "Steven Vachon <contact@svachon.com> (https://www.svachon.com/)",
+  "repository": "stevenvachon/url-to-options",
+  "devDependencies": {
+    "universal-url": "^1.0.0-alpha"
+  },
+  "engines": {
+    "node": ">= 4"
+  },
+  "scripts": {
+    "test": "node test.js"
+  },
+  "files": ["index.js"],
+  "keywords": [
+    "http",
+    "https",
+    "url",
+    "whatwg"
+  ]
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/util-deprecate/History.md b/advancedcontentfilter/vendor/npm-asset/util-deprecate/History.md
new file mode 100644 (file)
index 0000000..acc8675
--- /dev/null
@@ -0,0 +1,16 @@
+
+1.0.2 / 2015-10-07
+==================
+
+  * use try/catch when checking `localStorage` (#3, @kumavis)
+
+1.0.1 / 2014-11-25
+==================
+
+  * browser: use `console.warn()` for deprecation calls
+  * browser: more jsdocs
+
+1.0.0 / 2014-04-30
+==================
+
+  * initial commit
diff --git a/advancedcontentfilter/vendor/npm-asset/util-deprecate/LICENSE b/advancedcontentfilter/vendor/npm-asset/util-deprecate/LICENSE
new file mode 100644 (file)
index 0000000..6a60e8c
--- /dev/null
@@ -0,0 +1,24 @@
+(The MIT License)
+
+Copyright (c) 2014 Nathan Rajlich <nathan@tootallnate.net>
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
diff --git a/advancedcontentfilter/vendor/npm-asset/util-deprecate/README.md b/advancedcontentfilter/vendor/npm-asset/util-deprecate/README.md
new file mode 100644 (file)
index 0000000..75622fa
--- /dev/null
@@ -0,0 +1,53 @@
+util-deprecate
+==============
+### The Node.js `util.deprecate()` function with browser support
+
+In Node.js, this module simply re-exports the `util.deprecate()` function.
+
+In the web browser (i.e. via browserify), a browser-specific implementation
+of the `util.deprecate()` function is used.
+
+
+## API
+
+A `deprecate()` function is the only thing exposed by this module.
+
+``` javascript
+// setup:
+exports.foo = deprecate(foo, 'foo() is deprecated, use bar() instead');
+
+
+// users see:
+foo();
+// foo() is deprecated, use bar() instead
+foo();
+foo();
+```
+
+
+## License
+
+(The MIT License)
+
+Copyright (c) 2014 Nathan Rajlich <nathan@tootallnate.net>
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
diff --git a/advancedcontentfilter/vendor/npm-asset/util-deprecate/browser.js b/advancedcontentfilter/vendor/npm-asset/util-deprecate/browser.js
new file mode 100644 (file)
index 0000000..549ae2f
--- /dev/null
@@ -0,0 +1,67 @@
+
+/**
+ * Module exports.
+ */
+
+module.exports = deprecate;
+
+/**
+ * Mark that a method should not be used.
+ * Returns a modified function which warns once by default.
+ *
+ * If `localStorage.noDeprecation = true` is set, then it is a no-op.
+ *
+ * If `localStorage.throwDeprecation = true` is set, then deprecated functions
+ * will throw an Error when invoked.
+ *
+ * If `localStorage.traceDeprecation = true` is set, then deprecated functions
+ * will invoke `console.trace()` instead of `console.error()`.
+ *
+ * @param {Function} fn - the function to deprecate
+ * @param {String} msg - the string to print to the console when `fn` is invoked
+ * @returns {Function} a new "deprecated" version of `fn`
+ * @api public
+ */
+
+function deprecate (fn, msg) {
+  if (config('noDeprecation')) {
+    return fn;
+  }
+
+  var warned = false;
+  function deprecated() {
+    if (!warned) {
+      if (config('throwDeprecation')) {
+        throw new Error(msg);
+      } else if (config('traceDeprecation')) {
+        console.trace(msg);
+      } else {
+        console.warn(msg);
+      }
+      warned = true;
+    }
+    return fn.apply(this, arguments);
+  }
+
+  return deprecated;
+}
+
+/**
+ * Checks `localStorage` for boolean values for the given `name`.
+ *
+ * @param {String} name
+ * @returns {Boolean}
+ * @api private
+ */
+
+function config (name) {
+  // accessing global.localStorage can trigger a DOMException in sandboxed iframes
+  try {
+    if (!global.localStorage) return false;
+  } catch (_) {
+    return false;
+  }
+  var val = global.localStorage[name];
+  if (null == val) return false;
+  return String(val).toLowerCase() === 'true';
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/util-deprecate/node.js b/advancedcontentfilter/vendor/npm-asset/util-deprecate/node.js
new file mode 100644 (file)
index 0000000..5e6fcff
--- /dev/null
@@ -0,0 +1,6 @@
+
+/**
+ * For Node.js, simply re-export the core `util.deprecate` function.
+ */
+
+module.exports = require('util').deprecate;
diff --git a/advancedcontentfilter/vendor/npm-asset/util-deprecate/package.json b/advancedcontentfilter/vendor/npm-asset/util-deprecate/package.json
new file mode 100644 (file)
index 0000000..2e79f89
--- /dev/null
@@ -0,0 +1,27 @@
+{
+  "name": "util-deprecate",
+  "version": "1.0.2",
+  "description": "The Node.js `util.deprecate()` function with browser support",
+  "main": "node.js",
+  "browser": "browser.js",
+  "scripts": {
+    "test": "echo \"Error: no test specified\" && exit 1"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/TooTallNate/util-deprecate.git"
+  },
+  "keywords": [
+    "util",
+    "deprecate",
+    "browserify",
+    "browser",
+    "node"
+  ],
+  "author": "Nathan Rajlich <nathan@tootallnate.net> (http://n8.io/)",
+  "license": "MIT",
+  "bugs": {
+    "url": "https://github.com/TooTallNate/util-deprecate/issues"
+  },
+  "homepage": "https://github.com/TooTallNate/util-deprecate"
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/vue-resource/.circleci/config.yml b/advancedcontentfilter/vendor/npm-asset/vue-resource/.circleci/config.yml
new file mode 100644 (file)
index 0000000..da719a5
--- /dev/null
@@ -0,0 +1,34 @@
+version: 2
+
+defaults: &defaults
+  docker:
+    - image: circleci/node:9-browsers
+  environment:
+    CHROME_BIN: /usr/bin/google-chrome
+  working_directory: ~/vue-resource
+
+jobs:
+  build:
+    <<: *defaults
+    steps:
+      - run:
+          name: Update Environment
+          command: echo 'export PATH=$CIRCLE_WORKING_DIRECTORY/node_modules/.bin:$PATH' >> $BASH_ENV
+      - checkout
+      - restore_cache:
+          key: yarn-{{ checksum "yarn.lock" }}
+      - run:
+          name: Install Dependencies
+          command: yarn install --pure-lockfile --cache-folder ~/.yarn
+      - save_cache:
+          key: yarn-{{ checksum "yarn.lock" }}
+          paths:
+            - ~/.yarn
+      - run:
+          name: Run Tests
+          command: |
+            yarn test
+            karma start test/karma.conf.js --single-run --browsers Chrome,Firefox
+      - run:
+          name: Build Release
+          command: yarn run build
diff --git a/advancedcontentfilter/vendor/npm-asset/vue-resource/.eslintignore b/advancedcontentfilter/vendor/npm-asset/vue-resource/.eslintignore
new file mode 100644 (file)
index 0000000..38c9431
--- /dev/null
@@ -0,0 +1,3 @@
+/node_modules
+/dist
+/test
diff --git a/advancedcontentfilter/vendor/npm-asset/vue-resource/.eslintrc.js b/advancedcontentfilter/vendor/npm-asset/vue-resource/.eslintrc.js
new file mode 100644 (file)
index 0000000..f2bde98
--- /dev/null
@@ -0,0 +1,44 @@
+module.exports = {
+  "root":true,
+  "env": {
+      "es6": true,
+      "browser": true,
+      "commonjs": true,
+  },
+  "extends": [
+      "eslint:recommended"
+  ],
+  "parserOptions": {
+      "sourceType": "module"
+  },
+  "rules": {
+      "brace-style": ["error", "1tbs", {"allowSingleLine": true}],
+      "comma-style": "error",
+      "comma-spacing": "error",
+      "eqeqeq": ["off", "smart"],
+      "indent": "off",
+      "indent-legacy": ["error", 4, {"SwitchCase": 1}],
+      "key-spacing": "error",
+      "keyword-spacing": "error",
+      "linebreak-style": ["error", "unix"],
+      "no-multi-spaces": "error",
+      "no-trailing-spaces": "error",
+      "no-lone-blocks": "error",
+      "no-extend-native": "error",
+      "no-unused-vars": ["error", {"vars": "local", "args": "none"}],
+      "no-empty": ["error", {"allowEmptyCatch": true}],
+      "no-duplicate-imports": "error",
+      "no-array-constructor": "error",
+      "no-multiple-empty-lines": "error",
+      "no-template-curly-in-string": "error",
+      "no-console": "off",
+      "object-curly-spacing": "error",
+      "quotes": ["error", "single", {"avoidEscape": true}],
+      "semi": ["error", "always"],
+      "space-infix-ops": "error",
+      "space-unary-ops": "error",
+      "space-in-parens": "error",
+      "space-before-blocks": "error",
+      "template-curly-spacing": "error"
+  }
+};
diff --git a/advancedcontentfilter/vendor/npm-asset/vue-resource/.github/ISSUE_TEMPLATE.md b/advancedcontentfilter/vendor/npm-asset/vue-resource/.github/ISSUE_TEMPLATE.md
new file mode 100644 (file)
index 0000000..26a6d34
--- /dev/null
@@ -0,0 +1,22 @@
+<!--
+Got a question?
+===============
+The issue list of this repo is exclusively for bug reports and feature requests. For questions, please use the following resources:
+
+- Read the docs: https://github.com/pagekit/vue-resource/tree/master/docs
+- Look for/ask questions on stack overflow: http://stackoverflow.com/search?q=vue-resource
+
+Thank you!
+-->
+
+<!-- BUG REPORT TEMPLATE -->
+### Reproduction Link
+<!-- A minimal jsfiddle that can reproduce the bug. -->
+<!-- You could start with this template: https://jsfiddle.net/pjjr7e7m/ -->
+
+### Steps to reproduce
+<!-- Incl. which version is used on what browser and device. -->
+
+### What is Expected?
+
+### What is actually happening?
diff --git a/advancedcontentfilter/vendor/npm-asset/vue-resource/LICENSE b/advancedcontentfilter/vendor/npm-asset/vue-resource/LICENSE
new file mode 100644 (file)
index 0000000..3bd6217
--- /dev/null
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2015-2017 steffans
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/advancedcontentfilter/vendor/npm-asset/vue-resource/README.md b/advancedcontentfilter/vendor/npm-asset/vue-resource/README.md
new file mode 100644 (file)
index 0000000..59a012b
--- /dev/null
@@ -0,0 +1,59 @@
+# vue-resource [![Build](https://img.shields.io/circleci/project/pagekit/vue-resource/develop.svg)](https://circleci.com/gh/pagekit/vue-resource) [![Downloads](https://img.shields.io/npm/dm/vue-resource.svg)](https://www.npmjs.com/package/vue-resource) [![jsdelivr](https://data.jsdelivr.com/v1/package/npm/vue-resource/badge?style=rounded)](https://www.jsdelivr.com/package/npm/vue-resource) [![Version](https://img.shields.io/npm/v/vue-resource.svg)](https://www.npmjs.com/package/vue-resource) [![License](https://img.shields.io/npm/l/vue-resource.svg)](https://www.npmjs.com/package/vue-resource)
+
+The plugin for [Vue.js](http://vuejs.org) provides services for making web requests and handle responses using a [XMLHttpRequest](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest) or JSONP.
+
+## Features
+
+- Supports the [Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) API and [URI Templates](https://medialize.github.io/URI.js/uri-template.html)
+- Supports [interceptors](docs/http.md#interceptors) for request and response
+- Supports latest Firefox, Chrome, Safari, Opera and IE9+
+- Supports Vue 1.0 & Vue 2.0
+- Compact size 14KB (5.3KB gzipped)
+
+## Installation
+You can install it via [yarn](https://yarnpkg.com/) or [NPM](http://npmjs.org/).
+```
+$ yarn add vue-resource
+$ npm install vue-resource
+```
+
+### CDN
+Available on [jsdelivr](https://cdn.jsdelivr.net/npm/vue-resource@1.5.0), [unpkg](https://unpkg.com/vue-resource@1.5.0) or [cdnjs](https://cdnjs.com/libraries/vue-resource).
+```html
+<script src="https://cdn.jsdelivr.net/npm/vue-resource@1.5.0"></script>
+```
+
+## Example
+```js
+{
+  // GET /someUrl
+  this.$http.get('/someUrl').then(response => {
+
+    // get body data
+    this.someData = response.body;
+
+  }, response => {
+    // error callback
+  });
+}
+```
+
+## Documentation
+
+- [Configuration](docs/config.md)
+- [HTTP Requests/Response](docs/http.md)
+- [Creating Resources](docs/resource.md)
+- [Code Recipes](docs/recipes.md)
+- [API Reference](docs/api.md)
+
+## Changelog
+
+Details changes for each release are documented in the [release notes](https://github.com/pagekit/vue-resource/releases).
+
+## Contribution
+
+If you find a bug or want to contribute to the code or documentation, you can help by submitting an [issue](https://github.com/pagekit/vue-resource/issues) or a [pull request](https://github.com/pagekit/vue-resource/pulls).
+
+## License
+
+[MIT](http://opensource.org/licenses/MIT)
diff --git a/advancedcontentfilter/vendor/npm-asset/vue-resource/dist/README.md b/advancedcontentfilter/vendor/npm-asset/vue-resource/dist/README.md
new file mode 100644 (file)
index 0000000..b664d20
--- /dev/null
@@ -0,0 +1,3 @@
+# NOTE!
+
+The `dist` folder contains the standalone build for vue-resource, however files here are only checked-in when a release happens. If you are on the `dev` branch, files here are **NOT** up to date. Only the `master` branch contains the built files for the latest stable version.
diff --git a/advancedcontentfilter/vendor/npm-asset/vue-resource/dist/vue-resource.common.js b/advancedcontentfilter/vendor/npm-asset/vue-resource/dist/vue-resource.common.js
new file mode 100644 (file)
index 0000000..9bc863d
--- /dev/null
@@ -0,0 +1,1557 @@
+/*!
+ * vue-resource v1.5.0
+ * https://github.com/pagekit/vue-resource
+ * Released under the MIT License.
+ */
+
+'use strict';
+
+/**
+ * Promises/A+ polyfill v1.1.4 (https://github.com/bramstein/promis)
+ */
+
+var RESOLVED = 0;
+var REJECTED = 1;
+var PENDING = 2;
+
+function Promise$1(executor) {
+
+    this.state = PENDING;
+    this.value = undefined;
+    this.deferred = [];
+
+    var promise = this;
+
+    try {
+        executor(function (x) {
+            promise.resolve(x);
+        }, function (r) {
+            promise.reject(r);
+        });
+    } catch (e) {
+        promise.reject(e);
+    }
+}
+
+Promise$1.reject = function (r) {
+    return new Promise$1(function (resolve, reject) {
+        reject(r);
+    });
+};
+
+Promise$1.resolve = function (x) {
+    return new Promise$1(function (resolve, reject) {
+        resolve(x);
+    });
+};
+
+Promise$1.all = function all(iterable) {
+    return new Promise$1(function (resolve, reject) {
+        var count = 0, result = [];
+
+        if (iterable.length === 0) {
+            resolve(result);
+        }
+
+        function resolver(i) {
+            return function (x) {
+                result[i] = x;
+                count += 1;
+
+                if (count === iterable.length) {
+                    resolve(result);
+                }
+            };
+        }
+
+        for (var i = 0; i < iterable.length; i += 1) {
+            Promise$1.resolve(iterable[i]).then(resolver(i), reject);
+        }
+    });
+};
+
+Promise$1.race = function race(iterable) {
+    return new Promise$1(function (resolve, reject) {
+        for (var i = 0; i < iterable.length; i += 1) {
+            Promise$1.resolve(iterable[i]).then(resolve, reject);
+        }
+    });
+};
+
+var p = Promise$1.prototype;
+
+p.resolve = function resolve(x) {
+    var promise = this;
+
+    if (promise.state === PENDING) {
+        if (x === promise) {
+            throw new TypeError('Promise settled with itself.');
+        }
+
+        var called = false;
+
+        try {
+            var then = x && x['then'];
+
+            if (x !== null && typeof x === 'object' && typeof then === 'function') {
+                then.call(x, function (x) {
+                    if (!called) {
+                        promise.resolve(x);
+                    }
+                    called = true;
+
+                }, function (r) {
+                    if (!called) {
+                        promise.reject(r);
+                    }
+                    called = true;
+                });
+                return;
+            }
+        } catch (e) {
+            if (!called) {
+                promise.reject(e);
+            }
+            return;
+        }
+
+        promise.state = RESOLVED;
+        promise.value = x;
+        promise.notify();
+    }
+};
+
+p.reject = function reject(reason) {
+    var promise = this;
+
+    if (promise.state === PENDING) {
+        if (reason === promise) {
+            throw new TypeError('Promise settled with itself.');
+        }
+
+        promise.state = REJECTED;
+        promise.value = reason;
+        promise.notify();
+    }
+};
+
+p.notify = function notify() {
+    var promise = this;
+
+    nextTick(function () {
+        if (promise.state !== PENDING) {
+            while (promise.deferred.length) {
+                var deferred = promise.deferred.shift(),
+                    onResolved = deferred[0],
+                    onRejected = deferred[1],
+                    resolve = deferred[2],
+                    reject = deferred[3];
+
+                try {
+                    if (promise.state === RESOLVED) {
+                        if (typeof onResolved === 'function') {
+                            resolve(onResolved.call(undefined, promise.value));
+                        } else {
+                            resolve(promise.value);
+                        }
+                    } else if (promise.state === REJECTED) {
+                        if (typeof onRejected === 'function') {
+                            resolve(onRejected.call(undefined, promise.value));
+                        } else {
+                            reject(promise.value);
+                        }
+                    }
+                } catch (e) {
+                    reject(e);
+                }
+            }
+        }
+    });
+};
+
+p.then = function then(onResolved, onRejected) {
+    var promise = this;
+
+    return new Promise$1(function (resolve, reject) {
+        promise.deferred.push([onResolved, onRejected, resolve, reject]);
+        promise.notify();
+    });
+};
+
+p.catch = function (onRejected) {
+    return this.then(undefined, onRejected);
+};
+
+/**
+ * Promise adapter.
+ */
+
+if (typeof Promise === 'undefined') {
+    window.Promise = Promise$1;
+}
+
+function PromiseObj(executor, context) {
+
+    if (executor instanceof Promise) {
+        this.promise = executor;
+    } else {
+        this.promise = new Promise(executor.bind(context));
+    }
+
+    this.context = context;
+}
+
+PromiseObj.all = function (iterable, context) {
+    return new PromiseObj(Promise.all(iterable), context);
+};
+
+PromiseObj.resolve = function (value, context) {
+    return new PromiseObj(Promise.resolve(value), context);
+};
+
+PromiseObj.reject = function (reason, context) {
+    return new PromiseObj(Promise.reject(reason), context);
+};
+
+PromiseObj.race = function (iterable, context) {
+    return new PromiseObj(Promise.race(iterable), context);
+};
+
+var p$1 = PromiseObj.prototype;
+
+p$1.bind = function (context) {
+    this.context = context;
+    return this;
+};
+
+p$1.then = function (fulfilled, rejected) {
+
+    if (fulfilled && fulfilled.bind && this.context) {
+        fulfilled = fulfilled.bind(this.context);
+    }
+
+    if (rejected && rejected.bind && this.context) {
+        rejected = rejected.bind(this.context);
+    }
+
+    return new PromiseObj(this.promise.then(fulfilled, rejected), this.context);
+};
+
+p$1.catch = function (rejected) {
+
+    if (rejected && rejected.bind && this.context) {
+        rejected = rejected.bind(this.context);
+    }
+
+    return new PromiseObj(this.promise.catch(rejected), this.context);
+};
+
+p$1.finally = function (callback) {
+
+    return this.then(function (value) {
+        callback.call(this);
+        return value;
+    }, function (reason) {
+        callback.call(this);
+        return Promise.reject(reason);
+    }
+    );
+};
+
+/**
+ * Utility functions.
+ */
+
+var ref = {};
+var hasOwnProperty = ref.hasOwnProperty;
+var ref$1 = [];
+var slice = ref$1.slice;
+var debug = false, ntick;
+
+var inBrowser = typeof window !== 'undefined';
+
+function Util (ref) {
+    var config = ref.config;
+    var nextTick = ref.nextTick;
+
+    ntick = nextTick;
+    debug = config.debug || !config.silent;
+}
+
+function warn(msg) {
+    if (typeof console !== 'undefined' && debug) {
+        console.warn('[VueResource warn]: ' + msg);
+    }
+}
+
+function error(msg) {
+    if (typeof console !== 'undefined') {
+        console.error(msg);
+    }
+}
+
+function nextTick(cb, ctx) {
+    return ntick(cb, ctx);
+}
+
+function trim(str) {
+    return str ? str.replace(/^\s*|\s*$/g, '') : '';
+}
+
+function trimEnd(str, chars) {
+
+    if (str && chars === undefined) {
+        return str.replace(/\s+$/, '');
+    }
+
+    if (!str || !chars) {
+        return str;
+    }
+
+    return str.replace(new RegExp(("[" + chars + "]+$")), '');
+}
+
+function toLower(str) {
+    return str ? str.toLowerCase() : '';
+}
+
+function toUpper(str) {
+    return str ? str.toUpperCase() : '';
+}
+
+var isArray = Array.isArray;
+
+function isString(val) {
+    return typeof val === 'string';
+}
+
+function isFunction(val) {
+    return typeof val === 'function';
+}
+
+function isObject(obj) {
+    return obj !== null && typeof obj === 'object';
+}
+
+function isPlainObject(obj) {
+    return isObject(obj) && Object.getPrototypeOf(obj) == Object.prototype;
+}
+
+function isBlob(obj) {
+    return typeof Blob !== 'undefined' && obj instanceof Blob;
+}
+
+function isFormData(obj) {
+    return typeof FormData !== 'undefined' && obj instanceof FormData;
+}
+
+function when(value, fulfilled, rejected) {
+
+    var promise = PromiseObj.resolve(value);
+
+    if (arguments.length < 2) {
+        return promise;
+    }
+
+    return promise.then(fulfilled, rejected);
+}
+
+function options(fn, obj, opts) {
+
+    opts = opts || {};
+
+    if (isFunction(opts)) {
+        opts = opts.call(obj);
+    }
+
+    return merge(fn.bind({$vm: obj, $options: opts}), fn, {$options: opts});
+}
+
+function each(obj, iterator) {
+
+    var i, key;
+
+    if (isArray(obj)) {
+        for (i = 0; i < obj.length; i++) {
+            iterator.call(obj[i], obj[i], i);
+        }
+    } else if (isObject(obj)) {
+        for (key in obj) {
+            if (hasOwnProperty.call(obj, key)) {
+                iterator.call(obj[key], obj[key], key);
+            }
+        }
+    }
+
+    return obj;
+}
+
+var assign = Object.assign || _assign;
+
+function merge(target) {
+
+    var args = slice.call(arguments, 1);
+
+    args.forEach(function (source) {
+        _merge(target, source, true);
+    });
+
+    return target;
+}
+
+function defaults(target) {
+
+    var args = slice.call(arguments, 1);
+
+    args.forEach(function (source) {
+
+        for (var key in source) {
+            if (target[key] === undefined) {
+                target[key] = source[key];
+            }
+        }
+
+    });
+
+    return target;
+}
+
+function _assign(target) {
+
+    var args = slice.call(arguments, 1);
+
+    args.forEach(function (source) {
+        _merge(target, source);
+    });
+
+    return target;
+}
+
+function _merge(target, source, deep) {
+    for (var key in source) {
+        if (deep && (isPlainObject(source[key]) || isArray(source[key]))) {
+            if (isPlainObject(source[key]) && !isPlainObject(target[key])) {
+                target[key] = {};
+            }
+            if (isArray(source[key]) && !isArray(target[key])) {
+                target[key] = [];
+            }
+            _merge(target[key], source[key], deep);
+        } else if (source[key] !== undefined) {
+            target[key] = source[key];
+        }
+    }
+}
+
+/**
+ * Root Prefix Transform.
+ */
+
+function root (options$$1, next) {
+
+    var url = next(options$$1);
+
+    if (isString(options$$1.root) && !/^(https?:)?\//.test(url)) {
+        url = trimEnd(options$$1.root, '/') + '/' + url;
+    }
+
+    return url;
+}
+
+/**
+ * Query Parameter Transform.
+ */
+
+function query (options$$1, next) {
+
+    var urlParams = Object.keys(Url.options.params), query = {}, url = next(options$$1);
+
+    each(options$$1.params, function (value, key) {
+        if (urlParams.indexOf(key) === -1) {
+            query[key] = value;
+        }
+    });
+
+    query = Url.params(query);
+
+    if (query) {
+        url += (url.indexOf('?') == -1 ? '?' : '&') + query;
+    }
+
+    return url;
+}
+
+/**
+ * URL Template v2.0.6 (https://github.com/bramstein/url-template)
+ */
+
+function expand(url, params, variables) {
+
+    var tmpl = parse(url), expanded = tmpl.expand(params);
+
+    if (variables) {
+        variables.push.apply(variables, tmpl.vars);
+    }
+
+    return expanded;
+}
+
+function parse(template) {
+
+    var operators = ['+', '#', '.', '/', ';', '?', '&'], variables = [];
+
+    return {
+        vars: variables,
+        expand: function expand(context) {
+            return template.replace(/\{([^{}]+)\}|([^{}]+)/g, function (_, expression, literal) {
+                if (expression) {
+
+                    var operator = null, values = [];
+
+                    if (operators.indexOf(expression.charAt(0)) !== -1) {
+                        operator = expression.charAt(0);
+                        expression = expression.substr(1);
+                    }
+
+                    expression.split(/,/g).forEach(function (variable) {
+                        var tmp = /([^:*]*)(?::(\d+)|(\*))?/.exec(variable);
+                        values.push.apply(values, getValues(context, operator, tmp[1], tmp[2] || tmp[3]));
+                        variables.push(tmp[1]);
+                    });
+
+                    if (operator && operator !== '+') {
+
+                        var separator = ',';
+
+                        if (operator === '?') {
+                            separator = '&';
+                        } else if (operator !== '#') {
+                            separator = operator;
+                        }
+
+                        return (values.length !== 0 ? operator : '') + values.join(separator);
+                    } else {
+                        return values.join(',');
+                    }
+
+                } else {
+                    return encodeReserved(literal);
+                }
+            });
+        }
+    };
+}
+
+function getValues(context, operator, key, modifier) {
+
+    var value = context[key], result = [];
+
+    if (isDefined(value) && value !== '') {
+        if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {
+            value = value.toString();
+
+            if (modifier && modifier !== '*') {
+                value = value.substring(0, parseInt(modifier, 10));
+            }
+
+            result.push(encodeValue(operator, value, isKeyOperator(operator) ? key : null));
+        } else {
+            if (modifier === '*') {
+                if (Array.isArray(value)) {
+                    value.filter(isDefined).forEach(function (value) {
+                        result.push(encodeValue(operator, value, isKeyOperator(operator) ? key : null));
+                    });
+                } else {
+                    Object.keys(value).forEach(function (k) {
+                        if (isDefined(value[k])) {
+                            result.push(encodeValue(operator, value[k], k));
+                        }
+                    });
+                }
+            } else {
+                var tmp = [];
+
+                if (Array.isArray(value)) {
+                    value.filter(isDefined).forEach(function (value) {
+                        tmp.push(encodeValue(operator, value));
+                    });
+                } else {
+                    Object.keys(value).forEach(function (k) {
+                        if (isDefined(value[k])) {
+                            tmp.push(encodeURIComponent(k));
+                            tmp.push(encodeValue(operator, value[k].toString()));
+                        }
+                    });
+                }
+
+                if (isKeyOperator(operator)) {
+                    result.push(encodeURIComponent(key) + '=' + tmp.join(','));
+                } else if (tmp.length !== 0) {
+                    result.push(tmp.join(','));
+                }
+            }
+        }
+    } else {
+        if (operator === ';') {
+            result.push(encodeURIComponent(key));
+        } else if (value === '' && (operator === '&' || operator === '?')) {
+            result.push(encodeURIComponent(key) + '=');
+        } else if (value === '') {
+            result.push('');
+        }
+    }
+
+    return result;
+}
+
+function isDefined(value) {
+    return value !== undefined && value !== null;
+}
+
+function isKeyOperator(operator) {
+    return operator === ';' || operator === '&' || operator === '?';
+}
+
+function encodeValue(operator, value, key) {
+
+    value = (operator === '+' || operator === '#') ? encodeReserved(value) : encodeURIComponent(value);
+
+    if (key) {
+        return encodeURIComponent(key) + '=' + value;
+    } else {
+        return value;
+    }
+}
+
+function encodeReserved(str) {
+    return str.split(/(%[0-9A-Fa-f]{2})/g).map(function (part) {
+        if (!/%[0-9A-Fa-f]/.test(part)) {
+            part = encodeURI(part);
+        }
+        return part;
+    }).join('');
+}
+
+/**
+ * URL Template (RFC 6570) Transform.
+ */
+
+function template (options) {
+
+    var variables = [], url = expand(options.url, options.params, variables);
+
+    variables.forEach(function (key) {
+        delete options.params[key];
+    });
+
+    return url;
+}
+
+/**
+ * Service for URL templating.
+ */
+
+function Url(url, params) {
+
+    var self = this || {}, options$$1 = url, transform;
+
+    if (isString(url)) {
+        options$$1 = {url: url, params: params};
+    }
+
+    options$$1 = merge({}, Url.options, self.$options, options$$1);
+
+    Url.transforms.forEach(function (handler) {
+
+        if (isString(handler)) {
+            handler = Url.transform[handler];
+        }
+
+        if (isFunction(handler)) {
+            transform = factory(handler, transform, self.$vm);
+        }
+
+    });
+
+    return transform(options$$1);
+}
+
+/**
+ * Url options.
+ */
+
+Url.options = {
+    url: '',
+    root: null,
+    params: {}
+};
+
+/**
+ * Url transforms.
+ */
+
+Url.transform = {template: template, query: query, root: root};
+Url.transforms = ['template', 'query', 'root'];
+
+/**
+ * Encodes a Url parameter string.
+ *
+ * @param {Object} obj
+ */
+
+Url.params = function (obj) {
+
+    var params = [], escape = encodeURIComponent;
+
+    params.add = function (key, value) {
+
+        if (isFunction(value)) {
+            value = value();
+        }
+
+        if (value === null) {
+            value = '';
+        }
+
+        this.push(escape(key) + '=' + escape(value));
+    };
+
+    serialize(params, obj);
+
+    return params.join('&').replace(/%20/g, '+');
+};
+
+/**
+ * Parse a URL and return its components.
+ *
+ * @param {String} url
+ */
+
+Url.parse = function (url) {
+
+    var el = document.createElement('a');
+
+    if (document.documentMode) {
+        el.href = url;
+        url = el.href;
+    }
+
+    el.href = url;
+
+    return {
+        href: el.href,
+        protocol: el.protocol ? el.protocol.replace(/:$/, '') : '',
+        port: el.port,
+        host: el.host,
+        hostname: el.hostname,
+        pathname: el.pathname.charAt(0) === '/' ? el.pathname : '/' + el.pathname,
+        search: el.search ? el.search.replace(/^\?/, '') : '',
+        hash: el.hash ? el.hash.replace(/^#/, '') : ''
+    };
+};
+
+function factory(handler, next, vm) {
+    return function (options$$1) {
+        return handler.call(vm, options$$1, next);
+    };
+}
+
+function serialize(params, obj, scope) {
+
+    var array = isArray(obj), plain = isPlainObject(obj), hash;
+
+    each(obj, function (value, key) {
+
+        hash = isObject(value) || isArray(value);
+
+        if (scope) {
+            key = scope + '[' + (plain || hash ? key : '') + ']';
+        }
+
+        if (!scope && array) {
+            params.add(value.name, value.value);
+        } else if (hash) {
+            serialize(params, value, key);
+        } else {
+            params.add(key, value);
+        }
+    });
+}
+
+/**
+ * XDomain client (Internet Explorer).
+ */
+
+function xdrClient (request) {
+    return new PromiseObj(function (resolve) {
+
+        var xdr = new XDomainRequest(), handler = function (ref) {
+                var type = ref.type;
+
+
+                var status = 0;
+
+                if (type === 'load') {
+                    status = 200;
+                } else if (type === 'error') {
+                    status = 500;
+                }
+
+                resolve(request.respondWith(xdr.responseText, {status: status}));
+            };
+
+        request.abort = function () { return xdr.abort(); };
+
+        xdr.open(request.method, request.getUrl());
+
+        if (request.timeout) {
+            xdr.timeout = request.timeout;
+        }
+
+        xdr.onload = handler;
+        xdr.onabort = handler;
+        xdr.onerror = handler;
+        xdr.ontimeout = handler;
+        xdr.onprogress = function () {};
+        xdr.send(request.getBody());
+    });
+}
+
+/**
+ * CORS Interceptor.
+ */
+
+var SUPPORTS_CORS = inBrowser && 'withCredentials' in new XMLHttpRequest();
+
+function cors (request) {
+
+    if (inBrowser) {
+
+        var orgUrl = Url.parse(location.href);
+        var reqUrl = Url.parse(request.getUrl());
+
+        if (reqUrl.protocol !== orgUrl.protocol || reqUrl.host !== orgUrl.host) {
+
+            request.crossOrigin = true;
+            request.emulateHTTP = false;
+
+            if (!SUPPORTS_CORS) {
+                request.client = xdrClient;
+            }
+        }
+    }
+
+}
+
+/**
+ * Form data Interceptor.
+ */
+
+function form (request) {
+
+    if (isFormData(request.body)) {
+        request.headers.delete('Content-Type');
+    } else if (isObject(request.body) && request.emulateJSON) {
+        request.body = Url.params(request.body);
+        request.headers.set('Content-Type', 'application/x-www-form-urlencoded');
+    }
+
+}
+
+/**
+ * JSON Interceptor.
+ */
+
+function json (request) {
+
+    var type = request.headers.get('Content-Type') || '';
+
+    if (isObject(request.body) && type.indexOf('application/json') === 0) {
+        request.body = JSON.stringify(request.body);
+    }
+
+    return function (response) {
+
+        return response.bodyText ? when(response.text(), function (text) {
+
+            var type = response.headers.get('Content-Type') || '';
+
+            if (type.indexOf('application/json') === 0 || isJson(text)) {
+
+                try {
+                    response.body = JSON.parse(text);
+                } catch (e) {
+                    response.body = null;
+                }
+
+            } else {
+                response.body = text;
+            }
+
+            return response;
+
+        }) : response;
+
+    };
+}
+
+function isJson(str) {
+
+    var start = str.match(/^\s*(\[|\{)/);
+    var end = {'[': /]\s*$/, '{': /}\s*$/};
+
+    return start && end[start[1]].test(str);
+}
+
+/**
+ * JSONP client (Browser).
+ */
+
+function jsonpClient (request) {
+    return new PromiseObj(function (resolve) {
+
+        var name = request.jsonp || 'callback', callback = request.jsonpCallback || '_jsonp' + Math.random().toString(36).substr(2), body = null, handler, script;
+
+        handler = function (ref) {
+            var type = ref.type;
+
+
+            var status = 0;
+
+            if (type === 'load' && body !== null) {
+                status = 200;
+            } else if (type === 'error') {
+                status = 500;
+            }
+
+            if (status && window[callback]) {
+                delete window[callback];
+                document.body.removeChild(script);
+            }
+
+            resolve(request.respondWith(body, {status: status}));
+        };
+
+        window[callback] = function (result) {
+            body = JSON.stringify(result);
+        };
+
+        request.abort = function () {
+            handler({type: 'abort'});
+        };
+
+        request.params[name] = callback;
+
+        if (request.timeout) {
+            setTimeout(request.abort, request.timeout);
+        }
+
+        script = document.createElement('script');
+        script.src = request.getUrl();
+        script.type = 'text/javascript';
+        script.async = true;
+        script.onload = handler;
+        script.onerror = handler;
+
+        document.body.appendChild(script);
+    });
+}
+
+/**
+ * JSONP Interceptor.
+ */
+
+function jsonp (request) {
+
+    if (request.method == 'JSONP') {
+        request.client = jsonpClient;
+    }
+
+}
+
+/**
+ * Before Interceptor.
+ */
+
+function before (request) {
+
+    if (isFunction(request.before)) {
+        request.before.call(this, request);
+    }
+
+}
+
+/**
+ * HTTP method override Interceptor.
+ */
+
+function method (request) {
+
+    if (request.emulateHTTP && /^(PUT|PATCH|DELETE)$/i.test(request.method)) {
+        request.headers.set('X-HTTP-Method-Override', request.method);
+        request.method = 'POST';
+    }
+
+}
+
+/**
+ * Header Interceptor.
+ */
+
+function header (request) {
+
+    var headers = assign({}, Http.headers.common,
+        !request.crossOrigin ? Http.headers.custom : {},
+        Http.headers[toLower(request.method)]
+    );
+
+    each(headers, function (value, name) {
+        if (!request.headers.has(name)) {
+            request.headers.set(name, value);
+        }
+    });
+
+}
+
+/**
+ * XMLHttp client (Browser).
+ */
+
+function xhrClient (request) {
+    return new PromiseObj(function (resolve) {
+
+        var xhr = new XMLHttpRequest(), handler = function (event) {
+
+                var response = request.respondWith(
+                'response' in xhr ? xhr.response : xhr.responseText, {
+                    status: xhr.status === 1223 ? 204 : xhr.status, // IE9 status bug
+                    statusText: xhr.status === 1223 ? 'No Content' : trim(xhr.statusText)
+                });
+
+                each(trim(xhr.getAllResponseHeaders()).split('\n'), function (row) {
+                    response.headers.append(row.slice(0, row.indexOf(':')), row.slice(row.indexOf(':') + 1));
+                });
+
+                resolve(response);
+            };
+
+        request.abort = function () { return xhr.abort(); };
+
+        xhr.open(request.method, request.getUrl(), true);
+
+        if (request.timeout) {
+            xhr.timeout = request.timeout;
+        }
+
+        if (request.responseType && 'responseType' in xhr) {
+            xhr.responseType = request.responseType;
+        }
+
+        if (request.withCredentials || request.credentials) {
+            xhr.withCredentials = true;
+        }
+
+        if (!request.crossOrigin) {
+            request.headers.set('X-Requested-With', 'XMLHttpRequest');
+        }
+
+        // deprecated use downloadProgress
+        if (isFunction(request.progress) && request.method === 'GET') {
+            xhr.addEventListener('progress', request.progress);
+        }
+
+        if (isFunction(request.downloadProgress)) {
+            xhr.addEventListener('progress', request.downloadProgress);
+        }
+
+        // deprecated use uploadProgress
+        if (isFunction(request.progress) && /^(POST|PUT)$/i.test(request.method)) {
+            xhr.upload.addEventListener('progress', request.progress);
+        }
+
+        if (isFunction(request.uploadProgress) && xhr.upload) {
+            xhr.upload.addEventListener('progress', request.uploadProgress);
+        }
+
+        request.headers.forEach(function (value, name) {
+            xhr.setRequestHeader(name, value);
+        });
+
+        xhr.onload = handler;
+        xhr.onabort = handler;
+        xhr.onerror = handler;
+        xhr.ontimeout = handler;
+        xhr.send(request.getBody());
+    });
+}
+
+/**
+ * Http client (Node).
+ */
+
+function nodeClient (request) {
+
+    var client = require('got');
+
+    return new PromiseObj(function (resolve) {
+
+        var url = request.getUrl();
+        var body = request.getBody();
+        var method = request.method;
+        var headers = {}, handler;
+
+        request.headers.forEach(function (value, name) {
+            headers[name] = value;
+        });
+
+        client(url, {body: body, method: method, headers: headers}).then(handler = function (resp) {
+
+            var response = request.respondWith(resp.body, {
+                status: resp.statusCode,
+                statusText: trim(resp.statusMessage)
+            });
+
+            each(resp.headers, function (value, name) {
+                response.headers.set(name, value);
+            });
+
+            resolve(response);
+
+        }, function (error$$1) { return handler(error$$1.response); });
+    });
+}
+
+/**
+ * Base client.
+ */
+
+function Client (context) {
+
+    var reqHandlers = [sendRequest], resHandlers = [];
+
+    if (!isObject(context)) {
+        context = null;
+    }
+
+    function Client(request) {
+        while (reqHandlers.length) {
+
+            var handler = reqHandlers.pop();
+
+            if (isFunction(handler)) {
+
+                var response = (void 0), next = (void 0);
+
+                response = handler.call(context, request, function (val) { return next = val; }) || next;
+
+                if (isObject(response)) {
+                    return new PromiseObj(function (resolve, reject) {
+
+                        resHandlers.forEach(function (handler) {
+                            response = when(response, function (response) {
+                                return handler.call(context, response) || response;
+                            }, reject);
+                        });
+
+                        when(response, resolve, reject);
+
+                    }, context);
+                }
+
+                if (isFunction(response)) {
+                    resHandlers.unshift(response);
+                }
+
+            } else {
+                warn(("Invalid interceptor of type " + (typeof handler) + ", must be a function"));
+            }
+        }
+    }
+
+    Client.use = function (handler) {
+        reqHandlers.push(handler);
+    };
+
+    return Client;
+}
+
+function sendRequest(request) {
+
+    var client = request.client || (inBrowser ? xhrClient : nodeClient);
+
+    return client(request);
+}
+
+/**
+ * HTTP Headers.
+ */
+
+var Headers = function Headers(headers) {
+    var this$1 = this;
+
+
+    this.map = {};
+
+    each(headers, function (value, name) { return this$1.append(name, value); });
+};
+
+Headers.prototype.has = function has (name) {
+    return getName(this.map, name) !== null;
+};
+
+Headers.prototype.get = function get (name) {
+
+    var list = this.map[getName(this.map, name)];
+
+    return list ? list.join() : null;
+};
+
+Headers.prototype.getAll = function getAll (name) {
+    return this.map[getName(this.map, name)] || [];
+};
+
+Headers.prototype.set = function set (name, value) {
+    this.map[normalizeName(getName(this.map, name) || name)] = [trim(value)];
+};
+
+Headers.prototype.append = function append (name, value) {
+
+    var list = this.map[getName(this.map, name)];
+
+    if (list) {
+        list.push(trim(value));
+    } else {
+        this.set(name, value);
+    }
+};
+
+Headers.prototype.delete = function delete$1 (name) {
+    delete this.map[getName(this.map, name)];
+};
+
+Headers.prototype.deleteAll = function deleteAll () {
+    this.map = {};
+};
+
+Headers.prototype.forEach = function forEach (callback, thisArg) {
+        var this$1 = this;
+
+    each(this.map, function (list, name) {
+        each(list, function (value) { return callback.call(thisArg, value, name, this$1); });
+    });
+};
+
+function getName(map, name) {
+    return Object.keys(map).reduce(function (prev, curr) {
+        return toLower(name) === toLower(curr) ? curr : prev;
+    }, null);
+}
+
+function normalizeName(name) {
+
+    if (/[^a-z0-9\-#$%&'*+.^_`|~]/i.test(name)) {
+        throw new TypeError('Invalid character in header field name');
+    }
+
+    return trim(name);
+}
+
+/**
+ * HTTP Response.
+ */
+
+var Response = function Response(body, ref) {
+    var url = ref.url;
+    var headers = ref.headers;
+    var status = ref.status;
+    var statusText = ref.statusText;
+
+
+    this.url = url;
+    this.ok = status >= 200 && status < 300;
+    this.status = status || 0;
+    this.statusText = statusText || '';
+    this.headers = new Headers(headers);
+    this.body = body;
+
+    if (isString(body)) {
+
+        this.bodyText = body;
+
+    } else if (isBlob(body)) {
+
+        this.bodyBlob = body;
+
+        if (isBlobText(body)) {
+            this.bodyText = blobText(body);
+        }
+    }
+};
+
+Response.prototype.blob = function blob () {
+    return when(this.bodyBlob);
+};
+
+Response.prototype.text = function text () {
+    return when(this.bodyText);
+};
+
+Response.prototype.json = function json () {
+    return when(this.text(), function (text) { return JSON.parse(text); });
+};
+
+Object.defineProperty(Response.prototype, 'data', {
+
+    get: function get() {
+        return this.body;
+    },
+
+    set: function set(body) {
+        this.body = body;
+    }
+
+});
+
+function blobText(body) {
+    return new PromiseObj(function (resolve) {
+
+        var reader = new FileReader();
+
+        reader.readAsText(body);
+        reader.onload = function () {
+            resolve(reader.result);
+        };
+
+    });
+}
+
+function isBlobText(body) {
+    return body.type.indexOf('text') === 0 || body.type.indexOf('json') !== -1;
+}
+
+/**
+ * HTTP Request.
+ */
+
+var Request = function Request(options$$1) {
+
+    this.body = null;
+    this.params = {};
+
+    assign(this, options$$1, {
+        method: toUpper(options$$1.method || 'GET')
+    });
+
+    if (!(this.headers instanceof Headers)) {
+        this.headers = new Headers(this.headers);
+    }
+};
+
+Request.prototype.getUrl = function getUrl () {
+    return Url(this);
+};
+
+Request.prototype.getBody = function getBody () {
+    return this.body;
+};
+
+Request.prototype.respondWith = function respondWith (body, options$$1) {
+    return new Response(body, assign(options$$1 || {}, {url: this.getUrl()}));
+};
+
+/**
+ * Service for sending network requests.
+ */
+
+var COMMON_HEADERS = {'Accept': 'application/json, text/plain, */*'};
+var JSON_CONTENT_TYPE = {'Content-Type': 'application/json;charset=utf-8'};
+
+function Http(options$$1) {
+
+    var self = this || {}, client = Client(self.$vm);
+
+    defaults(options$$1 || {}, self.$options, Http.options);
+
+    Http.interceptors.forEach(function (handler) {
+
+        if (isString(handler)) {
+            handler = Http.interceptor[handler];
+        }
+
+        if (isFunction(handler)) {
+            client.use(handler);
+        }
+
+    });
+
+    return client(new Request(options$$1)).then(function (response) {
+
+        return response.ok ? response : PromiseObj.reject(response);
+
+    }, function (response) {
+
+        if (response instanceof Error) {
+            error(response);
+        }
+
+        return PromiseObj.reject(response);
+    });
+}
+
+Http.options = {};
+
+Http.headers = {
+    put: JSON_CONTENT_TYPE,
+    post: JSON_CONTENT_TYPE,
+    patch: JSON_CONTENT_TYPE,
+    delete: JSON_CONTENT_TYPE,
+    common: COMMON_HEADERS,
+    custom: {}
+};
+
+Http.interceptor = {before: before, method: method, jsonp: jsonp, json: json, form: form, header: header, cors: cors};
+Http.interceptors = ['before', 'method', 'jsonp', 'json', 'form', 'header', 'cors'];
+
+['get', 'delete', 'head', 'jsonp'].forEach(function (method$$1) {
+
+    Http[method$$1] = function (url, options$$1) {
+        return this(assign(options$$1 || {}, {url: url, method: method$$1}));
+    };
+
+});
+
+['post', 'put', 'patch'].forEach(function (method$$1) {
+
+    Http[method$$1] = function (url, body, options$$1) {
+        return this(assign(options$$1 || {}, {url: url, method: method$$1, body: body}));
+    };
+
+});
+
+/**
+ * Service for interacting with RESTful services.
+ */
+
+function Resource(url, params, actions, options$$1) {
+
+    var self = this || {}, resource = {};
+
+    actions = assign({},
+        Resource.actions,
+        actions
+    );
+
+    each(actions, function (action, name) {
+
+        action = merge({url: url, params: assign({}, params)}, options$$1, action);
+
+        resource[name] = function () {
+            return (self.$http || Http)(opts(action, arguments));
+        };
+    });
+
+    return resource;
+}
+
+function opts(action, args) {
+
+    var options$$1 = assign({}, action), params = {}, body;
+
+    switch (args.length) {
+
+        case 2:
+
+            params = args[0];
+            body = args[1];
+
+            break;
+
+        case 1:
+
+            if (/^(POST|PUT|PATCH)$/i.test(options$$1.method)) {
+                body = args[0];
+            } else {
+                params = args[0];
+            }
+
+            break;
+
+        case 0:
+
+            break;
+
+        default:
+
+            throw 'Expected up to 2 arguments [params, body], got ' + args.length + ' arguments';
+    }
+
+    options$$1.body = body;
+    options$$1.params = assign({}, options$$1.params, params);
+
+    return options$$1;
+}
+
+Resource.actions = {
+
+    get: {method: 'GET'},
+    save: {method: 'POST'},
+    query: {method: 'GET'},
+    update: {method: 'PUT'},
+    remove: {method: 'DELETE'},
+    delete: {method: 'DELETE'}
+
+};
+
+/**
+ * Install plugin.
+ */
+
+function plugin(Vue) {
+
+    if (plugin.installed) {
+        return;
+    }
+
+    Util(Vue);
+
+    Vue.url = Url;
+    Vue.http = Http;
+    Vue.resource = Resource;
+    Vue.Promise = PromiseObj;
+
+    Object.defineProperties(Vue.prototype, {
+
+        $url: {
+            get: function get() {
+                return options(Vue.url, this, this.$options.url);
+            }
+        },
+
+        $http: {
+            get: function get() {
+                return options(Vue.http, this, this.$options.http);
+            }
+        },
+
+        $resource: {
+            get: function get() {
+                return Vue.resource.bind(this);
+            }
+        },
+
+        $promise: {
+            get: function get() {
+                var this$1 = this;
+
+                return function (executor) { return new Vue.Promise(executor, this$1); };
+            }
+        }
+
+    });
+}
+
+if (typeof window !== 'undefined' && window.Vue) {
+    window.Vue.use(plugin);
+}
+
+module.exports = plugin;
diff --git a/advancedcontentfilter/vendor/npm-asset/vue-resource/dist/vue-resource.esm.js b/advancedcontentfilter/vendor/npm-asset/vue-resource/dist/vue-resource.esm.js
new file mode 100644 (file)
index 0000000..08303bc
--- /dev/null
@@ -0,0 +1,1556 @@
+/*!
+ * vue-resource v1.5.0
+ * https://github.com/pagekit/vue-resource
+ * Released under the MIT License.
+ */
+
+/**
+ * Promises/A+ polyfill v1.1.4 (https://github.com/bramstein/promis)
+ */
+
+var RESOLVED = 0;
+var REJECTED = 1;
+var PENDING = 2;
+
+function Promise$1(executor) {
+
+    this.state = PENDING;
+    this.value = undefined;
+    this.deferred = [];
+
+    var promise = this;
+
+    try {
+        executor(function (x) {
+            promise.resolve(x);
+        }, function (r) {
+            promise.reject(r);
+        });
+    } catch (e) {
+        promise.reject(e);
+    }
+}
+
+Promise$1.reject = function (r) {
+    return new Promise$1(function (resolve, reject) {
+        reject(r);
+    });
+};
+
+Promise$1.resolve = function (x) {
+    return new Promise$1(function (resolve, reject) {
+        resolve(x);
+    });
+};
+
+Promise$1.all = function all(iterable) {
+    return new Promise$1(function (resolve, reject) {
+        var count = 0, result = [];
+
+        if (iterable.length === 0) {
+            resolve(result);
+        }
+
+        function resolver(i) {
+            return function (x) {
+                result[i] = x;
+                count += 1;
+
+                if (count === iterable.length) {
+                    resolve(result);
+                }
+            };
+        }
+
+        for (var i = 0; i < iterable.length; i += 1) {
+            Promise$1.resolve(iterable[i]).then(resolver(i), reject);
+        }
+    });
+};
+
+Promise$1.race = function race(iterable) {
+    return new Promise$1(function (resolve, reject) {
+        for (var i = 0; i < iterable.length; i += 1) {
+            Promise$1.resolve(iterable[i]).then(resolve, reject);
+        }
+    });
+};
+
+var p = Promise$1.prototype;
+
+p.resolve = function resolve(x) {
+    var promise = this;
+
+    if (promise.state === PENDING) {
+        if (x === promise) {
+            throw new TypeError('Promise settled with itself.');
+        }
+
+        var called = false;
+
+        try {
+            var then = x && x['then'];
+
+            if (x !== null && typeof x === 'object' && typeof then === 'function') {
+                then.call(x, function (x) {
+                    if (!called) {
+                        promise.resolve(x);
+                    }
+                    called = true;
+
+                }, function (r) {
+                    if (!called) {
+                        promise.reject(r);
+                    }
+                    called = true;
+                });
+                return;
+            }
+        } catch (e) {
+            if (!called) {
+                promise.reject(e);
+            }
+            return;
+        }
+
+        promise.state = RESOLVED;
+        promise.value = x;
+        promise.notify();
+    }
+};
+
+p.reject = function reject(reason) {
+    var promise = this;
+
+    if (promise.state === PENDING) {
+        if (reason === promise) {
+            throw new TypeError('Promise settled with itself.');
+        }
+
+        promise.state = REJECTED;
+        promise.value = reason;
+        promise.notify();
+    }
+};
+
+p.notify = function notify() {
+    var promise = this;
+
+    nextTick(function () {
+        if (promise.state !== PENDING) {
+            while (promise.deferred.length) {
+                var deferred = promise.deferred.shift(),
+                    onResolved = deferred[0],
+                    onRejected = deferred[1],
+                    resolve = deferred[2],
+                    reject = deferred[3];
+
+                try {
+                    if (promise.state === RESOLVED) {
+                        if (typeof onResolved === 'function') {
+                            resolve(onResolved.call(undefined, promise.value));
+                        } else {
+                            resolve(promise.value);
+                        }
+                    } else if (promise.state === REJECTED) {
+                        if (typeof onRejected === 'function') {
+                            resolve(onRejected.call(undefined, promise.value));
+                        } else {
+                            reject(promise.value);
+                        }
+                    }
+                } catch (e) {
+                    reject(e);
+                }
+            }
+        }
+    });
+};
+
+p.then = function then(onResolved, onRejected) {
+    var promise = this;
+
+    return new Promise$1(function (resolve, reject) {
+        promise.deferred.push([onResolved, onRejected, resolve, reject]);
+        promise.notify();
+    });
+};
+
+p.catch = function (onRejected) {
+    return this.then(undefined, onRejected);
+};
+
+/**
+ * Promise adapter.
+ */
+
+if (typeof Promise === 'undefined') {
+    window.Promise = Promise$1;
+}
+
+function PromiseObj(executor, context) {
+
+    if (executor instanceof Promise) {
+        this.promise = executor;
+    } else {
+        this.promise = new Promise(executor.bind(context));
+    }
+
+    this.context = context;
+}
+
+PromiseObj.all = function (iterable, context) {
+    return new PromiseObj(Promise.all(iterable), context);
+};
+
+PromiseObj.resolve = function (value, context) {
+    return new PromiseObj(Promise.resolve(value), context);
+};
+
+PromiseObj.reject = function (reason, context) {
+    return new PromiseObj(Promise.reject(reason), context);
+};
+
+PromiseObj.race = function (iterable, context) {
+    return new PromiseObj(Promise.race(iterable), context);
+};
+
+var p$1 = PromiseObj.prototype;
+
+p$1.bind = function (context) {
+    this.context = context;
+    return this;
+};
+
+p$1.then = function (fulfilled, rejected) {
+
+    if (fulfilled && fulfilled.bind && this.context) {
+        fulfilled = fulfilled.bind(this.context);
+    }
+
+    if (rejected && rejected.bind && this.context) {
+        rejected = rejected.bind(this.context);
+    }
+
+    return new PromiseObj(this.promise.then(fulfilled, rejected), this.context);
+};
+
+p$1.catch = function (rejected) {
+
+    if (rejected && rejected.bind && this.context) {
+        rejected = rejected.bind(this.context);
+    }
+
+    return new PromiseObj(this.promise.catch(rejected), this.context);
+};
+
+p$1.finally = function (callback) {
+
+    return this.then(function (value) {
+        callback.call(this);
+        return value;
+    }, function (reason) {
+        callback.call(this);
+        return Promise.reject(reason);
+    }
+    );
+};
+
+/**
+ * Utility functions.
+ */
+
+var ref = {};
+var hasOwnProperty = ref.hasOwnProperty;
+var ref$1 = [];
+var slice = ref$1.slice;
+var debug = false, ntick;
+
+var inBrowser = typeof window !== 'undefined';
+
+function Util (ref) {
+    var config = ref.config;
+    var nextTick = ref.nextTick;
+
+    ntick = nextTick;
+    debug = config.debug || !config.silent;
+}
+
+function warn(msg) {
+    if (typeof console !== 'undefined' && debug) {
+        console.warn('[VueResource warn]: ' + msg);
+    }
+}
+
+function error(msg) {
+    if (typeof console !== 'undefined') {
+        console.error(msg);
+    }
+}
+
+function nextTick(cb, ctx) {
+    return ntick(cb, ctx);
+}
+
+function trim(str) {
+    return str ? str.replace(/^\s*|\s*$/g, '') : '';
+}
+
+function trimEnd(str, chars) {
+
+    if (str && chars === undefined) {
+        return str.replace(/\s+$/, '');
+    }
+
+    if (!str || !chars) {
+        return str;
+    }
+
+    return str.replace(new RegExp(("[" + chars + "]+$")), '');
+}
+
+function toLower(str) {
+    return str ? str.toLowerCase() : '';
+}
+
+function toUpper(str) {
+    return str ? str.toUpperCase() : '';
+}
+
+var isArray = Array.isArray;
+
+function isString(val) {
+    return typeof val === 'string';
+}
+
+function isFunction(val) {
+    return typeof val === 'function';
+}
+
+function isObject(obj) {
+    return obj !== null && typeof obj === 'object';
+}
+
+function isPlainObject(obj) {
+    return isObject(obj) && Object.getPrototypeOf(obj) == Object.prototype;
+}
+
+function isBlob(obj) {
+    return typeof Blob !== 'undefined' && obj instanceof Blob;
+}
+
+function isFormData(obj) {
+    return typeof FormData !== 'undefined' && obj instanceof FormData;
+}
+
+function when(value, fulfilled, rejected) {
+
+    var promise = PromiseObj.resolve(value);
+
+    if (arguments.length < 2) {
+        return promise;
+    }
+
+    return promise.then(fulfilled, rejected);
+}
+
+function options(fn, obj, opts) {
+
+    opts = opts || {};
+
+    if (isFunction(opts)) {
+        opts = opts.call(obj);
+    }
+
+    return merge(fn.bind({$vm: obj, $options: opts}), fn, {$options: opts});
+}
+
+function each(obj, iterator) {
+
+    var i, key;
+
+    if (isArray(obj)) {
+        for (i = 0; i < obj.length; i++) {
+            iterator.call(obj[i], obj[i], i);
+        }
+    } else if (isObject(obj)) {
+        for (key in obj) {
+            if (hasOwnProperty.call(obj, key)) {
+                iterator.call(obj[key], obj[key], key);
+            }
+        }
+    }
+
+    return obj;
+}
+
+var assign = Object.assign || _assign;
+
+function merge(target) {
+
+    var args = slice.call(arguments, 1);
+
+    args.forEach(function (source) {
+        _merge(target, source, true);
+    });
+
+    return target;
+}
+
+function defaults(target) {
+
+    var args = slice.call(arguments, 1);
+
+    args.forEach(function (source) {
+
+        for (var key in source) {
+            if (target[key] === undefined) {
+                target[key] = source[key];
+            }
+        }
+
+    });
+
+    return target;
+}
+
+function _assign(target) {
+
+    var args = slice.call(arguments, 1);
+
+    args.forEach(function (source) {
+        _merge(target, source);
+    });
+
+    return target;
+}
+
+function _merge(target, source, deep) {
+    for (var key in source) {
+        if (deep && (isPlainObject(source[key]) || isArray(source[key]))) {
+            if (isPlainObject(source[key]) && !isPlainObject(target[key])) {
+                target[key] = {};
+            }
+            if (isArray(source[key]) && !isArray(target[key])) {
+                target[key] = [];
+            }
+            _merge(target[key], source[key], deep);
+        } else if (source[key] !== undefined) {
+            target[key] = source[key];
+        }
+    }
+}
+
+/**
+ * Root Prefix Transform.
+ */
+
+function root (options$$1, next) {
+
+    var url = next(options$$1);
+
+    if (isString(options$$1.root) && !/^(https?:)?\//.test(url)) {
+        url = trimEnd(options$$1.root, '/') + '/' + url;
+    }
+
+    return url;
+}
+
+/**
+ * Query Parameter Transform.
+ */
+
+function query (options$$1, next) {
+
+    var urlParams = Object.keys(Url.options.params), query = {}, url = next(options$$1);
+
+    each(options$$1.params, function (value, key) {
+        if (urlParams.indexOf(key) === -1) {
+            query[key] = value;
+        }
+    });
+
+    query = Url.params(query);
+
+    if (query) {
+        url += (url.indexOf('?') == -1 ? '?' : '&') + query;
+    }
+
+    return url;
+}
+
+/**
+ * URL Template v2.0.6 (https://github.com/bramstein/url-template)
+ */
+
+function expand(url, params, variables) {
+
+    var tmpl = parse(url), expanded = tmpl.expand(params);
+
+    if (variables) {
+        variables.push.apply(variables, tmpl.vars);
+    }
+
+    return expanded;
+}
+
+function parse(template) {
+
+    var operators = ['+', '#', '.', '/', ';', '?', '&'], variables = [];
+
+    return {
+        vars: variables,
+        expand: function expand(context) {
+            return template.replace(/\{([^{}]+)\}|([^{}]+)/g, function (_, expression, literal) {
+                if (expression) {
+
+                    var operator = null, values = [];
+
+                    if (operators.indexOf(expression.charAt(0)) !== -1) {
+                        operator = expression.charAt(0);
+                        expression = expression.substr(1);
+                    }
+
+                    expression.split(/,/g).forEach(function (variable) {
+                        var tmp = /([^:*]*)(?::(\d+)|(\*))?/.exec(variable);
+                        values.push.apply(values, getValues(context, operator, tmp[1], tmp[2] || tmp[3]));
+                        variables.push(tmp[1]);
+                    });
+
+                    if (operator && operator !== '+') {
+
+                        var separator = ',';
+
+                        if (operator === '?') {
+                            separator = '&';
+                        } else if (operator !== '#') {
+                            separator = operator;
+                        }
+
+                        return (values.length !== 0 ? operator : '') + values.join(separator);
+                    } else {
+                        return values.join(',');
+                    }
+
+                } else {
+                    return encodeReserved(literal);
+                }
+            });
+        }
+    };
+}
+
+function getValues(context, operator, key, modifier) {
+
+    var value = context[key], result = [];
+
+    if (isDefined(value) && value !== '') {
+        if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {
+            value = value.toString();
+
+            if (modifier && modifier !== '*') {
+                value = value.substring(0, parseInt(modifier, 10));
+            }
+
+            result.push(encodeValue(operator, value, isKeyOperator(operator) ? key : null));
+        } else {
+            if (modifier === '*') {
+                if (Array.isArray(value)) {
+                    value.filter(isDefined).forEach(function (value) {
+                        result.push(encodeValue(operator, value, isKeyOperator(operator) ? key : null));
+                    });
+                } else {
+                    Object.keys(value).forEach(function (k) {
+                        if (isDefined(value[k])) {
+                            result.push(encodeValue(operator, value[k], k));
+                        }
+                    });
+                }
+            } else {
+                var tmp = [];
+
+                if (Array.isArray(value)) {
+                    value.filter(isDefined).forEach(function (value) {
+                        tmp.push(encodeValue(operator, value));
+                    });
+                } else {
+                    Object.keys(value).forEach(function (k) {
+                        if (isDefined(value[k])) {
+                            tmp.push(encodeURIComponent(k));
+                            tmp.push(encodeValue(operator, value[k].toString()));
+                        }
+                    });
+                }
+
+                if (isKeyOperator(operator)) {
+                    result.push(encodeURIComponent(key) + '=' + tmp.join(','));
+                } else if (tmp.length !== 0) {
+                    result.push(tmp.join(','));
+                }
+            }
+        }
+    } else {
+        if (operator === ';') {
+            result.push(encodeURIComponent(key));
+        } else if (value === '' && (operator === '&' || operator === '?')) {
+            result.push(encodeURIComponent(key) + '=');
+        } else if (value === '') {
+            result.push('');
+        }
+    }
+
+    return result;
+}
+
+function isDefined(value) {
+    return value !== undefined && value !== null;
+}
+
+function isKeyOperator(operator) {
+    return operator === ';' || operator === '&' || operator === '?';
+}
+
+function encodeValue(operator, value, key) {
+
+    value = (operator === '+' || operator === '#') ? encodeReserved(value) : encodeURIComponent(value);
+
+    if (key) {
+        return encodeURIComponent(key) + '=' + value;
+    } else {
+        return value;
+    }
+}
+
+function encodeReserved(str) {
+    return str.split(/(%[0-9A-Fa-f]{2})/g).map(function (part) {
+        if (!/%[0-9A-Fa-f]/.test(part)) {
+            part = encodeURI(part);
+        }
+        return part;
+    }).join('');
+}
+
+/**
+ * URL Template (RFC 6570) Transform.
+ */
+
+function template (options) {
+
+    var variables = [], url = expand(options.url, options.params, variables);
+
+    variables.forEach(function (key) {
+        delete options.params[key];
+    });
+
+    return url;
+}
+
+/**
+ * Service for URL templating.
+ */
+
+function Url(url, params) {
+
+    var self = this || {}, options$$1 = url, transform;
+
+    if (isString(url)) {
+        options$$1 = {url: url, params: params};
+    }
+
+    options$$1 = merge({}, Url.options, self.$options, options$$1);
+
+    Url.transforms.forEach(function (handler) {
+
+        if (isString(handler)) {
+            handler = Url.transform[handler];
+        }
+
+        if (isFunction(handler)) {
+            transform = factory(handler, transform, self.$vm);
+        }
+
+    });
+
+    return transform(options$$1);
+}
+
+/**
+ * Url options.
+ */
+
+Url.options = {
+    url: '',
+    root: null,
+    params: {}
+};
+
+/**
+ * Url transforms.
+ */
+
+Url.transform = {template: template, query: query, root: root};
+Url.transforms = ['template', 'query', 'root'];
+
+/**
+ * Encodes a Url parameter string.
+ *
+ * @param {Object} obj
+ */
+
+Url.params = function (obj) {
+
+    var params = [], escape = encodeURIComponent;
+
+    params.add = function (key, value) {
+
+        if (isFunction(value)) {
+            value = value();
+        }
+
+        if (value === null) {
+            value = '';
+        }
+
+        this.push(escape(key) + '=' + escape(value));
+    };
+
+    serialize(params, obj);
+
+    return params.join('&').replace(/%20/g, '+');
+};
+
+/**
+ * Parse a URL and return its components.
+ *
+ * @param {String} url
+ */
+
+Url.parse = function (url) {
+
+    var el = document.createElement('a');
+
+    if (document.documentMode) {
+        el.href = url;
+        url = el.href;
+    }
+
+    el.href = url;
+
+    return {
+        href: el.href,
+        protocol: el.protocol ? el.protocol.replace(/:$/, '') : '',
+        port: el.port,
+        host: el.host,
+        hostname: el.hostname,
+        pathname: el.pathname.charAt(0) === '/' ? el.pathname : '/' + el.pathname,
+        search: el.search ? el.search.replace(/^\?/, '') : '',
+        hash: el.hash ? el.hash.replace(/^#/, '') : ''
+    };
+};
+
+function factory(handler, next, vm) {
+    return function (options$$1) {
+        return handler.call(vm, options$$1, next);
+    };
+}
+
+function serialize(params, obj, scope) {
+
+    var array = isArray(obj), plain = isPlainObject(obj), hash;
+
+    each(obj, function (value, key) {
+
+        hash = isObject(value) || isArray(value);
+
+        if (scope) {
+            key = scope + '[' + (plain || hash ? key : '') + ']';
+        }
+
+        if (!scope && array) {
+            params.add(value.name, value.value);
+        } else if (hash) {
+            serialize(params, value, key);
+        } else {
+            params.add(key, value);
+        }
+    });
+}
+
+/**
+ * XDomain client (Internet Explorer).
+ */
+
+function xdrClient (request) {
+    return new PromiseObj(function (resolve) {
+
+        var xdr = new XDomainRequest(), handler = function (ref) {
+                var type = ref.type;
+
+
+                var status = 0;
+
+                if (type === 'load') {
+                    status = 200;
+                } else if (type === 'error') {
+                    status = 500;
+                }
+
+                resolve(request.respondWith(xdr.responseText, {status: status}));
+            };
+
+        request.abort = function () { return xdr.abort(); };
+
+        xdr.open(request.method, request.getUrl());
+
+        if (request.timeout) {
+            xdr.timeout = request.timeout;
+        }
+
+        xdr.onload = handler;
+        xdr.onabort = handler;
+        xdr.onerror = handler;
+        xdr.ontimeout = handler;
+        xdr.onprogress = function () {};
+        xdr.send(request.getBody());
+    });
+}
+
+/**
+ * CORS Interceptor.
+ */
+
+var SUPPORTS_CORS = inBrowser && 'withCredentials' in new XMLHttpRequest();
+
+function cors (request) {
+
+    if (inBrowser) {
+
+        var orgUrl = Url.parse(location.href);
+        var reqUrl = Url.parse(request.getUrl());
+
+        if (reqUrl.protocol !== orgUrl.protocol || reqUrl.host !== orgUrl.host) {
+
+            request.crossOrigin = true;
+            request.emulateHTTP = false;
+
+            if (!SUPPORTS_CORS) {
+                request.client = xdrClient;
+            }
+        }
+    }
+
+}
+
+/**
+ * Form data Interceptor.
+ */
+
+function form (request) {
+
+    if (isFormData(request.body)) {
+        request.headers.delete('Content-Type');
+    } else if (isObject(request.body) && request.emulateJSON) {
+        request.body = Url.params(request.body);
+        request.headers.set('Content-Type', 'application/x-www-form-urlencoded');
+    }
+
+}
+
+/**
+ * JSON Interceptor.
+ */
+
+function json (request) {
+
+    var type = request.headers.get('Content-Type') || '';
+
+    if (isObject(request.body) && type.indexOf('application/json') === 0) {
+        request.body = JSON.stringify(request.body);
+    }
+
+    return function (response) {
+
+        return response.bodyText ? when(response.text(), function (text) {
+
+            var type = response.headers.get('Content-Type') || '';
+
+            if (type.indexOf('application/json') === 0 || isJson(text)) {
+
+                try {
+                    response.body = JSON.parse(text);
+                } catch (e) {
+                    response.body = null;
+                }
+
+            } else {
+                response.body = text;
+            }
+
+            return response;
+
+        }) : response;
+
+    };
+}
+
+function isJson(str) {
+
+    var start = str.match(/^\s*(\[|\{)/);
+    var end = {'[': /]\s*$/, '{': /}\s*$/};
+
+    return start && end[start[1]].test(str);
+}
+
+/**
+ * JSONP client (Browser).
+ */
+
+function jsonpClient (request) {
+    return new PromiseObj(function (resolve) {
+
+        var name = request.jsonp || 'callback', callback = request.jsonpCallback || '_jsonp' + Math.random().toString(36).substr(2), body = null, handler, script;
+
+        handler = function (ref) {
+            var type = ref.type;
+
+
+            var status = 0;
+
+            if (type === 'load' && body !== null) {
+                status = 200;
+            } else if (type === 'error') {
+                status = 500;
+            }
+
+            if (status && window[callback]) {
+                delete window[callback];
+                document.body.removeChild(script);
+            }
+
+            resolve(request.respondWith(body, {status: status}));
+        };
+
+        window[callback] = function (result) {
+            body = JSON.stringify(result);
+        };
+
+        request.abort = function () {
+            handler({type: 'abort'});
+        };
+
+        request.params[name] = callback;
+
+        if (request.timeout) {
+            setTimeout(request.abort, request.timeout);
+        }
+
+        script = document.createElement('script');
+        script.src = request.getUrl();
+        script.type = 'text/javascript';
+        script.async = true;
+        script.onload = handler;
+        script.onerror = handler;
+
+        document.body.appendChild(script);
+    });
+}
+
+/**
+ * JSONP Interceptor.
+ */
+
+function jsonp (request) {
+
+    if (request.method == 'JSONP') {
+        request.client = jsonpClient;
+    }
+
+}
+
+/**
+ * Before Interceptor.
+ */
+
+function before (request) {
+
+    if (isFunction(request.before)) {
+        request.before.call(this, request);
+    }
+
+}
+
+/**
+ * HTTP method override Interceptor.
+ */
+
+function method (request) {
+
+    if (request.emulateHTTP && /^(PUT|PATCH|DELETE)$/i.test(request.method)) {
+        request.headers.set('X-HTTP-Method-Override', request.method);
+        request.method = 'POST';
+    }
+
+}
+
+/**
+ * Header Interceptor.
+ */
+
+function header (request) {
+
+    var headers = assign({}, Http.headers.common,
+        !request.crossOrigin ? Http.headers.custom : {},
+        Http.headers[toLower(request.method)]
+    );
+
+    each(headers, function (value, name) {
+        if (!request.headers.has(name)) {
+            request.headers.set(name, value);
+        }
+    });
+
+}
+
+/**
+ * XMLHttp client (Browser).
+ */
+
+function xhrClient (request) {
+    return new PromiseObj(function (resolve) {
+
+        var xhr = new XMLHttpRequest(), handler = function (event) {
+
+                var response = request.respondWith(
+                'response' in xhr ? xhr.response : xhr.responseText, {
+                    status: xhr.status === 1223 ? 204 : xhr.status, // IE9 status bug
+                    statusText: xhr.status === 1223 ? 'No Content' : trim(xhr.statusText)
+                });
+
+                each(trim(xhr.getAllResponseHeaders()).split('\n'), function (row) {
+                    response.headers.append(row.slice(0, row.indexOf(':')), row.slice(row.indexOf(':') + 1));
+                });
+
+                resolve(response);
+            };
+
+        request.abort = function () { return xhr.abort(); };
+
+        xhr.open(request.method, request.getUrl(), true);
+
+        if (request.timeout) {
+            xhr.timeout = request.timeout;
+        }
+
+        if (request.responseType && 'responseType' in xhr) {
+            xhr.responseType = request.responseType;
+        }
+
+        if (request.withCredentials || request.credentials) {
+            xhr.withCredentials = true;
+        }
+
+        if (!request.crossOrigin) {
+            request.headers.set('X-Requested-With', 'XMLHttpRequest');
+        }
+
+        // deprecated use downloadProgress
+        if (isFunction(request.progress) && request.method === 'GET') {
+            xhr.addEventListener('progress', request.progress);
+        }
+
+        if (isFunction(request.downloadProgress)) {
+            xhr.addEventListener('progress', request.downloadProgress);
+        }
+
+        // deprecated use uploadProgress
+        if (isFunction(request.progress) && /^(POST|PUT)$/i.test(request.method)) {
+            xhr.upload.addEventListener('progress', request.progress);
+        }
+
+        if (isFunction(request.uploadProgress) && xhr.upload) {
+            xhr.upload.addEventListener('progress', request.uploadProgress);
+        }
+
+        request.headers.forEach(function (value, name) {
+            xhr.setRequestHeader(name, value);
+        });
+
+        xhr.onload = handler;
+        xhr.onabort = handler;
+        xhr.onerror = handler;
+        xhr.ontimeout = handler;
+        xhr.send(request.getBody());
+    });
+}
+
+/**
+ * Http client (Node).
+ */
+
+function nodeClient (request) {
+
+    var client = require('got');
+
+    return new PromiseObj(function (resolve) {
+
+        var url = request.getUrl();
+        var body = request.getBody();
+        var method = request.method;
+        var headers = {}, handler;
+
+        request.headers.forEach(function (value, name) {
+            headers[name] = value;
+        });
+
+        client(url, {body: body, method: method, headers: headers}).then(handler = function (resp) {
+
+            var response = request.respondWith(resp.body, {
+                status: resp.statusCode,
+                statusText: trim(resp.statusMessage)
+            });
+
+            each(resp.headers, function (value, name) {
+                response.headers.set(name, value);
+            });
+
+            resolve(response);
+
+        }, function (error$$1) { return handler(error$$1.response); });
+    });
+}
+
+/**
+ * Base client.
+ */
+
+function Client (context) {
+
+    var reqHandlers = [sendRequest], resHandlers = [];
+
+    if (!isObject(context)) {
+        context = null;
+    }
+
+    function Client(request) {
+        while (reqHandlers.length) {
+
+            var handler = reqHandlers.pop();
+
+            if (isFunction(handler)) {
+
+                var response = (void 0), next = (void 0);
+
+                response = handler.call(context, request, function (val) { return next = val; }) || next;
+
+                if (isObject(response)) {
+                    return new PromiseObj(function (resolve, reject) {
+
+                        resHandlers.forEach(function (handler) {
+                            response = when(response, function (response) {
+                                return handler.call(context, response) || response;
+                            }, reject);
+                        });
+
+                        when(response, resolve, reject);
+
+                    }, context);
+                }
+
+                if (isFunction(response)) {
+                    resHandlers.unshift(response);
+                }
+
+            } else {
+                warn(("Invalid interceptor of type " + (typeof handler) + ", must be a function"));
+            }
+        }
+    }
+
+    Client.use = function (handler) {
+        reqHandlers.push(handler);
+    };
+
+    return Client;
+}
+
+function sendRequest(request) {
+
+    var client = request.client || (inBrowser ? xhrClient : nodeClient);
+
+    return client(request);
+}
+
+/**
+ * HTTP Headers.
+ */
+
+var Headers = function Headers(headers) {
+    var this$1 = this;
+
+
+    this.map = {};
+
+    each(headers, function (value, name) { return this$1.append(name, value); });
+};
+
+Headers.prototype.has = function has (name) {
+    return getName(this.map, name) !== null;
+};
+
+Headers.prototype.get = function get (name) {
+
+    var list = this.map[getName(this.map, name)];
+
+    return list ? list.join() : null;
+};
+
+Headers.prototype.getAll = function getAll (name) {
+    return this.map[getName(this.map, name)] || [];
+};
+
+Headers.prototype.set = function set (name, value) {
+    this.map[normalizeName(getName(this.map, name) || name)] = [trim(value)];
+};
+
+Headers.prototype.append = function append (name, value) {
+
+    var list = this.map[getName(this.map, name)];
+
+    if (list) {
+        list.push(trim(value));
+    } else {
+        this.set(name, value);
+    }
+};
+
+Headers.prototype.delete = function delete$1 (name) {
+    delete this.map[getName(this.map, name)];
+};
+
+Headers.prototype.deleteAll = function deleteAll () {
+    this.map = {};
+};
+
+Headers.prototype.forEach = function forEach (callback, thisArg) {
+        var this$1 = this;
+
+    each(this.map, function (list, name) {
+        each(list, function (value) { return callback.call(thisArg, value, name, this$1); });
+    });
+};
+
+function getName(map, name) {
+    return Object.keys(map).reduce(function (prev, curr) {
+        return toLower(name) === toLower(curr) ? curr : prev;
+    }, null);
+}
+
+function normalizeName(name) {
+
+    if (/[^a-z0-9\-#$%&'*+.^_`|~]/i.test(name)) {
+        throw new TypeError('Invalid character in header field name');
+    }
+
+    return trim(name);
+}
+
+/**
+ * HTTP Response.
+ */
+
+var Response = function Response(body, ref) {
+    var url = ref.url;
+    var headers = ref.headers;
+    var status = ref.status;
+    var statusText = ref.statusText;
+
+
+    this.url = url;
+    this.ok = status >= 200 && status < 300;
+    this.status = status || 0;
+    this.statusText = statusText || '';
+    this.headers = new Headers(headers);
+    this.body = body;
+
+    if (isString(body)) {
+
+        this.bodyText = body;
+
+    } else if (isBlob(body)) {
+
+        this.bodyBlob = body;
+
+        if (isBlobText(body)) {
+            this.bodyText = blobText(body);
+        }
+    }
+};
+
+Response.prototype.blob = function blob () {
+    return when(this.bodyBlob);
+};
+
+Response.prototype.text = function text () {
+    return when(this.bodyText);
+};
+
+Response.prototype.json = function json () {
+    return when(this.text(), function (text) { return JSON.parse(text); });
+};
+
+Object.defineProperty(Response.prototype, 'data', {
+
+    get: function get() {
+        return this.body;
+    },
+
+    set: function set(body) {
+        this.body = body;
+    }
+
+});
+
+function blobText(body) {
+    return new PromiseObj(function (resolve) {
+
+        var reader = new FileReader();
+
+        reader.readAsText(body);
+        reader.onload = function () {
+            resolve(reader.result);
+        };
+
+    });
+}
+
+function isBlobText(body) {
+    return body.type.indexOf('text') === 0 || body.type.indexOf('json') !== -1;
+}
+
+/**
+ * HTTP Request.
+ */
+
+var Request = function Request(options$$1) {
+
+    this.body = null;
+    this.params = {};
+
+    assign(this, options$$1, {
+        method: toUpper(options$$1.method || 'GET')
+    });
+
+    if (!(this.headers instanceof Headers)) {
+        this.headers = new Headers(this.headers);
+    }
+};
+
+Request.prototype.getUrl = function getUrl () {
+    return Url(this);
+};
+
+Request.prototype.getBody = function getBody () {
+    return this.body;
+};
+
+Request.prototype.respondWith = function respondWith (body, options$$1) {
+    return new Response(body, assign(options$$1 || {}, {url: this.getUrl()}));
+};
+
+/**
+ * Service for sending network requests.
+ */
+
+var COMMON_HEADERS = {'Accept': 'application/json, text/plain, */*'};
+var JSON_CONTENT_TYPE = {'Content-Type': 'application/json;charset=utf-8'};
+
+function Http(options$$1) {
+
+    var self = this || {}, client = Client(self.$vm);
+
+    defaults(options$$1 || {}, self.$options, Http.options);
+
+    Http.interceptors.forEach(function (handler) {
+
+        if (isString(handler)) {
+            handler = Http.interceptor[handler];
+        }
+
+        if (isFunction(handler)) {
+            client.use(handler);
+        }
+
+    });
+
+    return client(new Request(options$$1)).then(function (response) {
+
+        return response.ok ? response : PromiseObj.reject(response);
+
+    }, function (response) {
+
+        if (response instanceof Error) {
+            error(response);
+        }
+
+        return PromiseObj.reject(response);
+    });
+}
+
+Http.options = {};
+
+Http.headers = {
+    put: JSON_CONTENT_TYPE,
+    post: JSON_CONTENT_TYPE,
+    patch: JSON_CONTENT_TYPE,
+    delete: JSON_CONTENT_TYPE,
+    common: COMMON_HEADERS,
+    custom: {}
+};
+
+Http.interceptor = {before: before, method: method, jsonp: jsonp, json: json, form: form, header: header, cors: cors};
+Http.interceptors = ['before', 'method', 'jsonp', 'json', 'form', 'header', 'cors'];
+
+['get', 'delete', 'head', 'jsonp'].forEach(function (method$$1) {
+
+    Http[method$$1] = function (url, options$$1) {
+        return this(assign(options$$1 || {}, {url: url, method: method$$1}));
+    };
+
+});
+
+['post', 'put', 'patch'].forEach(function (method$$1) {
+
+    Http[method$$1] = function (url, body, options$$1) {
+        return this(assign(options$$1 || {}, {url: url, method: method$$1, body: body}));
+    };
+
+});
+
+/**
+ * Service for interacting with RESTful services.
+ */
+
+function Resource(url, params, actions, options$$1) {
+
+    var self = this || {}, resource = {};
+
+    actions = assign({},
+        Resource.actions,
+        actions
+    );
+
+    each(actions, function (action, name) {
+
+        action = merge({url: url, params: assign({}, params)}, options$$1, action);
+
+        resource[name] = function () {
+            return (self.$http || Http)(opts(action, arguments));
+        };
+    });
+
+    return resource;
+}
+
+function opts(action, args) {
+
+    var options$$1 = assign({}, action), params = {}, body;
+
+    switch (args.length) {
+
+        case 2:
+
+            params = args[0];
+            body = args[1];
+
+            break;
+
+        case 1:
+
+            if (/^(POST|PUT|PATCH)$/i.test(options$$1.method)) {
+                body = args[0];
+            } else {
+                params = args[0];
+            }
+
+            break;
+
+        case 0:
+
+            break;
+
+        default:
+
+            throw 'Expected up to 2 arguments [params, body], got ' + args.length + ' arguments';
+    }
+
+    options$$1.body = body;
+    options$$1.params = assign({}, options$$1.params, params);
+
+    return options$$1;
+}
+
+Resource.actions = {
+
+    get: {method: 'GET'},
+    save: {method: 'POST'},
+    query: {method: 'GET'},
+    update: {method: 'PUT'},
+    remove: {method: 'DELETE'},
+    delete: {method: 'DELETE'}
+
+};
+
+/**
+ * Install plugin.
+ */
+
+function plugin(Vue) {
+
+    if (plugin.installed) {
+        return;
+    }
+
+    Util(Vue);
+
+    Vue.url = Url;
+    Vue.http = Http;
+    Vue.resource = Resource;
+    Vue.Promise = PromiseObj;
+
+    Object.defineProperties(Vue.prototype, {
+
+        $url: {
+            get: function get() {
+                return options(Vue.url, this, this.$options.url);
+            }
+        },
+
+        $http: {
+            get: function get() {
+                return options(Vue.http, this, this.$options.http);
+            }
+        },
+
+        $resource: {
+            get: function get() {
+                return Vue.resource.bind(this);
+            }
+        },
+
+        $promise: {
+            get: function get() {
+                var this$1 = this;
+
+                return function (executor) { return new Vue.Promise(executor, this$1); };
+            }
+        }
+
+    });
+}
+
+if (typeof window !== 'undefined' && window.Vue) {
+    window.Vue.use(plugin);
+}
+
+export default plugin;
+export { Url, Http, Resource };
diff --git a/advancedcontentfilter/vendor/npm-asset/vue-resource/dist/vue-resource.js b/advancedcontentfilter/vendor/npm-asset/vue-resource/dist/vue-resource.js
new file mode 100644 (file)
index 0000000..e9dd639
--- /dev/null
@@ -0,0 +1,1563 @@
+/*!
+ * vue-resource v1.5.0
+ * https://github.com/pagekit/vue-resource
+ * Released under the MIT License.
+ */
+
+(function (global, factory) {
+       typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+       typeof define === 'function' && define.amd ? define(factory) :
+       (global.VueResource = factory());
+}(this, (function () { 'use strict';
+
+/**
+ * Promises/A+ polyfill v1.1.4 (https://github.com/bramstein/promis)
+ */
+
+var RESOLVED = 0;
+var REJECTED = 1;
+var PENDING = 2;
+
+function Promise$1(executor) {
+
+    this.state = PENDING;
+    this.value = undefined;
+    this.deferred = [];
+
+    var promise = this;
+
+    try {
+        executor(function (x) {
+            promise.resolve(x);
+        }, function (r) {
+            promise.reject(r);
+        });
+    } catch (e) {
+        promise.reject(e);
+    }
+}
+
+Promise$1.reject = function (r) {
+    return new Promise$1(function (resolve, reject) {
+        reject(r);
+    });
+};
+
+Promise$1.resolve = function (x) {
+    return new Promise$1(function (resolve, reject) {
+        resolve(x);
+    });
+};
+
+Promise$1.all = function all(iterable) {
+    return new Promise$1(function (resolve, reject) {
+        var count = 0, result = [];
+
+        if (iterable.length === 0) {
+            resolve(result);
+        }
+
+        function resolver(i) {
+            return function (x) {
+                result[i] = x;
+                count += 1;
+
+                if (count === iterable.length) {
+                    resolve(result);
+                }
+            };
+        }
+
+        for (var i = 0; i < iterable.length; i += 1) {
+            Promise$1.resolve(iterable[i]).then(resolver(i), reject);
+        }
+    });
+};
+
+Promise$1.race = function race(iterable) {
+    return new Promise$1(function (resolve, reject) {
+        for (var i = 0; i < iterable.length; i += 1) {
+            Promise$1.resolve(iterable[i]).then(resolve, reject);
+        }
+    });
+};
+
+var p = Promise$1.prototype;
+
+p.resolve = function resolve(x) {
+    var promise = this;
+
+    if (promise.state === PENDING) {
+        if (x === promise) {
+            throw new TypeError('Promise settled with itself.');
+        }
+
+        var called = false;
+
+        try {
+            var then = x && x['then'];
+
+            if (x !== null && typeof x === 'object' && typeof then === 'function') {
+                then.call(x, function (x) {
+                    if (!called) {
+                        promise.resolve(x);
+                    }
+                    called = true;
+
+                }, function (r) {
+                    if (!called) {
+                        promise.reject(r);
+                    }
+                    called = true;
+                });
+                return;
+            }
+        } catch (e) {
+            if (!called) {
+                promise.reject(e);
+            }
+            return;
+        }
+
+        promise.state = RESOLVED;
+        promise.value = x;
+        promise.notify();
+    }
+};
+
+p.reject = function reject(reason) {
+    var promise = this;
+
+    if (promise.state === PENDING) {
+        if (reason === promise) {
+            throw new TypeError('Promise settled with itself.');
+        }
+
+        promise.state = REJECTED;
+        promise.value = reason;
+        promise.notify();
+    }
+};
+
+p.notify = function notify() {
+    var promise = this;
+
+    nextTick(function () {
+        if (promise.state !== PENDING) {
+            while (promise.deferred.length) {
+                var deferred = promise.deferred.shift(),
+                    onResolved = deferred[0],
+                    onRejected = deferred[1],
+                    resolve = deferred[2],
+                    reject = deferred[3];
+
+                try {
+                    if (promise.state === RESOLVED) {
+                        if (typeof onResolved === 'function') {
+                            resolve(onResolved.call(undefined, promise.value));
+                        } else {
+                            resolve(promise.value);
+                        }
+                    } else if (promise.state === REJECTED) {
+                        if (typeof onRejected === 'function') {
+                            resolve(onRejected.call(undefined, promise.value));
+                        } else {
+                            reject(promise.value);
+                        }
+                    }
+                } catch (e) {
+                    reject(e);
+                }
+            }
+        }
+    });
+};
+
+p.then = function then(onResolved, onRejected) {
+    var promise = this;
+
+    return new Promise$1(function (resolve, reject) {
+        promise.deferred.push([onResolved, onRejected, resolve, reject]);
+        promise.notify();
+    });
+};
+
+p.catch = function (onRejected) {
+    return this.then(undefined, onRejected);
+};
+
+/**
+ * Promise adapter.
+ */
+
+if (typeof Promise === 'undefined') {
+    window.Promise = Promise$1;
+}
+
+function PromiseObj(executor, context) {
+
+    if (executor instanceof Promise) {
+        this.promise = executor;
+    } else {
+        this.promise = new Promise(executor.bind(context));
+    }
+
+    this.context = context;
+}
+
+PromiseObj.all = function (iterable, context) {
+    return new PromiseObj(Promise.all(iterable), context);
+};
+
+PromiseObj.resolve = function (value, context) {
+    return new PromiseObj(Promise.resolve(value), context);
+};
+
+PromiseObj.reject = function (reason, context) {
+    return new PromiseObj(Promise.reject(reason), context);
+};
+
+PromiseObj.race = function (iterable, context) {
+    return new PromiseObj(Promise.race(iterable), context);
+};
+
+var p$1 = PromiseObj.prototype;
+
+p$1.bind = function (context) {
+    this.context = context;
+    return this;
+};
+
+p$1.then = function (fulfilled, rejected) {
+
+    if (fulfilled && fulfilled.bind && this.context) {
+        fulfilled = fulfilled.bind(this.context);
+    }
+
+    if (rejected && rejected.bind && this.context) {
+        rejected = rejected.bind(this.context);
+    }
+
+    return new PromiseObj(this.promise.then(fulfilled, rejected), this.context);
+};
+
+p$1.catch = function (rejected) {
+
+    if (rejected && rejected.bind && this.context) {
+        rejected = rejected.bind(this.context);
+    }
+
+    return new PromiseObj(this.promise.catch(rejected), this.context);
+};
+
+p$1.finally = function (callback) {
+
+    return this.then(function (value) {
+        callback.call(this);
+        return value;
+    }, function (reason) {
+        callback.call(this);
+        return Promise.reject(reason);
+    }
+    );
+};
+
+/**
+ * Utility functions.
+ */
+
+var ref = {};
+var hasOwnProperty = ref.hasOwnProperty;
+var ref$1 = [];
+var slice = ref$1.slice;
+var debug = false, ntick;
+
+var inBrowser = typeof window !== 'undefined';
+
+function Util (ref) {
+    var config = ref.config;
+    var nextTick = ref.nextTick;
+
+    ntick = nextTick;
+    debug = config.debug || !config.silent;
+}
+
+function warn(msg) {
+    if (typeof console !== 'undefined' && debug) {
+        console.warn('[VueResource warn]: ' + msg);
+    }
+}
+
+function error(msg) {
+    if (typeof console !== 'undefined') {
+        console.error(msg);
+    }
+}
+
+function nextTick(cb, ctx) {
+    return ntick(cb, ctx);
+}
+
+function trim(str) {
+    return str ? str.replace(/^\s*|\s*$/g, '') : '';
+}
+
+function trimEnd(str, chars) {
+
+    if (str && chars === undefined) {
+        return str.replace(/\s+$/, '');
+    }
+
+    if (!str || !chars) {
+        return str;
+    }
+
+    return str.replace(new RegExp(("[" + chars + "]+$")), '');
+}
+
+function toLower(str) {
+    return str ? str.toLowerCase() : '';
+}
+
+function toUpper(str) {
+    return str ? str.toUpperCase() : '';
+}
+
+var isArray = Array.isArray;
+
+function isString(val) {
+    return typeof val === 'string';
+}
+
+function isFunction(val) {
+    return typeof val === 'function';
+}
+
+function isObject(obj) {
+    return obj !== null && typeof obj === 'object';
+}
+
+function isPlainObject(obj) {
+    return isObject(obj) && Object.getPrototypeOf(obj) == Object.prototype;
+}
+
+function isBlob(obj) {
+    return typeof Blob !== 'undefined' && obj instanceof Blob;
+}
+
+function isFormData(obj) {
+    return typeof FormData !== 'undefined' && obj instanceof FormData;
+}
+
+function when(value, fulfilled, rejected) {
+
+    var promise = PromiseObj.resolve(value);
+
+    if (arguments.length < 2) {
+        return promise;
+    }
+
+    return promise.then(fulfilled, rejected);
+}
+
+function options(fn, obj, opts) {
+
+    opts = opts || {};
+
+    if (isFunction(opts)) {
+        opts = opts.call(obj);
+    }
+
+    return merge(fn.bind({$vm: obj, $options: opts}), fn, {$options: opts});
+}
+
+function each(obj, iterator) {
+
+    var i, key;
+
+    if (isArray(obj)) {
+        for (i = 0; i < obj.length; i++) {
+            iterator.call(obj[i], obj[i], i);
+        }
+    } else if (isObject(obj)) {
+        for (key in obj) {
+            if (hasOwnProperty.call(obj, key)) {
+                iterator.call(obj[key], obj[key], key);
+            }
+        }
+    }
+
+    return obj;
+}
+
+var assign = Object.assign || _assign;
+
+function merge(target) {
+
+    var args = slice.call(arguments, 1);
+
+    args.forEach(function (source) {
+        _merge(target, source, true);
+    });
+
+    return target;
+}
+
+function defaults(target) {
+
+    var args = slice.call(arguments, 1);
+
+    args.forEach(function (source) {
+
+        for (var key in source) {
+            if (target[key] === undefined) {
+                target[key] = source[key];
+            }
+        }
+
+    });
+
+    return target;
+}
+
+function _assign(target) {
+
+    var args = slice.call(arguments, 1);
+
+    args.forEach(function (source) {
+        _merge(target, source);
+    });
+
+    return target;
+}
+
+function _merge(target, source, deep) {
+    for (var key in source) {
+        if (deep && (isPlainObject(source[key]) || isArray(source[key]))) {
+            if (isPlainObject(source[key]) && !isPlainObject(target[key])) {
+                target[key] = {};
+            }
+            if (isArray(source[key]) && !isArray(target[key])) {
+                target[key] = [];
+            }
+            _merge(target[key], source[key], deep);
+        } else if (source[key] !== undefined) {
+            target[key] = source[key];
+        }
+    }
+}
+
+/**
+ * Root Prefix Transform.
+ */
+
+function root (options$$1, next) {
+
+    var url = next(options$$1);
+
+    if (isString(options$$1.root) && !/^(https?:)?\//.test(url)) {
+        url = trimEnd(options$$1.root, '/') + '/' + url;
+    }
+
+    return url;
+}
+
+/**
+ * Query Parameter Transform.
+ */
+
+function query (options$$1, next) {
+
+    var urlParams = Object.keys(Url.options.params), query = {}, url = next(options$$1);
+
+    each(options$$1.params, function (value, key) {
+        if (urlParams.indexOf(key) === -1) {
+            query[key] = value;
+        }
+    });
+
+    query = Url.params(query);
+
+    if (query) {
+        url += (url.indexOf('?') == -1 ? '?' : '&') + query;
+    }
+
+    return url;
+}
+
+/**
+ * URL Template v2.0.6 (https://github.com/bramstein/url-template)
+ */
+
+function expand(url, params, variables) {
+
+    var tmpl = parse(url), expanded = tmpl.expand(params);
+
+    if (variables) {
+        variables.push.apply(variables, tmpl.vars);
+    }
+
+    return expanded;
+}
+
+function parse(template) {
+
+    var operators = ['+', '#', '.', '/', ';', '?', '&'], variables = [];
+
+    return {
+        vars: variables,
+        expand: function expand(context) {
+            return template.replace(/\{([^{}]+)\}|([^{}]+)/g, function (_, expression, literal) {
+                if (expression) {
+
+                    var operator = null, values = [];
+
+                    if (operators.indexOf(expression.charAt(0)) !== -1) {
+                        operator = expression.charAt(0);
+                        expression = expression.substr(1);
+                    }
+
+                    expression.split(/,/g).forEach(function (variable) {
+                        var tmp = /([^:*]*)(?::(\d+)|(\*))?/.exec(variable);
+                        values.push.apply(values, getValues(context, operator, tmp[1], tmp[2] || tmp[3]));
+                        variables.push(tmp[1]);
+                    });
+
+                    if (operator && operator !== '+') {
+
+                        var separator = ',';
+
+                        if (operator === '?') {
+                            separator = '&';
+                        } else if (operator !== '#') {
+                            separator = operator;
+                        }
+
+                        return (values.length !== 0 ? operator : '') + values.join(separator);
+                    } else {
+                        return values.join(',');
+                    }
+
+                } else {
+                    return encodeReserved(literal);
+                }
+            });
+        }
+    };
+}
+
+function getValues(context, operator, key, modifier) {
+
+    var value = context[key], result = [];
+
+    if (isDefined(value) && value !== '') {
+        if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {
+            value = value.toString();
+
+            if (modifier && modifier !== '*') {
+                value = value.substring(0, parseInt(modifier, 10));
+            }
+
+            result.push(encodeValue(operator, value, isKeyOperator(operator) ? key : null));
+        } else {
+            if (modifier === '*') {
+                if (Array.isArray(value)) {
+                    value.filter(isDefined).forEach(function (value) {
+                        result.push(encodeValue(operator, value, isKeyOperator(operator) ? key : null));
+                    });
+                } else {
+                    Object.keys(value).forEach(function (k) {
+                        if (isDefined(value[k])) {
+                            result.push(encodeValue(operator, value[k], k));
+                        }
+                    });
+                }
+            } else {
+                var tmp = [];
+
+                if (Array.isArray(value)) {
+                    value.filter(isDefined).forEach(function (value) {
+                        tmp.push(encodeValue(operator, value));
+                    });
+                } else {
+                    Object.keys(value).forEach(function (k) {
+                        if (isDefined(value[k])) {
+                            tmp.push(encodeURIComponent(k));
+                            tmp.push(encodeValue(operator, value[k].toString()));
+                        }
+                    });
+                }
+
+                if (isKeyOperator(operator)) {
+                    result.push(encodeURIComponent(key) + '=' + tmp.join(','));
+                } else if (tmp.length !== 0) {
+                    result.push(tmp.join(','));
+                }
+            }
+        }
+    } else {
+        if (operator === ';') {
+            result.push(encodeURIComponent(key));
+        } else if (value === '' && (operator === '&' || operator === '?')) {
+            result.push(encodeURIComponent(key) + '=');
+        } else if (value === '') {
+            result.push('');
+        }
+    }
+
+    return result;
+}
+
+function isDefined(value) {
+    return value !== undefined && value !== null;
+}
+
+function isKeyOperator(operator) {
+    return operator === ';' || operator === '&' || operator === '?';
+}
+
+function encodeValue(operator, value, key) {
+
+    value = (operator === '+' || operator === '#') ? encodeReserved(value) : encodeURIComponent(value);
+
+    if (key) {
+        return encodeURIComponent(key) + '=' + value;
+    } else {
+        return value;
+    }
+}
+
+function encodeReserved(str) {
+    return str.split(/(%[0-9A-Fa-f]{2})/g).map(function (part) {
+        if (!/%[0-9A-Fa-f]/.test(part)) {
+            part = encodeURI(part);
+        }
+        return part;
+    }).join('');
+}
+
+/**
+ * URL Template (RFC 6570) Transform.
+ */
+
+function template (options) {
+
+    var variables = [], url = expand(options.url, options.params, variables);
+
+    variables.forEach(function (key) {
+        delete options.params[key];
+    });
+
+    return url;
+}
+
+/**
+ * Service for URL templating.
+ */
+
+function Url(url, params) {
+
+    var self = this || {}, options$$1 = url, transform;
+
+    if (isString(url)) {
+        options$$1 = {url: url, params: params};
+    }
+
+    options$$1 = merge({}, Url.options, self.$options, options$$1);
+
+    Url.transforms.forEach(function (handler) {
+
+        if (isString(handler)) {
+            handler = Url.transform[handler];
+        }
+
+        if (isFunction(handler)) {
+            transform = factory(handler, transform, self.$vm);
+        }
+
+    });
+
+    return transform(options$$1);
+}
+
+/**
+ * Url options.
+ */
+
+Url.options = {
+    url: '',
+    root: null,
+    params: {}
+};
+
+/**
+ * Url transforms.
+ */
+
+Url.transform = {template: template, query: query, root: root};
+Url.transforms = ['template', 'query', 'root'];
+
+/**
+ * Encodes a Url parameter string.
+ *
+ * @param {Object} obj
+ */
+
+Url.params = function (obj) {
+
+    var params = [], escape = encodeURIComponent;
+
+    params.add = function (key, value) {
+
+        if (isFunction(value)) {
+            value = value();
+        }
+
+        if (value === null) {
+            value = '';
+        }
+
+        this.push(escape(key) + '=' + escape(value));
+    };
+
+    serialize(params, obj);
+
+    return params.join('&').replace(/%20/g, '+');
+};
+
+/**
+ * Parse a URL and return its components.
+ *
+ * @param {String} url
+ */
+
+Url.parse = function (url) {
+
+    var el = document.createElement('a');
+
+    if (document.documentMode) {
+        el.href = url;
+        url = el.href;
+    }
+
+    el.href = url;
+
+    return {
+        href: el.href,
+        protocol: el.protocol ? el.protocol.replace(/:$/, '') : '',
+        port: el.port,
+        host: el.host,
+        hostname: el.hostname,
+        pathname: el.pathname.charAt(0) === '/' ? el.pathname : '/' + el.pathname,
+        search: el.search ? el.search.replace(/^\?/, '') : '',
+        hash: el.hash ? el.hash.replace(/^#/, '') : ''
+    };
+};
+
+function factory(handler, next, vm) {
+    return function (options$$1) {
+        return handler.call(vm, options$$1, next);
+    };
+}
+
+function serialize(params, obj, scope) {
+
+    var array = isArray(obj), plain = isPlainObject(obj), hash;
+
+    each(obj, function (value, key) {
+
+        hash = isObject(value) || isArray(value);
+
+        if (scope) {
+            key = scope + '[' + (plain || hash ? key : '') + ']';
+        }
+
+        if (!scope && array) {
+            params.add(value.name, value.value);
+        } else if (hash) {
+            serialize(params, value, key);
+        } else {
+            params.add(key, value);
+        }
+    });
+}
+
+/**
+ * XDomain client (Internet Explorer).
+ */
+
+function xdrClient (request) {
+    return new PromiseObj(function (resolve) {
+
+        var xdr = new XDomainRequest(), handler = function (ref) {
+                var type = ref.type;
+
+
+                var status = 0;
+
+                if (type === 'load') {
+                    status = 200;
+                } else if (type === 'error') {
+                    status = 500;
+                }
+
+                resolve(request.respondWith(xdr.responseText, {status: status}));
+            };
+
+        request.abort = function () { return xdr.abort(); };
+
+        xdr.open(request.method, request.getUrl());
+
+        if (request.timeout) {
+            xdr.timeout = request.timeout;
+        }
+
+        xdr.onload = handler;
+        xdr.onabort = handler;
+        xdr.onerror = handler;
+        xdr.ontimeout = handler;
+        xdr.onprogress = function () {};
+        xdr.send(request.getBody());
+    });
+}
+
+/**
+ * CORS Interceptor.
+ */
+
+var SUPPORTS_CORS = inBrowser && 'withCredentials' in new XMLHttpRequest();
+
+function cors (request) {
+
+    if (inBrowser) {
+
+        var orgUrl = Url.parse(location.href);
+        var reqUrl = Url.parse(request.getUrl());
+
+        if (reqUrl.protocol !== orgUrl.protocol || reqUrl.host !== orgUrl.host) {
+
+            request.crossOrigin = true;
+            request.emulateHTTP = false;
+
+            if (!SUPPORTS_CORS) {
+                request.client = xdrClient;
+            }
+        }
+    }
+
+}
+
+/**
+ * Form data Interceptor.
+ */
+
+function form (request) {
+
+    if (isFormData(request.body)) {
+        request.headers.delete('Content-Type');
+    } else if (isObject(request.body) && request.emulateJSON) {
+        request.body = Url.params(request.body);
+        request.headers.set('Content-Type', 'application/x-www-form-urlencoded');
+    }
+
+}
+
+/**
+ * JSON Interceptor.
+ */
+
+function json (request) {
+
+    var type = request.headers.get('Content-Type') || '';
+
+    if (isObject(request.body) && type.indexOf('application/json') === 0) {
+        request.body = JSON.stringify(request.body);
+    }
+
+    return function (response) {
+
+        return response.bodyText ? when(response.text(), function (text) {
+
+            var type = response.headers.get('Content-Type') || '';
+
+            if (type.indexOf('application/json') === 0 || isJson(text)) {
+
+                try {
+                    response.body = JSON.parse(text);
+                } catch (e) {
+                    response.body = null;
+                }
+
+            } else {
+                response.body = text;
+            }
+
+            return response;
+
+        }) : response;
+
+    };
+}
+
+function isJson(str) {
+
+    var start = str.match(/^\s*(\[|\{)/);
+    var end = {'[': /]\s*$/, '{': /}\s*$/};
+
+    return start && end[start[1]].test(str);
+}
+
+/**
+ * JSONP client (Browser).
+ */
+
+function jsonpClient (request) {
+    return new PromiseObj(function (resolve) {
+
+        var name = request.jsonp || 'callback', callback = request.jsonpCallback || '_jsonp' + Math.random().toString(36).substr(2), body = null, handler, script;
+
+        handler = function (ref) {
+            var type = ref.type;
+
+
+            var status = 0;
+
+            if (type === 'load' && body !== null) {
+                status = 200;
+            } else if (type === 'error') {
+                status = 500;
+            }
+
+            if (status && window[callback]) {
+                delete window[callback];
+                document.body.removeChild(script);
+            }
+
+            resolve(request.respondWith(body, {status: status}));
+        };
+
+        window[callback] = function (result) {
+            body = JSON.stringify(result);
+        };
+
+        request.abort = function () {
+            handler({type: 'abort'});
+        };
+
+        request.params[name] = callback;
+
+        if (request.timeout) {
+            setTimeout(request.abort, request.timeout);
+        }
+
+        script = document.createElement('script');
+        script.src = request.getUrl();
+        script.type = 'text/javascript';
+        script.async = true;
+        script.onload = handler;
+        script.onerror = handler;
+
+        document.body.appendChild(script);
+    });
+}
+
+/**
+ * JSONP Interceptor.
+ */
+
+function jsonp (request) {
+
+    if (request.method == 'JSONP') {
+        request.client = jsonpClient;
+    }
+
+}
+
+/**
+ * Before Interceptor.
+ */
+
+function before (request) {
+
+    if (isFunction(request.before)) {
+        request.before.call(this, request);
+    }
+
+}
+
+/**
+ * HTTP method override Interceptor.
+ */
+
+function method (request) {
+
+    if (request.emulateHTTP && /^(PUT|PATCH|DELETE)$/i.test(request.method)) {
+        request.headers.set('X-HTTP-Method-Override', request.method);
+        request.method = 'POST';
+    }
+
+}
+
+/**
+ * Header Interceptor.
+ */
+
+function header (request) {
+
+    var headers = assign({}, Http.headers.common,
+        !request.crossOrigin ? Http.headers.custom : {},
+        Http.headers[toLower(request.method)]
+    );
+
+    each(headers, function (value, name) {
+        if (!request.headers.has(name)) {
+            request.headers.set(name, value);
+        }
+    });
+
+}
+
+/**
+ * XMLHttp client (Browser).
+ */
+
+function xhrClient (request) {
+    return new PromiseObj(function (resolve) {
+
+        var xhr = new XMLHttpRequest(), handler = function (event) {
+
+                var response = request.respondWith(
+                'response' in xhr ? xhr.response : xhr.responseText, {
+                    status: xhr.status === 1223 ? 204 : xhr.status, // IE9 status bug
+                    statusText: xhr.status === 1223 ? 'No Content' : trim(xhr.statusText)
+                });
+
+                each(trim(xhr.getAllResponseHeaders()).split('\n'), function (row) {
+                    response.headers.append(row.slice(0, row.indexOf(':')), row.slice(row.indexOf(':') + 1));
+                });
+
+                resolve(response);
+            };
+
+        request.abort = function () { return xhr.abort(); };
+
+        xhr.open(request.method, request.getUrl(), true);
+
+        if (request.timeout) {
+            xhr.timeout = request.timeout;
+        }
+
+        if (request.responseType && 'responseType' in xhr) {
+            xhr.responseType = request.responseType;
+        }
+
+        if (request.withCredentials || request.credentials) {
+            xhr.withCredentials = true;
+        }
+
+        if (!request.crossOrigin) {
+            request.headers.set('X-Requested-With', 'XMLHttpRequest');
+        }
+
+        // deprecated use downloadProgress
+        if (isFunction(request.progress) && request.method === 'GET') {
+            xhr.addEventListener('progress', request.progress);
+        }
+
+        if (isFunction(request.downloadProgress)) {
+            xhr.addEventListener('progress', request.downloadProgress);
+        }
+
+        // deprecated use uploadProgress
+        if (isFunction(request.progress) && /^(POST|PUT)$/i.test(request.method)) {
+            xhr.upload.addEventListener('progress', request.progress);
+        }
+
+        if (isFunction(request.uploadProgress) && xhr.upload) {
+            xhr.upload.addEventListener('progress', request.uploadProgress);
+        }
+
+        request.headers.forEach(function (value, name) {
+            xhr.setRequestHeader(name, value);
+        });
+
+        xhr.onload = handler;
+        xhr.onabort = handler;
+        xhr.onerror = handler;
+        xhr.ontimeout = handler;
+        xhr.send(request.getBody());
+    });
+}
+
+/**
+ * Http client (Node).
+ */
+
+function nodeClient (request) {
+
+    var client = require('got');
+
+    return new PromiseObj(function (resolve) {
+
+        var url = request.getUrl();
+        var body = request.getBody();
+        var method = request.method;
+        var headers = {}, handler;
+
+        request.headers.forEach(function (value, name) {
+            headers[name] = value;
+        });
+
+        client(url, {body: body, method: method, headers: headers}).then(handler = function (resp) {
+
+            var response = request.respondWith(resp.body, {
+                status: resp.statusCode,
+                statusText: trim(resp.statusMessage)
+            });
+
+            each(resp.headers, function (value, name) {
+                response.headers.set(name, value);
+            });
+
+            resolve(response);
+
+        }, function (error$$1) { return handler(error$$1.response); });
+    });
+}
+
+/**
+ * Base client.
+ */
+
+function Client (context) {
+
+    var reqHandlers = [sendRequest], resHandlers = [];
+
+    if (!isObject(context)) {
+        context = null;
+    }
+
+    function Client(request) {
+        while (reqHandlers.length) {
+
+            var handler = reqHandlers.pop();
+
+            if (isFunction(handler)) {
+
+                var response = (void 0), next = (void 0);
+
+                response = handler.call(context, request, function (val) { return next = val; }) || next;
+
+                if (isObject(response)) {
+                    return new PromiseObj(function (resolve, reject) {
+
+                        resHandlers.forEach(function (handler) {
+                            response = when(response, function (response) {
+                                return handler.call(context, response) || response;
+                            }, reject);
+                        });
+
+                        when(response, resolve, reject);
+
+                    }, context);
+                }
+
+                if (isFunction(response)) {
+                    resHandlers.unshift(response);
+                }
+
+            } else {
+                warn(("Invalid interceptor of type " + (typeof handler) + ", must be a function"));
+            }
+        }
+    }
+
+    Client.use = function (handler) {
+        reqHandlers.push(handler);
+    };
+
+    return Client;
+}
+
+function sendRequest(request) {
+
+    var client = request.client || (inBrowser ? xhrClient : nodeClient);
+
+    return client(request);
+}
+
+/**
+ * HTTP Headers.
+ */
+
+var Headers = function Headers(headers) {
+    var this$1 = this;
+
+
+    this.map = {};
+
+    each(headers, function (value, name) { return this$1.append(name, value); });
+};
+
+Headers.prototype.has = function has (name) {
+    return getName(this.map, name) !== null;
+};
+
+Headers.prototype.get = function get (name) {
+
+    var list = this.map[getName(this.map, name)];
+
+    return list ? list.join() : null;
+};
+
+Headers.prototype.getAll = function getAll (name) {
+    return this.map[getName(this.map, name)] || [];
+};
+
+Headers.prototype.set = function set (name, value) {
+    this.map[normalizeName(getName(this.map, name) || name)] = [trim(value)];
+};
+
+Headers.prototype.append = function append (name, value) {
+
+    var list = this.map[getName(this.map, name)];
+
+    if (list) {
+        list.push(trim(value));
+    } else {
+        this.set(name, value);
+    }
+};
+
+Headers.prototype.delete = function delete$1 (name) {
+    delete this.map[getName(this.map, name)];
+};
+
+Headers.prototype.deleteAll = function deleteAll () {
+    this.map = {};
+};
+
+Headers.prototype.forEach = function forEach (callback, thisArg) {
+        var this$1 = this;
+
+    each(this.map, function (list, name) {
+        each(list, function (value) { return callback.call(thisArg, value, name, this$1); });
+    });
+};
+
+function getName(map, name) {
+    return Object.keys(map).reduce(function (prev, curr) {
+        return toLower(name) === toLower(curr) ? curr : prev;
+    }, null);
+}
+
+function normalizeName(name) {
+
+    if (/[^a-z0-9\-#$%&'*+.^_`|~]/i.test(name)) {
+        throw new TypeError('Invalid character in header field name');
+    }
+
+    return trim(name);
+}
+
+/**
+ * HTTP Response.
+ */
+
+var Response = function Response(body, ref) {
+    var url = ref.url;
+    var headers = ref.headers;
+    var status = ref.status;
+    var statusText = ref.statusText;
+
+
+    this.url = url;
+    this.ok = status >= 200 && status < 300;
+    this.status = status || 0;
+    this.statusText = statusText || '';
+    this.headers = new Headers(headers);
+    this.body = body;
+
+    if (isString(body)) {
+
+        this.bodyText = body;
+
+    } else if (isBlob(body)) {
+
+        this.bodyBlob = body;
+
+        if (isBlobText(body)) {
+            this.bodyText = blobText(body);
+        }
+    }
+};
+
+Response.prototype.blob = function blob () {
+    return when(this.bodyBlob);
+};
+
+Response.prototype.text = function text () {
+    return when(this.bodyText);
+};
+
+Response.prototype.json = function json () {
+    return when(this.text(), function (text) { return JSON.parse(text); });
+};
+
+Object.defineProperty(Response.prototype, 'data', {
+
+    get: function get() {
+        return this.body;
+    },
+
+    set: function set(body) {
+        this.body = body;
+    }
+
+});
+
+function blobText(body) {
+    return new PromiseObj(function (resolve) {
+
+        var reader = new FileReader();
+
+        reader.readAsText(body);
+        reader.onload = function () {
+            resolve(reader.result);
+        };
+
+    });
+}
+
+function isBlobText(body) {
+    return body.type.indexOf('text') === 0 || body.type.indexOf('json') !== -1;
+}
+
+/**
+ * HTTP Request.
+ */
+
+var Request = function Request(options$$1) {
+
+    this.body = null;
+    this.params = {};
+
+    assign(this, options$$1, {
+        method: toUpper(options$$1.method || 'GET')
+    });
+
+    if (!(this.headers instanceof Headers)) {
+        this.headers = new Headers(this.headers);
+    }
+};
+
+Request.prototype.getUrl = function getUrl () {
+    return Url(this);
+};
+
+Request.prototype.getBody = function getBody () {
+    return this.body;
+};
+
+Request.prototype.respondWith = function respondWith (body, options$$1) {
+    return new Response(body, assign(options$$1 || {}, {url: this.getUrl()}));
+};
+
+/**
+ * Service for sending network requests.
+ */
+
+var COMMON_HEADERS = {'Accept': 'application/json, text/plain, */*'};
+var JSON_CONTENT_TYPE = {'Content-Type': 'application/json;charset=utf-8'};
+
+function Http(options$$1) {
+
+    var self = this || {}, client = Client(self.$vm);
+
+    defaults(options$$1 || {}, self.$options, Http.options);
+
+    Http.interceptors.forEach(function (handler) {
+
+        if (isString(handler)) {
+            handler = Http.interceptor[handler];
+        }
+
+        if (isFunction(handler)) {
+            client.use(handler);
+        }
+
+    });
+
+    return client(new Request(options$$1)).then(function (response) {
+
+        return response.ok ? response : PromiseObj.reject(response);
+
+    }, function (response) {
+
+        if (response instanceof Error) {
+            error(response);
+        }
+
+        return PromiseObj.reject(response);
+    });
+}
+
+Http.options = {};
+
+Http.headers = {
+    put: JSON_CONTENT_TYPE,
+    post: JSON_CONTENT_TYPE,
+    patch: JSON_CONTENT_TYPE,
+    delete: JSON_CONTENT_TYPE,
+    common: COMMON_HEADERS,
+    custom: {}
+};
+
+Http.interceptor = {before: before, method: method, jsonp: jsonp, json: json, form: form, header: header, cors: cors};
+Http.interceptors = ['before', 'method', 'jsonp', 'json', 'form', 'header', 'cors'];
+
+['get', 'delete', 'head', 'jsonp'].forEach(function (method$$1) {
+
+    Http[method$$1] = function (url, options$$1) {
+        return this(assign(options$$1 || {}, {url: url, method: method$$1}));
+    };
+
+});
+
+['post', 'put', 'patch'].forEach(function (method$$1) {
+
+    Http[method$$1] = function (url, body, options$$1) {
+        return this(assign(options$$1 || {}, {url: url, method: method$$1, body: body}));
+    };
+
+});
+
+/**
+ * Service for interacting with RESTful services.
+ */
+
+function Resource(url, params, actions, options$$1) {
+
+    var self = this || {}, resource = {};
+
+    actions = assign({},
+        Resource.actions,
+        actions
+    );
+
+    each(actions, function (action, name) {
+
+        action = merge({url: url, params: assign({}, params)}, options$$1, action);
+
+        resource[name] = function () {
+            return (self.$http || Http)(opts(action, arguments));
+        };
+    });
+
+    return resource;
+}
+
+function opts(action, args) {
+
+    var options$$1 = assign({}, action), params = {}, body;
+
+    switch (args.length) {
+
+        case 2:
+
+            params = args[0];
+            body = args[1];
+
+            break;
+
+        case 1:
+
+            if (/^(POST|PUT|PATCH)$/i.test(options$$1.method)) {
+                body = args[0];
+            } else {
+                params = args[0];
+            }
+
+            break;
+
+        case 0:
+
+            break;
+
+        default:
+
+            throw 'Expected up to 2 arguments [params, body], got ' + args.length + ' arguments';
+    }
+
+    options$$1.body = body;
+    options$$1.params = assign({}, options$$1.params, params);
+
+    return options$$1;
+}
+
+Resource.actions = {
+
+    get: {method: 'GET'},
+    save: {method: 'POST'},
+    query: {method: 'GET'},
+    update: {method: 'PUT'},
+    remove: {method: 'DELETE'},
+    delete: {method: 'DELETE'}
+
+};
+
+/**
+ * Install plugin.
+ */
+
+function plugin(Vue) {
+
+    if (plugin.installed) {
+        return;
+    }
+
+    Util(Vue);
+
+    Vue.url = Url;
+    Vue.http = Http;
+    Vue.resource = Resource;
+    Vue.Promise = PromiseObj;
+
+    Object.defineProperties(Vue.prototype, {
+
+        $url: {
+            get: function get() {
+                return options(Vue.url, this, this.$options.url);
+            }
+        },
+
+        $http: {
+            get: function get() {
+                return options(Vue.http, this, this.$options.http);
+            }
+        },
+
+        $resource: {
+            get: function get() {
+                return Vue.resource.bind(this);
+            }
+        },
+
+        $promise: {
+            get: function get() {
+                var this$1 = this;
+
+                return function (executor) { return new Vue.Promise(executor, this$1); };
+            }
+        }
+
+    });
+}
+
+if (typeof window !== 'undefined' && window.Vue) {
+    window.Vue.use(plugin);
+}
+
+return plugin;
+
+})));
diff --git a/advancedcontentfilter/vendor/npm-asset/vue-resource/dist/vue-resource.min.js b/advancedcontentfilter/vendor/npm-asset/vue-resource/dist/vue-resource.min.js
new file mode 100644 (file)
index 0000000..cc10be7
--- /dev/null
@@ -0,0 +1,7 @@
+/*!
+ * vue-resource v1.5.0
+ * https://github.com/pagekit/vue-resource
+ * Released under the MIT License.
+ */
+
+!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):t.VueResource=e()}(this,function(){"use strict";var t=2;function e(e){this.state=t,this.value=void 0,this.deferred=[];var n=this;try{e(function(t){n.resolve(t)},function(t){n.reject(t)})}catch(t){n.reject(t)}}e.reject=function(t){return new e(function(e,n){n(t)})},e.resolve=function(t){return new e(function(e,n){e(t)})},e.all=function(t){return new e(function(n,o){var r=0,i=[];function s(e){return function(o){i[e]=o,(r+=1)===t.length&&n(i)}}0===t.length&&n(i);for(var u=0;u<t.length;u+=1)e.resolve(t[u]).then(s(u),o)})},e.race=function(t){return new e(function(n,o){for(var r=0;r<t.length;r+=1)e.resolve(t[r]).then(n,o)})};var n=e.prototype;function o(t,e){t instanceof Promise?this.promise=t:this.promise=new Promise(t.bind(e)),this.context=e}n.resolve=function(e){var n=this;if(n.state===t){if(e===n)throw new TypeError("Promise settled with itself.");var o=!1;try{var r=e&&e.then;if(null!==e&&"object"==typeof e&&"function"==typeof r)return void r.call(e,function(t){o||n.resolve(t),o=!0},function(t){o||n.reject(t),o=!0})}catch(t){return void(o||n.reject(t))}n.state=0,n.value=e,n.notify()}},n.reject=function(e){var n=this;if(n.state===t){if(e===n)throw new TypeError("Promise settled with itself.");n.state=1,n.value=e,n.notify()}},n.notify=function(){var e,n=this;i(function(){if(n.state!==t)for(;n.deferred.length;){var e=n.deferred.shift(),o=e[0],r=e[1],i=e[2],s=e[3];try{0===n.state?i("function"==typeof o?o.call(void 0,n.value):n.value):1===n.state&&("function"==typeof r?i(r.call(void 0,n.value)):s(n.value))}catch(t){s(t)}}},e)},n.then=function(t,n){var o=this;return new e(function(e,r){o.deferred.push([t,n,e,r]),o.notify()})},n.catch=function(t){return this.then(void 0,t)},"undefined"==typeof Promise&&(window.Promise=e),o.all=function(t,e){return new o(Promise.all(t),e)},o.resolve=function(t,e){return new o(Promise.resolve(t),e)},o.reject=function(t,e){return new o(Promise.reject(t),e)},o.race=function(t,e){return new o(Promise.race(t),e)};var r=o.prototype;r.bind=function(t){return this.context=t,this},r.then=function(t,e){return t&&t.bind&&this.context&&(t=t.bind(this.context)),e&&e.bind&&this.context&&(e=e.bind(this.context)),new o(this.promise.then(t,e),this.context)},r.catch=function(t){return t&&t.bind&&this.context&&(t=t.bind(this.context)),new o(this.promise.catch(t),this.context)},r.finally=function(t){return this.then(function(e){return t.call(this),e},function(e){return t.call(this),Promise.reject(e)})};var i,s={}.hasOwnProperty,u=[].slice,a=!1,c="undefined"!=typeof window;function f(t){return t?t.replace(/^\s*|\s*$/g,""):""}function p(t){return t?t.toLowerCase():""}var h=Array.isArray;function d(t){return"string"==typeof t}function l(t){return"function"==typeof t}function m(t){return null!==t&&"object"==typeof t}function y(t){return m(t)&&Object.getPrototypeOf(t)==Object.prototype}function v(t,e,n){var r=o.resolve(t);return arguments.length<2?r:r.then(e,n)}function b(t,e,n){return l(n=n||{})&&(n=n.call(e)),T(t.bind({$vm:e,$options:n}),t,{$options:n})}function g(t,e){var n,o;if(h(t))for(n=0;n<t.length;n++)e.call(t[n],t[n],n);else if(m(t))for(o in t)s.call(t,o)&&e.call(t[o],t[o],o);return t}var w=Object.assign||function(t){return u.call(arguments,1).forEach(function(e){x(t,e)}),t};function T(t){return u.call(arguments,1).forEach(function(e){x(t,e,!0)}),t}function x(t,e,n){for(var o in e)n&&(y(e[o])||h(e[o]))?(y(e[o])&&!y(t[o])&&(t[o]={}),h(e[o])&&!h(t[o])&&(t[o]=[]),x(t[o],e[o],n)):void 0!==e[o]&&(t[o]=e[o])}function j(t,e,n){var o,r,i,s=(o=t,r=["+","#",".","/",";","?","&"],{vars:i=[],expand:function(t){return o.replace(/\{([^{}]+)\}|([^{}]+)/g,function(e,n,o){if(n){var s=null,u=[];if(-1!==r.indexOf(n.charAt(0))&&(s=n.charAt(0),n=n.substr(1)),n.split(/,/g).forEach(function(e){var n=/([^:*]*)(?::(\d+)|(\*))?/.exec(e);u.push.apply(u,function(t,e,n,o){var r=t[n],i=[];if(E(r)&&""!==r)if("string"==typeof r||"number"==typeof r||"boolean"==typeof r)r=r.toString(),o&&"*"!==o&&(r=r.substring(0,parseInt(o,10))),i.push(O(e,r,P(e)?n:null));else if("*"===o)Array.isArray(r)?r.filter(E).forEach(function(t){i.push(O(e,t,P(e)?n:null))}):Object.keys(r).forEach(function(t){E(r[t])&&i.push(O(e,r[t],t))});else{var s=[];Array.isArray(r)?r.filter(E).forEach(function(t){s.push(O(e,t))}):Object.keys(r).forEach(function(t){E(r[t])&&(s.push(encodeURIComponent(t)),s.push(O(e,r[t].toString())))}),P(e)?i.push(encodeURIComponent(n)+"="+s.join(",")):0!==s.length&&i.push(s.join(","))}else";"===e?i.push(encodeURIComponent(n)):""!==r||"&"!==e&&"?"!==e?""===r&&i.push(""):i.push(encodeURIComponent(n)+"=");return i}(t,s,n[1],n[2]||n[3])),i.push(n[1])}),s&&"+"!==s){var a=",";return"?"===s?a="&":"#"!==s&&(a=s),(0!==u.length?s:"")+u.join(a)}return u.join(",")}return C(o)})}}),u=s.expand(e);return n&&n.push.apply(n,s.vars),u}function E(t){return null!=t}function P(t){return";"===t||"&"===t||"?"===t}function O(t,e,n){return e="+"===t||"#"===t?C(e):encodeURIComponent(e),n?encodeURIComponent(n)+"="+e:e}function C(t){return t.split(/(%[0-9A-Fa-f]{2})/g).map(function(t){return/%[0-9A-Fa-f]/.test(t)||(t=encodeURI(t)),t}).join("")}function $(t,e){var n,o=this||{},r=t;return d(t)&&(r={url:t,params:e}),r=T({},$.options,o.$options,r),$.transforms.forEach(function(t){var e,r,i;d(t)&&(t=$.transform[t]),l(t)&&(e=t,r=n,i=o.$vm,n=function(t){return e.call(i,t,r)})}),n(r)}function U(t){return new o(function(e){var n=new XDomainRequest,o=function(o){var r=o.type,i=0;"load"===r?i=200:"error"===r&&(i=500),e(t.respondWith(n.responseText,{status:i}))};t.abort=function(){return n.abort()},n.open(t.method,t.getUrl()),t.timeout&&(n.timeout=t.timeout),n.onload=o,n.onabort=o,n.onerror=o,n.ontimeout=o,n.onprogress=function(){},n.send(t.getBody())})}$.options={url:"",root:null,params:{}},$.transform={template:function(t){var e=[],n=j(t.url,t.params,e);return e.forEach(function(e){delete t.params[e]}),n},query:function(t,e){var n=Object.keys($.options.params),o={},r=e(t);return g(t.params,function(t,e){-1===n.indexOf(e)&&(o[e]=t)}),(o=$.params(o))&&(r+=(-1==r.indexOf("?")?"?":"&")+o),r},root:function(t,e){var n,o,r=e(t);return d(t.root)&&!/^(https?:)?\//.test(r)&&(n=t.root,o="/",r=(n&&void 0===o?n.replace(/\s+$/,""):n&&o?n.replace(new RegExp("["+o+"]+$"),""):n)+"/"+r),r}},$.transforms=["template","query","root"],$.params=function(t){var e=[],n=encodeURIComponent;return e.add=function(t,e){l(e)&&(e=e()),null===e&&(e=""),this.push(n(t)+"="+n(e))},function t(e,n,o){var r,i=h(n),s=y(n);g(n,function(n,u){r=m(n)||h(n),o&&(u=o+"["+(s||r?u:"")+"]"),!o&&i?e.add(n.name,n.value):r?t(e,n,u):e.add(u,n)})}(e,t),e.join("&").replace(/%20/g,"+")},$.parse=function(t){var e=document.createElement("a");return document.documentMode&&(e.href=t,t=e.href),e.href=t,{href:e.href,protocol:e.protocol?e.protocol.replace(/:$/,""):"",port:e.port,host:e.host,hostname:e.hostname,pathname:"/"===e.pathname.charAt(0)?e.pathname:"/"+e.pathname,search:e.search?e.search.replace(/^\?/,""):"",hash:e.hash?e.hash.replace(/^#/,""):""}};var R=c&&"withCredentials"in new XMLHttpRequest;function A(t){return new o(function(e){var n,o,r=t.jsonp||"callback",i=t.jsonpCallback||"_jsonp"+Math.random().toString(36).substr(2),s=null;n=function(n){var r=n.type,u=0;"load"===r&&null!==s?u=200:"error"===r&&(u=500),u&&window[i]&&(delete window[i],document.body.removeChild(o)),e(t.respondWith(s,{status:u}))},window[i]=function(t){s=JSON.stringify(t)},t.abort=function(){n({type:"abort"})},t.params[r]=i,t.timeout&&setTimeout(t.abort,t.timeout),(o=document.createElement("script")).src=t.getUrl(),o.type="text/javascript",o.async=!0,o.onload=n,o.onerror=n,document.body.appendChild(o)})}function S(t){return new o(function(e){var n=new XMLHttpRequest,o=function(o){var r=t.respondWith("response"in n?n.response:n.responseText,{status:1223===n.status?204:n.status,statusText:1223===n.status?"No Content":f(n.statusText)});g(f(n.getAllResponseHeaders()).split("\n"),function(t){r.headers.append(t.slice(0,t.indexOf(":")),t.slice(t.indexOf(":")+1))}),e(r)};t.abort=function(){return n.abort()},n.open(t.method,t.getUrl(),!0),t.timeout&&(n.timeout=t.timeout),t.responseType&&"responseType"in n&&(n.responseType=t.responseType),(t.withCredentials||t.credentials)&&(n.withCredentials=!0),t.crossOrigin||t.headers.set("X-Requested-With","XMLHttpRequest"),l(t.progress)&&"GET"===t.method&&n.addEventListener("progress",t.progress),l(t.downloadProgress)&&n.addEventListener("progress",t.downloadProgress),l(t.progress)&&/^(POST|PUT)$/i.test(t.method)&&n.upload.addEventListener("progress",t.progress),l(t.uploadProgress)&&n.upload&&n.upload.addEventListener("progress",t.uploadProgress),t.headers.forEach(function(t,e){n.setRequestHeader(e,t)}),n.onload=o,n.onabort=o,n.onerror=o,n.ontimeout=o,n.send(t.getBody())})}function k(t){var e=require("got");return new o(function(n){var o,r=t.getUrl(),i=t.getBody(),s=t.method,u={};t.headers.forEach(function(t,e){u[e]=t}),e(r,{body:i,method:s,headers:u}).then(o=function(e){var o=t.respondWith(e.body,{status:e.statusCode,statusText:f(e.statusMessage)});g(e.headers,function(t,e){o.headers.set(e,t)}),n(o)},function(t){return o(t.response)})})}function I(t){return(t.client||(c?S:k))(t)}var L=function(t){var e=this;this.map={},g(t,function(t,n){return e.append(n,t)})};function q(t,e){return Object.keys(t).reduce(function(t,n){return p(e)===p(n)?n:t},null)}L.prototype.has=function(t){return null!==q(this.map,t)},L.prototype.get=function(t){var e=this.map[q(this.map,t)];return e?e.join():null},L.prototype.getAll=function(t){return this.map[q(this.map,t)]||[]},L.prototype.set=function(t,e){this.map[function(t){if(/[^a-z0-9\-#$%&'*+.^_`|~]/i.test(t))throw new TypeError("Invalid character in header field name");return f(t)}(q(this.map,t)||t)]=[f(e)]},L.prototype.append=function(t,e){var n=this.map[q(this.map,t)];n?n.push(f(e)):this.set(t,e)},L.prototype.delete=function(t){delete this.map[q(this.map,t)]},L.prototype.deleteAll=function(){this.map={}},L.prototype.forEach=function(t,e){var n=this;g(this.map,function(o,r){g(o,function(o){return t.call(e,o,r,n)})})};var H=function(t,e){var n,r,i,s=e.url,u=e.headers,a=e.status,c=e.statusText;this.url=s,this.ok=a>=200&&a<300,this.status=a||0,this.statusText=c||"",this.headers=new L(u),this.body=t,d(t)?this.bodyText=t:(i=t,"undefined"!=typeof Blob&&i instanceof Blob&&(this.bodyBlob=t,(0===(r=t).type.indexOf("text")||-1!==r.type.indexOf("json"))&&(this.bodyText=(n=t,new o(function(t){var e=new FileReader;e.readAsText(n),e.onload=function(){t(e.result)}})))))};H.prototype.blob=function(){return v(this.bodyBlob)},H.prototype.text=function(){return v(this.bodyText)},H.prototype.json=function(){return v(this.text(),function(t){return JSON.parse(t)})},Object.defineProperty(H.prototype,"data",{get:function(){return this.body},set:function(t){this.body=t}});var B=function(t){var e;this.body=null,this.params={},w(this,t,{method:(e=t.method||"GET",e?e.toUpperCase():"")}),this.headers instanceof L||(this.headers=new L(this.headers))};B.prototype.getUrl=function(){return $(this)},B.prototype.getBody=function(){return this.body},B.prototype.respondWith=function(t,e){return new H(t,w(e||{},{url:this.getUrl()}))};var M={"Content-Type":"application/json;charset=utf-8"};function N(t){var e=this||{},n=function(t){var e=[I],n=[];function r(r){for(;e.length;){var i=e.pop();if(l(i)){var s=void 0,u=void 0;if(m(s=i.call(t,r,function(t){return u=t})||u))return new o(function(e,o){n.forEach(function(e){s=v(s,function(n){return e.call(t,n)||n},o)}),v(s,e,o)},t);l(s)&&n.unshift(s)}else c="Invalid interceptor of type "+typeof i+", must be a function","undefined"!=typeof console&&a&&console.warn("[VueResource warn]: "+c)}var c}return m(t)||(t=null),r.use=function(t){e.push(t)},r}(e.$vm);return function(t){u.call(arguments,1).forEach(function(e){for(var n in e)void 0===t[n]&&(t[n]=e[n])})}(t||{},e.$options,N.options),N.interceptors.forEach(function(t){d(t)&&(t=N.interceptor[t]),l(t)&&n.use(t)}),n(new B(t)).then(function(t){return t.ok?t:o.reject(t)},function(t){var e;return t instanceof Error&&(e=t,"undefined"!=typeof console&&console.error(e)),o.reject(t)})}function D(t,e,n,o){var r=this||{},i={};return g(n=w({},D.actions,n),function(n,s){n=T({url:t,params:w({},e)},o,n),i[s]=function(){return(r.$http||N)(function(t,e){var n,o=w({},t),r={};switch(e.length){case 2:r=e[0],n=e[1];break;case 1:/^(POST|PUT|PATCH)$/i.test(o.method)?n=e[0]:r=e[0];break;case 0:break;default:throw"Expected up to 2 arguments [params, body], got "+e.length+" arguments"}return o.body=n,o.params=w({},o.params,r),o}(n,arguments))}}),i}function J(t){var e,n,r;J.installed||(n=(e=t).config,r=e.nextTick,i=r,a=n.debug||!n.silent,t.url=$,t.http=N,t.resource=D,t.Promise=o,Object.defineProperties(t.prototype,{$url:{get:function(){return b(t.url,this,this.$options.url)}},$http:{get:function(){return b(t.http,this,this.$options.http)}},$resource:{get:function(){return t.resource.bind(this)}},$promise:{get:function(){var e=this;return function(n){return new t.Promise(n,e)}}}}))}return N.options={},N.headers={put:M,post:M,patch:M,delete:M,common:{Accept:"application/json, text/plain, */*"},custom:{}},N.interceptor={before:function(t){l(t.before)&&t.before.call(this,t)},method:function(t){t.emulateHTTP&&/^(PUT|PATCH|DELETE)$/i.test(t.method)&&(t.headers.set("X-HTTP-Method-Override",t.method),t.method="POST")},jsonp:function(t){"JSONP"==t.method&&(t.client=A)},json:function(t){var e=t.headers.get("Content-Type")||"";return m(t.body)&&0===e.indexOf("application/json")&&(t.body=JSON.stringify(t.body)),function(t){return t.bodyText?v(t.text(),function(e){var n,o;if(0===(t.headers.get("Content-Type")||"").indexOf("application/json")||(o=(n=e).match(/^\s*(\[|\{)/))&&{"[":/]\s*$/,"{":/}\s*$/}[o[1]].test(n))try{t.body=JSON.parse(e)}catch(e){t.body=null}else t.body=e;return t}):t}},form:function(t){var e;e=t.body,"undefined"!=typeof FormData&&e instanceof FormData?t.headers.delete("Content-Type"):m(t.body)&&t.emulateJSON&&(t.body=$.params(t.body),t.headers.set("Content-Type","application/x-www-form-urlencoded"))},header:function(t){g(w({},N.headers.common,t.crossOrigin?{}:N.headers.custom,N.headers[p(t.method)]),function(e,n){t.headers.has(n)||t.headers.set(n,e)})},cors:function(t){if(c){var e=$.parse(location.href),n=$.parse(t.getUrl());n.protocol===e.protocol&&n.host===e.host||(t.crossOrigin=!0,t.emulateHTTP=!1,R||(t.client=U))}}},N.interceptors=["before","method","jsonp","json","form","header","cors"],["get","delete","head","jsonp"].forEach(function(t){N[t]=function(e,n){return this(w(n||{},{url:e,method:t}))}}),["post","put","patch"].forEach(function(t){N[t]=function(e,n,o){return this(w(o||{},{url:e,method:t,body:n}))}}),D.actions={get:{method:"GET"},save:{method:"POST"},query:{method:"GET"},update:{method:"PUT"},remove:{method:"DELETE"},delete:{method:"DELETE"}},"undefined"!=typeof window&&window.Vue&&window.Vue.use(J),J});
\ No newline at end of file
diff --git a/advancedcontentfilter/vendor/npm-asset/vue-resource/package.json b/advancedcontentfilter/vendor/npm-asset/vue-resource/package.json
new file mode 100644 (file)
index 0000000..8501a89
--- /dev/null
@@ -0,0 +1,59 @@
+{
+  "name": "vue-resource",
+  "version": "1.5.0",
+  "main": "dist/vue-resource.common.js",
+  "module": "dist/vue-resource.esm.js",
+  "unpkg": "dist/vue-resource.min.js",
+  "jsdelivr": "dist/vue-resource.min.js",
+  "typings": "types/index.d.ts",
+  "description": "The HTTP client for Vue.js",
+  "homepage": "https://github.com/pagekit/vue-resource#readme",
+  "license": "MIT",
+  "keywords": [
+    "vue",
+    "xhr",
+    "http",
+    "ajax"
+  ],
+  "bugs": {
+    "url": "https://github.com/pagekit/vue-resource/issues"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/pagekit/vue-resource.git"
+  },
+  "scripts": {
+    "test": "jest --env=node",
+    "karma": "karma start test/karma.conf.js --single-run",
+    "build": "node build/build.js",
+    "release": "node build/release.js",
+    "webpack": "webpack --config test/webpack.config.js"
+  },
+  "browser": {
+    "got": false
+  },
+  "dependencies": {
+    "got": "^8.0.3"
+  },
+  "devDependencies": {
+    "buble": "^0.19.1",
+    "buble-loader": "^0.4.1",
+    "eslint": "^4.17.0",
+    "generate-release": "^0.14.0",
+    "jasmine": "^3.0.0",
+    "jasmine-core": "^3.1.0",
+    "jest": "^22.2.2",
+    "karma": "^2.0.0",
+    "karma-chrome-launcher": "^2.2.0",
+    "karma-firefox-launcher": "^1.1.0",
+    "karma-jasmine": "^1.1.1",
+    "karma-safari-launcher": "^1.0.0",
+    "karma-webpack": "^2.0.9",
+    "replace-in-file": "^3.1.1",
+    "rollup": "^0.56.2",
+    "rollup-plugin-buble": "^0.19.1",
+    "uglify-js": "^3.3.10",
+    "vue": "^2.5.13",
+    "webpack": "^3.11.0"
+  }
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/vue-resource/src/http/client/index.js b/advancedcontentfilter/vendor/npm-asset/vue-resource/src/http/client/index.js
new file mode 100644 (file)
index 0000000..56cd599
--- /dev/null
@@ -0,0 +1,65 @@
+/**
+ * Base client.
+ */
+
+import Promise from '../../promise';
+import xhrClient from './xhr';
+import nodeClient from './node';
+import {warn, when, isObject, isFunction, inBrowser} from '../../util';
+
+export default function (context) {
+
+    const reqHandlers = [sendRequest], resHandlers = [];
+
+    if (!isObject(context)) {
+        context = null;
+    }
+
+    function Client(request) {
+        while (reqHandlers.length) {
+
+            const handler = reqHandlers.pop();
+
+            if (isFunction(handler)) {
+
+                let response, next;
+
+                response = handler.call(context, request, val => next = val) || next;
+
+                if (isObject(response)) {
+                    return new Promise((resolve, reject) => {
+
+                        resHandlers.forEach(handler => {
+                            response = when(response, response => {
+                                return handler.call(context, response) || response;
+                            }, reject);
+                        });
+
+                        when(response, resolve, reject);
+
+                    }, context);
+                }
+
+                if (isFunction(response)) {
+                    resHandlers.unshift(response);
+                }
+
+            } else {
+                warn(`Invalid interceptor of type ${typeof handler}, must be a function`);
+            }
+        }
+    }
+
+    Client.use = handler => {
+        reqHandlers.push(handler);
+    };
+
+    return Client;
+}
+
+function sendRequest(request) {
+
+    const client = request.client || (inBrowser ? xhrClient : nodeClient);
+
+    return client(request);
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/vue-resource/src/http/client/jsonp.js b/advancedcontentfilter/vendor/npm-asset/vue-resource/src/http/client/jsonp.js
new file mode 100644 (file)
index 0000000..241e7b4
--- /dev/null
@@ -0,0 +1,53 @@
+/**
+ * JSONP client (Browser).
+ */
+
+import Promise from '../../promise';
+
+export default function (request) {
+    return new Promise(resolve => {
+
+        var name = request.jsonp || 'callback', callback = request.jsonpCallback || '_jsonp' + Math.random().toString(36).substr(2), body = null, handler, script;
+
+        handler = ({type}) => {
+
+            var status = 0;
+
+            if (type === 'load' && body !== null) {
+                status = 200;
+            } else if (type === 'error') {
+                status = 500;
+            }
+
+            if (status && window[callback]) {
+                delete window[callback];
+                document.body.removeChild(script);
+            }
+
+            resolve(request.respondWith(body, {status}));
+        };
+
+        window[callback] = result => {
+            body = JSON.stringify(result);
+        };
+
+        request.abort = () => {
+            handler({type: 'abort'});
+        };
+
+        request.params[name] = callback;
+
+        if (request.timeout) {
+            setTimeout(request.abort, request.timeout);
+        }
+
+        script = document.createElement('script');
+        script.src = request.getUrl();
+        script.type = 'text/javascript';
+        script.async = true;
+        script.onload = handler;
+        script.onerror = handler;
+
+        document.body.appendChild(script);
+    });
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/vue-resource/src/http/client/node.js b/advancedcontentfilter/vendor/npm-asset/vue-resource/src/http/client/node.js
new file mode 100644 (file)
index 0000000..d12b33e
--- /dev/null
@@ -0,0 +1,38 @@
+/**
+ * Http client (Node).
+ */
+
+import Promise from '../../promise';
+import {each, trim} from '../../util';
+
+export default function (request) {
+
+    const client = require('got');
+
+    return new Promise(resolve => {
+
+        var url = request.getUrl();
+        var body = request.getBody();
+        var method = request.method;
+        var headers = {}, handler;
+
+        request.headers.forEach((value, name) => {
+            headers[name] = value;
+        });
+
+        client(url, {body, method, headers}).then(handler = (resp) => {
+
+            var response = request.respondWith(resp.body, {
+                status: resp.statusCode,
+                statusText: trim(resp.statusMessage)
+            });
+
+            each(resp.headers, (value, name) => {
+                response.headers.set(name, value);
+            });
+
+            resolve(response);
+
+        }, error => handler(error.response));
+    });
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/vue-resource/src/http/client/xdr.js b/advancedcontentfilter/vendor/npm-asset/vue-resource/src/http/client/xdr.js
new file mode 100644 (file)
index 0000000..20656c7
--- /dev/null
@@ -0,0 +1,38 @@
+/**
+ * XDomain client (Internet Explorer).
+ */
+
+import Promise from '../../promise';
+
+export default function (request) {
+    return new Promise(resolve => {
+
+        var xdr = new XDomainRequest(), handler = ({type}) => {
+
+                var status = 0;
+
+                if (type === 'load') {
+                    status = 200;
+                } else if (type === 'error') {
+                    status = 500;
+                }
+
+                resolve(request.respondWith(xdr.responseText, {status}));
+            };
+
+        request.abort = () => xdr.abort();
+
+        xdr.open(request.method, request.getUrl());
+
+        if (request.timeout) {
+            xdr.timeout = request.timeout;
+        }
+
+        xdr.onload = handler;
+        xdr.onabort = handler;
+        xdr.onerror = handler;
+        xdr.ontimeout = handler;
+        xdr.onprogress = () => {};
+        xdr.send(request.getBody());
+    });
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/vue-resource/src/http/client/xhr.js b/advancedcontentfilter/vendor/npm-asset/vue-resource/src/http/client/xhr.js
new file mode 100644 (file)
index 0000000..cc77187
--- /dev/null
@@ -0,0 +1,74 @@
+/**
+ * XMLHttp client (Browser).
+ */
+
+import Promise from '../../promise';
+import {each, trim, isFunction} from '../../util';
+
+export default function (request) {
+    return new Promise(resolve => {
+
+        var xhr = new XMLHttpRequest(), handler = (event) => {
+
+                var response = request.respondWith(
+                'response' in xhr ? xhr.response : xhr.responseText, {
+                    status: xhr.status === 1223 ? 204 : xhr.status, // IE9 status bug
+                    statusText: xhr.status === 1223 ? 'No Content' : trim(xhr.statusText)
+                });
+
+                each(trim(xhr.getAllResponseHeaders()).split('\n'), row => {
+                    response.headers.append(row.slice(0, row.indexOf(':')), row.slice(row.indexOf(':') + 1));
+                });
+
+                resolve(response);
+            };
+
+        request.abort = () => xhr.abort();
+
+        xhr.open(request.method, request.getUrl(), true);
+
+        if (request.timeout) {
+            xhr.timeout = request.timeout;
+        }
+
+        if (request.responseType && 'responseType' in xhr) {
+            xhr.responseType = request.responseType;
+        }
+
+        if (request.withCredentials || request.credentials) {
+            xhr.withCredentials = true;
+        }
+
+        if (!request.crossOrigin) {
+            request.headers.set('X-Requested-With', 'XMLHttpRequest');
+        }
+
+        // deprecated use downloadProgress
+        if (isFunction(request.progress) && request.method === 'GET') {
+            xhr.addEventListener('progress', request.progress);
+        }
+
+        if (isFunction(request.downloadProgress)) {
+            xhr.addEventListener('progress', request.downloadProgress);
+        }
+
+        // deprecated use uploadProgress
+        if (isFunction(request.progress) && /^(POST|PUT)$/i.test(request.method)) {
+            xhr.upload.addEventListener('progress', request.progress);
+        }
+
+        if (isFunction(request.uploadProgress) && xhr.upload) {
+            xhr.upload.addEventListener('progress', request.uploadProgress);
+        }
+
+        request.headers.forEach((value, name) => {
+            xhr.setRequestHeader(name, value);
+        });
+
+        xhr.onload = handler;
+        xhr.onabort = handler;
+        xhr.onerror = handler;
+        xhr.ontimeout = handler;
+        xhr.send(request.getBody());
+    });
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/vue-resource/src/http/headers.js b/advancedcontentfilter/vendor/npm-asset/vue-resource/src/http/headers.js
new file mode 100644 (file)
index 0000000..5c3e404
--- /dev/null
@@ -0,0 +1,75 @@
+/**
+ * HTTP Headers.
+ */
+
+import {each, trim, toLower} from '../util';
+
+export default class Headers {
+
+    constructor(headers) {
+
+        this.map = {};
+
+        each(headers, (value, name) => this.append(name, value));
+    }
+
+    has(name) {
+        return getName(this.map, name) !== null;
+    }
+
+    get(name) {
+
+        var list = this.map[getName(this.map, name)];
+
+        return list ? list.join() : null;
+    }
+
+    getAll(name) {
+        return this.map[getName(this.map, name)] || [];
+    }
+
+    set(name, value) {
+        this.map[normalizeName(getName(this.map, name) || name)] = [trim(value)];
+    }
+
+    append(name, value) {
+
+        var list = this.map[getName(this.map, name)];
+
+        if (list) {
+            list.push(trim(value));
+        } else {
+            this.set(name, value);
+        }
+    }
+
+    delete(name) {
+        delete this.map[getName(this.map, name)];
+    }
+
+    deleteAll() {
+        this.map = {};
+    }
+
+    forEach(callback, thisArg) {
+        each(this.map, (list, name) => {
+            each(list, value => callback.call(thisArg, value, name, this));
+        });
+    }
+
+}
+
+function getName(map, name) {
+    return Object.keys(map).reduce((prev, curr) => {
+        return toLower(name) === toLower(curr) ? curr : prev;
+    }, null);
+}
+
+function normalizeName(name) {
+
+    if (/[^a-z0-9\-#$%&'*+.^_`|~]/i.test(name)) {
+        throw new TypeError('Invalid character in header field name');
+    }
+
+    return trim(name);
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/vue-resource/src/http/index.js b/advancedcontentfilter/vendor/npm-asset/vue-resource/src/http/index.js
new file mode 100644 (file)
index 0000000..df4743d
--- /dev/null
@@ -0,0 +1,80 @@
+/**
+ * Service for sending network requests.
+ */
+
+const COMMON_HEADERS = {'Accept': 'application/json, text/plain, */*'};
+const JSON_CONTENT_TYPE = {'Content-Type': 'application/json;charset=utf-8'};
+
+import cors from './interceptor/cors';
+import form from './interceptor/form';
+import json from './interceptor/json';
+import jsonp from './interceptor/jsonp';
+import before from './interceptor/before';
+import method from './interceptor/method';
+import header from './interceptor/header';
+import Client from './client/index';
+import Request from './request';
+import Promise from '../promise';
+import {assign, defaults, error, isString, isFunction} from '../util';
+
+export default function Http(options) {
+
+    var self = this || {}, client = Client(self.$vm);
+
+    defaults(options || {}, self.$options, Http.options);
+
+    Http.interceptors.forEach(handler => {
+
+        if (isString(handler)) {
+            handler = Http.interceptor[handler];
+        }
+
+        if (isFunction(handler)) {
+            client.use(handler);
+        }
+
+    });
+
+    return client(new Request(options)).then(response => {
+
+        return response.ok ? response : Promise.reject(response);
+
+    }, response => {
+
+        if (response instanceof Error) {
+            error(response);
+        }
+
+        return Promise.reject(response);
+    });
+}
+
+Http.options = {};
+
+Http.headers = {
+    put: JSON_CONTENT_TYPE,
+    post: JSON_CONTENT_TYPE,
+    patch: JSON_CONTENT_TYPE,
+    delete: JSON_CONTENT_TYPE,
+    common: COMMON_HEADERS,
+    custom: {}
+};
+
+Http.interceptor = {before, method, jsonp, json, form, header, cors};
+Http.interceptors = ['before', 'method', 'jsonp', 'json', 'form', 'header', 'cors'];
+
+['get', 'delete', 'head', 'jsonp'].forEach(method => {
+
+    Http[method] = function (url, options) {
+        return this(assign(options || {}, {url, method}));
+    };
+
+});
+
+['post', 'put', 'patch'].forEach(method => {
+
+    Http[method] = function (url, body, options) {
+        return this(assign(options || {}, {url, method, body}));
+    };
+
+});
diff --git a/advancedcontentfilter/vendor/npm-asset/vue-resource/src/http/interceptor/before.js b/advancedcontentfilter/vendor/npm-asset/vue-resource/src/http/interceptor/before.js
new file mode 100644 (file)
index 0000000..d45c27c
--- /dev/null
@@ -0,0 +1,13 @@
+/**
+ * Before Interceptor.
+ */
+
+import {isFunction} from '../../util';
+
+export default function (request) {
+
+    if (isFunction(request.before)) {
+        request.before.call(this, request);
+    }
+
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/vue-resource/src/http/interceptor/cors.js b/advancedcontentfilter/vendor/npm-asset/vue-resource/src/http/interceptor/cors.js
new file mode 100644 (file)
index 0000000..5146f70
--- /dev/null
@@ -0,0 +1,29 @@
+/**
+ * CORS Interceptor.
+ */
+
+import Url from '../../url/index';
+import xdrClient from '../client/xdr';
+import {inBrowser} from '../../util';
+
+const SUPPORTS_CORS = inBrowser && 'withCredentials' in new XMLHttpRequest();
+
+export default function (request) {
+
+    if (inBrowser) {
+
+        const orgUrl = Url.parse(location.href);
+        const reqUrl = Url.parse(request.getUrl());
+
+        if (reqUrl.protocol !== orgUrl.protocol || reqUrl.host !== orgUrl.host) {
+
+            request.crossOrigin = true;
+            request.emulateHTTP = false;
+
+            if (!SUPPORTS_CORS) {
+                request.client = xdrClient;
+            }
+        }
+    }
+
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/vue-resource/src/http/interceptor/form.js b/advancedcontentfilter/vendor/npm-asset/vue-resource/src/http/interceptor/form.js
new file mode 100644 (file)
index 0000000..8ff3090
--- /dev/null
@@ -0,0 +1,17 @@
+/**
+ * Form data Interceptor.
+ */
+
+import Url from '../../url/index';
+import {isObject, isFormData} from '../../util';
+
+export default function (request) {
+
+    if (isFormData(request.body)) {
+        request.headers.delete('Content-Type');
+    } else if (isObject(request.body) && request.emulateJSON) {
+        request.body = Url.params(request.body);
+        request.headers.set('Content-Type', 'application/x-www-form-urlencoded');
+    }
+
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/vue-resource/src/http/interceptor/header.js b/advancedcontentfilter/vendor/npm-asset/vue-resource/src/http/interceptor/header.js
new file mode 100644 (file)
index 0000000..e71c674
--- /dev/null
@@ -0,0 +1,21 @@
+/**
+ * Header Interceptor.
+ */
+
+import Http from '../index';
+import {assign, each, toLower} from '../../util';
+
+export default function (request) {
+
+    const headers = assign({}, Http.headers.common,
+        !request.crossOrigin ? Http.headers.custom : {},
+        Http.headers[toLower(request.method)]
+    );
+
+    each(headers, (value, name) => {
+        if (!request.headers.has(name)) {
+            request.headers.set(name, value);
+        }
+    });
+
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/vue-resource/src/http/interceptor/json.js b/advancedcontentfilter/vendor/npm-asset/vue-resource/src/http/interceptor/json.js
new file mode 100644 (file)
index 0000000..74ca4cf
--- /dev/null
@@ -0,0 +1,46 @@
+/**
+ * JSON Interceptor.
+ */
+
+import {when, isObject} from '../../util';
+
+export default function (request) {
+
+    const type = request.headers.get('Content-Type') || '';
+
+    if (isObject(request.body) && type.indexOf('application/json') === 0) {
+        request.body = JSON.stringify(request.body);
+    }
+
+    return response => {
+
+        return response.bodyText ? when(response.text(), text => {
+
+            const type = response.headers.get('Content-Type') || '';
+
+            if (type.indexOf('application/json') === 0 || isJson(text)) {
+
+                try {
+                    response.body = JSON.parse(text);
+                } catch (e) {
+                    response.body = null;
+                }
+
+            } else {
+                response.body = text;
+            }
+
+            return response;
+
+        }) : response;
+
+    };
+}
+
+function isJson(str) {
+
+    const start = str.match(/^\s*(\[|\{)/);
+    const end = {'[': /]\s*$/, '{': /}\s*$/};
+
+    return start && end[start[1]].test(str);
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/vue-resource/src/http/interceptor/jsonp.js b/advancedcontentfilter/vendor/npm-asset/vue-resource/src/http/interceptor/jsonp.js
new file mode 100644 (file)
index 0000000..9320229
--- /dev/null
@@ -0,0 +1,13 @@
+/**
+ * JSONP Interceptor.
+ */
+
+import jsonpClient from '../client/jsonp';
+
+export default function (request) {
+
+    if (request.method == 'JSONP') {
+        request.client = jsonpClient;
+    }
+
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/vue-resource/src/http/interceptor/method.js b/advancedcontentfilter/vendor/npm-asset/vue-resource/src/http/interceptor/method.js
new file mode 100644 (file)
index 0000000..ac088b8
--- /dev/null
@@ -0,0 +1,12 @@
+/**
+ * HTTP method override Interceptor.
+ */
+
+export default function (request) {
+
+    if (request.emulateHTTP && /^(PUT|PATCH|DELETE)$/i.test(request.method)) {
+        request.headers.set('X-HTTP-Method-Override', request.method);
+        request.method = 'POST';
+    }
+
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/vue-resource/src/http/request.js b/advancedcontentfilter/vendor/npm-asset/vue-resource/src/http/request.js
new file mode 100644 (file)
index 0000000..d0298e4
--- /dev/null
@@ -0,0 +1,38 @@
+/**
+ * HTTP Request.
+ */
+
+import Url from '../url/index';
+import Headers from './headers';
+import Response from './response';
+import {assign, toUpper} from '../util';
+
+export default class Request {
+
+    constructor(options) {
+
+        this.body = null;
+        this.params = {};
+
+        assign(this, options, {
+            method: toUpper(options.method || 'GET')
+        });
+
+        if (!(this.headers instanceof Headers)) {
+            this.headers = new Headers(this.headers);
+        }
+    }
+
+    getUrl() {
+        return Url(this);
+    }
+
+    getBody() {
+        return this.body;
+    }
+
+    respondWith(body, options) {
+        return new Response(body, assign(options || {}, {url: this.getUrl()}));
+    }
+
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/vue-resource/src/http/response.js b/advancedcontentfilter/vendor/npm-asset/vue-resource/src/http/response.js
new file mode 100644 (file)
index 0000000..d397a5a
--- /dev/null
@@ -0,0 +1,75 @@
+/**
+ * HTTP Response.
+ */
+
+import Headers from './headers';
+import Promise from '../promise';
+import {when, isBlob, isString} from '../util';
+
+export default class Response {
+
+    constructor(body, {url, headers, status, statusText}) {
+
+        this.url = url;
+        this.ok = status >= 200 && status < 300;
+        this.status = status || 0;
+        this.statusText = statusText || '';
+        this.headers = new Headers(headers);
+        this.body = body;
+
+        if (isString(body)) {
+
+            this.bodyText = body;
+
+        } else if (isBlob(body)) {
+
+            this.bodyBlob = body;
+
+            if (isBlobText(body)) {
+                this.bodyText = blobText(body);
+            }
+        }
+    }
+
+    blob() {
+        return when(this.bodyBlob);
+    }
+
+    text() {
+        return when(this.bodyText);
+    }
+
+    json() {
+        return when(this.text(), text => JSON.parse(text));
+    }
+
+}
+
+Object.defineProperty(Response.prototype, 'data', {
+
+    get() {
+        return this.body;
+    },
+
+    set(body) {
+        this.body = body;
+    }
+
+});
+
+function blobText(body) {
+    return new Promise((resolve) => {
+
+        var reader = new FileReader();
+
+        reader.readAsText(body);
+        reader.onload = () => {
+            resolve(reader.result);
+        };
+
+    });
+}
+
+function isBlobText(body) {
+    return body.type.indexOf('text') === 0 || body.type.indexOf('json') !== -1;
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/vue-resource/src/index.js b/advancedcontentfilter/vendor/npm-asset/vue-resource/src/index.js
new file mode 100644 (file)
index 0000000..7308dee
--- /dev/null
@@ -0,0 +1,57 @@
+/**
+ * Install plugin.
+ */
+
+import Url from './url/index';
+import Http from './http/index';
+import Promise from './promise';
+import Resource from './resource';
+import Util, {options} from './util';
+
+function plugin(Vue) {
+
+    if (plugin.installed) {
+        return;
+    }
+
+    Util(Vue);
+
+    Vue.url = Url;
+    Vue.http = Http;
+    Vue.resource = Resource;
+    Vue.Promise = Promise;
+
+    Object.defineProperties(Vue.prototype, {
+
+        $url: {
+            get() {
+                return options(Vue.url, this, this.$options.url);
+            }
+        },
+
+        $http: {
+            get() {
+                return options(Vue.http, this, this.$options.http);
+            }
+        },
+
+        $resource: {
+            get() {
+                return Vue.resource.bind(this);
+            }
+        },
+
+        $promise: {
+            get() {
+                return (executor) => new Vue.Promise(executor, this);
+            }
+        }
+
+    });
+}
+
+if (typeof window !== 'undefined' && window.Vue) {
+    window.Vue.use(plugin);
+}
+
+export default plugin;
diff --git a/advancedcontentfilter/vendor/npm-asset/vue-resource/src/lib/promise.js b/advancedcontentfilter/vendor/npm-asset/vue-resource/src/lib/promise.js
new file mode 100644 (file)
index 0000000..b3cce74
--- /dev/null
@@ -0,0 +1,177 @@
+/**
+ * Promises/A+ polyfill v1.1.4 (https://github.com/bramstein/promis)
+ */
+
+const RESOLVED = 0;
+const REJECTED = 1;
+const PENDING = 2;
+
+import {nextTick} from '../util';
+
+export default function Promise(executor) {
+
+    this.state = PENDING;
+    this.value = undefined;
+    this.deferred = [];
+
+    var promise = this;
+
+    try {
+        executor(function (x) {
+            promise.resolve(x);
+        }, function (r) {
+            promise.reject(r);
+        });
+    } catch (e) {
+        promise.reject(e);
+    }
+}
+
+Promise.reject = function (r) {
+    return new Promise(function (resolve, reject) {
+        reject(r);
+    });
+};
+
+Promise.resolve = function (x) {
+    return new Promise(function (resolve, reject) {
+        resolve(x);
+    });
+};
+
+Promise.all = function all(iterable) {
+    return new Promise(function (resolve, reject) {
+        var count = 0, result = [];
+
+        if (iterable.length === 0) {
+            resolve(result);
+        }
+
+        function resolver(i) {
+            return function (x) {
+                result[i] = x;
+                count += 1;
+
+                if (count === iterable.length) {
+                    resolve(result);
+                }
+            };
+        }
+
+        for (var i = 0; i < iterable.length; i += 1) {
+            Promise.resolve(iterable[i]).then(resolver(i), reject);
+        }
+    });
+};
+
+Promise.race = function race(iterable) {
+    return new Promise(function (resolve, reject) {
+        for (var i = 0; i < iterable.length; i += 1) {
+            Promise.resolve(iterable[i]).then(resolve, reject);
+        }
+    });
+};
+
+var p = Promise.prototype;
+
+p.resolve = function resolve(x) {
+    var promise = this;
+
+    if (promise.state === PENDING) {
+        if (x === promise) {
+            throw new TypeError('Promise settled with itself.');
+        }
+
+        var called = false;
+
+        try {
+            var then = x && x['then'];
+
+            if (x !== null && typeof x === 'object' && typeof then === 'function') {
+                then.call(x, function (x) {
+                    if (!called) {
+                        promise.resolve(x);
+                    }
+                    called = true;
+
+                }, function (r) {
+                    if (!called) {
+                        promise.reject(r);
+                    }
+                    called = true;
+                });
+                return;
+            }
+        } catch (e) {
+            if (!called) {
+                promise.reject(e);
+            }
+            return;
+        }
+
+        promise.state = RESOLVED;
+        promise.value = x;
+        promise.notify();
+    }
+};
+
+p.reject = function reject(reason) {
+    var promise = this;
+
+    if (promise.state === PENDING) {
+        if (reason === promise) {
+            throw new TypeError('Promise settled with itself.');
+        }
+
+        promise.state = REJECTED;
+        promise.value = reason;
+        promise.notify();
+    }
+};
+
+p.notify = function notify() {
+    var promise = this;
+
+    nextTick(function () {
+        if (promise.state !== PENDING) {
+            while (promise.deferred.length) {
+                var deferred = promise.deferred.shift(),
+                    onResolved = deferred[0],
+                    onRejected = deferred[1],
+                    resolve = deferred[2],
+                    reject = deferred[3];
+
+                try {
+                    if (promise.state === RESOLVED) {
+                        if (typeof onResolved === 'function') {
+                            resolve(onResolved.call(undefined, promise.value));
+                        } else {
+                            resolve(promise.value);
+                        }
+                    } else if (promise.state === REJECTED) {
+                        if (typeof onRejected === 'function') {
+                            resolve(onRejected.call(undefined, promise.value));
+                        } else {
+                            reject(promise.value);
+                        }
+                    }
+                } catch (e) {
+                    reject(e);
+                }
+            }
+        }
+    });
+};
+
+p.then = function then(onResolved, onRejected) {
+    var promise = this;
+
+    return new Promise(function (resolve, reject) {
+        promise.deferred.push([onResolved, onRejected, resolve, reject]);
+        promise.notify();
+    });
+};
+
+p.catch = function (onRejected) {
+    return this.then(undefined, onRejected);
+};
diff --git a/advancedcontentfilter/vendor/npm-asset/vue-resource/src/lib/url-template.js b/advancedcontentfilter/vendor/npm-asset/vue-resource/src/lib/url-template.js
new file mode 100644 (file)
index 0000000..189d48d
--- /dev/null
@@ -0,0 +1,150 @@
+/**
+ * URL Template v2.0.6 (https://github.com/bramstein/url-template)
+ */
+
+export function expand(url, params, variables) {
+
+    var tmpl = parse(url), expanded = tmpl.expand(params);
+
+    if (variables) {
+        variables.push.apply(variables, tmpl.vars);
+    }
+
+    return expanded;
+}
+
+export function parse(template) {
+
+    var operators = ['+', '#', '.', '/', ';', '?', '&'], variables = [];
+
+    return {
+        vars: variables,
+        expand(context) {
+            return template.replace(/\{([^{}]+)\}|([^{}]+)/g, (_, expression, literal) => {
+                if (expression) {
+
+                    var operator = null, values = [];
+
+                    if (operators.indexOf(expression.charAt(0)) !== -1) {
+                        operator = expression.charAt(0);
+                        expression = expression.substr(1);
+                    }
+
+                    expression.split(/,/g).forEach((variable) => {
+                        var tmp = /([^:*]*)(?::(\d+)|(\*))?/.exec(variable);
+                        values.push.apply(values, getValues(context, operator, tmp[1], tmp[2] || tmp[3]));
+                        variables.push(tmp[1]);
+                    });
+
+                    if (operator && operator !== '+') {
+
+                        var separator = ',';
+
+                        if (operator === '?') {
+                            separator = '&';
+                        } else if (operator !== '#') {
+                            separator = operator;
+                        }
+
+                        return (values.length !== 0 ? operator : '') + values.join(separator);
+                    } else {
+                        return values.join(',');
+                    }
+
+                } else {
+                    return encodeReserved(literal);
+                }
+            });
+        }
+    };
+}
+
+function getValues(context, operator, key, modifier) {
+
+    var value = context[key], result = [];
+
+    if (isDefined(value) && value !== '') {
+        if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {
+            value = value.toString();
+
+            if (modifier && modifier !== '*') {
+                value = value.substring(0, parseInt(modifier, 10));
+            }
+
+            result.push(encodeValue(operator, value, isKeyOperator(operator) ? key : null));
+        } else {
+            if (modifier === '*') {
+                if (Array.isArray(value)) {
+                    value.filter(isDefined).forEach((value) => {
+                        result.push(encodeValue(operator, value, isKeyOperator(operator) ? key : null));
+                    });
+                } else {
+                    Object.keys(value).forEach((k) => {
+                        if (isDefined(value[k])) {
+                            result.push(encodeValue(operator, value[k], k));
+                        }
+                    });
+                }
+            } else {
+                var tmp = [];
+
+                if (Array.isArray(value)) {
+                    value.filter(isDefined).forEach((value) => {
+                        tmp.push(encodeValue(operator, value));
+                    });
+                } else {
+                    Object.keys(value).forEach((k) => {
+                        if (isDefined(value[k])) {
+                            tmp.push(encodeURIComponent(k));
+                            tmp.push(encodeValue(operator, value[k].toString()));
+                        }
+                    });
+                }
+
+                if (isKeyOperator(operator)) {
+                    result.push(encodeURIComponent(key) + '=' + tmp.join(','));
+                } else if (tmp.length !== 0) {
+                    result.push(tmp.join(','));
+                }
+            }
+        }
+    } else {
+        if (operator === ';') {
+            result.push(encodeURIComponent(key));
+        } else if (value === '' && (operator === '&' || operator === '?')) {
+            result.push(encodeURIComponent(key) + '=');
+        } else if (value === '') {
+            result.push('');
+        }
+    }
+
+    return result;
+}
+
+function isDefined(value) {
+    return value !== undefined && value !== null;
+}
+
+function isKeyOperator(operator) {
+    return operator === ';' || operator === '&' || operator === '?';
+}
+
+function encodeValue(operator, value, key) {
+
+    value = (operator === '+' || operator === '#') ? encodeReserved(value) : encodeURIComponent(value);
+
+    if (key) {
+        return encodeURIComponent(key) + '=' + value;
+    } else {
+        return value;
+    }
+}
+
+function encodeReserved(str) {
+    return str.split(/(%[0-9A-Fa-f]{2})/g).map((part) => {
+        if (!/%[0-9A-Fa-f]/.test(part)) {
+            part = encodeURI(part);
+        }
+        return part;
+    }).join('');
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/vue-resource/src/promise.js b/advancedcontentfilter/vendor/npm-asset/vue-resource/src/promise.js
new file mode 100644 (file)
index 0000000..7311f08
--- /dev/null
@@ -0,0 +1,77 @@
+/**
+ * Promise adapter.
+ */
+
+import PromiseLib from './lib/promise';
+
+if (typeof Promise === 'undefined') {
+    window.Promise = PromiseLib;
+}
+
+export default function PromiseObj(executor, context) {
+
+    if (executor instanceof Promise) {
+        this.promise = executor;
+    } else {
+        this.promise = new Promise(executor.bind(context));
+    }
+
+    this.context = context;
+}
+
+PromiseObj.all = function (iterable, context) {
+    return new PromiseObj(Promise.all(iterable), context);
+};
+
+PromiseObj.resolve = function (value, context) {
+    return new PromiseObj(Promise.resolve(value), context);
+};
+
+PromiseObj.reject = function (reason, context) {
+    return new PromiseObj(Promise.reject(reason), context);
+};
+
+PromiseObj.race = function (iterable, context) {
+    return new PromiseObj(Promise.race(iterable), context);
+};
+
+var p = PromiseObj.prototype;
+
+p.bind = function (context) {
+    this.context = context;
+    return this;
+};
+
+p.then = function (fulfilled, rejected) {
+
+    if (fulfilled && fulfilled.bind && this.context) {
+        fulfilled = fulfilled.bind(this.context);
+    }
+
+    if (rejected && rejected.bind && this.context) {
+        rejected = rejected.bind(this.context);
+    }
+
+    return new PromiseObj(this.promise.then(fulfilled, rejected), this.context);
+};
+
+p.catch = function (rejected) {
+
+    if (rejected && rejected.bind && this.context) {
+        rejected = rejected.bind(this.context);
+    }
+
+    return new PromiseObj(this.promise.catch(rejected), this.context);
+};
+
+p.finally = function (callback) {
+
+    return this.then(function (value) {
+        callback.call(this);
+        return value;
+    }, function (reason) {
+        callback.call(this);
+        return Promise.reject(reason);
+    }
+    );
+};
diff --git a/advancedcontentfilter/vendor/npm-asset/vue-resource/src/resource.js b/advancedcontentfilter/vendor/npm-asset/vue-resource/src/resource.js
new file mode 100644 (file)
index 0000000..f99e42b
--- /dev/null
@@ -0,0 +1,76 @@
+/**
+ * Service for interacting with RESTful services.
+ */
+
+import Http from './http/index';
+import {assign, each, merge} from './util';
+
+export default function Resource(url, params, actions, options) {
+
+    var self = this || {}, resource = {};
+
+    actions = assign({},
+        Resource.actions,
+        actions
+    );
+
+    each(actions, (action, name) => {
+
+        action = merge({url, params: assign({}, params)}, options, action);
+
+        resource[name] = function () {
+            return (self.$http || Http)(opts(action, arguments));
+        };
+    });
+
+    return resource;
+}
+
+function opts(action, args) {
+
+    var options = assign({}, action), params = {}, body;
+
+    switch (args.length) {
+
+        case 2:
+
+            params = args[0];
+            body = args[1];
+
+            break;
+
+        case 1:
+
+            if (/^(POST|PUT|PATCH)$/i.test(options.method)) {
+                body = args[0];
+            } else {
+                params = args[0];
+            }
+
+            break;
+
+        case 0:
+
+            break;
+
+        default:
+
+            throw 'Expected up to 2 arguments [params, body], got ' + args.length + ' arguments';
+    }
+
+    options.body = body;
+    options.params = assign({}, options.params, params);
+
+    return options;
+}
+
+Resource.actions = {
+
+    get: {method: 'GET'},
+    save: {method: 'POST'},
+    query: {method: 'GET'},
+    update: {method: 'PUT'},
+    remove: {method: 'DELETE'},
+    delete: {method: 'DELETE'}
+
+};
diff --git a/advancedcontentfilter/vendor/npm-asset/vue-resource/src/url/index.js b/advancedcontentfilter/vendor/npm-asset/vue-resource/src/url/index.js
new file mode 100644 (file)
index 0000000..c4963b9
--- /dev/null
@@ -0,0 +1,135 @@
+/**
+ * Service for URL templating.
+ */
+
+import root from './root';
+import query from './query';
+import template from './template';
+import {each, merge, isArray, isFunction, isObject, isPlainObject, isString} from '../util';
+
+export default function Url(url, params) {
+
+    var self = this || {}, options = url, transform;
+
+    if (isString(url)) {
+        options = {url, params};
+    }
+
+    options = merge({}, Url.options, self.$options, options);
+
+    Url.transforms.forEach(handler => {
+
+        if (isString(handler)) {
+            handler = Url.transform[handler];
+        }
+
+        if (isFunction(handler)) {
+            transform = factory(handler, transform, self.$vm);
+        }
+
+    });
+
+    return transform(options);
+}
+
+/**
+ * Url options.
+ */
+
+Url.options = {
+    url: '',
+    root: null,
+    params: {}
+};
+
+/**
+ * Url transforms.
+ */
+
+Url.transform = {template, query, root};
+Url.transforms = ['template', 'query', 'root'];
+
+/**
+ * Encodes a Url parameter string.
+ *
+ * @param {Object} obj
+ */
+
+Url.params = function (obj) {
+
+    var params = [], escape = encodeURIComponent;
+
+    params.add = function (key, value) {
+
+        if (isFunction(value)) {
+            value = value();
+        }
+
+        if (value === null) {
+            value = '';
+        }
+
+        this.push(escape(key) + '=' + escape(value));
+    };
+
+    serialize(params, obj);
+
+    return params.join('&').replace(/%20/g, '+');
+};
+
+/**
+ * Parse a URL and return its components.
+ *
+ * @param {String} url
+ */
+
+Url.parse = function (url) {
+
+    var el = document.createElement('a');
+
+    if (document.documentMode) {
+        el.href = url;
+        url = el.href;
+    }
+
+    el.href = url;
+
+    return {
+        href: el.href,
+        protocol: el.protocol ? el.protocol.replace(/:$/, '') : '',
+        port: el.port,
+        host: el.host,
+        hostname: el.hostname,
+        pathname: el.pathname.charAt(0) === '/' ? el.pathname : '/' + el.pathname,
+        search: el.search ? el.search.replace(/^\?/, '') : '',
+        hash: el.hash ? el.hash.replace(/^#/, '') : ''
+    };
+};
+
+function factory(handler, next, vm) {
+    return options => {
+        return handler.call(vm, options, next);
+    };
+}
+
+function serialize(params, obj, scope) {
+
+    var array = isArray(obj), plain = isPlainObject(obj), hash;
+
+    each(obj, (value, key) => {
+
+        hash = isObject(value) || isArray(value);
+
+        if (scope) {
+            key = scope + '[' + (plain || hash ? key : '') + ']';
+        }
+
+        if (!scope && array) {
+            params.add(value.name, value.value);
+        } else if (hash) {
+            serialize(params, value, key);
+        } else {
+            params.add(key, value);
+        }
+    });
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/vue-resource/src/url/query.js b/advancedcontentfilter/vendor/npm-asset/vue-resource/src/url/query.js
new file mode 100644 (file)
index 0000000..627bbc8
--- /dev/null
@@ -0,0 +1,25 @@
+/**
+ * Query Parameter Transform.
+ */
+
+import Url from './index';
+import {each} from '../util';
+
+export default function (options, next) {
+
+    var urlParams = Object.keys(Url.options.params), query = {}, url = next(options);
+
+    each(options.params, (value, key) => {
+        if (urlParams.indexOf(key) === -1) {
+            query[key] = value;
+        }
+    });
+
+    query = Url.params(query);
+
+    if (query) {
+        url += (url.indexOf('?') == -1 ? '?' : '&') + query;
+    }
+
+    return url;
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/vue-resource/src/url/root.js b/advancedcontentfilter/vendor/npm-asset/vue-resource/src/url/root.js
new file mode 100644 (file)
index 0000000..9af294c
--- /dev/null
@@ -0,0 +1,16 @@
+/**
+ * Root Prefix Transform.
+ */
+
+import {isString, trimEnd} from '../util';
+
+export default function (options, next) {
+
+    var url = next(options);
+
+    if (isString(options.root) && !/^(https?:)?\//.test(url)) {
+        url = trimEnd(options.root, '/') + '/' + url;
+    }
+
+    return url;
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/vue-resource/src/url/template.js b/advancedcontentfilter/vendor/npm-asset/vue-resource/src/url/template.js
new file mode 100644 (file)
index 0000000..603c01a
--- /dev/null
@@ -0,0 +1,16 @@
+/**
+ * URL Template (RFC 6570) Transform.
+ */
+
+import {expand} from '../lib/url-template';
+
+export default function (options) {
+
+    var variables = [], url = expand(options.url, options.params, variables);
+
+    variables.forEach((key) => {
+        delete options.params[key];
+    });
+
+    return url;
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/vue-resource/src/util.js b/advancedcontentfilter/vendor/npm-asset/vue-resource/src/util.js
new file mode 100644 (file)
index 0000000..2a62f78
--- /dev/null
@@ -0,0 +1,183 @@
+/**
+ * Utility functions.
+ */
+
+import Promise from './promise';
+
+var {hasOwnProperty} = {}, {slice} = [], debug = false, ntick;
+
+export const inBrowser = typeof window !== 'undefined';
+
+export default function ({config, nextTick}) {
+    ntick = nextTick;
+    debug = config.debug || !config.silent;
+}
+
+export function warn(msg) {
+    if (typeof console !== 'undefined' && debug) {
+        console.warn('[VueResource warn]: ' + msg);
+    }
+}
+
+export function error(msg) {
+    if (typeof console !== 'undefined') {
+        console.error(msg);
+    }
+}
+
+export function nextTick(cb, ctx) {
+    return ntick(cb, ctx);
+}
+
+export function trim(str) {
+    return str ? str.replace(/^\s*|\s*$/g, '') : '';
+}
+
+export function trimEnd(str, chars) {
+
+    if (str && chars === undefined) {
+        return str.replace(/\s+$/, '');
+    }
+
+    if (!str || !chars) {
+        return str;
+    }
+
+    return str.replace(new RegExp(`[${chars}]+$`), '');
+}
+
+export function toLower(str) {
+    return str ? str.toLowerCase() : '';
+}
+
+export function toUpper(str) {
+    return str ? str.toUpperCase() : '';
+}
+
+export const isArray = Array.isArray;
+
+export function isString(val) {
+    return typeof val === 'string';
+}
+
+export function isBoolean(val) {
+    return val === true || val === false;
+}
+
+export function isFunction(val) {
+    return typeof val === 'function';
+}
+
+export function isObject(obj) {
+    return obj !== null && typeof obj === 'object';
+}
+
+export function isPlainObject(obj) {
+    return isObject(obj) && Object.getPrototypeOf(obj) == Object.prototype;
+}
+
+export function isBlob(obj) {
+    return typeof Blob !== 'undefined' && obj instanceof Blob;
+}
+
+export function isFormData(obj) {
+    return typeof FormData !== 'undefined' && obj instanceof FormData;
+}
+
+export function when(value, fulfilled, rejected) {
+
+    var promise = Promise.resolve(value);
+
+    if (arguments.length < 2) {
+        return promise;
+    }
+
+    return promise.then(fulfilled, rejected);
+}
+
+export function options(fn, obj, opts) {
+
+    opts = opts || {};
+
+    if (isFunction(opts)) {
+        opts = opts.call(obj);
+    }
+
+    return merge(fn.bind({$vm: obj, $options: opts}), fn, {$options: opts});
+}
+
+export function each(obj, iterator) {
+
+    var i, key;
+
+    if (isArray(obj)) {
+        for (i = 0; i < obj.length; i++) {
+            iterator.call(obj[i], obj[i], i);
+        }
+    } else if (isObject(obj)) {
+        for (key in obj) {
+            if (hasOwnProperty.call(obj, key)) {
+                iterator.call(obj[key], obj[key], key);
+            }
+        }
+    }
+
+    return obj;
+}
+
+export const assign = Object.assign || _assign;
+
+export function merge(target) {
+
+    var args = slice.call(arguments, 1);
+
+    args.forEach(source => {
+        _merge(target, source, true);
+    });
+
+    return target;
+}
+
+export function defaults(target) {
+
+    var args = slice.call(arguments, 1);
+
+    args.forEach(source => {
+
+        for (var key in source) {
+            if (target[key] === undefined) {
+                target[key] = source[key];
+            }
+        }
+
+    });
+
+    return target;
+}
+
+function _assign(target) {
+
+    var args = slice.call(arguments, 1);
+
+    args.forEach(source => {
+        _merge(target, source);
+    });
+
+    return target;
+}
+
+function _merge(target, source, deep) {
+    for (var key in source) {
+        if (deep && (isPlainObject(source[key]) || isArray(source[key]))) {
+            if (isPlainObject(source[key]) && !isPlainObject(target[key])) {
+                target[key] = {};
+            }
+            if (isArray(source[key]) && !isArray(target[key])) {
+                target[key] = [];
+            }
+            _merge(target[key], source[key], deep);
+        } else if (source[key] !== undefined) {
+            target[key] = source[key];
+        }
+    }
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/vue-resource/test/data/invalid.json b/advancedcontentfilter/vendor/npm-asset/vue-resource/test/data/invalid.json
new file mode 100644 (file)
index 0000000..e466dcb
--- /dev/null
@@ -0,0 +1 @@
+invalid
\ No newline at end of file
diff --git a/advancedcontentfilter/vendor/npm-asset/vue-resource/test/data/text.txt b/advancedcontentfilter/vendor/npm-asset/vue-resource/test/data/text.txt
new file mode 100644 (file)
index 0000000..f3a3485
--- /dev/null
@@ -0,0 +1 @@
+text
\ No newline at end of file
diff --git a/advancedcontentfilter/vendor/npm-asset/vue-resource/test/data/valid.json b/advancedcontentfilter/vendor/npm-asset/vue-resource/test/data/valid.json
new file mode 100644 (file)
index 0000000..18d7acf
--- /dev/null
@@ -0,0 +1 @@
+{"foo": "bar"}
\ No newline at end of file
diff --git a/advancedcontentfilter/vendor/npm-asset/vue-resource/test/http.js b/advancedcontentfilter/vendor/npm-asset/vue-resource/test/http.js
new file mode 100644 (file)
index 0000000..d3e2493
--- /dev/null
@@ -0,0 +1,200 @@
+import Vue from 'vue';
+
+describe('Vue.http', function () {
+
+    it('get("data/text.txt")', done => {
+
+        Vue.http.get('data/text.txt').then(res => {
+
+            expect(res.ok).toBe(true);
+            expect(res.status).toBe(200);
+            expect(res.body).toBe('text');
+            expect(res.data).toBe(res.body);
+            expect(res.headers.get('Content-Type')).toBe('text/plain');
+
+            done();
+        });
+
+    });
+
+    it('get("data/valid.json")', done => {
+
+        Vue.http.get('data/valid.json').then(res => {
+
+            expect(res.ok).toBe(true);
+            expect(res.status).toBe(200);
+            expect(typeof res.body).toBe('object');
+            expect(res.body.foo).toBe('bar');
+
+            done();
+        });
+
+    });
+
+    it('get("data/invalid.json")', done => {
+
+        Vue.http.get('data/invalid.json').then(res => {
+
+            expect(res.ok).toBe(true);
+            expect(res.status).toBe(200);
+            expect(res.body).toBeNull();
+
+            done();
+        });
+
+    });
+
+    it('get("github.com/avatar")', done => {
+
+        Vue.http.get('https://avatars1.githubusercontent.com/u/6128107', {responseType: 'blob'}).then(res => {
+
+            expect(res.ok).toBe(true);
+            expect(res.status).toBe(200);
+            expect(res.body instanceof Blob).toBe(true);
+            expect(res.body.type).toBe('image/png');
+
+            done();
+        });
+
+    });
+
+    it('get("cors-api.appspot.com")', done => {
+
+        Vue.http.get('http://server.cors-api.appspot.com/server?id=1&enable=true').then(res => {
+
+            expect(res.ok).toBe(true);
+            expect(res.status).toBe(200);
+            expect(typeof res.body).toBe('object');
+            expect(res.body.shift().requestType).toBe('cors');
+
+            if (res.headers.get('Content-Type')) {
+                expect(res.headers.get('Content-Type')).toBe('application/json');
+            }
+
+            done();
+        });
+
+    });
+
+    it('jsonp("jsfiddle.net/jsonp")', done => {
+
+        Vue.http.jsonp('http://jsfiddle.net/echo/jsonp/', {params: {foo: 'bar'}}).then(res => {
+
+            expect(res.ok).toBe(true);
+            expect(res.status).toBe(200);
+            expect(typeof res.body).toBe('object');
+            expect(res.body.foo).toBe('bar');
+
+            done();
+        });
+
+    });
+
+});
+
+describe('this.$http', function () {
+
+    it('get("data/valid.json")', done => {
+
+        var vm = new Vue({
+
+            created() {
+
+                this.$http.get('data/valid.json').then(res => {
+
+                    expect(this).toBe(vm);
+                    expect(res.ok).toBe(true);
+                    expect(res.status).toBe(200);
+                    expect(typeof res.body).toBe('object');
+                    expect(res.body.foo).toBe('bar');
+
+                    done();
+
+                });
+
+            }
+
+        });
+
+    });
+
+    it('get("data/valid.json") with timeout', done => {
+
+        var vm = new Vue({
+
+            created() {
+
+                var random = Math.random().toString(36).substr(2);
+
+                this.$http.get(`data/valid.json?${random}`, {timeout: 1}).then(res => {
+
+                    fail('Callback has been called');
+
+                }, res => {
+
+                    expect(res.ok).toBe(false);
+                    expect(res.status).toBe(0);
+
+                    done();
+
+                });
+
+            }
+
+        });
+
+    });
+
+    it('get("data/valid.json") with abort()', done => {
+
+        var vm = new Vue({
+
+            created() {
+
+                var random = Math.random().toString(36).substr(2);
+
+                this.$http.get(`data/valid.json?${random}`, {
+
+                    before(req) {
+                        setTimeout(() => {
+
+                            expect(typeof req.abort).toBe('function');
+
+                            req.abort();
+
+                        }, 0);
+                    }
+
+                }).then(res => {
+                    fail('Callback has been called');
+                }, res => {
+                    done();
+                });
+            }
+
+        });
+
+    });
+
+    it('get("data/notfound.json") using catch()', done => {
+
+        var vm = new Vue({
+
+            created() {
+
+                this.$http.get('data/notfound.json').catch(res => {
+
+                    expect(this).toBe(vm);
+                    expect(res.ok).toBe(false);
+                    expect(res.status).toBe(404);
+
+                    done();
+                });
+
+            }
+
+        });
+
+    });
+
+});
\ No newline at end of file
diff --git a/advancedcontentfilter/vendor/npm-asset/vue-resource/test/http.test.js b/advancedcontentfilter/vendor/npm-asset/vue-resource/test/http.test.js
new file mode 100644 (file)
index 0000000..c01b4c6
--- /dev/null
@@ -0,0 +1,34 @@
+var Vue = require('vue');
+var VueResource = require('../dist/vue-resource.common.js');
+
+Vue.use(VueResource);
+
+describe('Vue.http', function () {
+
+    it('post("jsfiddle.net/html")', () => {
+
+        return Vue.http.post('http://jsfiddle.net/echo/html/', {html: 'text'}, {emulateJSON: true}).then(res => {
+
+            expect(res.ok).toBe(true);
+            expect(res.status).toBe(200);
+            expect(typeof res.body).toBe('string');
+            expect(res.body).toBe('text');
+
+        });
+
+    });
+
+    it('post("jsfiddle.net/json")', () => {
+
+        return Vue.http.post('http://jsfiddle.net/echo/json/', {json: JSON.stringify({foo: 'bar'})}, {emulateJSON: true}).then(res => {
+
+            expect(res.ok).toBe(true);
+            expect(res.status).toBe(200);
+            expect(typeof res.body).toBe('object');
+            expect(res.body.foo).toBe('bar');
+
+        });
+
+    });
+
+});
diff --git a/advancedcontentfilter/vendor/npm-asset/vue-resource/test/index.html b/advancedcontentfilter/vendor/npm-asset/vue-resource/test/index.html
new file mode 100644 (file)
index 0000000..a60aca5
--- /dev/null
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>Vue Resource - Jasmine</title>
+
+  <link rel="shortcut icon" type="image/png" href="../node_modules/jasmine-core/images/jasmine_favicon.png">
+  <link rel="stylesheet" href="../node_modules/jasmine-core/lib/jasmine-core/jasmine.css">
+
+  <script src="../node_modules/jasmine-core/lib/jasmine-core/jasmine.js"></script>
+  <script src="../node_modules/jasmine-core/lib/jasmine-core/jasmine-html.js"></script>
+  <script src="../node_modules/jasmine-core/lib/jasmine-core/boot.js"></script>
+  <script src="specs.js"></script>
+
+</head>
+<body>
+</body>
+</html>
diff --git a/advancedcontentfilter/vendor/npm-asset/vue-resource/test/index.js b/advancedcontentfilter/vendor/npm-asset/vue-resource/test/index.js
new file mode 100644 (file)
index 0000000..97ea681
--- /dev/null
@@ -0,0 +1,9 @@
+import Vue from 'vue';
+import VueResource from '../src/index';
+
+Vue.use(VueResource);
+
+require('./url');
+require('./http');
+require('./resource');
+require('./promise');
diff --git a/advancedcontentfilter/vendor/npm-asset/vue-resource/test/karma.conf.js b/advancedcontentfilter/vendor/npm-asset/vue-resource/test/karma.conf.js
new file mode 100644 (file)
index 0000000..cfef42a
--- /dev/null
@@ -0,0 +1,26 @@
+module.exports = config => {
+
+  config.set({
+
+    basePath: __dirname,
+
+    frameworks: ['jasmine'],
+
+    browsers: ['Chrome', 'Safari', 'Firefox'],
+
+    files: [
+      'index.js',
+      {pattern: 'data/*', included: false},
+    ],
+
+    preprocessors: {
+      'index.js': ['webpack']
+    },
+
+    proxies: {
+      '/data/': '/base/data/'
+    },
+
+  });
+
+};
diff --git a/advancedcontentfilter/vendor/npm-asset/vue-resource/test/promise.js b/advancedcontentfilter/vendor/npm-asset/vue-resource/test/promise.js
new file mode 100644 (file)
index 0000000..e3a685b
--- /dev/null
@@ -0,0 +1,125 @@
+import Promise from '../src/promise';
+
+describe('Vue.promise ' + (window.Promise !== undefined ? '(native)' : '(polyfill)'), function () {
+
+    it('then fulfill', function (done) {
+
+        Promise.resolve(1).then(function (value) {
+            expect(value).toBe(1);
+            done();
+        });
+
+    });
+
+    it('then reject', function (done) {
+
+        Promise.reject(1).then(undefined, function (value) {
+            expect(value).toBe(1);
+            done();
+        });
+
+    });
+
+    it('catch', function (done) {
+
+        Promise.reject(1).catch(function (value) {
+            expect(value).toBe(1);
+            done();
+        });
+
+    });
+
+    it('finally fulfill', function (done) {
+
+        Promise.resolve(1).finally(function (arg) {
+            expect(arg).toBe(undefined);
+        }).then(function (arg) {
+            expect(arg).toBe(1);
+            done();
+        });
+
+    });
+
+    it('finally reject', function (done) {
+
+        Promise.reject(1).finally(function (arg) {
+            expect(arg).toBe(undefined);
+        }).catch(function (arg) {
+            expect(arg).toBe(1);
+            done();
+        });
+
+    });
+
+    it('all', function (done) {
+
+        Promise.all([
+
+            Promise.resolve(1),
+            Promise.resolve(2)
+
+        ]).then(function (values) {
+            expect(values[0]).toBe(1);
+            expect(values[1]).toBe(2);
+            done();
+        });
+
+    });
+
+    it('duplicate', function (done) {
+
+        Promise.all([
+
+            Promise.resolve(1).then(function (value) {
+                expect(value).toBe(1);
+            }),
+
+            Promise.resolve(2).then(function (value) {
+                expect(value).toBe(2);
+            })
+
+        ]).then(done);
+
+    });
+
+    it('context', function (done) {
+
+        var context = {foo: 'bar'};
+
+        Promise.resolve().bind(context).then(function () {
+            expect(this).toBe(context);
+            done();
+        });
+
+    });
+
+    it('context chain fulfill', function (done) {
+
+        var context = {foo: 'bar'};
+
+        Promise.resolve().bind(context).catch(undefined).finally(function () {
+            expect(this).toBe(context);
+        }).then(function () {
+            expect(this).toBe(context);
+            done();
+        });
+
+    });
+
+    it('context chain reject', function (done) {
+
+        var context = {foo: 'bar'};
+
+        Promise.reject().bind(context).catch(function () {
+            expect(this).toBe(context);
+            return Promise.reject();
+        }).finally(function () {
+            expect(this).toBe(context);
+        }).catch(function () {
+            expect(this).toBe(context);
+            done();
+        });
+
+    });
+
+});
diff --git a/advancedcontentfilter/vendor/npm-asset/vue-resource/test/resource.js b/advancedcontentfilter/vendor/npm-asset/vue-resource/test/resource.js
new file mode 100644 (file)
index 0000000..e874656
--- /dev/null
@@ -0,0 +1,51 @@
+import Vue from 'vue';
+
+describe('this.$resource', function () {
+
+    it('get({file: "valid.json"})', (done) => {
+
+        var vm = new Vue({
+
+            created() {
+
+                var resource = this.$resource('data{/file}');
+
+                resource.get({file: 'valid.json'}).then((res) => {
+
+                    expect(res.ok).toBe(true);
+                    expect(res.status).toBe(200);
+                    expect(res.data.foo).toBe('bar');
+
+                    done();
+                });
+
+            }
+
+        });
+
+    });
+
+    it('save({file: "valid.json"}, {foo: "bar"})', (done) => {
+
+        var vm = new Vue({
+
+            created() {
+
+                var resource = this.$resource('data{/file}');
+
+                resource.save({file: 'valid.json'}, {foo: 'bar'}).then((res) => {
+
+                    expect(res.ok).toBe(true);
+                    expect(res.status).toBe(200);
+                    expect(res.data.foo).toBe('bar');
+
+                    done();
+                });
+
+            }
+
+        });
+
+    });
+
+});
diff --git a/advancedcontentfilter/vendor/npm-asset/vue-resource/test/specs.js b/advancedcontentfilter/vendor/npm-asset/vue-resource/test/specs.js
new file mode 100644 (file)
index 0000000..76eb020
--- /dev/null
@@ -0,0 +1,10662 @@
+/******/ (function(modules) { // webpackBootstrap
+/******/       // The module cache
+/******/       var installedModules = {};
+/******/
+/******/       // The require function
+/******/       function __webpack_require__(moduleId) {
+/******/
+/******/               // Check if module is in cache
+/******/               if(installedModules[moduleId]) {
+/******/                       return installedModules[moduleId].exports;
+/******/               }
+/******/               // Create a new module (and put it into the cache)
+/******/               var module = installedModules[moduleId] = {
+/******/                       i: moduleId,
+/******/                       l: false,
+/******/                       exports: {}
+/******/               };
+/******/
+/******/               // Execute the module function
+/******/               modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/               // Flag the module as loaded
+/******/               module.l = true;
+/******/
+/******/               // Return the exports of the module
+/******/               return module.exports;
+/******/       }
+/******/
+/******/
+/******/       // expose the modules object (__webpack_modules__)
+/******/       __webpack_require__.m = modules;
+/******/
+/******/       // expose the module cache
+/******/       __webpack_require__.c = installedModules;
+/******/
+/******/       // define getter function for harmony exports
+/******/       __webpack_require__.d = function(exports, name, getter) {
+/******/               if(!__webpack_require__.o(exports, name)) {
+/******/                       Object.defineProperty(exports, name, {
+/******/                               configurable: false,
+/******/                               enumerable: true,
+/******/                               get: getter
+/******/                       });
+/******/               }
+/******/       };
+/******/
+/******/       // getDefaultExport function for compatibility with non-harmony modules
+/******/       __webpack_require__.n = function(module) {
+/******/               var getter = module && module.__esModule ?
+/******/                       function getDefault() { return module['default']; } :
+/******/                       function getModuleExports() { return module; };
+/******/               __webpack_require__.d(getter, 'a', getter);
+/******/               return getter;
+/******/       };
+/******/
+/******/       // Object.prototype.hasOwnProperty.call
+/******/       __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/       // __webpack_public_path__
+/******/       __webpack_require__.p = "";
+/******/
+/******/       // Load entry module and return exports
+/******/       return __webpack_require__(__webpack_require__.s = 5);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "f", function() { return inBrowser; });
+/* harmony export (immutable) */ __webpack_exports__["u"] = warn;
+/* harmony export (immutable) */ __webpack_exports__["e"] = error;
+/* harmony export (immutable) */ __webpack_exports__["o"] = nextTick;
+/* harmony export (immutable) */ __webpack_exports__["s"] = trim;
+/* harmony export (immutable) */ __webpack_exports__["t"] = trimEnd;
+/* harmony export (immutable) */ __webpack_exports__["q"] = toLower;
+/* harmony export (immutable) */ __webpack_exports__["r"] = toUpper;
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "g", function() { return isArray; });
+/* harmony export (immutable) */ __webpack_exports__["m"] = isString;
+/* unused harmony export isBoolean */
+/* harmony export (immutable) */ __webpack_exports__["j"] = isFunction;
+/* harmony export (immutable) */ __webpack_exports__["k"] = isObject;
+/* harmony export (immutable) */ __webpack_exports__["l"] = isPlainObject;
+/* harmony export (immutable) */ __webpack_exports__["h"] = isBlob;
+/* harmony export (immutable) */ __webpack_exports__["i"] = isFormData;
+/* harmony export (immutable) */ __webpack_exports__["v"] = when;
+/* harmony export (immutable) */ __webpack_exports__["p"] = options;
+/* harmony export (immutable) */ __webpack_exports__["d"] = each;
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return assign; });
+/* harmony export (immutable) */ __webpack_exports__["n"] = merge;
+/* harmony export (immutable) */ __webpack_exports__["c"] = defaults;
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__promise__ = __webpack_require__(1);
+/**
+ * Utility functions.
+ */
+
+
+
+var ref = {};
+var hasOwnProperty = ref.hasOwnProperty;
+;
+var ref$1 = [];
+var slice = ref$1.slice;
+var debug = false, ntick;
+
+var inBrowser = typeof window !== 'undefined';
+
+/* harmony default export */ __webpack_exports__["b"] = (function (ref) {
+    var config = ref.config;
+    var nextTick = ref.nextTick;
+
+    ntick = nextTick;
+    debug = config.debug || !config.silent;
+});
+
+function warn(msg) {
+    if (typeof console !== 'undefined' && debug) {
+        console.warn('[VueResource warn]: ' + msg);
+    }
+}
+
+function error(msg) {
+    if (typeof console !== 'undefined') {
+        console.error(msg);
+    }
+}
+
+function nextTick(cb, ctx) {
+    return ntick(cb, ctx);
+}
+
+function trim(str) {
+    return str ? str.replace(/^\s*|\s*$/g, '') : '';
+}
+
+function trimEnd(str, chars) {
+
+    if (str && chars === undefined) {
+        return str.replace(/\s+$/, '');
+    }
+
+    if (!str || !chars) {
+        return str;
+    }
+
+    return str.replace(new RegExp(("[" + chars + "]+$")), '');
+}
+
+function toLower(str) {
+    return str ? str.toLowerCase() : '';
+}
+
+function toUpper(str) {
+    return str ? str.toUpperCase() : '';
+}
+
+var isArray = Array.isArray;
+
+function isString(val) {
+    return typeof val === 'string';
+}
+
+function isBoolean(val) {
+    return val === true || val === false;
+}
+
+function isFunction(val) {
+    return typeof val === 'function';
+}
+
+function isObject(obj) {
+    return obj !== null && typeof obj === 'object';
+}
+
+function isPlainObject(obj) {
+    return isObject(obj) && Object.getPrototypeOf(obj) == Object.prototype;
+}
+
+function isBlob(obj) {
+    return typeof Blob !== 'undefined' && obj instanceof Blob;
+}
+
+function isFormData(obj) {
+    return typeof FormData !== 'undefined' && obj instanceof FormData;
+}
+
+function when(value, fulfilled, rejected) {
+
+    var promise = __WEBPACK_IMPORTED_MODULE_0__promise__["a" /* default */].resolve(value);
+
+    if (arguments.length < 2) {
+        return promise;
+    }
+
+    return promise.then(fulfilled, rejected);
+}
+
+function options(fn, obj, opts) {
+
+    opts = opts || {};
+
+    if (isFunction(opts)) {
+        opts = opts.call(obj);
+    }
+
+    return merge(fn.bind({$vm: obj, $options: opts}), fn, {$options: opts});
+}
+
+function each(obj, iterator) {
+
+    var i, key;
+
+    if (isArray(obj)) {
+        for (i = 0; i < obj.length; i++) {
+            iterator.call(obj[i], obj[i], i);
+        }
+    } else if (isObject(obj)) {
+        for (key in obj) {
+            if (hasOwnProperty.call(obj, key)) {
+                iterator.call(obj[key], obj[key], key);
+            }
+        }
+    }
+
+    return obj;
+}
+
+var assign = Object.assign || _assign;
+
+function merge(target) {
+
+    var args = slice.call(arguments, 1);
+
+    args.forEach(function (source) {
+        _merge(target, source, true);
+    });
+
+    return target;
+}
+
+function defaults(target) {
+
+    var args = slice.call(arguments, 1);
+
+    args.forEach(function (source) {
+
+        for (var key in source) {
+            if (target[key] === undefined) {
+                target[key] = source[key];
+            }
+        }
+
+    });
+
+    return target;
+}
+
+function _assign(target) {
+
+    var args = slice.call(arguments, 1);
+
+    args.forEach(function (source) {
+        _merge(target, source);
+    });
+
+    return target;
+}
+
+function _merge(target, source, deep) {
+    for (var key in source) {
+        if (deep && (isPlainObject(source[key]) || isArray(source[key]))) {
+            if (isPlainObject(source[key]) && !isPlainObject(target[key])) {
+                target[key] = {};
+            }
+            if (isArray(source[key]) && !isArray(target[key])) {
+                target[key] = [];
+            }
+            _merge(target[key], source[key], deep);
+        } else if (source[key] !== undefined) {
+            target[key] = source[key];
+        }
+    }
+}
+
+
+/***/ }),
+/* 1 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+
+// EXTERNAL MODULE: ./src/util.js
+var util = __webpack_require__(0);
+
+// CONCATENATED MODULE: ./src/lib/promise.js
+/**
+ * Promises/A+ polyfill v1.1.4 (https://github.com/bramstein/promis)
+ */
+
+var RESOLVED = 0;
+var REJECTED = 1;
+var PENDING = 2;
+
+
+
+function promise_Promise(executor) {
+
+    this.state = PENDING;
+    this.value = undefined;
+    this.deferred = [];
+
+    var promise = this;
+
+    try {
+        executor(function (x) {
+            promise.resolve(x);
+        }, function (r) {
+            promise.reject(r);
+        });
+    } catch (e) {
+        promise.reject(e);
+    }
+}
+
+promise_Promise.reject = function (r) {
+    return new promise_Promise(function (resolve, reject) {
+        reject(r);
+    });
+};
+
+promise_Promise.resolve = function (x) {
+    return new promise_Promise(function (resolve, reject) {
+        resolve(x);
+    });
+};
+
+promise_Promise.all = function all(iterable) {
+    return new promise_Promise(function (resolve, reject) {
+        var count = 0, result = [];
+
+        if (iterable.length === 0) {
+            resolve(result);
+        }
+
+        function resolver(i) {
+            return function (x) {
+                result[i] = x;
+                count += 1;
+
+                if (count === iterable.length) {
+                    resolve(result);
+                }
+            };
+        }
+
+        for (var i = 0; i < iterable.length; i += 1) {
+            promise_Promise.resolve(iterable[i]).then(resolver(i), reject);
+        }
+    });
+};
+
+promise_Promise.race = function race(iterable) {
+    return new promise_Promise(function (resolve, reject) {
+        for (var i = 0; i < iterable.length; i += 1) {
+            promise_Promise.resolve(iterable[i]).then(resolve, reject);
+        }
+    });
+};
+
+var p = promise_Promise.prototype;
+
+p.resolve = function resolve(x) {
+    var promise = this;
+
+    if (promise.state === PENDING) {
+        if (x === promise) {
+            throw new TypeError('Promise settled with itself.');
+        }
+
+        var called = false;
+
+        try {
+            var then = x && x['then'];
+
+            if (x !== null && typeof x === 'object' && typeof then === 'function') {
+                then.call(x, function (x) {
+                    if (!called) {
+                        promise.resolve(x);
+                    }
+                    called = true;
+
+                }, function (r) {
+                    if (!called) {
+                        promise.reject(r);
+                    }
+                    called = true;
+                });
+                return;
+            }
+        } catch (e) {
+            if (!called) {
+                promise.reject(e);
+            }
+            return;
+        }
+
+        promise.state = RESOLVED;
+        promise.value = x;
+        promise.notify();
+    }
+};
+
+p.reject = function reject(reason) {
+    var promise = this;
+
+    if (promise.state === PENDING) {
+        if (reason === promise) {
+            throw new TypeError('Promise settled with itself.');
+        }
+
+        promise.state = REJECTED;
+        promise.value = reason;
+        promise.notify();
+    }
+};
+
+p.notify = function notify() {
+    var promise = this;
+
+    Object(util["o" /* nextTick */])(function () {
+        if (promise.state !== PENDING) {
+            while (promise.deferred.length) {
+                var deferred = promise.deferred.shift(),
+                    onResolved = deferred[0],
+                    onRejected = deferred[1],
+                    resolve = deferred[2],
+                    reject = deferred[3];
+
+                try {
+                    if (promise.state === RESOLVED) {
+                        if (typeof onResolved === 'function') {
+                            resolve(onResolved.call(undefined, promise.value));
+                        } else {
+                            resolve(promise.value);
+                        }
+                    } else if (promise.state === REJECTED) {
+                        if (typeof onRejected === 'function') {
+                            resolve(onRejected.call(undefined, promise.value));
+                        } else {
+                            reject(promise.value);
+                        }
+                    }
+                } catch (e) {
+                    reject(e);
+                }
+            }
+        }
+    });
+};
+
+p.then = function then(onResolved, onRejected) {
+    var promise = this;
+
+    return new promise_Promise(function (resolve, reject) {
+        promise.deferred.push([onResolved, onRejected, resolve, reject]);
+        promise.notify();
+    });
+};
+
+p.catch = function (onRejected) {
+    return this.then(undefined, onRejected);
+};
+
+// CONCATENATED MODULE: ./src/promise.js
+/* harmony export (immutable) */ __webpack_exports__["a"] = PromiseObj;
+/**
+ * Promise adapter.
+ */
+
+
+
+if (typeof Promise === 'undefined') {
+    window.Promise = promise_Promise;
+}
+
+function PromiseObj(executor, context) {
+
+    if (executor instanceof Promise) {
+        this.promise = executor;
+    } else {
+        this.promise = new Promise(executor.bind(context));
+    }
+
+    this.context = context;
+}
+
+PromiseObj.all = function (iterable, context) {
+    return new PromiseObj(Promise.all(iterable), context);
+};
+
+PromiseObj.resolve = function (value, context) {
+    return new PromiseObj(Promise.resolve(value), context);
+};
+
+PromiseObj.reject = function (reason, context) {
+    return new PromiseObj(Promise.reject(reason), context);
+};
+
+PromiseObj.race = function (iterable, context) {
+    return new PromiseObj(Promise.race(iterable), context);
+};
+
+var promise_p = PromiseObj.prototype;
+
+promise_p.bind = function (context) {
+    this.context = context;
+    return this;
+};
+
+promise_p.then = function (fulfilled, rejected) {
+
+    if (fulfilled && fulfilled.bind && this.context) {
+        fulfilled = fulfilled.bind(this.context);
+    }
+
+    if (rejected && rejected.bind && this.context) {
+        rejected = rejected.bind(this.context);
+    }
+
+    return new PromiseObj(this.promise.then(fulfilled, rejected), this.context);
+};
+
+promise_p.catch = function (rejected) {
+
+    if (rejected && rejected.bind && this.context) {
+        rejected = rejected.bind(this.context);
+    }
+
+    return new PromiseObj(this.promise.catch(rejected), this.context);
+};
+
+promise_p.finally = function (callback) {
+
+    return this.then(function (value) {
+        callback.call(this);
+        return value;
+    }, function (reason) {
+        callback.call(this);
+        return Promise.reject(reason);
+    }
+    );
+};
+
+
+/***/ }),
+/* 2 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* WEBPACK VAR INJECTION */(function(process, global, setImmediate) {/*!
+ * Vue.js v2.5.13
+ * (c) 2014-2017 Evan You
+ * Released under the MIT License.
+ */
+/*  */
+
+var emptyObject = Object.freeze({});
+
+// these helpers produces better vm code in JS engines due to their
+// explicitness and function inlining
+function isUndef (v) {
+  return v === undefined || v === null
+}
+
+function isDef (v) {
+  return v !== undefined && v !== null
+}
+
+function isTrue (v) {
+  return v === true
+}
+
+function isFalse (v) {
+  return v === false
+}
+
+/**
+ * Check if value is primitive
+ */
+function isPrimitive (value) {
+  return (
+    typeof value === 'string' ||
+    typeof value === 'number' ||
+    // $flow-disable-line
+    typeof value === 'symbol' ||
+    typeof value === 'boolean'
+  )
+}
+
+/**
+ * Quick object check - this is primarily used to tell
+ * Objects from primitive values when we know the value
+ * is a JSON-compliant type.
+ */
+function isObject (obj) {
+  return obj !== null && typeof obj === 'object'
+}
+
+/**
+ * Get the raw type string of a value e.g. [object Object]
+ */
+var _toString = Object.prototype.toString;
+
+function toRawType (value) {
+  return _toString.call(value).slice(8, -1)
+}
+
+/**
+ * Strict object type check. Only returns true
+ * for plain JavaScript objects.
+ */
+function isPlainObject (obj) {
+  return _toString.call(obj) === '[object Object]'
+}
+
+function isRegExp (v) {
+  return _toString.call(v) === '[object RegExp]'
+}
+
+/**
+ * Check if val is a valid array index.
+ */
+function isValidArrayIndex (val) {
+  var n = parseFloat(String(val));
+  return n >= 0 && Math.floor(n) === n && isFinite(val)
+}
+
+/**
+ * Convert a value to a string that is actually rendered.
+ */
+function toString (val) {
+  return val == null
+    ? ''
+    : typeof val === 'object'
+      ? JSON.stringify(val, null, 2)
+      : String(val)
+}
+
+/**
+ * Convert a input value to a number for persistence.
+ * If the conversion fails, return original string.
+ */
+function toNumber (val) {
+  var n = parseFloat(val);
+  return isNaN(n) ? val : n
+}
+
+/**
+ * Make a map and return a function for checking if a key
+ * is in that map.
+ */
+function makeMap (
+  str,
+  expectsLowerCase
+) {
+  var map = Object.create(null);
+  var list = str.split(',');
+  for (var i = 0; i < list.length; i++) {
+    map[list[i]] = true;
+  }
+  return expectsLowerCase
+    ? function (val) { return map[val.toLowerCase()]; }
+    : function (val) { return map[val]; }
+}
+
+/**
+ * Check if a tag is a built-in tag.
+ */
+var isBuiltInTag = makeMap('slot,component', true);
+
+/**
+ * Check if a attribute is a reserved attribute.
+ */
+var isReservedAttribute = makeMap('key,ref,slot,slot-scope,is');
+
+/**
+ * Remove an item from an array
+ */
+function remove (arr, item) {
+  if (arr.length) {
+    var index = arr.indexOf(item);
+    if (index > -1) {
+      return arr.splice(index, 1)
+    }
+  }
+}
+
+/**
+ * Check whether the object has the property.
+ */
+var hasOwnProperty = Object.prototype.hasOwnProperty;
+function hasOwn (obj, key) {
+  return hasOwnProperty.call(obj, key)
+}
+
+/**
+ * Create a cached version of a pure function.
+ */
+function cached (fn) {
+  var cache = Object.create(null);
+  return (function cachedFn (str) {
+    var hit = cache[str];
+    return hit || (cache[str] = fn(str))
+  })
+}
+
+/**
+ * Camelize a hyphen-delimited string.
+ */
+var camelizeRE = /-(\w)/g;
+var camelize = cached(function (str) {
+  return str.replace(camelizeRE, function (_, c) { return c ? c.toUpperCase() : ''; })
+});
+
+/**
+ * Capitalize a string.
+ */
+var capitalize = cached(function (str) {
+  return str.charAt(0).toUpperCase() + str.slice(1)
+});
+
+/**
+ * Hyphenate a camelCase string.
+ */
+var hyphenateRE = /\B([A-Z])/g;
+var hyphenate = cached(function (str) {
+  return str.replace(hyphenateRE, '-$1').toLowerCase()
+});
+
+/**
+ * Simple bind, faster than native
+ */
+function bind (fn, ctx) {
+  function boundFn (a) {
+    var l = arguments.length;
+    return l
+      ? l > 1
+        ? fn.apply(ctx, arguments)
+        : fn.call(ctx, a)
+      : fn.call(ctx)
+  }
+  // record original fn length
+  boundFn._length = fn.length;
+  return boundFn
+}
+
+/**
+ * Convert an Array-like object to a real Array.
+ */
+function toArray (list, start) {
+  start = start || 0;
+  var i = list.length - start;
+  var ret = new Array(i);
+  while (i--) {
+    ret[i] = list[i + start];
+  }
+  return ret
+}
+
+/**
+ * Mix properties into target object.
+ */
+function extend (to, _from) {
+  for (var key in _from) {
+    to[key] = _from[key];
+  }
+  return to
+}
+
+/**
+ * Merge an Array of Objects into a single Object.
+ */
+function toObject (arr) {
+  var res = {};
+  for (var i = 0; i < arr.length; i++) {
+    if (arr[i]) {
+      extend(res, arr[i]);
+    }
+  }
+  return res
+}
+
+/**
+ * Perform no operation.
+ * Stubbing args to make Flow happy without leaving useless transpiled code
+ * with ...rest (https://flow.org/blog/2017/05/07/Strict-Function-Call-Arity/)
+ */
+function noop (a, b, c) {}
+
+/**
+ * Always return false.
+ */
+var no = function (a, b, c) { return false; };
+
+/**
+ * Return same value
+ */
+var identity = function (_) { return _; };
+
+/**
+ * Generate a static keys string from compiler modules.
+ */
+
+
+/**
+ * Check if two values are loosely equal - that is,
+ * if they are plain objects, do they have the same shape?
+ */
+function looseEqual (a, b) {
+  if (a === b) { return true }
+  var isObjectA = isObject(a);
+  var isObjectB = isObject(b);
+  if (isObjectA && isObjectB) {
+    try {
+      var isArrayA = Array.isArray(a);
+      var isArrayB = Array.isArray(b);
+      if (isArrayA && isArrayB) {
+        return a.length === b.length && a.every(function (e, i) {
+          return looseEqual(e, b[i])
+        })
+      } else if (!isArrayA && !isArrayB) {
+        var keysA = Object.keys(a);
+        var keysB = Object.keys(b);
+        return keysA.length === keysB.length && keysA.every(function (key) {
+          return looseEqual(a[key], b[key])
+        })
+      } else {
+        /* istanbul ignore next */
+        return false
+      }
+    } catch (e) {
+      /* istanbul ignore next */
+      return false
+    }
+  } else if (!isObjectA && !isObjectB) {
+    return String(a) === String(b)
+  } else {
+    return false
+  }
+}
+
+function looseIndexOf (arr, val) {
+  for (var i = 0; i < arr.length; i++) {
+    if (looseEqual(arr[i], val)) { return i }
+  }
+  return -1
+}
+
+/**
+ * Ensure a function is called only once.
+ */
+function once (fn) {
+  var called = false;
+  return function () {
+    if (!called) {
+      called = true;
+      fn.apply(this, arguments);
+    }
+  }
+}
+
+var SSR_ATTR = 'data-server-rendered';
+
+var ASSET_TYPES = [
+  'component',
+  'directive',
+  'filter'
+];
+
+var LIFECYCLE_HOOKS = [
+  'beforeCreate',
+  'created',
+  'beforeMount',
+  'mounted',
+  'beforeUpdate',
+  'updated',
+  'beforeDestroy',
+  'destroyed',
+  'activated',
+  'deactivated',
+  'errorCaptured'
+];
+
+/*  */
+
+var config = ({
+  /**
+   * Option merge strategies (used in core/util/options)
+   */
+  // $flow-disable-line
+  optionMergeStrategies: Object.create(null),
+
+  /**
+   * Whether to suppress warnings.
+   */
+  silent: false,
+
+  /**
+   * Show production mode tip message on boot?
+   */
+  productionTip: process.env.NODE_ENV !== 'production',
+
+  /**
+   * Whether to enable devtools
+   */
+  devtools: process.env.NODE_ENV !== 'production',
+
+  /**
+   * Whether to record perf
+   */
+  performance: false,
+
+  /**
+   * Error handler for watcher errors
+   */
+  errorHandler: null,
+
+  /**
+   * Warn handler for watcher warns
+   */
+  warnHandler: null,
+
+  /**
+   * Ignore certain custom elements
+   */
+  ignoredElements: [],
+
+  /**
+   * Custom user key aliases for v-on
+   */
+  // $flow-disable-line
+  keyCodes: Object.create(null),
+
+  /**
+   * Check if a tag is reserved so that it cannot be registered as a
+   * component. This is platform-dependent and may be overwritten.
+   */
+  isReservedTag: no,
+
+  /**
+   * Check if an attribute is reserved so that it cannot be used as a component
+   * prop. This is platform-dependent and may be overwritten.
+   */
+  isReservedAttr: no,
+
+  /**
+   * Check if a tag is an unknown element.
+   * Platform-dependent.
+   */
+  isUnknownElement: no,
+
+  /**
+   * Get the namespace of an element
+   */
+  getTagNamespace: noop,
+
+  /**
+   * Parse the real tag name for the specific platform.
+   */
+  parsePlatformTagName: identity,
+
+  /**
+   * Check if an attribute must be bound using property, e.g. value
+   * Platform-dependent.
+   */
+  mustUseProp: no,
+
+  /**
+   * Exposed for legacy reasons
+   */
+  _lifecycleHooks: LIFECYCLE_HOOKS
+});
+
+/*  */
+
+/**
+ * Check if a string starts with $ or _
+ */
+function isReserved (str) {
+  var c = (str + '').charCodeAt(0);
+  return c === 0x24 || c === 0x5F
+}
+
+/**
+ * Define a property.
+ */
+function def (obj, key, val, enumerable) {
+  Object.defineProperty(obj, key, {
+    value: val,
+    enumerable: !!enumerable,
+    writable: true,
+    configurable: true
+  });
+}
+
+/**
+ * Parse simple path.
+ */
+var bailRE = /[^\w.$]/;
+function parsePath (path) {
+  if (bailRE.test(path)) {
+    return
+  }
+  var segments = path.split('.');
+  return function (obj) {
+    for (var i = 0; i < segments.length; i++) {
+      if (!obj) { return }
+      obj = obj[segments[i]];
+    }
+    return obj
+  }
+}
+
+/*  */
+
+
+// can we use __proto__?
+var hasProto = '__proto__' in {};
+
+// Browser environment sniffing
+var inBrowser = typeof window !== 'undefined';
+var inWeex = typeof WXEnvironment !== 'undefined' && !!WXEnvironment.platform;
+var weexPlatform = inWeex && WXEnvironment.platform.toLowerCase();
+var UA = inBrowser && window.navigator.userAgent.toLowerCase();
+var isIE = UA && /msie|trident/.test(UA);
+var isIE9 = UA && UA.indexOf('msie 9.0') > 0;
+var isEdge = UA && UA.indexOf('edge/') > 0;
+var isAndroid = (UA && UA.indexOf('android') > 0) || (weexPlatform === 'android');
+var isIOS = (UA && /iphone|ipad|ipod|ios/.test(UA)) || (weexPlatform === 'ios');
+var isChrome = UA && /chrome\/\d+/.test(UA) && !isEdge;
+
+// Firefox has a "watch" function on Object.prototype...
+var nativeWatch = ({}).watch;
+
+var supportsPassive = false;
+if (inBrowser) {
+  try {
+    var opts = {};
+    Object.defineProperty(opts, 'passive', ({
+      get: function get () {
+        /* istanbul ignore next */
+        supportsPassive = true;
+      }
+    })); // https://github.com/facebook/flow/issues/285
+    window.addEventListener('test-passive', null, opts);
+  } catch (e) {}
+}
+
+// this needs to be lazy-evaled because vue may be required before
+// vue-server-renderer can set VUE_ENV
+var _isServer;
+var isServerRendering = function () {
+  if (_isServer === undefined) {
+    /* istanbul ignore if */
+    if (!inBrowser && typeof global !== 'undefined') {
+      // detect presence of vue-server-renderer and avoid
+      // Webpack shimming the process
+      _isServer = global['process'].env.VUE_ENV === 'server';
+    } else {
+      _isServer = false;
+    }
+  }
+  return _isServer
+};
+
+// detect devtools
+var devtools = inBrowser && window.__VUE_DEVTOOLS_GLOBAL_HOOK__;
+
+/* istanbul ignore next */
+function isNative (Ctor) {
+  return typeof Ctor === 'function' && /native code/.test(Ctor.toString())
+}
+
+var hasSymbol =
+  typeof Symbol !== 'undefined' && isNative(Symbol) &&
+  typeof Reflect !== 'undefined' && isNative(Reflect.ownKeys);
+
+var _Set;
+/* istanbul ignore if */ // $flow-disable-line
+if (typeof Set !== 'undefined' && isNative(Set)) {
+  // use native Set when available.
+  _Set = Set;
+} else {
+  // a non-standard Set polyfill that only works with primitive keys.
+  _Set = (function () {
+    function Set () {
+      this.set = Object.create(null);
+    }
+    Set.prototype.has = function has (key) {
+      return this.set[key] === true
+    };
+    Set.prototype.add = function add (key) {
+      this.set[key] = true;
+    };
+    Set.prototype.clear = function clear () {
+      this.set = Object.create(null);
+    };
+
+    return Set;
+  }());
+}
+
+/*  */
+
+var warn = noop;
+var tip = noop;
+var generateComponentTrace = (noop); // work around flow check
+var formatComponentName = (noop);
+
+if (process.env.NODE_ENV !== 'production') {
+  var hasConsole = typeof console !== 'undefined';
+  var classifyRE = /(?:^|[-_])(\w)/g;
+  var classify = function (str) { return str
+    .replace(classifyRE, function (c) { return c.toUpperCase(); })
+    .replace(/[-_]/g, ''); };
+
+  warn = function (msg, vm) {
+    var trace = vm ? generateComponentTrace(vm) : '';
+
+    if (config.warnHandler) {
+      config.warnHandler.call(null, msg, vm, trace);
+    } else if (hasConsole && (!config.silent)) {
+      console.error(("[Vue warn]: " + msg + trace));
+    }
+  };
+
+  tip = function (msg, vm) {
+    if (hasConsole && (!config.silent)) {
+      console.warn("[Vue tip]: " + msg + (
+        vm ? generateComponentTrace(vm) : ''
+      ));
+    }
+  };
+
+  formatComponentName = function (vm, includeFile) {
+    if (vm.$root === vm) {
+      return '<Root>'
+    }
+    var options = typeof vm === 'function' && vm.cid != null
+      ? vm.options
+      : vm._isVue
+        ? vm.$options || vm.constructor.options
+        : vm || {};
+    var name = options.name || options._componentTag;
+    var file = options.__file;
+    if (!name && file) {
+      var match = file.match(/([^/\\]+)\.vue$/);
+      name = match && match[1];
+    }
+
+    return (
+      (name ? ("<" + (classify(name)) + ">") : "<Anonymous>") +
+      (file && includeFile !== false ? (" at " + file) : '')
+    )
+  };
+
+  var repeat = function (str, n) {
+    var res = '';
+    while (n) {
+      if (n % 2 === 1) { res += str; }
+      if (n > 1) { str += str; }
+      n >>= 1;
+    }
+    return res
+  };
+
+  generateComponentTrace = function (vm) {
+    if (vm._isVue && vm.$parent) {
+      var tree = [];
+      var currentRecursiveSequence = 0;
+      while (vm) {
+        if (tree.length > 0) {
+          var last = tree[tree.length - 1];
+          if (last.constructor === vm.constructor) {
+            currentRecursiveSequence++;
+            vm = vm.$parent;
+            continue
+          } else if (currentRecursiveSequence > 0) {
+            tree[tree.length - 1] = [last, currentRecursiveSequence];
+            currentRecursiveSequence = 0;
+          }
+        }
+        tree.push(vm);
+        vm = vm.$parent;
+      }
+      return '\n\nfound in\n\n' + tree
+        .map(function (vm, i) { return ("" + (i === 0 ? '---> ' : repeat(' ', 5 + i * 2)) + (Array.isArray(vm)
+            ? ((formatComponentName(vm[0])) + "... (" + (vm[1]) + " recursive calls)")
+            : formatComponentName(vm))); })
+        .join('\n')
+    } else {
+      return ("\n\n(found in " + (formatComponentName(vm)) + ")")
+    }
+  };
+}
+
+/*  */
+
+
+var uid$1 = 0;
+
+/**
+ * A dep is an observable that can have multiple
+ * directives subscribing to it.
+ */
+var Dep = function Dep () {
+  this.id = uid$1++;
+  this.subs = [];
+};
+
+Dep.prototype.addSub = function addSub (sub) {
+  this.subs.push(sub);
+};
+
+Dep.prototype.removeSub = function removeSub (sub) {
+  remove(this.subs, sub);
+};
+
+Dep.prototype.depend = function depend () {
+  if (Dep.target) {
+    Dep.target.addDep(this);
+  }
+};
+
+Dep.prototype.notify = function notify () {
+  // stabilize the subscriber list first
+  var subs = this.subs.slice();
+  for (var i = 0, l = subs.length; i < l; i++) {
+    subs[i].update();
+  }
+};
+
+// the current target watcher being evaluated.
+// this is globally unique because there could be only one
+// watcher being evaluated at any time.
+Dep.target = null;
+var targetStack = [];
+
+function pushTarget (_target) {
+  if (Dep.target) { targetStack.push(Dep.target); }
+  Dep.target = _target;
+}
+
+function popTarget () {
+  Dep.target = targetStack.pop();
+}
+
+/*  */
+
+var VNode = function VNode (
+  tag,
+  data,
+  children,
+  text,
+  elm,
+  context,
+  componentOptions,
+  asyncFactory
+) {
+  this.tag = tag;
+  this.data = data;
+  this.children = children;
+  this.text = text;
+  this.elm = elm;
+  this.ns = undefined;
+  this.context = context;
+  this.fnContext = undefined;
+  this.fnOptions = undefined;
+  this.fnScopeId = undefined;
+  this.key = data && data.key;
+  this.componentOptions = componentOptions;
+  this.componentInstance = undefined;
+  this.parent = undefined;
+  this.raw = false;
+  this.isStatic = false;
+  this.isRootInsert = true;
+  this.isComment = false;
+  this.isCloned = false;
+  this.isOnce = false;
+  this.asyncFactory = asyncFactory;
+  this.asyncMeta = undefined;
+  this.isAsyncPlaceholder = false;
+};
+
+var prototypeAccessors = { child: { configurable: true } };
+
+// DEPRECATED: alias for componentInstance for backwards compat.
+/* istanbul ignore next */
+prototypeAccessors.child.get = function () {
+  return this.componentInstance
+};
+
+Object.defineProperties( VNode.prototype, prototypeAccessors );
+
+var createEmptyVNode = function (text) {
+  if ( text === void 0 ) text = '';
+
+  var node = new VNode();
+  node.text = text;
+  node.isComment = true;
+  return node
+};
+
+function createTextVNode (val) {
+  return new VNode(undefined, undefined, undefined, String(val))
+}
+
+// optimized shallow clone
+// used for static nodes and slot nodes because they may be reused across
+// multiple renders, cloning them avoids errors when DOM manipulations rely
+// on their elm reference.
+function cloneVNode (vnode, deep) {
+  var componentOptions = vnode.componentOptions;
+  var cloned = new VNode(
+    vnode.tag,
+    vnode.data,
+    vnode.children,
+    vnode.text,
+    vnode.elm,
+    vnode.context,
+    componentOptions,
+    vnode.asyncFactory
+  );
+  cloned.ns = vnode.ns;
+  cloned.isStatic = vnode.isStatic;
+  cloned.key = vnode.key;
+  cloned.isComment = vnode.isComment;
+  cloned.fnContext = vnode.fnContext;
+  cloned.fnOptions = vnode.fnOptions;
+  cloned.fnScopeId = vnode.fnScopeId;
+  cloned.isCloned = true;
+  if (deep) {
+    if (vnode.children) {
+      cloned.children = cloneVNodes(vnode.children, true);
+    }
+    if (componentOptions && componentOptions.children) {
+      componentOptions.children = cloneVNodes(componentOptions.children, true);
+    }
+  }
+  return cloned
+}
+
+function cloneVNodes (vnodes, deep) {
+  var len = vnodes.length;
+  var res = new Array(len);
+  for (var i = 0; i < len; i++) {
+    res[i] = cloneVNode(vnodes[i], deep);
+  }
+  return res
+}
+
+/*
+ * not type checking this file because flow doesn't play well with
+ * dynamically accessing methods on Array prototype
+ */
+
+var arrayProto = Array.prototype;
+var arrayMethods = Object.create(arrayProto);[
+  'push',
+  'pop',
+  'shift',
+  'unshift',
+  'splice',
+  'sort',
+  'reverse'
+].forEach(function (method) {
+  // cache original method
+  var original = arrayProto[method];
+  def(arrayMethods, method, function mutator () {
+    var args = [], len = arguments.length;
+    while ( len-- ) args[ len ] = arguments[ len ];
+
+    var result = original.apply(this, args);
+    var ob = this.__ob__;
+    var inserted;
+    switch (method) {
+      case 'push':
+      case 'unshift':
+        inserted = args;
+        break
+      case 'splice':
+        inserted = args.slice(2);
+        break
+    }
+    if (inserted) { ob.observeArray(inserted); }
+    // notify change
+    ob.dep.notify();
+    return result
+  });
+});
+
+/*  */
+
+var arrayKeys = Object.getOwnPropertyNames(arrayMethods);
+
+/**
+ * By default, when a reactive property is set, the new value is
+ * also converted to become reactive. However when passing down props,
+ * we don't want to force conversion because the value may be a nested value
+ * under a frozen data structure. Converting it would defeat the optimization.
+ */
+var observerState = {
+  shouldConvert: true
+};
+
+/**
+ * Observer class that are attached to each observed
+ * object. Once attached, the observer converts target
+ * object's property keys into getter/setters that
+ * collect dependencies and dispatches updates.
+ */
+var Observer = function Observer (value) {
+  this.value = value;
+  this.dep = new Dep();
+  this.vmCount = 0;
+  def(value, '__ob__', this);
+  if (Array.isArray(value)) {
+    var augment = hasProto
+      ? protoAugment
+      : copyAugment;
+    augment(value, arrayMethods, arrayKeys);
+    this.observeArray(value);
+  } else {
+    this.walk(value);
+  }
+};
+
+/**
+ * Walk through each property and convert them into
+ * getter/setters. This method should only be called when
+ * value type is Object.
+ */
+Observer.prototype.walk = function walk (obj) {
+  var keys = Object.keys(obj);
+  for (var i = 0; i < keys.length; i++) {
+    defineReactive(obj, keys[i], obj[keys[i]]);
+  }
+};
+
+/**
+ * Observe a list of Array items.
+ */
+Observer.prototype.observeArray = function observeArray (items) {
+  for (var i = 0, l = items.length; i < l; i++) {
+    observe(items[i]);
+  }
+};
+
+// helpers
+
+/**
+ * Augment an target Object or Array by intercepting
+ * the prototype chain using __proto__
+ */
+function protoAugment (target, src, keys) {
+  /* eslint-disable no-proto */
+  target.__proto__ = src;
+  /* eslint-enable no-proto */
+}
+
+/**
+ * Augment an target Object or Array by defining
+ * hidden properties.
+ */
+/* istanbul ignore next */
+function copyAugment (target, src, keys) {
+  for (var i = 0, l = keys.length; i < l; i++) {
+    var key = keys[i];
+    def(target, key, src[key]);
+  }
+}
+
+/**
+ * Attempt to create an observer instance for a value,
+ * returns the new observer if successfully observed,
+ * or the existing observer if the value already has one.
+ */
+function observe (value, asRootData) {
+  if (!isObject(value) || value instanceof VNode) {
+    return
+  }
+  var ob;
+  if (hasOwn(value, '__ob__') && value.__ob__ instanceof Observer) {
+    ob = value.__ob__;
+  } else if (
+    observerState.shouldConvert &&
+    !isServerRendering() &&
+    (Array.isArray(value) || isPlainObject(value)) &&
+    Object.isExtensible(value) &&
+    !value._isVue
+  ) {
+    ob = new Observer(value);
+  }
+  if (asRootData && ob) {
+    ob.vmCount++;
+  }
+  return ob
+}
+
+/**
+ * Define a reactive property on an Object.
+ */
+function defineReactive (
+  obj,
+  key,
+  val,
+  customSetter,
+  shallow
+) {
+  var dep = new Dep();
+
+  var property = Object.getOwnPropertyDescriptor(obj, key);
+  if (property && property.configurable === false) {
+    return
+  }
+
+  // cater for pre-defined getter/setters
+  var getter = property && property.get;
+  var setter = property && property.set;
+
+  var childOb = !shallow && observe(val);
+  Object.defineProperty(obj, key, {
+    enumerable: true,
+    configurable: true,
+    get: function reactiveGetter () {
+      var value = getter ? getter.call(obj) : val;
+      if (Dep.target) {
+        dep.depend();
+        if (childOb) {
+          childOb.dep.depend();
+          if (Array.isArray(value)) {
+            dependArray(value);
+          }
+        }
+      }
+      return value
+    },
+    set: function reactiveSetter (newVal) {
+      var value = getter ? getter.call(obj) : val;
+      /* eslint-disable no-self-compare */
+      if (newVal === value || (newVal !== newVal && value !== value)) {
+        return
+      }
+      /* eslint-enable no-self-compare */
+      if (process.env.NODE_ENV !== 'production' && customSetter) {
+        customSetter();
+      }
+      if (setter) {
+        setter.call(obj, newVal);
+      } else {
+        val = newVal;
+      }
+      childOb = !shallow && observe(newVal);
+      dep.notify();
+    }
+  });
+}
+
+/**
+ * Set a property on an object. Adds the new property and
+ * triggers change notification if the property doesn't
+ * already exist.
+ */
+function set (target, key, val) {
+  if (Array.isArray(target) && isValidArrayIndex(key)) {
+    target.length = Math.max(target.length, key);
+    target.splice(key, 1, val);
+    return val
+  }
+  if (key in target && !(key in Object.prototype)) {
+    target[key] = val;
+    return val
+  }
+  var ob = (target).__ob__;
+  if (target._isVue || (ob && ob.vmCount)) {
+    process.env.NODE_ENV !== 'production' && warn(
+      'Avoid adding reactive properties to a Vue instance or its root $data ' +
+      'at runtime - declare it upfront in the data option.'
+    );
+    return val
+  }
+  if (!ob) {
+    target[key] = val;
+    return val
+  }
+  defineReactive(ob.value, key, val);
+  ob.dep.notify();
+  return val
+}
+
+/**
+ * Delete a property and trigger change if necessary.
+ */
+function del (target, key) {
+  if (Array.isArray(target) && isValidArrayIndex(key)) {
+    target.splice(key, 1);
+    return
+  }
+  var ob = (target).__ob__;
+  if (target._isVue || (ob && ob.vmCount)) {
+    process.env.NODE_ENV !== 'production' && warn(
+      'Avoid deleting properties on a Vue instance or its root $data ' +
+      '- just set it to null.'
+    );
+    return
+  }
+  if (!hasOwn(target, key)) {
+    return
+  }
+  delete target[key];
+  if (!ob) {
+    return
+  }
+  ob.dep.notify();
+}
+
+/**
+ * Collect dependencies on array elements when the array is touched, since
+ * we cannot intercept array element access like property getters.
+ */
+function dependArray (value) {
+  for (var e = (void 0), i = 0, l = value.length; i < l; i++) {
+    e = value[i];
+    e && e.__ob__ && e.__ob__.dep.depend();
+    if (Array.isArray(e)) {
+      dependArray(e);
+    }
+  }
+}
+
+/*  */
+
+/**
+ * Option overwriting strategies are functions that handle
+ * how to merge a parent option value and a child option
+ * value into the final value.
+ */
+var strats = config.optionMergeStrategies;
+
+/**
+ * Options with restrictions
+ */
+if (process.env.NODE_ENV !== 'production') {
+  strats.el = strats.propsData = function (parent, child, vm, key) {
+    if (!vm) {
+      warn(
+        "option \"" + key + "\" can only be used during instance " +
+        'creation with the `new` keyword.'
+      );
+    }
+    return defaultStrat(parent, child)
+  };
+}
+
+/**
+ * Helper that recursively merges two data objects together.
+ */
+function mergeData (to, from) {
+  if (!from) { return to }
+  var key, toVal, fromVal;
+  var keys = Object.keys(from);
+  for (var i = 0; i < keys.length; i++) {
+    key = keys[i];
+    toVal = to[key];
+    fromVal = from[key];
+    if (!hasOwn(to, key)) {
+      set(to, key, fromVal);
+    } else if (isPlainObject(toVal) && isPlainObject(fromVal)) {
+      mergeData(toVal, fromVal);
+    }
+  }
+  return to
+}
+
+/**
+ * Data
+ */
+function mergeDataOrFn (
+  parentVal,
+  childVal,
+  vm
+) {
+  if (!vm) {
+    // in a Vue.extend merge, both should be functions
+    if (!childVal) {
+      return parentVal
+    }
+    if (!parentVal) {
+      return childVal
+    }
+    // when parentVal & childVal are both present,
+    // we need to return a function that returns the
+    // merged result of both functions... no need to
+    // check if parentVal is a function here because
+    // it has to be a function to pass previous merges.
+    return function mergedDataFn () {
+      return mergeData(
+        typeof childVal === 'function' ? childVal.call(this, this) : childVal,
+        typeof parentVal === 'function' ? parentVal.call(this, this) : parentVal
+      )
+    }
+  } else {
+    return function mergedInstanceDataFn () {
+      // instance merge
+      var instanceData = typeof childVal === 'function'
+        ? childVal.call(vm, vm)
+        : childVal;
+      var defaultData = typeof parentVal === 'function'
+        ? parentVal.call(vm, vm)
+        : parentVal;
+      if (instanceData) {
+        return mergeData(instanceData, defaultData)
+      } else {
+        return defaultData
+      }
+    }
+  }
+}
+
+strats.data = function (
+  parentVal,
+  childVal,
+  vm
+) {
+  if (!vm) {
+    if (childVal && typeof childVal !== 'function') {
+      process.env.NODE_ENV !== 'production' && warn(
+        'The "data" option should be a function ' +
+        'that returns a per-instance value in component ' +
+        'definitions.',
+        vm
+      );
+
+      return parentVal
+    }
+    return mergeDataOrFn(parentVal, childVal)
+  }
+
+  return mergeDataOrFn(parentVal, childVal, vm)
+};
+
+/**
+ * Hooks and props are merged as arrays.
+ */
+function mergeHook (
+  parentVal,
+  childVal
+) {
+  return childVal
+    ? parentVal
+      ? parentVal.concat(childVal)
+      : Array.isArray(childVal)
+        ? childVal
+        : [childVal]
+    : parentVal
+}
+
+LIFECYCLE_HOOKS.forEach(function (hook) {
+  strats[hook] = mergeHook;
+});
+
+/**
+ * Assets
+ *
+ * When a vm is present (instance creation), we need to do
+ * a three-way merge between constructor options, instance
+ * options and parent options.
+ */
+function mergeAssets (
+  parentVal,
+  childVal,
+  vm,
+  key
+) {
+  var res = Object.create(parentVal || null);
+  if (childVal) {
+    process.env.NODE_ENV !== 'production' && assertObjectType(key, childVal, vm);
+    return extend(res, childVal)
+  } else {
+    return res
+  }
+}
+
+ASSET_TYPES.forEach(function (type) {
+  strats[type + 's'] = mergeAssets;
+});
+
+/**
+ * Watchers.
+ *
+ * Watchers hashes should not overwrite one
+ * another, so we merge them as arrays.
+ */
+strats.watch = function (
+  parentVal,
+  childVal,
+  vm,
+  key
+) {
+  // work around Firefox's Object.prototype.watch...
+  if (parentVal === nativeWatch) { parentVal = undefined; }
+  if (childVal === nativeWatch) { childVal = undefined; }
+  /* istanbul ignore if */
+  if (!childVal) { return Object.create(parentVal || null) }
+  if (process.env.NODE_ENV !== 'production') {
+    assertObjectType(key, childVal, vm);
+  }
+  if (!parentVal) { return childVal }
+  var ret = {};
+  extend(ret, parentVal);
+  for (var key$1 in childVal) {
+    var parent = ret[key$1];
+    var child = childVal[key$1];
+    if (parent && !Array.isArray(parent)) {
+      parent = [parent];
+    }
+    ret[key$1] = parent
+      ? parent.concat(child)
+      : Array.isArray(child) ? child : [child];
+  }
+  return ret
+};
+
+/**
+ * Other object hashes.
+ */
+strats.props =
+strats.methods =
+strats.inject =
+strats.computed = function (
+  parentVal,
+  childVal,
+  vm,
+  key
+) {
+  if (childVal && process.env.NODE_ENV !== 'production') {
+    assertObjectType(key, childVal, vm);
+  }
+  if (!parentVal) { return childVal }
+  var ret = Object.create(null);
+  extend(ret, parentVal);
+  if (childVal) { extend(ret, childVal); }
+  return ret
+};
+strats.provide = mergeDataOrFn;
+
+/**
+ * Default strategy.
+ */
+var defaultStrat = function (parentVal, childVal) {
+  return childVal === undefined
+    ? parentVal
+    : childVal
+};
+
+/**
+ * Validate component names
+ */
+function checkComponents (options) {
+  for (var key in options.components) {
+    validateComponentName(key);
+  }
+}
+
+function validateComponentName (name) {
+  if (!/^[a-zA-Z][\w-]*$/.test(name)) {
+    warn(
+      'Invalid component name: "' + name + '". Component names ' +
+      'can only contain alphanumeric characters and the hyphen, ' +
+      'and must start with a letter.'
+    );
+  }
+  if (isBuiltInTag(name) || config.isReservedTag(name)) {
+    warn(
+      'Do not use built-in or reserved HTML elements as component ' +
+      'id: ' + name
+    );
+  }
+}
+
+/**
+ * Ensure all props option syntax are normalized into the
+ * Object-based format.
+ */
+function normalizeProps (options, vm) {
+  var props = options.props;
+  if (!props) { return }
+  var res = {};
+  var i, val, name;
+  if (Array.isArray(props)) {
+    i = props.length;
+    while (i--) {
+      val = props[i];
+      if (typeof val === 'string') {
+        name = camelize(val);
+        res[name] = { type: null };
+      } else if (process.env.NODE_ENV !== 'production') {
+        warn('props must be strings when using array syntax.');
+      }
+    }
+  } else if (isPlainObject(props)) {
+    for (var key in props) {
+      val = props[key];
+      name = camelize(key);
+      res[name] = isPlainObject(val)
+        ? val
+        : { type: val };
+    }
+  } else if (process.env.NODE_ENV !== 'production') {
+    warn(
+      "Invalid value for option \"props\": expected an Array or an Object, " +
+      "but got " + (toRawType(props)) + ".",
+      vm
+    );
+  }
+  options.props = res;
+}
+
+/**
+ * Normalize all injections into Object-based format
+ */
+function normalizeInject (options, vm) {
+  var inject = options.inject;
+  if (!inject) { return }
+  var normalized = options.inject = {};
+  if (Array.isArray(inject)) {
+    for (var i = 0; i < inject.length; i++) {
+      normalized[inject[i]] = { from: inject[i] };
+    }
+  } else if (isPlainObject(inject)) {
+    for (var key in inject) {
+      var val = inject[key];
+      normalized[key] = isPlainObject(val)
+        ? extend({ from: key }, val)
+        : { from: val };
+    }
+  } else if (process.env.NODE_ENV !== 'production') {
+    warn(
+      "Invalid value for option \"inject\": expected an Array or an Object, " +
+      "but got " + (toRawType(inject)) + ".",
+      vm
+    );
+  }
+}
+
+/**
+ * Normalize raw function directives into object format.
+ */
+function normalizeDirectives (options) {
+  var dirs = options.directives;
+  if (dirs) {
+    for (var key in dirs) {
+      var def = dirs[key];
+      if (typeof def === 'function') {
+        dirs[key] = { bind: def, update: def };
+      }
+    }
+  }
+}
+
+function assertObjectType (name, value, vm) {
+  if (!isPlainObject(value)) {
+    warn(
+      "Invalid value for option \"" + name + "\": expected an Object, " +
+      "but got " + (toRawType(value)) + ".",
+      vm
+    );
+  }
+}
+
+/**
+ * Merge two option objects into a new one.
+ * Core utility used in both instantiation and inheritance.
+ */
+function mergeOptions (
+  parent,
+  child,
+  vm
+) {
+  if (process.env.NODE_ENV !== 'production') {
+    checkComponents(child);
+  }
+
+  if (typeof child === 'function') {
+    child = child.options;
+  }
+
+  normalizeProps(child, vm);
+  normalizeInject(child, vm);
+  normalizeDirectives(child);
+  var extendsFrom = child.extends;
+  if (extendsFrom) {
+    parent = mergeOptions(parent, extendsFrom, vm);
+  }
+  if (child.mixins) {
+    for (var i = 0, l = child.mixins.length; i < l; i++) {
+      parent = mergeOptions(parent, child.mixins[i], vm);
+    }
+  }
+  var options = {};
+  var key;
+  for (key in parent) {
+    mergeField(key);
+  }
+  for (key in child) {
+    if (!hasOwn(parent, key)) {
+      mergeField(key);
+    }
+  }
+  function mergeField (key) {
+    var strat = strats[key] || defaultStrat;
+    options[key] = strat(parent[key], child[key], vm, key);
+  }
+  return options
+}
+
+/**
+ * Resolve an asset.
+ * This function is used because child instances need access
+ * to assets defined in its ancestor chain.
+ */
+function resolveAsset (
+  options,
+  type,
+  id,
+  warnMissing
+) {
+  /* istanbul ignore if */
+  if (typeof id !== 'string') {
+    return
+  }
+  var assets = options[type];
+  // check local registration variations first
+  if (hasOwn(assets, id)) { return assets[id] }
+  var camelizedId = camelize(id);
+  if (hasOwn(assets, camelizedId)) { return assets[camelizedId] }
+  var PascalCaseId = capitalize(camelizedId);
+  if (hasOwn(assets, PascalCaseId)) { return assets[PascalCaseId] }
+  // fallback to prototype chain
+  var res = assets[id] || assets[camelizedId] || assets[PascalCaseId];
+  if (process.env.NODE_ENV !== 'production' && warnMissing && !res) {
+    warn(
+      'Failed to resolve ' + type.slice(0, -1) + ': ' + id,
+      options
+    );
+  }
+  return res
+}
+
+/*  */
+
+function validateProp (
+  key,
+  propOptions,
+  propsData,
+  vm
+) {
+  var prop = propOptions[key];
+  var absent = !hasOwn(propsData, key);
+  var value = propsData[key];
+  // handle boolean props
+  if (isType(Boolean, prop.type)) {
+    if (absent && !hasOwn(prop, 'default')) {
+      value = false;
+    } else if (!isType(String, prop.type) && (value === '' || value === hyphenate(key))) {
+      value = true;
+    }
+  }
+  // check default value
+  if (value === undefined) {
+    value = getPropDefaultValue(vm, prop, key);
+    // since the default value is a fresh copy,
+    // make sure to observe it.
+    var prevShouldConvert = observerState.shouldConvert;
+    observerState.shouldConvert = true;
+    observe(value);
+    observerState.shouldConvert = prevShouldConvert;
+  }
+  if (
+    process.env.NODE_ENV !== 'production' &&
+    // skip validation for weex recycle-list child component props
+    !(false && isObject(value) && ('@binding' in value))
+  ) {
+    assertProp(prop, key, value, vm, absent);
+  }
+  return value
+}
+
+/**
+ * Get the default value of a prop.
+ */
+function getPropDefaultValue (vm, prop, key) {
+  // no default, return undefined
+  if (!hasOwn(prop, 'default')) {
+    return undefined
+  }
+  var def = prop.default;
+  // warn against non-factory defaults for Object & Array
+  if (process.env.NODE_ENV !== 'production' && isObject(def)) {
+    warn(
+      'Invalid default value for prop "' + key + '": ' +
+      'Props with type Object/Array must use a factory function ' +
+      'to return the default value.',
+      vm
+    );
+  }
+  // the raw prop value was also undefined from previous render,
+  // return previous default value to avoid unnecessary watcher trigger
+  if (vm && vm.$options.propsData &&
+    vm.$options.propsData[key] === undefined &&
+    vm._props[key] !== undefined
+  ) {
+    return vm._props[key]
+  }
+  // call factory function for non-Function types
+  // a value is Function if its prototype is function even across different execution context
+  return typeof def === 'function' && getType(prop.type) !== 'Function'
+    ? def.call(vm)
+    : def
+}
+
+/**
+ * Assert whether a prop is valid.
+ */
+function assertProp (
+  prop,
+  name,
+  value,
+  vm,
+  absent
+) {
+  if (prop.required && absent) {
+    warn(
+      'Missing required prop: "' + name + '"',
+      vm
+    );
+    return
+  }
+  if (value == null && !prop.required) {
+    return
+  }
+  var type = prop.type;
+  var valid = !type || type === true;
+  var expectedTypes = [];
+  if (type) {
+    if (!Array.isArray(type)) {
+      type = [type];
+    }
+    for (var i = 0; i < type.length && !valid; i++) {
+      var assertedType = assertType(value, type[i]);
+      expectedTypes.push(assertedType.expectedType || '');
+      valid = assertedType.valid;
+    }
+  }
+  if (!valid) {
+    warn(
+      "Invalid prop: type check failed for prop \"" + name + "\"." +
+      " Expected " + (expectedTypes.map(capitalize).join(', ')) +
+      ", got " + (toRawType(value)) + ".",
+      vm
+    );
+    return
+  }
+  var validator = prop.validator;
+  if (validator) {
+    if (!validator(value)) {
+      warn(
+        'Invalid prop: custom validator check failed for prop "' + name + '".',
+        vm
+      );
+    }
+  }
+}
+
+var simpleCheckRE = /^(String|Number|Boolean|Function|Symbol)$/;
+
+function assertType (value, type) {
+  var valid;
+  var expectedType = getType(type);
+  if (simpleCheckRE.test(expectedType)) {
+    var t = typeof value;
+    valid = t === expectedType.toLowerCase();
+    // for primitive wrapper objects
+    if (!valid && t === 'object') {
+      valid = value instanceof type;
+    }
+  } else if (expectedType === 'Object') {
+    valid = isPlainObject(value);
+  } else if (expectedType === 'Array') {
+    valid = Array.isArray(value);
+  } else {
+    valid = value instanceof type;
+  }
+  return {
+    valid: valid,
+    expectedType: expectedType
+  }
+}
+
+/**
+ * Use function string name to check built-in types,
+ * because a simple equality check will fail when running
+ * across different vms / iframes.
+ */
+function getType (fn) {
+  var match = fn && fn.toString().match(/^\s*function (\w+)/);
+  return match ? match[1] : ''
+}
+
+function isType (type, fn) {
+  if (!Array.isArray(fn)) {
+    return getType(fn) === getType(type)
+  }
+  for (var i = 0, len = fn.length; i < len; i++) {
+    if (getType(fn[i]) === getType(type)) {
+      return true
+    }
+  }
+  /* istanbul ignore next */
+  return false
+}
+
+/*  */
+
+function handleError (err, vm, info) {
+  if (vm) {
+    var cur = vm;
+    while ((cur = cur.$parent)) {
+      var hooks = cur.$options.errorCaptured;
+      if (hooks) {
+        for (var i = 0; i < hooks.length; i++) {
+          try {
+            var capture = hooks[i].call(cur, err, vm, info) === false;
+            if (capture) { return }
+          } catch (e) {
+            globalHandleError(e, cur, 'errorCaptured hook');
+          }
+        }
+      }
+    }
+  }
+  globalHandleError(err, vm, info);
+}
+
+function globalHandleError (err, vm, info) {
+  if (config.errorHandler) {
+    try {
+      return config.errorHandler.call(null, err, vm, info)
+    } catch (e) {
+      logError(e, null, 'config.errorHandler');
+    }
+  }
+  logError(err, vm, info);
+}
+
+function logError (err, vm, info) {
+  if (process.env.NODE_ENV !== 'production') {
+    warn(("Error in " + info + ": \"" + (err.toString()) + "\""), vm);
+  }
+  /* istanbul ignore else */
+  if ((inBrowser || inWeex) && typeof console !== 'undefined') {
+    console.error(err);
+  } else {
+    throw err
+  }
+}
+
+/*  */
+/* globals MessageChannel */
+
+var callbacks = [];
+var pending = false;
+
+function flushCallbacks () {
+  pending = false;
+  var copies = callbacks.slice(0);
+  callbacks.length = 0;
+  for (var i = 0; i < copies.length; i++) {
+    copies[i]();
+  }
+}
+
+// Here we have async deferring wrappers using both micro and macro tasks.
+// In < 2.4 we used micro tasks everywhere, but there are some scenarios where
+// micro tasks have too high a priority and fires in between supposedly
+// sequential events (e.g. #4521, #6690) or even between bubbling of the same
+// event (#6566). However, using macro tasks everywhere also has subtle problems
+// when state is changed right before repaint (e.g. #6813, out-in transitions).
+// Here we use micro task by default, but expose a way to force macro task when
+// needed (e.g. in event handlers attached by v-on).
+var microTimerFunc;
+var macroTimerFunc;
+var useMacroTask = false;
+
+// Determine (macro) Task defer implementation.
+// Technically setImmediate should be the ideal choice, but it's only available
+// in IE. The only polyfill that consistently queues the callback after all DOM
+// events triggered in the same loop is by using MessageChannel.
+/* istanbul ignore if */
+if (typeof setImmediate !== 'undefined' && isNative(setImmediate)) {
+  macroTimerFunc = function () {
+    setImmediate(flushCallbacks);
+  };
+} else if (typeof MessageChannel !== 'undefined' && (
+  isNative(MessageChannel) ||
+  // PhantomJS
+  MessageChannel.toString() === '[object MessageChannelConstructor]'
+)) {
+  var channel = new MessageChannel();
+  var port = channel.port2;
+  channel.port1.onmessage = flushCallbacks;
+  macroTimerFunc = function () {
+    port.postMessage(1);
+  };
+} else {
+  /* istanbul ignore next */
+  macroTimerFunc = function () {
+    setTimeout(flushCallbacks, 0);
+  };
+}
+
+// Determine MicroTask defer implementation.
+/* istanbul ignore next, $flow-disable-line */
+if (typeof Promise !== 'undefined' && isNative(Promise)) {
+  var p = Promise.resolve();
+  microTimerFunc = function () {
+    p.then(flushCallbacks);
+    // in problematic UIWebViews, Promise.then doesn't completely break, but
+    // it can get stuck in a weird state where callbacks are pushed into the
+    // microtask queue but the queue isn't being flushed, until the browser
+    // needs to do some other work, e.g. handle a timer. Therefore we can
+    // "force" the microtask queue to be flushed by adding an empty timer.
+    if (isIOS) { setTimeout(noop); }
+  };
+} else {
+  // fallback to macro
+  microTimerFunc = macroTimerFunc;
+}
+
+/**
+ * Wrap a function so that if any code inside triggers state change,
+ * the changes are queued using a Task instead of a MicroTask.
+ */
+function withMacroTask (fn) {
+  return fn._withTask || (fn._withTask = function () {
+    useMacroTask = true;
+    var res = fn.apply(null, arguments);
+    useMacroTask = false;
+    return res
+  })
+}
+
+function nextTick (cb, ctx) {
+  var _resolve;
+  callbacks.push(function () {
+    if (cb) {
+      try {
+        cb.call(ctx);
+      } catch (e) {
+        handleError(e, ctx, 'nextTick');
+      }
+    } else if (_resolve) {
+      _resolve(ctx);
+    }
+  });
+  if (!pending) {
+    pending = true;
+    if (useMacroTask) {
+      macroTimerFunc();
+    } else {
+      microTimerFunc();
+    }
+  }
+  // $flow-disable-line
+  if (!cb && typeof Promise !== 'undefined') {
+    return new Promise(function (resolve) {
+      _resolve = resolve;
+    })
+  }
+}
+
+/*  */
+
+/* not type checking this file because flow doesn't play well with Proxy */
+
+var initProxy;
+
+if (process.env.NODE_ENV !== 'production') {
+  var allowedGlobals = makeMap(
+    'Infinity,undefined,NaN,isFinite,isNaN,' +
+    'parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,' +
+    'Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,' +
+    'require' // for Webpack/Browserify
+  );
+
+  var warnNonPresent = function (target, key) {
+    warn(
+      "Property or method \"" + key + "\" is not defined on the instance but " +
+      'referenced during render. Make sure that this property is reactive, ' +
+      'either in the data option, or for class-based components, by ' +
+      'initializing the property. ' +
+      'See: https://vuejs.org/v2/guide/reactivity.html#Declaring-Reactive-Properties.',
+      target
+    );
+  };
+
+  var hasProxy =
+    typeof Proxy !== 'undefined' &&
+    Proxy.toString().match(/native code/);
+
+  if (hasProxy) {
+    var isBuiltInModifier = makeMap('stop,prevent,self,ctrl,shift,alt,meta,exact');
+    config.keyCodes = new Proxy(config.keyCodes, {
+      set: function set (target, key, value) {
+        if (isBuiltInModifier(key)) {
+          warn(("Avoid overwriting built-in modifier in config.keyCodes: ." + key));
+          return false
+        } else {
+          target[key] = value;
+          return true
+        }
+      }
+    });
+  }
+
+  var hasHandler = {
+    has: function has (target, key) {
+      var has = key in target;
+      var isAllowed = allowedGlobals(key) || key.charAt(0) === '_';
+      if (!has && !isAllowed) {
+        warnNonPresent(target, key);
+      }
+      return has || !isAllowed
+    }
+  };
+
+  var getHandler = {
+    get: function get (target, key) {
+      if (typeof key === 'string' && !(key in target)) {
+        warnNonPresent(target, key);
+      }
+      return target[key]
+    }
+  };
+
+  initProxy = function initProxy (vm) {
+    if (hasProxy) {
+      // determine which proxy handler to use
+      var options = vm.$options;
+      var handlers = options.render && options.render._withStripped
+        ? getHandler
+        : hasHandler;
+      vm._renderProxy = new Proxy(vm, handlers);
+    } else {
+      vm._renderProxy = vm;
+    }
+  };
+}
+
+/*  */
+
+var seenObjects = new _Set();
+
+/**
+ * Recursively traverse an object to evoke all converted
+ * getters, so that every nested property inside the object
+ * is collected as a "deep" dependency.
+ */
+function traverse (val) {
+  _traverse(val, seenObjects);
+  seenObjects.clear();
+}
+
+function _traverse (val, seen) {
+  var i, keys;
+  var isA = Array.isArray(val);
+  if ((!isA && !isObject(val)) || Object.isFrozen(val)) {
+    return
+  }
+  if (val.__ob__) {
+    var depId = val.__ob__.dep.id;
+    if (seen.has(depId)) {
+      return
+    }
+    seen.add(depId);
+  }
+  if (isA) {
+    i = val.length;
+    while (i--) { _traverse(val[i], seen); }
+  } else {
+    keys = Object.keys(val);
+    i = keys.length;
+    while (i--) { _traverse(val[keys[i]], seen); }
+  }
+}
+
+var mark;
+var measure;
+
+if (process.env.NODE_ENV !== 'production') {
+  var perf = inBrowser && window.performance;
+  /* istanbul ignore if */
+  if (
+    perf &&
+    perf.mark &&
+    perf.measure &&
+    perf.clearMarks &&
+    perf.clearMeasures
+  ) {
+    mark = function (tag) { return perf.mark(tag); };
+    measure = function (name, startTag, endTag) {
+      perf.measure(name, startTag, endTag);
+      perf.clearMarks(startTag);
+      perf.clearMarks(endTag);
+      perf.clearMeasures(name);
+    };
+  }
+}
+
+/*  */
+
+var normalizeEvent = cached(function (name) {
+  var passive = name.charAt(0) === '&';
+  name = passive ? name.slice(1) : name;
+  var once$$1 = name.charAt(0) === '~'; // Prefixed last, checked first
+  name = once$$1 ? name.slice(1) : name;
+  var capture = name.charAt(0) === '!';
+  name = capture ? name.slice(1) : name;
+  return {
+    name: name,
+    once: once$$1,
+    capture: capture,
+    passive: passive
+  }
+});
+
+function createFnInvoker (fns) {
+  function invoker () {
+    var arguments$1 = arguments;
+
+    var fns = invoker.fns;
+    if (Array.isArray(fns)) {
+      var cloned = fns.slice();
+      for (var i = 0; i < cloned.length; i++) {
+        cloned[i].apply(null, arguments$1);
+      }
+    } else {
+      // return handler return value for single handlers
+      return fns.apply(null, arguments)
+    }
+  }
+  invoker.fns = fns;
+  return invoker
+}
+
+function updateListeners (
+  on,
+  oldOn,
+  add,
+  remove$$1,
+  vm
+) {
+  var name, def, cur, old, event;
+  for (name in on) {
+    def = cur = on[name];
+    old = oldOn[name];
+    event = normalizeEvent(name);
+    /* istanbul ignore if */
+    if (isUndef(cur)) {
+      process.env.NODE_ENV !== 'production' && warn(
+        "Invalid handler for event \"" + (event.name) + "\": got " + String(cur),
+        vm
+      );
+    } else if (isUndef(old)) {
+      if (isUndef(cur.fns)) {
+        cur = on[name] = createFnInvoker(cur);
+      }
+      add(event.name, cur, event.once, event.capture, event.passive, event.params);
+    } else if (cur !== old) {
+      old.fns = cur;
+      on[name] = old;
+    }
+  }
+  for (name in oldOn) {
+    if (isUndef(on[name])) {
+      event = normalizeEvent(name);
+      remove$$1(event.name, oldOn[name], event.capture);
+    }
+  }
+}
+
+/*  */
+
+function mergeVNodeHook (def, hookKey, hook) {
+  if (def instanceof VNode) {
+    def = def.data.hook || (def.data.hook = {});
+  }
+  var invoker;
+  var oldHook = def[hookKey];
+
+  function wrappedHook () {
+    hook.apply(this, arguments);
+    // important: remove merged hook to ensure it's called only once
+    // and prevent memory leak
+    remove(invoker.fns, wrappedHook);
+  }
+
+  if (isUndef(oldHook)) {
+    // no existing hook
+    invoker = createFnInvoker([wrappedHook]);
+  } else {
+    /* istanbul ignore if */
+    if (isDef(oldHook.fns) && isTrue(oldHook.merged)) {
+      // already a merged invoker
+      invoker = oldHook;
+      invoker.fns.push(wrappedHook);
+    } else {
+      // existing plain hook
+      invoker = createFnInvoker([oldHook, wrappedHook]);
+    }
+  }
+
+  invoker.merged = true;
+  def[hookKey] = invoker;
+}
+
+/*  */
+
+function extractPropsFromVNodeData (
+  data,
+  Ctor,
+  tag
+) {
+  // we are only extracting raw values here.
+  // validation and default values are handled in the child
+  // component itself.
+  var propOptions = Ctor.options.props;
+  if (isUndef(propOptions)) {
+    return
+  }
+  var res = {};
+  var attrs = data.attrs;
+  var props = data.props;
+  if (isDef(attrs) || isDef(props)) {
+    for (var key in propOptions) {
+      var altKey = hyphenate(key);
+      if (process.env.NODE_ENV !== 'production') {
+        var keyInLowerCase = key.toLowerCase();
+        if (
+          key !== keyInLowerCase &&
+          attrs && hasOwn(attrs, keyInLowerCase)
+        ) {
+          tip(
+            "Prop \"" + keyInLowerCase + "\" is passed to component " +
+            (formatComponentName(tag || Ctor)) + ", but the declared prop name is" +
+            " \"" + key + "\". " +
+            "Note that HTML attributes are case-insensitive and camelCased " +
+            "props need to use their kebab-case equivalents when using in-DOM " +
+            "templates. You should probably use \"" + altKey + "\" instead of \"" + key + "\"."
+          );
+        }
+      }
+      checkProp(res, props, key, altKey, true) ||
+      checkProp(res, attrs, key, altKey, false);
+    }
+  }
+  return res
+}
+
+function checkProp (
+  res,
+  hash,
+  key,
+  altKey,
+  preserve
+) {
+  if (isDef(hash)) {
+    if (hasOwn(hash, key)) {
+      res[key] = hash[key];
+      if (!preserve) {
+        delete hash[key];
+      }
+      return true
+    } else if (hasOwn(hash, altKey)) {
+      res[key] = hash[altKey];
+      if (!preserve) {
+        delete hash[altKey];
+      }
+      return true
+    }
+  }
+  return false
+}
+
+/*  */
+
+// The template compiler attempts to minimize the need for normalization by
+// statically analyzing the template at compile time.
+//
+// For plain HTML markup, normalization can be completely skipped because the
+// generated render function is guaranteed to return Array<VNode>. There are
+// two cases where extra normalization is needed:
+
+// 1. When the children contains components - because a functional component
+// may return an Array instead of a single root. In this case, just a simple
+// normalization is needed - if any child is an Array, we flatten the whole
+// thing with Array.prototype.concat. It is guaranteed to be only 1-level deep
+// because functional components already normalize their own children.
+function simpleNormalizeChildren (children) {
+  for (var i = 0; i < children.length; i++) {
+    if (Array.isArray(children[i])) {
+      return Array.prototype.concat.apply([], children)
+    }
+  }
+  return children
+}
+
+// 2. When the children contains constructs that always generated nested Arrays,
+// e.g. <template>, <slot>, v-for, or when the children is provided by user
+// with hand-written render functions / JSX. In such cases a full normalization
+// is needed to cater to all possible types of children values.
+function normalizeChildren (children) {
+  return isPrimitive(children)
+    ? [createTextVNode(children)]
+    : Array.isArray(children)
+      ? normalizeArrayChildren(children)
+      : undefined
+}
+
+function isTextNode (node) {
+  return isDef(node) && isDef(node.text) && isFalse(node.isComment)
+}
+
+function normalizeArrayChildren (children, nestedIndex) {
+  var res = [];
+  var i, c, lastIndex, last;
+  for (i = 0; i < children.length; i++) {
+    c = children[i];
+    if (isUndef(c) || typeof c === 'boolean') { continue }
+    lastIndex = res.length - 1;
+    last = res[lastIndex];
+    //  nested
+    if (Array.isArray(c)) {
+      if (c.length > 0) {
+        c = normalizeArrayChildren(c, ((nestedIndex || '') + "_" + i));
+        // merge adjacent text nodes
+        if (isTextNode(c[0]) && isTextNode(last)) {
+          res[lastIndex] = createTextVNode(last.text + (c[0]).text);
+          c.shift();
+        }
+        res.push.apply(res, c);
+      }
+    } else if (isPrimitive(c)) {
+      if (isTextNode(last)) {
+        // merge adjacent text nodes
+        // this is necessary for SSR hydration because text nodes are
+        // essentially merged when rendered to HTML strings
+        res[lastIndex] = createTextVNode(last.text + c);
+      } else if (c !== '') {
+        // convert primitive to vnode
+        res.push(createTextVNode(c));
+      }
+    } else {
+      if (isTextNode(c) && isTextNode(last)) {
+        // merge adjacent text nodes
+        res[lastIndex] = createTextVNode(last.text + c.text);
+      } else {
+        // default key for nested array children (likely generated by v-for)
+        if (isTrue(children._isVList) &&
+          isDef(c.tag) &&
+          isUndef(c.key) &&
+          isDef(nestedIndex)) {
+          c.key = "__vlist" + nestedIndex + "_" + i + "__";
+        }
+        res.push(c);
+      }
+    }
+  }
+  return res
+}
+
+/*  */
+
+function ensureCtor (comp, base) {
+  if (
+    comp.__esModule ||
+    (hasSymbol && comp[Symbol.toStringTag] === 'Module')
+  ) {
+    comp = comp.default;
+  }
+  return isObject(comp)
+    ? base.extend(comp)
+    : comp
+}
+
+function createAsyncPlaceholder (
+  factory,
+  data,
+  context,
+  children,
+  tag
+) {
+  var node = createEmptyVNode();
+  node.asyncFactory = factory;
+  node.asyncMeta = { data: data, context: context, children: children, tag: tag };
+  return node
+}
+
+function resolveAsyncComponent (
+  factory,
+  baseCtor,
+  context
+) {
+  if (isTrue(factory.error) && isDef(factory.errorComp)) {
+    return factory.errorComp
+  }
+
+  if (isDef(factory.resolved)) {
+    return factory.resolved
+  }
+
+  if (isTrue(factory.loading) && isDef(factory.loadingComp)) {
+    return factory.loadingComp
+  }
+
+  if (isDef(factory.contexts)) {
+    // already pending
+    factory.contexts.push(context);
+  } else {
+    var contexts = factory.contexts = [context];
+    var sync = true;
+
+    var forceRender = function () {
+      for (var i = 0, l = contexts.length; i < l; i++) {
+        contexts[i].$forceUpdate();
+      }
+    };
+
+    var resolve = once(function (res) {
+      // cache resolved
+      factory.resolved = ensureCtor(res, baseCtor);
+      // invoke callbacks only if this is not a synchronous resolve
+      // (async resolves are shimmed as synchronous during SSR)
+      if (!sync) {
+        forceRender();
+      }
+    });
+
+    var reject = once(function (reason) {
+      process.env.NODE_ENV !== 'production' && warn(
+        "Failed to resolve async component: " + (String(factory)) +
+        (reason ? ("\nReason: " + reason) : '')
+      );
+      if (isDef(factory.errorComp)) {
+        factory.error = true;
+        forceRender();
+      }
+    });
+
+    var res = factory(resolve, reject);
+
+    if (isObject(res)) {
+      if (typeof res.then === 'function') {
+        // () => Promise
+        if (isUndef(factory.resolved)) {
+          res.then(resolve, reject);
+        }
+      } else if (isDef(res.component) && typeof res.component.then === 'function') {
+        res.component.then(resolve, reject);
+
+        if (isDef(res.error)) {
+          factory.errorComp = ensureCtor(res.error, baseCtor);
+        }
+
+        if (isDef(res.loading)) {
+          factory.loadingComp = ensureCtor(res.loading, baseCtor);
+          if (res.delay === 0) {
+            factory.loading = true;
+          } else {
+            setTimeout(function () {
+              if (isUndef(factory.resolved) && isUndef(factory.error)) {
+                factory.loading = true;
+                forceRender();
+              }
+            }, res.delay || 200);
+          }
+        }
+
+        if (isDef(res.timeout)) {
+          setTimeout(function () {
+            if (isUndef(factory.resolved)) {
+              reject(
+                process.env.NODE_ENV !== 'production'
+                  ? ("timeout (" + (res.timeout) + "ms)")
+                  : null
+              );
+            }
+          }, res.timeout);
+        }
+      }
+    }
+
+    sync = false;
+    // return in case resolved synchronously
+    return factory.loading
+      ? factory.loadingComp
+      : factory.resolved
+  }
+}
+
+/*  */
+
+function isAsyncPlaceholder (node) {
+  return node.isComment && node.asyncFactory
+}
+
+/*  */
+
+function getFirstComponentChild (children) {
+  if (Array.isArray(children)) {
+    for (var i = 0; i < children.length; i++) {
+      var c = children[i];
+      if (isDef(c) && (isDef(c.componentOptions) || isAsyncPlaceholder(c))) {
+        return c
+      }
+    }
+  }
+}
+
+/*  */
+
+/*  */
+
+function initEvents (vm) {
+  vm._events = Object.create(null);
+  vm._hasHookEvent = false;
+  // init parent attached events
+  var listeners = vm.$options._parentListeners;
+  if (listeners) {
+    updateComponentListeners(vm, listeners);
+  }
+}
+
+var target;
+
+function add (event, fn, once) {
+  if (once) {
+    target.$once(event, fn);
+  } else {
+    target.$on(event, fn);
+  }
+}
+
+function remove$1 (event, fn) {
+  target.$off(event, fn);
+}
+
+function updateComponentListeners (
+  vm,
+  listeners,
+  oldListeners
+) {
+  target = vm;
+  updateListeners(listeners, oldListeners || {}, add, remove$1, vm);
+  target = undefined;
+}
+
+function eventsMixin (Vue) {
+  var hookRE = /^hook:/;
+  Vue.prototype.$on = function (event, fn) {
+    var this$1 = this;
+
+    var vm = this;
+    if (Array.isArray(event)) {
+      for (var i = 0, l = event.length; i < l; i++) {
+        this$1.$on(event[i], fn);
+      }
+    } else {
+      (vm._events[event] || (vm._events[event] = [])).push(fn);
+      // optimize hook:event cost by using a boolean flag marked at registration
+      // instead of a hash lookup
+      if (hookRE.test(event)) {
+        vm._hasHookEvent = true;
+      }
+    }
+    return vm
+  };
+
+  Vue.prototype.$once = function (event, fn) {
+    var vm = this;
+    function on () {
+      vm.$off(event, on);
+      fn.apply(vm, arguments);
+    }
+    on.fn = fn;
+    vm.$on(event, on);
+    return vm
+  };
+
+  Vue.prototype.$off = function (event, fn) {
+    var this$1 = this;
+
+    var vm = this;
+    // all
+    if (!arguments.length) {
+      vm._events = Object.create(null);
+      return vm
+    }
+    // array of events
+    if (Array.isArray(event)) {
+      for (var i = 0, l = event.length; i < l; i++) {
+        this$1.$off(event[i], fn);
+      }
+      return vm
+    }
+    // specific event
+    var cbs = vm._events[event];
+    if (!cbs) {
+      return vm
+    }
+    if (!fn) {
+      vm._events[event] = null;
+      return vm
+    }
+    if (fn) {
+      // specific handler
+      var cb;
+      var i$1 = cbs.length;
+      while (i$1--) {
+        cb = cbs[i$1];
+        if (cb === fn || cb.fn === fn) {
+          cbs.splice(i$1, 1);
+          break
+        }
+      }
+    }
+    return vm
+  };
+
+  Vue.prototype.$emit = function (event) {
+    var vm = this;
+    if (process.env.NODE_ENV !== 'production') {
+      var lowerCaseEvent = event.toLowerCase();
+      if (lowerCaseEvent !== event && vm._events[lowerCaseEvent]) {
+        tip(
+          "Event \"" + lowerCaseEvent + "\" is emitted in component " +
+          (formatComponentName(vm)) + " but the handler is registered for \"" + event + "\". " +
+          "Note that HTML attributes are case-insensitive and you cannot use " +
+          "v-on to listen to camelCase events when using in-DOM templates. " +
+          "You should probably use \"" + (hyphenate(event)) + "\" instead of \"" + event + "\"."
+        );
+      }
+    }
+    var cbs = vm._events[event];
+    if (cbs) {
+      cbs = cbs.length > 1 ? toArray(cbs) : cbs;
+      var args = toArray(arguments, 1);
+      for (var i = 0, l = cbs.length; i < l; i++) {
+        try {
+          cbs[i].apply(vm, args);
+        } catch (e) {
+          handleError(e, vm, ("event handler for \"" + event + "\""));
+        }
+      }
+    }
+    return vm
+  };
+}
+
+/*  */
+
+
+
+/**
+ * Runtime helper for resolving raw children VNodes into a slot object.
+ */
+function resolveSlots (
+  children,
+  context
+) {
+  var slots = {};
+  if (!children) {
+    return slots
+  }
+  for (var i = 0, l = children.length; i < l; i++) {
+    var child = children[i];
+    var data = child.data;
+    // remove slot attribute if the node is resolved as a Vue slot node
+    if (data && data.attrs && data.attrs.slot) {
+      delete data.attrs.slot;
+    }
+    // named slots should only be respected if the vnode was rendered in the
+    // same context.
+    if ((child.context === context || child.fnContext === context) &&
+      data && data.slot != null
+    ) {
+      var name = data.slot;
+      var slot = (slots[name] || (slots[name] = []));
+      if (child.tag === 'template') {
+        slot.push.apply(slot, child.children || []);
+      } else {
+        slot.push(child);
+      }
+    } else {
+      (slots.default || (slots.default = [])).push(child);
+    }
+  }
+  // ignore slots that contains only whitespace
+  for (var name$1 in slots) {
+    if (slots[name$1].every(isWhitespace)) {
+      delete slots[name$1];
+    }
+  }
+  return slots
+}
+
+function isWhitespace (node) {
+  return (node.isComment && !node.asyncFactory) || node.text === ' '
+}
+
+function resolveScopedSlots (
+  fns, // see flow/vnode
+  res
+) {
+  res = res || {};
+  for (var i = 0; i < fns.length; i++) {
+    if (Array.isArray(fns[i])) {
+      resolveScopedSlots(fns[i], res);
+    } else {
+      res[fns[i].key] = fns[i].fn;
+    }
+  }
+  return res
+}
+
+/*  */
+
+var activeInstance = null;
+var isUpdatingChildComponent = false;
+
+function initLifecycle (vm) {
+  var options = vm.$options;
+
+  // locate first non-abstract parent
+  var parent = options.parent;
+  if (parent && !options.abstract) {
+    while (parent.$options.abstract && parent.$parent) {
+      parent = parent.$parent;
+    }
+    parent.$children.push(vm);
+  }
+
+  vm.$parent = parent;
+  vm.$root = parent ? parent.$root : vm;
+
+  vm.$children = [];
+  vm.$refs = {};
+
+  vm._watcher = null;
+  vm._inactive = null;
+  vm._directInactive = false;
+  vm._isMounted = false;
+  vm._isDestroyed = false;
+  vm._isBeingDestroyed = false;
+}
+
+function lifecycleMixin (Vue) {
+  Vue.prototype._update = function (vnode, hydrating) {
+    var vm = this;
+    if (vm._isMounted) {
+      callHook(vm, 'beforeUpdate');
+    }
+    var prevEl = vm.$el;
+    var prevVnode = vm._vnode;
+    var prevActiveInstance = activeInstance;
+    activeInstance = vm;
+    vm._vnode = vnode;
+    // Vue.prototype.__patch__ is injected in entry points
+    // based on the rendering backend used.
+    if (!prevVnode) {
+      // initial render
+      vm.$el = vm.__patch__(
+        vm.$el, vnode, hydrating, false /* removeOnly */,
+        vm.$options._parentElm,
+        vm.$options._refElm
+      );
+      // no need for the ref nodes after initial patch
+      // this prevents keeping a detached DOM tree in memory (#5851)
+      vm.$options._parentElm = vm.$options._refElm = null;
+    } else {
+      // updates
+      vm.$el = vm.__patch__(prevVnode, vnode);
+    }
+    activeInstance = prevActiveInstance;
+    // update __vue__ reference
+    if (prevEl) {
+      prevEl.__vue__ = null;
+    }
+    if (vm.$el) {
+      vm.$el.__vue__ = vm;
+    }
+    // if parent is an HOC, update its $el as well
+    if (vm.$vnode && vm.$parent && vm.$vnode === vm.$parent._vnode) {
+      vm.$parent.$el = vm.$el;
+    }
+    // updated hook is called by the scheduler to ensure that children are
+    // updated in a parent's updated hook.
+  };
+
+  Vue.prototype.$forceUpdate = function () {
+    var vm = this;
+    if (vm._watcher) {
+      vm._watcher.update();
+    }
+  };
+
+  Vue.prototype.$destroy = function () {
+    var vm = this;
+    if (vm._isBeingDestroyed) {
+      return
+    }
+    callHook(vm, 'beforeDestroy');
+    vm._isBeingDestroyed = true;
+    // remove self from parent
+    var parent = vm.$parent;
+    if (parent && !parent._isBeingDestroyed && !vm.$options.abstract) {
+      remove(parent.$children, vm);
+    }
+    // teardown watchers
+    if (vm._watcher) {
+      vm._watcher.teardown();
+    }
+    var i = vm._watchers.length;
+    while (i--) {
+      vm._watchers[i].teardown();
+    }
+    // remove reference from data ob
+    // frozen object may not have observer.
+    if (vm._data.__ob__) {
+      vm._data.__ob__.vmCount--;
+    }
+    // call the last hook...
+    vm._isDestroyed = true;
+    // invoke destroy hooks on current rendered tree
+    vm.__patch__(vm._vnode, null);
+    // fire destroyed hook
+    callHook(vm, 'destroyed');
+    // turn off all instance listeners.
+    vm.$off();
+    // remove __vue__ reference
+    if (vm.$el) {
+      vm.$el.__vue__ = null;
+    }
+    // release circular reference (#6759)
+    if (vm.$vnode) {
+      vm.$vnode.parent = null;
+    }
+  };
+}
+
+function mountComponent (
+  vm,
+  el,
+  hydrating
+) {
+  vm.$el = el;
+  if (!vm.$options.render) {
+    vm.$options.render = createEmptyVNode;
+    if (process.env.NODE_ENV !== 'production') {
+      /* istanbul ignore if */
+      if ((vm.$options.template && vm.$options.template.charAt(0) !== '#') ||
+        vm.$options.el || el) {
+        warn(
+          'You are using the runtime-only build of Vue where the template ' +
+          'compiler is not available. Either pre-compile the templates into ' +
+          'render functions, or use the compiler-included build.',
+          vm
+        );
+      } else {
+        warn(
+          'Failed to mount component: template or render function not defined.',
+          vm
+        );
+      }
+    }
+  }
+  callHook(vm, 'beforeMount');
+
+  var updateComponent;
+  /* istanbul ignore if */
+  if (process.env.NODE_ENV !== 'production' && config.performance && mark) {
+    updateComponent = function () {
+      var name = vm._name;
+      var id = vm._uid;
+      var startTag = "vue-perf-start:" + id;
+      var endTag = "vue-perf-end:" + id;
+
+      mark(startTag);
+      var vnode = vm._render();
+      mark(endTag);
+      measure(("vue " + name + " render"), startTag, endTag);
+
+      mark(startTag);
+      vm._update(vnode, hydrating);
+      mark(endTag);
+      measure(("vue " + name + " patch"), startTag, endTag);
+    };
+  } else {
+    updateComponent = function () {
+      vm._update(vm._render(), hydrating);
+    };
+  }
+
+  // we set this to vm._watcher inside the watcher's constructor
+  // since the watcher's initial patch may call $forceUpdate (e.g. inside child
+  // component's mounted hook), which relies on vm._watcher being already defined
+  new Watcher(vm, updateComponent, noop, null, true /* isRenderWatcher */);
+  hydrating = false;
+
+  // manually mounted instance, call mounted on self
+  // mounted is called for render-created child components in its inserted hook
+  if (vm.$vnode == null) {
+    vm._isMounted = true;
+    callHook(vm, 'mounted');
+  }
+  return vm
+}
+
+function updateChildComponent (
+  vm,
+  propsData,
+  listeners,
+  parentVnode,
+  renderChildren
+) {
+  if (process.env.NODE_ENV !== 'production') {
+    isUpdatingChildComponent = true;
+  }
+
+  // determine whether component has slot children
+  // we need to do this before overwriting $options._renderChildren
+  var hasChildren = !!(
+    renderChildren ||               // has new static slots
+    vm.$options._renderChildren ||  // has old static slots
+    parentVnode.data.scopedSlots || // has new scoped slots
+    vm.$scopedSlots !== emptyObject // has old scoped slots
+  );
+
+  vm.$options._parentVnode = parentVnode;
+  vm.$vnode = parentVnode; // update vm's placeholder node without re-render
+
+  if (vm._vnode) { // update child tree's parent
+    vm._vnode.parent = parentVnode;
+  }
+  vm.$options._renderChildren = renderChildren;
+
+  // update $attrs and $listeners hash
+  // these are also reactive so they may trigger child update if the child
+  // used them during render
+  vm.$attrs = (parentVnode.data && parentVnode.data.attrs) || emptyObject;
+  vm.$listeners = listeners || emptyObject;
+
+  // update props
+  if (propsData && vm.$options.props) {
+    observerState.shouldConvert = false;
+    var props = vm._props;
+    var propKeys = vm.$options._propKeys || [];
+    for (var i = 0; i < propKeys.length; i++) {
+      var key = propKeys[i];
+      props[key] = validateProp(key, vm.$options.props, propsData, vm);
+    }
+    observerState.shouldConvert = true;
+    // keep a copy of raw propsData
+    vm.$options.propsData = propsData;
+  }
+
+  // update listeners
+  if (listeners) {
+    var oldListeners = vm.$options._parentListeners;
+    vm.$options._parentListeners = listeners;
+    updateComponentListeners(vm, listeners, oldListeners);
+  }
+  // resolve slots + force update if has children
+  if (hasChildren) {
+    vm.$slots = resolveSlots(renderChildren, parentVnode.context);
+    vm.$forceUpdate();
+  }
+
+  if (process.env.NODE_ENV !== 'production') {
+    isUpdatingChildComponent = false;
+  }
+}
+
+function isInInactiveTree (vm) {
+  while (vm && (vm = vm.$parent)) {
+    if (vm._inactive) { return true }
+  }
+  return false
+}
+
+function activateChildComponent (vm, direct) {
+  if (direct) {
+    vm._directInactive = false;
+    if (isInInactiveTree(vm)) {
+      return
+    }
+  } else if (vm._directInactive) {
+    return
+  }
+  if (vm._inactive || vm._inactive === null) {
+    vm._inactive = false;
+    for (var i = 0; i < vm.$children.length; i++) {
+      activateChildComponent(vm.$children[i]);
+    }
+    callHook(vm, 'activated');
+  }
+}
+
+function deactivateChildComponent (vm, direct) {
+  if (direct) {
+    vm._directInactive = true;
+    if (isInInactiveTree(vm)) {
+      return
+    }
+  }
+  if (!vm._inactive) {
+    vm._inactive = true;
+    for (var i = 0; i < vm.$children.length; i++) {
+      deactivateChildComponent(vm.$children[i]);
+    }
+    callHook(vm, 'deactivated');
+  }
+}
+
+function callHook (vm, hook) {
+  var handlers = vm.$options[hook];
+  if (handlers) {
+    for (var i = 0, j = handlers.length; i < j; i++) {
+      try {
+        handlers[i].call(vm);
+      } catch (e) {
+        handleError(e, vm, (hook + " hook"));
+      }
+    }
+  }
+  if (vm._hasHookEvent) {
+    vm.$emit('hook:' + hook);
+  }
+}
+
+/*  */
+
+
+var MAX_UPDATE_COUNT = 100;
+
+var queue = [];
+var activatedChildren = [];
+var has = {};
+var circular = {};
+var waiting = false;
+var flushing = false;
+var index = 0;
+
+/**
+ * Reset the scheduler's state.
+ */
+function resetSchedulerState () {
+  index = queue.length = activatedChildren.length = 0;
+  has = {};
+  if (process.env.NODE_ENV !== 'production') {
+    circular = {};
+  }
+  waiting = flushing = false;
+}
+
+/**
+ * Flush both queues and run the watchers.
+ */
+function flushSchedulerQueue () {
+  flushing = true;
+  var watcher, id;
+
+  // Sort queue before flush.
+  // This ensures that:
+  // 1. Components are updated from parent to child. (because parent is always
+  //    created before the child)
+  // 2. A component's user watchers are run before its render watcher (because
+  //    user watchers are created before the render watcher)
+  // 3. If a component is destroyed during a parent component's watcher run,
+  //    its watchers can be skipped.
+  queue.sort(function (a, b) { return a.id - b.id; });
+
+  // do not cache length because more watchers might be pushed
+  // as we run existing watchers
+  for (index = 0; index < queue.length; index++) {
+    watcher = queue[index];
+    id = watcher.id;
+    has[id] = null;
+    watcher.run();
+    // in dev build, check and stop circular updates.
+    if (process.env.NODE_ENV !== 'production' && has[id] != null) {
+      circular[id] = (circular[id] || 0) + 1;
+      if (circular[id] > MAX_UPDATE_COUNT) {
+        warn(
+          'You may have an infinite update loop ' + (
+            watcher.user
+              ? ("in watcher with expression \"" + (watcher.expression) + "\"")
+              : "in a component render function."
+          ),
+          watcher.vm
+        );
+        break
+      }
+    }
+  }
+
+  // keep copies of post queues before resetting state
+  var activatedQueue = activatedChildren.slice();
+  var updatedQueue = queue.slice();
+
+  resetSchedulerState();
+
+  // call component updated and activated hooks
+  callActivatedHooks(activatedQueue);
+  callUpdatedHooks(updatedQueue);
+
+  // devtool hook
+  /* istanbul ignore if */
+  if (devtools && config.devtools) {
+    devtools.emit('flush');
+  }
+}
+
+function callUpdatedHooks (queue) {
+  var i = queue.length;
+  while (i--) {
+    var watcher = queue[i];
+    var vm = watcher.vm;
+    if (vm._watcher === watcher && vm._isMounted) {
+      callHook(vm, 'updated');
+    }
+  }
+}
+
+/**
+ * Queue a kept-alive component that was activated during patch.
+ * The queue will be processed after the entire tree has been patched.
+ */
+function queueActivatedComponent (vm) {
+  // setting _inactive to false here so that a render function can
+  // rely on checking whether it's in an inactive tree (e.g. router-view)
+  vm._inactive = false;
+  activatedChildren.push(vm);
+}
+
+function callActivatedHooks (queue) {
+  for (var i = 0; i < queue.length; i++) {
+    queue[i]._inactive = true;
+    activateChildComponent(queue[i], true /* true */);
+  }
+}
+
+/**
+ * Push a watcher into the watcher queue.
+ * Jobs with duplicate IDs will be skipped unless it's
+ * pushed when the queue is being flushed.
+ */
+function queueWatcher (watcher) {
+  var id = watcher.id;
+  if (has[id] == null) {
+    has[id] = true;
+    if (!flushing) {
+      queue.push(watcher);
+    } else {
+      // if already flushing, splice the watcher based on its id
+      // if already past its id, it will be run next immediately.
+      var i = queue.length - 1;
+      while (i > index && queue[i].id > watcher.id) {
+        i--;
+      }
+      queue.splice(i + 1, 0, watcher);
+    }
+    // queue the flush
+    if (!waiting) {
+      waiting = true;
+      nextTick(flushSchedulerQueue);
+    }
+  }
+}
+
+/*  */
+
+var uid$2 = 0;
+
+/**
+ * A watcher parses an expression, collects dependencies,
+ * and fires callback when the expression value changes.
+ * This is used for both the $watch() api and directives.
+ */
+var Watcher = function Watcher (
+  vm,
+  expOrFn,
+  cb,
+  options,
+  isRenderWatcher
+) {
+  this.vm = vm;
+  if (isRenderWatcher) {
+    vm._watcher = this;
+  }
+  vm._watchers.push(this);
+  // options
+  if (options) {
+    this.deep = !!options.deep;
+    this.user = !!options.user;
+    this.lazy = !!options.lazy;
+    this.sync = !!options.sync;
+  } else {
+    this.deep = this.user = this.lazy = this.sync = false;
+  }
+  this.cb = cb;
+  this.id = ++uid$2; // uid for batching
+  this.active = true;
+  this.dirty = this.lazy; // for lazy watchers
+  this.deps = [];
+  this.newDeps = [];
+  this.depIds = new _Set();
+  this.newDepIds = new _Set();
+  this.expression = process.env.NODE_ENV !== 'production'
+    ? expOrFn.toString()
+    : '';
+  // parse expression for getter
+  if (typeof expOrFn === 'function') {
+    this.getter = expOrFn;
+  } else {
+    this.getter = parsePath(expOrFn);
+    if (!this.getter) {
+      this.getter = function () {};
+      process.env.NODE_ENV !== 'production' && warn(
+        "Failed watching path: \"" + expOrFn + "\" " +
+        'Watcher only accepts simple dot-delimited paths. ' +
+        'For full control, use a function instead.',
+        vm
+      );
+    }
+  }
+  this.value = this.lazy
+    ? undefined
+    : this.get();
+};
+
+/**
+ * Evaluate the getter, and re-collect dependencies.
+ */
+Watcher.prototype.get = function get () {
+  pushTarget(this);
+  var value;
+  var vm = this.vm;
+  try {
+    value = this.getter.call(vm, vm);
+  } catch (e) {
+    if (this.user) {
+      handleError(e, vm, ("getter for watcher \"" + (this.expression) + "\""));
+    } else {
+      throw e
+    }
+  } finally {
+    // "touch" every property so they are all tracked as
+    // dependencies for deep watching
+    if (this.deep) {
+      traverse(value);
+    }
+    popTarget();
+    this.cleanupDeps();
+  }
+  return value
+};
+
+/**
+ * Add a dependency to this directive.
+ */
+Watcher.prototype.addDep = function addDep (dep) {
+  var id = dep.id;
+  if (!this.newDepIds.has(id)) {
+    this.newDepIds.add(id);
+    this.newDeps.push(dep);
+    if (!this.depIds.has(id)) {
+      dep.addSub(this);
+    }
+  }
+};
+
+/**
+ * Clean up for dependency collection.
+ */
+Watcher.prototype.cleanupDeps = function cleanupDeps () {
+    var this$1 = this;
+
+  var i = this.deps.length;
+  while (i--) {
+    var dep = this$1.deps[i];
+    if (!this$1.newDepIds.has(dep.id)) {
+      dep.removeSub(this$1);
+    }
+  }
+  var tmp = this.depIds;
+  this.depIds = this.newDepIds;
+  this.newDepIds = tmp;
+  this.newDepIds.clear();
+  tmp = this.deps;
+  this.deps = this.newDeps;
+  this.newDeps = tmp;
+  this.newDeps.length = 0;
+};
+
+/**
+ * Subscriber interface.
+ * Will be called when a dependency changes.
+ */
+Watcher.prototype.update = function update () {
+  /* istanbul ignore else */
+  if (this.lazy) {
+    this.dirty = true;
+  } else if (this.sync) {
+    this.run();
+  } else {
+    queueWatcher(this);
+  }
+};
+
+/**
+ * Scheduler job interface.
+ * Will be called by the scheduler.
+ */
+Watcher.prototype.run = function run () {
+  if (this.active) {
+    var value = this.get();
+    if (
+      value !== this.value ||
+      // Deep watchers and watchers on Object/Arrays should fire even
+      // when the value is the same, because the value may
+      // have mutated.
+      isObject(value) ||
+      this.deep
+    ) {
+      // set new value
+      var oldValue = this.value;
+      this.value = value;
+      if (this.user) {
+        try {
+          this.cb.call(this.vm, value, oldValue);
+        } catch (e) {
+          handleError(e, this.vm, ("callback for watcher \"" + (this.expression) + "\""));
+        }
+      } else {
+        this.cb.call(this.vm, value, oldValue);
+      }
+    }
+  }
+};
+
+/**
+ * Evaluate the value of the watcher.
+ * This only gets called for lazy watchers.
+ */
+Watcher.prototype.evaluate = function evaluate () {
+  this.value = this.get();
+  this.dirty = false;
+};
+
+/**
+ * Depend on all deps collected by this watcher.
+ */
+Watcher.prototype.depend = function depend () {
+    var this$1 = this;
+
+  var i = this.deps.length;
+  while (i--) {
+    this$1.deps[i].depend();
+  }
+};
+
+/**
+ * Remove self from all dependencies' subscriber list.
+ */
+Watcher.prototype.teardown = function teardown () {
+    var this$1 = this;
+
+  if (this.active) {
+    // remove self from vm's watcher list
+    // this is a somewhat expensive operation so we skip it
+    // if the vm is being destroyed.
+    if (!this.vm._isBeingDestroyed) {
+      remove(this.vm._watchers, this);
+    }
+    var i = this.deps.length;
+    while (i--) {
+      this$1.deps[i].removeSub(this$1);
+    }
+    this.active = false;
+  }
+};
+
+/*  */
+
+var sharedPropertyDefinition = {
+  enumerable: true,
+  configurable: true,
+  get: noop,
+  set: noop
+};
+
+function proxy (target, sourceKey, key) {
+  sharedPropertyDefinition.get = function proxyGetter () {
+    return this[sourceKey][key]
+  };
+  sharedPropertyDefinition.set = function proxySetter (val) {
+    this[sourceKey][key] = val;
+  };
+  Object.defineProperty(target, key, sharedPropertyDefinition);
+}
+
+function initState (vm) {
+  vm._watchers = [];
+  var opts = vm.$options;
+  if (opts.props) { initProps(vm, opts.props); }
+  if (opts.methods) { initMethods(vm, opts.methods); }
+  if (opts.data) {
+    initData(vm);
+  } else {
+    observe(vm._data = {}, true /* asRootData */);
+  }
+  if (opts.computed) { initComputed(vm, opts.computed); }
+  if (opts.watch && opts.watch !== nativeWatch) {
+    initWatch(vm, opts.watch);
+  }
+}
+
+function initProps (vm, propsOptions) {
+  var propsData = vm.$options.propsData || {};
+  var props = vm._props = {};
+  // cache prop keys so that future props updates can iterate using Array
+  // instead of dynamic object key enumeration.
+  var keys = vm.$options._propKeys = [];
+  var isRoot = !vm.$parent;
+  // root instance props should be converted
+  observerState.shouldConvert = isRoot;
+  var loop = function ( key ) {
+    keys.push(key);
+    var value = validateProp(key, propsOptions, propsData, vm);
+    /* istanbul ignore else */
+    if (process.env.NODE_ENV !== 'production') {
+      var hyphenatedKey = hyphenate(key);
+      if (isReservedAttribute(hyphenatedKey) ||
+          config.isReservedAttr(hyphenatedKey)) {
+        warn(
+          ("\"" + hyphenatedKey + "\" is a reserved attribute and cannot be used as component prop."),
+          vm
+        );
+      }
+      defineReactive(props, key, value, function () {
+        if (vm.$parent && !isUpdatingChildComponent) {
+          warn(
+            "Avoid mutating a prop directly since the value will be " +
+            "overwritten whenever the parent component re-renders. " +
+            "Instead, use a data or computed property based on the prop's " +
+            "value. Prop being mutated: \"" + key + "\"",
+            vm
+          );
+        }
+      });
+    } else {
+      defineReactive(props, key, value);
+    }
+    // static props are already proxied on the component's prototype
+    // during Vue.extend(). We only need to proxy props defined at
+    // instantiation here.
+    if (!(key in vm)) {
+      proxy(vm, "_props", key);
+    }
+  };
+
+  for (var key in propsOptions) loop( key );
+  observerState.shouldConvert = true;
+}
+
+function initData (vm) {
+  var data = vm.$options.data;
+  data = vm._data = typeof data === 'function'
+    ? getData(data, vm)
+    : data || {};
+  if (!isPlainObject(data)) {
+    data = {};
+    process.env.NODE_ENV !== 'production' && warn(
+      'data functions should return an object:\n' +
+      'https://vuejs.org/v2/guide/components.html#data-Must-Be-a-Function',
+      vm
+    );
+  }
+  // proxy data on instance
+  var keys = Object.keys(data);
+  var props = vm.$options.props;
+  var methods = vm.$options.methods;
+  var i = keys.length;
+  while (i--) {
+    var key = keys[i];
+    if (process.env.NODE_ENV !== 'production') {
+      if (methods && hasOwn(methods, key)) {
+        warn(
+          ("Method \"" + key + "\" has already been defined as a data property."),
+          vm
+        );
+      }
+    }
+    if (props && hasOwn(props, key)) {
+      process.env.NODE_ENV !== 'production' && warn(
+        "The data property \"" + key + "\" is already declared as a prop. " +
+        "Use prop default value instead.",
+        vm
+      );
+    } else if (!isReserved(key)) {
+      proxy(vm, "_data", key);
+    }
+  }
+  // observe data
+  observe(data, true /* asRootData */);
+}
+
+function getData (data, vm) {
+  try {
+    return data.call(vm, vm)
+  } catch (e) {
+    handleError(e, vm, "data()");
+    return {}
+  }
+}
+
+var computedWatcherOptions = { lazy: true };
+
+function initComputed (vm, computed) {
+  // $flow-disable-line
+  var watchers = vm._computedWatchers = Object.create(null);
+  // computed properties are just getters during SSR
+  var isSSR = isServerRendering();
+
+  for (var key in computed) {
+    var userDef = computed[key];
+    var getter = typeof userDef === 'function' ? userDef : userDef.get;
+    if (process.env.NODE_ENV !== 'production' && getter == null) {
+      warn(
+        ("Getter is missing for computed property \"" + key + "\"."),
+        vm
+      );
+    }
+
+    if (!isSSR) {
+      // create internal watcher for the computed property.
+      watchers[key] = new Watcher(
+        vm,
+        getter || noop,
+        noop,
+        computedWatcherOptions
+      );
+    }
+
+    // component-defined computed properties are already defined on the
+    // component prototype. We only need to define computed properties defined
+    // at instantiation here.
+    if (!(key in vm)) {
+      defineComputed(vm, key, userDef);
+    } else if (process.env.NODE_ENV !== 'production') {
+      if (key in vm.$data) {
+        warn(("The computed property \"" + key + "\" is already defined in data."), vm);
+      } else if (vm.$options.props && key in vm.$options.props) {
+        warn(("The computed property \"" + key + "\" is already defined as a prop."), vm);
+      }
+    }
+  }
+}
+
+function defineComputed (
+  target,
+  key,
+  userDef
+) {
+  var shouldCache = !isServerRendering();
+  if (typeof userDef === 'function') {
+    sharedPropertyDefinition.get = shouldCache
+      ? createComputedGetter(key)
+      : userDef;
+    sharedPropertyDefinition.set = noop;
+  } else {
+    sharedPropertyDefinition.get = userDef.get
+      ? shouldCache && userDef.cache !== false
+        ? createComputedGetter(key)
+        : userDef.get
+      : noop;
+    sharedPropertyDefinition.set = userDef.set
+      ? userDef.set
+      : noop;
+  }
+  if (process.env.NODE_ENV !== 'production' &&
+      sharedPropertyDefinition.set === noop) {
+    sharedPropertyDefinition.set = function () {
+      warn(
+        ("Computed property \"" + key + "\" was assigned to but it has no setter."),
+        this
+      );
+    };
+  }
+  Object.defineProperty(target, key, sharedPropertyDefinition);
+}
+
+function createComputedGetter (key) {
+  return function computedGetter () {
+    var watcher = this._computedWatchers && this._computedWatchers[key];
+    if (watcher) {
+      if (watcher.dirty) {
+        watcher.evaluate();
+      }
+      if (Dep.target) {
+        watcher.depend();
+      }
+      return watcher.value
+    }
+  }
+}
+
+function initMethods (vm, methods) {
+  var props = vm.$options.props;
+  for (var key in methods) {
+    if (process.env.NODE_ENV !== 'production') {
+      if (methods[key] == null) {
+        warn(
+          "Method \"" + key + "\" has an undefined value in the component definition. " +
+          "Did you reference the function correctly?",
+          vm
+        );
+      }
+      if (props && hasOwn(props, key)) {
+        warn(
+          ("Method \"" + key + "\" has already been defined as a prop."),
+          vm
+        );
+      }
+      if ((key in vm) && isReserved(key)) {
+        warn(
+          "Method \"" + key + "\" conflicts with an existing Vue instance method. " +
+          "Avoid defining component methods that start with _ or $."
+        );
+      }
+    }
+    vm[key] = methods[key] == null ? noop : bind(methods[key], vm);
+  }
+}
+
+function initWatch (vm, watch) {
+  for (var key in watch) {
+    var handler = watch[key];
+    if (Array.isArray(handler)) {
+      for (var i = 0; i < handler.length; i++) {
+        createWatcher(vm, key, handler[i]);
+      }
+    } else {
+      createWatcher(vm, key, handler);
+    }
+  }
+}
+
+function createWatcher (
+  vm,
+  keyOrFn,
+  handler,
+  options
+) {
+  if (isPlainObject(handler)) {
+    options = handler;
+    handler = handler.handler;
+  }
+  if (typeof handler === 'string') {
+    handler = vm[handler];
+  }
+  return vm.$watch(keyOrFn, handler, options)
+}
+
+function stateMixin (Vue) {
+  // flow somehow has problems with directly declared definition object
+  // when using Object.defineProperty, so we have to procedurally build up
+  // the object here.
+  var dataDef = {};
+  dataDef.get = function () { return this._data };
+  var propsDef = {};
+  propsDef.get = function () { return this._props };
+  if (process.env.NODE_ENV !== 'production') {
+    dataDef.set = function (newData) {
+      warn(
+        'Avoid replacing instance root $data. ' +
+        'Use nested data properties instead.',
+        this
+      );
+    };
+    propsDef.set = function () {
+      warn("$props is readonly.", this);
+    };
+  }
+  Object.defineProperty(Vue.prototype, '$data', dataDef);
+  Object.defineProperty(Vue.prototype, '$props', propsDef);
+
+  Vue.prototype.$set = set;
+  Vue.prototype.$delete = del;
+
+  Vue.prototype.$watch = function (
+    expOrFn,
+    cb,
+    options
+  ) {
+    var vm = this;
+    if (isPlainObject(cb)) {
+      return createWatcher(vm, expOrFn, cb, options)
+    }
+    options = options || {};
+    options.user = true;
+    var watcher = new Watcher(vm, expOrFn, cb, options);
+    if (options.immediate) {
+      cb.call(vm, watcher.value);
+    }
+    return function unwatchFn () {
+      watcher.teardown();
+    }
+  };
+}
+
+/*  */
+
+function initProvide (vm) {
+  var provide = vm.$options.provide;
+  if (provide) {
+    vm._provided = typeof provide === 'function'
+      ? provide.call(vm)
+      : provide;
+  }
+}
+
+function initInjections (vm) {
+  var result = resolveInject(vm.$options.inject, vm);
+  if (result) {
+    observerState.shouldConvert = false;
+    Object.keys(result).forEach(function (key) {
+      /* istanbul ignore else */
+      if (process.env.NODE_ENV !== 'production') {
+        defineReactive(vm, key, result[key], function () {
+          warn(
+            "Avoid mutating an injected value directly since the changes will be " +
+            "overwritten whenever the provided component re-renders. " +
+            "injection being mutated: \"" + key + "\"",
+            vm
+          );
+        });
+      } else {
+        defineReactive(vm, key, result[key]);
+      }
+    });
+    observerState.shouldConvert = true;
+  }
+}
+
+function resolveInject (inject, vm) {
+  if (inject) {
+    // inject is :any because flow is not smart enough to figure out cached
+    var result = Object.create(null);
+    var keys = hasSymbol
+      ? Reflect.ownKeys(inject).filter(function (key) {
+        /* istanbul ignore next */
+        return Object.getOwnPropertyDescriptor(inject, key).enumerable
+      })
+      : Object.keys(inject);
+
+    for (var i = 0; i < keys.length; i++) {
+      var key = keys[i];
+      var provideKey = inject[key].from;
+      var source = vm;
+      while (source) {
+        if (source._provided && provideKey in source._provided) {
+          result[key] = source._provided[provideKey];
+          break
+        }
+        source = source.$parent;
+      }
+      if (!source) {
+        if ('default' in inject[key]) {
+          var provideDefault = inject[key].default;
+          result[key] = typeof provideDefault === 'function'
+            ? provideDefault.call(vm)
+            : provideDefault;
+        } else if (process.env.NODE_ENV !== 'production') {
+          warn(("Injection \"" + key + "\" not found"), vm);
+        }
+      }
+    }
+    return result
+  }
+}
+
+/*  */
+
+/**
+ * Runtime helper for rendering v-for lists.
+ */
+function renderList (
+  val,
+  render
+) {
+  var ret, i, l, keys, key;
+  if (Array.isArray(val) || typeof val === 'string') {
+    ret = new Array(val.length);
+    for (i = 0, l = val.length; i < l; i++) {
+      ret[i] = render(val[i], i);
+    }
+  } else if (typeof val === 'number') {
+    ret = new Array(val);
+    for (i = 0; i < val; i++) {
+      ret[i] = render(i + 1, i);
+    }
+  } else if (isObject(val)) {
+    keys = Object.keys(val);
+    ret = new Array(keys.length);
+    for (i = 0, l = keys.length; i < l; i++) {
+      key = keys[i];
+      ret[i] = render(val[key], key, i);
+    }
+  }
+  if (isDef(ret)) {
+    (ret)._isVList = true;
+  }
+  return ret
+}
+
+/*  */
+
+/**
+ * Runtime helper for rendering <slot>
+ */
+function renderSlot (
+  name,
+  fallback,
+  props,
+  bindObject
+) {
+  var scopedSlotFn = this.$scopedSlots[name];
+  var nodes;
+  if (scopedSlotFn) { // scoped slot
+    props = props || {};
+    if (bindObject) {
+      if (process.env.NODE_ENV !== 'production' && !isObject(bindObject)) {
+        warn(
+          'slot v-bind without argument expects an Object',
+          this
+        );
+      }
+      props = extend(extend({}, bindObject), props);
+    }
+    nodes = scopedSlotFn(props) || fallback;
+  } else {
+    var slotNodes = this.$slots[name];
+    // warn duplicate slot usage
+    if (slotNodes) {
+      if (process.env.NODE_ENV !== 'production' && slotNodes._rendered) {
+        warn(
+          "Duplicate presence of slot \"" + name + "\" found in the same render tree " +
+          "- this will likely cause render errors.",
+          this
+        );
+      }
+      slotNodes._rendered = true;
+    }
+    nodes = slotNodes || fallback;
+  }
+
+  var target = props && props.slot;
+  if (target) {
+    return this.$createElement('template', { slot: target }, nodes)
+  } else {
+    return nodes
+  }
+}
+
+/*  */
+
+/**
+ * Runtime helper for resolving filters
+ */
+function resolveFilter (id) {
+  return resolveAsset(this.$options, 'filters', id, true) || identity
+}
+
+/*  */
+
+/**
+ * Runtime helper for checking keyCodes from config.
+ * exposed as Vue.prototype._k
+ * passing in eventKeyName as last argument separately for backwards compat
+ */
+function checkKeyCodes (
+  eventKeyCode,
+  key,
+  builtInAlias,
+  eventKeyName
+) {
+  var keyCodes = config.keyCodes[key] || builtInAlias;
+  if (keyCodes) {
+    if (Array.isArray(keyCodes)) {
+      return keyCodes.indexOf(eventKeyCode) === -1
+    } else {
+      return keyCodes !== eventKeyCode
+    }
+  } else if (eventKeyName) {
+    return hyphenate(eventKeyName) !== key
+  }
+}
+
+/*  */
+
+/**
+ * Runtime helper for merging v-bind="object" into a VNode's data.
+ */
+function bindObjectProps (
+  data,
+  tag,
+  value,
+  asProp,
+  isSync
+) {
+  if (value) {
+    if (!isObject(value)) {
+      process.env.NODE_ENV !== 'production' && warn(
+        'v-bind without argument expects an Object or Array value',
+        this
+      );
+    } else {
+      if (Array.isArray(value)) {
+        value = toObject(value);
+      }
+      var hash;
+      var loop = function ( key ) {
+        if (
+          key === 'class' ||
+          key === 'style' ||
+          isReservedAttribute(key)
+        ) {
+          hash = data;
+        } else {
+          var type = data.attrs && data.attrs.type;
+          hash = asProp || config.mustUseProp(tag, type, key)
+            ? data.domProps || (data.domProps = {})
+            : data.attrs || (data.attrs = {});
+        }
+        if (!(key in hash)) {
+          hash[key] = value[key];
+
+          if (isSync) {
+            var on = data.on || (data.on = {});
+            on[("update:" + key)] = function ($event) {
+              value[key] = $event;
+            };
+          }
+        }
+      };
+
+      for (var key in value) loop( key );
+    }
+  }
+  return data
+}
+
+/*  */
+
+/**
+ * Runtime helper for rendering static trees.
+ */
+function renderStatic (
+  index,
+  isInFor
+) {
+  var cached = this._staticTrees || (this._staticTrees = []);
+  var tree = cached[index];
+  // if has already-rendered static tree and not inside v-for,
+  // we can reuse the same tree by doing a shallow clone.
+  if (tree && !isInFor) {
+    return Array.isArray(tree)
+      ? cloneVNodes(tree)
+      : cloneVNode(tree)
+  }
+  // otherwise, render a fresh tree.
+  tree = cached[index] = this.$options.staticRenderFns[index].call(
+    this._renderProxy,
+    null,
+    this // for render fns generated for functional component templates
+  );
+  markStatic(tree, ("__static__" + index), false);
+  return tree
+}
+
+/**
+ * Runtime helper for v-once.
+ * Effectively it means marking the node as static with a unique key.
+ */
+function markOnce (
+  tree,
+  index,
+  key
+) {
+  markStatic(tree, ("__once__" + index + (key ? ("_" + key) : "")), true);
+  return tree
+}
+
+function markStatic (
+  tree,
+  key,
+  isOnce
+) {
+  if (Array.isArray(tree)) {
+    for (var i = 0; i < tree.length; i++) {
+      if (tree[i] && typeof tree[i] !== 'string') {
+        markStaticNode(tree[i], (key + "_" + i), isOnce);
+      }
+    }
+  } else {
+    markStaticNode(tree, key, isOnce);
+  }
+}
+
+function markStaticNode (node, key, isOnce) {
+  node.isStatic = true;
+  node.key = key;
+  node.isOnce = isOnce;
+}
+
+/*  */
+
+function bindObjectListeners (data, value) {
+  if (value) {
+    if (!isPlainObject(value)) {
+      process.env.NODE_ENV !== 'production' && warn(
+        'v-on without argument expects an Object value',
+        this
+      );
+    } else {
+      var on = data.on = data.on ? extend({}, data.on) : {};
+      for (var key in value) {
+        var existing = on[key];
+        var ours = value[key];
+        on[key] = existing ? [].concat(existing, ours) : ours;
+      }
+    }
+  }
+  return data
+}
+
+/*  */
+
+function installRenderHelpers (target) {
+  target._o = markOnce;
+  target._n = toNumber;
+  target._s = toString;
+  target._l = renderList;
+  target._t = renderSlot;
+  target._q = looseEqual;
+  target._i = looseIndexOf;
+  target._m = renderStatic;
+  target._f = resolveFilter;
+  target._k = checkKeyCodes;
+  target._b = bindObjectProps;
+  target._v = createTextVNode;
+  target._e = createEmptyVNode;
+  target._u = resolveScopedSlots;
+  target._g = bindObjectListeners;
+}
+
+/*  */
+
+function FunctionalRenderContext (
+  data,
+  props,
+  children,
+  parent,
+  Ctor
+) {
+  var options = Ctor.options;
+  this.data = data;
+  this.props = props;
+  this.children = children;
+  this.parent = parent;
+  this.listeners = data.on || emptyObject;
+  this.injections = resolveInject(options.inject, parent);
+  this.slots = function () { return resolveSlots(children, parent); };
+
+  // ensure the createElement function in functional components
+  // gets a unique context - this is necessary for correct named slot check
+  var contextVm = Object.create(parent);
+  var isCompiled = isTrue(options._compiled);
+  var needNormalization = !isCompiled;
+
+  // support for compiled functional template
+  if (isCompiled) {
+    // exposing $options for renderStatic()
+    this.$options = options;
+    // pre-resolve slots for renderSlot()
+    this.$slots = this.slots();
+    this.$scopedSlots = data.scopedSlots || emptyObject;
+  }
+
+  if (options._scopeId) {
+    this._c = function (a, b, c, d) {
+      var vnode = createElement(contextVm, a, b, c, d, needNormalization);
+      if (vnode) {
+        vnode.fnScopeId = options._scopeId;
+        vnode.fnContext = parent;
+      }
+      return vnode
+    };
+  } else {
+    this._c = function (a, b, c, d) { return createElement(contextVm, a, b, c, d, needNormalization); };
+  }
+}
+
+installRenderHelpers(FunctionalRenderContext.prototype);
+
+function createFunctionalComponent (
+  Ctor,
+  propsData,
+  data,
+  contextVm,
+  children
+) {
+  var options = Ctor.options;
+  var props = {};
+  var propOptions = options.props;
+  if (isDef(propOptions)) {
+    for (var key in propOptions) {
+      props[key] = validateProp(key, propOptions, propsData || emptyObject);
+    }
+  } else {
+    if (isDef(data.attrs)) { mergeProps(props, data.attrs); }
+    if (isDef(data.props)) { mergeProps(props, data.props); }
+  }
+
+  var renderContext = new FunctionalRenderContext(
+    data,
+    props,
+    children,
+    contextVm,
+    Ctor
+  );
+
+  var vnode = options.render.call(null, renderContext._c, renderContext);
+
+  if (vnode instanceof VNode) {
+    vnode.fnContext = contextVm;
+    vnode.fnOptions = options;
+    if (data.slot) {
+      (vnode.data || (vnode.data = {})).slot = data.slot;
+    }
+  }
+
+  return vnode
+}
+
+function mergeProps (to, from) {
+  for (var key in from) {
+    to[camelize(key)] = from[key];
+  }
+}
+
+/*  */
+
+
+
+
+// Register the component hook to weex native render engine.
+// The hook will be triggered by native, not javascript.
+
+
+// Updates the state of the component to weex native render engine.
+
+/*  */
+
+// https://github.com/Hanks10100/weex-native-directive/tree/master/component
+
+// listening on native callback
+
+/*  */
+
+/*  */
+
+// hooks to be invoked on component VNodes during patch
+var componentVNodeHooks = {
+  init: function init (
+    vnode,
+    hydrating,
+    parentElm,
+    refElm
+  ) {
+    if (!vnode.componentInstance || vnode.componentInstance._isDestroyed) {
+      var child = vnode.componentInstance = createComponentInstanceForVnode(
+        vnode,
+        activeInstance,
+        parentElm,
+        refElm
+      );
+      child.$mount(hydrating ? vnode.elm : undefined, hydrating);
+    } else if (vnode.data.keepAlive) {
+      // kept-alive components, treat as a patch
+      var mountedNode = vnode; // work around flow
+      componentVNodeHooks.prepatch(mountedNode, mountedNode);
+    }
+  },
+
+  prepatch: function prepatch (oldVnode, vnode) {
+    var options = vnode.componentOptions;
+    var child = vnode.componentInstance = oldVnode.componentInstance;
+    updateChildComponent(
+      child,
+      options.propsData, // updated props
+      options.listeners, // updated listeners
+      vnode, // new parent vnode
+      options.children // new children
+    );
+  },
+
+  insert: function insert (vnode) {
+    var context = vnode.context;
+    var componentInstance = vnode.componentInstance;
+    if (!componentInstance._isMounted) {
+      componentInstance._isMounted = true;
+      callHook(componentInstance, 'mounted');
+    }
+    if (vnode.data.keepAlive) {
+      if (context._isMounted) {
+        // vue-router#1212
+        // During updates, a kept-alive component's child components may
+        // change, so directly walking the tree here may call activated hooks
+        // on incorrect children. Instead we push them into a queue which will
+        // be processed after the whole patch process ended.
+        queueActivatedComponent(componentInstance);
+      } else {
+        activateChildComponent(componentInstance, true /* direct */);
+      }
+    }
+  },
+
+  destroy: function destroy (vnode) {
+    var componentInstance = vnode.componentInstance;
+    if (!componentInstance._isDestroyed) {
+      if (!vnode.data.keepAlive) {
+        componentInstance.$destroy();
+      } else {
+        deactivateChildComponent(componentInstance, true /* direct */);
+      }
+    }
+  }
+};
+
+var hooksToMerge = Object.keys(componentVNodeHooks);
+
+function createComponent (
+  Ctor,
+  data,
+  context,
+  children,
+  tag
+) {
+  if (isUndef(Ctor)) {
+    return
+  }
+
+  var baseCtor = context.$options._base;
+
+  // plain options object: turn it into a constructor
+  if (isObject(Ctor)) {
+    Ctor = baseCtor.extend(Ctor);
+  }
+
+  // if at this stage it's not a constructor or an async component factory,
+  // reject.
+  if (typeof Ctor !== 'function') {
+    if (process.env.NODE_ENV !== 'production') {
+      warn(("Invalid Component definition: " + (String(Ctor))), context);
+    }
+    return
+  }
+
+  // async component
+  var asyncFactory;
+  if (isUndef(Ctor.cid)) {
+    asyncFactory = Ctor;
+    Ctor = resolveAsyncComponent(asyncFactory, baseCtor, context);
+    if (Ctor === undefined) {
+      // return a placeholder node for async component, which is rendered
+      // as a comment node but preserves all the raw information for the node.
+      // the information will be used for async server-rendering and hydration.
+      return createAsyncPlaceholder(
+        asyncFactory,
+        data,
+        context,
+        children,
+        tag
+      )
+    }
+  }
+
+  data = data || {};
+
+  // resolve constructor options in case global mixins are applied after
+  // component constructor creation
+  resolveConstructorOptions(Ctor);
+
+  // transform component v-model data into props & events
+  if (isDef(data.model)) {
+    transformModel(Ctor.options, data);
+  }
+
+  // extract props
+  var propsData = extractPropsFromVNodeData(data, Ctor, tag);
+
+  // functional component
+  if (isTrue(Ctor.options.functional)) {
+    return createFunctionalComponent(Ctor, propsData, data, context, children)
+  }
+
+  // extract listeners, since these needs to be treated as
+  // child component listeners instead of DOM listeners
+  var listeners = data.on;
+  // replace with listeners with .native modifier
+  // so it gets processed during parent component patch.
+  data.on = data.nativeOn;
+
+  if (isTrue(Ctor.options.abstract)) {
+    // abstract components do not keep anything
+    // other than props & listeners & slot
+
+    // work around flow
+    var slot = data.slot;
+    data = {};
+    if (slot) {
+      data.slot = slot;
+    }
+  }
+
+  // merge component management hooks onto the placeholder node
+  mergeHooks(data);
+
+  // return a placeholder vnode
+  var name = Ctor.options.name || tag;
+  var vnode = new VNode(
+    ("vue-component-" + (Ctor.cid) + (name ? ("-" + name) : '')),
+    data, undefined, undefined, undefined, context,
+    { Ctor: Ctor, propsData: propsData, listeners: listeners, tag: tag, children: children },
+    asyncFactory
+  );
+
+  // Weex specific: invoke recycle-list optimized @render function for
+  // extracting cell-slot template.
+  // https://github.com/Hanks10100/weex-native-directive/tree/master/component
+  /* istanbul ignore if */
+  return vnode
+}
+
+function createComponentInstanceForVnode (
+  vnode, // we know it's MountedComponentVNode but flow doesn't
+  parent, // activeInstance in lifecycle state
+  parentElm,
+  refElm
+) {
+  var options = {
+    _isComponent: true,
+    parent: parent,
+    _parentVnode: vnode,
+    _parentElm: parentElm || null,
+    _refElm: refElm || null
+  };
+  // check inline-template render functions
+  var inlineTemplate = vnode.data.inlineTemplate;
+  if (isDef(inlineTemplate)) {
+    options.render = inlineTemplate.render;
+    options.staticRenderFns = inlineTemplate.staticRenderFns;
+  }
+  return new vnode.componentOptions.Ctor(options)
+}
+
+function mergeHooks (data) {
+  if (!data.hook) {
+    data.hook = {};
+  }
+  for (var i = 0; i < hooksToMerge.length; i++) {
+    var key = hooksToMerge[i];
+    var fromParent = data.hook[key];
+    var ours = componentVNodeHooks[key];
+    data.hook[key] = fromParent ? mergeHook$1(ours, fromParent) : ours;
+  }
+}
+
+function mergeHook$1 (one, two) {
+  return function (a, b, c, d) {
+    one(a, b, c, d);
+    two(a, b, c, d);
+  }
+}
+
+// transform component v-model info (value and callback) into
+// prop and event handler respectively.
+function transformModel (options, data) {
+  var prop = (options.model && options.model.prop) || 'value';
+  var event = (options.model && options.model.event) || 'input';(data.props || (data.props = {}))[prop] = data.model.value;
+  var on = data.on || (data.on = {});
+  if (isDef(on[event])) {
+    on[event] = [data.model.callback].concat(on[event]);
+  } else {
+    on[event] = data.model.callback;
+  }
+}
+
+/*  */
+
+var SIMPLE_NORMALIZE = 1;
+var ALWAYS_NORMALIZE = 2;
+
+// wrapper function for providing a more flexible interface
+// without getting yelled at by flow
+function createElement (
+  context,
+  tag,
+  data,
+  children,
+  normalizationType,
+  alwaysNormalize
+) {
+  if (Array.isArray(data) || isPrimitive(data)) {
+    normalizationType = children;
+    children = data;
+    data = undefined;
+  }
+  if (isTrue(alwaysNormalize)) {
+    normalizationType = ALWAYS_NORMALIZE;
+  }
+  return _createElement(context, tag, data, children, normalizationType)
+}
+
+function _createElement (
+  context,
+  tag,
+  data,
+  children,
+  normalizationType
+) {
+  if (isDef(data) && isDef((data).__ob__)) {
+    process.env.NODE_ENV !== 'production' && warn(
+      "Avoid using observed data object as vnode data: " + (JSON.stringify(data)) + "\n" +
+      'Always create fresh vnode data objects in each render!',
+      context
+    );
+    return createEmptyVNode()
+  }
+  // object syntax in v-bind
+  if (isDef(data) && isDef(data.is)) {
+    tag = data.is;
+  }
+  if (!tag) {
+    // in case of component :is set to falsy value
+    return createEmptyVNode()
+  }
+  // warn against non-primitive key
+  if (process.env.NODE_ENV !== 'production' &&
+    isDef(data) && isDef(data.key) && !isPrimitive(data.key)
+  ) {
+    {
+      warn(
+        'Avoid using non-primitive value as key, ' +
+        'use string/number value instead.',
+        context
+      );
+    }
+  }
+  // support single function children as default scoped slot
+  if (Array.isArray(children) &&
+    typeof children[0] === 'function'
+  ) {
+    data = data || {};
+    data.scopedSlots = { default: children[0] };
+    children.length = 0;
+  }
+  if (normalizationType === ALWAYS_NORMALIZE) {
+    children = normalizeChildren(children);
+  } else if (normalizationType === SIMPLE_NORMALIZE) {
+    children = simpleNormalizeChildren(children);
+  }
+  var vnode, ns;
+  if (typeof tag === 'string') {
+    var Ctor;
+    ns = (context.$vnode && context.$vnode.ns) || config.getTagNamespace(tag);
+    if (config.isReservedTag(tag)) {
+      // platform built-in elements
+      vnode = new VNode(
+        config.parsePlatformTagName(tag), data, children,
+        undefined, undefined, context
+      );
+    } else if (isDef(Ctor = resolveAsset(context.$options, 'components', tag))) {
+      // component
+      vnode = createComponent(Ctor, data, context, children, tag);
+    } else {
+      // unknown or unlisted namespaced elements
+      // check at runtime because it may get assigned a namespace when its
+      // parent normalizes children
+      vnode = new VNode(
+        tag, data, children,
+        undefined, undefined, context
+      );
+    }
+  } else {
+    // direct component options / constructor
+    vnode = createComponent(tag, data, context, children);
+  }
+  if (isDef(vnode)) {
+    if (ns) { applyNS(vnode, ns); }
+    return vnode
+  } else {
+    return createEmptyVNode()
+  }
+}
+
+function applyNS (vnode, ns, force) {
+  vnode.ns = ns;
+  if (vnode.tag === 'foreignObject') {
+    // use default namespace inside foreignObject
+    ns = undefined;
+    force = true;
+  }
+  if (isDef(vnode.children)) {
+    for (var i = 0, l = vnode.children.length; i < l; i++) {
+      var child = vnode.children[i];
+      if (isDef(child.tag) && (isUndef(child.ns) || isTrue(force))) {
+        applyNS(child, ns, force);
+      }
+    }
+  }
+}
+
+/*  */
+
+function initRender (vm) {
+  vm._vnode = null; // the root of the child tree
+  vm._staticTrees = null; // v-once cached trees
+  var options = vm.$options;
+  var parentVnode = vm.$vnode = options._parentVnode; // the placeholder node in parent tree
+  var renderContext = parentVnode && parentVnode.context;
+  vm.$slots = resolveSlots(options._renderChildren, renderContext);
+  vm.$scopedSlots = emptyObject;
+  // bind the createElement fn to this instance
+  // so that we get proper render context inside it.
+  // args order: tag, data, children, normalizationType, alwaysNormalize
+  // internal version is used by render functions compiled from templates
+  vm._c = function (a, b, c, d) { return createElement(vm, a, b, c, d, false); };
+  // normalization is always applied for the public version, used in
+  // user-written render functions.
+  vm.$createElement = function (a, b, c, d) { return createElement(vm, a, b, c, d, true); };
+
+  // $attrs & $listeners are exposed for easier HOC creation.
+  // they need to be reactive so that HOCs using them are always updated
+  var parentData = parentVnode && parentVnode.data;
+
+  /* istanbul ignore else */
+  if (process.env.NODE_ENV !== 'production') {
+    defineReactive(vm, '$attrs', parentData && parentData.attrs || emptyObject, function () {
+      !isUpdatingChildComponent && warn("$attrs is readonly.", vm);
+    }, true);
+    defineReactive(vm, '$listeners', options._parentListeners || emptyObject, function () {
+      !isUpdatingChildComponent && warn("$listeners is readonly.", vm);
+    }, true);
+  } else {
+    defineReactive(vm, '$attrs', parentData && parentData.attrs || emptyObject, null, true);
+    defineReactive(vm, '$listeners', options._parentListeners || emptyObject, null, true);
+  }
+}
+
+function renderMixin (Vue) {
+  // install runtime convenience helpers
+  installRenderHelpers(Vue.prototype);
+
+  Vue.prototype.$nextTick = function (fn) {
+    return nextTick(fn, this)
+  };
+
+  Vue.prototype._render = function () {
+    var vm = this;
+    var ref = vm.$options;
+    var render = ref.render;
+    var _parentVnode = ref._parentVnode;
+
+    if (vm._isMounted) {
+      // if the parent didn't update, the slot nodes will be the ones from
+      // last render. They need to be cloned to ensure "freshness" for this render.
+      for (var key in vm.$slots) {
+        var slot = vm.$slots[key];
+        // _rendered is a flag added by renderSlot, but may not be present
+        // if the slot is passed from manually written render functions
+        if (slot._rendered || (slot[0] && slot[0].elm)) {
+          vm.$slots[key] = cloneVNodes(slot, true /* deep */);
+        }
+      }
+    }
+
+    vm.$scopedSlots = (_parentVnode && _parentVnode.data.scopedSlots) || emptyObject;
+
+    // set parent vnode. this allows render functions to have access
+    // to the data on the placeholder node.
+    vm.$vnode = _parentVnode;
+    // render self
+    var vnode;
+    try {
+      vnode = render.call(vm._renderProxy, vm.$createElement);
+    } catch (e) {
+      handleError(e, vm, "render");
+      // return error render result,
+      // or previous vnode to prevent render error causing blank component
+      /* istanbul ignore else */
+      if (process.env.NODE_ENV !== 'production') {
+        if (vm.$options.renderError) {
+          try {
+            vnode = vm.$options.renderError.call(vm._renderProxy, vm.$createElement, e);
+          } catch (e) {
+            handleError(e, vm, "renderError");
+            vnode = vm._vnode;
+          }
+        } else {
+          vnode = vm._vnode;
+        }
+      } else {
+        vnode = vm._vnode;
+      }
+    }
+    // return empty vnode in case the render function errored out
+    if (!(vnode instanceof VNode)) {
+      if (process.env.NODE_ENV !== 'production' && Array.isArray(vnode)) {
+        warn(
+          'Multiple root nodes returned from render function. Render function ' +
+          'should return a single root node.',
+          vm
+        );
+      }
+      vnode = createEmptyVNode();
+    }
+    // set parent
+    vnode.parent = _parentVnode;
+    return vnode
+  };
+}
+
+/*  */
+
+var uid = 0;
+
+function initMixin (Vue) {
+  Vue.prototype._init = function (options) {
+    var vm = this;
+    // a uid
+    vm._uid = uid++;
+
+    var startTag, endTag;
+    /* istanbul ignore if */
+    if (process.env.NODE_ENV !== 'production' && config.performance && mark) {
+      startTag = "vue-perf-start:" + (vm._uid);
+      endTag = "vue-perf-end:" + (vm._uid);
+      mark(startTag);
+    }
+
+    // a flag to avoid this being observed
+    vm._isVue = true;
+    // merge options
+    if (options && options._isComponent) {
+      // optimize internal component instantiation
+      // since dynamic options merging is pretty slow, and none of the
+      // internal component options needs special treatment.
+      initInternalComponent(vm, options);
+    } else {
+      vm.$options = mergeOptions(
+        resolveConstructorOptions(vm.constructor),
+        options || {},
+        vm
+      );
+    }
+    /* istanbul ignore else */
+    if (process.env.NODE_ENV !== 'production') {
+      initProxy(vm);
+    } else {
+      vm._renderProxy = vm;
+    }
+    // expose real self
+    vm._self = vm;
+    initLifecycle(vm);
+    initEvents(vm);
+    initRender(vm);
+    callHook(vm, 'beforeCreate');
+    initInjections(vm); // resolve injections before data/props
+    initState(vm);
+    initProvide(vm); // resolve provide after data/props
+    callHook(vm, 'created');
+
+    /* istanbul ignore if */
+    if (process.env.NODE_ENV !== 'production' && config.performance && mark) {
+      vm._name = formatComponentName(vm, false);
+      mark(endTag);
+      measure(("vue " + (vm._name) + " init"), startTag, endTag);
+    }
+
+    if (vm.$options.el) {
+      vm.$mount(vm.$options.el);
+    }
+  };
+}
+
+function initInternalComponent (vm, options) {
+  var opts = vm.$options = Object.create(vm.constructor.options);
+  // doing this because it's faster than dynamic enumeration.
+  var parentVnode = options._parentVnode;
+  opts.parent = options.parent;
+  opts._parentVnode = parentVnode;
+  opts._parentElm = options._parentElm;
+  opts._refElm = options._refElm;
+
+  var vnodeComponentOptions = parentVnode.componentOptions;
+  opts.propsData = vnodeComponentOptions.propsData;
+  opts._parentListeners = vnodeComponentOptions.listeners;
+  opts._renderChildren = vnodeComponentOptions.children;
+  opts._componentTag = vnodeComponentOptions.tag;
+
+  if (options.render) {
+    opts.render = options.render;
+    opts.staticRenderFns = options.staticRenderFns;
+  }
+}
+
+function resolveConstructorOptions (Ctor) {
+  var options = Ctor.options;
+  if (Ctor.super) {
+    var superOptions = resolveConstructorOptions(Ctor.super);
+    var cachedSuperOptions = Ctor.superOptions;
+    if (superOptions !== cachedSuperOptions) {
+      // super option changed,
+      // need to resolve new options.
+      Ctor.superOptions = superOptions;
+      // check if there are any late-modified/attached options (#4976)
+      var modifiedOptions = resolveModifiedOptions(Ctor);
+      // update base extend options
+      if (modifiedOptions) {
+        extend(Ctor.extendOptions, modifiedOptions);
+      }
+      options = Ctor.options = mergeOptions(superOptions, Ctor.extendOptions);
+      if (options.name) {
+        options.components[options.name] = Ctor;
+      }
+    }
+  }
+  return options
+}
+
+function resolveModifiedOptions (Ctor) {
+  var modified;
+  var latest = Ctor.options;
+  var extended = Ctor.extendOptions;
+  var sealed = Ctor.sealedOptions;
+  for (var key in latest) {
+    if (latest[key] !== sealed[key]) {
+      if (!modified) { modified = {}; }
+      modified[key] = dedupe(latest[key], extended[key], sealed[key]);
+    }
+  }
+  return modified
+}
+
+function dedupe (latest, extended, sealed) {
+  // compare latest and sealed to ensure lifecycle hooks won't be duplicated
+  // between merges
+  if (Array.isArray(latest)) {
+    var res = [];
+    sealed = Array.isArray(sealed) ? sealed : [sealed];
+    extended = Array.isArray(extended) ? extended : [extended];
+    for (var i = 0; i < latest.length; i++) {
+      // push original options and not sealed options to exclude duplicated options
+      if (extended.indexOf(latest[i]) >= 0 || sealed.indexOf(latest[i]) < 0) {
+        res.push(latest[i]);
+      }
+    }
+    return res
+  } else {
+    return latest
+  }
+}
+
+function Vue$3 (options) {
+  if (process.env.NODE_ENV !== 'production' &&
+    !(this instanceof Vue$3)
+  ) {
+    warn('Vue is a constructor and should be called with the `new` keyword');
+  }
+  this._init(options);
+}
+
+initMixin(Vue$3);
+stateMixin(Vue$3);
+eventsMixin(Vue$3);
+lifecycleMixin(Vue$3);
+renderMixin(Vue$3);
+
+/*  */
+
+function initUse (Vue) {
+  Vue.use = function (plugin) {
+    var installedPlugins = (this._installedPlugins || (this._installedPlugins = []));
+    if (installedPlugins.indexOf(plugin) > -1) {
+      return this
+    }
+
+    // additional parameters
+    var args = toArray(arguments, 1);
+    args.unshift(this);
+    if (typeof plugin.install === 'function') {
+      plugin.install.apply(plugin, args);
+    } else if (typeof plugin === 'function') {
+      plugin.apply(null, args);
+    }
+    installedPlugins.push(plugin);
+    return this
+  };
+}
+
+/*  */
+
+function initMixin$1 (Vue) {
+  Vue.mixin = function (mixin) {
+    this.options = mergeOptions(this.options, mixin);
+    return this
+  };
+}
+
+/*  */
+
+function initExtend (Vue) {
+  /**
+   * Each instance constructor, including Vue, has a unique
+   * cid. This enables us to create wrapped "child
+   * constructors" for prototypal inheritance and cache them.
+   */
+  Vue.cid = 0;
+  var cid = 1;
+
+  /**
+   * Class inheritance
+   */
+  Vue.extend = function (extendOptions) {
+    extendOptions = extendOptions || {};
+    var Super = this;
+    var SuperId = Super.cid;
+    var cachedCtors = extendOptions._Ctor || (extendOptions._Ctor = {});
+    if (cachedCtors[SuperId]) {
+      return cachedCtors[SuperId]
+    }
+
+    var name = extendOptions.name || Super.options.name;
+    if (process.env.NODE_ENV !== 'production' && name) {
+      validateComponentName(name);
+    }
+
+    var Sub = function VueComponent (options) {
+      this._init(options);
+    };
+    Sub.prototype = Object.create(Super.prototype);
+    Sub.prototype.constructor = Sub;
+    Sub.cid = cid++;
+    Sub.options = mergeOptions(
+      Super.options,
+      extendOptions
+    );
+    Sub['super'] = Super;
+
+    // For props and computed properties, we define the proxy getters on
+    // the Vue instances at extension time, on the extended prototype. This
+    // avoids Object.defineProperty calls for each instance created.
+    if (Sub.options.props) {
+      initProps$1(Sub);
+    }
+    if (Sub.options.computed) {
+      initComputed$1(Sub);
+    }
+
+    // allow further extension/mixin/plugin usage
+    Sub.extend = Super.extend;
+    Sub.mixin = Super.mixin;
+    Sub.use = Super.use;
+
+    // create asset registers, so extended classes
+    // can have their private assets too.
+    ASSET_TYPES.forEach(function (type) {
+      Sub[type] = Super[type];
+    });
+    // enable recursive self-lookup
+    if (name) {
+      Sub.options.components[name] = Sub;
+    }
+
+    // keep a reference to the super options at extension time.
+    // later at instantiation we can check if Super's options have
+    // been updated.
+    Sub.superOptions = Super.options;
+    Sub.extendOptions = extendOptions;
+    Sub.sealedOptions = extend({}, Sub.options);
+
+    // cache constructor
+    cachedCtors[SuperId] = Sub;
+    return Sub
+  };
+}
+
+function initProps$1 (Comp) {
+  var props = Comp.options.props;
+  for (var key in props) {
+    proxy(Comp.prototype, "_props", key);
+  }
+}
+
+function initComputed$1 (Comp) {
+  var computed = Comp.options.computed;
+  for (var key in computed) {
+    defineComputed(Comp.prototype, key, computed[key]);
+  }
+}
+
+/*  */
+
+function initAssetRegisters (Vue) {
+  /**
+   * Create asset registration methods.
+   */
+  ASSET_TYPES.forEach(function (type) {
+    Vue[type] = function (
+      id,
+      definition
+    ) {
+      if (!definition) {
+        return this.options[type + 's'][id]
+      } else {
+        /* istanbul ignore if */
+        if (process.env.NODE_ENV !== 'production' && type === 'component') {
+          validateComponentName(id);
+        }
+        if (type === 'component' && isPlainObject(definition)) {
+          definition.name = definition.name || id;
+          definition = this.options._base.extend(definition);
+        }
+        if (type === 'directive' && typeof definition === 'function') {
+          definition = { bind: definition, update: definition };
+        }
+        this.options[type + 's'][id] = definition;
+        return definition
+      }
+    };
+  });
+}
+
+/*  */
+
+function getComponentName (opts) {
+  return opts && (opts.Ctor.options.name || opts.tag)
+}
+
+function matches (pattern, name) {
+  if (Array.isArray(pattern)) {
+    return pattern.indexOf(name) > -1
+  } else if (typeof pattern === 'string') {
+    return pattern.split(',').indexOf(name) > -1
+  } else if (isRegExp(pattern)) {
+    return pattern.test(name)
+  }
+  /* istanbul ignore next */
+  return false
+}
+
+function pruneCache (keepAliveInstance, filter) {
+  var cache = keepAliveInstance.cache;
+  var keys = keepAliveInstance.keys;
+  var _vnode = keepAliveInstance._vnode;
+  for (var key in cache) {
+    var cachedNode = cache[key];
+    if (cachedNode) {
+      var name = getComponentName(cachedNode.componentOptions);
+      if (name && !filter(name)) {
+        pruneCacheEntry(cache, key, keys, _vnode);
+      }
+    }
+  }
+}
+
+function pruneCacheEntry (
+  cache,
+  key,
+  keys,
+  current
+) {
+  var cached$$1 = cache[key];
+  if (cached$$1 && (!current || cached$$1.tag !== current.tag)) {
+    cached$$1.componentInstance.$destroy();
+  }
+  cache[key] = null;
+  remove(keys, key);
+}
+
+var patternTypes = [String, RegExp, Array];
+
+var KeepAlive = {
+  name: 'keep-alive',
+  abstract: true,
+
+  props: {
+    include: patternTypes,
+    exclude: patternTypes,
+    max: [String, Number]
+  },
+
+  created: function created () {
+    this.cache = Object.create(null);
+    this.keys = [];
+  },
+
+  destroyed: function destroyed () {
+    var this$1 = this;
+
+    for (var key in this$1.cache) {
+      pruneCacheEntry(this$1.cache, key, this$1.keys);
+    }
+  },
+
+  watch: {
+    include: function include (val) {
+      pruneCache(this, function (name) { return matches(val, name); });
+    },
+    exclude: function exclude (val) {
+      pruneCache(this, function (name) { return !matches(val, name); });
+    }
+  },
+
+  render: function render () {
+    var slot = this.$slots.default;
+    var vnode = getFirstComponentChild(slot);
+    var componentOptions = vnode && vnode.componentOptions;
+    if (componentOptions) {
+      // check pattern
+      var name = getComponentName(componentOptions);
+      var ref = this;
+      var include = ref.include;
+      var exclude = ref.exclude;
+      if (
+        // not included
+        (include && (!name || !matches(include, name))) ||
+        // excluded
+        (exclude && name && matches(exclude, name))
+      ) {
+        return vnode
+      }
+
+      var ref$1 = this;
+      var cache = ref$1.cache;
+      var keys = ref$1.keys;
+      var key = vnode.key == null
+        // same constructor may get registered as different local components
+        // so cid alone is not enough (#3269)
+        ? componentOptions.Ctor.cid + (componentOptions.tag ? ("::" + (componentOptions.tag)) : '')
+        : vnode.key;
+      if (cache[key]) {
+        vnode.componentInstance = cache[key].componentInstance;
+        // make current key freshest
+        remove(keys, key);
+        keys.push(key);
+      } else {
+        cache[key] = vnode;
+        keys.push(key);
+        // prune oldest entry
+        if (this.max && keys.length > parseInt(this.max)) {
+          pruneCacheEntry(cache, keys[0], keys, this._vnode);
+        }
+      }
+
+      vnode.data.keepAlive = true;
+    }
+    return vnode || (slot && slot[0])
+  }
+};
+
+var builtInComponents = {
+  KeepAlive: KeepAlive
+};
+
+/*  */
+
+function initGlobalAPI (Vue) {
+  // config
+  var configDef = {};
+  configDef.get = function () { return config; };
+  if (process.env.NODE_ENV !== 'production') {
+    configDef.set = function () {
+      warn(
+        'Do not replace the Vue.config object, set individual fields instead.'
+      );
+    };
+  }
+  Object.defineProperty(Vue, 'config', configDef);
+
+  // exposed util methods.
+  // NOTE: these are not considered part of the public API - avoid relying on
+  // them unless you are aware of the risk.
+  Vue.util = {
+    warn: warn,
+    extend: extend,
+    mergeOptions: mergeOptions,
+    defineReactive: defineReactive
+  };
+
+  Vue.set = set;
+  Vue.delete = del;
+  Vue.nextTick = nextTick;
+
+  Vue.options = Object.create(null);
+  ASSET_TYPES.forEach(function (type) {
+    Vue.options[type + 's'] = Object.create(null);
+  });
+
+  // this is used to identify the "base" constructor to extend all plain-object
+  // components with in Weex's multi-instance scenarios.
+  Vue.options._base = Vue;
+
+  extend(Vue.options.components, builtInComponents);
+
+  initUse(Vue);
+  initMixin$1(Vue);
+  initExtend(Vue);
+  initAssetRegisters(Vue);
+}
+
+initGlobalAPI(Vue$3);
+
+Object.defineProperty(Vue$3.prototype, '$isServer', {
+  get: isServerRendering
+});
+
+Object.defineProperty(Vue$3.prototype, '$ssrContext', {
+  get: function get () {
+    /* istanbul ignore next */
+    return this.$vnode && this.$vnode.ssrContext
+  }
+});
+
+Vue$3.version = '2.5.13';
+
+/*  */
+
+// these are reserved for web because they are directly compiled away
+// during template compilation
+var isReservedAttr = makeMap('style,class');
+
+// attributes that should be using props for binding
+var acceptValue = makeMap('input,textarea,option,select,progress');
+var mustUseProp = function (tag, type, attr) {
+  return (
+    (attr === 'value' && acceptValue(tag)) && type !== 'button' ||
+    (attr === 'selected' && tag === 'option') ||
+    (attr === 'checked' && tag === 'input') ||
+    (attr === 'muted' && tag === 'video')
+  )
+};
+
+var isEnumeratedAttr = makeMap('contenteditable,draggable,spellcheck');
+
+var isBooleanAttr = makeMap(
+  'allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,' +
+  'default,defaultchecked,defaultmuted,defaultselected,defer,disabled,' +
+  'enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,' +
+  'muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,' +
+  'required,reversed,scoped,seamless,selected,sortable,translate,' +
+  'truespeed,typemustmatch,visible'
+);
+
+var xlinkNS = 'http://www.w3.org/1999/xlink';
+
+var isXlink = function (name) {
+  return name.charAt(5) === ':' && name.slice(0, 5) === 'xlink'
+};
+
+var getXlinkProp = function (name) {
+  return isXlink(name) ? name.slice(6, name.length) : ''
+};
+
+var isFalsyAttrValue = function (val) {
+  return val == null || val === false
+};
+
+/*  */
+
+function genClassForVnode (vnode) {
+  var data = vnode.data;
+  var parentNode = vnode;
+  var childNode = vnode;
+  while (isDef(childNode.componentInstance)) {
+    childNode = childNode.componentInstance._vnode;
+    if (childNode && childNode.data) {
+      data = mergeClassData(childNode.data, data);
+    }
+  }
+  while (isDef(parentNode = parentNode.parent)) {
+    if (parentNode && parentNode.data) {
+      data = mergeClassData(data, parentNode.data);
+    }
+  }
+  return renderClass(data.staticClass, data.class)
+}
+
+function mergeClassData (child, parent) {
+  return {
+    staticClass: concat(child.staticClass, parent.staticClass),
+    class: isDef(child.class)
+      ? [child.class, parent.class]
+      : parent.class
+  }
+}
+
+function renderClass (
+  staticClass,
+  dynamicClass
+) {
+  if (isDef(staticClass) || isDef(dynamicClass)) {
+    return concat(staticClass, stringifyClass(dynamicClass))
+  }
+  /* istanbul ignore next */
+  return ''
+}
+
+function concat (a, b) {
+  return a ? b ? (a + ' ' + b) : a : (b || '')
+}
+
+function stringifyClass (value) {
+  if (Array.isArray(value)) {
+    return stringifyArray(value)
+  }
+  if (isObject(value)) {
+    return stringifyObject(value)
+  }
+  if (typeof value === 'string') {
+    return value
+  }
+  /* istanbul ignore next */
+  return ''
+}
+
+function stringifyArray (value) {
+  var res = '';
+  var stringified;
+  for (var i = 0, l = value.length; i < l; i++) {
+    if (isDef(stringified = stringifyClass(value[i])) && stringified !== '') {
+      if (res) { res += ' '; }
+      res += stringified;
+    }
+  }
+  return res
+}
+
+function stringifyObject (value) {
+  var res = '';
+  for (var key in value) {
+    if (value[key]) {
+      if (res) { res += ' '; }
+      res += key;
+    }
+  }
+  return res
+}
+
+/*  */
+
+var namespaceMap = {
+  svg: 'http://www.w3.org/2000/svg',
+  math: 'http://www.w3.org/1998/Math/MathML'
+};
+
+var isHTMLTag = makeMap(
+  'html,body,base,head,link,meta,style,title,' +
+  'address,article,aside,footer,header,h1,h2,h3,h4,h5,h6,hgroup,nav,section,' +
+  'div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,' +
+  'a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,rtc,ruby,' +
+  's,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,' +
+  'embed,object,param,source,canvas,script,noscript,del,ins,' +
+  'caption,col,colgroup,table,thead,tbody,td,th,tr,' +
+  'button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,' +
+  'output,progress,select,textarea,' +
+  'details,dialog,menu,menuitem,summary,' +
+  'content,element,shadow,template,blockquote,iframe,tfoot'
+);
+
+// this map is intentionally selective, only covering SVG elements that may
+// contain child elements.
+var isSVG = makeMap(
+  'svg,animate,circle,clippath,cursor,defs,desc,ellipse,filter,font-face,' +
+  'foreignObject,g,glyph,image,line,marker,mask,missing-glyph,path,pattern,' +
+  'polygon,polyline,rect,switch,symbol,text,textpath,tspan,use,view',
+  true
+);
+
+
+
+var isReservedTag = function (tag) {
+  return isHTMLTag(tag) || isSVG(tag)
+};
+
+function getTagNamespace (tag) {
+  if (isSVG(tag)) {
+    return 'svg'
+  }
+  // basic support for MathML
+  // note it doesn't support other MathML elements being component roots
+  if (tag === 'math') {
+    return 'math'
+  }
+}
+
+var unknownElementCache = Object.create(null);
+function isUnknownElement (tag) {
+  /* istanbul ignore if */
+  if (!inBrowser) {
+    return true
+  }
+  if (isReservedTag(tag)) {
+    return false
+  }
+  tag = tag.toLowerCase();
+  /* istanbul ignore if */
+  if (unknownElementCache[tag] != null) {
+    return unknownElementCache[tag]
+  }
+  var el = document.createElement(tag);
+  if (tag.indexOf('-') > -1) {
+    // http://stackoverflow.com/a/28210364/1070244
+    return (unknownElementCache[tag] = (
+      el.constructor === window.HTMLUnknownElement ||
+      el.constructor === window.HTMLElement
+    ))
+  } else {
+    return (unknownElementCache[tag] = /HTMLUnknownElement/.test(el.toString()))
+  }
+}
+
+var isTextInputType = makeMap('text,number,password,search,email,tel,url');
+
+/*  */
+
+/**
+ * Query an element selector if it's not an element already.
+ */
+function query (el) {
+  if (typeof el === 'string') {
+    var selected = document.querySelector(el);
+    if (!selected) {
+      process.env.NODE_ENV !== 'production' && warn(
+        'Cannot find element: ' + el
+      );
+      return document.createElement('div')
+    }
+    return selected
+  } else {
+    return el
+  }
+}
+
+/*  */
+
+function createElement$1 (tagName, vnode) {
+  var elm = document.createElement(tagName);
+  if (tagName !== 'select') {
+    return elm
+  }
+  // false or null will remove the attribute but undefined will not
+  if (vnode.data && vnode.data.attrs && vnode.data.attrs.multiple !== undefined) {
+    elm.setAttribute('multiple', 'multiple');
+  }
+  return elm
+}
+
+function createElementNS (namespace, tagName) {
+  return document.createElementNS(namespaceMap[namespace], tagName)
+}
+
+function createTextNode (text) {
+  return document.createTextNode(text)
+}
+
+function createComment (text) {
+  return document.createComment(text)
+}
+
+function insertBefore (parentNode, newNode, referenceNode) {
+  parentNode.insertBefore(newNode, referenceNode);
+}
+
+function removeChild (node, child) {
+  node.removeChild(child);
+}
+
+function appendChild (node, child) {
+  node.appendChild(child);
+}
+
+function parentNode (node) {
+  return node.parentNode
+}
+
+function nextSibling (node) {
+  return node.nextSibling
+}
+
+function tagName (node) {
+  return node.tagName
+}
+
+function setTextContent (node, text) {
+  node.textContent = text;
+}
+
+function setAttribute (node, key, val) {
+  node.setAttribute(key, val);
+}
+
+
+var nodeOps = Object.freeze({
+       createElement: createElement$1,
+       createElementNS: createElementNS,
+       createTextNode: createTextNode,
+       createComment: createComment,
+       insertBefore: insertBefore,
+       removeChild: removeChild,
+       appendChild: appendChild,
+       parentNode: parentNode,
+       nextSibling: nextSibling,
+       tagName: tagName,
+       setTextContent: setTextContent,
+       setAttribute: setAttribute
+});
+
+/*  */
+
+var ref = {
+  create: function create (_, vnode) {
+    registerRef(vnode);
+  },
+  update: function update (oldVnode, vnode) {
+    if (oldVnode.data.ref !== vnode.data.ref) {
+      registerRef(oldVnode, true);
+      registerRef(vnode);
+    }
+  },
+  destroy: function destroy (vnode) {
+    registerRef(vnode, true);
+  }
+};
+
+function registerRef (vnode, isRemoval) {
+  var key = vnode.data.ref;
+  if (!key) { return }
+
+  var vm = vnode.context;
+  var ref = vnode.componentInstance || vnode.elm;
+  var refs = vm.$refs;
+  if (isRemoval) {
+    if (Array.isArray(refs[key])) {
+      remove(refs[key], ref);
+    } else if (refs[key] === ref) {
+      refs[key] = undefined;
+    }
+  } else {
+    if (vnode.data.refInFor) {
+      if (!Array.isArray(refs[key])) {
+        refs[key] = [ref];
+      } else if (refs[key].indexOf(ref) < 0) {
+        // $flow-disable-line
+        refs[key].push(ref);
+      }
+    } else {
+      refs[key] = ref;
+    }
+  }
+}
+
+/**
+ * Virtual DOM patching algorithm based on Snabbdom by
+ * Simon Friis Vindum (@paldepind)
+ * Licensed under the MIT License
+ * https://github.com/paldepind/snabbdom/blob/master/LICENSE
+ *
+ * modified by Evan You (@yyx990803)
+ *
+ * Not type-checking this because this file is perf-critical and the cost
+ * of making flow understand it is not worth it.
+ */
+
+var emptyNode = new VNode('', {}, []);
+
+var hooks = ['create', 'activate', 'update', 'remove', 'destroy'];
+
+function sameVnode (a, b) {
+  return (
+    a.key === b.key && (
+      (
+        a.tag === b.tag &&
+        a.isComment === b.isComment &&
+        isDef(a.data) === isDef(b.data) &&
+        sameInputType(a, b)
+      ) || (
+        isTrue(a.isAsyncPlaceholder) &&
+        a.asyncFactory === b.asyncFactory &&
+        isUndef(b.asyncFactory.error)
+      )
+    )
+  )
+}
+
+function sameInputType (a, b) {
+  if (a.tag !== 'input') { return true }
+  var i;
+  var typeA = isDef(i = a.data) && isDef(i = i.attrs) && i.type;
+  var typeB = isDef(i = b.data) && isDef(i = i.attrs) && i.type;
+  return typeA === typeB || isTextInputType(typeA) && isTextInputType(typeB)
+}
+
+function createKeyToOldIdx (children, beginIdx, endIdx) {
+  var i, key;
+  var map = {};
+  for (i = beginIdx; i <= endIdx; ++i) {
+    key = children[i].key;
+    if (isDef(key)) { map[key] = i; }
+  }
+  return map
+}
+
+function createPatchFunction (backend) {
+  var i, j;
+  var cbs = {};
+
+  var modules = backend.modules;
+  var nodeOps = backend.nodeOps;
+
+  for (i = 0; i < hooks.length; ++i) {
+    cbs[hooks[i]] = [];
+    for (j = 0; j < modules.length; ++j) {
+      if (isDef(modules[j][hooks[i]])) {
+        cbs[hooks[i]].push(modules[j][hooks[i]]);
+      }
+    }
+  }
+
+  function emptyNodeAt (elm) {
+    return new VNode(nodeOps.tagName(elm).toLowerCase(), {}, [], undefined, elm)
+  }
+
+  function createRmCb (childElm, listeners) {
+    function remove () {
+      if (--remove.listeners === 0) {
+        removeNode(childElm);
+      }
+    }
+    remove.listeners = listeners;
+    return remove
+  }
+
+  function removeNode (el) {
+    var parent = nodeOps.parentNode(el);
+    // element may have already been removed due to v-html / v-text
+    if (isDef(parent)) {
+      nodeOps.removeChild(parent, el);
+    }
+  }
+
+  function isUnknownElement$$1 (vnode, inVPre) {
+    return (
+      !inVPre &&
+      !vnode.ns &&
+      !(
+        config.ignoredElements.length &&
+        config.ignoredElements.some(function (ignore) {
+          return isRegExp(ignore)
+            ? ignore.test(vnode.tag)
+            : ignore === vnode.tag
+        })
+      ) &&
+      config.isUnknownElement(vnode.tag)
+    )
+  }
+
+  var creatingElmInVPre = 0;
+  function createElm (vnode, insertedVnodeQueue, parentElm, refElm, nested) {
+    vnode.isRootInsert = !nested; // for transition enter check
+    if (createComponent(vnode, insertedVnodeQueue, parentElm, refElm)) {
+      return
+    }
+
+    var data = vnode.data;
+    var children = vnode.children;
+    var tag = vnode.tag;
+    if (isDef(tag)) {
+      if (process.env.NODE_ENV !== 'production') {
+        if (data && data.pre) {
+          creatingElmInVPre++;
+        }
+        if (isUnknownElement$$1(vnode, creatingElmInVPre)) {
+          warn(
+            'Unknown custom element: <' + tag + '> - did you ' +
+            'register the component correctly? For recursive components, ' +
+            'make sure to provide the "name" option.',
+            vnode.context
+          );
+        }
+      }
+      vnode.elm = vnode.ns
+        ? nodeOps.createElementNS(vnode.ns, tag)
+        : nodeOps.createElement(tag, vnode);
+      setScope(vnode);
+
+      /* istanbul ignore if */
+      {
+        createChildren(vnode, children, insertedVnodeQueue);
+        if (isDef(data)) {
+          invokeCreateHooks(vnode, insertedVnodeQueue);
+        }
+        insert(parentElm, vnode.elm, refElm);
+      }
+
+      if (process.env.NODE_ENV !== 'production' && data && data.pre) {
+        creatingElmInVPre--;
+      }
+    } else if (isTrue(vnode.isComment)) {
+      vnode.elm = nodeOps.createComment(vnode.text);
+      insert(parentElm, vnode.elm, refElm);
+    } else {
+      vnode.elm = nodeOps.createTextNode(vnode.text);
+      insert(parentElm, vnode.elm, refElm);
+    }
+  }
+
+  function createComponent (vnode, insertedVnodeQueue, parentElm, refElm) {
+    var i = vnode.data;
+    if (isDef(i)) {
+      var isReactivated = isDef(vnode.componentInstance) && i.keepAlive;
+      if (isDef(i = i.hook) && isDef(i = i.init)) {
+        i(vnode, false /* hydrating */, parentElm, refElm);
+      }
+      // after calling the init hook, if the vnode is a child component
+      // it should've created a child instance and mounted it. the child
+      // component also has set the placeholder vnode's elm.
+      // in that case we can just return the element and be done.
+      if (isDef(vnode.componentInstance)) {
+        initComponent(vnode, insertedVnodeQueue);
+        if (isTrue(isReactivated)) {
+          reactivateComponent(vnode, insertedVnodeQueue, parentElm, refElm);
+        }
+        return true
+      }
+    }
+  }
+
+  function initComponent (vnode, insertedVnodeQueue) {
+    if (isDef(vnode.data.pendingInsert)) {
+      insertedVnodeQueue.push.apply(insertedVnodeQueue, vnode.data.pendingInsert);
+      vnode.data.pendingInsert = null;
+    }
+    vnode.elm = vnode.componentInstance.$el;
+    if (isPatchable(vnode)) {
+      invokeCreateHooks(vnode, insertedVnodeQueue);
+      setScope(vnode);
+    } else {
+      // empty component root.
+      // skip all element-related modules except for ref (#3455)
+      registerRef(vnode);
+      // make sure to invoke the insert hook
+      insertedVnodeQueue.push(vnode);
+    }
+  }
+
+  function reactivateComponent (vnode, insertedVnodeQueue, parentElm, refElm) {
+    var i;
+    // hack for #4339: a reactivated component with inner transition
+    // does not trigger because the inner node's created hooks are not called
+    // again. It's not ideal to involve module-specific logic in here but
+    // there doesn't seem to be a better way to do it.
+    var innerNode = vnode;
+    while (innerNode.componentInstance) {
+      innerNode = innerNode.componentInstance._vnode;
+      if (isDef(i = innerNode.data) && isDef(i = i.transition)) {
+        for (i = 0; i < cbs.activate.length; ++i) {
+          cbs.activate[i](emptyNode, innerNode);
+        }
+        insertedVnodeQueue.push(innerNode);
+        break
+      }
+    }
+    // unlike a newly created component,
+    // a reactivated keep-alive component doesn't insert itself
+    insert(parentElm, vnode.elm, refElm);
+  }
+
+  function insert (parent, elm, ref$$1) {
+    if (isDef(parent)) {
+      if (isDef(ref$$1)) {
+        if (ref$$1.parentNode === parent) {
+          nodeOps.insertBefore(parent, elm, ref$$1);
+        }
+      } else {
+        nodeOps.appendChild(parent, elm);
+      }
+    }
+  }
+
+  function createChildren (vnode, children, insertedVnodeQueue) {
+    if (Array.isArray(children)) {
+      if (process.env.NODE_ENV !== 'production') {
+        checkDuplicateKeys(children);
+      }
+      for (var i = 0; i < children.length; ++i) {
+        createElm(children[i], insertedVnodeQueue, vnode.elm, null, true);
+      }
+    } else if (isPrimitive(vnode.text)) {
+      nodeOps.appendChild(vnode.elm, nodeOps.createTextNode(String(vnode.text)));
+    }
+  }
+
+  function isPatchable (vnode) {
+    while (vnode.componentInstance) {
+      vnode = vnode.componentInstance._vnode;
+    }
+    return isDef(vnode.tag)
+  }
+
+  function invokeCreateHooks (vnode, insertedVnodeQueue) {
+    for (var i$1 = 0; i$1 < cbs.create.length; ++i$1) {
+      cbs.create[i$1](emptyNode, vnode);
+    }
+    i = vnode.data.hook; // Reuse variable
+    if (isDef(i)) {
+      if (isDef(i.create)) { i.create(emptyNode, vnode); }
+      if (isDef(i.insert)) { insertedVnodeQueue.push(vnode); }
+    }
+  }
+
+  // set scope id attribute for scoped CSS.
+  // this is implemented as a special case to avoid the overhead
+  // of going through the normal attribute patching process.
+  function setScope (vnode) {
+    var i;
+    if (isDef(i = vnode.fnScopeId)) {
+      nodeOps.setAttribute(vnode.elm, i, '');
+    } else {
+      var ancestor = vnode;
+      while (ancestor) {
+        if (isDef(i = ancestor.context) && isDef(i = i.$options._scopeId)) {
+          nodeOps.setAttribute(vnode.elm, i, '');
+        }
+        ancestor = ancestor.parent;
+      }
+    }
+    // for slot content they should also get the scopeId from the host instance.
+    if (isDef(i = activeInstance) &&
+      i !== vnode.context &&
+      i !== vnode.fnContext &&
+      isDef(i = i.$options._scopeId)
+    ) {
+      nodeOps.setAttribute(vnode.elm, i, '');
+    }
+  }
+
+  function addVnodes (parentElm, refElm, vnodes, startIdx, endIdx, insertedVnodeQueue) {
+    for (; startIdx <= endIdx; ++startIdx) {
+      createElm(vnodes[startIdx], insertedVnodeQueue, parentElm, refElm);
+    }
+  }
+
+  function invokeDestroyHook (vnode) {
+    var i, j;
+    var data = vnode.data;
+    if (isDef(data)) {
+      if (isDef(i = data.hook) && isDef(i = i.destroy)) { i(vnode); }
+      for (i = 0; i < cbs.destroy.length; ++i) { cbs.destroy[i](vnode); }
+    }
+    if (isDef(i = vnode.children)) {
+      for (j = 0; j < vnode.children.length; ++j) {
+        invokeDestroyHook(vnode.children[j]);
+      }
+    }
+  }
+
+  function removeVnodes (parentElm, vnodes, startIdx, endIdx) {
+    for (; startIdx <= endIdx; ++startIdx) {
+      var ch = vnodes[startIdx];
+      if (isDef(ch)) {
+        if (isDef(ch.tag)) {
+          removeAndInvokeRemoveHook(ch);
+          invokeDestroyHook(ch);
+        } else { // Text node
+          removeNode(ch.elm);
+        }
+      }
+    }
+  }
+
+  function removeAndInvokeRemoveHook (vnode, rm) {
+    if (isDef(rm) || isDef(vnode.data)) {
+      var i;
+      var listeners = cbs.remove.length + 1;
+      if (isDef(rm)) {
+        // we have a recursively passed down rm callback
+        // increase the listeners count
+        rm.listeners += listeners;
+      } else {
+        // directly removing
+        rm = createRmCb(vnode.elm, listeners);
+      }
+      // recursively invoke hooks on child component root node
+      if (isDef(i = vnode.componentInstance) && isDef(i = i._vnode) && isDef(i.data)) {
+        removeAndInvokeRemoveHook(i, rm);
+      }
+      for (i = 0; i < cbs.remove.length; ++i) {
+        cbs.remove[i](vnode, rm);
+      }
+      if (isDef(i = vnode.data.hook) && isDef(i = i.remove)) {
+        i(vnode, rm);
+      } else {
+        rm();
+      }
+    } else {
+      removeNode(vnode.elm);
+    }
+  }
+
+  function updateChildren (parentElm, oldCh, newCh, insertedVnodeQueue, removeOnly) {
+    var oldStartIdx = 0;
+    var newStartIdx = 0;
+    var oldEndIdx = oldCh.length - 1;
+    var oldStartVnode = oldCh[0];
+    var oldEndVnode = oldCh[oldEndIdx];
+    var newEndIdx = newCh.length - 1;
+    var newStartVnode = newCh[0];
+    var newEndVnode = newCh[newEndIdx];
+    var oldKeyToIdx, idxInOld, vnodeToMove, refElm;
+
+    // removeOnly is a special flag used only by <transition-group>
+    // to ensure removed elements stay in correct relative positions
+    // during leaving transitions
+    var canMove = !removeOnly;
+
+    if (process.env.NODE_ENV !== 'production') {
+      checkDuplicateKeys(newCh);
+    }
+
+    while (oldStartIdx <= oldEndIdx && newStartIdx <= newEndIdx) {
+      if (isUndef(oldStartVnode)) {
+        oldStartVnode = oldCh[++oldStartIdx]; // Vnode has been moved left
+      } else if (isUndef(oldEndVnode)) {
+        oldEndVnode = oldCh[--oldEndIdx];
+      } else if (sameVnode(oldStartVnode, newStartVnode)) {
+        patchVnode(oldStartVnode, newStartVnode, insertedVnodeQueue);
+        oldStartVnode = oldCh[++oldStartIdx];
+        newStartVnode = newCh[++newStartIdx];
+      } else if (sameVnode(oldEndVnode, newEndVnode)) {
+        patchVnode(oldEndVnode, newEndVnode, insertedVnodeQueue);
+        oldEndVnode = oldCh[--oldEndIdx];
+        newEndVnode = newCh[--newEndIdx];
+      } else if (sameVnode(oldStartVnode, newEndVnode)) { // Vnode moved right
+        patchVnode(oldStartVnode, newEndVnode, insertedVnodeQueue);
+        canMove && nodeOps.insertBefore(parentElm, oldStartVnode.elm, nodeOps.nextSibling(oldEndVnode.elm));
+        oldStartVnode = oldCh[++oldStartIdx];
+        newEndVnode = newCh[--newEndIdx];
+      } else if (sameVnode(oldEndVnode, newStartVnode)) { // Vnode moved left
+        patchVnode(oldEndVnode, newStartVnode, insertedVnodeQueue);
+        canMove && nodeOps.insertBefore(parentElm, oldEndVnode.elm, oldStartVnode.elm);
+        oldEndVnode = oldCh[--oldEndIdx];
+        newStartVnode = newCh[++newStartIdx];
+      } else {
+        if (isUndef(oldKeyToIdx)) { oldKeyToIdx = createKeyToOldIdx(oldCh, oldStartIdx, oldEndIdx); }
+        idxInOld = isDef(newStartVnode.key)
+          ? oldKeyToIdx[newStartVnode.key]
+          : findIdxInOld(newStartVnode, oldCh, oldStartIdx, oldEndIdx);
+        if (isUndef(idxInOld)) { // New element
+          createElm(newStartVnode, insertedVnodeQueue, parentElm, oldStartVnode.elm);
+        } else {
+          vnodeToMove = oldCh[idxInOld];
+          if (sameVnode(vnodeToMove, newStartVnode)) {
+            patchVnode(vnodeToMove, newStartVnode, insertedVnodeQueue);
+            oldCh[idxInOld] = undefined;
+            canMove && nodeOps.insertBefore(parentElm, vnodeToMove.elm, oldStartVnode.elm);
+          } else {
+            // same key but different element. treat as new element
+            createElm(newStartVnode, insertedVnodeQueue, parentElm, oldStartVnode.elm);
+          }
+        }
+        newStartVnode = newCh[++newStartIdx];
+      }
+    }
+    if (oldStartIdx > oldEndIdx) {
+      refElm = isUndef(newCh[newEndIdx + 1]) ? null : newCh[newEndIdx + 1].elm;
+      addVnodes(parentElm, refElm, newCh, newStartIdx, newEndIdx, insertedVnodeQueue);
+    } else if (newStartIdx > newEndIdx) {
+      removeVnodes(parentElm, oldCh, oldStartIdx, oldEndIdx);
+    }
+  }
+
+  function checkDuplicateKeys (children) {
+    var seenKeys = {};
+    for (var i = 0; i < children.length; i++) {
+      var vnode = children[i];
+      var key = vnode.key;
+      if (isDef(key)) {
+        if (seenKeys[key]) {
+          warn(
+            ("Duplicate keys detected: '" + key + "'. This may cause an update error."),
+            vnode.context
+          );
+        } else {
+          seenKeys[key] = true;
+        }
+      }
+    }
+  }
+
+  function findIdxInOld (node, oldCh, start, end) {
+    for (var i = start; i < end; i++) {
+      var c = oldCh[i];
+      if (isDef(c) && sameVnode(node, c)) { return i }
+    }
+  }
+
+  function patchVnode (oldVnode, vnode, insertedVnodeQueue, removeOnly) {
+    if (oldVnode === vnode) {
+      return
+    }
+
+    var elm = vnode.elm = oldVnode.elm;
+
+    if (isTrue(oldVnode.isAsyncPlaceholder)) {
+      if (isDef(vnode.asyncFactory.resolved)) {
+        hydrate(oldVnode.elm, vnode, insertedVnodeQueue);
+      } else {
+        vnode.isAsyncPlaceholder = true;
+      }
+      return
+    }
+
+    // reuse element for static trees.
+    // note we only do this if the vnode is cloned -
+    // if the new node is not cloned it means the render functions have been
+    // reset by the hot-reload-api and we need to do a proper re-render.
+    if (isTrue(vnode.isStatic) &&
+      isTrue(oldVnode.isStatic) &&
+      vnode.key === oldVnode.key &&
+      (isTrue(vnode.isCloned) || isTrue(vnode.isOnce))
+    ) {
+      vnode.componentInstance = oldVnode.componentInstance;
+      return
+    }
+
+    var i;
+    var data = vnode.data;
+    if (isDef(data) && isDef(i = data.hook) && isDef(i = i.prepatch)) {
+      i(oldVnode, vnode);
+    }
+
+    var oldCh = oldVnode.children;
+    var ch = vnode.children;
+    if (isDef(data) && isPatchable(vnode)) {
+      for (i = 0; i < cbs.update.length; ++i) { cbs.update[i](oldVnode, vnode); }
+      if (isDef(i = data.hook) && isDef(i = i.update)) { i(oldVnode, vnode); }
+    }
+    if (isUndef(vnode.text)) {
+      if (isDef(oldCh) && isDef(ch)) {
+        if (oldCh !== ch) { updateChildren(elm, oldCh, ch, insertedVnodeQueue, removeOnly); }
+      } else if (isDef(ch)) {
+        if (isDef(oldVnode.text)) { nodeOps.setTextContent(elm, ''); }
+        addVnodes(elm, null, ch, 0, ch.length - 1, insertedVnodeQueue);
+      } else if (isDef(oldCh)) {
+        removeVnodes(elm, oldCh, 0, oldCh.length - 1);
+      } else if (isDef(oldVnode.text)) {
+        nodeOps.setTextContent(elm, '');
+      }
+    } else if (oldVnode.text !== vnode.text) {
+      nodeOps.setTextContent(elm, vnode.text);
+    }
+    if (isDef(data)) {
+      if (isDef(i = data.hook) && isDef(i = i.postpatch)) { i(oldVnode, vnode); }
+    }
+  }
+
+  function invokeInsertHook (vnode, queue, initial) {
+    // delay insert hooks for component root nodes, invoke them after the
+    // element is really inserted
+    if (isTrue(initial) && isDef(vnode.parent)) {
+      vnode.parent.data.pendingInsert = queue;
+    } else {
+      for (var i = 0; i < queue.length; ++i) {
+        queue[i].data.hook.insert(queue[i]);
+      }
+    }
+  }
+
+  var hydrationBailed = false;
+  // list of modules that can skip create hook during hydration because they
+  // are already rendered on the client or has no need for initialization
+  // Note: style is excluded because it relies on initial clone for future
+  // deep updates (#7063).
+  var isRenderedModule = makeMap('attrs,class,staticClass,staticStyle,key');
+
+  // Note: this is a browser-only function so we can assume elms are DOM nodes.
+  function hydrate (elm, vnode, insertedVnodeQueue, inVPre) {
+    var i;
+    var tag = vnode.tag;
+    var data = vnode.data;
+    var children = vnode.children;
+    inVPre = inVPre || (data && data.pre);
+    vnode.elm = elm;
+
+    if (isTrue(vnode.isComment) && isDef(vnode.asyncFactory)) {
+      vnode.isAsyncPlaceholder = true;
+      return true
+    }
+    // assert node match
+    if (process.env.NODE_ENV !== 'production') {
+      if (!assertNodeMatch(elm, vnode, inVPre)) {
+        return false
+      }
+    }
+    if (isDef(data)) {
+      if (isDef(i = data.hook) && isDef(i = i.init)) { i(vnode, true /* hydrating */); }
+      if (isDef(i = vnode.componentInstance)) {
+        // child component. it should have hydrated its own tree.
+        initComponent(vnode, insertedVnodeQueue);
+        return true
+      }
+    }
+    if (isDef(tag)) {
+      if (isDef(children)) {
+        // empty element, allow client to pick up and populate children
+        if (!elm.hasChildNodes()) {
+          createChildren(vnode, children, insertedVnodeQueue);
+        } else {
+          // v-html and domProps: innerHTML
+          if (isDef(i = data) && isDef(i = i.domProps) && isDef(i = i.innerHTML)) {
+            if (i !== elm.innerHTML) {
+              /* istanbul ignore if */
+              if (process.env.NODE_ENV !== 'production' &&
+                typeof console !== 'undefined' &&
+                !hydrationBailed
+              ) {
+                hydrationBailed = true;
+                console.warn('Parent: ', elm);
+                console.warn('server innerHTML: ', i);
+                console.warn('client innerHTML: ', elm.innerHTML);
+              }
+              return false
+            }
+          } else {
+            // iterate and compare children lists
+            var childrenMatch = true;
+            var childNode = elm.firstChild;
+            for (var i$1 = 0; i$1 < children.length; i$1++) {
+              if (!childNode || !hydrate(childNode, children[i$1], insertedVnodeQueue, inVPre)) {
+                childrenMatch = false;
+                break
+              }
+              childNode = childNode.nextSibling;
+            }
+            // if childNode is not null, it means the actual childNodes list is
+            // longer than the virtual children list.
+            if (!childrenMatch || childNode) {
+              /* istanbul ignore if */
+              if (process.env.NODE_ENV !== 'production' &&
+                typeof console !== 'undefined' &&
+                !hydrationBailed
+              ) {
+                hydrationBailed = true;
+                console.warn('Parent: ', elm);
+                console.warn('Mismatching childNodes vs. VNodes: ', elm.childNodes, children);
+              }
+              return false
+            }
+          }
+        }
+      }
+      if (isDef(data)) {
+        var fullInvoke = false;
+        for (var key in data) {
+          if (!isRenderedModule(key)) {
+            fullInvoke = true;
+            invokeCreateHooks(vnode, insertedVnodeQueue);
+            break
+          }
+        }
+        if (!fullInvoke && data['class']) {
+          // ensure collecting deps for deep class bindings for future updates
+          traverse(data['class']);
+        }
+      }
+    } else if (elm.data !== vnode.text) {
+      elm.data = vnode.text;
+    }
+    return true
+  }
+
+  function assertNodeMatch (node, vnode, inVPre) {
+    if (isDef(vnode.tag)) {
+      return vnode.tag.indexOf('vue-component') === 0 || (
+        !isUnknownElement$$1(vnode, inVPre) &&
+        vnode.tag.toLowerCase() === (node.tagName && node.tagName.toLowerCase())
+      )
+    } else {
+      return node.nodeType === (vnode.isComment ? 8 : 3)
+    }
+  }
+
+  return function patch (oldVnode, vnode, hydrating, removeOnly, parentElm, refElm) {
+    if (isUndef(vnode)) {
+      if (isDef(oldVnode)) { invokeDestroyHook(oldVnode); }
+      return
+    }
+
+    var isInitialPatch = false;
+    var insertedVnodeQueue = [];
+
+    if (isUndef(oldVnode)) {
+      // empty mount (likely as component), create new root element
+      isInitialPatch = true;
+      createElm(vnode, insertedVnodeQueue, parentElm, refElm);
+    } else {
+      var isRealElement = isDef(oldVnode.nodeType);
+      if (!isRealElement && sameVnode(oldVnode, vnode)) {
+        // patch existing root node
+        patchVnode(oldVnode, vnode, insertedVnodeQueue, removeOnly);
+      } else {
+        if (isRealElement) {
+          // mounting to a real element
+          // check if this is server-rendered content and if we can perform
+          // a successful hydration.
+          if (oldVnode.nodeType === 1 && oldVnode.hasAttribute(SSR_ATTR)) {
+            oldVnode.removeAttribute(SSR_ATTR);
+            hydrating = true;
+          }
+          if (isTrue(hydrating)) {
+            if (hydrate(oldVnode, vnode, insertedVnodeQueue)) {
+              invokeInsertHook(vnode, insertedVnodeQueue, true);
+              return oldVnode
+            } else if (process.env.NODE_ENV !== 'production') {
+              warn(
+                'The client-side rendered virtual DOM tree is not matching ' +
+                'server-rendered content. This is likely caused by incorrect ' +
+                'HTML markup, for example nesting block-level elements inside ' +
+                '<p>, or missing <tbody>. Bailing hydration and performing ' +
+                'full client-side render.'
+              );
+            }
+          }
+          // either not server-rendered, or hydration failed.
+          // create an empty node and replace it
+          oldVnode = emptyNodeAt(oldVnode);
+        }
+
+        // replacing existing element
+        var oldElm = oldVnode.elm;
+        var parentElm$1 = nodeOps.parentNode(oldElm);
+
+        // create new node
+        createElm(
+          vnode,
+          insertedVnodeQueue,
+          // extremely rare edge case: do not insert if old element is in a
+          // leaving transition. Only happens when combining transition +
+          // keep-alive + HOCs. (#4590)
+          oldElm._leaveCb ? null : parentElm$1,
+          nodeOps.nextSibling(oldElm)
+        );
+
+        // update parent placeholder node element, recursively
+        if (isDef(vnode.parent)) {
+          var ancestor = vnode.parent;
+          var patchable = isPatchable(vnode);
+          while (ancestor) {
+            for (var i = 0; i < cbs.destroy.length; ++i) {
+              cbs.destroy[i](ancestor);
+            }
+            ancestor.elm = vnode.elm;
+            if (patchable) {
+              for (var i$1 = 0; i$1 < cbs.create.length; ++i$1) {
+                cbs.create[i$1](emptyNode, ancestor);
+              }
+              // #6513
+              // invoke insert hooks that may have been merged by create hooks.
+              // e.g. for directives that uses the "inserted" hook.
+              var insert = ancestor.data.hook.insert;
+              if (insert.merged) {
+                // start at index 1 to avoid re-invoking component mounted hook
+                for (var i$2 = 1; i$2 < insert.fns.length; i$2++) {
+                  insert.fns[i$2]();
+                }
+              }
+            } else {
+              registerRef(ancestor);
+            }
+            ancestor = ancestor.parent;
+          }
+        }
+
+        // destroy old node
+        if (isDef(parentElm$1)) {
+          removeVnodes(parentElm$1, [oldVnode], 0, 0);
+        } else if (isDef(oldVnode.tag)) {
+          invokeDestroyHook(oldVnode);
+        }
+      }
+    }
+
+    invokeInsertHook(vnode, insertedVnodeQueue, isInitialPatch);
+    return vnode.elm
+  }
+}
+
+/*  */
+
+var directives = {
+  create: updateDirectives,
+  update: updateDirectives,
+  destroy: function unbindDirectives (vnode) {
+    updateDirectives(vnode, emptyNode);
+  }
+};
+
+function updateDirectives (oldVnode, vnode) {
+  if (oldVnode.data.directives || vnode.data.directives) {
+    _update(oldVnode, vnode);
+  }
+}
+
+function _update (oldVnode, vnode) {
+  var isCreate = oldVnode === emptyNode;
+  var isDestroy = vnode === emptyNode;
+  var oldDirs = normalizeDirectives$1(oldVnode.data.directives, oldVnode.context);
+  var newDirs = normalizeDirectives$1(vnode.data.directives, vnode.context);
+
+  var dirsWithInsert = [];
+  var dirsWithPostpatch = [];
+
+  var key, oldDir, dir;
+  for (key in newDirs) {
+    oldDir = oldDirs[key];
+    dir = newDirs[key];
+    if (!oldDir) {
+      // new directive, bind
+      callHook$1(dir, 'bind', vnode, oldVnode);
+      if (dir.def && dir.def.inserted) {
+        dirsWithInsert.push(dir);
+      }
+    } else {
+      // existing directive, update
+      dir.oldValue = oldDir.value;
+      callHook$1(dir, 'update', vnode, oldVnode);
+      if (dir.def && dir.def.componentUpdated) {
+        dirsWithPostpatch.push(dir);
+      }
+    }
+  }
+
+  if (dirsWithInsert.length) {
+    var callInsert = function () {
+      for (var i = 0; i < dirsWithInsert.length; i++) {
+        callHook$1(dirsWithInsert[i], 'inserted', vnode, oldVnode);
+      }
+    };
+    if (isCreate) {
+      mergeVNodeHook(vnode, 'insert', callInsert);
+    } else {
+      callInsert();
+    }
+  }
+
+  if (dirsWithPostpatch.length) {
+    mergeVNodeHook(vnode, 'postpatch', function () {
+      for (var i = 0; i < dirsWithPostpatch.length; i++) {
+        callHook$1(dirsWithPostpatch[i], 'componentUpdated', vnode, oldVnode);
+      }
+    });
+  }
+
+  if (!isCreate) {
+    for (key in oldDirs) {
+      if (!newDirs[key]) {
+        // no longer present, unbind
+        callHook$1(oldDirs[key], 'unbind', oldVnode, oldVnode, isDestroy);
+      }
+    }
+  }
+}
+
+var emptyModifiers = Object.create(null);
+
+function normalizeDirectives$1 (
+  dirs,
+  vm
+) {
+  var res = Object.create(null);
+  if (!dirs) {
+    // $flow-disable-line
+    return res
+  }
+  var i, dir;
+  for (i = 0; i < dirs.length; i++) {
+    dir = dirs[i];
+    if (!dir.modifiers) {
+      // $flow-disable-line
+      dir.modifiers = emptyModifiers;
+    }
+    res[getRawDirName(dir)] = dir;
+    dir.def = resolveAsset(vm.$options, 'directives', dir.name, true);
+  }
+  // $flow-disable-line
+  return res
+}
+
+function getRawDirName (dir) {
+  return dir.rawName || ((dir.name) + "." + (Object.keys(dir.modifiers || {}).join('.')))
+}
+
+function callHook$1 (dir, hook, vnode, oldVnode, isDestroy) {
+  var fn = dir.def && dir.def[hook];
+  if (fn) {
+    try {
+      fn(vnode.elm, dir, vnode, oldVnode, isDestroy);
+    } catch (e) {
+      handleError(e, vnode.context, ("directive " + (dir.name) + " " + hook + " hook"));
+    }
+  }
+}
+
+var baseModules = [
+  ref,
+  directives
+];
+
+/*  */
+
+function updateAttrs (oldVnode, vnode) {
+  var opts = vnode.componentOptions;
+  if (isDef(opts) && opts.Ctor.options.inheritAttrs === false) {
+    return
+  }
+  if (isUndef(oldVnode.data.attrs) && isUndef(vnode.data.attrs)) {
+    return
+  }
+  var key, cur, old;
+  var elm = vnode.elm;
+  var oldAttrs = oldVnode.data.attrs || {};
+  var attrs = vnode.data.attrs || {};
+  // clone observed objects, as the user probably wants to mutate it
+  if (isDef(attrs.__ob__)) {
+    attrs = vnode.data.attrs = extend({}, attrs);
+  }
+
+  for (key in attrs) {
+    cur = attrs[key];
+    old = oldAttrs[key];
+    if (old !== cur) {
+      setAttr(elm, key, cur);
+    }
+  }
+  // #4391: in IE9, setting type can reset value for input[type=radio]
+  // #6666: IE/Edge forces progress value down to 1 before setting a max
+  /* istanbul ignore if */
+  if ((isIE || isEdge) && attrs.value !== oldAttrs.value) {
+    setAttr(elm, 'value', attrs.value);
+  }
+  for (key in oldAttrs) {
+    if (isUndef(attrs[key])) {
+      if (isXlink(key)) {
+        elm.removeAttributeNS(xlinkNS, getXlinkProp(key));
+      } else if (!isEnumeratedAttr(key)) {
+        elm.removeAttribute(key);
+      }
+    }
+  }
+}
+
+function setAttr (el, key, value) {
+  if (isBooleanAttr(key)) {
+    // set attribute for blank value
+    // e.g. <option disabled>Select one</option>
+    if (isFalsyAttrValue(value)) {
+      el.removeAttribute(key);
+    } else {
+      // technically allowfullscreen is a boolean attribute for <iframe>,
+      // but Flash expects a value of "true" when used on <embed> tag
+      value = key === 'allowfullscreen' && el.tagName === 'EMBED'
+        ? 'true'
+        : key;
+      el.setAttribute(key, value);
+    }
+  } else if (isEnumeratedAttr(key)) {
+    el.setAttribute(key, isFalsyAttrValue(value) || value === 'false' ? 'false' : 'true');
+  } else if (isXlink(key)) {
+    if (isFalsyAttrValue(value)) {
+      el.removeAttributeNS(xlinkNS, getXlinkProp(key));
+    } else {
+      el.setAttributeNS(xlinkNS, key, value);
+    }
+  } else {
+    if (isFalsyAttrValue(value)) {
+      el.removeAttribute(key);
+    } else {
+      // #7138: IE10 & 11 fires input event when setting placeholder on
+      // <textarea>... block the first input event and remove the blocker
+      // immediately.
+      /* istanbul ignore if */
+      if (
+        isIE && !isIE9 &&
+        el.tagName === 'TEXTAREA' &&
+        key === 'placeholder' && !el.__ieph
+      ) {
+        var blocker = function (e) {
+          e.stopImmediatePropagation();
+          el.removeEventListener('input', blocker);
+        };
+        el.addEventListener('input', blocker);
+        // $flow-disable-line
+        el.__ieph = true; /* IE placeholder patched */
+      }
+      el.setAttribute(key, value);
+    }
+  }
+}
+
+var attrs = {
+  create: updateAttrs,
+  update: updateAttrs
+};
+
+/*  */
+
+function updateClass (oldVnode, vnode) {
+  var el = vnode.elm;
+  var data = vnode.data;
+  var oldData = oldVnode.data;
+  if (
+    isUndef(data.staticClass) &&
+    isUndef(data.class) && (
+      isUndef(oldData) || (
+        isUndef(oldData.staticClass) &&
+        isUndef(oldData.class)
+      )
+    )
+  ) {
+    return
+  }
+
+  var cls = genClassForVnode(vnode);
+
+  // handle transition classes
+  var transitionClass = el._transitionClasses;
+  if (isDef(transitionClass)) {
+    cls = concat(cls, stringifyClass(transitionClass));
+  }
+
+  // set the class
+  if (cls !== el._prevClass) {
+    el.setAttribute('class', cls);
+    el._prevClass = cls;
+  }
+}
+
+var klass = {
+  create: updateClass,
+  update: updateClass
+};
+
+/*  */
+
+/*  */
+
+
+
+
+
+
+
+
+
+// add a raw attr (use this in preTransforms)
+
+
+
+
+
+
+
+
+// note: this only removes the attr from the Array (attrsList) so that it
+// doesn't get processed by processAttrs.
+// By default it does NOT remove it from the map (attrsMap) because the map is
+// needed during codegen.
+
+/*  */
+
+/**
+ * Cross-platform code generation for component v-model
+ */
+
+
+/**
+ * Cross-platform codegen helper for generating v-model value assignment code.
+ */
+
+/*  */
+
+// in some cases, the event used has to be determined at runtime
+// so we used some reserved tokens during compile.
+var RANGE_TOKEN = '__r';
+var CHECKBOX_RADIO_TOKEN = '__c';
+
+/*  */
+
+// normalize v-model event tokens that can only be determined at runtime.
+// it's important to place the event as the first in the array because
+// the whole point is ensuring the v-model callback gets called before
+// user-attached handlers.
+function normalizeEvents (on) {
+  /* istanbul ignore if */
+  if (isDef(on[RANGE_TOKEN])) {
+    // IE input[type=range] only supports `change` event
+    var event = isIE ? 'change' : 'input';
+    on[event] = [].concat(on[RANGE_TOKEN], on[event] || []);
+    delete on[RANGE_TOKEN];
+  }
+  // This was originally intended to fix #4521 but no longer necessary
+  // after 2.5. Keeping it for backwards compat with generated code from < 2.4
+  /* istanbul ignore if */
+  if (isDef(on[CHECKBOX_RADIO_TOKEN])) {
+    on.change = [].concat(on[CHECKBOX_RADIO_TOKEN], on.change || []);
+    delete on[CHECKBOX_RADIO_TOKEN];
+  }
+}
+
+var target$1;
+
+function createOnceHandler (handler, event, capture) {
+  var _target = target$1; // save current target element in closure
+  return function onceHandler () {
+    var res = handler.apply(null, arguments);
+    if (res !== null) {
+      remove$2(event, onceHandler, capture, _target);
+    }
+  }
+}
+
+function add$1 (
+  event,
+  handler,
+  once$$1,
+  capture,
+  passive
+) {
+  handler = withMacroTask(handler);
+  if (once$$1) { handler = createOnceHandler(handler, event, capture); }
+  target$1.addEventListener(
+    event,
+    handler,
+    supportsPassive
+      ? { capture: capture, passive: passive }
+      : capture
+  );
+}
+
+function remove$2 (
+  event,
+  handler,
+  capture,
+  _target
+) {
+  (_target || target$1).removeEventListener(
+    event,
+    handler._withTask || handler,
+    capture
+  );
+}
+
+function updateDOMListeners (oldVnode, vnode) {
+  if (isUndef(oldVnode.data.on) && isUndef(vnode.data.on)) {
+    return
+  }
+  var on = vnode.data.on || {};
+  var oldOn = oldVnode.data.on || {};
+  target$1 = vnode.elm;
+  normalizeEvents(on);
+  updateListeners(on, oldOn, add$1, remove$2, vnode.context);
+  target$1 = undefined;
+}
+
+var events = {
+  create: updateDOMListeners,
+  update: updateDOMListeners
+};
+
+/*  */
+
+function updateDOMProps (oldVnode, vnode) {
+  if (isUndef(oldVnode.data.domProps) && isUndef(vnode.data.domProps)) {
+    return
+  }
+  var key, cur;
+  var elm = vnode.elm;
+  var oldProps = oldVnode.data.domProps || {};
+  var props = vnode.data.domProps || {};
+  // clone observed objects, as the user probably wants to mutate it
+  if (isDef(props.__ob__)) {
+    props = vnode.data.domProps = extend({}, props);
+  }
+
+  for (key in oldProps) {
+    if (isUndef(props[key])) {
+      elm[key] = '';
+    }
+  }
+  for (key in props) {
+    cur = props[key];
+    // ignore children if the node has textContent or innerHTML,
+    // as these will throw away existing DOM nodes and cause removal errors
+    // on subsequent patches (#3360)
+    if (key === 'textContent' || key === 'innerHTML') {
+      if (vnode.children) { vnode.children.length = 0; }
+      if (cur === oldProps[key]) { continue }
+      // #6601 work around Chrome version <= 55 bug where single textNode
+      // replaced by innerHTML/textContent retains its parentNode property
+      if (elm.childNodes.length === 1) {
+        elm.removeChild(elm.childNodes[0]);
+      }
+    }
+
+    if (key === 'value') {
+      // store value as _value as well since
+      // non-string values will be stringified
+      elm._value = cur;
+      // avoid resetting cursor position when value is the same
+      var strCur = isUndef(cur) ? '' : String(cur);
+      if (shouldUpdateValue(elm, strCur)) {
+        elm.value = strCur;
+      }
+    } else {
+      elm[key] = cur;
+    }
+  }
+}
+
+// check platforms/web/util/attrs.js acceptValue
+
+
+function shouldUpdateValue (elm, checkVal) {
+  return (!elm.composing && (
+    elm.tagName === 'OPTION' ||
+    isNotInFocusAndDirty(elm, checkVal) ||
+    isDirtyWithModifiers(elm, checkVal)
+  ))
+}
+
+function isNotInFocusAndDirty (elm, checkVal) {
+  // return true when textbox (.number and .trim) loses focus and its value is
+  // not equal to the updated value
+  var notInFocus = true;
+  // #6157
+  // work around IE bug when accessing document.activeElement in an iframe
+  try { notInFocus = document.activeElement !== elm; } catch (e) {}
+  return notInFocus && elm.value !== checkVal
+}
+
+function isDirtyWithModifiers (elm, newVal) {
+  var value = elm.value;
+  var modifiers = elm._vModifiers; // injected by v-model runtime
+  if (isDef(modifiers)) {
+    if (modifiers.lazy) {
+      // inputs with lazy should only be updated when not in focus
+      return false
+    }
+    if (modifiers.number) {
+      return toNumber(value) !== toNumber(newVal)
+    }
+    if (modifiers.trim) {
+      return value.trim() !== newVal.trim()
+    }
+  }
+  return value !== newVal
+}
+
+var domProps = {
+  create: updateDOMProps,
+  update: updateDOMProps
+};
+
+/*  */
+
+var parseStyleText = cached(function (cssText) {
+  var res = {};
+  var listDelimiter = /;(?![^(]*\))/g;
+  var propertyDelimiter = /:(.+)/;
+  cssText.split(listDelimiter).forEach(function (item) {
+    if (item) {
+      var tmp = item.split(propertyDelimiter);
+      tmp.length > 1 && (res[tmp[0].trim()] = tmp[1].trim());
+    }
+  });
+  return res
+});
+
+// merge static and dynamic style data on the same vnode
+function normalizeStyleData (data) {
+  var style = normalizeStyleBinding(data.style);
+  // static style is pre-processed into an object during compilation
+  // and is always a fresh object, so it's safe to merge into it
+  return data.staticStyle
+    ? extend(data.staticStyle, style)
+    : style
+}
+
+// normalize possible array / string values into Object
+function normalizeStyleBinding (bindingStyle) {
+  if (Array.isArray(bindingStyle)) {
+    return toObject(bindingStyle)
+  }
+  if (typeof bindingStyle === 'string') {
+    return parseStyleText(bindingStyle)
+  }
+  return bindingStyle
+}
+
+/**
+ * parent component style should be after child's
+ * so that parent component's style could override it
+ */
+function getStyle (vnode, checkChild) {
+  var res = {};
+  var styleData;
+
+  if (checkChild) {
+    var childNode = vnode;
+    while (childNode.componentInstance) {
+      childNode = childNode.componentInstance._vnode;
+      if (
+        childNode && childNode.data &&
+        (styleData = normalizeStyleData(childNode.data))
+      ) {
+        extend(res, styleData);
+      }
+    }
+  }
+
+  if ((styleData = normalizeStyleData(vnode.data))) {
+    extend(res, styleData);
+  }
+
+  var parentNode = vnode;
+  while ((parentNode = parentNode.parent)) {
+    if (parentNode.data && (styleData = normalizeStyleData(parentNode.data))) {
+      extend(res, styleData);
+    }
+  }
+  return res
+}
+
+/*  */
+
+var cssVarRE = /^--/;
+var importantRE = /\s*!important$/;
+var setProp = function (el, name, val) {
+  /* istanbul ignore if */
+  if (cssVarRE.test(name)) {
+    el.style.setProperty(name, val);
+  } else if (importantRE.test(val)) {
+    el.style.setProperty(name, val.replace(importantRE, ''), 'important');
+  } else {
+    var normalizedName = normalize(name);
+    if (Array.isArray(val)) {
+      // Support values array created by autoprefixer, e.g.
+      // {display: ["-webkit-box", "-ms-flexbox", "flex"]}
+      // Set them one by one, and the browser will only set those it can recognize
+      for (var i = 0, len = val.length; i < len; i++) {
+        el.style[normalizedName] = val[i];
+      }
+    } else {
+      el.style[normalizedName] = val;
+    }
+  }
+};
+
+var vendorNames = ['Webkit', 'Moz', 'ms'];
+
+var emptyStyle;
+var normalize = cached(function (prop) {
+  emptyStyle = emptyStyle || document.createElement('div').style;
+  prop = camelize(prop);
+  if (prop !== 'filter' && (prop in emptyStyle)) {
+    return prop
+  }
+  var capName = prop.charAt(0).toUpperCase() + prop.slice(1);
+  for (var i = 0; i < vendorNames.length; i++) {
+    var name = vendorNames[i] + capName;
+    if (name in emptyStyle) {
+      return name
+    }
+  }
+});
+
+function updateStyle (oldVnode, vnode) {
+  var data = vnode.data;
+  var oldData = oldVnode.data;
+
+  if (isUndef(data.staticStyle) && isUndef(data.style) &&
+    isUndef(oldData.staticStyle) && isUndef(oldData.style)
+  ) {
+    return
+  }
+
+  var cur, name;
+  var el = vnode.elm;
+  var oldStaticStyle = oldData.staticStyle;
+  var oldStyleBinding = oldData.normalizedStyle || oldData.style || {};
+
+  // if static style exists, stylebinding already merged into it when doing normalizeStyleData
+  var oldStyle = oldStaticStyle || oldStyleBinding;
+
+  var style = normalizeStyleBinding(vnode.data.style) || {};
+
+  // store normalized style under a different key for next diff
+  // make sure to clone it if it's reactive, since the user likely wants
+  // to mutate it.
+  vnode.data.normalizedStyle = isDef(style.__ob__)
+    ? extend({}, style)
+    : style;
+
+  var newStyle = getStyle(vnode, true);
+
+  for (name in oldStyle) {
+    if (isUndef(newStyle[name])) {
+      setProp(el, name, '');
+    }
+  }
+  for (name in newStyle) {
+    cur = newStyle[name];
+    if (cur !== oldStyle[name]) {
+      // ie9 setting to null has no effect, must use empty string
+      setProp(el, name, cur == null ? '' : cur);
+    }
+  }
+}
+
+var style = {
+  create: updateStyle,
+  update: updateStyle
+};
+
+/*  */
+
+/**
+ * Add class with compatibility for SVG since classList is not supported on
+ * SVG elements in IE
+ */
+function addClass (el, cls) {
+  /* istanbul ignore if */
+  if (!cls || !(cls = cls.trim())) {
+    return
+  }
+
+  /* istanbul ignore else */
+  if (el.classList) {
+    if (cls.indexOf(' ') > -1) {
+      cls.split(/\s+/).forEach(function (c) { return el.classList.add(c); });
+    } else {
+      el.classList.add(cls);
+    }
+  } else {
+    var cur = " " + (el.getAttribute('class') || '') + " ";
+    if (cur.indexOf(' ' + cls + ' ') < 0) {
+      el.setAttribute('class', (cur + cls).trim());
+    }
+  }
+}
+
+/**
+ * Remove class with compatibility for SVG since classList is not supported on
+ * SVG elements in IE
+ */
+function removeClass (el, cls) {
+  /* istanbul ignore if */
+  if (!cls || !(cls = cls.trim())) {
+    return
+  }
+
+  /* istanbul ignore else */
+  if (el.classList) {
+    if (cls.indexOf(' ') > -1) {
+      cls.split(/\s+/).forEach(function (c) { return el.classList.remove(c); });
+    } else {
+      el.classList.remove(cls);
+    }
+    if (!el.classList.length) {
+      el.removeAttribute('class');
+    }
+  } else {
+    var cur = " " + (el.getAttribute('class') || '') + " ";
+    var tar = ' ' + cls + ' ';
+    while (cur.indexOf(tar) >= 0) {
+      cur = cur.replace(tar, ' ');
+    }
+    cur = cur.trim();
+    if (cur) {
+      el.setAttribute('class', cur);
+    } else {
+      el.removeAttribute('class');
+    }
+  }
+}
+
+/*  */
+
+function resolveTransition (def) {
+  if (!def) {
+    return
+  }
+  /* istanbul ignore else */
+  if (typeof def === 'object') {
+    var res = {};
+    if (def.css !== false) {
+      extend(res, autoCssTransition(def.name || 'v'));
+    }
+    extend(res, def);
+    return res
+  } else if (typeof def === 'string') {
+    return autoCssTransition(def)
+  }
+}
+
+var autoCssTransition = cached(function (name) {
+  return {
+    enterClass: (name + "-enter"),
+    enterToClass: (name + "-enter-to"),
+    enterActiveClass: (name + "-enter-active"),
+    leaveClass: (name + "-leave"),
+    leaveToClass: (name + "-leave-to"),
+    leaveActiveClass: (name + "-leave-active")
+  }
+});
+
+var hasTransition = inBrowser && !isIE9;
+var TRANSITION = 'transition';
+var ANIMATION = 'animation';
+
+// Transition property/event sniffing
+var transitionProp = 'transition';
+var transitionEndEvent = 'transitionend';
+var animationProp = 'animation';
+var animationEndEvent = 'animationend';
+if (hasTransition) {
+  /* istanbul ignore if */
+  if (window.ontransitionend === undefined &&
+    window.onwebkittransitionend !== undefined
+  ) {
+    transitionProp = 'WebkitTransition';
+    transitionEndEvent = 'webkitTransitionEnd';
+  }
+  if (window.onanimationend === undefined &&
+    window.onwebkitanimationend !== undefined
+  ) {
+    animationProp = 'WebkitAnimation';
+    animationEndEvent = 'webkitAnimationEnd';
+  }
+}
+
+// binding to window is necessary to make hot reload work in IE in strict mode
+var raf = inBrowser
+  ? window.requestAnimationFrame
+    ? window.requestAnimationFrame.bind(window)
+    : setTimeout
+  : /* istanbul ignore next */ function (fn) { return fn(); };
+
+function nextFrame (fn) {
+  raf(function () {
+    raf(fn);
+  });
+}
+
+function addTransitionClass (el, cls) {
+  var transitionClasses = el._transitionClasses || (el._transitionClasses = []);
+  if (transitionClasses.indexOf(cls) < 0) {
+    transitionClasses.push(cls);
+    addClass(el, cls);
+  }
+}
+
+function removeTransitionClass (el, cls) {
+  if (el._transitionClasses) {
+    remove(el._transitionClasses, cls);
+  }
+  removeClass(el, cls);
+}
+
+function whenTransitionEnds (
+  el,
+  expectedType,
+  cb
+) {
+  var ref = getTransitionInfo(el, expectedType);
+  var type = ref.type;
+  var timeout = ref.timeout;
+  var propCount = ref.propCount;
+  if (!type) { return cb() }
+  var event = type === TRANSITION ? transitionEndEvent : animationEndEvent;
+  var ended = 0;
+  var end = function () {
+    el.removeEventListener(event, onEnd);
+    cb();
+  };
+  var onEnd = function (e) {
+    if (e.target === el) {
+      if (++ended >= propCount) {
+        end();
+      }
+    }
+  };
+  setTimeout(function () {
+    if (ended < propCount) {
+      end();
+    }
+  }, timeout + 1);
+  el.addEventListener(event, onEnd);
+}
+
+var transformRE = /\b(transform|all)(,|$)/;
+
+function getTransitionInfo (el, expectedType) {
+  var styles = window.getComputedStyle(el);
+  var transitionDelays = styles[transitionProp + 'Delay'].split(', ');
+  var transitionDurations = styles[transitionProp + 'Duration'].split(', ');
+  var transitionTimeout = getTimeout(transitionDelays, transitionDurations);
+  var animationDelays = styles[animationProp + 'Delay'].split(', ');
+  var animationDurations = styles[animationProp + 'Duration'].split(', ');
+  var animationTimeout = getTimeout(animationDelays, animationDurations);
+
+  var type;
+  var timeout = 0;
+  var propCount = 0;
+  /* istanbul ignore if */
+  if (expectedType === TRANSITION) {
+    if (transitionTimeout > 0) {
+      type = TRANSITION;
+      timeout = transitionTimeout;
+      propCount = transitionDurations.length;
+    }
+  } else if (expectedType === ANIMATION) {
+    if (animationTimeout > 0) {
+      type = ANIMATION;
+      timeout = animationTimeout;
+      propCount = animationDurations.length;
+    }
+  } else {
+    timeout = Math.max(transitionTimeout, animationTimeout);
+    type = timeout > 0
+      ? transitionTimeout > animationTimeout
+        ? TRANSITION
+        : ANIMATION
+      : null;
+    propCount = type
+      ? type === TRANSITION
+        ? transitionDurations.length
+        : animationDurations.length
+      : 0;
+  }
+  var hasTransform =
+    type === TRANSITION &&
+    transformRE.test(styles[transitionProp + 'Property']);
+  return {
+    type: type,
+    timeout: timeout,
+    propCount: propCount,
+    hasTransform: hasTransform
+  }
+}
+
+function getTimeout (delays, durations) {
+  /* istanbul ignore next */
+  while (delays.length < durations.length) {
+    delays = delays.concat(delays);
+  }
+
+  return Math.max.apply(null, durations.map(function (d, i) {
+    return toMs(d) + toMs(delays[i])
+  }))
+}
+
+function toMs (s) {
+  return Number(s.slice(0, -1)) * 1000
+}
+
+/*  */
+
+function enter (vnode, toggleDisplay) {
+  var el = vnode.elm;
+
+  // call leave callback now
+  if (isDef(el._leaveCb)) {
+    el._leaveCb.cancelled = true;
+    el._leaveCb();
+  }
+
+  var data = resolveTransition(vnode.data.transition);
+  if (isUndef(data)) {
+    return
+  }
+
+  /* istanbul ignore if */
+  if (isDef(el._enterCb) || el.nodeType !== 1) {
+    return
+  }
+
+  var css = data.css;
+  var type = data.type;
+  var enterClass = data.enterClass;
+  var enterToClass = data.enterToClass;
+  var enterActiveClass = data.enterActiveClass;
+  var appearClass = data.appearClass;
+  var appearToClass = data.appearToClass;
+  var appearActiveClass = data.appearActiveClass;
+  var beforeEnter = data.beforeEnter;
+  var enter = data.enter;
+  var afterEnter = data.afterEnter;
+  var enterCancelled = data.enterCancelled;
+  var beforeAppear = data.beforeAppear;
+  var appear = data.appear;
+  var afterAppear = data.afterAppear;
+  var appearCancelled = data.appearCancelled;
+  var duration = data.duration;
+
+  // activeInstance will always be the <transition> component managing this
+  // transition. One edge case to check is when the <transition> is placed
+  // as the root node of a child component. In that case we need to check
+  // <transition>'s parent for appear check.
+  var context = activeInstance;
+  var transitionNode = activeInstance.$vnode;
+  while (transitionNode && transitionNode.parent) {
+    transitionNode = transitionNode.parent;
+    context = transitionNode.context;
+  }
+
+  var isAppear = !context._isMounted || !vnode.isRootInsert;
+
+  if (isAppear && !appear && appear !== '') {
+    return
+  }
+
+  var startClass = isAppear && appearClass
+    ? appearClass
+    : enterClass;
+  var activeClass = isAppear && appearActiveClass
+    ? appearActiveClass
+    : enterActiveClass;
+  var toClass = isAppear && appearToClass
+    ? appearToClass
+    : enterToClass;
+
+  var beforeEnterHook = isAppear
+    ? (beforeAppear || beforeEnter)
+    : beforeEnter;
+  var enterHook = isAppear
+    ? (typeof appear === 'function' ? appear : enter)
+    : enter;
+  var afterEnterHook = isAppear
+    ? (afterAppear || afterEnter)
+    : afterEnter;
+  var enterCancelledHook = isAppear
+    ? (appearCancelled || enterCancelled)
+    : enterCancelled;
+
+  var explicitEnterDuration = toNumber(
+    isObject(duration)
+      ? duration.enter
+      : duration
+  );
+
+  if (process.env.NODE_ENV !== 'production' && explicitEnterDuration != null) {
+    checkDuration(explicitEnterDuration, 'enter', vnode);
+  }
+
+  var expectsCSS = css !== false && !isIE9;
+  var userWantsControl = getHookArgumentsLength(enterHook);
+
+  var cb = el._enterCb = once(function () {
+    if (expectsCSS) {
+      removeTransitionClass(el, toClass);
+      removeTransitionClass(el, activeClass);
+    }
+    if (cb.cancelled) {
+      if (expectsCSS) {
+        removeTransitionClass(el, startClass);
+      }
+      enterCancelledHook && enterCancelledHook(el);
+    } else {
+      afterEnterHook && afterEnterHook(el);
+    }
+    el._enterCb = null;
+  });
+
+  if (!vnode.data.show) {
+    // remove pending leave element on enter by injecting an insert hook
+    mergeVNodeHook(vnode, 'insert', function () {
+      var parent = el.parentNode;
+      var pendingNode = parent && parent._pending && parent._pending[vnode.key];
+      if (pendingNode &&
+        pendingNode.tag === vnode.tag &&
+        pendingNode.elm._leaveCb
+      ) {
+        pendingNode.elm._leaveCb();
+      }
+      enterHook && enterHook(el, cb);
+    });
+  }
+
+  // start enter transition
+  beforeEnterHook && beforeEnterHook(el);
+  if (expectsCSS) {
+    addTransitionClass(el, startClass);
+    addTransitionClass(el, activeClass);
+    nextFrame(function () {
+      addTransitionClass(el, toClass);
+      removeTransitionClass(el, startClass);
+      if (!cb.cancelled && !userWantsControl) {
+        if (isValidDuration(explicitEnterDuration)) {
+          setTimeout(cb, explicitEnterDuration);
+        } else {
+          whenTransitionEnds(el, type, cb);
+        }
+      }
+    });
+  }
+
+  if (vnode.data.show) {
+    toggleDisplay && toggleDisplay();
+    enterHook && enterHook(el, cb);
+  }
+
+  if (!expectsCSS && !userWantsControl) {
+    cb();
+  }
+}
+
+function leave (vnode, rm) {
+  var el = vnode.elm;
+
+  // call enter callback now
+  if (isDef(el._enterCb)) {
+    el._enterCb.cancelled = true;
+    el._enterCb();
+  }
+
+  var data = resolveTransition(vnode.data.transition);
+  if (isUndef(data) || el.nodeType !== 1) {
+    return rm()
+  }
+
+  /* istanbul ignore if */
+  if (isDef(el._leaveCb)) {
+    return
+  }
+
+  var css = data.css;
+  var type = data.type;
+  var leaveClass = data.leaveClass;
+  var leaveToClass = data.leaveToClass;
+  var leaveActiveClass = data.leaveActiveClass;
+  var beforeLeave = data.beforeLeave;
+  var leave = data.leave;
+  var afterLeave = data.afterLeave;
+  var leaveCancelled = data.leaveCancelled;
+  var delayLeave = data.delayLeave;
+  var duration = data.duration;
+
+  var expectsCSS = css !== false && !isIE9;
+  var userWantsControl = getHookArgumentsLength(leave);
+
+  var explicitLeaveDuration = toNumber(
+    isObject(duration)
+      ? duration.leave
+      : duration
+  );
+
+  if (process.env.NODE_ENV !== 'production' && isDef(explicitLeaveDuration)) {
+    checkDuration(explicitLeaveDuration, 'leave', vnode);
+  }
+
+  var cb = el._leaveCb = once(function () {
+    if (el.parentNode && el.parentNode._pending) {
+      el.parentNode._pending[vnode.key] = null;
+    }
+    if (expectsCSS) {
+      removeTransitionClass(el, leaveToClass);
+      removeTransitionClass(el, leaveActiveClass);
+    }
+    if (cb.cancelled) {
+      if (expectsCSS) {
+        removeTransitionClass(el, leaveClass);
+      }
+      leaveCancelled && leaveCancelled(el);
+    } else {
+      rm();
+      afterLeave && afterLeave(el);
+    }
+    el._leaveCb = null;
+  });
+
+  if (delayLeave) {
+    delayLeave(performLeave);
+  } else {
+    performLeave();
+  }
+
+  function performLeave () {
+    // the delayed leave may have already been cancelled
+    if (cb.cancelled) {
+      return
+    }
+    // record leaving element
+    if (!vnode.data.show) {
+      (el.parentNode._pending || (el.parentNode._pending = {}))[(vnode.key)] = vnode;
+    }
+    beforeLeave && beforeLeave(el);
+    if (expectsCSS) {
+      addTransitionClass(el, leaveClass);
+      addTransitionClass(el, leaveActiveClass);
+      nextFrame(function () {
+        addTransitionClass(el, leaveToClass);
+        removeTransitionClass(el, leaveClass);
+        if (!cb.cancelled && !userWantsControl) {
+          if (isValidDuration(explicitLeaveDuration)) {
+            setTimeout(cb, explicitLeaveDuration);
+          } else {
+            whenTransitionEnds(el, type, cb);
+          }
+        }
+      });
+    }
+    leave && leave(el, cb);
+    if (!expectsCSS && !userWantsControl) {
+      cb();
+    }
+  }
+}
+
+// only used in dev mode
+function checkDuration (val, name, vnode) {
+  if (typeof val !== 'number') {
+    warn(
+      "<transition> explicit " + name + " duration is not a valid number - " +
+      "got " + (JSON.stringify(val)) + ".",
+      vnode.context
+    );
+  } else if (isNaN(val)) {
+    warn(
+      "<transition> explicit " + name + " duration is NaN - " +
+      'the duration expression might be incorrect.',
+      vnode.context
+    );
+  }
+}
+
+function isValidDuration (val) {
+  return typeof val === 'number' && !isNaN(val)
+}
+
+/**
+ * Normalize a transition hook's argument length. The hook may be:
+ * - a merged hook (invoker) with the original in .fns
+ * - a wrapped component method (check ._length)
+ * - a plain function (.length)
+ */
+function getHookArgumentsLength (fn) {
+  if (isUndef(fn)) {
+    return false
+  }
+  var invokerFns = fn.fns;
+  if (isDef(invokerFns)) {
+    // invoker
+    return getHookArgumentsLength(
+      Array.isArray(invokerFns)
+        ? invokerFns[0]
+        : invokerFns
+    )
+  } else {
+    return (fn._length || fn.length) > 1
+  }
+}
+
+function _enter (_, vnode) {
+  if (vnode.data.show !== true) {
+    enter(vnode);
+  }
+}
+
+var transition = inBrowser ? {
+  create: _enter,
+  activate: _enter,
+  remove: function remove$$1 (vnode, rm) {
+    /* istanbul ignore else */
+    if (vnode.data.show !== true) {
+      leave(vnode, rm);
+    } else {
+      rm();
+    }
+  }
+} : {};
+
+var platformModules = [
+  attrs,
+  klass,
+  events,
+  domProps,
+  style,
+  transition
+];
+
+/*  */
+
+// the directive module should be applied last, after all
+// built-in modules have been applied.
+var modules = platformModules.concat(baseModules);
+
+var patch = createPatchFunction({ nodeOps: nodeOps, modules: modules });
+
+/**
+ * Not type checking this file because flow doesn't like attaching
+ * properties to Elements.
+ */
+
+/* istanbul ignore if */
+if (isIE9) {
+  // http://www.matts411.com/post/internet-explorer-9-oninput/
+  document.addEventListener('selectionchange', function () {
+    var el = document.activeElement;
+    if (el && el.vmodel) {
+      trigger(el, 'input');
+    }
+  });
+}
+
+var directive = {
+  inserted: function inserted (el, binding, vnode, oldVnode) {
+    if (vnode.tag === 'select') {
+      // #6903
+      if (oldVnode.elm && !oldVnode.elm._vOptions) {
+        mergeVNodeHook(vnode, 'postpatch', function () {
+          directive.componentUpdated(el, binding, vnode);
+        });
+      } else {
+        setSelected(el, binding, vnode.context);
+      }
+      el._vOptions = [].map.call(el.options, getValue);
+    } else if (vnode.tag === 'textarea' || isTextInputType(el.type)) {
+      el._vModifiers = binding.modifiers;
+      if (!binding.modifiers.lazy) {
+        // Safari < 10.2 & UIWebView doesn't fire compositionend when
+        // switching focus before confirming composition choice
+        // this also fixes the issue where some browsers e.g. iOS Chrome
+        // fires "change" instead of "input" on autocomplete.
+        el.addEventListener('change', onCompositionEnd);
+        if (!isAndroid) {
+          el.addEventListener('compositionstart', onCompositionStart);
+          el.addEventListener('compositionend', onCompositionEnd);
+        }
+        /* istanbul ignore if */
+        if (isIE9) {
+          el.vmodel = true;
+        }
+      }
+    }
+  },
+
+  componentUpdated: function componentUpdated (el, binding, vnode) {
+    if (vnode.tag === 'select') {
+      setSelected(el, binding, vnode.context);
+      // in case the options rendered by v-for have changed,
+      // it's possible that the value is out-of-sync with the rendered options.
+      // detect such cases and filter out values that no longer has a matching
+      // option in the DOM.
+      var prevOptions = el._vOptions;
+      var curOptions = el._vOptions = [].map.call(el.options, getValue);
+      if (curOptions.some(function (o, i) { return !looseEqual(o, prevOptions[i]); })) {
+        // trigger change event if
+        // no matching option found for at least one value
+        var needReset = el.multiple
+          ? binding.value.some(function (v) { return hasNoMatchingOption(v, curOptions); })
+          : binding.value !== binding.oldValue && hasNoMatchingOption(binding.value, curOptions);
+        if (needReset) {
+          trigger(el, 'change');
+        }
+      }
+    }
+  }
+};
+
+function setSelected (el, binding, vm) {
+  actuallySetSelected(el, binding, vm);
+  /* istanbul ignore if */
+  if (isIE || isEdge) {
+    setTimeout(function () {
+      actuallySetSelected(el, binding, vm);
+    }, 0);
+  }
+}
+
+function actuallySetSelected (el, binding, vm) {
+  var value = binding.value;
+  var isMultiple = el.multiple;
+  if (isMultiple && !Array.isArray(value)) {
+    process.env.NODE_ENV !== 'production' && warn(
+      "<select multiple v-model=\"" + (binding.expression) + "\"> " +
+      "expects an Array value for its binding, but got " + (Object.prototype.toString.call(value).slice(8, -1)),
+      vm
+    );
+    return
+  }
+  var selected, option;
+  for (var i = 0, l = el.options.length; i < l; i++) {
+    option = el.options[i];
+    if (isMultiple) {
+      selected = looseIndexOf(value, getValue(option)) > -1;
+      if (option.selected !== selected) {
+        option.selected = selected;
+      }
+    } else {
+      if (looseEqual(getValue(option), value)) {
+        if (el.selectedIndex !== i) {
+          el.selectedIndex = i;
+        }
+        return
+      }
+    }
+  }
+  if (!isMultiple) {
+    el.selectedIndex = -1;
+  }
+}
+
+function hasNoMatchingOption (value, options) {
+  return options.every(function (o) { return !looseEqual(o, value); })
+}
+
+function getValue (option) {
+  return '_value' in option
+    ? option._value
+    : option.value
+}
+
+function onCompositionStart (e) {
+  e.target.composing = true;
+}
+
+function onCompositionEnd (e) {
+  // prevent triggering an input event for no reason
+  if (!e.target.composing) { return }
+  e.target.composing = false;
+  trigger(e.target, 'input');
+}
+
+function trigger (el, type) {
+  var e = document.createEvent('HTMLEvents');
+  e.initEvent(type, true, true);
+  el.dispatchEvent(e);
+}
+
+/*  */
+
+// recursively search for possible transition defined inside the component root
+function locateNode (vnode) {
+  return vnode.componentInstance && (!vnode.data || !vnode.data.transition)
+    ? locateNode(vnode.componentInstance._vnode)
+    : vnode
+}
+
+var show = {
+  bind: function bind (el, ref, vnode) {
+    var value = ref.value;
+
+    vnode = locateNode(vnode);
+    var transition$$1 = vnode.data && vnode.data.transition;
+    var originalDisplay = el.__vOriginalDisplay =
+      el.style.display === 'none' ? '' : el.style.display;
+    if (value && transition$$1) {
+      vnode.data.show = true;
+      enter(vnode, function () {
+        el.style.display = originalDisplay;
+      });
+    } else {
+      el.style.display = value ? originalDisplay : 'none';
+    }
+  },
+
+  update: function update (el, ref, vnode) {
+    var value = ref.value;
+    var oldValue = ref.oldValue;
+
+    /* istanbul ignore if */
+    if (value === oldValue) { return }
+    vnode = locateNode(vnode);
+    var transition$$1 = vnode.data && vnode.data.transition;
+    if (transition$$1) {
+      vnode.data.show = true;
+      if (value) {
+        enter(vnode, function () {
+          el.style.display = el.__vOriginalDisplay;
+        });
+      } else {
+        leave(vnode, function () {
+          el.style.display = 'none';
+        });
+      }
+    } else {
+      el.style.display = value ? el.__vOriginalDisplay : 'none';
+    }
+  },
+
+  unbind: function unbind (
+    el,
+    binding,
+    vnode,
+    oldVnode,
+    isDestroy
+  ) {
+    if (!isDestroy) {
+      el.style.display = el.__vOriginalDisplay;
+    }
+  }
+};
+
+var platformDirectives = {
+  model: directive,
+  show: show
+};
+
+/*  */
+
+// Provides transition support for a single element/component.
+// supports transition mode (out-in / in-out)
+
+var transitionProps = {
+  name: String,
+  appear: Boolean,
+  css: Boolean,
+  mode: String,
+  type: String,
+  enterClass: String,
+  leaveClass: String,
+  enterToClass: String,
+  leaveToClass: String,
+  enterActiveClass: String,
+  leaveActiveClass: String,
+  appearClass: String,
+  appearActiveClass: String,
+  appearToClass: String,
+  duration: [Number, String, Object]
+};
+
+// in case the child is also an abstract component, e.g. <keep-alive>
+// we want to recursively retrieve the real component to be rendered
+function getRealChild (vnode) {
+  var compOptions = vnode && vnode.componentOptions;
+  if (compOptions && compOptions.Ctor.options.abstract) {
+    return getRealChild(getFirstComponentChild(compOptions.children))
+  } else {
+    return vnode
+  }
+}
+
+function extractTransitionData (comp) {
+  var data = {};
+  var options = comp.$options;
+  // props
+  for (var key in options.propsData) {
+    data[key] = comp[key];
+  }
+  // events.
+  // extract listeners and pass them directly to the transition methods
+  var listeners = options._parentListeners;
+  for (var key$1 in listeners) {
+    data[camelize(key$1)] = listeners[key$1];
+  }
+  return data
+}
+
+function placeholder (h, rawChild) {
+  if (/\d-keep-alive$/.test(rawChild.tag)) {
+    return h('keep-alive', {
+      props: rawChild.componentOptions.propsData
+    })
+  }
+}
+
+function hasParentTransition (vnode) {
+  while ((vnode = vnode.parent)) {
+    if (vnode.data.transition) {
+      return true
+    }
+  }
+}
+
+function isSameChild (child, oldChild) {
+  return oldChild.key === child.key && oldChild.tag === child.tag
+}
+
+var Transition = {
+  name: 'transition',
+  props: transitionProps,
+  abstract: true,
+
+  render: function render (h) {
+    var this$1 = this;
+
+    var children = this.$slots.default;
+    if (!children) {
+      return
+    }
+
+    // filter out text nodes (possible whitespaces)
+    children = children.filter(function (c) { return c.tag || isAsyncPlaceholder(c); });
+    /* istanbul ignore if */
+    if (!children.length) {
+      return
+    }
+
+    // warn multiple elements
+    if (process.env.NODE_ENV !== 'production' && children.length > 1) {
+      warn(
+        '<transition> can only be used on a single element. Use ' +
+        '<transition-group> for lists.',
+        this.$parent
+      );
+    }
+
+    var mode = this.mode;
+
+    // warn invalid mode
+    if (process.env.NODE_ENV !== 'production' &&
+      mode && mode !== 'in-out' && mode !== 'out-in'
+    ) {
+      warn(
+        'invalid <transition> mode: ' + mode,
+        this.$parent
+      );
+    }
+
+    var rawChild = children[0];
+
+    // if this is a component root node and the component's
+    // parent container node also has transition, skip.
+    if (hasParentTransition(this.$vnode)) {
+      return rawChild
+    }
+
+    // apply transition data to child
+    // use getRealChild() to ignore abstract components e.g. keep-alive
+    var child = getRealChild(rawChild);
+    /* istanbul ignore if */
+    if (!child) {
+      return rawChild
+    }
+
+    if (this._leaving) {
+      return placeholder(h, rawChild)
+    }
+
+    // ensure a key that is unique to the vnode type and to this transition
+    // component instance. This key will be used to remove pending leaving nodes
+    // during entering.
+    var id = "__transition-" + (this._uid) + "-";
+    child.key = child.key == null
+      ? child.isComment
+        ? id + 'comment'
+        : id + child.tag
+      : isPrimitive(child.key)
+        ? (String(child.key).indexOf(id) === 0 ? child.key : id + child.key)
+        : child.key;
+
+    var data = (child.data || (child.data = {})).transition = extractTransitionData(this);
+    var oldRawChild = this._vnode;
+    var oldChild = getRealChild(oldRawChild);
+
+    // mark v-show
+    // so that the transition module can hand over the control to the directive
+    if (child.data.directives && child.data.directives.some(function (d) { return d.name === 'show'; })) {
+      child.data.show = true;
+    }
+
+    if (
+      oldChild &&
+      oldChild.data &&
+      !isSameChild(child, oldChild) &&
+      !isAsyncPlaceholder(oldChild) &&
+      // #6687 component root is a comment node
+      !(oldChild.componentInstance && oldChild.componentInstance._vnode.isComment)
+    ) {
+      // replace old child transition data with fresh one
+      // important for dynamic transitions!
+      var oldData = oldChild.data.transition = extend({}, data);
+      // handle transition mode
+      if (mode === 'out-in') {
+        // return placeholder node and queue update when leave finishes
+        this._leaving = true;
+        mergeVNodeHook(oldData, 'afterLeave', function () {
+          this$1._leaving = false;
+          this$1.$forceUpdate();
+        });
+        return placeholder(h, rawChild)
+      } else if (mode === 'in-out') {
+        if (isAsyncPlaceholder(child)) {
+          return oldRawChild
+        }
+        var delayedLeave;
+        var performLeave = function () { delayedLeave(); };
+        mergeVNodeHook(data, 'afterEnter', performLeave);
+        mergeVNodeHook(data, 'enterCancelled', performLeave);
+        mergeVNodeHook(oldData, 'delayLeave', function (leave) { delayedLeave = leave; });
+      }
+    }
+
+    return rawChild
+  }
+};
+
+/*  */
+
+// Provides transition support for list items.
+// supports move transitions using the FLIP technique.
+
+// Because the vdom's children update algorithm is "unstable" - i.e.
+// it doesn't guarantee the relative positioning of removed elements,
+// we force transition-group to update its children into two passes:
+// in the first pass, we remove all nodes that need to be removed,
+// triggering their leaving transition; in the second pass, we insert/move
+// into the final desired state. This way in the second pass removed
+// nodes will remain where they should be.
+
+var props = extend({
+  tag: String,
+  moveClass: String
+}, transitionProps);
+
+delete props.mode;
+
+var TransitionGroup = {
+  props: props,
+
+  render: function render (h) {
+    var tag = this.tag || this.$vnode.data.tag || 'span';
+    var map = Object.create(null);
+    var prevChildren = this.prevChildren = this.children;
+    var rawChildren = this.$slots.default || [];
+    var children = this.children = [];
+    var transitionData = extractTransitionData(this);
+
+    for (var i = 0; i < rawChildren.length; i++) {
+      var c = rawChildren[i];
+      if (c.tag) {
+        if (c.key != null && String(c.key).indexOf('__vlist') !== 0) {
+          children.push(c);
+          map[c.key] = c
+          ;(c.data || (c.data = {})).transition = transitionData;
+        } else if (process.env.NODE_ENV !== 'production') {
+          var opts = c.componentOptions;
+          var name = opts ? (opts.Ctor.options.name || opts.tag || '') : c.tag;
+          warn(("<transition-group> children must be keyed: <" + name + ">"));
+        }
+      }
+    }
+
+    if (prevChildren) {
+      var kept = [];
+      var removed = [];
+      for (var i$1 = 0; i$1 < prevChildren.length; i$1++) {
+        var c$1 = prevChildren[i$1];
+        c$1.data.transition = transitionData;
+        c$1.data.pos = c$1.elm.getBoundingClientRect();
+        if (map[c$1.key]) {
+          kept.push(c$1);
+        } else {
+          removed.push(c$1);
+        }
+      }
+      this.kept = h(tag, null, kept);
+      this.removed = removed;
+    }
+
+    return h(tag, null, children)
+  },
+
+  beforeUpdate: function beforeUpdate () {
+    // force removing pass
+    this.__patch__(
+      this._vnode,
+      this.kept,
+      false, // hydrating
+      true // removeOnly (!important avoids unnecessary moves)
+    );
+    this._vnode = this.kept;
+  },
+
+  updated: function updated () {
+    var children = this.prevChildren;
+    var moveClass = this.moveClass || ((this.name || 'v') + '-move');
+    if (!children.length || !this.hasMove(children[0].elm, moveClass)) {
+      return
+    }
+
+    // we divide the work into three loops to avoid mixing DOM reads and writes
+    // in each iteration - which helps prevent layout thrashing.
+    children.forEach(callPendingCbs);
+    children.forEach(recordPosition);
+    children.forEach(applyTranslation);
+
+    // force reflow to put everything in position
+    // assign to this to avoid being removed in tree-shaking
+    // $flow-disable-line
+    this._reflow = document.body.offsetHeight;
+
+    children.forEach(function (c) {
+      if (c.data.moved) {
+        var el = c.elm;
+        var s = el.style;
+        addTransitionClass(el, moveClass);
+        s.transform = s.WebkitTransform = s.transitionDuration = '';
+        el.addEventListener(transitionEndEvent, el._moveCb = function cb (e) {
+          if (!e || /transform$/.test(e.propertyName)) {
+            el.removeEventListener(transitionEndEvent, cb);
+            el._moveCb = null;
+            removeTransitionClass(el, moveClass);
+          }
+        });
+      }
+    });
+  },
+
+  methods: {
+    hasMove: function hasMove (el, moveClass) {
+      /* istanbul ignore if */
+      if (!hasTransition) {
+        return false
+      }
+      /* istanbul ignore if */
+      if (this._hasMove) {
+        return this._hasMove
+      }
+      // Detect whether an element with the move class applied has
+      // CSS transitions. Since the element may be inside an entering
+      // transition at this very moment, we make a clone of it and remove
+      // all other transition classes applied to ensure only the move class
+      // is applied.
+      var clone = el.cloneNode();
+      if (el._transitionClasses) {
+        el._transitionClasses.forEach(function (cls) { removeClass(clone, cls); });
+      }
+      addClass(clone, moveClass);
+      clone.style.display = 'none';
+      this.$el.appendChild(clone);
+      var info = getTransitionInfo(clone);
+      this.$el.removeChild(clone);
+      return (this._hasMove = info.hasTransform)
+    }
+  }
+};
+
+function callPendingCbs (c) {
+  /* istanbul ignore if */
+  if (c.elm._moveCb) {
+    c.elm._moveCb();
+  }
+  /* istanbul ignore if */
+  if (c.elm._enterCb) {
+    c.elm._enterCb();
+  }
+}
+
+function recordPosition (c) {
+  c.data.newPos = c.elm.getBoundingClientRect();
+}
+
+function applyTranslation (c) {
+  var oldPos = c.data.pos;
+  var newPos = c.data.newPos;
+  var dx = oldPos.left - newPos.left;
+  var dy = oldPos.top - newPos.top;
+  if (dx || dy) {
+    c.data.moved = true;
+    var s = c.elm.style;
+    s.transform = s.WebkitTransform = "translate(" + dx + "px," + dy + "px)";
+    s.transitionDuration = '0s';
+  }
+}
+
+var platformComponents = {
+  Transition: Transition,
+  TransitionGroup: TransitionGroup
+};
+
+/*  */
+
+// install platform specific utils
+Vue$3.config.mustUseProp = mustUseProp;
+Vue$3.config.isReservedTag = isReservedTag;
+Vue$3.config.isReservedAttr = isReservedAttr;
+Vue$3.config.getTagNamespace = getTagNamespace;
+Vue$3.config.isUnknownElement = isUnknownElement;
+
+// install platform runtime directives & components
+extend(Vue$3.options.directives, platformDirectives);
+extend(Vue$3.options.components, platformComponents);
+
+// install platform patch function
+Vue$3.prototype.__patch__ = inBrowser ? patch : noop;
+
+// public mount method
+Vue$3.prototype.$mount = function (
+  el,
+  hydrating
+) {
+  el = el && inBrowser ? query(el) : undefined;
+  return mountComponent(this, el, hydrating)
+};
+
+// devtools global hook
+/* istanbul ignore next */
+Vue$3.nextTick(function () {
+  if (config.devtools) {
+    if (devtools) {
+      devtools.emit('init', Vue$3);
+    } else if (process.env.NODE_ENV !== 'production' && isChrome) {
+      console[console.info ? 'info' : 'log'](
+        'Download the Vue Devtools extension for a better development experience:\n' +
+        'https://github.com/vuejs/vue-devtools'
+      );
+    }
+  }
+  if (process.env.NODE_ENV !== 'production' &&
+    config.productionTip !== false &&
+    inBrowser && typeof console !== 'undefined'
+  ) {
+    console[console.info ? 'info' : 'log'](
+      "You are running Vue in development mode.\n" +
+      "Make sure to turn on production mode when deploying for production.\n" +
+      "See more tips at https://vuejs.org/guide/deployment.html"
+    );
+  }
+}, 0);
+
+/*  */
+
+/* harmony default export */ __webpack_exports__["a"] = (Vue$3);
+
+/* WEBPACK VAR INJECTION */}.call(__webpack_exports__, __webpack_require__(4), __webpack_require__(3), __webpack_require__(6).setImmediate))
+
+/***/ }),
+/* 3 */
+/***/ (function(module, exports) {
+
+var g;\r
+\r
+// This works in non-strict mode\r
+g = (function() {\r
+       return this;\r
+})();\r
+\r
+try {\r
+       // This works if eval is allowed (see CSP)\r
+       g = g || Function("return this")() || (1,eval)("this");\r
+} catch(e) {\r
+       // This works if the window reference is available\r
+       if(typeof window === "object")\r
+               g = window;\r
+}\r
+\r
+// g can still be undefined, but nothing to do about it...\r
+// We return undefined, instead of nothing here, so it's\r
+// easier to handle this case. if(!global) { ...}\r
+\r
+module.exports = g;\r
+
+
+/***/ }),
+/* 4 */
+/***/ (function(module, exports) {
+
+// shim for using process in browser
+var process = module.exports = {};
+
+// cached from whatever global is present so that test runners that stub it
+// don't break things.  But we need to wrap it in a try catch in case it is
+// wrapped in strict mode code which doesn't define any globals.  It's inside a
+// function because try/catches deoptimize in certain engines.
+
+var cachedSetTimeout;
+var cachedClearTimeout;
+
+function defaultSetTimout() {
+    throw new Error('setTimeout has not been defined');
+}
+function defaultClearTimeout () {
+    throw new Error('clearTimeout has not been defined');
+}
+(function () {
+    try {
+        if (typeof setTimeout === 'function') {
+            cachedSetTimeout = setTimeout;
+        } else {
+            cachedSetTimeout = defaultSetTimout;
+        }
+    } catch (e) {
+        cachedSetTimeout = defaultSetTimout;
+    }
+    try {
+        if (typeof clearTimeout === 'function') {
+            cachedClearTimeout = clearTimeout;
+        } else {
+            cachedClearTimeout = defaultClearTimeout;
+        }
+    } catch (e) {
+        cachedClearTimeout = defaultClearTimeout;
+    }
+} ())
+function runTimeout(fun) {
+    if (cachedSetTimeout === setTimeout) {
+        //normal enviroments in sane situations
+        return setTimeout(fun, 0);
+    }
+    // if setTimeout wasn't available but was latter defined
+    if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
+        cachedSetTimeout = setTimeout;
+        return setTimeout(fun, 0);
+    }
+    try {
+        // when when somebody has screwed with setTimeout but no I.E. maddness
+        return cachedSetTimeout(fun, 0);
+    } catch(e){
+        try {
+            // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
+            return cachedSetTimeout.call(null, fun, 0);
+        } catch(e){
+            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
+            return cachedSetTimeout.call(this, fun, 0);
+        }
+    }
+
+
+}
+function runClearTimeout(marker) {
+    if (cachedClearTimeout === clearTimeout) {
+        //normal enviroments in sane situations
+        return clearTimeout(marker);
+    }
+    // if clearTimeout wasn't available but was latter defined
+    if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
+        cachedClearTimeout = clearTimeout;
+        return clearTimeout(marker);
+    }
+    try {
+        // when when somebody has screwed with setTimeout but no I.E. maddness
+        return cachedClearTimeout(marker);
+    } catch (e){
+        try {
+            // When we are in I.E. but the script has been evaled so I.E. doesn't  trust the global object when called normally
+            return cachedClearTimeout.call(null, marker);
+        } catch (e){
+            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
+            // Some versions of I.E. have different rules for clearTimeout vs setTimeout
+            return cachedClearTimeout.call(this, marker);
+        }
+    }
+
+
+
+}
+var queue = [];
+var draining = false;
+var currentQueue;
+var queueIndex = -1;
+
+function cleanUpNextTick() {
+    if (!draining || !currentQueue) {
+        return;
+    }
+    draining = false;
+    if (currentQueue.length) {
+        queue = currentQueue.concat(queue);
+    } else {
+        queueIndex = -1;
+    }
+    if (queue.length) {
+        drainQueue();
+    }
+}
+
+function drainQueue() {
+    if (draining) {
+        return;
+    }
+    var timeout = runTimeout(cleanUpNextTick);
+    draining = true;
+
+    var len = queue.length;
+    while(len) {
+        currentQueue = queue;
+        queue = [];
+        while (++queueIndex < len) {
+            if (currentQueue) {
+                currentQueue[queueIndex].run();
+            }
+        }
+        queueIndex = -1;
+        len = queue.length;
+    }
+    currentQueue = null;
+    draining = false;
+    runClearTimeout(timeout);
+}
+
+process.nextTick = function (fun) {
+    var args = new Array(arguments.length - 1);
+    if (arguments.length > 1) {
+        for (var i = 1; i < arguments.length; i++) {
+            args[i - 1] = arguments[i];
+        }
+    }
+    queue.push(new Item(fun, args));
+    if (queue.length === 1 && !draining) {
+        runTimeout(drainQueue);
+    }
+};
+
+// v8 likes predictible objects
+function Item(fun, array) {
+    this.fun = fun;
+    this.array = array;
+}
+Item.prototype.run = function () {
+    this.fun.apply(null, this.array);
+};
+process.title = 'browser';
+process.browser = true;
+process.env = {};
+process.argv = [];
+process.version = ''; // empty string to avoid regexp issues
+process.versions = {};
+
+function noop() {}
+
+process.on = noop;
+process.addListener = noop;
+process.once = noop;
+process.off = noop;
+process.removeListener = noop;
+process.removeAllListeners = noop;
+process.emit = noop;
+process.prependListener = noop;
+process.prependOnceListener = noop;
+
+process.listeners = function (name) { return [] }
+
+process.binding = function (name) {
+    throw new Error('process.binding is not supported');
+};
+
+process.cwd = function () { return '/' };
+process.chdir = function (dir) {
+    throw new Error('process.chdir is not supported');
+};
+process.umask = function() { return 0; };
+
+
+/***/ }),
+/* 5 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+
+// EXTERNAL MODULE: ./node_modules/vue/dist/vue.runtime.esm.js
+var vue_runtime_esm = __webpack_require__(2);
+
+// EXTERNAL MODULE: ./src/util.js
+var util = __webpack_require__(0);
+
+// CONCATENATED MODULE: ./src/url/root.js
+/**
+ * Root Prefix Transform.
+ */
+
+
+
+/* harmony default export */ var root = (function (options, next) {
+
+    var url = next(options);
+
+    if (Object(util["m" /* isString */])(options.root) && !/^(https?:)?\//.test(url)) {
+        url = Object(util["t" /* trimEnd */])(options.root, '/') + '/' + url;
+    }
+
+    return url;
+});
+
+// CONCATENATED MODULE: ./src/url/query.js
+/**
+ * Query Parameter Transform.
+ */
+
+
+
+
+/* harmony default export */ var url_query = (function (options, next) {
+
+    var urlParams = Object.keys(Url.options.params), query = {}, url = next(options);
+
+    Object(util["d" /* each */])(options.params, function (value, key) {
+        if (urlParams.indexOf(key) === -1) {
+            query[key] = value;
+        }
+    });
+
+    query = Url.params(query);
+
+    if (query) {
+        url += (url.indexOf('?') == -1 ? '?' : '&') + query;
+    }
+
+    return url;
+});
+
+// CONCATENATED MODULE: ./src/lib/url-template.js
+/**
+ * URL Template v2.0.6 (https://github.com/bramstein/url-template)
+ */
+
+function expand(url, params, variables) {
+
+    var tmpl = parse(url), expanded = tmpl.expand(params);
+
+    if (variables) {
+        variables.push.apply(variables, tmpl.vars);
+    }
+
+    return expanded;
+}
+
+function parse(template) {
+
+    var operators = ['+', '#', '.', '/', ';', '?', '&'], variables = [];
+
+    return {
+        vars: variables,
+        expand: function expand(context) {
+            return template.replace(/\{([^{}]+)\}|([^{}]+)/g, function (_, expression, literal) {
+                if (expression) {
+
+                    var operator = null, values = [];
+
+                    if (operators.indexOf(expression.charAt(0)) !== -1) {
+                        operator = expression.charAt(0);
+                        expression = expression.substr(1);
+                    }
+
+                    expression.split(/,/g).forEach(function (variable) {
+                        var tmp = /([^:*]*)(?::(\d+)|(\*))?/.exec(variable);
+                        values.push.apply(values, getValues(context, operator, tmp[1], tmp[2] || tmp[3]));
+                        variables.push(tmp[1]);
+                    });
+
+                    if (operator && operator !== '+') {
+
+                        var separator = ',';
+
+                        if (operator === '?') {
+                            separator = '&';
+                        } else if (operator !== '#') {
+                            separator = operator;
+                        }
+
+                        return (values.length !== 0 ? operator : '') + values.join(separator);
+                    } else {
+                        return values.join(',');
+                    }
+
+                } else {
+                    return encodeReserved(literal);
+                }
+            });
+        }
+    };
+}
+
+function getValues(context, operator, key, modifier) {
+
+    var value = context[key], result = [];
+
+    if (isDefined(value) && value !== '') {
+        if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {
+            value = value.toString();
+
+            if (modifier && modifier !== '*') {
+                value = value.substring(0, parseInt(modifier, 10));
+            }
+
+            result.push(encodeValue(operator, value, isKeyOperator(operator) ? key : null));
+        } else {
+            if (modifier === '*') {
+                if (Array.isArray(value)) {
+                    value.filter(isDefined).forEach(function (value) {
+                        result.push(encodeValue(operator, value, isKeyOperator(operator) ? key : null));
+                    });
+                } else {
+                    Object.keys(value).forEach(function (k) {
+                        if (isDefined(value[k])) {
+                            result.push(encodeValue(operator, value[k], k));
+                        }
+                    });
+                }
+            } else {
+                var tmp = [];
+
+                if (Array.isArray(value)) {
+                    value.filter(isDefined).forEach(function (value) {
+                        tmp.push(encodeValue(operator, value));
+                    });
+                } else {
+                    Object.keys(value).forEach(function (k) {
+                        if (isDefined(value[k])) {
+                            tmp.push(encodeURIComponent(k));
+                            tmp.push(encodeValue(operator, value[k].toString()));
+                        }
+                    });
+                }
+
+                if (isKeyOperator(operator)) {
+                    result.push(encodeURIComponent(key) + '=' + tmp.join(','));
+                } else if (tmp.length !== 0) {
+                    result.push(tmp.join(','));
+                }
+            }
+        }
+    } else {
+        if (operator === ';') {
+            result.push(encodeURIComponent(key));
+        } else if (value === '' && (operator === '&' || operator === '?')) {
+            result.push(encodeURIComponent(key) + '=');
+        } else if (value === '') {
+            result.push('');
+        }
+    }
+
+    return result;
+}
+
+function isDefined(value) {
+    return value !== undefined && value !== null;
+}
+
+function isKeyOperator(operator) {
+    return operator === ';' || operator === '&' || operator === '?';
+}
+
+function encodeValue(operator, value, key) {
+
+    value = (operator === '+' || operator === '#') ? encodeReserved(value) : encodeURIComponent(value);
+
+    if (key) {
+        return encodeURIComponent(key) + '=' + value;
+    } else {
+        return value;
+    }
+}
+
+function encodeReserved(str) {
+    return str.split(/(%[0-9A-Fa-f]{2})/g).map(function (part) {
+        if (!/%[0-9A-Fa-f]/.test(part)) {
+            part = encodeURI(part);
+        }
+        return part;
+    }).join('');
+}
+
+// CONCATENATED MODULE: ./src/url/template.js
+/**
+ * URL Template (RFC 6570) Transform.
+ */
+
+
+
+/* harmony default export */ var template = (function (options) {
+
+    var variables = [], url = expand(options.url, options.params, variables);
+
+    variables.forEach(function (key) {
+        delete options.params[key];
+    });
+
+    return url;
+});
+
+// CONCATENATED MODULE: ./src/url/index.js
+/**
+ * Service for URL templating.
+ */
+
+
+
+
+
+
+function Url(url, params) {
+
+    var self = this || {}, options = url, transform;
+
+    if (Object(util["m" /* isString */])(url)) {
+        options = {url: url, params: params};
+    }
+
+    options = Object(util["n" /* merge */])({}, Url.options, self.$options, options);
+
+    Url.transforms.forEach(function (handler) {
+
+        if (Object(util["m" /* isString */])(handler)) {
+            handler = Url.transform[handler];
+        }
+
+        if (Object(util["j" /* isFunction */])(handler)) {
+            transform = factory(handler, transform, self.$vm);
+        }
+
+    });
+
+    return transform(options);
+}
+
+/**
+ * Url options.
+ */
+
+Url.options = {
+    url: '',
+    root: null,
+    params: {}
+};
+
+/**
+ * Url transforms.
+ */
+
+Url.transform = {template: template, query: url_query, root: root};
+Url.transforms = ['template', 'query', 'root'];
+
+/**
+ * Encodes a Url parameter string.
+ *
+ * @param {Object} obj
+ */
+
+Url.params = function (obj) {
+
+    var params = [], escape = encodeURIComponent;
+
+    params.add = function (key, value) {
+
+        if (Object(util["j" /* isFunction */])(value)) {
+            value = value();
+        }
+
+        if (value === null) {
+            value = '';
+        }
+
+        this.push(escape(key) + '=' + escape(value));
+    };
+
+    serialize(params, obj);
+
+    return params.join('&').replace(/%20/g, '+');
+};
+
+/**
+ * Parse a URL and return its components.
+ *
+ * @param {String} url
+ */
+
+Url.parse = function (url) {
+
+    var el = document.createElement('a');
+
+    if (document.documentMode) {
+        el.href = url;
+        url = el.href;
+    }
+
+    el.href = url;
+
+    return {
+        href: el.href,
+        protocol: el.protocol ? el.protocol.replace(/:$/, '') : '',
+        port: el.port,
+        host: el.host,
+        hostname: el.hostname,
+        pathname: el.pathname.charAt(0) === '/' ? el.pathname : '/' + el.pathname,
+        search: el.search ? el.search.replace(/^\?/, '') : '',
+        hash: el.hash ? el.hash.replace(/^#/, '') : ''
+    };
+};
+
+function factory(handler, next, vm) {
+    return function (options) {
+        return handler.call(vm, options, next);
+    };
+}
+
+function serialize(params, obj, scope) {
+
+    var array = Object(util["g" /* isArray */])(obj), plain = Object(util["l" /* isPlainObject */])(obj), hash;
+
+    Object(util["d" /* each */])(obj, function (value, key) {
+
+        hash = Object(util["k" /* isObject */])(value) || Object(util["g" /* isArray */])(value);
+
+        if (scope) {
+            key = scope + '[' + (plain || hash ? key : '') + ']';
+        }
+
+        if (!scope && array) {
+            params.add(value.name, value.value);
+        } else if (hash) {
+            serialize(params, value, key);
+        } else {
+            params.add(key, value);
+        }
+    });
+}
+
+// EXTERNAL MODULE: ./src/promise.js + 1 modules
+var promise = __webpack_require__(1);
+
+// CONCATENATED MODULE: ./src/http/client/xdr.js
+/**
+ * XDomain client (Internet Explorer).
+ */
+
+
+
+/* harmony default export */ var xdr = (function (request) {
+    return new promise["a" /* default */](function (resolve) {
+
+        var xdr = new XDomainRequest(), handler = function (ref) {
+                var type = ref.type;
+
+
+                var status = 0;
+
+                if (type === 'load') {
+                    status = 200;
+                } else if (type === 'error') {
+                    status = 500;
+                }
+
+                resolve(request.respondWith(xdr.responseText, {status: status}));
+            };
+
+        request.abort = function () { return xdr.abort(); };
+
+        xdr.open(request.method, request.getUrl());
+
+        if (request.timeout) {
+            xdr.timeout = request.timeout;
+        }
+
+        xdr.onload = handler;
+        xdr.onabort = handler;
+        xdr.onerror = handler;
+        xdr.ontimeout = handler;
+        xdr.onprogress = function () {};
+        xdr.send(request.getBody());
+    });
+});
+
+// CONCATENATED MODULE: ./src/http/interceptor/cors.js
+/**
+ * CORS Interceptor.
+ */
+
+
+
+
+
+var SUPPORTS_CORS = util["f" /* inBrowser */] && 'withCredentials' in new XMLHttpRequest();
+
+/* harmony default export */ var cors = (function (request) {
+
+    if (util["f" /* inBrowser */]) {
+
+        var orgUrl = Url.parse(location.href);
+        var reqUrl = Url.parse(request.getUrl());
+
+        if (reqUrl.protocol !== orgUrl.protocol || reqUrl.host !== orgUrl.host) {
+
+            request.crossOrigin = true;
+            request.emulateHTTP = false;
+
+            if (!SUPPORTS_CORS) {
+                request.client = xdr;
+            }
+        }
+    }
+
+});
+
+// CONCATENATED MODULE: ./src/http/interceptor/form.js
+/**
+ * Form data Interceptor.
+ */
+
+
+
+
+/* harmony default export */ var interceptor_form = (function (request) {
+
+    if (Object(util["i" /* isFormData */])(request.body)) {
+        request.headers.delete('Content-Type');
+    } else if (Object(util["k" /* isObject */])(request.body) && request.emulateJSON) {
+        request.body = Url.params(request.body);
+        request.headers.set('Content-Type', 'application/x-www-form-urlencoded');
+    }
+
+});
+
+// CONCATENATED MODULE: ./src/http/interceptor/json.js
+/**
+ * JSON Interceptor.
+ */
+
+
+
+/* harmony default export */ var interceptor_json = (function (request) {
+
+    var type = request.headers.get('Content-Type') || '';
+
+    if (Object(util["k" /* isObject */])(request.body) && type.indexOf('application/json') === 0) {
+        request.body = JSON.stringify(request.body);
+    }
+
+    return function (response) {
+
+        return response.bodyText ? Object(util["v" /* when */])(response.text(), function (text) {
+
+            var type = response.headers.get('Content-Type') || '';
+
+            if (type.indexOf('application/json') === 0 || isJson(text)) {
+
+                try {
+                    response.body = JSON.parse(text);
+                } catch (e) {
+                    response.body = null;
+                }
+
+            } else {
+                response.body = text;
+            }
+
+            return response;
+
+        }) : response;
+
+    };
+});
+
+function isJson(str) {
+
+    var start = str.match(/^\s*(\[|\{)/);
+    var end = {'[': /]\s*$/, '{': /}\s*$/};
+
+    return start && end[start[1]].test(str);
+}
+
+// CONCATENATED MODULE: ./src/http/client/jsonp.js
+/**
+ * JSONP client (Browser).
+ */
+
+
+
+/* harmony default export */ var jsonp = (function (request) {
+    return new promise["a" /* default */](function (resolve) {
+
+        var name = request.jsonp || 'callback', callback = request.jsonpCallback || '_jsonp' + Math.random().toString(36).substr(2), body = null, handler, script;
+
+        handler = function (ref) {
+            var type = ref.type;
+
+
+            var status = 0;
+
+            if (type === 'load' && body !== null) {
+                status = 200;
+            } else if (type === 'error') {
+                status = 500;
+            }
+
+            if (status && window[callback]) {
+                delete window[callback];
+                document.body.removeChild(script);
+            }
+
+            resolve(request.respondWith(body, {status: status}));
+        };
+
+        window[callback] = function (result) {
+            body = JSON.stringify(result);
+        };
+
+        request.abort = function () {
+            handler({type: 'abort'});
+        };
+
+        request.params[name] = callback;
+
+        if (request.timeout) {
+            setTimeout(request.abort, request.timeout);
+        }
+
+        script = document.createElement('script');
+        script.src = request.getUrl();
+        script.type = 'text/javascript';
+        script.async = true;
+        script.onload = handler;
+        script.onerror = handler;
+
+        document.body.appendChild(script);
+    });
+});
+
+// CONCATENATED MODULE: ./src/http/interceptor/jsonp.js
+/**
+ * JSONP Interceptor.
+ */
+
+
+
+/* harmony default export */ var interceptor_jsonp = (function (request) {
+
+    if (request.method == 'JSONP') {
+        request.client = jsonp;
+    }
+
+});
+
+// CONCATENATED MODULE: ./src/http/interceptor/before.js
+/**
+ * Before Interceptor.
+ */
+
+
+
+/* harmony default export */ var before = (function (request) {
+
+    if (Object(util["j" /* isFunction */])(request.before)) {
+        request.before.call(this, request);
+    }
+
+});
+
+// CONCATENATED MODULE: ./src/http/interceptor/method.js
+/**
+ * HTTP method override Interceptor.
+ */
+
+/* harmony default export */ var interceptor_method = (function (request) {
+
+    if (request.emulateHTTP && /^(PUT|PATCH|DELETE)$/i.test(request.method)) {
+        request.headers.set('X-HTTP-Method-Override', request.method);
+        request.method = 'POST';
+    }
+
+});
+
+// CONCATENATED MODULE: ./src/http/interceptor/header.js
+/**
+ * Header Interceptor.
+ */
+
+
+
+
+/* harmony default export */ var header = (function (request) {
+
+    var headers = Object(util["a" /* assign */])({}, Http.headers.common,
+        !request.crossOrigin ? Http.headers.custom : {},
+        Http.headers[Object(util["q" /* toLower */])(request.method)]
+    );
+
+    Object(util["d" /* each */])(headers, function (value, name) {
+        if (!request.headers.has(name)) {
+            request.headers.set(name, value);
+        }
+    });
+
+});
+
+// CONCATENATED MODULE: ./src/http/client/xhr.js
+/**
+ * XMLHttp client (Browser).
+ */
+
+
+
+
+/* harmony default export */ var client_xhr = (function (request) {
+    return new promise["a" /* default */](function (resolve) {
+
+        var xhr = new XMLHttpRequest(), handler = function (event) {
+
+                var response = request.respondWith(
+                'response' in xhr ? xhr.response : xhr.responseText, {
+                    status: xhr.status === 1223 ? 204 : xhr.status, // IE9 status bug
+                    statusText: xhr.status === 1223 ? 'No Content' : Object(util["s" /* trim */])(xhr.statusText)
+                });
+
+                Object(util["d" /* each */])(Object(util["s" /* trim */])(xhr.getAllResponseHeaders()).split('\n'), function (row) {
+                    response.headers.append(row.slice(0, row.indexOf(':')), row.slice(row.indexOf(':') + 1));
+                });
+
+                resolve(response);
+            };
+
+        request.abort = function () { return xhr.abort(); };
+
+        xhr.open(request.method, request.getUrl(), true);
+
+        if (request.timeout) {
+            xhr.timeout = request.timeout;
+        }
+
+        if (request.responseType && 'responseType' in xhr) {
+            xhr.responseType = request.responseType;
+        }
+
+        if (request.withCredentials || request.credentials) {
+            xhr.withCredentials = true;
+        }
+
+        if (!request.crossOrigin) {
+            request.headers.set('X-Requested-With', 'XMLHttpRequest');
+        }
+
+        // deprecated use downloadProgress
+        if (Object(util["j" /* isFunction */])(request.progress) && request.method === 'GET') {
+            xhr.addEventListener('progress', request.progress);
+        }
+
+        if (Object(util["j" /* isFunction */])(request.downloadProgress)) {
+            xhr.addEventListener('progress', request.downloadProgress);
+        }
+
+        // deprecated use uploadProgress
+        if (Object(util["j" /* isFunction */])(request.progress) && /^(POST|PUT)$/i.test(request.method)) {
+            xhr.upload.addEventListener('progress', request.progress);
+        }
+
+        if (Object(util["j" /* isFunction */])(request.uploadProgress) && xhr.upload) {
+            xhr.upload.addEventListener('progress', request.uploadProgress);
+        }
+
+        request.headers.forEach(function (value, name) {
+            xhr.setRequestHeader(name, value);
+        });
+
+        xhr.onload = handler;
+        xhr.onabort = handler;
+        xhr.onerror = handler;
+        xhr.ontimeout = handler;
+        xhr.send(request.getBody());
+    });
+});
+
+// CONCATENATED MODULE: ./src/http/client/node.js
+/**
+ * Http client (Node).
+ */
+
+
+
+
+/* harmony default export */ var node = (function (request) {
+
+    var client = __webpack_require__(8);
+
+    return new promise["a" /* default */](function (resolve) {
+
+        var url = request.getUrl();
+        var body = request.getBody();
+        var method = request.method;
+        var headers = {}, handler;
+
+        request.headers.forEach(function (value, name) {
+            headers[name] = value;
+        });
+
+        client(url, {body: body, method: method, headers: headers}).then(handler = function (resp) {
+
+            var response = request.respondWith(resp.body, {
+                status: resp.statusCode,
+                statusText: Object(util["s" /* trim */])(resp.statusMessage)
+            });
+
+            Object(util["d" /* each */])(resp.headers, function (value, name) {
+                response.headers.set(name, value);
+            });
+
+            resolve(response);
+
+        }, function (error) { return handler(error.response); });
+    });
+});
+
+// CONCATENATED MODULE: ./src/http/client/index.js
+/**
+ * Base client.
+ */
+
+
+
+
+
+
+/* harmony default export */ var http_client = (function (context) {
+
+    var reqHandlers = [sendRequest], resHandlers = [];
+
+    if (!Object(util["k" /* isObject */])(context)) {
+        context = null;
+    }
+
+    function Client(request) {
+        while (reqHandlers.length) {
+
+            var handler = reqHandlers.pop();
+
+            if (Object(util["j" /* isFunction */])(handler)) {
+
+                var response = (void 0), next = (void 0);
+
+                response = handler.call(context, request, function (val) { return next = val; }) || next;
+
+                if (Object(util["k" /* isObject */])(response)) {
+                    return new promise["a" /* default */](function (resolve, reject) {
+
+                        resHandlers.forEach(function (handler) {
+                            response = Object(util["v" /* when */])(response, function (response) {
+                                return handler.call(context, response) || response;
+                            }, reject);
+                        });
+
+                        Object(util["v" /* when */])(response, resolve, reject);
+
+                    }, context);
+                }
+
+                if (Object(util["j" /* isFunction */])(response)) {
+                    resHandlers.unshift(response);
+                }
+
+            } else {
+                Object(util["u" /* warn */])(("Invalid interceptor of type " + (typeof handler) + ", must be a function"));
+            }
+        }
+    }
+
+    Client.use = function (handler) {
+        reqHandlers.push(handler);
+    };
+
+    return Client;
+});
+
+function sendRequest(request) {
+
+    var client = request.client || (util["f" /* inBrowser */] ? client_xhr : node);
+
+    return client(request);
+}
+
+// CONCATENATED MODULE: ./src/http/headers.js
+/**
+ * HTTP Headers.
+ */
+
+
+
+var headers_Headers = function Headers(headers) {
+    var this$1 = this;
+
+
+    this.map = {};
+
+    Object(util["d" /* each */])(headers, function (value, name) { return this$1.append(name, value); });
+};
+
+headers_Headers.prototype.has = function has (name) {
+    return getName(this.map, name) !== null;
+};
+
+headers_Headers.prototype.get = function get (name) {
+
+    var list = this.map[getName(this.map, name)];
+
+    return list ? list.join() : null;
+};
+
+headers_Headers.prototype.getAll = function getAll (name) {
+    return this.map[getName(this.map, name)] || [];
+};
+
+headers_Headers.prototype.set = function set (name, value) {
+    this.map[normalizeName(getName(this.map, name) || name)] = [Object(util["s" /* trim */])(value)];
+};
+
+headers_Headers.prototype.append = function append (name, value) {
+
+    var list = this.map[getName(this.map, name)];
+
+    if (list) {
+        list.push(Object(util["s" /* trim */])(value));
+    } else {
+        this.set(name, value);
+    }
+};
+
+headers_Headers.prototype.delete = function delete$1 (name) {
+    delete this.map[getName(this.map, name)];
+};
+
+headers_Headers.prototype.deleteAll = function deleteAll () {
+    this.map = {};
+};
+
+headers_Headers.prototype.forEach = function forEach (callback, thisArg) {
+        var this$1 = this;
+
+    Object(util["d" /* each */])(this.map, function (list, name) {
+        Object(util["d" /* each */])(list, function (value) { return callback.call(thisArg, value, name, this$1); });
+    });
+};
+
+/* harmony default export */ var http_headers = (headers_Headers);
+
+function getName(map, name) {
+    return Object.keys(map).reduce(function (prev, curr) {
+        return Object(util["q" /* toLower */])(name) === Object(util["q" /* toLower */])(curr) ? curr : prev;
+    }, null);
+}
+
+function normalizeName(name) {
+
+    if (/[^a-z0-9\-#$%&'*+.^_`|~]/i.test(name)) {
+        throw new TypeError('Invalid character in header field name');
+    }
+
+    return Object(util["s" /* trim */])(name);
+}
+
+// CONCATENATED MODULE: ./src/http/response.js
+/**
+ * HTTP Response.
+ */
+
+
+
+
+
+var response_Response = function Response(body, ref) {
+    var url = ref.url;
+    var headers = ref.headers;
+    var status = ref.status;
+    var statusText = ref.statusText;
+
+
+    this.url = url;
+    this.ok = status >= 200 && status < 300;
+    this.status = status || 0;
+    this.statusText = statusText || '';
+    this.headers = new http_headers(headers);
+    this.body = body;
+
+    if (Object(util["m" /* isString */])(body)) {
+
+        this.bodyText = body;
+
+    } else if (Object(util["h" /* isBlob */])(body)) {
+
+        this.bodyBlob = body;
+
+        if (isBlobText(body)) {
+            this.bodyText = blobText(body);
+        }
+    }
+};
+
+response_Response.prototype.blob = function blob () {
+    return Object(util["v" /* when */])(this.bodyBlob);
+};
+
+response_Response.prototype.text = function text () {
+    return Object(util["v" /* when */])(this.bodyText);
+};
+
+response_Response.prototype.json = function json () {
+    return Object(util["v" /* when */])(this.text(), function (text) { return JSON.parse(text); });
+};
+
+/* harmony default export */ var http_response = (response_Response);
+
+Object.defineProperty(response_Response.prototype, 'data', {
+
+    get: function get() {
+        return this.body;
+    },
+
+    set: function set(body) {
+        this.body = body;
+    }
+
+});
+
+function blobText(body) {
+    return new promise["a" /* default */](function (resolve) {
+
+        var reader = new FileReader();
+
+        reader.readAsText(body);
+        reader.onload = function () {
+            resolve(reader.result);
+        };
+
+    });
+}
+
+function isBlobText(body) {
+    return body.type.indexOf('text') === 0 || body.type.indexOf('json') !== -1;
+}
+
+// CONCATENATED MODULE: ./src/http/request.js
+/**
+ * HTTP Request.
+ */
+
+
+
+
+
+
+var request_Request = function Request(options) {
+
+    this.body = null;
+    this.params = {};
+
+    Object(util["a" /* assign */])(this, options, {
+        method: Object(util["r" /* toUpper */])(options.method || 'GET')
+    });
+
+    if (!(this.headers instanceof http_headers)) {
+        this.headers = new http_headers(this.headers);
+    }
+};
+
+request_Request.prototype.getUrl = function getUrl () {
+    return Url(this);
+};
+
+request_Request.prototype.getBody = function getBody () {
+    return this.body;
+};
+
+request_Request.prototype.respondWith = function respondWith (body, options) {
+    return new http_response(body, Object(util["a" /* assign */])(options || {}, {url: this.getUrl()}));
+};
+
+/* harmony default export */ var http_request = (request_Request);
+
+// CONCATENATED MODULE: ./src/http/index.js
+/**
+ * Service for sending network requests.
+ */
+
+var COMMON_HEADERS = {'Accept': 'application/json, text/plain, */*'};
+var JSON_CONTENT_TYPE = {'Content-Type': 'application/json;charset=utf-8'};
+
+
+
+
+
+
+
+
+
+
+
+
+
+function Http(options) {
+
+    var self = this || {}, client = http_client(self.$vm);
+
+    Object(util["c" /* defaults */])(options || {}, self.$options, Http.options);
+
+    Http.interceptors.forEach(function (handler) {
+
+        if (Object(util["m" /* isString */])(handler)) {
+            handler = Http.interceptor[handler];
+        }
+
+        if (Object(util["j" /* isFunction */])(handler)) {
+            client.use(handler);
+        }
+
+    });
+
+    return client(new http_request(options)).then(function (response) {
+
+        return response.ok ? response : promise["a" /* default */].reject(response);
+
+    }, function (response) {
+
+        if (response instanceof Error) {
+            Object(util["e" /* error */])(response);
+        }
+
+        return promise["a" /* default */].reject(response);
+    });
+}
+
+Http.options = {};
+
+Http.headers = {
+    put: JSON_CONTENT_TYPE,
+    post: JSON_CONTENT_TYPE,
+    patch: JSON_CONTENT_TYPE,
+    delete: JSON_CONTENT_TYPE,
+    common: COMMON_HEADERS,
+    custom: {}
+};
+
+Http.interceptor = {before: before, method: interceptor_method, jsonp: interceptor_jsonp, json: interceptor_json, form: interceptor_form, header: header, cors: cors};
+Http.interceptors = ['before', 'method', 'jsonp', 'json', 'form', 'header', 'cors'];
+
+['get', 'delete', 'head', 'jsonp'].forEach(function (method) {
+
+    Http[method] = function (url, options) {
+        return this(Object(util["a" /* assign */])(options || {}, {url: url, method: method}));
+    };
+
+});
+
+['post', 'put', 'patch'].forEach(function (method) {
+
+    Http[method] = function (url, body, options) {
+        return this(Object(util["a" /* assign */])(options || {}, {url: url, method: method, body: body}));
+    };
+
+});
+
+// CONCATENATED MODULE: ./src/resource.js
+/**
+ * Service for interacting with RESTful services.
+ */
+
+
+
+
+function Resource(url, params, actions, options) {
+
+    var self = this || {}, resource = {};
+
+    actions = Object(util["a" /* assign */])({},
+        Resource.actions,
+        actions
+    );
+
+    Object(util["d" /* each */])(actions, function (action, name) {
+
+        action = Object(util["n" /* merge */])({url: url, params: Object(util["a" /* assign */])({}, params)}, options, action);
+
+        resource[name] = function () {
+            return (self.$http || Http)(opts(action, arguments));
+        };
+    });
+
+    return resource;
+}
+
+function opts(action, args) {
+
+    var options = Object(util["a" /* assign */])({}, action), params = {}, body;
+
+    switch (args.length) {
+
+        case 2:
+
+            params = args[0];
+            body = args[1];
+
+            break;
+
+        case 1:
+
+            if (/^(POST|PUT|PATCH)$/i.test(options.method)) {
+                body = args[0];
+            } else {
+                params = args[0];
+            }
+
+            break;
+
+        case 0:
+
+            break;
+
+        default:
+
+            throw 'Expected up to 2 arguments [params, body], got ' + args.length + ' arguments';
+    }
+
+    options.body = body;
+    options.params = Object(util["a" /* assign */])({}, options.params, params);
+
+    return options;
+}
+
+Resource.actions = {
+
+    get: {method: 'GET'},
+    save: {method: 'POST'},
+    query: {method: 'GET'},
+    update: {method: 'PUT'},
+    remove: {method: 'DELETE'},
+    delete: {method: 'DELETE'}
+
+};
+
+// CONCATENATED MODULE: ./src/index.js
+/**
+ * Install plugin.
+ */
+
+
+
+
+
+
+
+function src_plugin(Vue) {
+
+    if (src_plugin.installed) {
+        return;
+    }
+
+    Object(util["b" /* default */])(Vue);
+
+    Vue.url = Url;
+    Vue.http = Http;
+    Vue.resource = Resource;
+    Vue.Promise = promise["a" /* default */];
+
+    Object.defineProperties(Vue.prototype, {
+
+        $url: {
+            get: function get() {
+                return Object(util["p" /* options */])(Vue.url, this, this.$options.url);
+            }
+        },
+
+        $http: {
+            get: function get() {
+                return Object(util["p" /* options */])(Vue.http, this, this.$options.http);
+            }
+        },
+
+        $resource: {
+            get: function get() {
+                return Vue.resource.bind(this);
+            }
+        },
+
+        $promise: {
+            get: function get() {
+                var this$1 = this;
+
+                return function (executor) { return new Vue.Promise(executor, this$1); };
+            }
+        }
+
+    });
+}
+
+if (typeof window !== 'undefined' && window.Vue) {
+    window.Vue.use(src_plugin);
+}
+
+/* harmony default export */ var src = (src_plugin);
+
+// CONCATENATED MODULE: ./test/index.js
+
+
+
+vue_runtime_esm["a" /* default */].use(src);
+
+__webpack_require__(9);
+__webpack_require__(10);
+__webpack_require__(11);
+__webpack_require__(12);
+
+
+/***/ }),
+/* 6 */
+/***/ (function(module, exports, __webpack_require__) {
+
+/* WEBPACK VAR INJECTION */(function(global) {var apply = Function.prototype.apply;
+
+// DOM APIs, for completeness
+
+exports.setTimeout = function() {
+  return new Timeout(apply.call(setTimeout, window, arguments), clearTimeout);
+};
+exports.setInterval = function() {
+  return new Timeout(apply.call(setInterval, window, arguments), clearInterval);
+};
+exports.clearTimeout =
+exports.clearInterval = function(timeout) {
+  if (timeout) {
+    timeout.close();
+  }
+};
+
+function Timeout(id, clearFn) {
+  this._id = id;
+  this._clearFn = clearFn;
+}
+Timeout.prototype.unref = Timeout.prototype.ref = function() {};
+Timeout.prototype.close = function() {
+  this._clearFn.call(window, this._id);
+};
+
+// Does not start the time, just sets up the members needed.
+exports.enroll = function(item, msecs) {
+  clearTimeout(item._idleTimeoutId);
+  item._idleTimeout = msecs;
+};
+
+exports.unenroll = function(item) {
+  clearTimeout(item._idleTimeoutId);
+  item._idleTimeout = -1;
+};
+
+exports._unrefActive = exports.active = function(item) {
+  clearTimeout(item._idleTimeoutId);
+
+  var msecs = item._idleTimeout;
+  if (msecs >= 0) {
+    item._idleTimeoutId = setTimeout(function onTimeout() {
+      if (item._onTimeout)
+        item._onTimeout();
+    }, msecs);
+  }
+};
+
+// setimmediate attaches itself to the global object
+__webpack_require__(7);
+// On some exotic environments, it's not clear which object `setimmeidate` was
+// able to install onto.  Search each possibility in the same order as the
+// `setimmediate` library.
+exports.setImmediate = (typeof self !== "undefined" && self.setImmediate) ||
+                       (typeof global !== "undefined" && global.setImmediate) ||
+                       (this && this.setImmediate);
+exports.clearImmediate = (typeof self !== "undefined" && self.clearImmediate) ||
+                         (typeof global !== "undefined" && global.clearImmediate) ||
+                         (this && this.clearImmediate);
+
+/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3)))
+
+/***/ }),
+/* 7 */
+/***/ (function(module, exports, __webpack_require__) {
+
+/* WEBPACK VAR INJECTION */(function(global, process) {(function (global, undefined) {
+    "use strict";
+
+    if (global.setImmediate) {
+        return;
+    }
+
+    var nextHandle = 1; // Spec says greater than zero
+    var tasksByHandle = {};
+    var currentlyRunningATask = false;
+    var doc = global.document;
+    var registerImmediate;
+
+    function setImmediate(callback) {
+      // Callback can either be a function or a string
+      if (typeof callback !== "function") {
+        callback = new Function("" + callback);
+      }
+      // Copy function arguments
+      var args = new Array(arguments.length - 1);
+      for (var i = 0; i < args.length; i++) {
+          args[i] = arguments[i + 1];
+      }
+      // Store and register the task
+      var task = { callback: callback, args: args };
+      tasksByHandle[nextHandle] = task;
+      registerImmediate(nextHandle);
+      return nextHandle++;
+    }
+
+    function clearImmediate(handle) {
+        delete tasksByHandle[handle];
+    }
+
+    function run(task) {
+        var callback = task.callback;
+        var args = task.args;
+        switch (args.length) {
+        case 0:
+            callback();
+            break;
+        case 1:
+            callback(args[0]);
+            break;
+        case 2:
+            callback(args[0], args[1]);
+            break;
+        case 3:
+            callback(args[0], args[1], args[2]);
+            break;
+        default:
+            callback.apply(undefined, args);
+            break;
+        }
+    }
+
+    function runIfPresent(handle) {
+        // From the spec: "Wait until any invocations of this algorithm started before this one have completed."
+        // So if we're currently running a task, we'll need to delay this invocation.
+        if (currentlyRunningATask) {
+            // Delay by doing a setTimeout. setImmediate was tried instead, but in Firefox 7 it generated a
+            // "too much recursion" error.
+            setTimeout(runIfPresent, 0, handle);
+        } else {
+            var task = tasksByHandle[handle];
+            if (task) {
+                currentlyRunningATask = true;
+                try {
+                    run(task);
+                } finally {
+                    clearImmediate(handle);
+                    currentlyRunningATask = false;
+                }
+            }
+        }
+    }
+
+    function installNextTickImplementation() {
+        registerImmediate = function(handle) {
+            process.nextTick(function () { runIfPresent(handle); });
+        };
+    }
+
+    function canUsePostMessage() {
+        // The test against `importScripts` prevents this implementation from being installed inside a web worker,
+        // where `global.postMessage` means something completely different and can't be used for this purpose.
+        if (global.postMessage && !global.importScripts) {
+            var postMessageIsAsynchronous = true;
+            var oldOnMessage = global.onmessage;
+            global.onmessage = function() {
+                postMessageIsAsynchronous = false;
+            };
+            global.postMessage("", "*");
+            global.onmessage = oldOnMessage;
+            return postMessageIsAsynchronous;
+        }
+    }
+
+    function installPostMessageImplementation() {
+        // Installs an event handler on `global` for the `message` event: see
+        // * https://developer.mozilla.org/en/DOM/window.postMessage
+        // * http://www.whatwg.org/specs/web-apps/current-work/multipage/comms.html#crossDocumentMessages
+
+        var messagePrefix = "setImmediate$" + Math.random() + "$";
+        var onGlobalMessage = function(event) {
+            if (event.source === global &&
+                typeof event.data === "string" &&
+                event.data.indexOf(messagePrefix) === 0) {
+                runIfPresent(+event.data.slice(messagePrefix.length));
+            }
+        };
+
+        if (global.addEventListener) {
+            global.addEventListener("message", onGlobalMessage, false);
+        } else {
+            global.attachEvent("onmessage", onGlobalMessage);
+        }
+
+        registerImmediate = function(handle) {
+            global.postMessage(messagePrefix + handle, "*");
+        };
+    }
+
+    function installMessageChannelImplementation() {
+        var channel = new MessageChannel();
+        channel.port1.onmessage = function(event) {
+            var handle = event.data;
+            runIfPresent(handle);
+        };
+
+        registerImmediate = function(handle) {
+            channel.port2.postMessage(handle);
+        };
+    }
+
+    function installReadyStateChangeImplementation() {
+        var html = doc.documentElement;
+        registerImmediate = function(handle) {
+            // Create a <script> element; its readystatechange event will be fired asynchronously once it is inserted
+            // into the document. Do so, thus queuing up the task. Remember to clean up once it's been called.
+            var script = doc.createElement("script");
+            script.onreadystatechange = function () {
+                runIfPresent(handle);
+                script.onreadystatechange = null;
+                html.removeChild(script);
+                script = null;
+            };
+            html.appendChild(script);
+        };
+    }
+
+    function installSetTimeoutImplementation() {
+        registerImmediate = function(handle) {
+            setTimeout(runIfPresent, 0, handle);
+        };
+    }
+
+    // If supported, we should attach to the prototype of global, since that is where setTimeout et al. live.
+    var attachTo = Object.getPrototypeOf && Object.getPrototypeOf(global);
+    attachTo = attachTo && attachTo.setTimeout ? attachTo : global;
+
+    // Don't get fooled by e.g. browserify environments.
+    if ({}.toString.call(global.process) === "[object process]") {
+        // For Node.js before 0.9
+        installNextTickImplementation();
+
+    } else if (canUsePostMessage()) {
+        // For non-IE10 modern browsers
+        installPostMessageImplementation();
+
+    } else if (global.MessageChannel) {
+        // For web workers, where supported
+        installMessageChannelImplementation();
+
+    } else if (doc && "onreadystatechange" in doc.createElement("script")) {
+        // For IE 6–8
+        installReadyStateChangeImplementation();
+
+    } else {
+        // For older browsers
+        installSetTimeoutImplementation();
+    }
+
+    attachTo.setImmediate = setImmediate;
+    attachTo.clearImmediate = clearImmediate;
+}(typeof self === "undefined" ? typeof global === "undefined" ? this : global : self));
+
+/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3), __webpack_require__(4)))
+
+/***/ }),
+/* 8 */
+/***/ (function(module, exports) {
+
+/* (ignored) */
+
+/***/ }),
+/* 9 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_vue__ = __webpack_require__(2);
+
+
+describe('Vue.url', function () {
+
+    it('data{/id}', function () {
+
+        expect(__WEBPACK_IMPORTED_MODULE_0_vue__["a" /* default */].url('data{/id}')).toBe('data');
+        expect(__WEBPACK_IMPORTED_MODULE_0_vue__["a" /* default */].url('data{/id}', {id: 1})).toBe('data/1');
+
+    });
+
+    it('data{/array}', function () {
+
+        expect(__WEBPACK_IMPORTED_MODULE_0_vue__["a" /* default */].url('data{?array}')).toBe('data');
+        expect(__WEBPACK_IMPORTED_MODULE_0_vue__["a" /* default */].url('data{?array}', {array: [1,2,3]})).toBe('data?array=1,2,3');
+
+    });
+
+    it('{+path}data', function () {
+
+        expect(__WEBPACK_IMPORTED_MODULE_0_vue__["a" /* default */].url('{+path}data')).toBe('data');
+        expect(__WEBPACK_IMPORTED_MODULE_0_vue__["a" /* default */].url('{+path}data', {path: 'path1/path2/'})).toBe('path1/path2/data');
+
+    });
+
+    it('{+base}data', function () {
+
+        __WEBPACK_IMPORTED_MODULE_0_vue__["a" /* default */].url.options.params.base = 'base/path/';
+        expect(__WEBPACK_IMPORTED_MODULE_0_vue__["a" /* default */].url('{+base}data')).toBe('base/path/data');
+
+    });
+
+});
+
+
+/***/ }),
+/* 10 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_vue__ = __webpack_require__(2);
+
+
+describe('Vue.http', function () {
+
+    it('get("data/text.txt")', function (done) {
+
+        __WEBPACK_IMPORTED_MODULE_0_vue__["a" /* default */].http.get('data/text.txt').then(function (res) {
+
+            expect(res.ok).toBe(true);
+            expect(res.status).toBe(200);
+            expect(res.body).toBe('text');
+            expect(res.data).toBe(res.body);
+            expect(res.headers.get('Content-Type')).toBe('text/plain');
+
+            done();
+        });
+
+    });
+
+    it('get("data/valid.json")', function (done) {
+
+        __WEBPACK_IMPORTED_MODULE_0_vue__["a" /* default */].http.get('data/valid.json').then(function (res) {
+
+            expect(res.ok).toBe(true);
+            expect(res.status).toBe(200);
+            expect(typeof res.body).toBe('object');
+            expect(res.body.foo).toBe('bar');
+
+            done();
+        });
+
+    });
+
+    it('get("data/invalid.json")', function (done) {
+
+        __WEBPACK_IMPORTED_MODULE_0_vue__["a" /* default */].http.get('data/invalid.json').then(function (res) {
+
+            expect(res.ok).toBe(true);
+            expect(res.status).toBe(200);
+            expect(res.body).toBeNull();
+
+            done();
+        });
+
+    });
+
+    it('get("github.com/avatar")', function (done) {
+
+        __WEBPACK_IMPORTED_MODULE_0_vue__["a" /* default */].http.get('https://avatars1.githubusercontent.com/u/6128107', {responseType: 'blob'}).then(function (res) {
+
+            expect(res.ok).toBe(true);
+            expect(res.status).toBe(200);
+            expect(res.body instanceof Blob).toBe(true);
+            expect(res.body.type).toBe('image/png');
+
+            done();
+        });
+
+    });
+
+    it('get("cors-api.appspot.com")', function (done) {
+
+        __WEBPACK_IMPORTED_MODULE_0_vue__["a" /* default */].http.get('http://server.cors-api.appspot.com/server?id=1&enable=true').then(function (res) {
+
+            expect(res.ok).toBe(true);
+            expect(res.status).toBe(200);
+            expect(typeof res.body).toBe('object');
+            expect(res.body.shift().requestType).toBe('cors');
+
+            if (res.headers.get('Content-Type')) {
+                expect(res.headers.get('Content-Type')).toBe('application/json');
+            }
+
+            done();
+        });
+
+    });
+
+    it('jsonp("jsfiddle.net/jsonp")', function (done) {
+
+        __WEBPACK_IMPORTED_MODULE_0_vue__["a" /* default */].http.jsonp('http://jsfiddle.net/echo/jsonp/', {params: {foo: 'bar'}}).then(function (res) {
+
+            expect(res.ok).toBe(true);
+            expect(res.status).toBe(200);
+            expect(typeof res.body).toBe('object');
+            expect(res.body.foo).toBe('bar');
+
+            done();
+        });
+
+    });
+
+});
+
+describe('this.$http', function () {
+
+    it('get("data/valid.json")', function (done) {
+
+        var vm = new __WEBPACK_IMPORTED_MODULE_0_vue__["a" /* default */]({
+
+            created: function created() {
+                var this$1 = this;
+
+
+                this.$http.get('data/valid.json').then(function (res) {
+
+                    expect(this$1).toBe(vm);
+                    expect(res.ok).toBe(true);
+                    expect(res.status).toBe(200);
+                    expect(typeof res.body).toBe('object');
+                    expect(res.body.foo).toBe('bar');
+
+                    done();
+
+                });
+
+            }
+
+        });
+
+    });
+
+    it('get("data/valid.json") with timeout', function (done) {
+
+        var vm = new __WEBPACK_IMPORTED_MODULE_0_vue__["a" /* default */]({
+
+            created: function created() {
+
+                var random = Math.random().toString(36).substr(2);
+
+                this.$http.get(("data/valid.json?" + random), {timeout: 1}).then(function (res) {
+
+                    fail('Callback has been called');
+
+                }, function (res) {
+
+                    expect(res.ok).toBe(false);
+                    expect(res.status).toBe(0);
+
+                    done();
+
+                });
+
+            }
+
+        });
+
+    });
+
+    it('get("data/valid.json") with abort()', function (done) {
+
+        var vm = new __WEBPACK_IMPORTED_MODULE_0_vue__["a" /* default */]({
+
+            created: function created() {
+
+                var random = Math.random().toString(36).substr(2);
+
+                this.$http.get(("data/valid.json?" + random), {
+
+                    before: function before(req) {
+                        setTimeout(function () {
+
+                            expect(typeof req.abort).toBe('function');
+
+                            req.abort();
+
+                        }, 0);
+                    }
+
+                }).then(function (res) {
+                    fail('Callback has been called');
+                }, function (res) {
+                    done();
+                });
+            }
+
+        });
+
+    });
+
+    it('get("data/notfound.json") using catch()', function (done) {
+
+        var vm = new __WEBPACK_IMPORTED_MODULE_0_vue__["a" /* default */]({
+
+            created: function created() {
+                var this$1 = this;
+
+
+                this.$http.get('data/notfound.json').catch(function (res) {
+
+                    expect(this$1).toBe(vm);
+                    expect(res.ok).toBe(false);
+                    expect(res.status).toBe(404);
+
+                    done();
+                });
+
+            }
+
+        });
+
+    });
+
+});
+
+/***/ }),
+/* 11 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_vue__ = __webpack_require__(2);
+
+
+describe('this.$resource', function () {
+
+    it('get({file: "valid.json"})', function (done) {
+
+        var vm = new __WEBPACK_IMPORTED_MODULE_0_vue__["a" /* default */]({
+
+            created: function created() {
+
+                var resource = this.$resource('data{/file}');
+
+                resource.get({file: 'valid.json'}).then(function (res) {
+
+                    expect(res.ok).toBe(true);
+                    expect(res.status).toBe(200);
+                    expect(res.data.foo).toBe('bar');
+
+                    done();
+                });
+
+            }
+
+        });
+
+    });
+
+    it('save({file: "valid.json"}, {foo: "bar"})', function (done) {
+
+        var vm = new __WEBPACK_IMPORTED_MODULE_0_vue__["a" /* default */]({
+
+            created: function created() {
+
+                var resource = this.$resource('data{/file}');
+
+                resource.save({file: 'valid.json'}, {foo: 'bar'}).then(function (res) {
+
+                    expect(res.ok).toBe(true);
+                    expect(res.status).toBe(200);
+                    expect(res.data.foo).toBe('bar');
+
+                    done();
+                });
+
+            }
+
+        });
+
+    });
+
+});
+
+
+/***/ }),
+/* 12 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__src_promise__ = __webpack_require__(1);
+
+
+describe('Vue.promise ' + (window.Promise !== undefined ? '(native)' : '(polyfill)'), function () {
+
+    it('then fulfill', function (done) {
+
+        __WEBPACK_IMPORTED_MODULE_0__src_promise__["a" /* default */].resolve(1).then(function (value) {
+            expect(value).toBe(1);
+            done();
+        });
+
+    });
+
+    it('then reject', function (done) {
+
+        __WEBPACK_IMPORTED_MODULE_0__src_promise__["a" /* default */].reject(1).then(undefined, function (value) {
+            expect(value).toBe(1);
+            done();
+        });
+
+    });
+
+    it('catch', function (done) {
+
+        __WEBPACK_IMPORTED_MODULE_0__src_promise__["a" /* default */].reject(1).catch(function (value) {
+            expect(value).toBe(1);
+            done();
+        });
+
+    });
+
+    it('finally fulfill', function (done) {
+
+        __WEBPACK_IMPORTED_MODULE_0__src_promise__["a" /* default */].resolve(1).finally(function (arg) {
+            expect(arg).toBe(undefined);
+        }).then(function (arg) {
+            expect(arg).toBe(1);
+            done();
+        });
+
+    });
+
+    it('finally reject', function (done) {
+
+        __WEBPACK_IMPORTED_MODULE_0__src_promise__["a" /* default */].reject(1).finally(function (arg) {
+            expect(arg).toBe(undefined);
+        }).catch(function (arg) {
+            expect(arg).toBe(1);
+            done();
+        });
+
+    });
+
+    it('all', function (done) {
+
+        __WEBPACK_IMPORTED_MODULE_0__src_promise__["a" /* default */].all([
+
+            __WEBPACK_IMPORTED_MODULE_0__src_promise__["a" /* default */].resolve(1),
+            __WEBPACK_IMPORTED_MODULE_0__src_promise__["a" /* default */].resolve(2)
+
+        ]).then(function (values) {
+            expect(values[0]).toBe(1);
+            expect(values[1]).toBe(2);
+            done();
+        });
+
+    });
+
+    it('duplicate', function (done) {
+
+        __WEBPACK_IMPORTED_MODULE_0__src_promise__["a" /* default */].all([
+
+            __WEBPACK_IMPORTED_MODULE_0__src_promise__["a" /* default */].resolve(1).then(function (value) {
+                expect(value).toBe(1);
+            }),
+
+            __WEBPACK_IMPORTED_MODULE_0__src_promise__["a" /* default */].resolve(2).then(function (value) {
+                expect(value).toBe(2);
+            })
+
+        ]).then(done);
+
+    });
+
+    it('context', function (done) {
+
+        var context = {foo: 'bar'};
+
+        __WEBPACK_IMPORTED_MODULE_0__src_promise__["a" /* default */].resolve().bind(context).then(function () {
+            expect(this).toBe(context);
+            done();
+        });
+
+    });
+
+    it('context chain fulfill', function (done) {
+
+        var context = {foo: 'bar'};
+
+        __WEBPACK_IMPORTED_MODULE_0__src_promise__["a" /* default */].resolve().bind(context).catch(undefined).finally(function () {
+            expect(this).toBe(context);
+        }).then(function () {
+            expect(this).toBe(context);
+            done();
+        });
+
+    });
+
+    it('context chain reject', function (done) {
+
+        var context = {foo: 'bar'};
+
+        __WEBPACK_IMPORTED_MODULE_0__src_promise__["a" /* default */].reject().bind(context).catch(function () {
+            expect(this).toBe(context);
+            return __WEBPACK_IMPORTED_MODULE_0__src_promise__["a" /* default */].reject();
+        }).finally(function () {
+            expect(this).toBe(context);
+        }).catch(function () {
+            expect(this).toBe(context);
+            done();
+        });
+
+    });
+
+});
+
+
+/***/ })
+/******/ ]);
\ No newline at end of file
diff --git a/advancedcontentfilter/vendor/npm-asset/vue-resource/test/url.js b/advancedcontentfilter/vendor/npm-asset/vue-resource/test/url.js
new file mode 100644 (file)
index 0000000..12dc918
--- /dev/null
@@ -0,0 +1,33 @@
+import Vue from 'vue';
+
+describe('Vue.url', function () {
+
+    it('data{/id}', function () {
+
+        expect(Vue.url('data{/id}')).toBe('data');
+        expect(Vue.url('data{/id}', {id: 1})).toBe('data/1');
+
+    });
+
+    it('data{/array}', function () {
+
+        expect(Vue.url('data{?array}')).toBe('data');
+        expect(Vue.url('data{?array}', {array: [1,2,3]})).toBe('data?array=1,2,3');
+
+    });
+
+    it('{+path}data', function () {
+
+        expect(Vue.url('{+path}data')).toBe('data');
+        expect(Vue.url('{+path}data', {path: 'path1/path2/'})).toBe('path1/path2/data');
+
+    });
+
+    it('{+base}data', function () {
+
+        Vue.url.options.params.base = 'base/path/';
+        expect(Vue.url('{+base}data')).toBe('base/path/data');
+
+    });
+
+});
diff --git a/advancedcontentfilter/vendor/npm-asset/vue-resource/test/webpack.config.js b/advancedcontentfilter/vendor/npm-asset/vue-resource/test/webpack.config.js
new file mode 100644 (file)
index 0000000..1659299
--- /dev/null
@@ -0,0 +1,17 @@
+var webpack = require('webpack');
+
+module.exports = {
+    entry: __dirname + '/index.js',
+    output: {
+        path: __dirname + '/',
+        filename: 'specs.js'
+    },
+    module: {
+        loaders: [
+            {test: /\.js$/, loader: 'buble-loader', exclude: /node_modules/}
+        ]
+    },
+    plugins: [
+        new webpack.optimize.ModuleConcatenationPlugin()
+    ]
+};
diff --git a/advancedcontentfilter/vendor/npm-asset/vue-resource/types/index.d.ts b/advancedcontentfilter/vendor/npm-asset/vue-resource/types/index.d.ts
new file mode 100644 (file)
index 0000000..0537de8
--- /dev/null
@@ -0,0 +1,94 @@
+import _Vue = require('vue');
+
+// augment typings of Vue.js
+import './vue';
+
+export interface HttpHeaders {
+    put?: { [key: string]: string };
+    post?: { [key: string]: string };
+    patch?: { [key: string]: string };
+    delete?: { [key: string]: string };
+    common?: { [key: string]: string };
+    custom?: { [key: string]: string };
+    [key: string]: any;
+}
+
+export interface HttpResponse {
+    data: any;
+    ok: boolean;
+    status: number;
+    statusText: string;
+    headers: Function;
+    text():string;
+    json():any;
+    blob():Blob;
+}
+
+export interface HttpOptions {
+    url?: string;
+    method?: string;
+    body?: any;
+    params?: any;
+    headers?: any;
+    before?(request: any): any;
+    progress?(event: any): any;
+    credentials?:boolean;
+    emulateHTTP?: boolean;
+    emulateJSON?: boolean;
+}
+
+export interface $http {
+    (url: string, data?: any, options?: HttpOptions): PromiseLike<HttpResponse>;
+    (url: string, options?: HttpOptions): PromiseLike<HttpResponse>;
+}
+
+export interface HttpInterceptor {
+    request?(request: HttpOptions): HttpOptions;
+    response?(response: HttpResponse): HttpResponse;
+}
+
+export interface Http {
+    options: HttpOptions & { root: string };
+    headers: HttpHeaders;
+    interceptors: (HttpInterceptor | (() => HttpInterceptor))[];
+    get: $http;
+    post: $http;
+    put: $http;
+    patch: $http;
+    delete: $http;
+    jsonp: $http;
+}
+
+export interface ResourceActions {
+    get: { method: string };
+    save: { method: string };
+    query: { method: string };
+    update: { method: string };
+    remove: { method: string };
+    delete: { method: string };
+}
+
+export interface ResourceMethod {
+    (params: any, data?: any, success?: Function, error?: Function): PromiseLike<HttpResponse>;
+    (params: any, success?: Function, error?: Function): PromiseLike<HttpResponse>;
+    (success?: Function, error?: Function): PromiseLike<HttpResponse>;
+}
+
+export interface ResourceMethods {
+    get: ResourceMethod;
+    save: ResourceMethod;
+    query: ResourceMethod;
+    update: ResourceMethod;
+    remove: ResourceMethod;
+    delete: ResourceMethod;
+}
+
+export interface $resource {
+    (url: string, params?: any, actions?: any, options?: HttpOptions): ResourceMethods;
+}
+
+export interface Resource extends $resource {
+    actions: ResourceActions;
+}
+
+export declare function install(vue: typeof _Vue): void;
diff --git a/advancedcontentfilter/vendor/npm-asset/vue-resource/types/vue.d.ts b/advancedcontentfilter/vendor/npm-asset/vue-resource/types/vue.d.ts
new file mode 100644 (file)
index 0000000..6ae00ef
--- /dev/null
@@ -0,0 +1,27 @@
+/**
+ * Extends interfaces in Vue.js
+ */
+
+import Vue from "vue";
+import { HttpHeaders, HttpOptions, HttpResponse, $http, $resource } from "./index";
+
+declare module "vue/types/options" {
+  interface ComponentOptions<V extends Vue> {
+    http?: (HttpOptions & { headers?: HttpHeaders } & { [key: string]: any })
+  }
+}
+
+declare module "vue/types/vue" {
+    interface Vue {
+        $http: {
+            (options: HttpOptions): PromiseLike<HttpResponse>;
+            get: $http;
+            post: $http;
+            put: $http;
+            patch: $http;
+            delete: $http;
+            jsonp: $http;
+        };
+        $resource: $resource;
+    }
+}
diff --git a/advancedcontentfilter/vendor/npm-asset/vue-resource/yarn.lock b/advancedcontentfilter/vendor/npm-asset/vue-resource/yarn.lock
new file mode 100644 (file)
index 0000000..d522439
--- /dev/null
@@ -0,0 +1,6503 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@babel/code-frame@^7.0.0-beta.35":
+  version "7.0.0-beta.40"
+  resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-beta.40.tgz#37e2b0cf7c56026b4b21d3927cadf81adec32ac6"
+  dependencies:
+    "@babel/highlight" "7.0.0-beta.40"
+
+"@babel/highlight@7.0.0-beta.40":
+  version "7.0.0-beta.40"
+  resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0-beta.40.tgz#b43d67d76bf46e1d10d227f68cddcd263786b255"
+  dependencies:
+    chalk "^2.0.0"
+    esutils "^2.0.2"
+    js-tokens "^3.0.0"
+
+"@sindresorhus/is@^0.7.0":
+  version "0.7.0"
+  resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.7.0.tgz#9a06f4f137ee84d7df0460c1fdb1135ffa6c50fd"
+
+JSONStream@^1.0.3:
+  version "1.3.2"
+  resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.2.tgz#c102371b6ec3a7cf3b847ca00c20bb0fce4c6dea"
+  dependencies:
+    jsonparse "^1.2.0"
+    through ">=2.2.7 <3"
+
+abab@^1.0.4:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e"
+
+abbrev@1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
+
+accepts@~1.3.4:
+  version "1.3.5"
+  resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2"
+  dependencies:
+    mime-types "~2.1.18"
+    negotiator "0.6.1"
+
+acorn-dynamic-import@^2.0.0:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz#c752bd210bef679501b6c6cb7fc84f8f47158cc4"
+  dependencies:
+    acorn "^4.0.3"
+
+acorn-dynamic-import@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz#901ceee4c7faaef7e07ad2a47e890675da50a278"
+  dependencies:
+    acorn "^5.0.0"
+
+acorn-globals@^4.1.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.1.0.tgz#ab716025dbe17c54d3ef81d32ece2b2d99fe2538"
+  dependencies:
+    acorn "^5.0.0"
+
+acorn-jsx@^3.0.0, acorn-jsx@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b"
+  dependencies:
+    acorn "^3.0.4"
+
+acorn-jsx@^4.1.1:
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-4.1.1.tgz#e8e41e48ea2fe0c896740610ab6a4ffd8add225e"
+  dependencies:
+    acorn "^5.0.3"
+
+acorn-node@^1.2.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/acorn-node/-/acorn-node-1.3.0.tgz#5f86d73346743810ef1269b901dbcbded020861b"
+  dependencies:
+    acorn "^5.4.1"
+    xtend "^4.0.1"
+
+acorn-object-spread@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/acorn-object-spread/-/acorn-object-spread-1.0.0.tgz#48ead0f4a8eb16995a17a0db9ffc6acaada4ba68"
+  dependencies:
+    acorn "^3.1.0"
+
+acorn@^3.0.4, acorn@^3.1.0, acorn@^3.3.0:
+  version "3.3.0"
+  resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a"
+
+acorn@^4.0.3:
+  version "4.0.13"
+  resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787"
+
+acorn@^5.0.0, acorn@^5.0.3, acorn@^5.2.1, acorn@^5.3.0, acorn@^5.4.0, acorn@^5.4.1:
+  version "5.5.0"
+  resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.5.0.tgz#1abb587fbf051f94e3de20e6b26ef910b1828298"
+
+addressparser@1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/addressparser/-/addressparser-1.0.1.tgz#47afbe1a2a9262191db6838e4fd1d39b40821746"
+
+after@0.8.2:
+  version "0.8.2"
+  resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f"
+
+agent-base@2:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-2.1.1.tgz#d6de10d5af6132d5bd692427d46fc538539094c7"
+  dependencies:
+    extend "~3.0.0"
+    semver "~5.0.1"
+
+ajv-keywords@^2.1.0:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762"
+
+ajv-keywords@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.1.0.tgz#ac2b27939c543e95d2c06e7f7f5c27be4aa543be"
+
+ajv@^4.9.1:
+  version "4.11.8"
+  resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536"
+  dependencies:
+    co "^4.6.0"
+    json-stable-stringify "^1.0.1"
+
+ajv@^5.1.0, ajv@^5.2.3, ajv@^5.3.0:
+  version "5.5.2"
+  resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965"
+  dependencies:
+    co "^4.6.0"
+    fast-deep-equal "^1.0.0"
+    fast-json-stable-stringify "^2.0.0"
+    json-schema-traverse "^0.3.0"
+
+ajv@^6.1.0:
+  version "6.2.0"
+  resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.2.0.tgz#afac295bbaa0152449e522742e4547c1ae9328d2"
+  dependencies:
+    fast-deep-equal "^1.0.0"
+    fast-json-stable-stringify "^2.0.0"
+    json-schema-traverse "^0.3.0"
+
+align-text@^0.1.1, align-text@^0.1.3:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117"
+  dependencies:
+    kind-of "^3.0.2"
+    longest "^1.0.1"
+    repeat-string "^1.5.2"
+
+amdefine@>=0.0.4:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5"
+
+amqplib@^0.5.2:
+  version "0.5.2"
+  resolved "https://registry.yarnpkg.com/amqplib/-/amqplib-0.5.2.tgz#d2d7313c7ffaa4d10bcf1e6252de4591b6cc7b63"
+  dependencies:
+    bitsyntax "~0.0.4"
+    bluebird "^3.4.6"
+    buffer-more-ints "0.0.2"
+    readable-stream "1.x >=1.1.9"
+    safe-buffer "^5.0.1"
+
+ansi-escapes@^1.1.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e"
+
+ansi-escapes@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.0.0.tgz#ec3e8b4e9f8064fc02c3ac9b65f1c275bda8ef92"
+
+ansi-regex@^2.0.0:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
+
+ansi-regex@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998"
+
+ansi-styles@^2.2.1:
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
+
+ansi-styles@^3.2.0, ansi-styles@^3.2.1:
+  version "3.2.1"
+  resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
+  dependencies:
+    color-convert "^1.9.0"
+
+anymatch@^1.3.0:
+  version "1.3.2"
+  resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a"
+  dependencies:
+    micromatch "^2.1.5"
+    normalize-path "^2.0.0"
+
+anymatch@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb"
+  dependencies:
+    micromatch "^3.1.4"
+    normalize-path "^2.1.1"
+
+append-transform@^0.4.0:
+  version "0.4.0"
+  resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-0.4.0.tgz#d76ebf8ca94d276e247a36bad44a4b74ab611991"
+  dependencies:
+    default-require-extensions "^1.0.0"
+
+aproba@^1.0.3, aproba@^1.1.1:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
+
+are-we-there-yet@~1.1.2:
+  version "1.1.4"
+  resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d"
+  dependencies:
+    delegates "^1.0.0"
+    readable-stream "^2.0.6"
+
+argparse@^1.0.7:
+  version "1.0.10"
+  resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
+  dependencies:
+    sprintf-js "~1.0.2"
+
+arr-diff@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf"
+  dependencies:
+    arr-flatten "^1.0.1"
+
+arr-diff@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520"
+
+arr-flatten@^1.0.1, arr-flatten@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1"
+
+arr-union@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4"
+
+array-equal@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93"
+
+array-filter@~0.0.0:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec"
+
+array-map@~0.0.0:
+  version "0.0.0"
+  resolved "https://registry.yarnpkg.com/array-map/-/array-map-0.0.0.tgz#88a2bab73d1cf7bcd5c1b118a003f66f665fa662"
+
+array-reduce@~0.0.0:
+  version "0.0.0"
+  resolved "https://registry.yarnpkg.com/array-reduce/-/array-reduce-0.0.0.tgz#173899d3ffd1c7d9383e4479525dbe278cab5f2b"
+
+array-slice@^0.2.3:
+  version "0.2.3"
+  resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5"
+
+array-union@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39"
+  dependencies:
+    array-uniq "^1.0.1"
+
+array-uniq@^1.0.1:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6"
+
+array-unique@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53"
+
+array-unique@^0.3.2:
+  version "0.3.2"
+  resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"
+
+arraybuffer.slice@~0.0.7:
+  version "0.0.7"
+  resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz#3bbc4275dd584cc1b10809b89d4e8b63a69e7675"
+
+arrify@^1.0.0, arrify@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
+
+asn1.js@^4.0.0:
+  version "4.10.1"
+  resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0"
+  dependencies:
+    bn.js "^4.0.0"
+    inherits "^2.0.1"
+    minimalistic-assert "^1.0.0"
+
+asn1@~0.2.3:
+  version "0.2.3"
+  resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86"
+
+assert-plus@1.0.0, assert-plus@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
+
+assert-plus@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234"
+
+assert@^1.1.1, assert@^1.4.0:
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91"
+  dependencies:
+    util "0.10.3"
+
+assign-symbols@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
+
+ast-types@0.x.x:
+  version "0.11.2"
+  resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.11.2.tgz#cc4e1d15a36b39979a1986fe1e91321cbfae7783"
+
+astral-regex@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9"
+
+astw@^2.0.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/astw/-/astw-2.2.0.tgz#7bd41784d32493987aeb239b6b4e1c57a873b917"
+  dependencies:
+    acorn "^4.0.3"
+
+async-each@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d"
+
+async-limiter@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8"
+
+async@^1.4.0:
+  version "1.5.2"
+  resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
+
+async@^2.0.0, async@^2.1.2, async@^2.1.4:
+  version "2.6.0"
+  resolved "https://registry.yarnpkg.com/async/-/async-2.6.0.tgz#61a29abb6fcc026fea77e56d1c6ec53a795951f4"
+  dependencies:
+    lodash "^4.14.0"
+
+async@~2.1.2:
+  version "2.1.5"
+  resolved "https://registry.yarnpkg.com/async/-/async-2.1.5.tgz#e587c68580994ac67fc56ff86d3ac56bdbe810bc"
+  dependencies:
+    lodash "^4.14.0"
+
+asynckit@^0.4.0:
+  version "0.4.0"
+  resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
+
+atob@^2.0.0:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/atob/-/atob-2.0.3.tgz#19c7a760473774468f20b2d2d03372ad7d4cbf5d"
+
+aws-sign2@~0.6.0:
+  version "0.6.0"
+  resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f"
+
+aws-sign2@~0.7.0:
+  version "0.7.0"
+  resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8"
+
+aws4@^1.2.1, aws4@^1.6.0:
+  version "1.6.0"
+  resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e"
+
+axios@^0.15.3:
+  version "0.15.3"
+  resolved "https://registry.yarnpkg.com/axios/-/axios-0.15.3.tgz#2c9d638b2e191a08ea1d6cc988eadd6ba5bdc053"
+  dependencies:
+    follow-redirects "1.0.0"
+
+babel-code-frame@^6.22.0, babel-code-frame@^6.26.0:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b"
+  dependencies:
+    chalk "^1.1.3"
+    esutils "^2.0.2"
+    js-tokens "^3.0.2"
+
+babel-core@^6.0.0, babel-core@^6.26.0:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.0.tgz#af32f78b31a6fcef119c87b0fd8d9753f03a0bb8"
+  dependencies:
+    babel-code-frame "^6.26.0"
+    babel-generator "^6.26.0"
+    babel-helpers "^6.24.1"
+    babel-messages "^6.23.0"
+    babel-register "^6.26.0"
+    babel-runtime "^6.26.0"
+    babel-template "^6.26.0"
+    babel-traverse "^6.26.0"
+    babel-types "^6.26.0"
+    babylon "^6.18.0"
+    convert-source-map "^1.5.0"
+    debug "^2.6.8"
+    json5 "^0.5.1"
+    lodash "^4.17.4"
+    minimatch "^3.0.4"
+    path-is-absolute "^1.0.1"
+    private "^0.1.7"
+    slash "^1.0.0"
+    source-map "^0.5.6"
+
+babel-generator@^6.18.0, babel-generator@^6.26.0:
+  version "6.26.1"
+  resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90"
+  dependencies:
+    babel-messages "^6.23.0"
+    babel-runtime "^6.26.0"
+    babel-types "^6.26.0"
+    detect-indent "^4.0.0"
+    jsesc "^1.3.0"
+    lodash "^4.17.4"
+    source-map "^0.5.7"
+    trim-right "^1.0.1"
+
+babel-helpers@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2"
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+
+babel-jest@^22.4.1:
+  version "22.4.1"
+  resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-22.4.1.tgz#ff53ebca45957347f27ff4666a31499fbb4c4ddd"
+  dependencies:
+    babel-plugin-istanbul "^4.1.5"
+    babel-preset-jest "^22.4.1"
+
+babel-messages@^6.23.0:
+  version "6.23.0"
+  resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e"
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-istanbul@^4.1.5:
+  version "4.1.5"
+  resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.5.tgz#6760cdd977f411d3e175bb064f2bc327d99b2b6e"
+  dependencies:
+    find-up "^2.1.0"
+    istanbul-lib-instrument "^1.7.5"
+    test-exclude "^4.1.1"
+
+babel-plugin-jest-hoist@^22.4.1:
+  version "22.4.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-22.4.1.tgz#d712fe5da8b6965f3191dacddbefdbdf4fb66d63"
+
+babel-plugin-syntax-object-rest-spread@^6.13.0:
+  version "6.13.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5"
+
+babel-preset-jest@^22.4.1:
+  version "22.4.1"
+  resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-22.4.1.tgz#efa2e5f5334242a9457a068452d7d09735db172a"
+  dependencies:
+    babel-plugin-jest-hoist "^22.4.1"
+    babel-plugin-syntax-object-rest-spread "^6.13.0"
+
+babel-register@^6.26.0:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071"
+  dependencies:
+    babel-core "^6.26.0"
+    babel-runtime "^6.26.0"
+    core-js "^2.5.0"
+    home-or-tmp "^2.0.0"
+    lodash "^4.17.4"
+    mkdirp "^0.5.1"
+    source-map-support "^0.4.15"
+
+babel-runtime@^6.0.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
+  dependencies:
+    core-js "^2.4.0"
+    regenerator-runtime "^0.11.0"
+
+babel-template@^6.16.0, babel-template@^6.24.1, babel-template@^6.26.0:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02"
+  dependencies:
+    babel-runtime "^6.26.0"
+    babel-traverse "^6.26.0"
+    babel-types "^6.26.0"
+    babylon "^6.18.0"
+    lodash "^4.17.4"
+
+babel-traverse@^6.18.0, babel-traverse@^6.26.0:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee"
+  dependencies:
+    babel-code-frame "^6.26.0"
+    babel-messages "^6.23.0"
+    babel-runtime "^6.26.0"
+    babel-types "^6.26.0"
+    babylon "^6.18.0"
+    debug "^2.6.8"
+    globals "^9.18.0"
+    invariant "^2.2.2"
+    lodash "^4.17.4"
+
+babel-types@^6.18.0, babel-types@^6.26.0:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497"
+  dependencies:
+    babel-runtime "^6.26.0"
+    esutils "^2.0.2"
+    lodash "^4.17.4"
+    to-fast-properties "^1.0.3"
+
+babylon@^6.18.0:
+  version "6.18.0"
+  resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3"
+
+backo2@1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947"
+
+balanced-match@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
+
+base64-arraybuffer@0.1.5:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8"
+
+base64-js@^1.0.2:
+  version "1.2.3"
+  resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.3.tgz#fb13668233d9614cf5fb4bce95a9ba4096cdf801"
+
+base64id@1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/base64id/-/base64id-1.0.0.tgz#47688cb99bb6804f0e06d3e763b1c32e57d8e6b6"
+
+base@^0.11.1:
+  version "0.11.2"
+  resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f"
+  dependencies:
+    cache-base "^1.0.1"
+    class-utils "^0.3.5"
+    component-emitter "^1.2.1"
+    define-property "^1.0.0"
+    isobject "^3.0.1"
+    mixin-deep "^1.2.0"
+    pascalcase "^0.1.1"
+
+bcrypt-pbkdf@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d"
+  dependencies:
+    tweetnacl "^0.14.3"
+
+better-assert@~1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/better-assert/-/better-assert-1.0.2.tgz#40866b9e1b9e0b55b481894311e68faffaebc522"
+  dependencies:
+    callsite "1.0.0"
+
+big.js@^3.1.3:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e"
+
+binary-extensions@^1.0.0:
+  version "1.11.0"
+  resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205"
+
+bitsyntax@~0.0.4:
+  version "0.0.4"
+  resolved "https://registry.yarnpkg.com/bitsyntax/-/bitsyntax-0.0.4.tgz#eb10cc6f82b8c490e3e85698f07e83d46e0cba82"
+  dependencies:
+    buffer-more-ints "0.0.2"
+
+bl@~1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/bl/-/bl-1.1.2.tgz#fdca871a99713aa00d19e3bbba41c44787a65398"
+  dependencies:
+    readable-stream "~2.0.5"
+
+blob@0.0.4:
+  version "0.0.4"
+  resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.4.tgz#bcf13052ca54463f30f9fc7e95b9a47630a94921"
+
+block-stream@*:
+  version "0.0.9"
+  resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a"
+  dependencies:
+    inherits "~2.0.0"
+
+bluebird@^3.3.0, bluebird@^3.4.6, bluebird@^3.5.0, bluebird@^3.5.1:
+  version "3.5.1"
+  resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9"
+
+bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0:
+  version "4.11.8"
+  resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f"
+
+body-parser@^1.16.1:
+  version "1.18.2"
+  resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.2.tgz#87678a19d84b47d859b83199bd59bce222b10454"
+  dependencies:
+    bytes "3.0.0"
+    content-type "~1.0.4"
+    debug "2.6.9"
+    depd "~1.1.1"
+    http-errors "~1.6.2"
+    iconv-lite "0.4.19"
+    on-finished "~2.3.0"
+    qs "6.5.1"
+    raw-body "2.3.2"
+    type-is "~1.6.15"
+
+boom@2.x.x:
+  version "2.10.1"
+  resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f"
+  dependencies:
+    hoek "2.x.x"
+
+boom@4.x.x:
+  version "4.3.1"
+  resolved "https://registry.yarnpkg.com/boom/-/boom-4.3.1.tgz#4f8a3005cb4a7e3889f749030fd25b96e01d2e31"
+  dependencies:
+    hoek "4.x.x"
+
+boom@5.x.x:
+  version "5.2.0"
+  resolved "https://registry.yarnpkg.com/boom/-/boom-5.2.0.tgz#5dd9da6ee3a5f302077436290cb717d3f4a54e02"
+  dependencies:
+    hoek "4.x.x"
+
+brace-expansion@^1.1.7:
+  version "1.1.11"
+  resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
+  dependencies:
+    balanced-match "^1.0.0"
+    concat-map "0.0.1"
+
+braces@^0.1.2:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/braces/-/braces-0.1.5.tgz#c085711085291d8b75fdd74eab0f8597280711e6"
+  dependencies:
+    expand-range "^0.1.0"
+
+braces@^1.8.2:
+  version "1.8.5"
+  resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7"
+  dependencies:
+    expand-range "^1.8.1"
+    preserve "^0.2.0"
+    repeat-element "^1.1.2"
+
+braces@^2.3.0, braces@^2.3.1:
+  version "2.3.1"
+  resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.1.tgz#7086c913b4e5a08dbe37ac0ee6a2500c4ba691bb"
+  dependencies:
+    arr-flatten "^1.1.0"
+    array-unique "^0.3.2"
+    define-property "^1.0.0"
+    extend-shallow "^2.0.1"
+    fill-range "^4.0.0"
+    isobject "^3.0.1"
+    kind-of "^6.0.2"
+    repeat-element "^1.1.2"
+    snapdragon "^0.8.1"
+    snapdragon-node "^2.0.1"
+    split-string "^3.0.2"
+    to-regex "^3.0.1"
+
+brorand@^1.0.1:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
+
+browser-pack@^6.0.1:
+  version "6.0.4"
+  resolved "https://registry.yarnpkg.com/browser-pack/-/browser-pack-6.0.4.tgz#9a73beb3b48f9e36868be007b64400102c04a99f"
+  dependencies:
+    JSONStream "^1.0.3"
+    combine-source-map "~0.8.0"
+    defined "^1.0.0"
+    safe-buffer "^5.1.1"
+    through2 "^2.0.0"
+    umd "^3.0.0"
+
+browser-process-hrtime@^0.1.2:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz#425d68a58d3447f02a04aa894187fce8af8b7b8e"
+
+browser-resolve@^1.11.0, browser-resolve@^1.11.2, browser-resolve@^1.7.0:
+  version "1.11.2"
+  resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b32e48f442938ce"
+  dependencies:
+    resolve "1.1.7"
+
+browserify-aes@^1.0.0, browserify-aes@^1.0.4:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.1.1.tgz#38b7ab55edb806ff2dcda1a7f1620773a477c49f"
+  dependencies:
+    buffer-xor "^1.0.3"
+    cipher-base "^1.0.0"
+    create-hash "^1.1.0"
+    evp_bytestokey "^1.0.3"
+    inherits "^2.0.1"
+    safe-buffer "^5.0.1"
+
+browserify-cipher@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.0.tgz#9988244874bf5ed4e28da95666dcd66ac8fc363a"
+  dependencies:
+    browserify-aes "^1.0.4"
+    browserify-des "^1.0.0"
+    evp_bytestokey "^1.0.0"
+
+browserify-des@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.0.tgz#daa277717470922ed2fe18594118a175439721dd"
+  dependencies:
+    cipher-base "^1.0.1"
+    des.js "^1.0.0"
+    inherits "^2.0.1"
+
+browserify-rsa@^4.0.0:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524"
+  dependencies:
+    bn.js "^4.1.0"
+    randombytes "^2.0.1"
+
+browserify-sign@^4.0.0:
+  version "4.0.4"
+  resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298"
+  dependencies:
+    bn.js "^4.1.1"
+    browserify-rsa "^4.0.0"
+    create-hash "^1.1.0"
+    create-hmac "^1.1.2"
+    elliptic "^6.0.0"
+    inherits "^2.0.1"
+    parse-asn1 "^5.0.0"
+
+browserify-zlib@^0.2.0, browserify-zlib@~0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f"
+  dependencies:
+    pako "~1.0.5"
+
+browserify@^14.5.0:
+  version "14.5.0"
+  resolved "https://registry.yarnpkg.com/browserify/-/browserify-14.5.0.tgz#0bbbce521acd6e4d1d54d8e9365008efb85a9cc5"
+  dependencies:
+    JSONStream "^1.0.3"
+    assert "^1.4.0"
+    browser-pack "^6.0.1"
+    browser-resolve "^1.11.0"
+    browserify-zlib "~0.2.0"
+    buffer "^5.0.2"
+    cached-path-relative "^1.0.0"
+    concat-stream "~1.5.1"
+    console-browserify "^1.1.0"
+    constants-browserify "~1.0.0"
+    crypto-browserify "^3.0.0"
+    defined "^1.0.0"
+    deps-sort "^2.0.0"
+    domain-browser "~1.1.0"
+    duplexer2 "~0.1.2"
+    events "~1.1.0"
+    glob "^7.1.0"
+    has "^1.0.0"
+    htmlescape "^1.1.0"
+    https-browserify "^1.0.0"
+    inherits "~2.0.1"
+    insert-module-globals "^7.0.0"
+    labeled-stream-splicer "^2.0.0"
+    module-deps "^4.0.8"
+    os-browserify "~0.3.0"
+    parents "^1.0.1"
+    path-browserify "~0.0.0"
+    process "~0.11.0"
+    punycode "^1.3.2"
+    querystring-es3 "~0.2.0"
+    read-only-stream "^2.0.0"
+    readable-stream "^2.0.2"
+    resolve "^1.1.4"
+    shasum "^1.0.0"
+    shell-quote "^1.6.1"
+    stream-browserify "^2.0.0"
+    stream-http "^2.0.0"
+    string_decoder "~1.0.0"
+    subarg "^1.0.0"
+    syntax-error "^1.1.1"
+    through2 "^2.0.0"
+    timers-browserify "^1.0.1"
+    tty-browserify "~0.0.0"
+    url "~0.11.0"
+    util "~0.10.1"
+    vm-browserify "~0.0.1"
+    xtend "^4.0.0"
+
+bser@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719"
+  dependencies:
+    node-int64 "^0.4.0"
+
+buble-loader@^0.4.1:
+  version "0.4.1"
+  resolved "https://registry.yarnpkg.com/buble-loader/-/buble-loader-0.4.1.tgz#45a4fe43ccc500835e99ae38ef17df4390ca66b9"
+  dependencies:
+    buble "^0.15.0"
+    loader-utils "^0.2.15"
+    webpack "*"
+
+buble@^0.15.0:
+  version "0.15.2"
+  resolved "https://registry.yarnpkg.com/buble/-/buble-0.15.2.tgz#547fc47483f8e5e8176d82aa5ebccb183b02d613"
+  dependencies:
+    acorn "^3.3.0"
+    acorn-jsx "^3.0.1"
+    acorn-object-spread "^1.0.0"
+    chalk "^1.1.3"
+    magic-string "^0.14.0"
+    minimist "^1.2.0"
+    os-homedir "^1.0.1"
+
+buble@^0.19.1, buble@^0.19.2:
+  version "0.19.3"
+  resolved "https://registry.yarnpkg.com/buble/-/buble-0.19.3.tgz#01e9412062cff1da6f20342b6ecd72e7bf699d02"
+  dependencies:
+    acorn "^5.4.1"
+    acorn-dynamic-import "^3.0.0"
+    acorn-jsx "^4.1.1"
+    chalk "^2.3.1"
+    magic-string "^0.22.4"
+    minimist "^1.2.0"
+    os-homedir "^1.0.1"
+    vlq "^1.0.0"
+
+buffer-more-ints@0.0.2:
+  version "0.0.2"
+  resolved "https://registry.yarnpkg.com/buffer-more-ints/-/buffer-more-ints-0.0.2.tgz#26b3885d10fa13db7fc01aae3aab870199e0124c"
+
+buffer-xor@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9"
+
+buffer@^4.3.0:
+  version "4.9.1"
+  resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298"
+  dependencies:
+    base64-js "^1.0.2"
+    ieee754 "^1.1.4"
+    isarray "^1.0.0"
+
+buffer@^5.0.2:
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.1.0.tgz#c913e43678c7cb7c8bd16afbcddb6c5505e8f9fe"
+  dependencies:
+    base64-js "^1.0.2"
+    ieee754 "^1.1.4"
+
+buildmail@4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/buildmail/-/buildmail-4.0.1.tgz#877f7738b78729871c9a105e3b837d2be11a7a72"
+  dependencies:
+    addressparser "1.0.1"
+    libbase64 "0.1.0"
+    libmime "3.0.0"
+    libqp "1.1.0"
+    nodemailer-fetch "1.6.0"
+    nodemailer-shared "1.1.0"
+    punycode "1.4.1"
+
+builtin-modules@^1.0.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f"
+
+builtin-status-codes@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
+
+bytes@3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048"
+
+cacache@^10.0.1:
+  version "10.0.4"
+  resolved "https://registry.yarnpkg.com/cacache/-/cacache-10.0.4.tgz#6452367999eff9d4188aefd9a14e9d7c6a263460"
+  dependencies:
+    bluebird "^3.5.1"
+    chownr "^1.0.1"
+    glob "^7.1.2"
+    graceful-fs "^4.1.11"
+    lru-cache "^4.1.1"
+    mississippi "^2.0.0"
+    mkdirp "^0.5.1"
+    move-concurrently "^1.0.1"
+    promise-inflight "^1.0.1"
+    rimraf "^2.6.2"
+    ssri "^5.2.4"
+    unique-filename "^1.1.0"
+    y18n "^4.0.0"
+
+cache-base@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2"
+  dependencies:
+    collection-visit "^1.0.0"
+    component-emitter "^1.2.1"
+    get-value "^2.0.6"
+    has-value "^1.0.0"
+    isobject "^3.0.1"
+    set-value "^2.0.0"
+    to-object-path "^0.3.0"
+    union-value "^1.0.0"
+    unset-value "^1.0.0"
+
+cacheable-request@^2.1.1:
+  version "2.1.4"
+  resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-2.1.4.tgz#0d808801b6342ad33c91df9d0b44dc09b91e5c3d"
+  dependencies:
+    clone-response "1.0.2"
+    get-stream "3.0.0"
+    http-cache-semantics "3.8.1"
+    keyv "3.0.0"
+    lowercase-keys "1.0.0"
+    normalize-url "2.0.1"
+    responselike "1.0.2"
+
+cached-path-relative@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/cached-path-relative/-/cached-path-relative-1.0.1.tgz#d09c4b52800aa4c078e2dd81a869aac90d2e54e7"
+
+caller-path@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f"
+  dependencies:
+    callsites "^0.2.0"
+
+callsite@1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20"
+
+callsites@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca"
+
+callsites@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50"
+
+camelcase@^1.0.2:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39"
+
+camelcase@^4.1.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd"
+
+caseless@~0.11.0:
+  version "0.11.0"
+  resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7"
+
+caseless@~0.12.0:
+  version "0.12.0"
+  resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
+
+center-align@^0.1.1:
+  version "0.1.3"
+  resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad"
+  dependencies:
+    align-text "^0.1.3"
+    lazy-cache "^1.0.3"
+
+chalk@^1.1.1, chalk@^1.1.3:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
+  dependencies:
+    ansi-styles "^2.2.1"
+    escape-string-regexp "^1.0.2"
+    has-ansi "^2.0.0"
+    strip-ansi "^3.0.0"
+    supports-color "^2.0.0"
+
+chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.3.1:
+  version "2.3.2"
+  resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.2.tgz#250dc96b07491bfd601e648d66ddf5f60c7a5c65"
+  dependencies:
+    ansi-styles "^3.2.1"
+    escape-string-regexp "^1.0.5"
+    supports-color "^5.3.0"
+
+chardet@^0.4.0:
+  version "0.4.2"
+  resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2"
+
+chokidar@^1.4.1:
+  version "1.7.0"
+  resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468"
+  dependencies:
+    anymatch "^1.3.0"
+    async-each "^1.0.0"
+    glob-parent "^2.0.0"
+    inherits "^2.0.1"
+    is-binary-path "^1.0.0"
+    is-glob "^2.0.0"
+    path-is-absolute "^1.0.0"
+    readdirp "^2.0.0"
+  optionalDependencies:
+    fsevents "^1.0.0"
+
+chokidar@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.2.tgz#4dc65139eeb2714977735b6a35d06e97b494dfd7"
+  dependencies:
+    anymatch "^2.0.0"
+    async-each "^1.0.0"
+    braces "^2.3.0"
+    glob-parent "^3.1.0"
+    inherits "^2.0.1"
+    is-binary-path "^1.0.0"
+    is-glob "^4.0.0"
+    normalize-path "^2.1.1"
+    path-is-absolute "^1.0.0"
+    readdirp "^2.0.0"
+    upath "^1.0.0"
+  optionalDependencies:
+    fsevents "^1.0.0"
+
+chownr@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181"
+
+chrome-trace-event@^0.1.1:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-0.1.2.tgz#90f36885d5345a50621332f0717b595883d5d982"
+
+ci-info@^1.0.0:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.1.2.tgz#03561259db48d0474c8bdc90f5b47b068b6bbfb4"
+
+cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de"
+  dependencies:
+    inherits "^2.0.1"
+    safe-buffer "^5.0.1"
+
+circular-json@^0.3.1:
+  version "0.3.3"
+  resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66"
+
+circular-json@^0.5.1:
+  version "0.5.1"
+  resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.5.1.tgz#b8942a09e535863dc21b04417a91971e1d9cd91f"
+
+class-utils@^0.3.5:
+  version "0.3.6"
+  resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463"
+  dependencies:
+    arr-union "^3.1.0"
+    define-property "^0.2.5"
+    isobject "^3.0.0"
+    static-extend "^0.1.1"
+
+cli-cursor@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5"
+  dependencies:
+    restore-cursor "^2.0.0"
+
+cli-width@^2.0.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639"
+
+cliui@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1"
+  dependencies:
+    center-align "^0.1.1"
+    right-align "^0.1.1"
+    wordwrap "0.0.2"
+
+cliui@^3.2.0:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d"
+  dependencies:
+    string-width "^1.0.1"
+    strip-ansi "^3.0.1"
+    wrap-ansi "^2.0.0"
+
+cliui@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.0.0.tgz#743d4650e05f36d1ed2575b59638d87322bfbbcc"
+  dependencies:
+    string-width "^2.1.1"
+    strip-ansi "^4.0.0"
+    wrap-ansi "^2.0.0"
+
+clone-response@1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b"
+  dependencies:
+    mimic-response "^1.0.0"
+
+co@^4.6.0:
+  version "4.6.0"
+  resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
+
+co@~3.0.6:
+  version "3.0.6"
+  resolved "https://registry.yarnpkg.com/co/-/co-3.0.6.tgz#1445f226c5eb956138e68c9ac30167ea7d2e6bda"
+
+code-point-at@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
+
+collection-visit@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0"
+  dependencies:
+    map-visit "^1.0.0"
+    object-visit "^1.0.0"
+
+color-convert@^1.9.0:
+  version "1.9.1"
+  resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.1.tgz#c1261107aeb2f294ebffec9ed9ecad529a6097ed"
+  dependencies:
+    color-name "^1.1.1"
+
+color-name@^1.1.1:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
+
+colors@^1.1.0:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63"
+
+combine-lists@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/combine-lists/-/combine-lists-1.0.1.tgz#458c07e09e0d900fc28b70a3fec2dacd1d2cb7f6"
+  dependencies:
+    lodash "^4.5.0"
+
+combine-source-map@~0.7.1:
+  version "0.7.2"
+  resolved "https://registry.yarnpkg.com/combine-source-map/-/combine-source-map-0.7.2.tgz#0870312856b307a87cc4ac486f3a9a62aeccc09e"
+  dependencies:
+    convert-source-map "~1.1.0"
+    inline-source-map "~0.6.0"
+    lodash.memoize "~3.0.3"
+    source-map "~0.5.3"
+
+combine-source-map@~0.8.0:
+  version "0.8.0"
+  resolved "https://registry.yarnpkg.com/combine-source-map/-/combine-source-map-0.8.0.tgz#a58d0df042c186fcf822a8e8015f5450d2d79a8b"
+  dependencies:
+    convert-source-map "~1.1.0"
+    inline-source-map "~0.6.0"
+    lodash.memoize "~3.0.3"
+    source-map "~0.5.3"
+
+combined-stream@1.0.6, combined-stream@^1.0.5, combined-stream@~1.0.5:
+  version "1.0.6"
+  resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818"
+  dependencies:
+    delayed-stream "~1.0.0"
+
+commander@^2.9.0, commander@~2.14.1:
+  version "2.14.1"
+  resolved "https://registry.yarnpkg.com/commander/-/commander-2.14.1.tgz#2235123e37af8ca3c65df45b026dbd357b01b9aa"
+
+commander@~2.13.0:
+  version "2.13.0"
+  resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c"
+
+commondir@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
+
+component-bind@1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1"
+
+component-emitter@1.2.1, component-emitter@^1.2.1:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6"
+
+component-inherit@0.0.3:
+  version "0.0.3"
+  resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143"
+
+concat-map@0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+
+concat-stream@^1.5.0, concat-stream@^1.6.0:
+  version "1.6.1"
+  resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.1.tgz#261b8f518301f1d834e36342b9fea095d2620a26"
+  dependencies:
+    inherits "^2.0.3"
+    readable-stream "^2.2.2"
+    typedarray "^0.0.6"
+
+concat-stream@~1.5.0, concat-stream@~1.5.1:
+  version "1.5.2"
+  resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.5.2.tgz#708978624d856af41a5a741defdd261da752c266"
+  dependencies:
+    inherits "~2.0.1"
+    readable-stream "~2.0.0"
+    typedarray "~0.0.5"
+
+connect@^3.6.0:
+  version "3.6.6"
+  resolved "https://registry.yarnpkg.com/connect/-/connect-3.6.6.tgz#09eff6c55af7236e137135a72574858b6786f524"
+  dependencies:
+    debug "2.6.9"
+    finalhandler "1.1.0"
+    parseurl "~1.3.2"
+    utils-merge "1.0.1"
+
+console-browserify@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10"
+  dependencies:
+    date-now "^0.1.4"
+
+console-control-strings@^1.0.0, console-control-strings@~1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
+
+constants-browserify@^1.0.0, constants-browserify@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75"
+
+content-type-parser@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/content-type-parser/-/content-type-parser-1.0.2.tgz#caabe80623e63638b2502fd4c7f12ff4ce2352e7"
+
+content-type@~1.0.4:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
+
+convert-source-map@^1.4.0, convert-source-map@^1.5.0:
+  version "1.5.1"
+  resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5"
+
+convert-source-map@~1.1.0:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.1.3.tgz#4829c877e9fe49b3161f3bf3673888e204699860"
+
+cookie@0.3.1:
+  version "0.3.1"
+  resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb"
+
+copy-concurrently@^1.0.0:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0"
+  dependencies:
+    aproba "^1.1.1"
+    fs-write-stream-atomic "^1.0.8"
+    iferr "^0.1.5"
+    mkdirp "^0.5.1"
+    rimraf "^2.5.4"
+    run-queue "^1.0.0"
+
+copy-descriptor@^0.1.0:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
+
+core-js@^2.2.0, core-js@^2.4.0, core-js@^2.5.0:
+  version "2.5.3"
+  resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.3.tgz#8acc38345824f16d8365b7c9b4259168e8ed603e"
+
+core-util-is@1.0.2, core-util-is@~1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
+
+create-ecdh@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.0.tgz#888c723596cdf7612f6498233eebd7a35301737d"
+  dependencies:
+    bn.js "^4.1.0"
+    elliptic "^6.0.0"
+
+create-hash@^1.1.0, create-hash@^1.1.2:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.1.3.tgz#606042ac8b9262750f483caddab0f5819172d8fd"
+  dependencies:
+    cipher-base "^1.0.1"
+    inherits "^2.0.1"
+    ripemd160 "^2.0.0"
+    sha.js "^2.4.0"
+
+create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4:
+  version "1.1.6"
+  resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.6.tgz#acb9e221a4e17bdb076e90657c42b93e3726cf06"
+  dependencies:
+    cipher-base "^1.0.3"
+    create-hash "^1.1.0"
+    inherits "^2.0.1"
+    ripemd160 "^2.0.0"
+    safe-buffer "^5.0.1"
+    sha.js "^2.4.8"
+
+cross-spawn@^5.0.1, cross-spawn@^5.1.0:
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449"
+  dependencies:
+    lru-cache "^4.0.1"
+    shebang-command "^1.2.0"
+    which "^1.2.9"
+
+cryptiles@2.x.x:
+  version "2.0.5"
+  resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8"
+  dependencies:
+    boom "2.x.x"
+
+cryptiles@3.x.x:
+  version "3.1.2"
+  resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-3.1.2.tgz#a89fbb220f5ce25ec56e8c4aa8a4fd7b5b0d29fe"
+  dependencies:
+    boom "5.x.x"
+
+crypto-browserify@^3.0.0, crypto-browserify@^3.11.0:
+  version "3.12.0"
+  resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec"
+  dependencies:
+    browserify-cipher "^1.0.0"
+    browserify-sign "^4.0.0"
+    create-ecdh "^4.0.0"
+    create-hash "^1.1.0"
+    create-hmac "^1.1.0"
+    diffie-hellman "^5.0.0"
+    inherits "^2.0.1"
+    pbkdf2 "^3.0.3"
+    public-encrypt "^4.0.0"
+    randombytes "^2.0.0"
+    randomfill "^1.0.3"
+
+cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0":
+  version "0.3.2"
+  resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.2.tgz#b8036170c79f07a90ff2f16e22284027a243848b"
+
+"cssstyle@>= 0.2.37 < 0.3.0":
+  version "0.2.37"
+  resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.2.37.tgz#541097234cb2513c83ceed3acddc27ff27987d54"
+  dependencies:
+    cssom "0.3.x"
+
+custom-event@~1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/custom-event/-/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5bfd0425"
+
+cyclist@~0.2.2:
+  version "0.2.2"
+  resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640"
+
+d@1:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f"
+  dependencies:
+    es5-ext "^0.10.9"
+
+dashdash@^1.12.0:
+  version "1.14.1"
+  resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
+  dependencies:
+    assert-plus "^1.0.0"
+
+data-uri-to-buffer@1:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-1.2.0.tgz#77163ea9c20d8641b4707e8f18abdf9a78f34835"
+
+date-format@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/date-format/-/date-format-1.2.0.tgz#615e828e233dd1ab9bb9ae0950e0ceccfa6ecad8"
+
+date-now@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b"
+
+debug@2, debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@~2.6.4, debug@~2.6.6:
+  version "2.6.9"
+  resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
+  dependencies:
+    ms "2.0.0"
+
+debug@^3.1.0, debug@~3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
+  dependencies:
+    ms "2.0.0"
+
+debug@~2.2.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da"
+  dependencies:
+    ms "0.7.1"
+
+decamelize@^1.0.0, decamelize@^1.1.1:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
+
+decode-uri-component@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
+
+decompress-response@^3.3.0:
+  version "3.3.0"
+  resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3"
+  dependencies:
+    mimic-response "^1.0.0"
+
+deep-extend@~0.4.0:
+  version "0.4.2"
+  resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f"
+
+deep-is@~0.1.3:
+  version "0.1.3"
+  resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
+
+default-require-extensions@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-1.0.0.tgz#f37ea15d3e13ffd9b437d33e1a75b5fb97874cb8"
+  dependencies:
+    strip-bom "^2.0.0"
+
+define-properties@^1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94"
+  dependencies:
+    foreach "^2.0.5"
+    object-keys "^1.0.8"
+
+define-property@^0.2.5:
+  version "0.2.5"
+  resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116"
+  dependencies:
+    is-descriptor "^0.1.0"
+
+define-property@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6"
+  dependencies:
+    is-descriptor "^1.0.0"
+
+define-property@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d"
+  dependencies:
+    is-descriptor "^1.0.2"
+    isobject "^3.0.1"
+
+defined@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693"
+
+degenerator@~1.0.2:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/degenerator/-/degenerator-1.0.4.tgz#fcf490a37ece266464d9cc431ab98c5819ced095"
+  dependencies:
+    ast-types "0.x.x"
+    escodegen "1.x.x"
+    esprima "3.x.x"
+
+del@^2.0.2:
+  version "2.2.2"
+  resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8"
+  dependencies:
+    globby "^5.0.0"
+    is-path-cwd "^1.0.0"
+    is-path-in-cwd "^1.0.0"
+    object-assign "^4.0.1"
+    pify "^2.0.0"
+    pinkie-promise "^2.0.0"
+    rimraf "^2.2.8"
+
+delayed-stream@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
+
+delegates@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
+
+depd@1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359"
+
+depd@~1.1.1:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
+
+deps-sort@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/deps-sort/-/deps-sort-2.0.0.tgz#091724902e84658260eb910748cccd1af6e21fb5"
+  dependencies:
+    JSONStream "^1.0.3"
+    shasum "^1.0.0"
+    subarg "^1.0.0"
+    through2 "^2.0.0"
+
+des.js@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc"
+  dependencies:
+    inherits "^2.0.1"
+    minimalistic-assert "^1.0.0"
+
+detect-indent@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208"
+  dependencies:
+    repeating "^2.0.0"
+
+detect-libc@^1.0.2:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
+
+detect-newline@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2"
+
+detective@^4.0.0:
+  version "4.7.1"
+  resolved "https://registry.yarnpkg.com/detective/-/detective-4.7.1.tgz#0eca7314338442febb6d65da54c10bb1c82b246e"
+  dependencies:
+    acorn "^5.2.1"
+    defined "^1.0.0"
+
+di@^0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c"
+
+diff@^3.2.0:
+  version "3.4.0"
+  resolved "https://registry.yarnpkg.com/diff/-/diff-3.4.0.tgz#b1d85507daf3964828de54b37d0d73ba67dda56c"
+
+diffie-hellman@^5.0.0:
+  version "5.0.2"
+  resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.2.tgz#b5835739270cfe26acf632099fded2a07f209e5e"
+  dependencies:
+    bn.js "^4.1.0"
+    miller-rabin "^4.0.0"
+    randombytes "^2.0.0"
+
+doctrine@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d"
+  dependencies:
+    esutils "^2.0.2"
+
+dom-serialize@^2.2.0:
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/dom-serialize/-/dom-serialize-2.2.1.tgz#562ae8999f44be5ea3076f5419dcd59eb43ac95b"
+  dependencies:
+    custom-event "~1.0.0"
+    ent "~2.2.0"
+    extend "^3.0.0"
+    void-elements "^2.0.0"
+
+domain-browser@^1.1.1:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda"
+
+domain-browser@~1.1.0:
+  version "1.1.7"
+  resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b21fdf8698bc"
+
+domexception@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90"
+  dependencies:
+    webidl-conversions "^4.0.2"
+
+double-ended-queue@^2.1.0-0:
+  version "2.1.0-0"
+  resolved "https://registry.yarnpkg.com/double-ended-queue/-/double-ended-queue-2.1.0-0.tgz#103d3527fd31528f40188130c841efdd78264e5c"
+
+duplexer2@^0.1.2, duplexer2@~0.1.0, duplexer2@~0.1.2:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1"
+  dependencies:
+    readable-stream "^2.0.2"
+
+duplexer3@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2"
+
+duplexify@^3.4.2, duplexify@^3.5.3:
+  version "3.5.4"
+  resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.5.4.tgz#4bb46c1796eabebeec4ca9a2e66b808cb7a3d8b4"
+  dependencies:
+    end-of-stream "^1.0.0"
+    inherits "^2.0.1"
+    readable-stream "^2.0.0"
+    stream-shift "^1.0.0"
+
+ecc-jsbn@~0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505"
+  dependencies:
+    jsbn "~0.1.0"
+
+ee-first@1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
+
+elliptic@^6.0.0:
+  version "6.4.0"
+  resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df"
+  dependencies:
+    bn.js "^4.4.0"
+    brorand "^1.0.1"
+    hash.js "^1.0.0"
+    hmac-drbg "^1.0.0"
+    inherits "^2.0.1"
+    minimalistic-assert "^1.0.0"
+    minimalistic-crypto-utils "^1.0.0"
+
+emojis-list@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389"
+
+encodeurl@~1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
+
+end-of-stream@^1.0.0, end-of-stream@^1.1.0:
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43"
+  dependencies:
+    once "^1.4.0"
+
+engine.io-client@~3.1.0:
+  version "3.1.5"
+  resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.1.5.tgz#85de17666560327ef1817978f6e3f8101ded2c47"
+  dependencies:
+    component-emitter "1.2.1"
+    component-inherit "0.0.3"
+    debug "~3.1.0"
+    engine.io-parser "~2.1.1"
+    has-cors "1.1.0"
+    indexof "0.0.1"
+    parseqs "0.0.5"
+    parseuri "0.0.5"
+    ws "~3.3.1"
+    xmlhttprequest-ssl "~1.5.4"
+    yeast "0.1.2"
+
+engine.io-parser@~2.1.0, engine.io-parser@~2.1.1:
+  version "2.1.2"
+  resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-2.1.2.tgz#4c0f4cff79aaeecbbdcfdea66a823c6085409196"
+  dependencies:
+    after "0.8.2"
+    arraybuffer.slice "~0.0.7"
+    base64-arraybuffer "0.1.5"
+    blob "0.0.4"
+    has-binary2 "~1.0.2"
+
+engine.io@~3.1.0:
+  version "3.1.5"
+  resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-3.1.5.tgz#0e7ef9d690eb0b35597f1d4ad02a26ca2dba3845"
+  dependencies:
+    accepts "~1.3.4"
+    base64id "1.0.0"
+    cookie "0.3.1"
+    debug "~3.1.0"
+    engine.io-parser "~2.1.0"
+    ws "~3.3.1"
+  optionalDependencies:
+    uws "~9.14.0"
+
+enhanced-resolve@^3.4.0:
+  version "3.4.1"
+  resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz#0421e339fd71419b3da13d129b3979040230476e"
+  dependencies:
+    graceful-fs "^4.1.2"
+    memory-fs "^0.4.0"
+    object-assign "^4.0.1"
+    tapable "^0.2.7"
+
+enhanced-resolve@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.0.0.tgz#e34a6eaa790f62fccd71d93959f56b2b432db10a"
+  dependencies:
+    graceful-fs "^4.1.2"
+    memory-fs "^0.4.0"
+    tapable "^1.0.0"
+
+ent@~2.2.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d"
+
+errno@^0.1.3, errno@~0.1.7:
+  version "0.1.7"
+  resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618"
+  dependencies:
+    prr "~1.0.1"
+
+error-ex@^1.2.0:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc"
+  dependencies:
+    is-arrayish "^0.2.1"
+
+es-abstract@^1.5.1:
+  version "1.10.0"
+  resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.10.0.tgz#1ecb36c197842a00d8ee4c2dfd8646bb97d60864"
+  dependencies:
+    es-to-primitive "^1.1.1"
+    function-bind "^1.1.1"
+    has "^1.0.1"
+    is-callable "^1.1.3"
+    is-regex "^1.0.4"
+
+es-to-primitive@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d"
+  dependencies:
+    is-callable "^1.1.1"
+    is-date-object "^1.0.1"
+    is-symbol "^1.0.1"
+
+es5-ext@^0.10.14, es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14:
+  version "0.10.39"
+  resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.39.tgz#fca21b67559277ca4ac1a1ed7048b107b6f76d87"
+  dependencies:
+    es6-iterator "~2.0.3"
+    es6-symbol "~3.1.1"
+
+es6-iterator@^2.0.1, es6-iterator@~2.0.1, es6-iterator@~2.0.3:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7"
+  dependencies:
+    d "1"
+    es5-ext "^0.10.35"
+    es6-symbol "^3.1.1"
+
+es6-map@^0.1.3:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0"
+  dependencies:
+    d "1"
+    es5-ext "~0.10.14"
+    es6-iterator "~2.0.1"
+    es6-set "~0.1.5"
+    es6-symbol "~3.1.1"
+    event-emitter "~0.3.5"
+
+es6-set@~0.1.5:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1"
+  dependencies:
+    d "1"
+    es5-ext "~0.10.14"
+    es6-iterator "~2.0.1"
+    es6-symbol "3.1.1"
+    event-emitter "~0.3.5"
+
+es6-symbol@3.1.1, es6-symbol@^3.1.1, es6-symbol@~3.1.1:
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77"
+  dependencies:
+    d "1"
+    es5-ext "~0.10.14"
+
+es6-weak-map@^2.0.1:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f"
+  dependencies:
+    d "1"
+    es5-ext "^0.10.14"
+    es6-iterator "^2.0.1"
+    es6-symbol "^3.1.1"
+
+escape-html@~1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
+
+escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+
+escodegen@1.x.x, escodegen@^1.9.0:
+  version "1.9.1"
+  resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.9.1.tgz#dbae17ef96c8e4bedb1356f4504fa4cc2f7cb7e2"
+  dependencies:
+    esprima "^3.1.3"
+    estraverse "^4.2.0"
+    esutils "^2.0.2"
+    optionator "^0.8.1"
+  optionalDependencies:
+    source-map "~0.6.1"
+
+escope@^3.6.0:
+  version "3.6.0"
+  resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3"
+  dependencies:
+    es6-map "^0.1.3"
+    es6-weak-map "^2.0.1"
+    esrecurse "^4.1.0"
+    estraverse "^4.1.1"
+
+eslint-scope@^3.7.1:
+  version "3.7.1"
+  resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8"
+  dependencies:
+    esrecurse "^4.1.0"
+    estraverse "^4.1.1"
+
+eslint-visitor-keys@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d"
+
+eslint@^4.17.0:
+  version "4.18.2"
+  resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.18.2.tgz#0f81267ad1012e7d2051e186a9004cc2267b8d45"
+  dependencies:
+    ajv "^5.3.0"
+    babel-code-frame "^6.22.0"
+    chalk "^2.1.0"
+    concat-stream "^1.6.0"
+    cross-spawn "^5.1.0"
+    debug "^3.1.0"
+    doctrine "^2.1.0"
+    eslint-scope "^3.7.1"
+    eslint-visitor-keys "^1.0.0"
+    espree "^3.5.2"
+    esquery "^1.0.0"
+    esutils "^2.0.2"
+    file-entry-cache "^2.0.0"
+    functional-red-black-tree "^1.0.1"
+    glob "^7.1.2"
+    globals "^11.0.1"
+    ignore "^3.3.3"
+    imurmurhash "^0.1.4"
+    inquirer "^3.0.6"
+    is-resolvable "^1.0.0"
+    js-yaml "^3.9.1"
+    json-stable-stringify-without-jsonify "^1.0.1"
+    levn "^0.3.0"
+    lodash "^4.17.4"
+    minimatch "^3.0.2"
+    mkdirp "^0.5.1"
+    natural-compare "^1.4.0"
+    optionator "^0.8.2"
+    path-is-inside "^1.0.2"
+    pluralize "^7.0.0"
+    progress "^2.0.0"
+    require-uncached "^1.0.3"
+    semver "^5.3.0"
+    strip-ansi "^4.0.0"
+    strip-json-comments "~2.0.1"
+    table "4.0.2"
+    text-table "~0.2.0"
+
+espree@^3.5.2:
+  version "3.5.3"
+  resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.3.tgz#931e0af64e7fbbed26b050a29daad1fc64799fa6"
+  dependencies:
+    acorn "^5.4.0"
+    acorn-jsx "^3.0.0"
+
+esprima@3.x.x, esprima@^3.1.3:
+  version "3.1.3"
+  resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633"
+
+esprima@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804"
+
+esquery@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.0.tgz#cfba8b57d7fba93f17298a8a006a04cda13d80fa"
+  dependencies:
+    estraverse "^4.0.0"
+
+esrecurse@^4.1.0:
+  version "4.2.1"
+  resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf"
+  dependencies:
+    estraverse "^4.1.0"
+
+estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0:
+  version "4.2.0"
+  resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13"
+
+estree-walker@^0.3.0:
+  version "0.3.1"
+  resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.3.1.tgz#e6b1a51cf7292524e7237c312e5fe6660c1ce1aa"
+
+esutils@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b"
+
+event-emitter@~0.3.5:
+  version "0.3.5"
+  resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39"
+  dependencies:
+    d "1"
+    es5-ext "~0.10.14"
+
+eventemitter3@1.x.x:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508"
+
+events@^1.0.0, events@~1.1.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924"
+
+evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02"
+  dependencies:
+    md5.js "^1.3.4"
+    safe-buffer "^5.1.1"
+
+exec-sh@^0.2.0:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.1.tgz#163b98a6e89e6b65b47c2a28d215bc1f63989c38"
+  dependencies:
+    merge "^1.1.3"
+
+execa@^0.7.0:
+  version "0.7.0"
+  resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777"
+  dependencies:
+    cross-spawn "^5.0.1"
+    get-stream "^3.0.0"
+    is-stream "^1.1.0"
+    npm-run-path "^2.0.0"
+    p-finally "^1.0.0"
+    signal-exit "^3.0.0"
+    strip-eof "^1.0.0"
+
+exists-sync@0.0.4:
+  version "0.0.4"
+  resolved "https://registry.yarnpkg.com/exists-sync/-/exists-sync-0.0.4.tgz#9744c2c428cc03b01060db454d4b12f0ef3c8879"
+
+exit@^0.1.2:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c"
+
+expand-braces@^0.1.1:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/expand-braces/-/expand-braces-0.1.2.tgz#488b1d1d2451cb3d3a6b192cfc030f44c5855fea"
+  dependencies:
+    array-slice "^0.2.3"
+    array-unique "^0.2.1"
+    braces "^0.1.2"
+
+expand-brackets@^0.1.4:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b"
+  dependencies:
+    is-posix-bracket "^0.1.0"
+
+expand-brackets@^2.1.4:
+  version "2.1.4"
+  resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622"
+  dependencies:
+    debug "^2.3.3"
+    define-property "^0.2.5"
+    extend-shallow "^2.0.1"
+    posix-character-classes "^0.1.0"
+    regex-not "^1.0.0"
+    snapdragon "^0.8.1"
+    to-regex "^3.0.1"
+
+expand-range@^0.1.0:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-0.1.1.tgz#4cb8eda0993ca56fa4f41fc42f3cbb4ccadff044"
+  dependencies:
+    is-number "^0.1.1"
+    repeat-string "^0.2.2"
+
+expand-range@^1.8.1:
+  version "1.8.2"
+  resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337"
+  dependencies:
+    fill-range "^2.1.0"
+
+expect@^22.4.0:
+  version "22.4.0"
+  resolved "https://registry.yarnpkg.com/expect/-/expect-22.4.0.tgz#371edf1ae15b83b5bf5ec34b42f1584660a36c16"
+  dependencies:
+    ansi-styles "^3.2.0"
+    jest-diff "^22.4.0"
+    jest-get-type "^22.1.0"
+    jest-matcher-utils "^22.4.0"
+    jest-message-util "^22.4.0"
+    jest-regex-util "^22.1.0"
+
+extend-shallow@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f"
+  dependencies:
+    is-extendable "^0.1.0"
+
+extend-shallow@^3.0.0, extend-shallow@^3.0.2:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8"
+  dependencies:
+    assign-symbols "^1.0.0"
+    is-extendable "^1.0.1"
+
+extend@3, extend@^3.0.0, extend@~3.0.0, extend@~3.0.1:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444"
+
+external-editor@^2.0.4:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.1.0.tgz#3d026a21b7f95b5726387d4200ac160d372c3b48"
+  dependencies:
+    chardet "^0.4.0"
+    iconv-lite "^0.4.17"
+    tmp "^0.0.33"
+
+extglob@^0.3.1:
+  version "0.3.2"
+  resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1"
+  dependencies:
+    is-extglob "^1.0.0"
+
+extglob@^2.0.4:
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543"
+  dependencies:
+    array-unique "^0.3.2"
+    define-property "^1.0.0"
+    expand-brackets "^2.1.4"
+    extend-shallow "^2.0.1"
+    fragment-cache "^0.2.1"
+    regex-not "^1.0.0"
+    snapdragon "^0.8.1"
+    to-regex "^3.0.1"
+
+extsprintf@1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05"
+
+extsprintf@^1.2.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f"
+
+fast-deep-equal@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614"
+
+fast-json-stable-stringify@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2"
+
+fast-levenshtein@~2.0.4:
+  version "2.0.6"
+  resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
+
+fb-watchman@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.0.tgz#54e9abf7dfa2f26cd9b1636c588c1afc05de5d58"
+  dependencies:
+    bser "^2.0.0"
+
+figures@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962"
+  dependencies:
+    escape-string-regexp "^1.0.5"
+
+file-entry-cache@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361"
+  dependencies:
+    flat-cache "^1.2.1"
+    object-assign "^4.0.1"
+
+file-uri-to-path@1:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd"
+
+filename-regex@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26"
+
+fileset@^2.0.2:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/fileset/-/fileset-2.0.3.tgz#8e7548a96d3cc2327ee5e674168723a333bba2a0"
+  dependencies:
+    glob "^7.0.3"
+    minimatch "^3.0.3"
+
+fill-range@^2.1.0:
+  version "2.2.3"
+  resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723"
+  dependencies:
+    is-number "^2.1.0"
+    isobject "^2.0.0"
+    randomatic "^1.1.3"
+    repeat-element "^1.1.2"
+    repeat-string "^1.5.2"
+
+fill-range@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7"
+  dependencies:
+    extend-shallow "^2.0.1"
+    is-number "^3.0.0"
+    repeat-string "^1.6.1"
+    to-regex-range "^2.1.0"
+
+finalhandler@1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.0.tgz#ce0b6855b45853e791b2fcc680046d88253dd7f5"
+  dependencies:
+    debug "2.6.9"
+    encodeurl "~1.0.1"
+    escape-html "~1.0.3"
+    on-finished "~2.3.0"
+    parseurl "~1.3.2"
+    statuses "~1.3.1"
+    unpipe "~1.0.0"
+
+find-cache-dir@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f"
+  dependencies:
+    commondir "^1.0.1"
+    make-dir "^1.0.0"
+    pkg-dir "^2.0.0"
+
+find-up@^1.0.0:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f"
+  dependencies:
+    path-exists "^2.0.0"
+    pinkie-promise "^2.0.0"
+
+find-up@^2.0.0, find-up@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
+  dependencies:
+    locate-path "^2.0.0"
+
+flat-cache@^1.2.1:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481"
+  dependencies:
+    circular-json "^0.3.1"
+    del "^2.0.2"
+    graceful-fs "^4.1.2"
+    write "^0.2.1"
+
+flush-write-stream@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.0.2.tgz#c81b90d8746766f1a609a46809946c45dd8ae417"
+  dependencies:
+    inherits "^2.0.1"
+    readable-stream "^2.0.4"
+
+follow-redirects@1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.0.0.tgz#8e34298cbd2e176f254effec75a1c78cc849fd37"
+  dependencies:
+    debug "^2.2.0"
+
+for-in@^1.0.1, for-in@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
+
+for-own@^0.1.4:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce"
+  dependencies:
+    for-in "^1.0.1"
+
+foreach@^2.0.5:
+  version "2.0.5"
+  resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99"
+
+forever-agent@~0.6.1:
+  version "0.6.1"
+  resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
+
+form-data@~2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.0.0.tgz#6f0aebadcc5da16c13e1ecc11137d85f9b883b25"
+  dependencies:
+    asynckit "^0.4.0"
+    combined-stream "^1.0.5"
+    mime-types "^2.1.11"
+
+form-data@~2.1.1:
+  version "2.1.4"
+  resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1"
+  dependencies:
+    asynckit "^0.4.0"
+    combined-stream "^1.0.5"
+    mime-types "^2.1.12"
+
+form-data@~2.3.1:
+  version "2.3.2"
+  resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.2.tgz#4970498be604c20c005d4f5c23aecd21d6b49099"
+  dependencies:
+    asynckit "^0.4.0"
+    combined-stream "1.0.6"
+    mime-types "^2.1.12"
+
+fragment-cache@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19"
+  dependencies:
+    map-cache "^0.2.2"
+
+from2@^2.1.0, from2@^2.1.1:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af"
+  dependencies:
+    inherits "^2.0.1"
+    readable-stream "^2.0.0"
+
+fs-access@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/fs-access/-/fs-access-1.0.1.tgz#d6a87f262271cefebec30c553407fb995da8777a"
+  dependencies:
+    null-check "^1.0.0"
+
+fs-write-stream-atomic@^1.0.8:
+  version "1.0.10"
+  resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9"
+  dependencies:
+    graceful-fs "^4.1.2"
+    iferr "^0.1.5"
+    imurmurhash "^0.1.4"
+    readable-stream "1 || 2"
+
+fs.realpath@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+
+fsevents@^1.0.0, fsevents@^1.1.1:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.3.tgz#11f82318f5fe7bb2cd22965a108e9306208216d8"
+  dependencies:
+    nan "^2.3.0"
+    node-pre-gyp "^0.6.39"
+
+fstream-ignore@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105"
+  dependencies:
+    fstream "^1.0.0"
+    inherits "2"
+    minimatch "^3.0.0"
+
+fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2:
+  version "1.0.11"
+  resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171"
+  dependencies:
+    graceful-fs "^4.1.2"
+    inherits "~2.0.0"
+    mkdirp ">=0.5 0"
+    rimraf "2"
+
+ftp@~0.3.10:
+  version "0.3.10"
+  resolved "https://registry.yarnpkg.com/ftp/-/ftp-0.3.10.tgz#9197d861ad8142f3e63d5a83bfe4c59f7330885d"
+  dependencies:
+    readable-stream "1.1.x"
+    xregexp "2.0.0"
+
+function-bind@^1.0.2, function-bind@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
+
+functional-red-black-tree@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
+
+gauge@~2.7.3:
+  version "2.7.4"
+  resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7"
+  dependencies:
+    aproba "^1.0.3"
+    console-control-strings "^1.0.0"
+    has-unicode "^2.0.0"
+    object-assign "^4.1.0"
+    signal-exit "^3.0.0"
+    string-width "^1.0.1"
+    strip-ansi "^3.0.1"
+    wide-align "^1.1.0"
+
+generate-function@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74"
+
+generate-object-property@^1.1.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0"
+  dependencies:
+    is-property "^1.0.0"
+
+generate-release@^0.14.0:
+  version "0.14.0"
+  resolved "https://registry.yarnpkg.com/generate-release/-/generate-release-0.14.0.tgz#22b2089b0ff4e0498d2c33fee94d2377199b996d"
+  dependencies:
+    bluebird "^3.5.0"
+    exists-sync "0.0.4"
+    glob "^7.1.2"
+    iniparser "^1.0.5"
+    inquirer "^3.3.0"
+    minimist "^1.2.0"
+    observatory "^1.0.0"
+    rmdir "^1.2.0"
+    temp "^0.8.3"
+    xtend "^4.0.1"
+
+get-caller-file@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5"
+
+get-stream@3.0.0, get-stream@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
+
+get-uri@2:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/get-uri/-/get-uri-2.0.1.tgz#dbdcacacd8c608a38316869368117697a1631c59"
+  dependencies:
+    data-uri-to-buffer "1"
+    debug "2"
+    extend "3"
+    file-uri-to-path "1"
+    ftp "~0.3.10"
+    readable-stream "2"
+
+get-value@^2.0.3, get-value@^2.0.6:
+  version "2.0.6"
+  resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
+
+getpass@^0.1.1:
+  version "0.1.7"
+  resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
+  dependencies:
+    assert-plus "^1.0.0"
+
+glob-base@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4"
+  dependencies:
+    glob-parent "^2.0.0"
+    is-glob "^2.0.0"
+
+glob-parent@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28"
+  dependencies:
+    is-glob "^2.0.0"
+
+glob-parent@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae"
+  dependencies:
+    is-glob "^3.1.0"
+    path-dirname "^1.0.0"
+
+glob@^7.0.3, glob@^7.0.5, glob@^7.0.6, glob@^7.1.0, glob@^7.1.1, glob@^7.1.2:
+  version "7.1.2"
+  resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15"
+  dependencies:
+    fs.realpath "^1.0.0"
+    inflight "^1.0.4"
+    inherits "2"
+    minimatch "^3.0.4"
+    once "^1.3.0"
+    path-is-absolute "^1.0.0"
+
+globals@^11.0.1:
+  version "11.3.0"
+  resolved "https://registry.yarnpkg.com/globals/-/globals-11.3.0.tgz#e04fdb7b9796d8adac9c8f64c14837b2313378b0"
+
+globals@^9.18.0:
+  version "9.18.0"
+  resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a"
+
+globby@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d"
+  dependencies:
+    array-union "^1.0.1"
+    arrify "^1.0.0"
+    glob "^7.0.3"
+    object-assign "^4.0.1"
+    pify "^2.0.0"
+    pinkie-promise "^2.0.0"
+
+got@^8.0.3:
+  version "8.2.0"
+  resolved "https://registry.yarnpkg.com/got/-/got-8.2.0.tgz#0d11a071d05046348a2f5c0a5fa047fb687fdfc6"
+  dependencies:
+    "@sindresorhus/is" "^0.7.0"
+    cacheable-request "^2.1.1"
+    decompress-response "^3.3.0"
+    duplexer3 "^0.1.4"
+    get-stream "^3.0.0"
+    into-stream "^3.1.0"
+    is-retry-allowed "^1.1.0"
+    isurl "^1.0.0-alpha5"
+    lowercase-keys "^1.0.0"
+    mimic-response "^1.0.0"
+    p-cancelable "^0.3.0"
+    p-timeout "^2.0.1"
+    pify "^3.0.0"
+    safe-buffer "^5.1.1"
+    timed-out "^4.0.1"
+    url-parse-lax "^3.0.0"
+    url-to-options "^1.0.1"
+
+graceful-fs@^4.1.11, graceful-fs@^4.1.2:
+  version "4.1.11"
+  resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658"
+
+growly@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081"
+
+handlebars@^4.0.3:
+  version "4.0.11"
+  resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.11.tgz#630a35dfe0294bc281edae6ffc5d329fc7982dcc"
+  dependencies:
+    async "^1.4.0"
+    optimist "^0.6.1"
+    source-map "^0.4.4"
+  optionalDependencies:
+    uglify-js "^2.6"
+
+har-schema@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e"
+
+har-schema@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92"
+
+har-validator@~2.0.6:
+  version "2.0.6"
+  resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d"
+  dependencies:
+    chalk "^1.1.1"
+    commander "^2.9.0"
+    is-my-json-valid "^2.12.4"
+    pinkie-promise "^2.0.0"
+
+har-validator@~4.2.1:
+  version "4.2.1"
+  resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a"
+  dependencies:
+    ajv "^4.9.1"
+    har-schema "^1.0.5"
+
+har-validator@~5.0.3:
+  version "5.0.3"
+  resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd"
+  dependencies:
+    ajv "^5.1.0"
+    har-schema "^2.0.0"
+
+has-ansi@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
+  dependencies:
+    ansi-regex "^2.0.0"
+
+has-binary2@~1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/has-binary2/-/has-binary2-1.0.2.tgz#e83dba49f0b9be4d026d27365350d9f03f54be98"
+  dependencies:
+    isarray "2.0.1"
+
+has-cors@1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39"
+
+has-flag@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa"
+
+has-flag@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51"
+
+has-flag@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
+
+has-symbol-support-x@^1.4.1:
+  version "1.4.2"
+  resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455"
+
+has-to-string-tag-x@^1.2.0:
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz#a045ab383d7b4b2012a00148ab0aa5f290044d4d"
+  dependencies:
+    has-symbol-support-x "^1.4.1"
+
+has-unicode@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
+
+has-value@^0.3.1:
+  version "0.3.1"
+  resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f"
+  dependencies:
+    get-value "^2.0.3"
+    has-values "^0.1.4"
+    isobject "^2.0.0"
+
+has-value@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177"
+  dependencies:
+    get-value "^2.0.6"
+    has-values "^1.0.0"
+    isobject "^3.0.0"
+
+has-values@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771"
+
+has-values@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f"
+  dependencies:
+    is-number "^3.0.0"
+    kind-of "^4.0.0"
+
+has@^1.0.0, has@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28"
+  dependencies:
+    function-bind "^1.0.2"
+
+hash-base@^2.0.0:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-2.0.2.tgz#66ea1d856db4e8a5470cadf6fce23ae5244ef2e1"
+  dependencies:
+    inherits "^2.0.1"
+
+hash-base@^3.0.0:
+  version "3.0.4"
+  resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918"
+  dependencies:
+    inherits "^2.0.1"
+    safe-buffer "^5.0.1"
+
+hash.js@^1.0.0, hash.js@^1.0.3:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.3.tgz#340dedbe6290187151c1ea1d777a3448935df846"
+  dependencies:
+    inherits "^2.0.3"
+    minimalistic-assert "^1.0.0"
+
+hawk@3.1.3, hawk@~3.1.3:
+  version "3.1.3"
+  resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4"
+  dependencies:
+    boom "2.x.x"
+    cryptiles "2.x.x"
+    hoek "2.x.x"
+    sntp "1.x.x"
+
+hawk@~6.0.2:
+  version "6.0.2"
+  resolved "https://registry.yarnpkg.com/hawk/-/hawk-6.0.2.tgz#af4d914eb065f9b5ce4d9d11c1cb2126eecc3038"
+  dependencies:
+    boom "4.x.x"
+    cryptiles "3.x.x"
+    hoek "4.x.x"
+    sntp "2.x.x"
+
+hipchat-notifier@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/hipchat-notifier/-/hipchat-notifier-1.1.0.tgz#b6d249755437c191082367799d3ba9a0f23b231e"
+  dependencies:
+    lodash "^4.0.0"
+    request "^2.0.0"
+
+hmac-drbg@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
+  dependencies:
+    hash.js "^1.0.3"
+    minimalistic-assert "^1.0.0"
+    minimalistic-crypto-utils "^1.0.1"
+
+hoek@2.x.x:
+  version "2.16.3"
+  resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed"
+
+hoek@4.x.x:
+  version "4.2.1"
+  resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.1.tgz#9634502aa12c445dd5a7c5734b572bb8738aacbb"
+
+home-or-tmp@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8"
+  dependencies:
+    os-homedir "^1.0.0"
+    os-tmpdir "^1.0.1"
+
+hosted-git-info@^2.1.4:
+  version "2.5.0"
+  resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c"
+
+html-encoding-sniffer@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8"
+  dependencies:
+    whatwg-encoding "^1.0.1"
+
+htmlescape@^1.1.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/htmlescape/-/htmlescape-1.1.1.tgz#3a03edc2214bca3b66424a3e7959349509cb0351"
+
+http-cache-semantics@3.8.1:
+  version "3.8.1"
+  resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2"
+
+http-errors@1.6.2, http-errors@~1.6.2:
+  version "1.6.2"
+  resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736"
+  dependencies:
+    depd "1.1.1"
+    inherits "2.0.3"
+    setprototypeof "1.0.3"
+    statuses ">= 1.3.1 < 2"
+
+http-proxy-agent@1:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-1.0.0.tgz#cc1ce38e453bf984a0f7702d2dd59c73d081284a"
+  dependencies:
+    agent-base "2"
+    debug "2"
+    extend "3"
+
+http-proxy@^1.13.0:
+  version "1.16.2"
+  resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.16.2.tgz#06dff292952bf64dbe8471fa9df73066d4f37742"
+  dependencies:
+    eventemitter3 "1.x.x"
+    requires-port "1.x.x"
+
+http-signature@~1.1.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf"
+  dependencies:
+    assert-plus "^0.2.0"
+    jsprim "^1.2.2"
+    sshpk "^1.7.0"
+
+http-signature@~1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1"
+  dependencies:
+    assert-plus "^1.0.0"
+    jsprim "^1.2.2"
+    sshpk "^1.7.0"
+
+httpntlm@1.6.1:
+  version "1.6.1"
+  resolved "https://registry.yarnpkg.com/httpntlm/-/httpntlm-1.6.1.tgz#ad01527143a2e8773cfae6a96f58656bb52a34b2"
+  dependencies:
+    httpreq ">=0.4.22"
+    underscore "~1.7.0"
+
+httpreq@>=0.4.22:
+  version "0.4.24"
+  resolved "https://registry.yarnpkg.com/httpreq/-/httpreq-0.4.24.tgz#4335ffd82cd969668a39465c929ac61d6393627f"
+
+https-browserify@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73"
+
+https-proxy-agent@1:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz#35f7da6c48ce4ddbfa264891ac593ee5ff8671e6"
+  dependencies:
+    agent-base "2"
+    debug "2"
+    extend "3"
+
+iconv-lite@0.4.15:
+  version "0.4.15"
+  resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.15.tgz#fe265a218ac6a57cfe854927e9d04c19825eddeb"
+
+iconv-lite@0.4.19, iconv-lite@^0.4.17:
+  version "0.4.19"
+  resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b"
+
+ieee754@^1.1.4:
+  version "1.1.8"
+  resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4"
+
+iferr@^0.1.5:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501"
+
+ignore@^3.3.3:
+  version "3.3.7"
+  resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.7.tgz#612289bfb3c220e186a58118618d5be8c1bab021"
+
+import-local@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/import-local/-/import-local-1.0.0.tgz#5e4ffdc03f4fe6c009c6729beb29631c2f8227bc"
+  dependencies:
+    pkg-dir "^2.0.0"
+    resolve-cwd "^2.0.0"
+
+imurmurhash@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
+
+indexof@0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d"
+
+inflection@~1.10.0:
+  version "1.10.0"
+  resolved "https://registry.yarnpkg.com/inflection/-/inflection-1.10.0.tgz#5bffcb1197ad3e81050f8e17e21668087ee9eb2f"
+
+inflection@~1.3.0:
+  version "1.3.8"
+  resolved "https://registry.yarnpkg.com/inflection/-/inflection-1.3.8.tgz#cbd160da9f75b14c3cc63578d4f396784bf3014e"
+
+inflight@^1.0.4:
+  version "1.0.6"
+  resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+  dependencies:
+    once "^1.3.0"
+    wrappy "1"
+
+inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
+
+inherits@2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1"
+
+ini@~1.3.0:
+  version "1.3.5"
+  resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
+
+iniparser@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/iniparser/-/iniparser-1.0.5.tgz#836d6befe6dfbfcee0bccf1cf9f2acc7027f783d"
+
+inline-source-map@~0.6.0:
+  version "0.6.2"
+  resolved "https://registry.yarnpkg.com/inline-source-map/-/inline-source-map-0.6.2.tgz#f9393471c18a79d1724f863fa38b586370ade2a5"
+  dependencies:
+    source-map "~0.5.3"
+
+inquirer@^3.0.6, inquirer@^3.3.0:
+  version "3.3.0"
+  resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9"
+  dependencies:
+    ansi-escapes "^3.0.0"
+    chalk "^2.0.0"
+    cli-cursor "^2.1.0"
+    cli-width "^2.0.0"
+    external-editor "^2.0.4"
+    figures "^2.0.0"
+    lodash "^4.3.0"
+    mute-stream "0.0.7"
+    run-async "^2.2.0"
+    rx-lite "^4.0.8"
+    rx-lite-aggregates "^4.0.8"
+    string-width "^2.1.0"
+    strip-ansi "^4.0.0"
+    through "^2.3.6"
+
+insert-module-globals@^7.0.0:
+  version "7.0.2"
+  resolved "https://registry.yarnpkg.com/insert-module-globals/-/insert-module-globals-7.0.2.tgz#012c56baa7d3307a8b417d4ec5270cf9741c18f4"
+  dependencies:
+    JSONStream "^1.0.3"
+    combine-source-map "~0.7.1"
+    concat-stream "~1.5.1"
+    is-buffer "^1.1.0"
+    lexical-scope "^1.2.0"
+    process "~0.11.0"
+    through2 "^2.0.0"
+    xtend "^4.0.0"
+
+interpret@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614"
+
+into-stream@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/into-stream/-/into-stream-3.1.0.tgz#96fb0a936c12babd6ff1752a17d05616abd094c6"
+  dependencies:
+    from2 "^2.1.1"
+    p-is-promise "^1.1.0"
+
+invariant@^2.2.2:
+  version "2.2.3"
+  resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.3.tgz#1a827dfde7dcbd7c323f0ca826be8fa7c5e9d688"
+  dependencies:
+    loose-envify "^1.0.0"
+
+invert-kv@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6"
+
+ip@1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/ip/-/ip-1.0.1.tgz#c7e356cdea225ae71b36d70f2e71a92ba4e42590"
+
+ip@^1.1.2, ip@^1.1.4:
+  version "1.1.5"
+  resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a"
+
+is-accessor-descriptor@^0.1.6:
+  version "0.1.6"
+  resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6"
+  dependencies:
+    kind-of "^3.0.2"
+
+is-accessor-descriptor@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656"
+  dependencies:
+    kind-of "^6.0.0"
+
+is-arrayish@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
+
+is-binary-path@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898"
+  dependencies:
+    binary-extensions "^1.0.0"
+
+is-buffer@^1.1.0, is-buffer@^1.1.5:
+  version "1.1.6"
+  resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
+
+is-builtin-module@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe"
+  dependencies:
+    builtin-modules "^1.0.0"
+
+is-callable@^1.1.1, is-callable@^1.1.3:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2"
+
+is-ci@^1.0.10:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.1.0.tgz#247e4162e7860cebbdaf30b774d6b0ac7dcfe7a5"
+  dependencies:
+    ci-info "^1.0.0"
+
+is-data-descriptor@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56"
+  dependencies:
+    kind-of "^3.0.2"
+
+is-data-descriptor@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7"
+  dependencies:
+    kind-of "^6.0.0"
+
+is-date-object@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16"
+
+is-descriptor@^0.1.0:
+  version "0.1.6"
+  resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca"
+  dependencies:
+    is-accessor-descriptor "^0.1.6"
+    is-data-descriptor "^0.1.4"
+    kind-of "^5.0.0"
+
+is-descriptor@^1.0.0, is-descriptor@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec"
+  dependencies:
+    is-accessor-descriptor "^1.0.0"
+    is-data-descriptor "^1.0.0"
+    kind-of "^6.0.2"
+
+is-dotfile@^1.0.0:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1"
+
+is-equal-shallow@^0.1.3:
+  version "0.1.3"
+  resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534"
+  dependencies:
+    is-primitive "^2.0.0"
+
+is-extendable@^0.1.0, is-extendable@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
+
+is-extendable@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4"
+  dependencies:
+    is-plain-object "^2.0.4"
+
+is-extglob@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0"
+
+is-extglob@^2.1.0, is-extglob@^2.1.1:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
+
+is-finite@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa"
+  dependencies:
+    number-is-nan "^1.0.0"
+
+is-fullwidth-code-point@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
+  dependencies:
+    number-is-nan "^1.0.0"
+
+is-fullwidth-code-point@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
+
+is-generator-fn@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-1.0.0.tgz#969d49e1bb3329f6bb7f09089be26578b2ddd46a"
+
+is-glob@^2.0.0, is-glob@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863"
+  dependencies:
+    is-extglob "^1.0.0"
+
+is-glob@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a"
+  dependencies:
+    is-extglob "^2.1.0"
+
+is-glob@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0"
+  dependencies:
+    is-extglob "^2.1.1"
+
+is-my-ip-valid@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz#7b351b8e8edd4d3995d4d066680e664d94696824"
+
+is-my-json-valid@^2.12.4:
+  version "2.17.2"
+  resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.17.2.tgz#6b2103a288e94ef3de5cf15d29dd85fc4b78d65c"
+  dependencies:
+    generate-function "^2.0.0"
+    generate-object-property "^1.1.0"
+    is-my-ip-valid "^1.0.0"
+    jsonpointer "^4.0.0"
+    xtend "^4.0.0"
+
+is-number@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/is-number/-/is-number-0.1.1.tgz#69a7af116963d47206ec9bd9b48a14216f1e3806"
+
+is-number@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f"
+  dependencies:
+    kind-of "^3.0.2"
+
+is-number@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195"
+  dependencies:
+    kind-of "^3.0.2"
+
+is-number@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff"
+
+is-object@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.1.tgz#8952688c5ec2ffd6b03ecc85e769e02903083470"
+
+is-odd@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/is-odd/-/is-odd-2.0.0.tgz#7646624671fd7ea558ccd9a2795182f2958f1b24"
+  dependencies:
+    is-number "^4.0.0"
+
+is-path-cwd@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d"
+
+is-path-in-cwd@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc"
+  dependencies:
+    is-path-inside "^1.0.0"
+
+is-path-inside@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036"
+  dependencies:
+    path-is-inside "^1.0.1"
+
+is-plain-obj@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e"
+
+is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4:
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
+  dependencies:
+    isobject "^3.0.1"
+
+is-posix-bracket@^0.1.0:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4"
+
+is-primitive@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575"
+
+is-promise@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa"
+
+is-property@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84"
+
+is-regex@^1.0.4:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491"
+  dependencies:
+    has "^1.0.1"
+
+is-resolvable@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88"
+
+is-retry-allowed@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34"
+
+is-stream@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
+
+is-symbol@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572"
+
+is-typedarray@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
+
+is-utf8@^0.2.0:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72"
+
+is-windows@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
+
+is@~0.2.6:
+  version "0.2.7"
+  resolved "https://registry.yarnpkg.com/is/-/is-0.2.7.tgz#3b34a2c48f359972f35042849193ae7264b63562"
+
+isarray@0.0.1, isarray@~0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
+
+isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
+
+isarray@2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.1.tgz#a37d94ed9cda2d59865c9f76fe596ee1f338741e"
+
+isbinaryfile@^3.0.0:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.2.tgz#4a3e974ec0cba9004d3fc6cde7209ea69368a621"
+
+isexe@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
+
+isobject@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
+  dependencies:
+    isarray "1.0.0"
+
+isobject@^3.0.0, isobject@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
+
+isstream@~0.1.2:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
+
+istanbul-api@^1.1.14:
+  version "1.2.2"
+  resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.2.2.tgz#e17cd519dd5ec4141197f246fdf380b75487f3b1"
+  dependencies:
+    async "^2.1.4"
+    fileset "^2.0.2"
+    istanbul-lib-coverage "^1.1.2"
+    istanbul-lib-hook "^1.1.0"
+    istanbul-lib-instrument "^1.9.2"
+    istanbul-lib-report "^1.1.3"
+    istanbul-lib-source-maps "^1.2.3"
+    istanbul-reports "^1.1.4"
+    js-yaml "^3.7.0"
+    mkdirp "^0.5.1"
+    once "^1.4.0"
+
+istanbul-lib-coverage@^1.1.1, istanbul-lib-coverage@^1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.2.tgz#4113c8ff6b7a40a1ef7350b01016331f63afde14"
+
+istanbul-lib-hook@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.1.0.tgz#8538d970372cb3716d53e55523dd54b557a8d89b"
+  dependencies:
+    append-transform "^0.4.0"
+
+istanbul-lib-instrument@^1.7.5, istanbul-lib-instrument@^1.8.0, istanbul-lib-instrument@^1.9.2:
+  version "1.9.2"
+  resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.9.2.tgz#84905bf47f7e0b401d6b840da7bad67086b4aab6"
+  dependencies:
+    babel-generator "^6.18.0"
+    babel-template "^6.16.0"
+    babel-traverse "^6.18.0"
+    babel-types "^6.18.0"
+    babylon "^6.18.0"
+    istanbul-lib-coverage "^1.1.2"
+    semver "^5.3.0"
+
+istanbul-lib-report@^1.1.3:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.1.3.tgz#2df12188c0fa77990c0d2176d2d0ba3394188259"
+  dependencies:
+    istanbul-lib-coverage "^1.1.2"
+    mkdirp "^0.5.1"
+    path-parse "^1.0.5"
+    supports-color "^3.1.2"
+
+istanbul-lib-source-maps@^1.2.1, istanbul-lib-source-maps@^1.2.3:
+  version "1.2.3"
+  resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.3.tgz#20fb54b14e14b3fb6edb6aca3571fd2143db44e6"
+  dependencies:
+    debug "^3.1.0"
+    istanbul-lib-coverage "^1.1.2"
+    mkdirp "^0.5.1"
+    rimraf "^2.6.1"
+    source-map "^0.5.3"
+
+istanbul-reports@^1.1.4:
+  version "1.1.4"
+  resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.1.4.tgz#5ccba5e22b7b5a5d91d5e0a830f89be334bf97bd"
+  dependencies:
+    handlebars "^4.0.3"
+
+isurl@^1.0.0-alpha5:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/isurl/-/isurl-1.0.0.tgz#b27f4f49f3cdaa3ea44a0a5b7f3462e6edc39d67"
+  dependencies:
+    has-to-string-tag-x "^1.2.0"
+    is-object "^1.0.1"
+
+jasmine-core@^3.1.0, jasmine-core@~3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-3.1.0.tgz#a4785e135d5df65024dfc9224953df585bd2766c"
+
+jasmine@^3.0.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/jasmine/-/jasmine-3.1.0.tgz#2bd59fd7ec6ec0e8acb64e09f45a68ed2ad1952a"
+  dependencies:
+    glob "^7.0.6"
+    jasmine-core "~3.1.0"
+
+jest-changed-files@^22.2.0:
+  version "22.2.0"
+  resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-22.2.0.tgz#517610c4a8ca0925bdc88b0ca53bd678aa8d019e"
+  dependencies:
+    throat "^4.0.0"
+
+jest-cli@^22.4.2:
+  version "22.4.2"
+  resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-22.4.2.tgz#e6546dc651e13d164481aa3e76e53ac4f4edab06"
+  dependencies:
+    ansi-escapes "^3.0.0"
+    chalk "^2.0.1"
+    exit "^0.1.2"
+    glob "^7.1.2"
+    graceful-fs "^4.1.11"
+    import-local "^1.0.0"
+    is-ci "^1.0.10"
+    istanbul-api "^1.1.14"
+    istanbul-lib-coverage "^1.1.1"
+    istanbul-lib-instrument "^1.8.0"
+    istanbul-lib-source-maps "^1.2.1"
+    jest-changed-files "^22.2.0"
+    jest-config "^22.4.2"
+    jest-environment-jsdom "^22.4.1"
+    jest-get-type "^22.1.0"
+    jest-haste-map "^22.4.2"
+    jest-message-util "^22.4.0"
+    jest-regex-util "^22.1.0"
+    jest-resolve-dependencies "^22.1.0"
+    jest-runner "^22.4.2"
+    jest-runtime "^22.4.2"
+    jest-snapshot "^22.4.0"
+    jest-util "^22.4.1"
+    jest-validate "^22.4.2"
+    jest-worker "^22.2.2"
+    micromatch "^2.3.11"
+    node-notifier "^5.2.1"
+    realpath-native "^1.0.0"
+    rimraf "^2.5.4"
+    slash "^1.0.0"
+    string-length "^2.0.0"
+    strip-ansi "^4.0.0"
+    which "^1.2.12"
+    yargs "^10.0.3"
+
+jest-config@^22.4.2:
+  version "22.4.2"
+  resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-22.4.2.tgz#580ba5819bf81a5e48f4fd470e8b81834f45c855"
+  dependencies:
+    chalk "^2.0.1"
+    glob "^7.1.1"
+    jest-environment-jsdom "^22.4.1"
+    jest-environment-node "^22.4.1"
+    jest-get-type "^22.1.0"
+    jest-jasmine2 "^22.4.2"
+    jest-regex-util "^22.1.0"
+    jest-resolve "^22.4.2"
+    jest-util "^22.4.1"
+    jest-validate "^22.4.2"
+    pretty-format "^22.4.0"
+
+jest-diff@^22.4.0:
+  version "22.4.0"
+  resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-22.4.0.tgz#384c2b78519ca44ca126382df53f134289232525"
+  dependencies:
+    chalk "^2.0.1"
+    diff "^3.2.0"
+    jest-get-type "^22.1.0"
+    pretty-format "^22.4.0"
+
+jest-docblock@^22.4.0:
+  version "22.4.0"
+  resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-22.4.0.tgz#dbf1877e2550070cfc4d9b07a55775a0483159b8"
+  dependencies:
+    detect-newline "^2.1.0"
+
+jest-environment-jsdom@^22.4.1:
+  version "22.4.1"
+  resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-22.4.1.tgz#754f408872441740100d3917e5ec40c74de6447f"
+  dependencies:
+    jest-mock "^22.2.0"
+    jest-util "^22.4.1"
+    jsdom "^11.5.1"
+
+jest-environment-node@^22.4.1:
+  version "22.4.1"
+  resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-22.4.1.tgz#418850eb654596b8d6e36c2021cbedbc23df8e16"
+  dependencies:
+    jest-mock "^22.2.0"
+    jest-util "^22.4.1"
+
+jest-get-type@^22.1.0:
+  version "22.1.0"
+  resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-22.1.0.tgz#4e90af298ed6181edc85d2da500dbd2753e0d5a9"
+
+jest-haste-map@^22.4.2:
+  version "22.4.2"
+  resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-22.4.2.tgz#a90178e66146d4378bb076345a949071f3b015b4"
+  dependencies:
+    fb-watchman "^2.0.0"
+    graceful-fs "^4.1.11"
+    jest-docblock "^22.4.0"
+    jest-serializer "^22.4.0"
+    jest-worker "^22.2.2"
+    micromatch "^2.3.11"
+    sane "^2.0.0"
+
+jest-jasmine2@^22.4.2:
+  version "22.4.2"
+  resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-22.4.2.tgz#dfd3d259579ed6f52510d8f1ab692808f0d40691"
+  dependencies:
+    chalk "^2.0.1"
+    co "^4.6.0"
+    expect "^22.4.0"
+    graceful-fs "^4.1.11"
+    is-generator-fn "^1.0.0"
+    jest-diff "^22.4.0"
+    jest-matcher-utils "^22.4.0"
+    jest-message-util "^22.4.0"
+    jest-snapshot "^22.4.0"
+    jest-util "^22.4.1"
+    source-map-support "^0.5.0"
+
+jest-leak-detector@^22.4.0:
+  version "22.4.0"
+  resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-22.4.0.tgz#64da77f05b001c96d2062226e079f89989c4aa2f"
+  dependencies:
+    pretty-format "^22.4.0"
+
+jest-matcher-utils@^22.4.0:
+  version "22.4.0"
+  resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-22.4.0.tgz#d55f5faf2270462736bdf7c7485ee931c9d4b6a1"
+  dependencies:
+    chalk "^2.0.1"
+    jest-get-type "^22.1.0"
+    pretty-format "^22.4.0"
+
+jest-message-util@^22.4.0:
+  version "22.4.0"
+  resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-22.4.0.tgz#e3d861df16d2fee60cb2bc8feac2188a42579642"
+  dependencies:
+    "@babel/code-frame" "^7.0.0-beta.35"
+    chalk "^2.0.1"
+    micromatch "^2.3.11"
+    slash "^1.0.0"
+    stack-utils "^1.0.1"
+
+jest-mock@^22.2.0:
+  version "22.2.0"
+  resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-22.2.0.tgz#444b3f9488a7473adae09bc8a77294afded397a7"
+
+jest-regex-util@^22.1.0:
+  version "22.1.0"
+  resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-22.1.0.tgz#5daf2fe270074b6da63e5d85f1c9acc866768f53"
+
+jest-resolve-dependencies@^22.1.0:
+  version "22.1.0"
+  resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-22.1.0.tgz#340e4139fb13315cd43abc054e6c06136be51e31"
+  dependencies:
+    jest-regex-util "^22.1.0"
+
+jest-resolve@^22.4.2:
+  version "22.4.2"
+  resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-22.4.2.tgz#25d88aa4147462c9c1c6a1ba16250d3794c24d00"
+  dependencies:
+    browser-resolve "^1.11.2"
+    chalk "^2.0.1"
+
+jest-runner@^22.4.2:
+  version "22.4.2"
+  resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-22.4.2.tgz#19390ea9d99f768973e16f95a1efa351c0017e87"
+  dependencies:
+    exit "^0.1.2"
+    jest-config "^22.4.2"
+    jest-docblock "^22.4.0"
+    jest-haste-map "^22.4.2"
+    jest-jasmine2 "^22.4.2"
+    jest-leak-detector "^22.4.0"
+    jest-message-util "^22.4.0"
+    jest-runtime "^22.4.2"
+    jest-util "^22.4.1"
+    jest-worker "^22.2.2"
+    throat "^4.0.0"
+
+jest-runtime@^22.4.2:
+  version "22.4.2"
+  resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-22.4.2.tgz#0de0444f65ce15ee4f2e0055133fc7c17b9168f3"
+  dependencies:
+    babel-core "^6.0.0"
+    babel-jest "^22.4.1"
+    babel-plugin-istanbul "^4.1.5"
+    chalk "^2.0.1"
+    convert-source-map "^1.4.0"
+    exit "^0.1.2"
+    graceful-fs "^4.1.11"
+    jest-config "^22.4.2"
+    jest-haste-map "^22.4.2"
+    jest-regex-util "^22.1.0"
+    jest-resolve "^22.4.2"
+    jest-util "^22.4.1"
+    jest-validate "^22.4.2"
+    json-stable-stringify "^1.0.1"
+    micromatch "^2.3.11"
+    realpath-native "^1.0.0"
+    slash "^1.0.0"
+    strip-bom "3.0.0"
+    write-file-atomic "^2.1.0"
+    yargs "^10.0.3"
+
+jest-serializer@^22.4.0:
+  version "22.4.0"
+  resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-22.4.0.tgz#b5d145b98c4b0d2c20ab686609adbb81fe23b566"
+
+jest-snapshot@^22.4.0:
+  version "22.4.0"
+  resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-22.4.0.tgz#03d3ce63f8fa7352388afc6a3c8b5ccc3a180ed7"
+  dependencies:
+    chalk "^2.0.1"
+    jest-diff "^22.4.0"
+    jest-matcher-utils "^22.4.0"
+    mkdirp "^0.5.1"
+    natural-compare "^1.4.0"
+    pretty-format "^22.4.0"
+
+jest-util@^22.4.1:
+  version "22.4.1"
+  resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-22.4.1.tgz#dd17c3bdb067f8e90591563ec0c42bf847dc249f"
+  dependencies:
+    callsites "^2.0.0"
+    chalk "^2.0.1"
+    graceful-fs "^4.1.11"
+    is-ci "^1.0.10"
+    jest-message-util "^22.4.0"
+    mkdirp "^0.5.1"
+    source-map "^0.6.0"
+
+jest-validate@^22.4.2:
+  version "22.4.2"
+  resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-22.4.2.tgz#e789a4e056173bf97fe797a2df2d52105c57d4f4"
+  dependencies:
+    chalk "^2.0.1"
+    jest-config "^22.4.2"
+    jest-get-type "^22.1.0"
+    leven "^2.1.0"
+    pretty-format "^22.4.0"
+
+jest-worker@^22.2.2:
+  version "22.2.2"
+  resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-22.2.2.tgz#c1f5dc39976884b81f68ec50cb8532b2cbab3390"
+  dependencies:
+    merge-stream "^1.0.1"
+
+jest@^22.2.2:
+  version "22.4.2"
+  resolved "https://registry.yarnpkg.com/jest/-/jest-22.4.2.tgz#34012834a49bf1bdd3bc783850ab44e4499afc20"
+  dependencies:
+    import-local "^1.0.0"
+    jest-cli "^22.4.2"
+
+js-tokens@^3.0.0, js-tokens@^3.0.2:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
+
+js-yaml@^3.7.0, js-yaml@^3.9.1:
+  version "3.10.0"
+  resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc"
+  dependencies:
+    argparse "^1.0.7"
+    esprima "^4.0.0"
+
+jsbn@~0.1.0:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
+
+jsdom@^11.5.1:
+  version "11.6.2"
+  resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.6.2.tgz#25d1ef332d48adf77fc5221fe2619967923f16bb"
+  dependencies:
+    abab "^1.0.4"
+    acorn "^5.3.0"
+    acorn-globals "^4.1.0"
+    array-equal "^1.0.0"
+    browser-process-hrtime "^0.1.2"
+    content-type-parser "^1.0.2"
+    cssom ">= 0.3.2 < 0.4.0"
+    cssstyle ">= 0.2.37 < 0.3.0"
+    domexception "^1.0.0"
+    escodegen "^1.9.0"
+    html-encoding-sniffer "^1.0.2"
+    left-pad "^1.2.0"
+    nwmatcher "^1.4.3"
+    parse5 "4.0.0"
+    pn "^1.1.0"
+    request "^2.83.0"
+    request-promise-native "^1.0.5"
+    sax "^1.2.4"
+    symbol-tree "^3.2.2"
+    tough-cookie "^2.3.3"
+    w3c-hr-time "^1.0.1"
+    webidl-conversions "^4.0.2"
+    whatwg-encoding "^1.0.3"
+    whatwg-url "^6.4.0"
+    ws "^4.0.0"
+    xml-name-validator "^3.0.0"
+
+jsesc@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b"
+
+json-buffer@3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898"
+
+json-loader@^0.5.4:
+  version "0.5.7"
+  resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.7.tgz#dca14a70235ff82f0ac9a3abeb60d337a365185d"
+
+json-schema-traverse@^0.3.0:
+  version "0.3.1"
+  resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340"
+
+json-schema@0.2.3:
+  version "0.2.3"
+  resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
+
+json-stable-stringify-without-jsonify@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
+
+json-stable-stringify@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af"
+  dependencies:
+    jsonify "~0.0.0"
+
+json-stable-stringify@~0.0.0:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz#611c23e814db375527df851193db59dd2af27f45"
+  dependencies:
+    jsonify "~0.0.0"
+
+json-stringify-safe@5.0.x, json-stringify-safe@~5.0.1:
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
+
+json5@^0.5.0, json5@^0.5.1:
+  version "0.5.1"
+  resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
+
+jsonify@~0.0.0:
+  version "0.0.0"
+  resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73"
+
+jsonparse@^1.2.0:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280"
+
+jsonpointer@^4.0.0:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9"
+
+jsprim@^1.2.2:
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2"
+  dependencies:
+    assert-plus "1.0.0"
+    extsprintf "1.3.0"
+    json-schema "0.2.3"
+    verror "1.10.0"
+
+karma-chrome-launcher@^2.2.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/karma-chrome-launcher/-/karma-chrome-launcher-2.2.0.tgz#cf1b9d07136cc18fe239327d24654c3dbc368acf"
+  dependencies:
+    fs-access "^1.0.0"
+    which "^1.2.1"
+
+karma-firefox-launcher@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/karma-firefox-launcher/-/karma-firefox-launcher-1.1.0.tgz#2c47030452f04531eb7d13d4fc7669630bb93339"
+
+karma-jasmine@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/karma-jasmine/-/karma-jasmine-1.1.1.tgz#6fe840e75a11600c9d91e84b33c458e1c46a3529"
+
+karma-safari-launcher@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/karma-safari-launcher/-/karma-safari-launcher-1.0.0.tgz#96982a2cc47d066aae71c553babb28319115a2ce"
+
+karma-webpack@^2.0.9:
+  version "2.0.13"
+  resolved "https://registry.yarnpkg.com/karma-webpack/-/karma-webpack-2.0.13.tgz#cf56e3056c15b7747a0bb2140fc9a6be41dd9f02"
+  dependencies:
+    async "^2.0.0"
+    babel-runtime "^6.0.0"
+    loader-utils "^1.0.0"
+    lodash "^4.0.0"
+    source-map "^0.5.6"
+    webpack-dev-middleware "^1.12.0"
+
+karma@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/karma/-/karma-2.0.0.tgz#a02698dd7f0f05ff5eb66ab8f65582490b512e58"
+  dependencies:
+    bluebird "^3.3.0"
+    body-parser "^1.16.1"
+    browserify "^14.5.0"
+    chokidar "^1.4.1"
+    colors "^1.1.0"
+    combine-lists "^1.0.0"
+    connect "^3.6.0"
+    core-js "^2.2.0"
+    di "^0.0.1"
+    dom-serialize "^2.2.0"
+    expand-braces "^0.1.1"
+    glob "^7.1.1"
+    graceful-fs "^4.1.2"
+    http-proxy "^1.13.0"
+    isbinaryfile "^3.0.0"
+    lodash "^4.17.4"
+    log4js "^2.3.9"
+    mime "^1.3.4"
+    minimatch "^3.0.2"
+    optimist "^0.6.1"
+    qjobs "^1.1.4"
+    range-parser "^1.2.0"
+    rimraf "^2.6.0"
+    safe-buffer "^5.0.1"
+    socket.io "2.0.4"
+    source-map "^0.6.1"
+    tmp "0.0.33"
+    useragent "^2.1.12"
+
+keyv@3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.0.0.tgz#44923ba39e68b12a7cec7df6c3268c031f2ef373"
+  dependencies:
+    json-buffer "3.0.0"
+
+kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0:
+  version "3.2.2"
+  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
+  dependencies:
+    is-buffer "^1.1.5"
+
+kind-of@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57"
+  dependencies:
+    is-buffer "^1.1.5"
+
+kind-of@^5.0.0:
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d"
+
+kind-of@^6.0.0, kind-of@^6.0.2:
+  version "6.0.2"
+  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051"
+
+labeled-stream-splicer@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/labeled-stream-splicer/-/labeled-stream-splicer-2.0.0.tgz#a52e1d138024c00b86b1c0c91f677918b8ae0a59"
+  dependencies:
+    inherits "^2.0.1"
+    isarray "~0.0.1"
+    stream-splicer "^2.0.0"
+
+lazy-cache@^1.0.3:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e"
+
+lazy-cache@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-2.0.2.tgz#b9190a4f913354694840859f8a8f7084d8822264"
+  dependencies:
+    set-getter "^0.1.0"
+
+lcid@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835"
+  dependencies:
+    invert-kv "^1.0.0"
+
+left-pad@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.2.0.tgz#d30a73c6b8201d8f7d8e7956ba9616087a68e0ee"
+
+leven@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580"
+
+levn@^0.3.0, levn@~0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
+  dependencies:
+    prelude-ls "~1.1.2"
+    type-check "~0.3.2"
+
+lexical-scope@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/lexical-scope/-/lexical-scope-1.2.0.tgz#fcea5edc704a4b3a8796cdca419c3a0afaf22df4"
+  dependencies:
+    astw "^2.0.0"
+
+libbase64@0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/libbase64/-/libbase64-0.1.0.tgz#62351a839563ac5ff5bd26f12f60e9830bb751e6"
+
+libmime@3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/libmime/-/libmime-3.0.0.tgz#51a1a9e7448ecbd32cda54421675bb21bc093da6"
+  dependencies:
+    iconv-lite "0.4.15"
+    libbase64 "0.1.0"
+    libqp "1.1.0"
+
+libqp@1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/libqp/-/libqp-1.1.0.tgz#f5e6e06ad74b794fb5b5b66988bf728ef1dedbe8"
+
+load-json-file@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0"
+  dependencies:
+    graceful-fs "^4.1.2"
+    parse-json "^2.2.0"
+    pify "^2.0.0"
+    pinkie-promise "^2.0.0"
+    strip-bom "^2.0.0"
+
+load-json-file@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8"
+  dependencies:
+    graceful-fs "^4.1.2"
+    parse-json "^2.2.0"
+    pify "^2.0.0"
+    strip-bom "^3.0.0"
+
+loader-runner@^2.3.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2"
+
+loader-utils@^0.2.15:
+  version "0.2.17"
+  resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348"
+  dependencies:
+    big.js "^3.1.3"
+    emojis-list "^2.0.0"
+    json5 "^0.5.0"
+    object-assign "^4.0.1"
+
+loader-utils@^1.0.0, loader-utils@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd"
+  dependencies:
+    big.js "^3.1.3"
+    emojis-list "^2.0.0"
+    json5 "^0.5.0"
+
+locate-path@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"
+  dependencies:
+    p-locate "^2.0.0"
+    path-exists "^3.0.0"
+
+lodash.memoize@~3.0.3:
+  version "3.0.4"
+  resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-3.0.4.tgz#2dcbd2c287cbc0a55cc42328bd0c736150d53e3f"
+
+lodash.sortby@^4.7.0:
+  version "4.7.0"
+  resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438"
+
+lodash@^3.10.1:
+  version "3.10.1"
+  resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6"
+
+lodash@^4.0.0, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.4, lodash@^4.3.0, lodash@^4.5.0:
+  version "4.17.5"
+  resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.5.tgz#99a92d65c0272debe8c96b6057bc8fbfa3bed511"
+
+log4js@^2.3.9:
+  version "2.5.3"
+  resolved "https://registry.yarnpkg.com/log4js/-/log4js-2.5.3.tgz#38bb7bde5e9c1c181bd75e8bc128c5cd0409caf1"
+  dependencies:
+    circular-json "^0.5.1"
+    date-format "^1.2.0"
+    debug "^3.1.0"
+    semver "^5.3.0"
+    streamroller "^0.7.0"
+  optionalDependencies:
+    amqplib "^0.5.2"
+    axios "^0.15.3"
+    hipchat-notifier "^1.1.0"
+    loggly "^1.1.0"
+    mailgun-js "^0.7.0"
+    nodemailer "^2.5.0"
+    redis "^2.7.1"
+    slack-node "~0.2.0"
+
+loggly@^1.1.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/loggly/-/loggly-1.1.1.tgz#0a0fc1d3fa3a5ec44fdc7b897beba2a4695cebee"
+  dependencies:
+    json-stringify-safe "5.0.x"
+    request "2.75.x"
+    timespan "2.3.x"
+
+longest@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097"
+
+loose-envify@^1.0.0:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848"
+  dependencies:
+    js-tokens "^3.0.0"
+
+lowercase-keys@1.0.0, lowercase-keys@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306"
+
+lru-cache@4.1.x, lru-cache@^4.0.1, lru-cache@^4.1.1:
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55"
+  dependencies:
+    pseudomap "^1.0.2"
+    yallist "^2.1.2"
+
+lru-cache@~2.6.5:
+  version "2.6.5"
+  resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.6.5.tgz#e56d6354148ede8d7707b58d143220fd08df0fd5"
+
+magic-string@^0.14.0:
+  version "0.14.0"
+  resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.14.0.tgz#57224aef1701caeed273b17a39a956e72b172462"
+  dependencies:
+    vlq "^0.2.1"
+
+magic-string@^0.22.4:
+  version "0.22.4"
+  resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.22.4.tgz#31039b4e40366395618c1d6cf8193c53917475ff"
+  dependencies:
+    vlq "^0.2.1"
+
+mailcomposer@4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/mailcomposer/-/mailcomposer-4.0.1.tgz#0e1c44b2a07cf740ee17dc149ba009f19cadfeb4"
+  dependencies:
+    buildmail "4.0.1"
+    libmime "3.0.0"
+
+mailgun-js@^0.7.0:
+  version "0.7.15"
+  resolved "https://registry.yarnpkg.com/mailgun-js/-/mailgun-js-0.7.15.tgz#ee366a20dac64c3c15c03d6c1b3e0ed795252abb"
+  dependencies:
+    async "~2.1.2"
+    debug "~2.2.0"
+    form-data "~2.1.1"
+    inflection "~1.10.0"
+    is-stream "^1.1.0"
+    path-proxy "~1.0.0"
+    proxy-agent "~2.0.0"
+    q "~1.4.0"
+    tsscmp "~1.0.0"
+
+make-dir@^1.0.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.2.0.tgz#6d6a49eead4aae296c53bbf3a1a008bd6c89469b"
+  dependencies:
+    pify "^3.0.0"
+
+makeerror@1.0.x:
+  version "1.0.11"
+  resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c"
+  dependencies:
+    tmpl "1.0.x"
+
+map-cache@^0.2.2:
+  version "0.2.2"
+  resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"
+
+map-visit@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f"
+  dependencies:
+    object-visit "^1.0.0"
+
+md5.js@^1.3.4:
+  version "1.3.4"
+  resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.4.tgz#e9bdbde94a20a5ac18b04340fc5764d5b09d901d"
+  dependencies:
+    hash-base "^3.0.0"
+    inherits "^2.0.1"
+
+media-typer@0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
+
+mem@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76"
+  dependencies:
+    mimic-fn "^1.0.0"
+
+memory-fs@^0.4.0, memory-fs@~0.4.1:
+  version "0.4.1"
+  resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552"
+  dependencies:
+    errno "^0.1.3"
+    readable-stream "^2.0.1"
+
+merge-stream@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1"
+  dependencies:
+    readable-stream "^2.0.1"
+
+merge@^1.1.3:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da"
+
+micromatch@^2.1.5, micromatch@^2.3.11:
+  version "2.3.11"
+  resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565"
+  dependencies:
+    arr-diff "^2.0.0"
+    array-unique "^0.2.1"
+    braces "^1.8.2"
+    expand-brackets "^0.1.4"
+    extglob "^0.3.1"
+    filename-regex "^2.0.0"
+    is-extglob "^1.0.0"
+    is-glob "^2.0.1"
+    kind-of "^3.0.2"
+    normalize-path "^2.0.1"
+    object.omit "^2.0.0"
+    parse-glob "^3.0.4"
+    regex-cache "^0.4.2"
+
+micromatch@^3.1.4, micromatch@^3.1.8:
+  version "3.1.9"
+  resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.9.tgz#15dc93175ae39e52e93087847096effc73efcf89"
+  dependencies:
+    arr-diff "^4.0.0"
+    array-unique "^0.3.2"
+    braces "^2.3.1"
+    define-property "^2.0.2"
+    extend-shallow "^3.0.2"
+    extglob "^2.0.4"
+    fragment-cache "^0.2.1"
+    kind-of "^6.0.2"
+    nanomatch "^1.2.9"
+    object.pick "^1.3.0"
+    regex-not "^1.0.0"
+    snapdragon "^0.8.1"
+    to-regex "^3.0.1"
+
+miller-rabin@^4.0.0:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d"
+  dependencies:
+    bn.js "^4.0.0"
+    brorand "^1.0.1"
+
+mime-db@~1.33.0:
+  version "1.33.0"
+  resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db"
+
+mime-types@^2.1.11, mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.18, mime-types@~2.1.7:
+  version "2.1.18"
+  resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8"
+  dependencies:
+    mime-db "~1.33.0"
+
+mime@^1.3.4, mime@^1.5.0:
+  version "1.6.0"
+  resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
+
+mimic-fn@^1.0.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022"
+
+mimic-response@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.0.tgz#df3d3652a73fded6b9b0b24146e6fd052353458e"
+
+minimalistic-assert@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz#702be2dda6b37f4836bcb3f5db56641b64a1d3d3"
+
+minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
+
+minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4:
+  version "3.0.4"
+  resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
+  dependencies:
+    brace-expansion "^1.1.7"
+
+minimist@0.0.8:
+  version "0.0.8"
+  resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
+
+minimist@^1.1.0, minimist@^1.1.1, minimist@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
+
+minimist@~0.0.1:
+  version "0.0.10"
+  resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf"
+
+mississippi@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-2.0.0.tgz#3442a508fafc28500486feea99409676e4ee5a6f"
+  dependencies:
+    concat-stream "^1.5.0"
+    duplexify "^3.4.2"
+    end-of-stream "^1.1.0"
+    flush-write-stream "^1.0.0"
+    from2 "^2.1.0"
+    parallel-transform "^1.1.0"
+    pump "^2.0.1"
+    pumpify "^1.3.3"
+    stream-each "^1.1.0"
+    through2 "^2.0.0"
+
+mixin-deep@^1.2.0:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe"
+  dependencies:
+    for-in "^1.0.2"
+    is-extendable "^1.0.1"
+
+"mkdirp@>=0.5 0", mkdirp@^0.5.1, mkdirp@~0.5.0:
+  version "0.5.1"
+  resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
+  dependencies:
+    minimist "0.0.8"
+
+module-deps@^4.0.8:
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/module-deps/-/module-deps-4.1.1.tgz#23215833f1da13fd606ccb8087b44852dcb821fd"
+  dependencies:
+    JSONStream "^1.0.3"
+    browser-resolve "^1.7.0"
+    cached-path-relative "^1.0.0"
+    concat-stream "~1.5.0"
+    defined "^1.0.0"
+    detective "^4.0.0"
+    duplexer2 "^0.1.2"
+    inherits "^2.0.1"
+    parents "^1.0.0"
+    readable-stream "^2.0.2"
+    resolve "^1.1.3"
+    stream-combiner2 "^1.1.1"
+    subarg "^1.0.0"
+    through2 "^2.0.0"
+    xtend "^4.0.0"
+
+move-concurrently@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92"
+  dependencies:
+    aproba "^1.1.1"
+    copy-concurrently "^1.0.0"
+    fs-write-stream-atomic "^1.0.8"
+    mkdirp "^0.5.1"
+    rimraf "^2.5.4"
+    run-queue "^1.0.3"
+
+ms@0.7.1:
+  version "0.7.1"
+  resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098"
+
+ms@2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
+
+mute-stream@0.0.7:
+  version "0.0.7"
+  resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab"
+
+nan@^2.3.0:
+  version "2.9.2"
+  resolved "https://registry.yarnpkg.com/nan/-/nan-2.9.2.tgz#f564d75f5f8f36a6d9456cca7a6c4fe488ab7866"
+
+nanomatch@^1.2.9:
+  version "1.2.9"
+  resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.9.tgz#879f7150cb2dab7a471259066c104eee6e0fa7c2"
+  dependencies:
+    arr-diff "^4.0.0"
+    array-unique "^0.3.2"
+    define-property "^2.0.2"
+    extend-shallow "^3.0.2"
+    fragment-cache "^0.2.1"
+    is-odd "^2.0.0"
+    is-windows "^1.0.2"
+    kind-of "^6.0.2"
+    object.pick "^1.3.0"
+    regex-not "^1.0.0"
+    snapdragon "^0.8.1"
+    to-regex "^3.0.1"
+
+natural-compare@^1.4.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
+
+negotiator@0.6.1:
+  version "0.6.1"
+  resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9"
+
+neo-async@^2.5.0:
+  version "2.5.0"
+  resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.0.tgz#76b1c823130cca26acfbaccc8fbaf0a2fa33b18f"
+
+netmask@~1.0.4:
+  version "1.0.6"
+  resolved "https://registry.yarnpkg.com/netmask/-/netmask-1.0.6.tgz#20297e89d86f6f6400f250d9f4f6b4c1945fcd35"
+
+node-int64@^0.4.0:
+  version "0.4.0"
+  resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b"
+
+node-libs-browser@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.1.0.tgz#5f94263d404f6e44767d726901fff05478d600df"
+  dependencies:
+    assert "^1.1.1"
+    browserify-zlib "^0.2.0"
+    buffer "^4.3.0"
+    console-browserify "^1.1.0"
+    constants-browserify "^1.0.0"
+    crypto-browserify "^3.11.0"
+    domain-browser "^1.1.1"
+    events "^1.0.0"
+    https-browserify "^1.0.0"
+    os-browserify "^0.3.0"
+    path-browserify "0.0.0"
+    process "^0.11.10"
+    punycode "^1.2.4"
+    querystring-es3 "^0.2.0"
+    readable-stream "^2.3.3"
+    stream-browserify "^2.0.1"
+    stream-http "^2.7.2"
+    string_decoder "^1.0.0"
+    timers-browserify "^2.0.4"
+    tty-browserify "0.0.0"
+    url "^0.11.0"
+    util "^0.10.3"
+    vm-browserify "0.0.4"
+
+node-notifier@^5.2.1:
+  version "5.2.1"
+  resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.2.1.tgz#fa313dd08f5517db0e2502e5758d664ac69f9dea"
+  dependencies:
+    growly "^1.3.0"
+    semver "^5.4.1"
+    shellwords "^0.1.1"
+    which "^1.3.0"
+
+node-pre-gyp@^0.6.39:
+  version "0.6.39"
+  resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.39.tgz#c00e96860b23c0e1420ac7befc5044e1d78d8649"
+  dependencies:
+    detect-libc "^1.0.2"
+    hawk "3.1.3"
+    mkdirp "^0.5.1"
+    nopt "^4.0.1"
+    npmlog "^4.0.2"
+    rc "^1.1.7"
+    request "2.81.0"
+    rimraf "^2.6.1"
+    semver "^5.3.0"
+    tar "^2.2.1"
+    tar-pack "^3.4.0"
+
+node-uuid@~1.4.7:
+  version "1.4.8"
+  resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.8.tgz#b040eb0923968afabf8d32fb1f17f1167fdab907"
+
+node.extend@1.0.8:
+  version "1.0.8"
+  resolved "https://registry.yarnpkg.com/node.extend/-/node.extend-1.0.8.tgz#bab04379f7383f4587990c9df07b6a7f65db772b"
+  dependencies:
+    is "~0.2.6"
+    object-keys "~0.4.0"
+
+node.flow@1.2.3:
+  version "1.2.3"
+  resolved "https://registry.yarnpkg.com/node.flow/-/node.flow-1.2.3.tgz#e1c44a82aeca8d78b458a77fb3dc642f2eba2649"
+  dependencies:
+    node.extend "1.0.8"
+
+nodemailer-direct-transport@3.3.2:
+  version "3.3.2"
+  resolved "https://registry.yarnpkg.com/nodemailer-direct-transport/-/nodemailer-direct-transport-3.3.2.tgz#e96fafb90358560947e569017d97e60738a50a86"
+  dependencies:
+    nodemailer-shared "1.1.0"
+    smtp-connection "2.12.0"
+
+nodemailer-fetch@1.6.0:
+  version "1.6.0"
+  resolved "https://registry.yarnpkg.com/nodemailer-fetch/-/nodemailer-fetch-1.6.0.tgz#79c4908a1c0f5f375b73fe888da9828f6dc963a4"
+
+nodemailer-shared@1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/nodemailer-shared/-/nodemailer-shared-1.1.0.tgz#cf5994e2fd268d00f5cf0fa767a08169edb07ec0"
+  dependencies:
+    nodemailer-fetch "1.6.0"
+
+nodemailer-smtp-pool@2.8.2:
+  version "2.8.2"
+  resolved "https://registry.yarnpkg.com/nodemailer-smtp-pool/-/nodemailer-smtp-pool-2.8.2.tgz#2eb94d6cf85780b1b4725ce853b9cbd5e8da8c72"
+  dependencies:
+    nodemailer-shared "1.1.0"
+    nodemailer-wellknown "0.1.10"
+    smtp-connection "2.12.0"
+
+nodemailer-smtp-transport@2.7.2:
+  version "2.7.2"
+  resolved "https://registry.yarnpkg.com/nodemailer-smtp-transport/-/nodemailer-smtp-transport-2.7.2.tgz#03d71c76314f14ac7dbc7bf033a6a6d16d67fb77"
+  dependencies:
+    nodemailer-shared "1.1.0"
+    nodemailer-wellknown "0.1.10"
+    smtp-connection "2.12.0"
+
+nodemailer-wellknown@0.1.10:
+  version "0.1.10"
+  resolved "https://registry.yarnpkg.com/nodemailer-wellknown/-/nodemailer-wellknown-0.1.10.tgz#586db8101db30cb4438eb546737a41aad0cf13d5"
+
+nodemailer@^2.5.0:
+  version "2.7.2"
+  resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-2.7.2.tgz#f242e649aeeae39b6c7ed740ef7b061c404d30f9"
+  dependencies:
+    libmime "3.0.0"
+    mailcomposer "4.0.1"
+    nodemailer-direct-transport "3.3.2"
+    nodemailer-shared "1.1.0"
+    nodemailer-smtp-pool "2.8.2"
+    nodemailer-smtp-transport "2.7.2"
+    socks "1.1.9"
+
+nopt@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d"
+  dependencies:
+    abbrev "1"
+    osenv "^0.1.4"
+
+normalize-package-data@^2.3.2:
+  version "2.4.0"
+  resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f"
+  dependencies:
+    hosted-git-info "^2.1.4"
+    is-builtin-module "^1.0.0"
+    semver "2 || 3 || 4 || 5"
+    validate-npm-package-license "^3.0.1"
+
+normalize-path@^2.0.0, normalize-path@^2.0.1, normalize-path@^2.1.1:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
+  dependencies:
+    remove-trailing-separator "^1.0.1"
+
+normalize-url@2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-2.0.1.tgz#835a9da1551fa26f70e92329069a23aa6574d7e6"
+  dependencies:
+    prepend-http "^2.0.0"
+    query-string "^5.0.1"
+    sort-keys "^2.0.0"
+
+npm-run-path@^2.0.0:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f"
+  dependencies:
+    path-key "^2.0.0"
+
+npmlog@^4.0.2:
+  version "4.1.2"
+  resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
+  dependencies:
+    are-we-there-yet "~1.1.2"
+    console-control-strings "~1.1.0"
+    gauge "~2.7.3"
+    set-blocking "~2.0.0"
+
+null-check@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/null-check/-/null-check-1.0.0.tgz#977dffd7176012b9ec30d2a39db5cf72a0439edd"
+
+number-is-nan@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
+
+nwmatcher@^1.4.3:
+  version "1.4.3"
+  resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.4.3.tgz#64348e3b3d80f035b40ac11563d278f8b72db89c"
+
+oauth-sign@~0.8.1, oauth-sign@~0.8.2:
+  version "0.8.2"
+  resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43"
+
+object-assign@^4.0.1, object-assign@^4.1.0:
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+
+object-component@0.0.3:
+  version "0.0.3"
+  resolved "https://registry.yarnpkg.com/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291"
+
+object-copy@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c"
+  dependencies:
+    copy-descriptor "^0.1.0"
+    define-property "^0.2.5"
+    kind-of "^3.0.3"
+
+object-keys@^1.0.8:
+  version "1.0.11"
+  resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d"
+
+object-keys@~0.4.0:
+  version "0.4.0"
+  resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336"
+
+object-visit@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb"
+  dependencies:
+    isobject "^3.0.0"
+
+object.getownpropertydescriptors@^2.0.3:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16"
+  dependencies:
+    define-properties "^1.1.2"
+    es-abstract "^1.5.1"
+
+object.omit@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa"
+  dependencies:
+    for-own "^0.1.4"
+    is-extendable "^0.1.1"
+
+object.pick@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747"
+  dependencies:
+    isobject "^3.0.1"
+
+observatory@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/observatory/-/observatory-1.0.0.tgz#2baa606e8299e6866914ec9c8a4db6a41136e59b"
+  dependencies:
+    ansi-escapes "^1.1.0"
+    chalk "^1.1.1"
+    lodash "^3.10.1"
+
+on-finished@~2.3.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
+  dependencies:
+    ee-first "1.1.1"
+
+once@^1.3.0, once@^1.3.1, once@^1.3.3, once@^1.4.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+  dependencies:
+    wrappy "1"
+
+onetime@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4"
+  dependencies:
+    mimic-fn "^1.0.0"
+
+optimist@^0.6.1:
+  version "0.6.1"
+  resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686"
+  dependencies:
+    minimist "~0.0.1"
+    wordwrap "~0.0.2"
+
+optionator@^0.8.1, optionator@^0.8.2:
+  version "0.8.2"
+  resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64"
+  dependencies:
+    deep-is "~0.1.3"
+    fast-levenshtein "~2.0.4"
+    levn "~0.3.0"
+    prelude-ls "~1.1.2"
+    type-check "~0.3.2"
+    wordwrap "~1.0.0"
+
+os-browserify@^0.3.0, os-browserify@~0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27"
+
+os-homedir@^1.0.0, os-homedir@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
+
+os-locale@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2"
+  dependencies:
+    execa "^0.7.0"
+    lcid "^1.0.0"
+    mem "^1.1.0"
+
+os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
+
+osenv@^0.1.4:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410"
+  dependencies:
+    os-homedir "^1.0.0"
+    os-tmpdir "^1.0.0"
+
+p-cancelable@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.3.0.tgz#b9e123800bcebb7ac13a479be195b507b98d30fa"
+
+p-finally@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
+
+p-is-promise@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-1.1.0.tgz#9c9456989e9f6588017b0434d56097675c3da05e"
+
+p-limit@^1.1.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.2.0.tgz#0e92b6bedcb59f022c13d0f1949dc82d15909f1c"
+  dependencies:
+    p-try "^1.0.0"
+
+p-locate@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
+  dependencies:
+    p-limit "^1.1.0"
+
+p-timeout@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-2.0.1.tgz#d8dd1979595d2dc0139e1fe46b8b646cb3cdf038"
+  dependencies:
+    p-finally "^1.0.0"
+
+p-try@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"
+
+pac-proxy-agent@1:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-1.1.0.tgz#34a385dfdf61d2f0ecace08858c745d3e791fd4d"
+  dependencies:
+    agent-base "2"
+    debug "2"
+    extend "3"
+    get-uri "2"
+    http-proxy-agent "1"
+    https-proxy-agent "1"
+    pac-resolver "~2.0.0"
+    raw-body "2"
+    socks-proxy-agent "2"
+
+pac-resolver@~2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/pac-resolver/-/pac-resolver-2.0.0.tgz#99b88d2f193fbdeefc1c9a529c1f3260ab5277cd"
+  dependencies:
+    co "~3.0.6"
+    degenerator "~1.0.2"
+    ip "1.0.1"
+    netmask "~1.0.4"
+    thunkify "~2.1.1"
+
+pako@~1.0.5:
+  version "1.0.6"
+  resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258"
+
+parallel-transform@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.1.0.tgz#d410f065b05da23081fcd10f28854c29bda33b06"
+  dependencies:
+    cyclist "~0.2.2"
+    inherits "^2.0.3"
+    readable-stream "^2.1.5"
+
+parents@^1.0.0, parents@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/parents/-/parents-1.0.1.tgz#fedd4d2bf193a77745fe71e371d73c3307d9c751"
+  dependencies:
+    path-platform "~0.11.15"
+
+parse-asn1@^5.0.0:
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.0.tgz#37c4f9b7ed3ab65c74817b5f2480937fbf97c712"
+  dependencies:
+    asn1.js "^4.0.0"
+    browserify-aes "^1.0.0"
+    create-hash "^1.1.0"
+    evp_bytestokey "^1.0.0"
+    pbkdf2 "^3.0.3"
+
+parse-glob@^3.0.4:
+  version "3.0.4"
+  resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c"
+  dependencies:
+    glob-base "^0.3.0"
+    is-dotfile "^1.0.0"
+    is-extglob "^1.0.0"
+    is-glob "^2.0.0"
+
+parse-json@^2.2.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
+  dependencies:
+    error-ex "^1.2.0"
+
+parse5@4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608"
+
+parseqs@0.0.5:
+  version "0.0.5"
+  resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.5.tgz#d5208a3738e46766e291ba2ea173684921a8b89d"
+  dependencies:
+    better-assert "~1.0.0"
+
+parseuri@0.0.5:
+  version "0.0.5"
+  resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.5.tgz#80204a50d4dbb779bfdc6ebe2778d90e4bce320a"
+  dependencies:
+    better-assert "~1.0.0"
+
+parseurl@~1.3.2:
+  version "1.3.2"
+  resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3"
+
+pascalcase@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14"
+
+path-browserify@0.0.0, path-browserify@~0.0.0:
+  version "0.0.0"
+  resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a"
+
+path-dirname@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0"
+
+path-exists@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b"
+  dependencies:
+    pinkie-promise "^2.0.0"
+
+path-exists@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
+
+path-is-absolute@^1.0.0, path-is-absolute@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+
+path-is-inside@^1.0.1, path-is-inside@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53"
+
+path-key@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
+
+path-parse@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1"
+
+path-platform@~0.11.15:
+  version "0.11.15"
+  resolved "https://registry.yarnpkg.com/path-platform/-/path-platform-0.11.15.tgz#e864217f74c36850f0852b78dc7bf7d4a5721bf2"
+
+path-proxy@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/path-proxy/-/path-proxy-1.0.0.tgz#18e8a36859fc9d2f1a53b48dee138543c020de5e"
+  dependencies:
+    inflection "~1.3.0"
+
+path-type@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441"
+  dependencies:
+    graceful-fs "^4.1.2"
+    pify "^2.0.0"
+    pinkie-promise "^2.0.0"
+
+path-type@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73"
+  dependencies:
+    pify "^2.0.0"
+
+pbkdf2@^3.0.3:
+  version "3.0.14"
+  resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.14.tgz#a35e13c64799b06ce15320f459c230e68e73bade"
+  dependencies:
+    create-hash "^1.1.2"
+    create-hmac "^1.1.4"
+    ripemd160 "^2.0.1"
+    safe-buffer "^5.0.1"
+    sha.js "^2.4.8"
+
+performance-now@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5"
+
+performance-now@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
+
+pify@^2.0.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
+
+pify@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"
+
+pinkie-promise@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa"
+  dependencies:
+    pinkie "^2.0.0"
+
+pinkie@^2.0.0:
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
+
+pkg-dir@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b"
+  dependencies:
+    find-up "^2.1.0"
+
+pluralize@^7.0.0:
+  version "7.0.0"
+  resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777"
+
+pn@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb"
+
+posix-character-classes@^0.1.0:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
+
+prelude-ls@~1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
+
+prepend-http@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897"
+
+preserve@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b"
+
+pretty-format@^22.4.0:
+  version "22.4.0"
+  resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-22.4.0.tgz#237b1f7e1c50ed03bc65c03ccc29d7c8bb7beb94"
+  dependencies:
+    ansi-regex "^3.0.0"
+    ansi-styles "^3.2.0"
+
+private@^0.1.7:
+  version "0.1.8"
+  resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff"
+
+process-nextick-args@~1.0.6:
+  version "1.0.7"
+  resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3"
+
+process-nextick-args@~2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa"
+
+process@^0.11.10, process@~0.11.0:
+  version "0.11.10"
+  resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
+
+progress@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f"
+
+promise-inflight@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3"
+
+proxy-agent@~2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-2.0.0.tgz#57eb5347aa805d74ec681cb25649dba39c933499"
+  dependencies:
+    agent-base "2"
+    debug "2"
+    extend "3"
+    http-proxy-agent "1"
+    https-proxy-agent "1"
+    lru-cache "~2.6.5"
+    pac-proxy-agent "1"
+    socks-proxy-agent "2"
+
+prr@~1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
+
+pseudomap@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
+
+public-encrypt@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.0.tgz#39f699f3a46560dd5ebacbca693caf7c65c18cc6"
+  dependencies:
+    bn.js "^4.1.0"
+    browserify-rsa "^4.0.0"
+    create-hash "^1.1.0"
+    parse-asn1 "^5.0.0"
+    randombytes "^2.0.1"
+
+pump@^2.0.0, pump@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909"
+  dependencies:
+    end-of-stream "^1.1.0"
+    once "^1.3.1"
+
+pumpify@^1.3.3:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.4.0.tgz#80b7c5df7e24153d03f0e7ac8a05a5d068bd07fb"
+  dependencies:
+    duplexify "^3.5.3"
+    inherits "^2.0.3"
+    pump "^2.0.0"
+
+punycode@1.3.2:
+  version "1.3.2"
+  resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d"
+
+punycode@1.4.1, punycode@^1.2.4, punycode@^1.3.2, punycode@^1.4.1:
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
+
+punycode@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.0.tgz#5f863edc89b96db09074bad7947bf09056ca4e7d"
+
+q@~1.4.0:
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/q/-/q-1.4.1.tgz#55705bcd93c5f3673530c2c2cbc0c2b3addc286e"
+
+qjobs@^1.1.4:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/qjobs/-/qjobs-1.2.0.tgz#c45e9c61800bd087ef88d7e256423bdd49e5d071"
+
+qs@6.5.1, qs@~6.5.1:
+  version "6.5.1"
+  resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8"
+
+qs@~6.2.0:
+  version "6.2.3"
+  resolved "https://registry.yarnpkg.com/qs/-/qs-6.2.3.tgz#1cfcb25c10a9b2b483053ff39f5dfc9233908cfe"
+
+qs@~6.4.0:
+  version "6.4.0"
+  resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233"
+
+query-string@^5.0.1:
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.0.tgz#9583b15fd1307f899e973ed418886426a9976469"
+  dependencies:
+    decode-uri-component "^0.2.0"
+    object-assign "^4.1.0"
+    strict-uri-encode "^1.0.0"
+
+querystring-es3@^0.2.0, querystring-es3@~0.2.0:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73"
+
+querystring@0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
+
+randomatic@^1.1.3:
+  version "1.1.7"
+  resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c"
+  dependencies:
+    is-number "^3.0.0"
+    kind-of "^4.0.0"
+
+randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5:
+  version "2.0.6"
+  resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.6.tgz#d302c522948588848a8d300c932b44c24231da80"
+  dependencies:
+    safe-buffer "^5.1.0"
+
+randomfill@^1.0.3:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458"
+  dependencies:
+    randombytes "^2.0.5"
+    safe-buffer "^5.1.0"
+
+range-parser@^1.0.3, range-parser@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e"
+
+raw-body@2, raw-body@2.3.2:
+  version "2.3.2"
+  resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.2.tgz#bcd60c77d3eb93cde0050295c3f379389bc88f89"
+  dependencies:
+    bytes "3.0.0"
+    http-errors "1.6.2"
+    iconv-lite "0.4.19"
+    unpipe "1.0.0"
+
+rc@^1.1.7:
+  version "1.2.5"
+  resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.5.tgz#275cd687f6e3b36cc756baa26dfee80a790301fd"
+  dependencies:
+    deep-extend "~0.4.0"
+    ini "~1.3.0"
+    minimist "^1.2.0"
+    strip-json-comments "~2.0.1"
+
+read-only-stream@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/read-only-stream/-/read-only-stream-2.0.0.tgz#2724fd6a8113d73764ac288d4386270c1dbf17f0"
+  dependencies:
+    readable-stream "^2.0.2"
+
+read-pkg-up@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02"
+  dependencies:
+    find-up "^1.0.0"
+    read-pkg "^1.0.0"
+
+read-pkg-up@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be"
+  dependencies:
+    find-up "^2.0.0"
+    read-pkg "^2.0.0"
+
+read-pkg@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28"
+  dependencies:
+    load-json-file "^1.0.0"
+    normalize-package-data "^2.3.2"
+    path-type "^1.0.0"
+
+read-pkg@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8"
+  dependencies:
+    load-json-file "^2.0.0"
+    normalize-package-data "^2.3.2"
+    path-type "^2.0.0"
+
+"readable-stream@1 || 2", readable-stream@2, readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.3:
+  version "2.3.4"
+  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.4.tgz#c946c3f47fa7d8eabc0b6150f4a12f69a4574071"
+  dependencies:
+    core-util-is "~1.0.0"
+    inherits "~2.0.3"
+    isarray "~1.0.0"
+    process-nextick-args "~2.0.0"
+    safe-buffer "~5.1.1"
+    string_decoder "~1.0.3"
+    util-deprecate "~1.0.1"
+
+readable-stream@1.1.x, "readable-stream@1.x >=1.1.9":
+  version "1.1.14"
+  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9"
+  dependencies:
+    core-util-is "~1.0.0"
+    inherits "~2.0.1"
+    isarray "0.0.1"
+    string_decoder "~0.10.x"
+
+readable-stream@~2.0.0, readable-stream@~2.0.5:
+  version "2.0.6"
+  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e"
+  dependencies:
+    core-util-is "~1.0.0"
+    inherits "~2.0.1"
+    isarray "~1.0.0"
+    process-nextick-args "~1.0.6"
+    string_decoder "~0.10.x"
+    util-deprecate "~1.0.1"
+
+readdirp@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78"
+  dependencies:
+    graceful-fs "^4.1.2"
+    minimatch "^3.0.2"
+    readable-stream "^2.0.2"
+    set-immediate-shim "^1.0.1"
+
+realpath-native@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.0.0.tgz#7885721a83b43bd5327609f0ddecb2482305fdf0"
+  dependencies:
+    util.promisify "^1.0.0"
+
+redis-commands@^1.2.0:
+  version "1.3.5"
+  resolved "https://registry.yarnpkg.com/redis-commands/-/redis-commands-1.3.5.tgz#4495889414f1e886261180b1442e7295602d83a2"
+
+redis-parser@^2.6.0:
+  version "2.6.0"
+  resolved "https://registry.yarnpkg.com/redis-parser/-/redis-parser-2.6.0.tgz#52ed09dacac108f1a631c07e9b69941e7a19504b"
+
+redis@^2.7.1:
+  version "2.8.0"
+  resolved "https://registry.yarnpkg.com/redis/-/redis-2.8.0.tgz#202288e3f58c49f6079d97af7a10e1303ae14b02"
+  dependencies:
+    double-ended-queue "^2.1.0-0"
+    redis-commands "^1.2.0"
+    redis-parser "^2.6.0"
+
+regenerator-runtime@^0.11.0:
+  version "0.11.1"
+  resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
+
+regex-cache@^0.4.2:
+  version "0.4.4"
+  resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd"
+  dependencies:
+    is-equal-shallow "^0.1.3"
+
+regex-not@^1.0.0, regex-not@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c"
+  dependencies:
+    extend-shallow "^3.0.2"
+    safe-regex "^1.1.0"
+
+remove-trailing-separator@^1.0.1:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
+
+repeat-element@^1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a"
+
+repeat-string@^0.2.2:
+  version "0.2.2"
+  resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-0.2.2.tgz#c7a8d3236068362059a7e4651fc6884e8b1fb4ae"
+
+repeat-string@^1.5.2, repeat-string@^1.6.1:
+  version "1.6.1"
+  resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
+
+repeating@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda"
+  dependencies:
+    is-finite "^1.0.0"
+
+replace-in-file@^3.1.1:
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/replace-in-file/-/replace-in-file-3.1.1.tgz#84052a6948771e8833a0738a0eb905feb0c9c7f4"
+  dependencies:
+    chalk "^2.3.0"
+    glob "^7.1.2"
+    yargs "^11.0.0"
+
+request-promise-core@1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.1.tgz#3eee00b2c5aa83239cfb04c5700da36f81cd08b6"
+  dependencies:
+    lodash "^4.13.1"
+
+request-promise-native@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.5.tgz#5281770f68e0c9719e5163fd3fab482215f4fda5"
+  dependencies:
+    request-promise-core "1.1.1"
+    stealthy-require "^1.1.0"
+    tough-cookie ">=2.3.3"
+
+request@2.75.x:
+  version "2.75.0"
+  resolved "https://registry.yarnpkg.com/request/-/request-2.75.0.tgz#d2b8268a286da13eaa5d01adf5d18cc90f657d93"
+  dependencies:
+    aws-sign2 "~0.6.0"
+    aws4 "^1.2.1"
+    bl "~1.1.2"
+    caseless "~0.11.0"
+    combined-stream "~1.0.5"
+    extend "~3.0.0"
+    forever-agent "~0.6.1"
+    form-data "~2.0.0"
+    har-validator "~2.0.6"
+    hawk "~3.1.3"
+    http-signature "~1.1.0"
+    is-typedarray "~1.0.0"
+    isstream "~0.1.2"
+    json-stringify-safe "~5.0.1"
+    mime-types "~2.1.7"
+    node-uuid "~1.4.7"
+    oauth-sign "~0.8.1"
+    qs "~6.2.0"
+    stringstream "~0.0.4"
+    tough-cookie "~2.3.0"
+    tunnel-agent "~0.4.1"
+
+request@2.81.0:
+  version "2.81.0"
+  resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0"
+  dependencies:
+    aws-sign2 "~0.6.0"
+    aws4 "^1.2.1"
+    caseless "~0.12.0"
+    combined-stream "~1.0.5"
+    extend "~3.0.0"
+    forever-agent "~0.6.1"
+    form-data "~2.1.1"
+    har-validator "~4.2.1"
+    hawk "~3.1.3"
+    http-signature "~1.1.0"
+    is-typedarray "~1.0.0"
+    isstream "~0.1.2"
+    json-stringify-safe "~5.0.1"
+    mime-types "~2.1.7"
+    oauth-sign "~0.8.1"
+    performance-now "^0.2.0"
+    qs "~6.4.0"
+    safe-buffer "^5.0.1"
+    stringstream "~0.0.4"
+    tough-cookie "~2.3.0"
+    tunnel-agent "^0.6.0"
+    uuid "^3.0.0"
+
+request@^2.0.0, request@^2.74.0, request@^2.83.0:
+  version "2.83.0"
+  resolved "https://registry.yarnpkg.com/request/-/request-2.83.0.tgz#ca0b65da02ed62935887808e6f510381034e3356"
+  dependencies:
+    aws-sign2 "~0.7.0"
+    aws4 "^1.6.0"
+    caseless "~0.12.0"
+    combined-stream "~1.0.5"
+    extend "~3.0.1"
+    forever-agent "~0.6.1"
+    form-data "~2.3.1"
+    har-validator "~5.0.3"
+    hawk "~6.0.2"
+    http-signature "~1.2.0"
+    is-typedarray "~1.0.0"
+    isstream "~0.1.2"
+    json-stringify-safe "~5.0.1"
+    mime-types "~2.1.17"
+    oauth-sign "~0.8.2"
+    performance-now "^2.1.0"
+    qs "~6.5.1"
+    safe-buffer "^5.1.1"
+    stringstream "~0.0.5"
+    tough-cookie "~2.3.3"
+    tunnel-agent "^0.6.0"
+    uuid "^3.1.0"
+
+requestretry@^1.2.2:
+  version "1.13.0"
+  resolved "https://registry.yarnpkg.com/requestretry/-/requestretry-1.13.0.tgz#213ec1006eeb750e8b8ce54176283d15a8d55d94"
+  dependencies:
+    extend "^3.0.0"
+    lodash "^4.15.0"
+    request "^2.74.0"
+    when "^3.7.7"
+
+require-directory@^2.1.1:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
+
+require-main-filename@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1"
+
+require-uncached@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3"
+  dependencies:
+    caller-path "^0.1.0"
+    resolve-from "^1.0.0"
+
+requires-port@1.x.x:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
+
+resolve-cwd@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a"
+  dependencies:
+    resolve-from "^3.0.0"
+
+resolve-from@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226"
+
+resolve-from@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748"
+
+resolve-url@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
+
+resolve@1.1.7:
+  version "1.1.7"
+  resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b"
+
+resolve@^1.1.3, resolve@^1.1.4:
+  version "1.5.0"
+  resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36"
+  dependencies:
+    path-parse "^1.0.5"
+
+responselike@1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7"
+  dependencies:
+    lowercase-keys "^1.0.0"
+
+restore-cursor@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf"
+  dependencies:
+    onetime "^2.0.0"
+    signal-exit "^3.0.2"
+
+ret@~0.1.10:
+  version "0.1.15"
+  resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
+
+right-align@^0.1.1:
+  version "0.1.3"
+  resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef"
+  dependencies:
+    align-text "^0.1.1"
+
+rimraf@2, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.5.4, rimraf@^2.6.0, rimraf@^2.6.1, rimraf@^2.6.2:
+  version "2.6.2"
+  resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36"
+  dependencies:
+    glob "^7.0.5"
+
+rimraf@~2.2.6:
+  version "2.2.8"
+  resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582"
+
+ripemd160@^2.0.0, ripemd160@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.1.tgz#0f4584295c53a3628af7e6d79aca21ce57d1c6e7"
+  dependencies:
+    hash-base "^2.0.0"
+    inherits "^2.0.1"
+
+rmdir@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/rmdir/-/rmdir-1.2.0.tgz#4fe0357cb06168c258e73e968093dc4e8a0f3253"
+  dependencies:
+    node.flow "1.2.3"
+
+rollup-plugin-buble@^0.19.1:
+  version "0.19.2"
+  resolved "https://registry.yarnpkg.com/rollup-plugin-buble/-/rollup-plugin-buble-0.19.2.tgz#c0590c7d3d475b5ed59f129764ec93710cc6e8dd"
+  dependencies:
+    buble "^0.19.2"
+    rollup-pluginutils "^2.0.1"
+
+rollup-pluginutils@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.0.1.tgz#7ec95b3573f6543a46a6461bd9a7c544525d0fc0"
+  dependencies:
+    estree-walker "^0.3.0"
+    micromatch "^2.3.11"
+
+rollup@^0.56.2:
+  version "0.56.3"
+  resolved "https://registry.yarnpkg.com/rollup/-/rollup-0.56.3.tgz#7900695531afa1badd3235f285cc4aa0d49ce254"
+
+run-async@^2.2.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0"
+  dependencies:
+    is-promise "^2.1.0"
+
+run-queue@^1.0.0, run-queue@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47"
+  dependencies:
+    aproba "^1.1.1"
+
+rx-lite-aggregates@^4.0.8:
+  version "4.0.8"
+  resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be"
+  dependencies:
+    rx-lite "*"
+
+rx-lite@*, rx-lite@^4.0.8:
+  version "4.0.8"
+  resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444"
+
+safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
+  version "5.1.1"
+  resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853"
+
+safe-regex@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e"
+  dependencies:
+    ret "~0.1.10"
+
+sane@^2.0.0:
+  version "2.4.1"
+  resolved "https://registry.yarnpkg.com/sane/-/sane-2.4.1.tgz#29f991208cf28636720efdc584293e7fd66663a5"
+  dependencies:
+    anymatch "^1.3.0"
+    exec-sh "^0.2.0"
+    fb-watchman "^2.0.0"
+    minimatch "^3.0.2"
+    minimist "^1.1.1"
+    walker "~1.0.5"
+    watch "~0.18.0"
+  optionalDependencies:
+    fsevents "^1.1.1"
+
+sax@^1.2.4:
+  version "1.2.4"
+  resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
+
+schema-utils@^0.4.2:
+  version "0.4.5"
+  resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.5.tgz#21836f0608aac17b78f9e3e24daff14a5ca13a3e"
+  dependencies:
+    ajv "^6.1.0"
+    ajv-keywords "^3.1.0"
+
+"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1:
+  version "5.5.0"
+  resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab"
+
+semver@~5.0.1:
+  version "5.0.3"
+  resolved "https://registry.yarnpkg.com/semver/-/semver-5.0.3.tgz#77466de589cd5d3c95f138aa78bc569a3cb5d27a"
+
+serialize-javascript@^1.4.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.4.0.tgz#7c958514db6ac2443a8abc062dc9f7886a7f6005"
+
+set-blocking@^2.0.0, set-blocking@~2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
+
+set-getter@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/set-getter/-/set-getter-0.1.0.tgz#d769c182c9d5a51f409145f2fba82e5e86e80376"
+  dependencies:
+    to-object-path "^0.3.0"
+
+set-immediate-shim@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61"
+
+set-value@^0.4.3:
+  version "0.4.3"
+  resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1"
+  dependencies:
+    extend-shallow "^2.0.1"
+    is-extendable "^0.1.1"
+    is-plain-object "^2.0.1"
+    to-object-path "^0.3.0"
+
+set-value@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274"
+  dependencies:
+    extend-shallow "^2.0.1"
+    is-extendable "^0.1.1"
+    is-plain-object "^2.0.3"
+    split-string "^3.0.1"
+
+setimmediate@^1.0.4:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
+
+setprototypeof@1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04"
+
+sha.js@^2.4.0, sha.js@^2.4.8, sha.js@~2.4.4:
+  version "2.4.10"
+  resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.10.tgz#b1fde5cd7d11a5626638a07c604ab909cfa31f9b"
+  dependencies:
+    inherits "^2.0.1"
+    safe-buffer "^5.0.1"
+
+shasum@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/shasum/-/shasum-1.0.2.tgz#e7012310d8f417f4deb5712150e5678b87ae565f"
+  dependencies:
+    json-stable-stringify "~0.0.0"
+    sha.js "~2.4.4"
+
+shebang-command@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
+  dependencies:
+    shebang-regex "^1.0.0"
+
+shebang-regex@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
+
+shell-quote@^1.6.1:
+  version "1.6.1"
+  resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.6.1.tgz#f4781949cce402697127430ea3b3c5476f481767"
+  dependencies:
+    array-filter "~0.0.0"
+    array-map "~0.0.0"
+    array-reduce "~0.0.0"
+    jsonify "~0.0.0"
+
+shellwords@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b"
+
+signal-exit@^3.0.0, signal-exit@^3.0.2:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
+
+slack-node@~0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/slack-node/-/slack-node-0.2.0.tgz#de4b8dddaa8b793f61dbd2938104fdabf37dfa30"
+  dependencies:
+    requestretry "^1.2.2"
+
+slash@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55"
+
+slice-ansi@1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d"
+  dependencies:
+    is-fullwidth-code-point "^2.0.0"
+
+smart-buffer@^1.0.13, smart-buffer@^1.0.4:
+  version "1.1.15"
+  resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-1.1.15.tgz#7f114b5b65fab3e2a35aa775bb12f0d1c649bf16"
+
+smtp-connection@2.12.0:
+  version "2.12.0"
+  resolved "https://registry.yarnpkg.com/smtp-connection/-/smtp-connection-2.12.0.tgz#d76ef9127cb23c2259edb1e8349c2e8d5e2d74c1"
+  dependencies:
+    httpntlm "1.6.1"
+    nodemailer-shared "1.1.0"
+
+snapdragon-node@^2.0.1:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b"
+  dependencies:
+    define-property "^1.0.0"
+    isobject "^3.0.0"
+    snapdragon-util "^3.0.1"
+
+snapdragon-util@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2"
+  dependencies:
+    kind-of "^3.2.0"
+
+snapdragon@^0.8.1:
+  version "0.8.1"
+  resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.1.tgz#e12b5487faded3e3dea0ac91e9400bf75b401370"
+  dependencies:
+    base "^0.11.1"
+    debug "^2.2.0"
+    define-property "^0.2.5"
+    extend-shallow "^2.0.1"
+    map-cache "^0.2.2"
+    source-map "^0.5.6"
+    source-map-resolve "^0.5.0"
+    use "^2.0.0"
+
+sntp@1.x.x:
+  version "1.0.9"
+  resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198"
+  dependencies:
+    hoek "2.x.x"
+
+sntp@2.x.x:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/sntp/-/sntp-2.1.0.tgz#2c6cec14fedc2222739caf9b5c3d85d1cc5a2cc8"
+  dependencies:
+    hoek "4.x.x"
+
+socket.io-adapter@~1.1.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz#2a805e8a14d6372124dd9159ad4502f8cb07f06b"
+
+socket.io-client@2.0.4:
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-2.0.4.tgz#0918a552406dc5e540b380dcd97afc4a64332f8e"
+  dependencies:
+    backo2 "1.0.2"
+    base64-arraybuffer "0.1.5"
+    component-bind "1.0.0"
+    component-emitter "1.2.1"
+    debug "~2.6.4"
+    engine.io-client "~3.1.0"
+    has-cors "1.1.0"
+    indexof "0.0.1"
+    object-component "0.0.3"
+    parseqs "0.0.5"
+    parseuri "0.0.5"
+    socket.io-parser "~3.1.1"
+    to-array "0.1.4"
+
+socket.io-parser@~3.1.1:
+  version "3.1.3"
+  resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.1.3.tgz#ed2da5ee79f10955036e3da413bfd7f1e4d86c8e"
+  dependencies:
+    component-emitter "1.2.1"
+    debug "~3.1.0"
+    has-binary2 "~1.0.2"
+    isarray "2.0.1"
+
+socket.io@2.0.4:
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-2.0.4.tgz#c1a4590ceff87ecf13c72652f046f716b29e6014"
+  dependencies:
+    debug "~2.6.6"
+    engine.io "~3.1.0"
+    socket.io-adapter "~1.1.0"
+    socket.io-client "2.0.4"
+    socket.io-parser "~3.1.1"
+
+socks-proxy-agent@2:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-2.1.1.tgz#86ebb07193258637870e13b7bd99f26c663df3d3"
+  dependencies:
+    agent-base "2"
+    extend "3"
+    socks "~1.1.5"
+
+socks@1.1.9:
+  version "1.1.9"
+  resolved "https://registry.yarnpkg.com/socks/-/socks-1.1.9.tgz#628d7e4d04912435445ac0b6e459376cb3e6d691"
+  dependencies:
+    ip "^1.1.2"
+    smart-buffer "^1.0.4"
+
+socks@~1.1.5:
+  version "1.1.10"
+  resolved "https://registry.yarnpkg.com/socks/-/socks-1.1.10.tgz#5b8b7fc7c8f341c53ed056e929b7bf4de8ba7b5a"
+  dependencies:
+    ip "^1.1.4"
+    smart-buffer "^1.0.13"
+
+sort-keys@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-2.0.0.tgz#658535584861ec97d730d6cf41822e1f56684128"
+  dependencies:
+    is-plain-obj "^1.0.0"
+
+source-list-map@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.0.tgz#aaa47403f7b245a92fbc97ea08f250d6087ed085"
+
+source-map-resolve@^0.5.0:
+  version "0.5.1"
+  resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.1.tgz#7ad0f593f2281598e854df80f19aae4b92d7a11a"
+  dependencies:
+    atob "^2.0.0"
+    decode-uri-component "^0.2.0"
+    resolve-url "^0.2.1"
+    source-map-url "^0.4.0"
+    urix "^0.1.0"
+
+source-map-support@^0.4.15:
+  version "0.4.18"
+  resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f"
+  dependencies:
+    source-map "^0.5.6"
+
+source-map-support@^0.5.0:
+  version "0.5.3"
+  resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.3.tgz#2b3d5fff298cfa4d1afd7d4352d569e9a0158e76"
+  dependencies:
+    source-map "^0.6.0"
+
+source-map-url@^0.4.0:
+  version "0.4.0"
+  resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3"
+
+source-map@^0.4.4:
+  version "0.4.4"
+  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b"
+  dependencies:
+    amdefine ">=0.0.4"
+
+source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.1, source-map@~0.5.3:
+  version "0.5.7"
+  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
+
+source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1:
+  version "0.6.1"
+  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
+
+spdx-correct@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.0.tgz#05a5b4d7153a195bc92c3c425b69f3b2a9524c82"
+  dependencies:
+    spdx-expression-parse "^3.0.0"
+    spdx-license-ids "^3.0.0"
+
+spdx-exceptions@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz#2c7ae61056c714a5b9b9b2b2af7d311ef5c78fe9"
+
+spdx-expression-parse@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0"
+  dependencies:
+    spdx-exceptions "^2.1.0"
+    spdx-license-ids "^3.0.0"
+
+spdx-license-ids@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz#7a7cd28470cc6d3a1cfe6d66886f6bc430d3ac87"
+
+split-string@^3.0.1, split-string@^3.0.2:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2"
+  dependencies:
+    extend-shallow "^3.0.0"
+
+sprintf-js@~1.0.2:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
+
+sshpk@^1.7.0:
+  version "1.13.1"
+  resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3"
+  dependencies:
+    asn1 "~0.2.3"
+    assert-plus "^1.0.0"
+    dashdash "^1.12.0"
+    getpass "^0.1.1"
+  optionalDependencies:
+    bcrypt-pbkdf "^1.0.0"
+    ecc-jsbn "~0.1.1"
+    jsbn "~0.1.0"
+    tweetnacl "~0.14.0"
+
+ssri@^5.2.4:
+  version "5.2.4"
+  resolved "https://registry.yarnpkg.com/ssri/-/ssri-5.2.4.tgz#9985e14041e65fc397af96542be35724ac11da52"
+  dependencies:
+    safe-buffer "^5.1.1"
+
+stack-utils@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.1.tgz#d4f33ab54e8e38778b0ca5cfd3b3afb12db68620"
+
+static-extend@^0.1.1:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6"
+  dependencies:
+    define-property "^0.2.5"
+    object-copy "^0.1.0"
+
+"statuses@>= 1.3.1 < 2":
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087"
+
+statuses@~1.3.1:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e"
+
+stealthy-require@^1.1.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b"
+
+stream-browserify@^2.0.0, stream-browserify@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db"
+  dependencies:
+    inherits "~2.0.1"
+    readable-stream "^2.0.2"
+
+stream-combiner2@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/stream-combiner2/-/stream-combiner2-1.1.1.tgz#fb4d8a1420ea362764e21ad4780397bebcb41cbe"
+  dependencies:
+    duplexer2 "~0.1.0"
+    readable-stream "^2.0.2"
+
+stream-each@^1.1.0:
+  version "1.2.2"
+  resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.2.tgz#8e8c463f91da8991778765873fe4d960d8f616bd"
+  dependencies:
+    end-of-stream "^1.1.0"
+    stream-shift "^1.0.0"
+
+stream-http@^2.0.0, stream-http@^2.7.2:
+  version "2.8.0"
+  resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.0.tgz#fd86546dac9b1c91aff8fc5d287b98fafb41bc10"
+  dependencies:
+    builtin-status-codes "^3.0.0"
+    inherits "^2.0.1"
+    readable-stream "^2.3.3"
+    to-arraybuffer "^1.0.0"
+    xtend "^4.0.0"
+
+stream-shift@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952"
+
+stream-splicer@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/stream-splicer/-/stream-splicer-2.0.0.tgz#1b63be438a133e4b671cc1935197600175910d83"
+  dependencies:
+    inherits "^2.0.1"
+    readable-stream "^2.0.2"
+
+streamroller@^0.7.0:
+  version "0.7.0"
+  resolved "https://registry.yarnpkg.com/streamroller/-/streamroller-0.7.0.tgz#a1d1b7cf83d39afb0d63049a5acbf93493bdf64b"
+  dependencies:
+    date-format "^1.2.0"
+    debug "^3.1.0"
+    mkdirp "^0.5.1"
+    readable-stream "^2.3.0"
+
+strict-uri-encode@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713"
+
+string-length@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/string-length/-/string-length-2.0.0.tgz#d40dbb686a3ace960c1cffca562bf2c45f8363ed"
+  dependencies:
+    astral-regex "^1.0.0"
+    strip-ansi "^4.0.0"
+
+string-width@^1.0.1, string-width@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
+  dependencies:
+    code-point-at "^1.0.0"
+    is-fullwidth-code-point "^1.0.0"
+    strip-ansi "^3.0.0"
+
+string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
+  dependencies:
+    is-fullwidth-code-point "^2.0.0"
+    strip-ansi "^4.0.0"
+
+string_decoder@^1.0.0, string_decoder@~1.0.0, string_decoder@~1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab"
+  dependencies:
+    safe-buffer "~5.1.0"
+
+string_decoder@~0.10.x:
+  version "0.10.31"
+  resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
+
+stringstream@~0.0.4, stringstream@~0.0.5:
+  version "0.0.5"
+  resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878"
+
+strip-ansi@^3.0.0, strip-ansi@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
+  dependencies:
+    ansi-regex "^2.0.0"
+
+strip-ansi@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f"
+  dependencies:
+    ansi-regex "^3.0.0"
+
+strip-bom@3.0.0, strip-bom@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
+
+strip-bom@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e"
+  dependencies:
+    is-utf8 "^0.2.0"
+
+strip-eof@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
+
+strip-json-comments@~2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
+
+subarg@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/subarg/-/subarg-1.0.0.tgz#f62cf17581e996b48fc965699f54c06ae268b8d2"
+  dependencies:
+    minimist "^1.1.0"
+
+supports-color@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
+
+supports-color@^3.1.2:
+  version "3.2.3"
+  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6"
+  dependencies:
+    has-flag "^1.0.0"
+
+supports-color@^4.2.1:
+  version "4.5.0"
+  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b"
+  dependencies:
+    has-flag "^2.0.0"
+
+supports-color@^5.3.0:
+  version "5.3.0"
+  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.3.0.tgz#5b24ac15db80fa927cf5227a4a33fd3c4c7676c0"
+  dependencies:
+    has-flag "^3.0.0"
+
+symbol-tree@^3.2.2:
+  version "3.2.2"
+  resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6"
+
+syntax-error@^1.1.1:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/syntax-error/-/syntax-error-1.4.0.tgz#2d9d4ff5c064acb711594a3e3b95054ad51d907c"
+  dependencies:
+    acorn-node "^1.2.0"
+
+table@4.0.2:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36"
+  dependencies:
+    ajv "^5.2.3"
+    ajv-keywords "^2.1.0"
+    chalk "^2.1.0"
+    lodash "^4.17.4"
+    slice-ansi "1.0.0"
+    string-width "^2.1.1"
+
+tapable@^0.2.7:
+  version "0.2.8"
+  resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.8.tgz#99372a5c999bf2df160afc0d74bed4f47948cd22"
+
+tapable@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.0.0.tgz#cbb639d9002eed9c6b5975eb20598d7936f1f9f2"
+
+tar-pack@^3.4.0:
+  version "3.4.1"
+  resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.1.tgz#e1dbc03a9b9d3ba07e896ad027317eb679a10a1f"
+  dependencies:
+    debug "^2.2.0"
+    fstream "^1.0.10"
+    fstream-ignore "^1.0.5"
+    once "^1.3.3"
+    readable-stream "^2.1.4"
+    rimraf "^2.5.1"
+    tar "^2.2.1"
+    uid-number "^0.0.6"
+
+tar@^2.2.1:
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1"
+  dependencies:
+    block-stream "*"
+    fstream "^1.0.2"
+    inherits "2"
+
+temp@^0.8.3:
+  version "0.8.3"
+  resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.3.tgz#e0c6bc4d26b903124410e4fed81103014dfc1f59"
+  dependencies:
+    os-tmpdir "^1.0.0"
+    rimraf "~2.2.6"
+
+test-exclude@^4.1.1:
+  version "4.2.0"
+  resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.2.0.tgz#07e3613609a362c74516a717515e13322ab45b3c"
+  dependencies:
+    arrify "^1.0.1"
+    micromatch "^2.3.11"
+    object-assign "^4.1.0"
+    read-pkg-up "^1.0.1"
+    require-main-filename "^1.0.1"
+
+text-table@~0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
+
+throat@^4.0.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a"
+
+through2@^2.0.0:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be"
+  dependencies:
+    readable-stream "^2.1.5"
+    xtend "~4.0.1"
+
+"through@>=2.2.7 <3", through@^2.3.6:
+  version "2.3.8"
+  resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
+
+thunkify@~2.1.1:
+  version "2.1.2"
+  resolved "https://registry.yarnpkg.com/thunkify/-/thunkify-2.1.2.tgz#faa0e9d230c51acc95ca13a361ac05ca7e04553d"
+
+time-stamp@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-2.0.0.tgz#95c6a44530e15ba8d6f4a3ecb8c3a3fac46da357"
+
+timed-out@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f"
+
+timers-browserify@^1.0.1:
+  version "1.4.2"
+  resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-1.4.2.tgz#c9c58b575be8407375cb5e2462dacee74359f41d"
+  dependencies:
+    process "~0.11.0"
+
+timers-browserify@^2.0.4:
+  version "2.0.6"
+  resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.6.tgz#241e76927d9ca05f4d959819022f5b3664b64bae"
+  dependencies:
+    setimmediate "^1.0.4"
+
+timespan@2.3.x:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/timespan/-/timespan-2.3.0.tgz#4902ce040bd13d845c8f59b27e9d59bad6f39929"
+
+tmp@0.0.33, tmp@0.0.x, tmp@^0.0.33:
+  version "0.0.33"
+  resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
+  dependencies:
+    os-tmpdir "~1.0.2"
+
+tmpl@1.0.x:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1"
+
+to-array@0.1.4:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890"
+
+to-arraybuffer@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43"
+
+to-fast-properties@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47"
+
+to-object-path@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af"
+  dependencies:
+    kind-of "^3.0.2"
+
+to-regex-range@^2.1.0:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38"
+  dependencies:
+    is-number "^3.0.0"
+    repeat-string "^1.6.1"
+
+to-regex@^3.0.1:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce"
+  dependencies:
+    define-property "^2.0.2"
+    extend-shallow "^3.0.2"
+    regex-not "^1.0.2"
+    safe-regex "^1.1.0"
+
+tough-cookie@>=2.3.3, tough-cookie@^2.3.3, tough-cookie@~2.3.0, tough-cookie@~2.3.3:
+  version "2.3.4"
+  resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655"
+  dependencies:
+    punycode "^1.4.1"
+
+tr46@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09"
+  dependencies:
+    punycode "^2.1.0"
+
+trim-right@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003"
+
+tsscmp@~1.0.0:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/tsscmp/-/tsscmp-1.0.5.tgz#7dc4a33af71581ab4337da91d85ca5427ebd9a97"
+
+tty-browserify@0.0.0:
+  version "0.0.0"
+  resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6"
+
+tty-browserify@~0.0.0:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.1.tgz#3f05251ee17904dfd0677546670db9651682b811"
+
+tunnel-agent@^0.6.0:
+  version "0.6.0"
+  resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
+  dependencies:
+    safe-buffer "^5.0.1"
+
+tunnel-agent@~0.4.1:
+  version "0.4.3"
+  resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb"
+
+tweetnacl@^0.14.3, tweetnacl@~0.14.0:
+  version "0.14.5"
+  resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
+
+type-check@~0.3.2:
+  version "0.3.2"
+  resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72"
+  dependencies:
+    prelude-ls "~1.1.2"
+
+type-is@~1.6.15:
+  version "1.6.16"
+  resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194"
+  dependencies:
+    media-typer "0.3.0"
+    mime-types "~2.1.18"
+
+typedarray@^0.0.6, typedarray@~0.0.5:
+  version "0.0.6"
+  resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
+
+uglify-es@^3.3.4:
+  version "3.3.9"
+  resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677"
+  dependencies:
+    commander "~2.13.0"
+    source-map "~0.6.1"
+
+uglify-js@^2.6, uglify-js@^2.8.29:
+  version "2.8.29"
+  resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd"
+  dependencies:
+    source-map "~0.5.1"
+    yargs "~3.10.0"
+  optionalDependencies:
+    uglify-to-browserify "~1.0.0"
+
+uglify-js@^3.3.10:
+  version "3.3.12"
+  resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.3.12.tgz#efd87c16a1f4c674a8a5ede571001ef634dcc883"
+  dependencies:
+    commander "~2.14.1"
+    source-map "~0.6.1"
+
+uglify-to-browserify@~1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7"
+
+uglifyjs-webpack-plugin@^0.4.6:
+  version "0.4.6"
+  resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz#b951f4abb6bd617e66f63eb891498e391763e309"
+  dependencies:
+    source-map "^0.5.6"
+    uglify-js "^2.8.29"
+    webpack-sources "^1.0.1"
+
+uglifyjs-webpack-plugin@^1.1.1:
+  version "1.2.2"
+  resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.2.2.tgz#e7516d4367afdb715c3847841eb46f94c45ca2b9"
+  dependencies:
+    cacache "^10.0.1"
+    find-cache-dir "^1.0.0"
+    schema-utils "^0.4.2"
+    serialize-javascript "^1.4.0"
+    source-map "^0.6.1"
+    uglify-es "^3.3.4"
+    webpack-sources "^1.1.0"
+    worker-farm "^1.5.2"
+
+uid-number@^0.0.6:
+  version "0.0.6"
+  resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81"
+
+ultron@~1.1.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c"
+
+umd@^3.0.0:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/umd/-/umd-3.0.1.tgz#8ae556e11011f63c2596708a8837259f01b3d60e"
+
+underscore@~1.7.0:
+  version "1.7.0"
+  resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.7.0.tgz#6bbaf0877500d36be34ecaa584e0db9fef035209"
+
+union-value@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4"
+  dependencies:
+    arr-union "^3.1.0"
+    get-value "^2.0.6"
+    is-extendable "^0.1.1"
+    set-value "^0.4.3"
+
+unique-filename@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.0.tgz#d05f2fe4032560871f30e93cbe735eea201514f3"
+  dependencies:
+    unique-slug "^2.0.0"
+
+unique-slug@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.0.tgz#db6676e7c7cc0629878ff196097c78855ae9f4ab"
+  dependencies:
+    imurmurhash "^0.1.4"
+
+unpipe@1.0.0, unpipe@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
+
+unset-value@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559"
+  dependencies:
+    has-value "^0.3.1"
+    isobject "^3.0.0"
+
+upath@^1.0.0:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/upath/-/upath-1.0.4.tgz#ee2321ba0a786c50973db043a50b7bcba822361d"
+
+urix@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
+
+url-parse-lax@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c"
+  dependencies:
+    prepend-http "^2.0.0"
+
+url-to-options@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9"
+
+url@^0.11.0, url@~0.11.0:
+  version "0.11.0"
+  resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1"
+  dependencies:
+    punycode "1.3.2"
+    querystring "0.2.0"
+
+use@^2.0.0:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/use/-/use-2.0.2.tgz#ae28a0d72f93bf22422a18a2e379993112dec8e8"
+  dependencies:
+    define-property "^0.2.5"
+    isobject "^3.0.0"
+    lazy-cache "^2.0.2"
+
+useragent@^2.1.12:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/useragent/-/useragent-2.3.0.tgz#217f943ad540cb2128658ab23fc960f6a88c9972"
+  dependencies:
+    lru-cache "4.1.x"
+    tmp "0.0.x"
+
+util-deprecate@~1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+
+util.promisify@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030"
+  dependencies:
+    define-properties "^1.1.2"
+    object.getownpropertydescriptors "^2.0.3"
+
+util@0.10.3, util@^0.10.3, util@~0.10.1:
+  version "0.10.3"
+  resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9"
+  dependencies:
+    inherits "2.0.1"
+
+utils-merge@1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
+
+uuid@^3.0.0, uuid@^3.1.0:
+  version "3.2.1"
+  resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14"
+
+uws@~9.14.0:
+  version "9.14.0"
+  resolved "https://registry.yarnpkg.com/uws/-/uws-9.14.0.tgz#fac8386befc33a7a3705cbd58dc47b430ca4dd95"
+
+validate-npm-package-license@^3.0.1:
+  version "3.0.3"
+  resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz#81643bcbef1bdfecd4623793dc4648948ba98338"
+  dependencies:
+    spdx-correct "^3.0.0"
+    spdx-expression-parse "^3.0.0"
+
+verror@1.10.0:
+  version "1.10.0"
+  resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400"
+  dependencies:
+    assert-plus "^1.0.0"
+    core-util-is "1.0.2"
+    extsprintf "^1.2.0"
+
+vlq@^0.2.1:
+  version "0.2.3"
+  resolved "https://registry.yarnpkg.com/vlq/-/vlq-0.2.3.tgz#8f3e4328cf63b1540c0d67e1b2778386f8975b26"
+
+vlq@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/vlq/-/vlq-1.0.0.tgz#8101be90843422954c2b13eb27f2f3122bdcc806"
+
+vm-browserify@0.0.4, vm-browserify@~0.0.1:
+  version "0.0.4"
+  resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73"
+  dependencies:
+    indexof "0.0.1"
+
+void-elements@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec"
+
+vue@^2.5.13:
+  version "2.5.13"
+  resolved "https://registry.yarnpkg.com/vue/-/vue-2.5.13.tgz#95bd31e20efcf7a7f39239c9aa6787ce8cf578e1"
+
+w3c-hr-time@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz#82ac2bff63d950ea9e3189a58a65625fedf19045"
+  dependencies:
+    browser-process-hrtime "^0.1.2"
+
+walker@~1.0.5:
+  version "1.0.7"
+  resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb"
+  dependencies:
+    makeerror "1.0.x"
+
+watch@~0.18.0:
+  version "0.18.0"
+  resolved "https://registry.yarnpkg.com/watch/-/watch-0.18.0.tgz#28095476c6df7c90c963138990c0a5423eb4b986"
+  dependencies:
+    exec-sh "^0.2.0"
+    minimist "^1.2.0"
+
+watchpack@^1.4.0:
+  version "1.5.0"
+  resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.5.0.tgz#231e783af830a22f8966f65c4c4bacc814072eed"
+  dependencies:
+    chokidar "^2.0.2"
+    graceful-fs "^4.1.2"
+    neo-async "^2.5.0"
+
+webidl-conversions@^4.0.1, webidl-conversions@^4.0.2:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad"
+
+webpack-dev-middleware@^1.12.0:
+  version "1.12.2"
+  resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz#f8fc1120ce3b4fc5680ceecb43d777966b21105e"
+  dependencies:
+    memory-fs "~0.4.1"
+    mime "^1.5.0"
+    path-is-absolute "^1.0.0"
+    range-parser "^1.0.3"
+    time-stamp "^2.0.0"
+
+webpack-sources@^1.0.1, webpack-sources@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.1.0.tgz#a101ebae59d6507354d71d8013950a3a8b7a5a54"
+  dependencies:
+    source-list-map "^2.0.0"
+    source-map "~0.6.1"
+
+webpack@*:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.0.1.tgz#768d708beeca4c5f77f6c2d38a240fb6ff50ba5d"
+  dependencies:
+    acorn "^5.0.0"
+    acorn-dynamic-import "^3.0.0"
+    ajv "^6.1.0"
+    ajv-keywords "^3.1.0"
+    chrome-trace-event "^0.1.1"
+    enhanced-resolve "^4.0.0"
+    eslint-scope "^3.7.1"
+    loader-runner "^2.3.0"
+    loader-utils "^1.1.0"
+    memory-fs "~0.4.1"
+    micromatch "^3.1.8"
+    mkdirp "~0.5.0"
+    neo-async "^2.5.0"
+    node-libs-browser "^2.0.0"
+    schema-utils "^0.4.2"
+    tapable "^1.0.0"
+    uglifyjs-webpack-plugin "^1.1.1"
+    watchpack "^1.4.0"
+    webpack-sources "^1.0.1"
+
+webpack@^3.11.0:
+  version "3.11.0"
+  resolved "https://registry.yarnpkg.com/webpack/-/webpack-3.11.0.tgz#77da451b1d7b4b117adaf41a1a93b5742f24d894"
+  dependencies:
+    acorn "^5.0.0"
+    acorn-dynamic-import "^2.0.0"
+    ajv "^6.1.0"
+    ajv-keywords "^3.1.0"
+    async "^2.1.2"
+    enhanced-resolve "^3.4.0"
+    escope "^3.6.0"
+    interpret "^1.0.0"
+    json-loader "^0.5.4"
+    json5 "^0.5.1"
+    loader-runner "^2.3.0"
+    loader-utils "^1.1.0"
+    memory-fs "~0.4.1"
+    mkdirp "~0.5.0"
+    node-libs-browser "^2.0.0"
+    source-map "^0.5.3"
+    supports-color "^4.2.1"
+    tapable "^0.2.7"
+    uglifyjs-webpack-plugin "^0.4.6"
+    watchpack "^1.4.0"
+    webpack-sources "^1.0.1"
+    yargs "^8.0.2"
+
+whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz#57c235bc8657e914d24e1a397d3c82daee0a6ba3"
+  dependencies:
+    iconv-lite "0.4.19"
+
+whatwg-url@^6.4.0:
+  version "6.4.0"
+  resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.4.0.tgz#08fdf2b9e872783a7a1f6216260a1d66cc722e08"
+  dependencies:
+    lodash.sortby "^4.7.0"
+    tr46 "^1.0.0"
+    webidl-conversions "^4.0.1"
+
+when@^3.7.7:
+  version "3.7.8"
+  resolved "https://registry.yarnpkg.com/when/-/when-3.7.8.tgz#c7130b6a7ea04693e842cdc9e7a1f2aa39a39f82"
+
+which-module@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
+
+which@^1.2.1, which@^1.2.12, which@^1.2.9, which@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a"
+  dependencies:
+    isexe "^2.0.0"
+
+wide-align@^1.1.0:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710"
+  dependencies:
+    string-width "^1.0.2"
+
+window-size@0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d"
+
+wordwrap@0.0.2:
+  version "0.0.2"
+  resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f"
+
+wordwrap@~0.0.2:
+  version "0.0.3"
+  resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107"
+
+wordwrap@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"
+
+worker-farm@^1.5.2:
+  version "1.5.4"
+  resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.5.4.tgz#4debbe46b40edefcc717ebde74a90b1ae1e909a1"
+  dependencies:
+    errno "~0.1.7"
+    xtend "~4.0.1"
+
+wrap-ansi@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85"
+  dependencies:
+    string-width "^1.0.1"
+    strip-ansi "^3.0.1"
+
+wrappy@1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+
+write-file-atomic@^2.1.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab"
+  dependencies:
+    graceful-fs "^4.1.11"
+    imurmurhash "^0.1.4"
+    signal-exit "^3.0.2"
+
+write@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757"
+  dependencies:
+    mkdirp "^0.5.1"
+
+ws@^4.0.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/ws/-/ws-4.1.0.tgz#a979b5d7d4da68bf54efe0408967c324869a7289"
+  dependencies:
+    async-limiter "~1.0.0"
+    safe-buffer "~5.1.0"
+
+ws@~3.3.1:
+  version "3.3.3"
+  resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2"
+  dependencies:
+    async-limiter "~1.0.0"
+    safe-buffer "~5.1.0"
+    ultron "~1.1.0"
+
+xml-name-validator@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a"
+
+xmlhttprequest-ssl@~1.5.4:
+  version "1.5.5"
+  resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz#c2876b06168aadc40e57d97e81191ac8f4398b3e"
+
+xregexp@2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-2.0.0.tgz#52a63e56ca0b84a7f3a5f3d61872f126ad7a5943"
+
+xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
+
+y18n@^3.2.1:
+  version "3.2.1"
+  resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41"
+
+y18n@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b"
+
+yallist@^2.1.2:
+  version "2.1.2"
+  resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
+
+yargs-parser@^7.0.0:
+  version "7.0.0"
+  resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9"
+  dependencies:
+    camelcase "^4.1.0"
+
+yargs-parser@^8.1.0:
+  version "8.1.0"
+  resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-8.1.0.tgz#f1376a33b6629a5d063782944da732631e966950"
+  dependencies:
+    camelcase "^4.1.0"
+
+yargs-parser@^9.0.2:
+  version "9.0.2"
+  resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077"
+  dependencies:
+    camelcase "^4.1.0"
+
+yargs@^10.0.3:
+  version "10.1.2"
+  resolved "https://registry.yarnpkg.com/yargs/-/yargs-10.1.2.tgz#454d074c2b16a51a43e2fb7807e4f9de69ccb5c5"
+  dependencies:
+    cliui "^4.0.0"
+    decamelize "^1.1.1"
+    find-up "^2.1.0"
+    get-caller-file "^1.0.1"
+    os-locale "^2.0.0"
+    require-directory "^2.1.1"
+    require-main-filename "^1.0.1"
+    set-blocking "^2.0.0"
+    string-width "^2.0.0"
+    which-module "^2.0.0"
+    y18n "^3.2.1"
+    yargs-parser "^8.1.0"
+
+yargs@^11.0.0:
+  version "11.0.0"
+  resolved "https://registry.yarnpkg.com/yargs/-/yargs-11.0.0.tgz#c052931006c5eee74610e5fc0354bedfd08a201b"
+  dependencies:
+    cliui "^4.0.0"
+    decamelize "^1.1.1"
+    find-up "^2.1.0"
+    get-caller-file "^1.0.1"
+    os-locale "^2.0.0"
+    require-directory "^2.1.1"
+    require-main-filename "^1.0.1"
+    set-blocking "^2.0.0"
+    string-width "^2.0.0"
+    which-module "^2.0.0"
+    y18n "^3.2.1"
+    yargs-parser "^9.0.2"
+
+yargs@^8.0.2:
+  version "8.0.2"
+  resolved "https://registry.yarnpkg.com/yargs/-/yargs-8.0.2.tgz#6299a9055b1cefc969ff7e79c1d918dceb22c360"
+  dependencies:
+    camelcase "^4.1.0"
+    cliui "^3.2.0"
+    decamelize "^1.1.1"
+    get-caller-file "^1.0.1"
+    os-locale "^2.0.0"
+    read-pkg-up "^2.0.0"
+    require-directory "^2.1.1"
+    require-main-filename "^1.0.1"
+    set-blocking "^2.0.0"
+    string-width "^2.0.0"
+    which-module "^2.0.0"
+    y18n "^3.2.1"
+    yargs-parser "^7.0.0"
+
+yargs@~3.10.0:
+  version "3.10.0"
+  resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1"
+  dependencies:
+    camelcase "^1.0.2"
+    cliui "^2.1.0"
+    decamelize "^1.0.0"
+    window-size "0.1.0"
+
+yeast@0.1.2:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419"
diff --git a/advancedcontentfilter/vendor/pimple/pimple/.gitignore b/advancedcontentfilter/vendor/pimple/pimple/.gitignore
new file mode 100644 (file)
index 0000000..c089b09
--- /dev/null
@@ -0,0 +1,3 @@
+phpunit.xml
+composer.lock
+/vendor/
diff --git a/advancedcontentfilter/vendor/pimple/pimple/.travis.yml b/advancedcontentfilter/vendor/pimple/pimple/.travis.yml
new file mode 100644 (file)
index 0000000..196f7fc
--- /dev/null
@@ -0,0 +1,40 @@
+language: php
+
+env:
+  matrix:
+    - PIMPLE_EXT=no
+    - PIMPLE_EXT=yes
+  global:
+    - REPORT_EXIT_STATUS=1
+
+php:
+  - 5.3
+  - 5.4
+  - 5.5
+  - 5.6
+  - 7.0
+  - 7.1
+
+before_script:
+  - composer self-update
+  - COMPOSER_ROOT_VERSION=dev-master composer install
+  - if [ "$PIMPLE_EXT" == "yes" ]; then sh -c "cd ext/pimple && phpize && ./configure && make && sudo make install"; fi
+  - if [ "$PIMPLE_EXT" == "yes" ]; then echo "extension=pimple.so" >> `php --ini | grep "Loaded Configuration" | sed -e "s|.*:\s*||"`; fi
+
+script:
+  - cd ext/pimple
+  - if [ "$PIMPLE_EXT" == "yes" ]; then yes n | make test | tee output ; grep -E 'Tests failed +. +0' output; fi
+  - if [ "$PIMPLE_EXT" == "yes" ]; then export SYMFONY_DEPRECATIONS_HELPER=weak; fi
+  - cd ../..
+  - ./vendor/bin/simple-phpunit
+
+matrix:
+  include:
+    - php: hhvm
+      dist: trusty
+      env: PIMPLE_EXT=no
+  exclude:
+    - php: 7.0
+      env: PIMPLE_EXT=yes
+    - php: 7.1
+      env: PIMPLE_EXT=yes
diff --git a/advancedcontentfilter/vendor/pimple/pimple/CHANGELOG b/advancedcontentfilter/vendor/pimple/pimple/CHANGELOG
new file mode 100644 (file)
index 0000000..ba56760
--- /dev/null
@@ -0,0 +1,59 @@
+* 3.2.3 (2017-XX-XX)
+
+ * n/a
+
+* 3.2.2 (2017-07-23)
+
+ * reverted extending a protected closure throws an exception (deprecated it instead)
+
+* 3.2.1 (2017-07-17)
+
+ * fixed PHP error
+
+* 3.2.0 (2017-07-17)
+
+ * added a PSR-11 service locator
+ * added a PSR-11 wrapper
+ * added ServiceIterator
+ * fixed extending a protected closure (now throws InvalidServiceIdentifierException)
+
+* 3.1.0 (2017-07-03)
+
+ * deprecated the C extension
+ * added support for PSR-11 exceptions
+
+* 3.0.2 (2015-09-11)
+
+ * refactored the C extension
+ * minor non-significant changes
+
+* 3.0.1 (2015-07-30)
+
+ * simplified some code
+ * fixed a segfault in the C extension
+
+* 3.0.0 (2014-07-24)
+
+ * removed the Pimple class alias (use Pimple\Container instead)
+
+* 2.1.1 (2014-07-24)
+
+ * fixed compiler warnings for the C extension
+ * fixed code when dealing with circular references
+
+* 2.1.0 (2014-06-24)
+
+ * moved the Pimple to Pimple\Container (with a BC layer -- Pimple is now a
+   deprecated alias which will be removed in Pimple 3.0)
+ * added Pimple\ServiceProviderInterface (and Pimple::register())
+
+* 2.0.0 (2014-02-10)
+
+ * changed extend to automatically re-assign the extended service and keep it as shared or factory
+   (to keep BC, extend still returns the extended service)
+ * changed services to be shared by default (use factory() for factory
+   services)
+
+* 1.0.0
+
+ * initial version
diff --git a/advancedcontentfilter/vendor/pimple/pimple/LICENSE b/advancedcontentfilter/vendor/pimple/pimple/LICENSE
new file mode 100644 (file)
index 0000000..e02dc5a
--- /dev/null
@@ -0,0 +1,19 @@
+Copyright (c) 2009-2017 Fabien Potencier
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is furnished
+to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/advancedcontentfilter/vendor/pimple/pimple/README.rst b/advancedcontentfilter/vendor/pimple/pimple/README.rst
new file mode 100644 (file)
index 0000000..a03b6d3
--- /dev/null
@@ -0,0 +1,326 @@
+Pimple
+======
+
+.. caution::
+
+    This is the documentation for Pimple 3.x. If you are using Pimple 1.x, read
+    the `Pimple 1.x documentation`_. Reading the Pimple 1.x code is also a good
+    way to learn more about how to create a simple Dependency Injection
+    Container (recent versions of Pimple are more focused on performance).
+
+Pimple is a small Dependency Injection Container for PHP.
+
+Installation
+------------
+
+Before using Pimple in your project, add it to your ``composer.json`` file:
+
+.. code-block:: bash
+
+    $ ./composer.phar require pimple/pimple "^3.0"
+
+Usage
+-----
+
+Creating a container is a matter of creating a ``Container`` instance:
+
+.. code-block:: php
+
+    use Pimple\Container;
+
+    $container = new Container();
+
+As many other dependency injection containers, Pimple manages two different
+kind of data: **services** and **parameters**.
+
+Defining Services
+~~~~~~~~~~~~~~~~~
+
+A service is an object that does something as part of a larger system. Examples
+of services: a database connection, a templating engine, or a mailer. Almost
+any **global** object can be a service.
+
+Services are defined by **anonymous functions** that return an instance of an
+object:
+
+.. code-block:: php
+
+    // define some services
+    $container['session_storage'] = function ($c) {
+        return new SessionStorage('SESSION_ID');
+    };
+
+    $container['session'] = function ($c) {
+        return new Session($c['session_storage']);
+    };
+
+Notice that the anonymous function has access to the current container
+instance, allowing references to other services or parameters.
+
+As objects are only created when you get them, the order of the definitions
+does not matter.
+
+Using the defined services is also very easy:
+
+.. code-block:: php
+
+    // get the session object
+    $session = $container['session'];
+
+    // the above call is roughly equivalent to the following code:
+    // $storage = new SessionStorage('SESSION_ID');
+    // $session = new Session($storage);
+
+Defining Factory Services
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+By default, each time you get a service, Pimple returns the **same instance**
+of it. If you want a different instance to be returned for all calls, wrap your
+anonymous function with the ``factory()`` method
+
+.. code-block:: php
+
+    $container['session'] = $container->factory(function ($c) {
+        return new Session($c['session_storage']);
+    });
+
+Now, each call to ``$container['session']`` returns a new instance of the
+session.
+
+Defining Parameters
+~~~~~~~~~~~~~~~~~~~
+
+Defining a parameter allows to ease the configuration of your container from
+the outside and to store global values:
+
+.. code-block:: php
+
+    // define some parameters
+    $container['cookie_name'] = 'SESSION_ID';
+    $container['session_storage_class'] = 'SessionStorage';
+
+If you change the ``session_storage`` service definition like below:
+
+.. code-block:: php
+
+    $container['session_storage'] = function ($c) {
+        return new $c['session_storage_class']($c['cookie_name']);
+    };
+
+You can now easily change the cookie name by overriding the
+``cookie_name`` parameter instead of redefining the service
+definition.
+
+Protecting Parameters
+~~~~~~~~~~~~~~~~~~~~~
+
+Because Pimple sees anonymous functions as service definitions, you need to
+wrap anonymous functions with the ``protect()`` method to store them as
+parameters:
+
+.. code-block:: php
+
+    $container['random_func'] = $container->protect(function () {
+        return rand();
+    });
+
+Modifying Services after Definition
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+In some cases you may want to modify a service definition after it has been
+defined. You can use the ``extend()`` method to define additional code to be
+run on your service just after it is created:
+
+.. code-block:: php
+
+    $container['session_storage'] = function ($c) {
+        return new $c['session_storage_class']($c['cookie_name']);
+    };
+
+    $container->extend('session_storage', function ($storage, $c) {
+        $storage->...();
+
+        return $storage;
+    });
+
+The first argument is the name of the service to extend, the second a function
+that gets access to the object instance and the container.
+
+Extending a Container
+~~~~~~~~~~~~~~~~~~~~~
+
+If you use the same libraries over and over, you might want to reuse some
+services from one project to the next one; package your services into a
+**provider** by implementing ``Pimple\ServiceProviderInterface``:
+
+.. code-block:: php
+
+    use Pimple\Container;
+
+    class FooProvider implements Pimple\ServiceProviderInterface
+    {
+        public function register(Container $pimple)
+        {
+            // register some services and parameters
+            // on $pimple
+        }
+    }
+
+Then, register the provider on a Container:
+
+.. code-block:: php
+
+    $pimple->register(new FooProvider());
+
+Fetching the Service Creation Function
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+When you access an object, Pimple automatically calls the anonymous function
+that you defined, which creates the service object for you. If you want to get
+raw access to this function, you can use the ``raw()`` method:
+
+.. code-block:: php
+
+    $container['session'] = function ($c) {
+        return new Session($c['session_storage']);
+    };
+
+    $sessionFunction = $container->raw('session');
+
+PSR-11 compatibility
+--------------------
+
+For historical reasons, the ``Container`` class does not implement the PSR-11
+``ContainerInterface``. However, Pimple provides a helper class that will let
+you decouple your code from the Pimple container class.
+
+The PSR-11 container class
+~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The ``Pimple\Psr11\Container`` class lets you access the content of an
+underlying Pimple container using ``Psr\Container\ContainerInterface``
+methods:
+
+.. code-block:: php
+
+    use Pimple\Container;
+    use Pimple\Psr11\Container as PsrContainer;
+
+    $container = new Container();
+    $container['service'] = function ($c) {
+        return new Service();
+    };
+    $psr11 = new PsrContainer($container);
+
+    $controller = function (PsrContainer $container) {
+        $service = $container->get('service');
+    };
+    $controller($psr11);
+
+Using the PSR-11 ServiceLocator
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Sometimes, a service needs access to several other services without being sure
+that all of them will actually be used. In those cases, you may want the
+instantiation of the services to be lazy.
+
+The traditional solution is to inject the entire service container to get only
+the services really needed. However, this is not recommended because it gives
+services a too broad access to the rest of the application and it hides their
+actual dependencies.
+
+The ``ServiceLocator`` is intended to solve this problem by giving access to a
+set of predefined services while instantiating them only when actually needed.
+
+It also allows you to make your services available under a different name than
+the one used to register them. For instance, you may want to use an object
+that expects an instance of ``EventDispatcherInterface`` to be available under
+the name ``event_dispatcher`` while your event dispatcher has been
+registered under the name ``dispatcher``:
+
+.. code-block:: php
+
+    use Monolog\Logger;
+    use Pimple\Psr11\ServiceLocator;
+    use Psr\Container\ContainerInterface;
+    use Symfony\Component\EventDispatcher\EventDispatcher;
+
+    class MyService
+    {
+        /**
+         * "logger" must be an instance of Psr\Log\LoggerInterface
+         * "event_dispatcher" must be an instance of Symfony\Component\EventDispatcher\EventDispatcherInterface
+         */
+        private $services;
+
+        public function __construct(ContainerInterface $services)
+        {
+            $this->services = $services;
+        }
+    }
+
+    $container['logger'] = function ($c) {
+        return new Monolog\Logger();
+    };
+    $container['dispatcher'] = function () {
+        return new EventDispatcher();
+    };
+
+    $container['service'] = function ($c) {
+        $locator = new ServiceLocator($c, array('logger', 'event_dispatcher' => 'dispatcher'));
+
+        return new MyService($locator);
+    };
+
+Referencing a Collection of Services Lazily
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Passing a collection of services instances in an array may prove inefficient
+if the class that consumes the collection only needs to iterate over it at a
+later stage, when one of its method is called. It can also lead to problems
+if there is a circular dependency between one of the services stored in the
+collection and the class that consumes it.
+
+The ``ServiceIterator`` class helps you solve these issues. It receives a
+list of service names during instantiation and will retrieve the services
+when iterated over:
+
+.. code-block:: php
+
+    use Pimple\Container;
+    use Pimple\ServiceIterator;
+
+    class AuthorizationService
+    {
+        private $voters;
+
+        public function __construct($voters)
+        {
+            $this->voters = $voters;
+        }
+
+        public function canAccess($resource)
+        {
+            foreach ($this->voters as $voter) {
+                if (true === $voter->canAccess($resource) {
+                    return true;
+                }
+            }
+
+            return false;
+        }
+    }
+
+    $container = new Container();
+
+    $container['voter1'] = function ($c) {
+        return new SomeVoter();
+    }
+    $container['voter2'] = function ($c) {
+        return new SomeOtherVoter($c['auth']);
+    }
+    $container['auth'] = function ($c) {
+        return new AuthorizationService(new ServiceIterator($c, array('voter1', 'voter2'));
+    }
+
+.. _Pimple 1.x documentation: https://github.com/silexphp/Pimple/tree/1.1
diff --git a/advancedcontentfilter/vendor/pimple/pimple/composer.json b/advancedcontentfilter/vendor/pimple/pimple/composer.json
new file mode 100644 (file)
index 0000000..dabf190
--- /dev/null
@@ -0,0 +1,29 @@
+{
+    "name": "pimple/pimple",
+    "type": "library",
+    "description": "Pimple, a simple Dependency Injection Container",
+    "keywords": ["dependency injection", "container"],
+    "homepage": "http://pimple.sensiolabs.org",
+    "license": "MIT",
+    "authors": [
+        {
+            "name": "Fabien Potencier",
+            "email": "fabien@symfony.com"
+        }
+    ],
+    "require": {
+        "php": ">=5.3.0",
+        "psr/container": "^1.0"
+    },
+    "require-dev": {
+        "symfony/phpunit-bridge": "^3.2"
+    },
+    "autoload": {
+        "psr-0": { "Pimple": "src/" }
+    },
+    "extra": {
+        "branch-alias": {
+            "dev-master": "3.2.x-dev"
+        }
+    }
+}
diff --git a/advancedcontentfilter/vendor/pimple/pimple/ext/pimple/.gitignore b/advancedcontentfilter/vendor/pimple/pimple/ext/pimple/.gitignore
new file mode 100644 (file)
index 0000000..1861088
--- /dev/null
@@ -0,0 +1,30 @@
+*.sw*
+.deps
+Makefile
+Makefile.fragments
+Makefile.global
+Makefile.objects
+acinclude.m4
+aclocal.m4
+build/
+config.cache
+config.guess
+config.h
+config.h.in
+config.log
+config.nice
+config.status
+config.sub
+configure
+configure.in
+install-sh
+libtool
+ltmain.sh
+missing
+mkinstalldirs
+run-tests.php
+*.loT
+.libs/
+modules/
+*.la
+*.lo
diff --git a/advancedcontentfilter/vendor/pimple/pimple/ext/pimple/README.md b/advancedcontentfilter/vendor/pimple/pimple/ext/pimple/README.md
new file mode 100644 (file)
index 0000000..7b39eb2
--- /dev/null
@@ -0,0 +1,12 @@
+This is Pimple 2 implemented in C
+
+* PHP >= 5.3
+* Not tested under Windows, might work
+
+Install
+=======
+
+    > phpize
+    > ./configure
+    > make
+    > make install
diff --git a/advancedcontentfilter/vendor/pimple/pimple/ext/pimple/config.m4 b/advancedcontentfilter/vendor/pimple/pimple/ext/pimple/config.m4
new file mode 100644 (file)
index 0000000..3a6e9aa
--- /dev/null
@@ -0,0 +1,63 @@
+dnl $Id$
+dnl config.m4 for extension pimple
+
+dnl Comments in this file start with the string 'dnl'.
+dnl Remove where necessary. This file will not work
+dnl without editing.
+
+dnl If your extension references something external, use with:
+
+dnl PHP_ARG_WITH(pimple, for pimple support,
+dnl Make sure that the comment is aligned:
+dnl [  --with-pimple             Include pimple support])
+
+dnl Otherwise use enable:
+
+PHP_ARG_ENABLE(pimple, whether to enable pimple support,
+dnl Make sure that the comment is aligned:
+[  --enable-pimple           Enable pimple support])
+
+if test "$PHP_PIMPLE" != "no"; then
+  dnl Write more examples of tests here...
+
+  dnl # --with-pimple -> check with-path
+  dnl SEARCH_PATH="/usr/local /usr"     # you might want to change this
+  dnl SEARCH_FOR="/include/pimple.h"  # you most likely want to change this
+  dnl if test -r $PHP_PIMPLE/$SEARCH_FOR; then # path given as parameter
+  dnl   PIMPLE_DIR=$PHP_PIMPLE
+  dnl else # search default path list
+  dnl   AC_MSG_CHECKING([for pimple files in default path])
+  dnl   for i in $SEARCH_PATH ; do
+  dnl     if test -r $i/$SEARCH_FOR; then
+  dnl       PIMPLE_DIR=$i
+  dnl       AC_MSG_RESULT(found in $i)
+  dnl     fi
+  dnl   done
+  dnl fi
+  dnl
+  dnl if test -z "$PIMPLE_DIR"; then
+  dnl   AC_MSG_RESULT([not found])
+  dnl   AC_MSG_ERROR([Please reinstall the pimple distribution])
+  dnl fi
+
+  dnl # --with-pimple -> add include path
+  dnl PHP_ADD_INCLUDE($PIMPLE_DIR/include)
+
+  dnl # --with-pimple -> check for lib and symbol presence
+  dnl LIBNAME=pimple # you may want to change this
+  dnl LIBSYMBOL=pimple # you most likely want to change this
+
+  dnl PHP_CHECK_LIBRARY($LIBNAME,$LIBSYMBOL,
+  dnl [
+  dnl   PHP_ADD_LIBRARY_WITH_PATH($LIBNAME, $PIMPLE_DIR/lib, PIMPLE_SHARED_LIBADD)
+  dnl   AC_DEFINE(HAVE_PIMPLELIB,1,[ ])
+  dnl ],[
+  dnl   AC_MSG_ERROR([wrong pimple lib version or lib not found])
+  dnl ],[
+  dnl   -L$PIMPLE_DIR/lib -lm
+  dnl ])
+  dnl
+  dnl PHP_SUBST(PIMPLE_SHARED_LIBADD)
+
+  PHP_NEW_EXTENSION(pimple, pimple.c, $ext_shared)
+fi
diff --git a/advancedcontentfilter/vendor/pimple/pimple/ext/pimple/config.w32 b/advancedcontentfilter/vendor/pimple/pimple/ext/pimple/config.w32
new file mode 100644 (file)
index 0000000..39857b3
--- /dev/null
@@ -0,0 +1,13 @@
+// $Id$
+// vim:ft=javascript
+
+// If your extension references something external, use ARG_WITH
+// ARG_WITH("pimple", "for pimple support", "no");
+
+// Otherwise, use ARG_ENABLE
+// ARG_ENABLE("pimple", "enable pimple support", "no");
+
+if (PHP_PIMPLE != "no") {
+       EXTENSION("pimple", "pimple.c");
+}
+
diff --git a/advancedcontentfilter/vendor/pimple/pimple/ext/pimple/php_pimple.h b/advancedcontentfilter/vendor/pimple/pimple/ext/pimple/php_pimple.h
new file mode 100644 (file)
index 0000000..eed7c17
--- /dev/null
@@ -0,0 +1,137 @@
+
+/*
+ * This file is part of Pimple.
+ *
+ * Copyright (c) 2014 Fabien Potencier
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is furnished
+ * to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#ifndef PHP_PIMPLE_H
+#define PHP_PIMPLE_H
+
+extern zend_module_entry pimple_module_entry;
+#define phpext_pimple_ptr &pimple_module_entry
+
+#ifdef PHP_WIN32
+#      define PHP_PIMPLE_API __declspec(dllexport)
+#elif defined(__GNUC__) && __GNUC__ >= 4
+#      define PHP_PIMPLE_API __attribute__ ((visibility("default")))
+#else
+#      define PHP_PIMPLE_API
+#endif
+
+#ifdef ZTS
+#include "TSRM.h"
+#endif
+
+#define PIMPLE_VERSION "3.2.3-DEV"
+
+#define PIMPLE_NS "Pimple"
+#define PSR_CONTAINER_NS "Psr\\Container"
+#define PIMPLE_EXCEPTION_NS "Pimple\\Exception"
+
+#define PIMPLE_DEFAULT_ZVAL_CACHE_NUM   5
+#define PIMPLE_DEFAULT_ZVAL_VALUES_NUM 10
+
+#define PIMPLE_DEPRECATE do { \
+       int er = EG(error_reporting); \
+       EG(error_reporting) = 0;\
+       php_error(E_DEPRECATED, "The Pimple C extension is deprecated since version 3.1 and will be removed in 4.0."); \
+       EG(error_reporting) = er; \
+} while (0);
+
+zend_module_entry *get_module(void);
+
+PHP_MINIT_FUNCTION(pimple);
+PHP_MINFO_FUNCTION(pimple);
+
+PHP_METHOD(FrozenServiceException, __construct);
+PHP_METHOD(InvalidServiceIdentifierException, __construct);
+PHP_METHOD(UnknownIdentifierException, __construct);
+
+PHP_METHOD(Pimple, __construct);
+PHP_METHOD(Pimple, factory);
+PHP_METHOD(Pimple, protect);
+PHP_METHOD(Pimple, raw);
+PHP_METHOD(Pimple, extend);
+PHP_METHOD(Pimple, keys);
+PHP_METHOD(Pimple, register);
+PHP_METHOD(Pimple, offsetSet);
+PHP_METHOD(Pimple, offsetUnset);
+PHP_METHOD(Pimple, offsetGet);
+PHP_METHOD(Pimple, offsetExists);
+
+PHP_METHOD(PimpleClosure, invoker);
+
+typedef struct _pimple_bucket_value {
+       zval *value; /* Must be the first element */
+       zval *raw;
+       zend_object_handle handle_num;
+       enum {
+               PIMPLE_IS_PARAM   = 0,
+               PIMPLE_IS_SERVICE = 2
+       } type;
+       zend_bool initialized;
+       zend_fcall_info_cache fcc;
+} pimple_bucket_value;
+
+typedef struct _pimple_object {
+       zend_object zobj;
+       HashTable values;
+       HashTable factories;
+       HashTable protected;
+} pimple_object;
+
+typedef struct _pimple_closure_object {
+       zend_object zobj;
+       zval *callable;
+       zval *factory;
+} pimple_closure_object;
+
+static const char sensiolabs_logo[] = "<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHYAAAAUCAMAAABvRTlyAAAAz1BMVEUAAAAAAAAAAAAsThWB5j4AAACD6T8AAACC6D+C6D6C6D+C6D4AAAAAAACC6D4AAAAAAACC6D8AAAAAAAAAAAAAAAAAAAAAAACC6D4AAAAAAAAAAACC6D4AAAAAAAAAAAAAAAAAAAAAAACC6D8AAACC6D4AAAAAAAAAAAAAAAAAAACC6D8AAACC6D6C6D+B6D+C6D+C6D+C6D8AAACC6D6C6D4AAACC6D/K/2KC6D+B6D6C6D6C6D+C6D8sTxUyWRhEeiEAAACC6D+C5z6B6D7drnEVAAAAQXRSTlMAE3oCNSUuDHFHzxaF9UFsu+irX+zlKzYimaJXktyOSFD6BolxqT7QGMMdarMIpuO28r9EolXKgR16OphfXYd4V14GtB4AAAMpSURBVEjHvVSJctowEF1jjME2RziMwUCoMfd9heZqG4n//6buLpJjkmYm03byZmxJa2nf6u2uQcG2bfhqRN4LoTKBzyGDm68M7mAwcOEdjo4zhA/Rf9Go/CVtTgiRhXfIC3EDH8F/eUX1/9KexRo+QgOdtHDsEe/sM7QT32/+K61Z1LFXcXJxN4pTbu1aTQUzuy2PIA0rDo0/0Aa5XFaJvKaVTrubywXvaa1Wq4Vu/Snr3Y7Aojh4VccwykW2N2oQ8wmjyut6+Q1t5ywIG5Npj1sh5E0B7YOzFDjfuRfaOh3O+MbbVNfTWS9COZk3Obd2su5d0a6IU9KLREbw8gEehWSr1r2sPWciXLG38r5NdW0xu9eioU87omjC9yNaMi5GNf6WppVSOqXCFkmCvMB3p9SROLoYQn5pDgQOujA1xjYvqH+plUdkwnmII8VxR/PKYkrfLLomhVlE3b/LhNbNr7hp0H2JaOc4v8dFB58HSsFTSafaqtY1sT3GO8wsy5rhokYPlRJdjPMajyYqTt1EHF/2uqSWQWmAjCUSmQ1MS3g8Btf1XOsy7YIC0CB1b5Xw1Vhba0zbxiCAQLH9TNPmHJXQUtJAN0KcDsoqLxsNvJrJExa7mKIdp2lRE2WexiS4pqWk/0jROlw6K6bV9YOBDGAuqMJ0bnuUKGB0L27bxgRhGEbzihbhxxXaQC88Vkwq8ldCi86RApWUb0Q+4VDosBCc+1s81lUdnBavH4Zp2mm3O44USwOfvSo9oBiwpFg71lMS1VKJLKljS3j9p+fOTvXXlsSNuEv6YPaZda9uRope0VJfKdo7fPiYfSmvFjXQbkhY0d9hCbBWIktRgEDieDhf1N3wbbkmNNgRy8hyl620yGQat/grV3HMpc2HDKTVmOPFz6ylPCKt/nXcAyV260jaAowwIW0YuBzrOgb/KrddZS9OmJaLgpWK4JX2DDuklcLZSDGcn8Vmx9YDNvT6UsjyBApRyFQVX7Vxm9TGxE16nmfRd8/zQoDmggQOTRh5Hv8pMt9Q/L2JmSwkMCE7dA4BuDjHJwfu0Om4QAhOjrN5XkIatglfiN/bUPdCQFjTYgAAAABJRU5ErkJggg==\">";
+
+static void pimple_exception_call_parent_constructor(zval *this_ptr, const char *format, const char *arg1 TSRMLS_DC);
+
+static int pimple_zval_to_pimpleval(zval *_zval, pimple_bucket_value *_pimple_bucket_value TSRMLS_DC);
+static int pimple_zval_is_valid_callback(zval *_zval, pimple_bucket_value *_pimple_bucket_value TSRMLS_DC);
+
+static void pimple_bucket_dtor(pimple_bucket_value *bucket);
+static void pimple_free_bucket(pimple_bucket_value *bucket);
+
+static zval *pimple_object_read_dimension(zval *object, zval *offset, int type TSRMLS_DC);
+static void pimple_object_write_dimension(zval *object, zval *offset, zval *value TSRMLS_DC);
+static int pimple_object_has_dimension(zval *object, zval *offset, int check_empty TSRMLS_DC);
+static void pimple_object_unset_dimension(zval *object, zval *offset TSRMLS_DC);
+static zend_object_value pimple_object_create(zend_class_entry *ce TSRMLS_DC);
+static void pimple_free_object_storage(pimple_object *obj TSRMLS_DC);
+
+static void pimple_closure_free_object_storage(pimple_closure_object *obj TSRMLS_DC);
+static zend_object_value pimple_closure_object_create(zend_class_entry *ce TSRMLS_DC);
+static zend_function *pimple_closure_get_constructor(zval * TSRMLS_DC);
+static int pimple_closure_get_closure(zval *obj, zend_class_entry **ce_ptr, union _zend_function **fptr_ptr, zval **zobj_ptr TSRMLS_DC);
+
+#ifdef ZTS
+#define PIMPLE_G(v) TSRMG(pimple_globals_id, zend_pimple_globals *, v)
+#else
+#define PIMPLE_G(v) (pimple_globals.v)
+#endif
+
+#endif /* PHP_PIMPLE_H */
+
diff --git a/advancedcontentfilter/vendor/pimple/pimple/ext/pimple/pimple.c b/advancedcontentfilter/vendor/pimple/pimple/ext/pimple/pimple.c
new file mode 100644 (file)
index 0000000..c80499b
--- /dev/null
@@ -0,0 +1,1114 @@
+
+/*
+ * This file is part of Pimple.
+ *
+ * Copyright (c) 2014 Fabien Potencier
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is furnished
+ * to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "php.h"
+#include "php_ini.h"
+#include "ext/standard/info.h"
+#include "php_pimple.h"
+#include "pimple_compat.h"
+#include "zend_interfaces.h"
+#include "zend.h"
+#include "Zend/zend_closures.h"
+#include "ext/spl/spl_exceptions.h"
+#include "Zend/zend_exceptions.h"
+#include "main/php_output.h"
+#include "SAPI.h"
+
+static zend_class_entry *pimple_ce_PsrContainerInterface;
+static zend_class_entry *pimple_ce_PsrContainerExceptionInterface;
+static zend_class_entry *pimple_ce_PsrNotFoundExceptionInterface;
+
+static zend_class_entry *pimple_ce_ExpectedInvokableException;
+static zend_class_entry *pimple_ce_FrozenServiceException;
+static zend_class_entry *pimple_ce_InvalidServiceIdentifierException;
+static zend_class_entry *pimple_ce_UnknownIdentifierException;
+
+static zend_class_entry *pimple_ce;
+static zend_object_handlers pimple_object_handlers;
+static zend_class_entry *pimple_closure_ce;
+static zend_class_entry *pimple_serviceprovider_ce;
+static zend_object_handlers pimple_closure_object_handlers;
+static zend_internal_function pimple_closure_invoker_function;
+
+#define FETCH_DIM_HANDLERS_VARS        pimple_object *pimple_obj = NULL; \
+                                                                       ulong index; \
+                                                                       pimple_obj = (pimple_object *)zend_object_store_get_object(object TSRMLS_CC); \
+
+#define PIMPLE_OBJECT_HANDLE_INHERITANCE_OBJECT_HANDLERS       do { \
+       if (ce != pimple_ce) { \
+               zend_hash_find(&ce->function_table, ZEND_STRS("offsetget"), (void **)&function); \
+               if (function->common.scope != ce) { /* if the function is not defined in this actual class */ \
+                       pimple_object_handlers.read_dimension = pimple_object_read_dimension; /* then overwrite the handler to use custom one */ \
+               } \
+               zend_hash_find(&ce->function_table, ZEND_STRS("offsetset"), (void **)&function); \
+               if (function->common.scope != ce) { \
+                       pimple_object_handlers.write_dimension = pimple_object_write_dimension; \
+               } \
+               zend_hash_find(&ce->function_table, ZEND_STRS("offsetexists"), (void **)&function); \
+               if (function->common.scope != ce) { \
+                       pimple_object_handlers.has_dimension = pimple_object_has_dimension; \
+               } \
+               zend_hash_find(&ce->function_table, ZEND_STRS("offsetunset"), (void **)&function); \
+               if (function->common.scope != ce) { \
+                       pimple_object_handlers.unset_dimension = pimple_object_unset_dimension; \
+               } \
+       } else { \
+               pimple_object_handlers.read_dimension = pimple_object_read_dimension; \
+               pimple_object_handlers.write_dimension = pimple_object_write_dimension; \
+               pimple_object_handlers.has_dimension = pimple_object_has_dimension; \
+               pimple_object_handlers.unset_dimension = pimple_object_unset_dimension; \
+       }\
+                                                                                       } while(0);
+
+#define PIMPLE_CALL_CB do { \
+                       zend_fcall_info_argn(&fci TSRMLS_CC, 1, &object); \
+                       fci.size           = sizeof(fci); \
+                       fci.object_ptr     = retval->fcc.object_ptr; \
+                       fci.function_name  = retval->value; \
+                       fci.no_separation  = 1; \
+                       fci.retval_ptr_ptr = &retval_ptr_ptr; \
+\
+                       zend_call_function(&fci, &retval->fcc TSRMLS_CC); \
+                       efree(fci.params); \
+                       if (EG(exception)) { \
+                               return EG(uninitialized_zval_ptr); \
+                       } \
+                                               } while(0);
+
+
+/* Psr\Container\ContainerInterface */
+ZEND_BEGIN_ARG_INFO_EX(arginfo_pimple_PsrContainerInterface_get, 0, 0, 1)
+ZEND_ARG_INFO(0, id)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_pimple_PsrContainerInterface_has, 0, 0, 1)
+ZEND_ARG_INFO(0, id)
+ZEND_END_ARG_INFO()
+
+static const zend_function_entry pimple_ce_PsrContainerInterface_functions[] = {
+       PHP_ABSTRACT_ME(ContainerInterface, get, arginfo_pimple_PsrContainerInterface_get)
+       PHP_ABSTRACT_ME(ContainerInterface, has, arginfo_pimple_PsrContainerInterface_has)
+       PHP_FE_END
+};
+
+/* Psr\Container\ContainerExceptionInterface */
+static const zend_function_entry pimple_ce_PsrContainerExceptionInterface_functions[] = {
+       PHP_FE_END
+};
+
+/* Psr\Container\NotFoundExceptionInterface */
+static const zend_function_entry pimple_ce_PsrNotFoundExceptionInterface_functions[] = {
+       PHP_FE_END
+};
+
+/* Pimple\Exception\FrozenServiceException */
+ZEND_BEGIN_ARG_INFO_EX(arginfo_FrozenServiceException___construct, 0, 0, 1)
+ZEND_ARG_INFO(0, id)
+ZEND_END_ARG_INFO()
+
+static const zend_function_entry pimple_ce_FrozenServiceException_functions[] = {
+       PHP_ME(FrozenServiceException, __construct, arginfo_FrozenServiceException___construct, ZEND_ACC_PUBLIC)
+       PHP_FE_END
+};
+
+/* Pimple\Exception\InvalidServiceIdentifierException */
+ZEND_BEGIN_ARG_INFO_EX(arginfo_InvalidServiceIdentifierException___construct, 0, 0, 1)
+ZEND_ARG_INFO(0, id)
+ZEND_END_ARG_INFO()
+
+static const zend_function_entry pimple_ce_InvalidServiceIdentifierException_functions[] = {
+       PHP_ME(InvalidServiceIdentifierException, __construct, arginfo_InvalidServiceIdentifierException___construct, ZEND_ACC_PUBLIC)
+       PHP_FE_END
+};
+
+/* Pimple\Exception\UnknownIdentifierException */
+ZEND_BEGIN_ARG_INFO_EX(arginfo_UnknownIdentifierException___construct, 0, 0, 1)
+ZEND_ARG_INFO(0, id)
+ZEND_END_ARG_INFO()
+
+static const zend_function_entry pimple_ce_UnknownIdentifierException_functions[] = {
+       PHP_ME(UnknownIdentifierException, __construct, arginfo_UnknownIdentifierException___construct, ZEND_ACC_PUBLIC)
+       PHP_FE_END
+};
+
+/* Pimple\Container */
+ZEND_BEGIN_ARG_INFO_EX(arginfo___construct, 0, 0, 0)
+ZEND_ARG_ARRAY_INFO(0, value, 0)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_offsetset, 0, 0, 2)
+ZEND_ARG_INFO(0, offset)
+ZEND_ARG_INFO(0, value)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_offsetget, 0, 0, 1)
+ZEND_ARG_INFO(0, offset)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_offsetexists, 0, 0, 1)
+ZEND_ARG_INFO(0, offset)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_offsetunset, 0, 0, 1)
+ZEND_ARG_INFO(0, offset)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_factory, 0, 0, 1)
+ZEND_ARG_INFO(0, callable)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_protect, 0, 0, 1)
+ZEND_ARG_INFO(0, callable)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_raw, 0, 0, 1)
+ZEND_ARG_INFO(0, id)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_extend, 0, 0, 2)
+ZEND_ARG_INFO(0, id)
+ZEND_ARG_INFO(0, callable)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_keys, 0, 0, 0)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_register, 0, 0, 1)
+ZEND_ARG_OBJ_INFO(0, provider, Pimple\\ServiceProviderInterface, 0)
+ZEND_ARG_ARRAY_INFO(0, values, 1)
+ZEND_END_ARG_INFO()
+
+static const zend_function_entry pimple_ce_functions[] = {
+       PHP_ME(Pimple, __construct,     arginfo___construct, ZEND_ACC_PUBLIC)
+       PHP_ME(Pimple, factory,         arginfo_factory,         ZEND_ACC_PUBLIC)
+       PHP_ME(Pimple, protect,         arginfo_protect,         ZEND_ACC_PUBLIC)
+       PHP_ME(Pimple, raw,             arginfo_raw,             ZEND_ACC_PUBLIC)
+       PHP_ME(Pimple, extend,          arginfo_extend,          ZEND_ACC_PUBLIC)
+       PHP_ME(Pimple, keys,            arginfo_keys,            ZEND_ACC_PUBLIC)
+       PHP_ME(Pimple, register,                arginfo_register,                ZEND_ACC_PUBLIC)
+
+       PHP_ME(Pimple, offsetSet,       arginfo_offsetset,       ZEND_ACC_PUBLIC)
+       PHP_ME(Pimple, offsetGet,       arginfo_offsetget,       ZEND_ACC_PUBLIC)
+       PHP_ME(Pimple, offsetExists,    arginfo_offsetexists,    ZEND_ACC_PUBLIC)
+       PHP_ME(Pimple, offsetUnset,     arginfo_offsetunset,     ZEND_ACC_PUBLIC)
+       PHP_FE_END
+};
+
+/* Pimple\ServiceProviderInterface */
+ZEND_BEGIN_ARG_INFO_EX(arginfo_serviceprovider_register, 0, 0, 1)
+ZEND_ARG_OBJ_INFO(0, pimple, Pimple\\Container, 0)
+ZEND_END_ARG_INFO()
+
+static const zend_function_entry pimple_serviceprovider_iface_ce_functions[] = {
+       PHP_ABSTRACT_ME(ServiceProviderInterface, register, arginfo_serviceprovider_register)
+       PHP_FE_END
+};
+
+/* parent::__construct(sprintf("Something with %s", $arg1)) */
+static void pimple_exception_call_parent_constructor(zval *this_ptr, const char *format, const char *arg1 TSRMLS_DC)
+{
+       zend_class_entry *ce = Z_OBJCE_P(this_ptr);
+       char *message = NULL;
+       int message_len;
+       zval *constructor_arg;
+
+       message_len = spprintf(&message, 0, format, arg1);
+       ALLOC_INIT_ZVAL(constructor_arg);
+       ZVAL_STRINGL(constructor_arg, message, message_len, 1);
+
+       zend_call_method_with_1_params(&this_ptr, ce, &ce->parent->constructor, "__construct", NULL, constructor_arg);
+
+       efree(message);
+       zval_ptr_dtor(&constructor_arg);
+}
+
+/**
+ * Pass a single string parameter to exception constructor and throw
+ */
+static void pimple_throw_exception_string(zend_class_entry *ce, const char *message, zend_uint message_len TSRMLS_DC)
+{
+       zval *exception, *param;
+
+       ALLOC_INIT_ZVAL(exception);
+       object_init_ex(exception, ce);
+
+       ALLOC_INIT_ZVAL(param);
+       ZVAL_STRINGL(param, message, message_len, 1);
+
+       zend_call_method_with_1_params(&exception, ce, &ce->constructor, "__construct", NULL, param);
+
+       zend_throw_exception_object(exception TSRMLS_CC);
+
+       zval_ptr_dtor(&param);
+}
+
+static void pimple_closure_free_object_storage(pimple_closure_object *obj TSRMLS_DC)
+{
+       zend_object_std_dtor(&obj->zobj TSRMLS_CC);
+       if (obj->factory) {
+               zval_ptr_dtor(&obj->factory);
+       }
+       if (obj->callable) {
+               zval_ptr_dtor(&obj->callable);
+       }
+       efree(obj);
+}
+
+static void pimple_free_object_storage(pimple_object *obj TSRMLS_DC)
+{
+       zend_hash_destroy(&obj->factories);
+       zend_hash_destroy(&obj->protected);
+       zend_hash_destroy(&obj->values);
+       zend_object_std_dtor(&obj->zobj TSRMLS_CC);
+       efree(obj);
+}
+
+static void pimple_free_bucket(pimple_bucket_value *bucket)
+{
+       if (bucket->raw) {
+               zval_ptr_dtor(&bucket->raw);
+       }
+}
+
+static zend_object_value pimple_closure_object_create(zend_class_entry *ce TSRMLS_DC)
+{
+       zend_object_value retval;
+       pimple_closure_object *pimple_closure_obj = NULL;
+
+       pimple_closure_obj = ecalloc(1, sizeof(pimple_closure_object));
+       ZEND_OBJ_INIT(&pimple_closure_obj->zobj, ce);
+
+       pimple_closure_object_handlers.get_constructor = pimple_closure_get_constructor;
+       retval.handlers = &pimple_closure_object_handlers;
+       retval.handle   = zend_objects_store_put(pimple_closure_obj, (zend_objects_store_dtor_t) zend_objects_destroy_object, (zend_objects_free_object_storage_t) pimple_closure_free_object_storage, NULL TSRMLS_CC);
+
+       return retval;
+}
+
+static zend_function *pimple_closure_get_constructor(zval *obj TSRMLS_DC)
+{
+       zend_error(E_ERROR, "Pimple\\ContainerClosure is an internal class and cannot be instantiated");
+
+       return NULL;
+}
+
+static int pimple_closure_get_closure(zval *obj, zend_class_entry **ce_ptr, union _zend_function **fptr_ptr, zval **zobj_ptr TSRMLS_DC)
+{
+       *zobj_ptr = obj;
+       *ce_ptr   = Z_OBJCE_P(obj);
+       *fptr_ptr = (zend_function *)&pimple_closure_invoker_function;
+
+       return SUCCESS;
+}
+
+static zend_object_value pimple_object_create(zend_class_entry *ce TSRMLS_DC)
+{
+       zend_object_value retval;
+       pimple_object *pimple_obj  = NULL;
+       zend_function *function    = NULL;
+
+       pimple_obj = emalloc(sizeof(pimple_object));
+       ZEND_OBJ_INIT(&pimple_obj->zobj, ce);
+
+       PIMPLE_OBJECT_HANDLE_INHERITANCE_OBJECT_HANDLERS
+
+       retval.handlers = &pimple_object_handlers;
+       retval.handle   = zend_objects_store_put(pimple_obj, (zend_objects_store_dtor_t) zend_objects_destroy_object, (zend_objects_free_object_storage_t) pimple_free_object_storage, NULL TSRMLS_CC);
+
+       zend_hash_init(&pimple_obj->factories, PIMPLE_DEFAULT_ZVAL_CACHE_NUM, NULL, (dtor_func_t)pimple_bucket_dtor, 0);
+       zend_hash_init(&pimple_obj->protected, PIMPLE_DEFAULT_ZVAL_CACHE_NUM, NULL, (dtor_func_t)pimple_bucket_dtor, 0);
+       zend_hash_init(&pimple_obj->values, PIMPLE_DEFAULT_ZVAL_VALUES_NUM, NULL, (dtor_func_t)pimple_bucket_dtor, 0);
+
+       return retval;
+}
+
+static void pimple_object_write_dimension(zval *object, zval *offset, zval *value TSRMLS_DC)
+{
+       FETCH_DIM_HANDLERS_VARS
+
+       pimple_bucket_value pimple_value = {0}, *found_value = NULL;
+       ulong hash;
+
+       pimple_zval_to_pimpleval(value, &pimple_value TSRMLS_CC);
+
+       if (!offset) {/* $p[] = 'foo' when not overloaded */
+               zend_hash_next_index_insert(&pimple_obj->values, (void *)&pimple_value, sizeof(pimple_bucket_value), NULL);
+               Z_ADDREF_P(value);
+               return;
+       }
+
+       switch (Z_TYPE_P(offset)) {
+       case IS_STRING:
+               hash = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1);
+               zend_hash_quick_find(&pimple_obj->values, Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hash, (void **)&found_value);
+               if (found_value && found_value->type == PIMPLE_IS_SERVICE && found_value->initialized == 1) {
+                       pimple_free_bucket(&pimple_value);
+                       pimple_throw_exception_string(pimple_ce_FrozenServiceException, Z_STRVAL_P(offset), Z_STRLEN_P(offset) TSRMLS_CC);
+                       return;
+               }
+               if (zend_hash_quick_update(&pimple_obj->values, Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hash, (void *)&pimple_value, sizeof(pimple_bucket_value), NULL) == FAILURE) {
+                       pimple_free_bucket(&pimple_value);
+                       return;
+               }
+               Z_ADDREF_P(value);
+       break;
+       case IS_DOUBLE:
+       case IS_BOOL:
+       case IS_LONG:
+               if (Z_TYPE_P(offset) == IS_DOUBLE) {
+                       index = (ulong)Z_DVAL_P(offset);
+               } else {
+                       index = Z_LVAL_P(offset);
+               }
+               zend_hash_index_find(&pimple_obj->values, index, (void **)&found_value);
+               if (found_value && found_value->type == PIMPLE_IS_SERVICE && found_value->initialized == 1) {
+                       pimple_free_bucket(&pimple_value);
+                       convert_to_string(offset);
+                       pimple_throw_exception_string(pimple_ce_FrozenServiceException, Z_STRVAL_P(offset), Z_STRLEN_P(offset) TSRMLS_CC);
+                       return;
+               }
+               if (zend_hash_index_update(&pimple_obj->values, index, (void *)&pimple_value, sizeof(pimple_bucket_value), NULL) == FAILURE) {
+                       pimple_free_bucket(&pimple_value);
+                       return;
+               }
+               Z_ADDREF_P(value);
+       break;
+       case IS_NULL: /* $p[] = 'foo' when overloaded */
+               zend_hash_next_index_insert(&pimple_obj->values, (void *)&pimple_value, sizeof(pimple_bucket_value), NULL);
+               Z_ADDREF_P(value);
+       break;
+       default:
+               pimple_free_bucket(&pimple_value);
+               zend_error(E_WARNING, "Unsupported offset type");
+       }
+}
+
+static void pimple_object_unset_dimension(zval *object, zval *offset TSRMLS_DC)
+{
+       FETCH_DIM_HANDLERS_VARS
+
+       switch (Z_TYPE_P(offset)) {
+       case IS_STRING:
+               zend_symtable_del(&pimple_obj->values, Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1);
+               zend_symtable_del(&pimple_obj->factories, Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1);
+               zend_symtable_del(&pimple_obj->protected, Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1);
+       break;
+       case IS_DOUBLE:
+       case IS_BOOL:
+       case IS_LONG:
+               if (Z_TYPE_P(offset) == IS_DOUBLE) {
+                       index = (ulong)Z_DVAL_P(offset);
+               } else {
+                       index = Z_LVAL_P(offset);
+               }
+               zend_hash_index_del(&pimple_obj->values, index);
+               zend_hash_index_del(&pimple_obj->factories, index);
+               zend_hash_index_del(&pimple_obj->protected, index);
+       break;
+       default:
+               zend_error(E_WARNING, "Unsupported offset type");
+       }
+}
+
+static int pimple_object_has_dimension(zval *object, zval *offset, int check_empty TSRMLS_DC)
+{
+       FETCH_DIM_HANDLERS_VARS
+
+       pimple_bucket_value *retval = NULL;
+
+       switch (Z_TYPE_P(offset)) {
+       case IS_STRING:
+               if (zend_symtable_find(&pimple_obj->values, Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, (void **)&retval) == SUCCESS) {
+                       switch (check_empty) {
+                       case 0: /* isset */
+                               return 1; /* Differs from PHP behavior (Z_TYPE_P(retval->value) != IS_NULL;) */
+                       case 1: /* empty */
+                       default:
+                               return zend_is_true(retval->value);
+                       }
+               }
+               return 0;
+       break;
+       case IS_DOUBLE:
+       case IS_BOOL:
+       case IS_LONG:
+               if (Z_TYPE_P(offset) == IS_DOUBLE) {
+                       index = (ulong)Z_DVAL_P(offset);
+               } else {
+                       index = Z_LVAL_P(offset);
+               }
+               if (zend_hash_index_find(&pimple_obj->values, index, (void **)&retval) == SUCCESS) {
+                       switch (check_empty) {
+                               case 0: /* isset */
+                                       return 1; /* Differs from PHP behavior (Z_TYPE_P(retval->value) != IS_NULL;)*/
+                               case 1: /* empty */
+                               default:
+                                       return zend_is_true(retval->value);
+                       }
+               }
+               return 0;
+       break;
+       default:
+               zend_error(E_WARNING, "Unsupported offset type");
+               return 0;
+       }
+}
+
+static zval *pimple_object_read_dimension(zval *object, zval *offset, int type TSRMLS_DC)
+{
+       FETCH_DIM_HANDLERS_VARS
+
+       pimple_bucket_value *retval = NULL;
+       zend_fcall_info fci         = {0};
+       zval *retval_ptr_ptr        = NULL;
+
+       switch (Z_TYPE_P(offset)) {
+       case IS_STRING:
+               if (zend_symtable_find(&pimple_obj->values, Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, (void **)&retval) == FAILURE) {
+                       pimple_throw_exception_string(pimple_ce_UnknownIdentifierException, Z_STRVAL_P(offset), Z_STRLEN_P(offset) TSRMLS_CC);
+
+                       return EG(uninitialized_zval_ptr);
+               }
+       break;
+       case IS_DOUBLE:
+       case IS_BOOL:
+       case IS_LONG:
+               if (Z_TYPE_P(offset) == IS_DOUBLE) {
+                       index = (ulong)Z_DVAL_P(offset);
+               } else {
+                       index = Z_LVAL_P(offset);
+               }
+               if (zend_hash_index_find(&pimple_obj->values, index, (void **)&retval) == FAILURE) {
+                       return EG(uninitialized_zval_ptr);
+               }
+       break;
+       case IS_NULL: /* $p[][3] = 'foo' first dim access */
+               return EG(uninitialized_zval_ptr);
+       break;
+       default:
+               zend_error(E_WARNING, "Unsupported offset type");
+               return EG(uninitialized_zval_ptr);
+       }
+
+       if(retval->type == PIMPLE_IS_PARAM) {
+               return retval->value;
+       }
+
+       if (zend_hash_index_exists(&pimple_obj->protected, retval->handle_num)) {
+               /* Service is protected, return the value every time */
+               return retval->value;
+       }
+
+       if (zend_hash_index_exists(&pimple_obj->factories, retval->handle_num)) {
+               /* Service is a factory, call it every time and never cache its result */
+               PIMPLE_CALL_CB
+               Z_DELREF_P(retval_ptr_ptr); /* fetch dim addr will increment refcount */
+               return retval_ptr_ptr;
+       }
+
+       if (retval->initialized == 1) {
+               /* Service has already been called, return its cached value */
+               return retval->value;
+       }
+
+       ALLOC_INIT_ZVAL(retval->raw);
+       MAKE_COPY_ZVAL(&retval->value, retval->raw);
+
+       PIMPLE_CALL_CB
+
+       retval->initialized = 1;
+       zval_ptr_dtor(&retval->value);
+       retval->value = retval_ptr_ptr;
+
+       return retval->value;
+}
+
+static int pimple_zval_is_valid_callback(zval *_zval, pimple_bucket_value *_pimple_bucket_value TSRMLS_DC)
+{
+       if (Z_TYPE_P(_zval) != IS_OBJECT) {
+               return FAILURE;
+       }
+
+       if (_pimple_bucket_value->fcc.called_scope) {
+               return SUCCESS;
+       }
+
+       if (Z_OBJ_HANDLER_P(_zval, get_closure) && Z_OBJ_HANDLER_P(_zval, get_closure)(_zval, &_pimple_bucket_value->fcc.calling_scope, &_pimple_bucket_value->fcc.function_handler, &_pimple_bucket_value->fcc.object_ptr TSRMLS_CC) == SUCCESS) {
+               _pimple_bucket_value->fcc.called_scope = _pimple_bucket_value->fcc.calling_scope;
+               return SUCCESS;
+       } else {
+               return FAILURE;
+       }
+}
+
+static int pimple_zval_to_pimpleval(zval *_zval, pimple_bucket_value *_pimple_bucket_value TSRMLS_DC)
+{
+       _pimple_bucket_value->value = _zval;
+
+       if (Z_TYPE_P(_zval) != IS_OBJECT) {
+               return PIMPLE_IS_PARAM;
+       }
+
+       if (pimple_zval_is_valid_callback(_zval, _pimple_bucket_value TSRMLS_CC) == SUCCESS) {
+               _pimple_bucket_value->type       = PIMPLE_IS_SERVICE;
+               _pimple_bucket_value->handle_num = Z_OBJ_HANDLE_P(_zval);
+       }
+
+       return PIMPLE_IS_SERVICE;
+}
+
+static void pimple_bucket_dtor(pimple_bucket_value *bucket)
+{
+       zval_ptr_dtor(&bucket->value);
+       pimple_free_bucket(bucket);
+}
+
+PHP_METHOD(FrozenServiceException, __construct)
+{
+       char *id = NULL;
+       int id_len;
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &id, &id_len) == FAILURE) {
+               return;
+       }
+       pimple_exception_call_parent_constructor(getThis(), "Cannot override frozen service \"%s\".", id TSRMLS_CC);
+}
+
+PHP_METHOD(InvalidServiceIdentifierException, __construct)
+{
+       char *id = NULL;
+       int id_len;
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &id, &id_len) == FAILURE) {
+               return;
+       }
+       pimple_exception_call_parent_constructor(getThis(), "Identifier \"%s\" does not contain an object definition.", id TSRMLS_CC);
+}
+
+PHP_METHOD(UnknownIdentifierException, __construct)
+{
+       char *id = NULL;
+       int id_len;
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &id, &id_len) == FAILURE) {
+               return;
+       }
+       pimple_exception_call_parent_constructor(getThis(), "Identifier \"%s\" is not defined.", id TSRMLS_CC);
+}
+
+PHP_METHOD(Pimple, protect)
+{
+       zval *protected     = NULL;
+       pimple_object *pobj = NULL;
+       pimple_bucket_value bucket = {0};
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &protected) == FAILURE) {
+               return;
+       }
+
+       if (pimple_zval_is_valid_callback(protected, &bucket TSRMLS_CC) == FAILURE) {
+               pimple_free_bucket(&bucket);
+               zend_throw_exception(pimple_ce_ExpectedInvokableException, "Callable is not a Closure or invokable object.", 0 TSRMLS_CC);
+               return;
+       }
+
+       pimple_zval_to_pimpleval(protected, &bucket TSRMLS_CC);
+       pobj = (pimple_object *)zend_object_store_get_object(getThis() TSRMLS_CC);
+
+       if (zend_hash_index_update(&pobj->protected, bucket.handle_num, (void *)&bucket, sizeof(pimple_bucket_value), NULL) == SUCCESS) {
+               Z_ADDREF_P(protected);
+               RETURN_ZVAL(protected, 1 , 0);
+       } else {
+               pimple_free_bucket(&bucket);
+       }
+       RETURN_FALSE;
+}
+
+PHP_METHOD(Pimple, raw)
+{
+       zval *offset = NULL;
+       pimple_object *pobj        = NULL;
+       pimple_bucket_value *value = NULL;
+       ulong index;
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &offset) == FAILURE) {
+               return;
+       }
+
+       pobj = zend_object_store_get_object(getThis() TSRMLS_CC);
+
+       switch (Z_TYPE_P(offset)) {
+               case IS_STRING:
+                       if (zend_symtable_find(&pobj->values, Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, (void *)&value) == FAILURE) {
+                               pimple_throw_exception_string(pimple_ce_UnknownIdentifierException, Z_STRVAL_P(offset), Z_STRLEN_P(offset) TSRMLS_CC);
+                               RETURN_NULL();
+                       }
+               break;
+               case IS_DOUBLE:
+               case IS_BOOL:
+               case IS_LONG:
+                       if (Z_TYPE_P(offset) == IS_DOUBLE) {
+                               index = (ulong)Z_DVAL_P(offset);
+                       } else {
+                               index = Z_LVAL_P(offset);
+                       }
+                       if (zend_hash_index_find(&pobj->values, index, (void *)&value) == FAILURE) {
+                               RETURN_NULL();
+                       }
+               break;
+               case IS_NULL:
+               default:
+                       zend_error(E_WARNING, "Unsupported offset type");
+       }
+
+       if (value->raw) {
+               RETVAL_ZVAL(value->raw, 1, 0);
+       } else {
+               RETVAL_ZVAL(value->value, 1, 0);
+       }
+}
+
+PHP_METHOD(Pimple, extend)
+{
+       zval *offset = NULL, *callable = NULL, *pimple_closure_obj = NULL;
+       pimple_bucket_value bucket = {0}, *value = NULL;
+       pimple_object *pobj          = NULL;
+       pimple_closure_object *pcobj = NULL;
+       ulong index;
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zz", &offset, &callable) == FAILURE) {
+               return;
+       }
+
+       pobj = zend_object_store_get_object(getThis() TSRMLS_CC);
+
+       switch (Z_TYPE_P(offset)) {
+               case IS_STRING:
+                       if (zend_symtable_find(&pobj->values, Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, (void *)&value) == FAILURE) {
+                               pimple_throw_exception_string(pimple_ce_UnknownIdentifierException, Z_STRVAL_P(offset), Z_STRLEN_P(offset) TSRMLS_CC);
+                               RETURN_NULL();
+                       }
+
+                       if (value->type != PIMPLE_IS_SERVICE) {
+                               pimple_throw_exception_string(pimple_ce_InvalidServiceIdentifierException, Z_STRVAL_P(offset), Z_STRLEN_P(offset) TSRMLS_CC);
+                               RETURN_NULL();
+                       }
+                       if (zend_hash_index_exists(&pobj->protected, value->handle_num)) {
+                               int er = EG(error_reporting);
+                               EG(error_reporting) = 0;
+                               php_error(E_DEPRECATED, "How Pimple behaves when extending protected closures will be fixed in Pimple 4. Are you sure \"%s\" should be protected?", Z_STRVAL_P(offset));
+                               EG(error_reporting) = er;
+                       }
+               break;
+               case IS_DOUBLE:
+               case IS_BOOL:
+               case IS_LONG:
+                       if (Z_TYPE_P(offset) == IS_DOUBLE) {
+                               index = (ulong)Z_DVAL_P(offset);
+                       } else {
+                               index = Z_LVAL_P(offset);
+                       }
+                       if (zend_hash_index_find(&pobj->values, index, (void *)&value) == FAILURE) {
+                               convert_to_string(offset);
+                               pimple_throw_exception_string(pimple_ce_UnknownIdentifierException, Z_STRVAL_P(offset), Z_STRLEN_P(offset) TSRMLS_CC);
+                               RETURN_NULL();
+                       }
+                       if (value->type != PIMPLE_IS_SERVICE) {
+                               convert_to_string(offset);
+                               pimple_throw_exception_string(pimple_ce_InvalidServiceIdentifierException, Z_STRVAL_P(offset), Z_STRLEN_P(offset) TSRMLS_CC);
+                               RETURN_NULL();
+                       }
+                       if (zend_hash_index_exists(&pobj->protected, value->handle_num)) {
+                               int er = EG(error_reporting);
+                               EG(error_reporting) = 0;
+                               php_error(E_DEPRECATED, "How Pimple behaves when extending protected closures will be fixed in Pimple 4. Are you sure \"%ld\" should be protected?", index);
+                               EG(error_reporting) = er;
+                       }
+               break;
+               case IS_NULL:
+               default:
+                       zend_error(E_WARNING, "Unsupported offset type");
+       }
+
+       if (pimple_zval_is_valid_callback(callable, &bucket TSRMLS_CC) == FAILURE) {
+               pimple_free_bucket(&bucket);
+               zend_throw_exception(pimple_ce_ExpectedInvokableException, "Extension service definition is not a Closure or invokable object.", 0 TSRMLS_CC);
+               RETURN_NULL();
+       }
+       pimple_free_bucket(&bucket);
+
+       ALLOC_INIT_ZVAL(pimple_closure_obj);
+       object_init_ex(pimple_closure_obj, pimple_closure_ce);
+
+       pcobj = zend_object_store_get_object(pimple_closure_obj TSRMLS_CC);
+       pcobj->callable = callable;
+       pcobj->factory  = value->value;
+       Z_ADDREF_P(callable);
+       Z_ADDREF_P(value->value);
+
+       if (zend_hash_index_exists(&pobj->factories, value->handle_num)) {
+               pimple_zval_to_pimpleval(pimple_closure_obj, &bucket TSRMLS_CC);
+               zend_hash_index_del(&pobj->factories, value->handle_num);
+               zend_hash_index_update(&pobj->factories, bucket.handle_num, (void *)&bucket, sizeof(pimple_bucket_value), NULL);
+               Z_ADDREF_P(pimple_closure_obj);
+       }
+
+       pimple_object_write_dimension(getThis(), offset, pimple_closure_obj TSRMLS_CC);
+
+       RETVAL_ZVAL(pimple_closure_obj, 1, 1);
+}
+
+PHP_METHOD(Pimple, keys)
+{
+       HashPosition pos;
+       pimple_object *pobj = NULL;
+       zval **value        = NULL;
+       zval *endval        = NULL;
+       char *str_index     = NULL;
+       int str_len;
+       ulong num_index;
+
+       if (zend_parse_parameters_none() == FAILURE) {
+               return;
+       }
+
+       pobj = zend_object_store_get_object(getThis() TSRMLS_CC);
+       array_init_size(return_value, zend_hash_num_elements(&pobj->values));
+
+       zend_hash_internal_pointer_reset_ex(&pobj->values, &pos);
+
+       while(zend_hash_get_current_data_ex(&pobj->values, (void **)&value, &pos) == SUCCESS) {
+               MAKE_STD_ZVAL(endval);
+               switch (zend_hash_get_current_key_ex(&pobj->values, &str_index, (uint *)&str_len, &num_index, 0, &pos)) {
+                       case HASH_KEY_IS_STRING:
+                               ZVAL_STRINGL(endval, str_index, str_len - 1, 1);
+                               zend_hash_next_index_insert(Z_ARRVAL_P(return_value), &endval, sizeof(zval *), NULL);
+                       break;
+                       case HASH_KEY_IS_LONG:
+                               ZVAL_LONG(endval, num_index);
+                               zend_hash_next_index_insert(Z_ARRVAL_P(return_value), &endval, sizeof(zval *), NULL);
+                       break;
+               }
+       zend_hash_move_forward_ex(&pobj->values, &pos);
+       }
+}
+
+PHP_METHOD(Pimple, factory)
+{
+       zval *factory       = NULL;
+       pimple_object *pobj = NULL;
+       pimple_bucket_value bucket = {0};
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &factory) == FAILURE) {
+               return;
+       }
+
+       if (pimple_zval_is_valid_callback(factory, &bucket TSRMLS_CC) == FAILURE) {
+               pimple_free_bucket(&bucket);
+               zend_throw_exception(pimple_ce_ExpectedInvokableException, "Service definition is not a Closure or invokable object.", 0 TSRMLS_CC);
+               return;
+       }
+
+       pimple_zval_to_pimpleval(factory, &bucket TSRMLS_CC);
+       pobj = (pimple_object *)zend_object_store_get_object(getThis() TSRMLS_CC);
+
+       if (zend_hash_index_update(&pobj->factories, bucket.handle_num, (void *)&bucket, sizeof(pimple_bucket_value), NULL) == SUCCESS) {
+               Z_ADDREF_P(factory);
+               RETURN_ZVAL(factory, 1 , 0);
+       } else {
+               pimple_free_bucket(&bucket);
+       }
+
+       RETURN_FALSE;
+}
+
+PHP_METHOD(Pimple, offsetSet)
+{
+       zval *offset = NULL, *value = NULL;
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zz", &offset, &value) == FAILURE) {
+               return;
+       }
+
+       pimple_object_write_dimension(getThis(), offset, value TSRMLS_CC);
+}
+
+PHP_METHOD(Pimple, offsetGet)
+{
+       zval *offset = NULL, *retval = NULL;
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &offset) == FAILURE) {
+               return;
+       }
+
+       retval = pimple_object_read_dimension(getThis(), offset, 0 TSRMLS_CC);
+
+       RETVAL_ZVAL(retval, 1, 0);
+}
+
+PHP_METHOD(Pimple, offsetUnset)
+{
+       zval *offset = NULL;
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &offset) == FAILURE) {
+               return;
+       }
+
+       pimple_object_unset_dimension(getThis(), offset TSRMLS_CC);
+}
+
+PHP_METHOD(Pimple, offsetExists)
+{
+       zval *offset = NULL;
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &offset) == FAILURE) {
+               return;
+       }
+
+       RETVAL_BOOL(pimple_object_has_dimension(getThis(), offset, 1 TSRMLS_CC));
+}
+
+PHP_METHOD(Pimple, register)
+{
+       zval *provider;
+       zval **data;
+       zval *retval = NULL;
+       zval key;
+
+       HashTable *array = NULL;
+       HashPosition pos;
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O|h", &provider, pimple_serviceprovider_ce, &array) == FAILURE) {
+               return;
+       }
+
+       RETVAL_ZVAL(getThis(), 1, 0);
+
+       zend_call_method_with_1_params(&provider, Z_OBJCE_P(provider), NULL, "register", &retval, getThis());
+
+       if (retval) {
+               zval_ptr_dtor(&retval);
+       }
+
+       if (!array) {
+               return;
+       }
+
+       zend_hash_internal_pointer_reset_ex(array, &pos);
+
+       while(zend_hash_get_current_data_ex(array, (void **)&data, &pos) == SUCCESS) {
+               zend_hash_get_current_key_zval_ex(array, &key, &pos);
+               pimple_object_write_dimension(getThis(), &key, *data TSRMLS_CC);
+               zend_hash_move_forward_ex(array, &pos);
+       }
+}
+
+PHP_METHOD(Pimple, __construct)
+{
+       zval *values = NULL, **pData = NULL, offset;
+       HashPosition pos;
+       char *str_index = NULL;
+       zend_uint str_length;
+       ulong num_index;
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|a!", &values) == FAILURE) {
+               return;
+       }
+
+       PIMPLE_DEPRECATE
+
+       if (!values) {
+               return;
+       }
+
+       zend_hash_internal_pointer_reset_ex(Z_ARRVAL_P(values), &pos);
+       while (zend_hash_has_more_elements_ex(Z_ARRVAL_P(values), &pos) == SUCCESS) {
+                       zend_hash_get_current_data_ex(Z_ARRVAL_P(values), (void **)&pData, &pos);
+                       zend_hash_get_current_key_ex(Z_ARRVAL_P(values), &str_index, &str_length, &num_index, 0, &pos);
+                       INIT_ZVAL(offset);
+                       if (zend_hash_get_current_key_type_ex(Z_ARRVAL_P(values), &pos) == HASH_KEY_IS_LONG) {
+                               ZVAL_LONG(&offset, num_index);
+                       } else {
+                               ZVAL_STRINGL(&offset, str_index, (str_length - 1), 0);
+                       }
+               pimple_object_write_dimension(getThis(), &offset, *pData TSRMLS_CC);
+               zend_hash_move_forward_ex(Z_ARRVAL_P(values), &pos);
+       }
+}
+
+/*
+ * This is PHP code snippet handling extend()s calls :
+
+  $extended = function ($c) use ($callable, $factory) {
+      return $callable($factory($c), $c);
+  };
+
+ */
+PHP_METHOD(PimpleClosure, invoker)
+{
+       pimple_closure_object *pcobj = NULL;
+       zval *arg = NULL, *retval = NULL, *newretval = NULL;
+       zend_fcall_info fci        = {0};
+       zval **args[2];
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &arg) == FAILURE) {
+               return;
+       }
+
+       pcobj = zend_object_store_get_object(getThis() TSRMLS_CC);
+
+       fci.function_name = pcobj->factory;
+       args[0] = &arg;
+       zend_fcall_info_argp(&fci TSRMLS_CC, 1, args);
+       fci.retval_ptr_ptr = &retval;
+       fci.size = sizeof(fci);
+
+       if (zend_call_function(&fci, NULL TSRMLS_CC) == FAILURE || EG(exception)) {
+               efree(fci.params);
+               return; /* Should here return default zval */
+       }
+
+       efree(fci.params);
+       memset(&fci, 0, sizeof(fci));
+       fci.size = sizeof(fci);
+
+       fci.function_name = pcobj->callable;
+       args[0] = &retval;
+       args[1] = &arg;
+       zend_fcall_info_argp(&fci TSRMLS_CC, 2, args);
+       fci.retval_ptr_ptr = &newretval;
+
+       if (zend_call_function(&fci, NULL TSRMLS_CC) == FAILURE || EG(exception)) {
+               efree(fci.params);
+               zval_ptr_dtor(&retval);
+               return;
+       }
+
+       efree(fci.params);
+       zval_ptr_dtor(&retval);
+
+       RETVAL_ZVAL(newretval, 1 ,1);
+}
+
+PHP_MINIT_FUNCTION(pimple)
+{
+       zend_class_entry tmp_ce_PsrContainerInterface, tmp_ce_PsrContainerExceptionInterface, tmp_ce_PsrNotFoundExceptionInterface;
+       zend_class_entry tmp_ce_ExpectedInvokableException, tmp_ce_FrozenServiceException, tmp_ce_InvalidServiceIdentifierException, tmp_ce_UnknownIdentifierException;
+       zend_class_entry tmp_pimple_ce, tmp_pimple_closure_ce, tmp_pimple_serviceprovider_iface_ce;
+
+       /* Psr\Container namespace */
+       INIT_NS_CLASS_ENTRY(tmp_ce_PsrContainerInterface,          PSR_CONTAINER_NS, "ContainerInterface",           pimple_ce_PsrContainerInterface_functions);
+       INIT_NS_CLASS_ENTRY(tmp_ce_PsrContainerExceptionInterface, PSR_CONTAINER_NS, "ContainerExceptionInterface", pimple_ce_PsrContainerExceptionInterface_functions);
+       INIT_NS_CLASS_ENTRY(tmp_ce_PsrNotFoundExceptionInterface,  PSR_CONTAINER_NS, "NotFoundExceptionInterface",  pimple_ce_PsrNotFoundExceptionInterface_functions);
+
+       pimple_ce_PsrContainerInterface          = zend_register_internal_interface(&tmp_ce_PsrContainerInterface TSRMLS_CC);
+       pimple_ce_PsrContainerExceptionInterface = zend_register_internal_interface(&tmp_ce_PsrContainerExceptionInterface TSRMLS_CC);
+       pimple_ce_PsrNotFoundExceptionInterface  = zend_register_internal_interface(&tmp_ce_PsrNotFoundExceptionInterface TSRMLS_CC);
+
+       zend_class_implements(pimple_ce_PsrNotFoundExceptionInterface TSRMLS_CC, 1, pimple_ce_PsrContainerExceptionInterface);
+
+       /* Pimple\Exception namespace */
+       INIT_NS_CLASS_ENTRY(tmp_ce_ExpectedInvokableException,        PIMPLE_EXCEPTION_NS, "ExpectedInvokableException",         NULL);
+       INIT_NS_CLASS_ENTRY(tmp_ce_FrozenServiceException,            PIMPLE_EXCEPTION_NS, "FrozenServiceException",             pimple_ce_FrozenServiceException_functions);
+       INIT_NS_CLASS_ENTRY(tmp_ce_InvalidServiceIdentifierException, PIMPLE_EXCEPTION_NS, "InvalidServiceIdentifierException", pimple_ce_InvalidServiceIdentifierException_functions);
+       INIT_NS_CLASS_ENTRY(tmp_ce_UnknownIdentifierException,        PIMPLE_EXCEPTION_NS, "UnknownIdentifierException",         pimple_ce_UnknownIdentifierException_functions);
+
+       pimple_ce_ExpectedInvokableException        = zend_register_internal_class_ex(&tmp_ce_ExpectedInvokableException, spl_ce_InvalidArgumentException, NULL TSRMLS_CC);
+       pimple_ce_FrozenServiceException            = zend_register_internal_class_ex(&tmp_ce_FrozenServiceException, spl_ce_RuntimeException, NULL TSRMLS_CC);
+       pimple_ce_InvalidServiceIdentifierException = zend_register_internal_class_ex(&tmp_ce_InvalidServiceIdentifierException, spl_ce_InvalidArgumentException, NULL TSRMLS_CC);
+       pimple_ce_UnknownIdentifierException        = zend_register_internal_class_ex(&tmp_ce_UnknownIdentifierException, spl_ce_InvalidArgumentException, NULL TSRMLS_CC);
+
+       zend_class_implements(pimple_ce_ExpectedInvokableException TSRMLS_CC,        1, pimple_ce_PsrContainerExceptionInterface);
+       zend_class_implements(pimple_ce_FrozenServiceException TSRMLS_CC,            1, pimple_ce_PsrContainerExceptionInterface);
+       zend_class_implements(pimple_ce_InvalidServiceIdentifierException TSRMLS_CC, 1, pimple_ce_PsrContainerExceptionInterface);
+       zend_class_implements(pimple_ce_UnknownIdentifierException TSRMLS_CC,        1, pimple_ce_PsrNotFoundExceptionInterface);
+
+    /* Pimple namespace */
+       INIT_NS_CLASS_ENTRY(tmp_pimple_ce, PIMPLE_NS, "Container", pimple_ce_functions);
+       INIT_NS_CLASS_ENTRY(tmp_pimple_closure_ce, PIMPLE_NS, "ContainerClosure", NULL);
+       INIT_NS_CLASS_ENTRY(tmp_pimple_serviceprovider_iface_ce, PIMPLE_NS, "ServiceProviderInterface", pimple_serviceprovider_iface_ce_functions);
+
+       tmp_pimple_ce.create_object         = pimple_object_create;
+       tmp_pimple_closure_ce.create_object = pimple_closure_object_create;
+
+       pimple_ce = zend_register_internal_class(&tmp_pimple_ce TSRMLS_CC);
+       zend_class_implements(pimple_ce TSRMLS_CC, 1, zend_ce_arrayaccess);
+
+       pimple_closure_ce = zend_register_internal_class(&tmp_pimple_closure_ce TSRMLS_CC);
+       pimple_closure_ce->ce_flags |= ZEND_ACC_FINAL_CLASS;
+
+       pimple_serviceprovider_ce = zend_register_internal_interface(&tmp_pimple_serviceprovider_iface_ce TSRMLS_CC);
+
+       memcpy(&pimple_closure_object_handlers, zend_get_std_object_handlers(), sizeof(*zend_get_std_object_handlers()));
+       pimple_object_handlers                     = std_object_handlers;
+       pimple_closure_object_handlers.get_closure = pimple_closure_get_closure;
+
+       pimple_closure_invoker_function.function_name     = "Pimple closure internal invoker";
+       pimple_closure_invoker_function.fn_flags         |= ZEND_ACC_CLOSURE;
+       pimple_closure_invoker_function.handler           = ZEND_MN(PimpleClosure_invoker);
+       pimple_closure_invoker_function.num_args          = 1;
+       pimple_closure_invoker_function.required_num_args = 1;
+       pimple_closure_invoker_function.scope             = pimple_closure_ce;
+       pimple_closure_invoker_function.type              = ZEND_INTERNAL_FUNCTION;
+       pimple_closure_invoker_function.module            = &pimple_module_entry;
+
+       return SUCCESS;
+}
+
+PHP_MINFO_FUNCTION(pimple)
+{
+       php_info_print_table_start();
+       php_info_print_table_header(2, "SensioLabs Pimple C support", "enabled");
+       php_info_print_table_row(2, "Pimple supported version", PIMPLE_VERSION);
+       php_info_print_table_end();
+
+       php_info_print_box_start(0);
+       php_write((void *)ZEND_STRL("SensioLabs Pimple C support developed by Julien Pauli") TSRMLS_CC);
+       if (!sapi_module.phpinfo_as_text) {
+               php_write((void *)ZEND_STRL(sensiolabs_logo) TSRMLS_CC);
+       }
+       php_info_print_box_end();
+}
+
+zend_module_entry pimple_module_entry = {
+       STANDARD_MODULE_HEADER,
+       "pimple",
+       NULL,
+       PHP_MINIT(pimple),
+       NULL,
+       NULL,
+       NULL,
+       PHP_MINFO(pimple),
+       PIMPLE_VERSION,
+       STANDARD_MODULE_PROPERTIES
+};
+
+#ifdef COMPILE_DL_PIMPLE
+ZEND_GET_MODULE(pimple)
+#endif
diff --git a/advancedcontentfilter/vendor/pimple/pimple/ext/pimple/pimple_compat.h b/advancedcontentfilter/vendor/pimple/pimple/ext/pimple/pimple_compat.h
new file mode 100644 (file)
index 0000000..d234e17
--- /dev/null
@@ -0,0 +1,81 @@
+
+/*
+ * This file is part of Pimple.
+ *
+ * Copyright (c) 2014 Fabien Potencier
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is furnished
+ * to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#ifndef PIMPLE_COMPAT_H_
+#define PIMPLE_COMPAT_H_
+
+#include "Zend/zend_extensions.h" /* for ZEND_EXTENSION_API_NO */
+
+#define PHP_5_0_X_API_NO               220040412
+#define PHP_5_1_X_API_NO               220051025
+#define PHP_5_2_X_API_NO               220060519
+#define PHP_5_3_X_API_NO               220090626
+#define PHP_5_4_X_API_NO               220100525
+#define PHP_5_5_X_API_NO               220121212
+#define PHP_5_6_X_API_NO               220131226
+
+#define IS_PHP_56 ZEND_EXTENSION_API_NO == PHP_5_6_X_API_NO
+#define IS_AT_LEAST_PHP_56 ZEND_EXTENSION_API_NO >= PHP_5_6_X_API_NO
+
+#define IS_PHP_55 ZEND_EXTENSION_API_NO == PHP_5_5_X_API_NO
+#define IS_AT_LEAST_PHP_55 ZEND_EXTENSION_API_NO >= PHP_5_5_X_API_NO
+
+#define IS_PHP_54 ZEND_EXTENSION_API_NO == PHP_5_4_X_API_NO
+#define IS_AT_LEAST_PHP_54 ZEND_EXTENSION_API_NO >= PHP_5_4_X_API_NO
+
+#define IS_PHP_53 ZEND_EXTENSION_API_NO == PHP_5_3_X_API_NO
+#define IS_AT_LEAST_PHP_53 ZEND_EXTENSION_API_NO >= PHP_5_3_X_API_NO
+
+#if IS_PHP_53
+#define object_properties_init(obj, ce) do { \
+                zend_hash_copy(obj->properties, &ce->default_properties, zval_copy_property_ctor(ce), NULL, sizeof(zval *)); \
+               } while (0);
+#endif
+
+#define ZEND_OBJ_INIT(obj, ce) do { \
+               zend_object_std_init(obj, ce TSRMLS_CC); \
+               object_properties_init((obj), (ce)); \
+       } while(0);
+
+#if IS_PHP_53 || IS_PHP_54
+static void zend_hash_get_current_key_zval_ex(const HashTable *ht, zval *key, HashPosition *pos) {
+    Bucket *p;
+
+    p = pos ? (*pos) : ht->pInternalPointer;
+
+    if (!p) {
+        Z_TYPE_P(key) = IS_NULL;
+    } else if (p->nKeyLength) {
+        Z_TYPE_P(key) = IS_STRING;
+        Z_STRVAL_P(key) = estrndup(p->arKey, p->nKeyLength - 1);
+        Z_STRLEN_P(key) = p->nKeyLength - 1;
+    } else {
+        Z_TYPE_P(key) = IS_LONG;
+        Z_LVAL_P(key) = p->h;
+    }
+}
+#endif
+
+#endif /* PIMPLE_COMPAT_H_ */
diff --git a/advancedcontentfilter/vendor/pimple/pimple/ext/pimple/tests/001.phpt b/advancedcontentfilter/vendor/pimple/pimple/ext/pimple/tests/001.phpt
new file mode 100644 (file)
index 0000000..0809ea2
--- /dev/null
@@ -0,0 +1,45 @@
+--TEST--
+Test for read_dim/write_dim handlers
+--SKIPIF--
+<?php if (!extension_loaded("pimple")) print "skip"; ?>
+--FILE--
+<?php 
+$p = new Pimple\Container();
+$p[42] = 'foo';
+$p['foo'] = 42;
+
+echo $p[42];
+echo "\n";
+echo $p['foo'];
+echo "\n";
+try {
+       var_dump($p['nonexistant']);
+       echo "Exception excpected";
+} catch (InvalidArgumentException $e) { }
+
+$p[54.2] = 'foo2';
+echo $p[54];
+echo "\n";
+$p[242.99] = 'foo99';
+echo $p[242];
+
+echo "\n";
+
+$p[5] = 'bar';
+$p[5] = 'baz';
+echo $p[5];
+
+echo "\n";
+
+$p['str'] = 'str';
+$p['str'] = 'strstr';
+echo $p['str'];
+?>
+
+--EXPECTF--
+foo
+42
+foo2
+foo99
+baz
+strstr
\ No newline at end of file
diff --git a/advancedcontentfilter/vendor/pimple/pimple/ext/pimple/tests/002.phpt b/advancedcontentfilter/vendor/pimple/pimple/ext/pimple/tests/002.phpt
new file mode 100644 (file)
index 0000000..7b56d2c
--- /dev/null
@@ -0,0 +1,15 @@
+--TEST--
+Test for constructor
+--SKIPIF--
+<?php if (!extension_loaded("pimple")) print "skip"; ?>
+--FILE--
+<?php 
+$p = new Pimple\Container();
+var_dump($p[42]);
+
+$p = new Pimple\Container(array(42=>'foo'));
+var_dump($p[42]);
+?>
+--EXPECT--
+NULL
+string(3) "foo"
diff --git a/advancedcontentfilter/vendor/pimple/pimple/ext/pimple/tests/003.phpt b/advancedcontentfilter/vendor/pimple/pimple/ext/pimple/tests/003.phpt
new file mode 100644 (file)
index 0000000..a22cfa3
--- /dev/null
@@ -0,0 +1,16 @@
+--TEST--
+Test empty dimensions
+--SKIPIF--
+<?php if (!extension_loaded("pimple")) print "skip"; ?>
+--FILE--
+<?php 
+$p = new Pimple\Container();
+$p[] = 42;
+var_dump($p[0]);
+$p[41] = 'foo';
+$p[] = 'bar';
+var_dump($p[42]);
+?>
+--EXPECT--
+int(42)
+string(3) "bar"
\ No newline at end of file
diff --git a/advancedcontentfilter/vendor/pimple/pimple/ext/pimple/tests/004.phpt b/advancedcontentfilter/vendor/pimple/pimple/ext/pimple/tests/004.phpt
new file mode 100644 (file)
index 0000000..1e1d251
--- /dev/null
@@ -0,0 +1,30 @@
+--TEST--
+Test has/unset dim handlers
+--SKIPIF--
+<?php if (!extension_loaded("pimple")) print "skip"; ?>
+--FILE--
+<?php 
+$p = new Pimple\Container();
+$p[] = 42;
+var_dump($p[0]);
+unset($p[0]);
+var_dump($p[0]);
+$p['foo'] = 'bar';
+var_dump(isset($p['foo']));
+unset($p['foo']);
+try {
+       var_dump($p['foo']);
+       echo "Excpected exception";
+} catch (InvalidArgumentException $e) { }
+var_dump(isset($p['bar']));
+$p['bar'] = NULL;
+var_dump(isset($p['bar']));
+var_dump(empty($p['bar']));
+?>
+--EXPECT--
+int(42)
+NULL
+bool(true)
+bool(false)
+bool(true)
+bool(true)
\ No newline at end of file
diff --git a/advancedcontentfilter/vendor/pimple/pimple/ext/pimple/tests/005.phpt b/advancedcontentfilter/vendor/pimple/pimple/ext/pimple/tests/005.phpt
new file mode 100644 (file)
index 0000000..0479ee0
--- /dev/null
@@ -0,0 +1,27 @@
+--TEST--
+Test simple class inheritance
+--SKIPIF--
+<?php if (!extension_loaded("pimple")) print "skip"; ?>
+--FILE--
+<?php 
+class MyPimple extends Pimple\Container
+{
+       public $someAttr = 'fooAttr';
+
+    public function offsetget($o)
+    {
+        var_dump("hit");
+        return parent::offsetget($o);
+    }
+}
+
+$p = new MyPimple;
+$p[42] = 'foo';
+echo $p[42];
+echo "\n";
+echo $p->someAttr;
+?>
+--EXPECT--
+string(3) "hit"
+foo
+fooAttr
\ No newline at end of file
diff --git a/advancedcontentfilter/vendor/pimple/pimple/ext/pimple/tests/006.phpt b/advancedcontentfilter/vendor/pimple/pimple/ext/pimple/tests/006.phpt
new file mode 100644 (file)
index 0000000..cfe8a11
--- /dev/null
@@ -0,0 +1,51 @@
+--TEST--
+Test complex class inheritance
+--SKIPIF--
+<?php if (!extension_loaded("pimple")) print "skip"; ?>
+--FILE--
+<?php 
+class MyPimple extends Pimple\Container
+{
+    public function offsetget($o)
+    {
+        var_dump("hit offsetget in " . __CLASS__);
+        return parent::offsetget($o);
+    }
+}
+
+class TestPimple extends MyPimple
+{
+    public function __construct($values)
+    {
+        array_shift($values);
+        parent::__construct($values);
+    }
+    
+    public function offsetget($o)
+    {
+        var_dump('hit offsetget in ' . __CLASS__);
+        return parent::offsetget($o);
+    }
+    
+    public function offsetset($o, $v)
+    {
+        var_dump('hit offsetset');
+        return parent::offsetset($o, $v);
+    }
+}
+
+$defaultValues = array('foo' => 'bar', 88 => 'baz');
+
+$p = new TestPimple($defaultValues);
+$p[42] = 'foo';
+var_dump($p[42]);
+var_dump($p[0]);
+?>
+--EXPECT--
+string(13) "hit offsetset"
+string(27) "hit offsetget in TestPimple"
+string(25) "hit offsetget in MyPimple"
+string(3) "foo"
+string(27) "hit offsetget in TestPimple"
+string(25) "hit offsetget in MyPimple"
+string(3) "baz"
\ No newline at end of file
diff --git a/advancedcontentfilter/vendor/pimple/pimple/ext/pimple/tests/007.phpt b/advancedcontentfilter/vendor/pimple/pimple/ext/pimple/tests/007.phpt
new file mode 100644 (file)
index 0000000..5aac683
--- /dev/null
@@ -0,0 +1,22 @@
+--TEST--
+Test for read_dim/write_dim handlers
+--SKIPIF--
+<?php if (!extension_loaded("pimple")) print "skip"; ?>
+--FILE--
+<?php 
+$p = new Pimple\Container();
+$p[42] = 'foo';
+$p['foo'] = 42;
+
+echo $p[42];
+echo "\n";
+echo $p['foo'];
+echo "\n";
+try {
+       var_dump($p['nonexistant']);
+       echo "Exception excpected";
+} catch (InvalidArgumentException $e) { }
+?>
+--EXPECTF--
+foo
+42
\ No newline at end of file
diff --git a/advancedcontentfilter/vendor/pimple/pimple/ext/pimple/tests/008.phpt b/advancedcontentfilter/vendor/pimple/pimple/ext/pimple/tests/008.phpt
new file mode 100644 (file)
index 0000000..db7eeec
--- /dev/null
@@ -0,0 +1,29 @@
+--TEST--
+Test frozen services
+--SKIPIF--
+<?php if (!extension_loaded("pimple")) print "skip"; ?>
+--FILE--
+<?php 
+$p = new Pimple\Container();
+$p[42] = 'foo';
+$p[42] = 'bar';
+
+$p['foo'] = function () { };
+$p['foo'] = function () { };
+
+$a = $p['foo'];
+
+try {
+       $p['foo'] = function () { };
+       echo "Exception excpected";
+} catch (RuntimeException $e) { }
+
+$p[42] = function() { };
+$a = $p[42];
+
+try {
+       $p[42] = function () { };
+       echo "Exception excpected";
+} catch (RuntimeException $e) { }
+?>
+--EXPECTF--
diff --git a/advancedcontentfilter/vendor/pimple/pimple/ext/pimple/tests/009.phpt b/advancedcontentfilter/vendor/pimple/pimple/ext/pimple/tests/009.phpt
new file mode 100644 (file)
index 0000000..bb05ea2
--- /dev/null
@@ -0,0 +1,13 @@
+--TEST--
+Test service is called as callback, and only once
+--SKIPIF--
+<?php if (!extension_loaded("pimple")) print "skip"; ?>
+--FILE--
+<?php 
+$p = new Pimple\Container();
+$p['foo'] = function($arg) use ($p) { var_dump($p === $arg); };
+$a = $p['foo'];
+$b = $p['foo']; /* should return not calling the callback */
+?>
+--EXPECTF--
+bool(true)
\ No newline at end of file
diff --git a/advancedcontentfilter/vendor/pimple/pimple/ext/pimple/tests/010.phpt b/advancedcontentfilter/vendor/pimple/pimple/ext/pimple/tests/010.phpt
new file mode 100644 (file)
index 0000000..badce01
--- /dev/null
@@ -0,0 +1,45 @@
+--TEST--
+Test service is called as callback for every callback type
+--SKIPIF--
+<?php if (!extension_loaded("pimple")) print "skip"; ?>
+--FILE--
+<?php
+function callme()
+{
+    return 'called';
+}
+
+$a = function() { return 'called'; };
+
+class Foo
+{
+    public static function bar()
+    {
+        return 'called';
+    }
+}
+$p = new Pimple\Container();
+$p['foo'] = 'callme';
+echo $p['foo'] . "\n";
+
+$p['bar'] = $a;
+echo $p['bar'] . "\n";
+
+$p['baz'] = "Foo::bar";
+echo $p['baz'] . "\n";
+
+$p['foobar'] = array('Foo', 'bar');
+var_dump($p['foobar']);
+
+?>
+--EXPECTF--
+callme
+called
+Foo::bar
+array(2) {
+  [0]=>
+  string(3) "Foo"
+  [1]=>
+  string(3) "bar"
+}
\ No newline at end of file
diff --git a/advancedcontentfilter/vendor/pimple/pimple/ext/pimple/tests/011.phpt b/advancedcontentfilter/vendor/pimple/pimple/ext/pimple/tests/011.phpt
new file mode 100644 (file)
index 0000000..6682ab8
--- /dev/null
@@ -0,0 +1,19 @@
+--TEST--
+Test service callback throwing an exception
+--SKIPIF--
+<?php if (!extension_loaded("pimple")) print "skip"; ?>
+--FILE--
+<?php
+class CallBackException extends RuntimeException { }
+
+$p = new Pimple\Container();
+$p['foo'] = function () { throw new CallBackException; };
+try {
+       echo $p['foo'] . "\n";
+       echo "should not come here";
+} catch (CallBackException $e) {
+       echo "all right!";
+}
+?>
+--EXPECTF--
+all right!
\ No newline at end of file
diff --git a/advancedcontentfilter/vendor/pimple/pimple/ext/pimple/tests/012.phpt b/advancedcontentfilter/vendor/pimple/pimple/ext/pimple/tests/012.phpt
new file mode 100644 (file)
index 0000000..4c6ac48
--- /dev/null
@@ -0,0 +1,28 @@
+--TEST--
+Test service factory
+--SKIPIF--
+<?php if (!extension_loaded("pimple")) print "skip"; ?>
+--FILE--
+<?php
+
+$p = new Pimple\Container();
+
+$p->factory($f = function() { var_dump('called-1'); return 'ret-1';});
+
+$p[] = $f;
+
+$p[] = function () { var_dump('called-2'); return 'ret-2'; };
+
+var_dump($p[0]);
+var_dump($p[0]);
+var_dump($p[1]);
+var_dump($p[1]);
+?>
+--EXPECTF--
+string(8) "called-1"
+string(5) "ret-1"
+string(8) "called-1"
+string(5) "ret-1"
+string(8) "called-2"
+string(5) "ret-2"
+string(5) "ret-2"
\ No newline at end of file
diff --git a/advancedcontentfilter/vendor/pimple/pimple/ext/pimple/tests/013.phpt b/advancedcontentfilter/vendor/pimple/pimple/ext/pimple/tests/013.phpt
new file mode 100644 (file)
index 0000000..f419958
--- /dev/null
@@ -0,0 +1,33 @@
+--TEST--
+Test keys()
+--SKIPIF--
+<?php if (!extension_loaded("pimple")) print "skip"; ?>
+--FILE--
+<?php
+
+$p = new Pimple\Container();
+
+var_dump($p->keys());
+
+$p['foo'] = 'bar';
+$p[] = 'foo';
+
+var_dump($p->keys());
+
+unset($p['foo']);
+
+var_dump($p->keys());
+?>
+--EXPECTF--
+array(0) {
+}
+array(2) {
+  [0]=>
+  string(3) "foo"
+  [1]=>
+  int(0)
+}
+array(1) {
+  [0]=>
+  int(0)
+}
\ No newline at end of file
diff --git a/advancedcontentfilter/vendor/pimple/pimple/ext/pimple/tests/014.phpt b/advancedcontentfilter/vendor/pimple/pimple/ext/pimple/tests/014.phpt
new file mode 100644 (file)
index 0000000..ac93721
--- /dev/null
@@ -0,0 +1,30 @@
+--TEST--
+Test raw()
+--SKIPIF--
+<?php if (!extension_loaded("pimple")) print "skip"; ?>
+--FILE--
+<?php
+
+$p = new Pimple\Container();
+$f = function () { var_dump('called-2'); return 'ret-2'; };
+
+$p['foo'] = $f;
+$p[42]    = $f;
+
+var_dump($p['foo']);
+var_dump($p->raw('foo'));
+var_dump($p[42]);
+
+unset($p['foo']);
+
+try {
+       $p->raw('foo');
+       echo "expected exception";
+} catch (InvalidArgumentException $e) { }
+--EXPECTF--
+string(8) "called-2"
+string(5) "ret-2"
+object(Closure)#%i (0) {
+}
+string(8) "called-2"
+string(5) "ret-2"
\ No newline at end of file
diff --git a/advancedcontentfilter/vendor/pimple/pimple/ext/pimple/tests/015.phpt b/advancedcontentfilter/vendor/pimple/pimple/ext/pimple/tests/015.phpt
new file mode 100644 (file)
index 0000000..314f008
--- /dev/null
@@ -0,0 +1,17 @@
+--TEST--
+Test protect()
+--SKIPIF--
+<?php if (!extension_loaded("pimple")) print "skip"; ?>
+--FILE--
+<?php
+
+$p = new Pimple\Container();
+$f = function () { return 'foo'; };
+$p['foo'] = $f;
+
+$p->protect($f);
+
+var_dump($p['foo']);
+--EXPECTF--
+object(Closure)#%i (0) {
+}
\ No newline at end of file
diff --git a/advancedcontentfilter/vendor/pimple/pimple/ext/pimple/tests/016.phpt b/advancedcontentfilter/vendor/pimple/pimple/ext/pimple/tests/016.phpt
new file mode 100644 (file)
index 0000000..e55edb0
--- /dev/null
@@ -0,0 +1,24 @@
+--TEST--
+Test extend()
+--SKIPIF--
+<?php if (!extension_loaded("pimple")) print "skip"; ?>
+--FILE--
+<?php
+/*
+ This is part of Pimple::extend() code :
+
+          $extended = function ($c) use ($callable, $factory) {
+             return $callable($factory($c), $c);
+          };
+*/
+
+$p = new Pimple\Container();
+$p[12] = function ($v) { var_dump($v); return 'foo';}; /* $factory in code above */
+
+$c = $p->extend(12, function ($w) { var_dump($w); return 'bar'; }); /* $callable in code above */
+
+var_dump($c('param'));
+--EXPECTF--
+string(5) "param"
+string(3) "foo"
+string(3) "bar"
\ No newline at end of file
diff --git a/advancedcontentfilter/vendor/pimple/pimple/ext/pimple/tests/017.phpt b/advancedcontentfilter/vendor/pimple/pimple/ext/pimple/tests/017.phpt
new file mode 100644 (file)
index 0000000..bac23ce
--- /dev/null
@@ -0,0 +1,17 @@
+--TEST--
+Test extend() with exception in service extension
+--SKIPIF--
+<?php if (!extension_loaded("pimple")) print "skip"; ?>
+--FILE--
+<?php
+
+$p = new Pimple\Container();
+$p[12] = function ($v) { return 'foo';};
+
+$c = $p->extend(12, function ($w) { throw new BadMethodCallException; });
+
+try {
+       $p[12];
+       echo "Exception expected";
+} catch (BadMethodCallException $e) { }
+--EXPECTF--
diff --git a/advancedcontentfilter/vendor/pimple/pimple/ext/pimple/tests/017_1.phpt b/advancedcontentfilter/vendor/pimple/pimple/ext/pimple/tests/017_1.phpt
new file mode 100644 (file)
index 0000000..8f881d6
--- /dev/null
@@ -0,0 +1,17 @@
+--TEST--
+Test extend() with exception in service factory
+--SKIPIF--
+<?php if (!extension_loaded("pimple")) print "skip"; ?>
+--FILE--
+<?php
+
+$p = new Pimple\Container();
+$p[12] = function ($v) { throw new BadMethodCallException; };
+
+$c = $p->extend(12, function ($w) { return 'foobar'; });
+
+try {
+       $p[12];
+       echo "Exception expected";
+} catch (BadMethodCallException $e) { }
+--EXPECTF--
diff --git a/advancedcontentfilter/vendor/pimple/pimple/ext/pimple/tests/018.phpt b/advancedcontentfilter/vendor/pimple/pimple/ext/pimple/tests/018.phpt
new file mode 100644 (file)
index 0000000..27c12a1
--- /dev/null
@@ -0,0 +1,23 @@
+--TEST--
+Test register()
+--SKIPIF--
+<?php if (!extension_loaded("pimple")) print "skip"; ?>
+--FILE--
+<?php
+
+class Foo implements Pimple\ServiceProviderInterface
+{
+    public function register(Pimple\Container $p)
+    {
+        var_dump($p);
+    }
+}
+
+$p = new Pimple\Container();
+$p->register(new Foo, array(42 => 'bar'));
+
+var_dump($p[42]);
+--EXPECTF--
+object(Pimple\Container)#1 (0) {
+}
+string(3) "bar"
\ No newline at end of file
diff --git a/advancedcontentfilter/vendor/pimple/pimple/ext/pimple/tests/019.phpt b/advancedcontentfilter/vendor/pimple/pimple/ext/pimple/tests/019.phpt
new file mode 100644 (file)
index 0000000..28a9aec
--- /dev/null
@@ -0,0 +1,18 @@
+--TEST--
+Test register() returns static and is a fluent interface
+--SKIPIF--
+<?php if (!extension_loaded("pimple")) print "skip"; ?>
+--FILE--
+<?php
+
+class Foo implements Pimple\ServiceProviderInterface
+{
+    public function register(Pimple\Container $p)
+    {
+    }
+}
+
+$p = new Pimple\Container();
+var_dump($p === $p->register(new Foo));
+--EXPECTF--
+bool(true)
diff --git a/advancedcontentfilter/vendor/pimple/pimple/ext/pimple/tests/bench.phpb b/advancedcontentfilter/vendor/pimple/pimple/ext/pimple/tests/bench.phpb
new file mode 100644 (file)
index 0000000..8f983e6
--- /dev/null
@@ -0,0 +1,51 @@
+<?php
+
+if (!class_exists('Pimple\Container')) {
+    require_once __DIR__ . '/../../../src/Pimple/Container.php';
+} else {
+    echo "pimple-c extension detected, using...\n\n";
+}
+
+$time = microtime(true);
+
+function foo() { }
+$factory = function () { };
+
+for ($i=0; $i<10000; $i++) {
+
+$p = new Pimple\Container;
+
+$p['foo'] = 'bar';
+
+if (!isset($p[3])) {
+    $p[3] = $p['foo'];
+    $p[]  = 'bar';
+}
+
+$p[2] = 42;
+
+if (isset($p[2])) {
+       unset($p[2]);
+}
+
+$p[42] = $p['foo'];
+
+$p['cb'] = function($arg) { };
+
+$p[] = $p['cb'];
+
+echo $p['cb'];
+echo $p['cb'];
+echo $p['cb'];
+
+//$p->factory($factory);
+
+$p['factory'] = $factory;
+
+echo $p['factory'];
+echo $p['factory'];
+echo $p['factory'];
+
+}
+
+echo microtime(true)  - $time;
diff --git a/advancedcontentfilter/vendor/pimple/pimple/ext/pimple/tests/bench_shared.phpb b/advancedcontentfilter/vendor/pimple/pimple/ext/pimple/tests/bench_shared.phpb
new file mode 100644 (file)
index 0000000..aec541f
--- /dev/null
@@ -0,0 +1,25 @@
+<?php
+
+if (!class_exists('Pimple\Container')) {
+    require_once __DIR__ . '/../../../src/Pimple/Container.php';
+} else {
+    echo "pimple-c extension detected, using...\n\n";
+}
+
+$time = microtime(true);
+
+
+$service = function ($arg) { return "I'm a service"; };
+
+for ($i=0; $i<10000; $i++) {
+
+$p = new Pimple\Container;
+$p['my_service'] = $service;
+
+$a = $p['my_service'];
+$b = $p['my_service'];
+
+}
+
+echo microtime(true) - $time;
+?>
diff --git a/advancedcontentfilter/vendor/pimple/pimple/phpunit.xml.dist b/advancedcontentfilter/vendor/pimple/pimple/phpunit.xml.dist
new file mode 100644 (file)
index 0000000..5c8d487
--- /dev/null
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:noNamespaceSchemaLocation="http://schema.phpunit.de/4.1/phpunit.xsd"
+         backupGlobals="false"
+         colors="true"
+         bootstrap="vendor/autoload.php"
+>
+    <testsuites>
+        <testsuite name="Pimple Test Suite">
+            <directory>./src/Pimple/Tests</directory>
+        </testsuite>
+    </testsuites>
+</phpunit>
diff --git a/advancedcontentfilter/vendor/pimple/pimple/src/Pimple/Container.php b/advancedcontentfilter/vendor/pimple/pimple/src/Pimple/Container.php
new file mode 100644 (file)
index 0000000..707b92b
--- /dev/null
@@ -0,0 +1,298 @@
+<?php
+
+/*
+ * This file is part of Pimple.
+ *
+ * Copyright (c) 2009 Fabien Potencier
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is furnished
+ * to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+namespace Pimple;
+
+use Pimple\Exception\ExpectedInvokableException;
+use Pimple\Exception\FrozenServiceException;
+use Pimple\Exception\InvalidServiceIdentifierException;
+use Pimple\Exception\UnknownIdentifierException;
+
+/**
+ * Container main class.
+ *
+ * @author Fabien Potencier
+ */
+class Container implements \ArrayAccess
+{
+    private $values = array();
+    private $factories;
+    private $protected;
+    private $frozen = array();
+    private $raw = array();
+    private $keys = array();
+
+    /**
+     * Instantiates the container.
+     *
+     * Objects and parameters can be passed as argument to the constructor.
+     *
+     * @param array $values The parameters or objects
+     */
+    public function __construct(array $values = array())
+    {
+        $this->factories = new \SplObjectStorage();
+        $this->protected = new \SplObjectStorage();
+
+        foreach ($values as $key => $value) {
+            $this->offsetSet($key, $value);
+        }
+    }
+
+    /**
+     * Sets a parameter or an object.
+     *
+     * Objects must be defined as Closures.
+     *
+     * Allowing any PHP callable leads to difficult to debug problems
+     * as function names (strings) are callable (creating a function with
+     * the same name as an existing parameter would break your container).
+     *
+     * @param string $id    The unique identifier for the parameter or object
+     * @param mixed  $value The value of the parameter or a closure to define an object
+     *
+     * @throws FrozenServiceException Prevent override of a frozen service
+     */
+    public function offsetSet($id, $value)
+    {
+        if (isset($this->frozen[$id])) {
+            throw new FrozenServiceException($id);
+        }
+
+        $this->values[$id] = $value;
+        $this->keys[$id] = true;
+    }
+
+    /**
+     * Gets a parameter or an object.
+     *
+     * @param string $id The unique identifier for the parameter or object
+     *
+     * @return mixed The value of the parameter or an object
+     *
+     * @throws UnknownIdentifierException If the identifier is not defined
+     */
+    public function offsetGet($id)
+    {
+        if (!isset($this->keys[$id])) {
+            throw new UnknownIdentifierException($id);
+        }
+
+        if (
+            isset($this->raw[$id])
+            || !\is_object($this->values[$id])
+            || isset($this->protected[$this->values[$id]])
+            || !\method_exists($this->values[$id], '__invoke')
+        ) {
+            return $this->values[$id];
+        }
+
+        if (isset($this->factories[$this->values[$id]])) {
+            return $this->values[$id]($this);
+        }
+
+        $raw = $this->values[$id];
+        $val = $this->values[$id] = $raw($this);
+        $this->raw[$id] = $raw;
+
+        $this->frozen[$id] = true;
+
+        return $val;
+    }
+
+    /**
+     * Checks if a parameter or an object is set.
+     *
+     * @param string $id The unique identifier for the parameter or object
+     *
+     * @return bool
+     */
+    public function offsetExists($id)
+    {
+        return isset($this->keys[$id]);
+    }
+
+    /**
+     * Unsets a parameter or an object.
+     *
+     * @param string $id The unique identifier for the parameter or object
+     */
+    public function offsetUnset($id)
+    {
+        if (isset($this->keys[$id])) {
+            if (\is_object($this->values[$id])) {
+                unset($this->factories[$this->values[$id]], $this->protected[$this->values[$id]]);
+            }
+
+            unset($this->values[$id], $this->frozen[$id], $this->raw[$id], $this->keys[$id]);
+        }
+    }
+
+    /**
+     * Marks a callable as being a factory service.
+     *
+     * @param callable $callable A service definition to be used as a factory
+     *
+     * @return callable The passed callable
+     *
+     * @throws ExpectedInvokableException Service definition has to be a closure or an invokable object
+     */
+    public function factory($callable)
+    {
+        if (!\method_exists($callable, '__invoke')) {
+            throw new ExpectedInvokableException('Service definition is not a Closure or invokable object.');
+        }
+
+        $this->factories->attach($callable);
+
+        return $callable;
+    }
+
+    /**
+     * Protects a callable from being interpreted as a service.
+     *
+     * This is useful when you want to store a callable as a parameter.
+     *
+     * @param callable $callable A callable to protect from being evaluated
+     *
+     * @return callable The passed callable
+     *
+     * @throws ExpectedInvokableException Service definition has to be a closure or an invokable object
+     */
+    public function protect($callable)
+    {
+        if (!\method_exists($callable, '__invoke')) {
+            throw new ExpectedInvokableException('Callable is not a Closure or invokable object.');
+        }
+
+        $this->protected->attach($callable);
+
+        return $callable;
+    }
+
+    /**
+     * Gets a parameter or the closure defining an object.
+     *
+     * @param string $id The unique identifier for the parameter or object
+     *
+     * @return mixed The value of the parameter or the closure defining an object
+     *
+     * @throws UnknownIdentifierException If the identifier is not defined
+     */
+    public function raw($id)
+    {
+        if (!isset($this->keys[$id])) {
+            throw new UnknownIdentifierException($id);
+        }
+
+        if (isset($this->raw[$id])) {
+            return $this->raw[$id];
+        }
+
+        return $this->values[$id];
+    }
+
+    /**
+     * Extends an object definition.
+     *
+     * Useful when you want to extend an existing object definition,
+     * without necessarily loading that object.
+     *
+     * @param string   $id       The unique identifier for the object
+     * @param callable $callable A service definition to extend the original
+     *
+     * @return callable The wrapped callable
+     *
+     * @throws UnknownIdentifierException        If the identifier is not defined
+     * @throws FrozenServiceException            If the service is frozen
+     * @throws InvalidServiceIdentifierException If the identifier belongs to a parameter
+     * @throws ExpectedInvokableException        If the extension callable is not a closure or an invokable object
+     */
+    public function extend($id, $callable)
+    {
+        if (!isset($this->keys[$id])) {
+            throw new UnknownIdentifierException($id);
+        }
+
+        if (isset($this->frozen[$id])) {
+            throw new FrozenServiceException($id);
+        }
+
+        if (!\is_object($this->values[$id]) || !\method_exists($this->values[$id], '__invoke')) {
+            throw new InvalidServiceIdentifierException($id);
+        }
+
+        if (isset($this->protected[$this->values[$id]])) {
+            @\trigger_error(\sprintf('How Pimple behaves when extending protected closures will be fixed in Pimple 4. Are you sure "%s" should be protected?', $id), \E_USER_DEPRECATED);
+        }
+
+        if (!\is_object($callable) || !\method_exists($callable, '__invoke')) {
+            throw new ExpectedInvokableException('Extension service definition is not a Closure or invokable object.');
+        }
+
+        $factory = $this->values[$id];
+
+        $extended = function ($c) use ($callable, $factory) {
+            return $callable($factory($c), $c);
+        };
+
+        if (isset($this->factories[$factory])) {
+            $this->factories->detach($factory);
+            $this->factories->attach($extended);
+        }
+
+        return $this[$id] = $extended;
+    }
+
+    /**
+     * Returns all defined value names.
+     *
+     * @return array An array of value names
+     */
+    public function keys()
+    {
+        return \array_keys($this->values);
+    }
+
+    /**
+     * Registers a service provider.
+     *
+     * @param ServiceProviderInterface $provider A ServiceProviderInterface instance
+     * @param array                    $values   An array of values that customizes the provider
+     *
+     * @return static
+     */
+    public function register(ServiceProviderInterface $provider, array $values = array())
+    {
+        $provider->register($this);
+
+        foreach ($values as $key => $value) {
+            $this[$key] = $value;
+        }
+
+        return $this;
+    }
+}
diff --git a/advancedcontentfilter/vendor/pimple/pimple/src/Pimple/Exception/ExpectedInvokableException.php b/advancedcontentfilter/vendor/pimple/pimple/src/Pimple/Exception/ExpectedInvokableException.php
new file mode 100644 (file)
index 0000000..7228421
--- /dev/null
@@ -0,0 +1,38 @@
+<?php
+
+/*
+ * This file is part of Pimple.
+ *
+ * Copyright (c) 2009 Fabien Potencier
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is furnished
+ * to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+namespace Pimple\Exception;
+
+use Psr\Container\ContainerExceptionInterface;
+
+/**
+ * A closure or invokable object was expected.
+ *
+ * @author Pascal Luna <skalpa@zetareticuli.org>
+ */
+class ExpectedInvokableException extends \InvalidArgumentException implements ContainerExceptionInterface
+{
+}
diff --git a/advancedcontentfilter/vendor/pimple/pimple/src/Pimple/Exception/FrozenServiceException.php b/advancedcontentfilter/vendor/pimple/pimple/src/Pimple/Exception/FrozenServiceException.php
new file mode 100644 (file)
index 0000000..e4d2f6d
--- /dev/null
@@ -0,0 +1,45 @@
+<?php
+
+/*
+ * This file is part of Pimple.
+ *
+ * Copyright (c) 2009 Fabien Potencier
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is furnished
+ * to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+namespace Pimple\Exception;
+
+use Psr\Container\ContainerExceptionInterface;
+
+/**
+ * An attempt to modify a frozen service was made.
+ *
+ * @author Pascal Luna <skalpa@zetareticuli.org>
+ */
+class FrozenServiceException extends \RuntimeException implements ContainerExceptionInterface
+{
+    /**
+     * @param string $id Identifier of the frozen service
+     */
+    public function __construct($id)
+    {
+        parent::__construct(\sprintf('Cannot override frozen service "%s".', $id));
+    }
+}
diff --git a/advancedcontentfilter/vendor/pimple/pimple/src/Pimple/Exception/InvalidServiceIdentifierException.php b/advancedcontentfilter/vendor/pimple/pimple/src/Pimple/Exception/InvalidServiceIdentifierException.php
new file mode 100644 (file)
index 0000000..91e82f9
--- /dev/null
@@ -0,0 +1,45 @@
+<?php
+
+/*
+ * This file is part of Pimple.
+ *
+ * Copyright (c) 2009 Fabien Potencier
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is furnished
+ * to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+namespace Pimple\Exception;
+
+use Psr\Container\NotFoundExceptionInterface;
+
+/**
+ * An attempt to perform an operation that requires a service identifier was made.
+ *
+ * @author Pascal Luna <skalpa@zetareticuli.org>
+ */
+class InvalidServiceIdentifierException extends \InvalidArgumentException implements NotFoundExceptionInterface
+{
+    /**
+     * @param string $id The invalid identifier
+     */
+    public function __construct($id)
+    {
+        parent::__construct(\sprintf('Identifier "%s" does not contain an object definition.', $id));
+    }
+}
diff --git a/advancedcontentfilter/vendor/pimple/pimple/src/Pimple/Exception/UnknownIdentifierException.php b/advancedcontentfilter/vendor/pimple/pimple/src/Pimple/Exception/UnknownIdentifierException.php
new file mode 100644 (file)
index 0000000..fb6b626
--- /dev/null
@@ -0,0 +1,45 @@
+<?php
+
+/*
+ * This file is part of Pimple.
+ *
+ * Copyright (c) 2009 Fabien Potencier
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is furnished
+ * to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+namespace Pimple\Exception;
+
+use Psr\Container\NotFoundExceptionInterface;
+
+/**
+ * The identifier of a valid service or parameter was expected.
+ *
+ * @author Pascal Luna <skalpa@zetareticuli.org>
+ */
+class UnknownIdentifierException extends \InvalidArgumentException implements NotFoundExceptionInterface
+{
+    /**
+     * @param string $id The unknown identifier
+     */
+    public function __construct($id)
+    {
+        parent::__construct(\sprintf('Identifier "%s" is not defined.', $id));
+    }
+}
diff --git a/advancedcontentfilter/vendor/pimple/pimple/src/Pimple/Psr11/Container.php b/advancedcontentfilter/vendor/pimple/pimple/src/Pimple/Psr11/Container.php
new file mode 100644 (file)
index 0000000..cadbfff
--- /dev/null
@@ -0,0 +1,55 @@
+<?php
+
+/*
+ * This file is part of Pimple.
+ *
+ * Copyright (c) 2009-2017 Fabien Potencier
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is furnished
+ * to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+namespace Pimple\Psr11;
+
+use Pimple\Container as PimpleContainer;
+use Psr\Container\ContainerInterface;
+
+/**
+ * PSR-11 compliant wrapper.
+ *
+ * @author Pascal Luna <skalpa@zetareticuli.org>
+ */
+final class Container implements ContainerInterface
+{
+    private $pimple;
+
+    public function __construct(PimpleContainer $pimple)
+    {
+        $this->pimple = $pimple;
+    }
+
+    public function get($id)
+    {
+        return $this->pimple[$id];
+    }
+
+    public function has($id)
+    {
+        return isset($this->pimple[$id]);
+    }
+}
diff --git a/advancedcontentfilter/vendor/pimple/pimple/src/Pimple/Psr11/ServiceLocator.php b/advancedcontentfilter/vendor/pimple/pimple/src/Pimple/Psr11/ServiceLocator.php
new file mode 100644 (file)
index 0000000..3361c6f
--- /dev/null
@@ -0,0 +1,75 @@
+<?php
+
+/*
+ * This file is part of Pimple.
+ *
+ * Copyright (c) 2009 Fabien Potencier
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is furnished
+ * to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+namespace Pimple\Psr11;
+
+use Pimple\Container as PimpleContainer;
+use Pimple\Exception\UnknownIdentifierException;
+use Psr\Container\ContainerInterface;
+
+/**
+ * Pimple PSR-11 service locator.
+ *
+ * @author Pascal Luna <skalpa@zetareticuli.org>
+ */
+class ServiceLocator implements ContainerInterface
+{
+    private $container;
+    private $aliases = array();
+
+    /**
+     * @param PimpleContainer $container The Container instance used to locate services
+     * @param array           $ids       Array of service ids that can be located. String keys can be used to define aliases
+     */
+    public function __construct(PimpleContainer $container, array $ids)
+    {
+        $this->container = $container;
+
+        foreach ($ids as $key => $id) {
+            $this->aliases[\is_int($key) ? $id : $key] = $id;
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function get($id)
+    {
+        if (!isset($this->aliases[$id])) {
+            throw new UnknownIdentifierException($id);
+        }
+
+        return $this->container[$this->aliases[$id]];
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function has($id)
+    {
+        return isset($this->aliases[$id]) && isset($this->container[$this->aliases[$id]]);
+    }
+}
diff --git a/advancedcontentfilter/vendor/pimple/pimple/src/Pimple/ServiceIterator.php b/advancedcontentfilter/vendor/pimple/pimple/src/Pimple/ServiceIterator.php
new file mode 100644 (file)
index 0000000..5cde518
--- /dev/null
@@ -0,0 +1,69 @@
+<?php
+
+/*
+ * This file is part of Pimple.
+ *
+ * Copyright (c) 2009 Fabien Potencier
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is furnished
+ * to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+namespace Pimple;
+
+/**
+ * Lazy service iterator.
+ *
+ * @author Pascal Luna <skalpa@zetareticuli.org>
+ */
+final class ServiceIterator implements \Iterator
+{
+    private $container;
+    private $ids;
+
+    public function __construct(Container $container, array $ids)
+    {
+        $this->container = $container;
+        $this->ids = $ids;
+    }
+
+    public function rewind()
+    {
+        \reset($this->ids);
+    }
+
+    public function current()
+    {
+        return $this->container[\current($this->ids)];
+    }
+
+    public function key()
+    {
+        return \current($this->ids);
+    }
+
+    public function next()
+    {
+        \next($this->ids);
+    }
+
+    public function valid()
+    {
+        return null !== \key($this->ids);
+    }
+}
diff --git a/advancedcontentfilter/vendor/pimple/pimple/src/Pimple/ServiceProviderInterface.php b/advancedcontentfilter/vendor/pimple/pimple/src/Pimple/ServiceProviderInterface.php
new file mode 100644 (file)
index 0000000..c004594
--- /dev/null
@@ -0,0 +1,46 @@
+<?php
+
+/*
+ * This file is part of Pimple.
+ *
+ * Copyright (c) 2009 Fabien Potencier
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is furnished
+ * to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+namespace Pimple;
+
+/**
+ * Pimple service provider interface.
+ *
+ * @author  Fabien Potencier
+ * @author  Dominik Zogg
+ */
+interface ServiceProviderInterface
+{
+    /**
+     * Registers services on the given container.
+     *
+     * This method should only be used to configure services and parameters.
+     * It should not get services.
+     *
+     * @param Container $pimple A container instance
+     */
+    public function register(Container $pimple);
+}
diff --git a/advancedcontentfilter/vendor/pimple/pimple/src/Pimple/Tests/Fixtures/Invokable.php b/advancedcontentfilter/vendor/pimple/pimple/src/Pimple/Tests/Fixtures/Invokable.php
new file mode 100644 (file)
index 0000000..aba453b
--- /dev/null
@@ -0,0 +1,38 @@
+<?php
+
+/*
+ * This file is part of Pimple.
+ *
+ * Copyright (c) 2009 Fabien Potencier
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is furnished
+ * to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+namespace Pimple\Tests\Fixtures;
+
+class Invokable
+{
+    public function __invoke($value = null)
+    {
+        $service = new Service();
+        $service->value = $value;
+
+        return $service;
+    }
+}
diff --git a/advancedcontentfilter/vendor/pimple/pimple/src/Pimple/Tests/Fixtures/NonInvokable.php b/advancedcontentfilter/vendor/pimple/pimple/src/Pimple/Tests/Fixtures/NonInvokable.php
new file mode 100644 (file)
index 0000000..33cd4e5
--- /dev/null
@@ -0,0 +1,34 @@
+<?php
+
+/*
+ * This file is part of Pimple.
+ *
+ * Copyright (c) 2009 Fabien Potencier
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is furnished
+ * to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+namespace Pimple\Tests\Fixtures;
+
+class NonInvokable
+{
+    public function __call($a, $b)
+    {
+    }
+}
diff --git a/advancedcontentfilter/vendor/pimple/pimple/src/Pimple/Tests/Fixtures/PimpleServiceProvider.php b/advancedcontentfilter/vendor/pimple/pimple/src/Pimple/Tests/Fixtures/PimpleServiceProvider.php
new file mode 100644 (file)
index 0000000..0c910af
--- /dev/null
@@ -0,0 +1,54 @@
+<?php
+
+/*
+ * This file is part of Pimple.
+ *
+ * Copyright (c) 2009 Fabien Potencier
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is furnished
+ * to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+namespace Pimple\Tests\Fixtures;
+
+use Pimple\Container;
+use Pimple\ServiceProviderInterface;
+
+class PimpleServiceProvider implements ServiceProviderInterface
+{
+    /**
+     * Registers services on the given container.
+     *
+     * This method should only be used to configure services and parameters.
+     * It should not get services.
+     *
+     * @param Container $pimple An Container instance
+     */
+    public function register(Container $pimple)
+    {
+        $pimple['param'] = 'value';
+
+        $pimple['service'] = function () {
+            return new Service();
+        };
+
+        $pimple['factory'] = $pimple->factory(function () {
+            return new Service();
+        });
+    }
+}
diff --git a/advancedcontentfilter/vendor/pimple/pimple/src/Pimple/Tests/Fixtures/Service.php b/advancedcontentfilter/vendor/pimple/pimple/src/Pimple/Tests/Fixtures/Service.php
new file mode 100644 (file)
index 0000000..d71b184
--- /dev/null
@@ -0,0 +1,35 @@
+<?php
+
+/*
+ * This file is part of Pimple.
+ *
+ * Copyright (c) 2009 Fabien Potencier
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is furnished
+ * to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+namespace Pimple\Tests\Fixtures;
+
+/**
+ * @author  Igor Wiedler <igor@wiedler.ch>
+ */
+class Service
+{
+    public $value;
+}
diff --git a/advancedcontentfilter/vendor/pimple/pimple/src/Pimple/Tests/PimpleServiceProviderInterfaceTest.php b/advancedcontentfilter/vendor/pimple/pimple/src/Pimple/Tests/PimpleServiceProviderInterfaceTest.php
new file mode 100644 (file)
index 0000000..8e5c4c7
--- /dev/null
@@ -0,0 +1,76 @@
+<?php
+
+/*
+ * This file is part of Pimple.
+ *
+ * Copyright (c) 2009 Fabien Potencier
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is furnished
+ * to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+namespace Pimple\Tests;
+
+use Pimple\Container;
+
+/**
+ * @author  Dominik Zogg <dominik.zogg@gmail.com>
+ */
+class PimpleServiceProviderInterfaceTest extends \PHPUnit_Framework_TestCase
+{
+    public function testProvider()
+    {
+        $pimple = new Container();
+
+        $pimpleServiceProvider = new Fixtures\PimpleServiceProvider();
+        $pimpleServiceProvider->register($pimple);
+
+        $this->assertEquals('value', $pimple['param']);
+        $this->assertInstanceOf('Pimple\Tests\Fixtures\Service', $pimple['service']);
+
+        $serviceOne = $pimple['factory'];
+        $this->assertInstanceOf('Pimple\Tests\Fixtures\Service', $serviceOne);
+
+        $serviceTwo = $pimple['factory'];
+        $this->assertInstanceOf('Pimple\Tests\Fixtures\Service', $serviceTwo);
+
+        $this->assertNotSame($serviceOne, $serviceTwo);
+    }
+
+    public function testProviderWithRegisterMethod()
+    {
+        $pimple = new Container();
+
+        $pimple->register(new Fixtures\PimpleServiceProvider(), array(
+            'anotherParameter' => 'anotherValue',
+        ));
+
+        $this->assertEquals('value', $pimple['param']);
+        $this->assertEquals('anotherValue', $pimple['anotherParameter']);
+
+        $this->assertInstanceOf('Pimple\Tests\Fixtures\Service', $pimple['service']);
+
+        $serviceOne = $pimple['factory'];
+        $this->assertInstanceOf('Pimple\Tests\Fixtures\Service', $serviceOne);
+
+        $serviceTwo = $pimple['factory'];
+        $this->assertInstanceOf('Pimple\Tests\Fixtures\Service', $serviceTwo);
+
+        $this->assertNotSame($serviceOne, $serviceTwo);
+    }
+}
diff --git a/advancedcontentfilter/vendor/pimple/pimple/src/Pimple/Tests/PimpleTest.php b/advancedcontentfilter/vendor/pimple/pimple/src/Pimple/Tests/PimpleTest.php
new file mode 100644 (file)
index 0000000..acb66e0
--- /dev/null
@@ -0,0 +1,589 @@
+<?php
+
+/*
+ * This file is part of Pimple.
+ *
+ * Copyright (c) 2009 Fabien Potencier
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is furnished
+ * to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+namespace Pimple\Tests;
+
+use Pimple\Container;
+
+/**
+ * @author Igor Wiedler <igor@wiedler.ch>
+ */
+class PimpleTest extends \PHPUnit_Framework_TestCase
+{
+    public function testWithString()
+    {
+        $pimple = new Container();
+        $pimple['param'] = 'value';
+
+        $this->assertEquals('value', $pimple['param']);
+    }
+
+    public function testWithClosure()
+    {
+        $pimple = new Container();
+        $pimple['service'] = function () {
+            return new Fixtures\Service();
+        };
+
+        $this->assertInstanceOf('Pimple\Tests\Fixtures\Service', $pimple['service']);
+    }
+
+    public function testServicesShouldBeDifferent()
+    {
+        $pimple = new Container();
+        $pimple['service'] = $pimple->factory(function () {
+            return new Fixtures\Service();
+        });
+
+        $serviceOne = $pimple['service'];
+        $this->assertInstanceOf('Pimple\Tests\Fixtures\Service', $serviceOne);
+
+        $serviceTwo = $pimple['service'];
+        $this->assertInstanceOf('Pimple\Tests\Fixtures\Service', $serviceTwo);
+
+        $this->assertNotSame($serviceOne, $serviceTwo);
+    }
+
+    public function testShouldPassContainerAsParameter()
+    {
+        $pimple = new Container();
+        $pimple['service'] = function () {
+            return new Fixtures\Service();
+        };
+        $pimple['container'] = function ($container) {
+            return $container;
+        };
+
+        $this->assertNotSame($pimple, $pimple['service']);
+        $this->assertSame($pimple, $pimple['container']);
+    }
+
+    public function testIsset()
+    {
+        $pimple = new Container();
+        $pimple['param'] = 'value';
+        $pimple['service'] = function () {
+            return new Fixtures\Service();
+        };
+
+        $pimple['null'] = null;
+
+        $this->assertTrue(isset($pimple['param']));
+        $this->assertTrue(isset($pimple['service']));
+        $this->assertTrue(isset($pimple['null']));
+        $this->assertFalse(isset($pimple['non_existent']));
+    }
+
+    public function testConstructorInjection()
+    {
+        $params = array('param' => 'value');
+        $pimple = new Container($params);
+
+        $this->assertSame($params['param'], $pimple['param']);
+    }
+
+    /**
+     * @expectedException \Pimple\Exception\UnknownIdentifierException
+     * @expectedExceptionMessage Identifier "foo" is not defined.
+     */
+    public function testOffsetGetValidatesKeyIsPresent()
+    {
+        $pimple = new Container();
+        echo $pimple['foo'];
+    }
+
+    /**
+     * @group legacy
+     * @expectedException \InvalidArgumentException
+     * @expectedExceptionMessage Identifier "foo" is not defined.
+     */
+    public function testLegacyOffsetGetValidatesKeyIsPresent()
+    {
+        $pimple = new Container();
+        echo $pimple['foo'];
+    }
+
+    public function testOffsetGetHonorsNullValues()
+    {
+        $pimple = new Container();
+        $pimple['foo'] = null;
+        $this->assertNull($pimple['foo']);
+    }
+
+    public function testUnset()
+    {
+        $pimple = new Container();
+        $pimple['param'] = 'value';
+        $pimple['service'] = function () {
+            return new Fixtures\Service();
+        };
+
+        unset($pimple['param'], $pimple['service']);
+        $this->assertFalse(isset($pimple['param']));
+        $this->assertFalse(isset($pimple['service']));
+    }
+
+    /**
+     * @dataProvider serviceDefinitionProvider
+     */
+    public function testShare($service)
+    {
+        $pimple = new Container();
+        $pimple['shared_service'] = $service;
+
+        $serviceOne = $pimple['shared_service'];
+        $this->assertInstanceOf('Pimple\Tests\Fixtures\Service', $serviceOne);
+
+        $serviceTwo = $pimple['shared_service'];
+        $this->assertInstanceOf('Pimple\Tests\Fixtures\Service', $serviceTwo);
+
+        $this->assertSame($serviceOne, $serviceTwo);
+    }
+
+    /**
+     * @dataProvider serviceDefinitionProvider
+     */
+    public function testProtect($service)
+    {
+        $pimple = new Container();
+        $pimple['protected'] = $pimple->protect($service);
+
+        $this->assertSame($service, $pimple['protected']);
+    }
+
+    public function testGlobalFunctionNameAsParameterValue()
+    {
+        $pimple = new Container();
+        $pimple['global_function'] = 'strlen';
+        $this->assertSame('strlen', $pimple['global_function']);
+    }
+
+    public function testRaw()
+    {
+        $pimple = new Container();
+        $pimple['service'] = $definition = $pimple->factory(function () { return 'foo'; });
+        $this->assertSame($definition, $pimple->raw('service'));
+    }
+
+    public function testRawHonorsNullValues()
+    {
+        $pimple = new Container();
+        $pimple['foo'] = null;
+        $this->assertNull($pimple->raw('foo'));
+    }
+
+    public function testFluentRegister()
+    {
+        $pimple = new Container();
+        $this->assertSame($pimple, $pimple->register($this->getMockBuilder('Pimple\ServiceProviderInterface')->getMock()));
+    }
+
+    /**
+     * @expectedException \Pimple\Exception\UnknownIdentifierException
+     * @expectedExceptionMessage Identifier "foo" is not defined.
+     */
+    public function testRawValidatesKeyIsPresent()
+    {
+        $pimple = new Container();
+        $pimple->raw('foo');
+    }
+
+    /**
+     * @group legacy
+     * @expectedException \InvalidArgumentException
+     * @expectedExceptionMessage Identifier "foo" is not defined.
+     */
+    public function testLegacyRawValidatesKeyIsPresent()
+    {
+        $pimple = new Container();
+        $pimple->raw('foo');
+    }
+
+    /**
+     * @dataProvider serviceDefinitionProvider
+     */
+    public function testExtend($service)
+    {
+        $pimple = new Container();
+        $pimple['shared_service'] = function () {
+            return new Fixtures\Service();
+        };
+        $pimple['factory_service'] = $pimple->factory(function () {
+            return new Fixtures\Service();
+        });
+
+        $pimple->extend('shared_service', $service);
+        $serviceOne = $pimple['shared_service'];
+        $this->assertInstanceOf('Pimple\Tests\Fixtures\Service', $serviceOne);
+        $serviceTwo = $pimple['shared_service'];
+        $this->assertInstanceOf('Pimple\Tests\Fixtures\Service', $serviceTwo);
+        $this->assertSame($serviceOne, $serviceTwo);
+        $this->assertSame($serviceOne->value, $serviceTwo->value);
+
+        $pimple->extend('factory_service', $service);
+        $serviceOne = $pimple['factory_service'];
+        $this->assertInstanceOf('Pimple\Tests\Fixtures\Service', $serviceOne);
+        $serviceTwo = $pimple['factory_service'];
+        $this->assertInstanceOf('Pimple\Tests\Fixtures\Service', $serviceTwo);
+        $this->assertNotSame($serviceOne, $serviceTwo);
+        $this->assertNotSame($serviceOne->value, $serviceTwo->value);
+    }
+
+    public function testExtendDoesNotLeakWithFactories()
+    {
+        if (extension_loaded('pimple')) {
+            $this->markTestSkipped('Pimple extension does not support this test');
+        }
+        $pimple = new Container();
+
+        $pimple['foo'] = $pimple->factory(function () { return; });
+        $pimple['foo'] = $pimple->extend('foo', function ($foo, $pimple) { return; });
+        unset($pimple['foo']);
+
+        $p = new \ReflectionProperty($pimple, 'values');
+        $p->setAccessible(true);
+        $this->assertEmpty($p->getValue($pimple));
+
+        $p = new \ReflectionProperty($pimple, 'factories');
+        $p->setAccessible(true);
+        $this->assertCount(0, $p->getValue($pimple));
+    }
+
+    /**
+     * @expectedException \Pimple\Exception\UnknownIdentifierException
+     * @expectedExceptionMessage Identifier "foo" is not defined.
+     */
+    public function testExtendValidatesKeyIsPresent()
+    {
+        $pimple = new Container();
+        $pimple->extend('foo', function () {});
+    }
+
+    /**
+     * @group legacy
+     * @expectedException \InvalidArgumentException
+     * @expectedExceptionMessage Identifier "foo" is not defined.
+     */
+    public function testLegacyExtendValidatesKeyIsPresent()
+    {
+        $pimple = new Container();
+        $pimple->extend('foo', function () {});
+    }
+
+    public function testKeys()
+    {
+        $pimple = new Container();
+        $pimple['foo'] = 123;
+        $pimple['bar'] = 123;
+
+        $this->assertEquals(array('foo', 'bar'), $pimple->keys());
+    }
+
+    /** @test */
+    public function settingAnInvokableObjectShouldTreatItAsFactory()
+    {
+        $pimple = new Container();
+        $pimple['invokable'] = new Fixtures\Invokable();
+
+        $this->assertInstanceOf('Pimple\Tests\Fixtures\Service', $pimple['invokable']);
+    }
+
+    /** @test */
+    public function settingNonInvokableObjectShouldTreatItAsParameter()
+    {
+        $pimple = new Container();
+        $pimple['non_invokable'] = new Fixtures\NonInvokable();
+
+        $this->assertInstanceOf('Pimple\Tests\Fixtures\NonInvokable', $pimple['non_invokable']);
+    }
+
+    /**
+     * @dataProvider badServiceDefinitionProvider
+     * @expectedException \Pimple\Exception\ExpectedInvokableException
+     * @expectedExceptionMessage Service definition is not a Closure or invokable object.
+     */
+    public function testFactoryFailsForInvalidServiceDefinitions($service)
+    {
+        $pimple = new Container();
+        $pimple->factory($service);
+    }
+
+    /**
+     * @group legacy
+     * @dataProvider badServiceDefinitionProvider
+     * @expectedException \InvalidArgumentException
+     * @expectedExceptionMessage Service definition is not a Closure or invokable object.
+     */
+    public function testLegacyFactoryFailsForInvalidServiceDefinitions($service)
+    {
+        $pimple = new Container();
+        $pimple->factory($service);
+    }
+
+    /**
+     * @dataProvider badServiceDefinitionProvider
+     * @expectedException \Pimple\Exception\ExpectedInvokableException
+     * @expectedExceptionMessage Callable is not a Closure or invokable object.
+     */
+    public function testProtectFailsForInvalidServiceDefinitions($service)
+    {
+        $pimple = new Container();
+        $pimple->protect($service);
+    }
+
+    /**
+     * @group legacy
+     * @dataProvider badServiceDefinitionProvider
+     * @expectedException \InvalidArgumentException
+     * @expectedExceptionMessage Callable is not a Closure or invokable object.
+     */
+    public function testLegacyProtectFailsForInvalidServiceDefinitions($service)
+    {
+        $pimple = new Container();
+        $pimple->protect($service);
+    }
+
+    /**
+     * @dataProvider badServiceDefinitionProvider
+     * @expectedException \Pimple\Exception\InvalidServiceIdentifierException
+     * @expectedExceptionMessage Identifier "foo" does not contain an object definition.
+     */
+    public function testExtendFailsForKeysNotContainingServiceDefinitions($service)
+    {
+        $pimple = new Container();
+        $pimple['foo'] = $service;
+        $pimple->extend('foo', function () {});
+    }
+
+    /**
+     * @group legacy
+     * @dataProvider badServiceDefinitionProvider
+     * @expectedException \InvalidArgumentException
+     * @expectedExceptionMessage Identifier "foo" does not contain an object definition.
+     */
+    public function testLegacyExtendFailsForKeysNotContainingServiceDefinitions($service)
+    {
+        $pimple = new Container();
+        $pimple['foo'] = $service;
+        $pimple->extend('foo', function () {});
+    }
+
+    /**
+     * @group legacy
+     * @expectedDeprecation How Pimple behaves when extending protected closures will be fixed in Pimple 4. Are you sure "foo" should be protected?
+     */
+    public function testExtendingProtectedClosureDeprecation()
+    {
+        $pimple = new Container();
+        $pimple['foo'] = $pimple->protect(function () {
+            return 'bar';
+        });
+
+        $pimple->extend('foo', function ($value) {
+            return $value.'-baz';
+        });
+
+        $this->assertSame('bar-baz', $pimple['foo']);
+    }
+
+    /**
+     * @dataProvider badServiceDefinitionProvider
+     * @expectedException \Pimple\Exception\ExpectedInvokableException
+     * @expectedExceptionMessage Extension service definition is not a Closure or invokable object.
+     */
+    public function testExtendFailsForInvalidServiceDefinitions($service)
+    {
+        $pimple = new Container();
+        $pimple['foo'] = function () {};
+        $pimple->extend('foo', $service);
+    }
+
+    /**
+     * @group legacy
+     * @dataProvider badServiceDefinitionProvider
+     * @expectedException \InvalidArgumentException
+     * @expectedExceptionMessage Extension service definition is not a Closure or invokable object.
+     */
+    public function testLegacyExtendFailsForInvalidServiceDefinitions($service)
+    {
+        $pimple = new Container();
+        $pimple['foo'] = function () {};
+        $pimple->extend('foo', $service);
+    }
+
+    /**
+     * @expectedException \Pimple\Exception\FrozenServiceException
+     * @expectedExceptionMessage Cannot override frozen service "foo".
+     */
+    public function testExtendFailsIfFrozenServiceIsNonInvokable()
+    {
+        $pimple = new Container();
+        $pimple['foo'] = function () {
+            return new Fixtures\NonInvokable();
+        };
+        $foo = $pimple['foo'];
+
+        $pimple->extend('foo', function () {});
+    }
+
+    /**
+     * @expectedException \Pimple\Exception\FrozenServiceException
+     * @expectedExceptionMessage Cannot override frozen service "foo".
+     */
+    public function testExtendFailsIfFrozenServiceIsInvokable()
+    {
+        $pimple = new Container();
+        $pimple['foo'] = function () {
+            return new Fixtures\Invokable();
+        };
+        $foo = $pimple['foo'];
+
+        $pimple->extend('foo', function () {});
+    }
+
+    /**
+     * Provider for invalid service definitions.
+     */
+    public function badServiceDefinitionProvider()
+    {
+        return array(
+          array(123),
+          array(new Fixtures\NonInvokable()),
+        );
+    }
+
+    /**
+     * Provider for service definitions.
+     */
+    public function serviceDefinitionProvider()
+    {
+        return array(
+            array(function ($value) {
+                $service = new Fixtures\Service();
+                $service->value = $value;
+
+                return $service;
+            }),
+            array(new Fixtures\Invokable()),
+        );
+    }
+
+    public function testDefiningNewServiceAfterFreeze()
+    {
+        $pimple = new Container();
+        $pimple['foo'] = function () {
+            return 'foo';
+        };
+        $foo = $pimple['foo'];
+
+        $pimple['bar'] = function () {
+            return 'bar';
+        };
+        $this->assertSame('bar', $pimple['bar']);
+    }
+
+    /**
+     * @expectedException \Pimple\Exception\FrozenServiceException
+     * @expectedExceptionMessage Cannot override frozen service "foo".
+     */
+    public function testOverridingServiceAfterFreeze()
+    {
+        $pimple = new Container();
+        $pimple['foo'] = function () {
+            return 'foo';
+        };
+        $foo = $pimple['foo'];
+
+        $pimple['foo'] = function () {
+            return 'bar';
+        };
+    }
+
+    /**
+     * @group legacy
+     * @expectedException \RuntimeException
+     * @expectedExceptionMessage Cannot override frozen service "foo".
+     */
+    public function testLegacyOverridingServiceAfterFreeze()
+    {
+        $pimple = new Container();
+        $pimple['foo'] = function () {
+            return 'foo';
+        };
+        $foo = $pimple['foo'];
+
+        $pimple['foo'] = function () {
+            return 'bar';
+        };
+    }
+
+    public function testRemovingServiceAfterFreeze()
+    {
+        $pimple = new Container();
+        $pimple['foo'] = function () {
+            return 'foo';
+        };
+        $foo = $pimple['foo'];
+
+        unset($pimple['foo']);
+        $pimple['foo'] = function () {
+            return 'bar';
+        };
+        $this->assertSame('bar', $pimple['foo']);
+    }
+
+    public function testExtendingService()
+    {
+        $pimple = new Container();
+        $pimple['foo'] = function () {
+            return 'foo';
+        };
+        $pimple['foo'] = $pimple->extend('foo', function ($foo, $app) {
+            return "$foo.bar";
+        });
+        $pimple['foo'] = $pimple->extend('foo', function ($foo, $app) {
+            return "$foo.baz";
+        });
+        $this->assertSame('foo.bar.baz', $pimple['foo']);
+    }
+
+    public function testExtendingServiceAfterOtherServiceFreeze()
+    {
+        $pimple = new Container();
+        $pimple['foo'] = function () {
+            return 'foo';
+        };
+        $pimple['bar'] = function () {
+            return 'bar';
+        };
+        $foo = $pimple['foo'];
+
+        $pimple['bar'] = $pimple->extend('bar', function ($bar, $app) {
+            return "$bar.baz";
+        });
+        $this->assertSame('bar.baz', $pimple['bar']);
+    }
+}
diff --git a/advancedcontentfilter/vendor/pimple/pimple/src/Pimple/Tests/Psr11/ContainerTest.php b/advancedcontentfilter/vendor/pimple/pimple/src/Pimple/Tests/Psr11/ContainerTest.php
new file mode 100644 (file)
index 0000000..7ca2d7f
--- /dev/null
@@ -0,0 +1,77 @@
+<?php
+
+/*
+ * This file is part of Pimple.
+ *
+ * Copyright (c) 2009-2017 Fabien Potencier
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is furnished
+ * to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+namespace Pimple\Tests\Psr11;
+
+use PHPUnit\Framework\TestCase;
+use Pimple\Container;
+use Pimple\Psr11\Container as PsrContainer;
+use Pimple\Tests\Fixtures\Service;
+
+class ContainerTest extends TestCase
+{
+    public function testGetReturnsExistingService()
+    {
+        $pimple = new Container();
+        $pimple['service'] = function () {
+            return new Service();
+        };
+        $psr = new PsrContainer($pimple);
+
+        $this->assertSame($pimple['service'], $psr->get('service'));
+    }
+
+    /**
+     * @expectedException \Psr\Container\NotFoundExceptionInterface
+     * @expectedExceptionMessage Identifier "service" is not defined.
+     */
+    public function testGetThrowsExceptionIfServiceIsNotFound()
+    {
+        $pimple = new Container();
+        $psr = new PsrContainer($pimple);
+
+        $psr->get('service');
+    }
+
+    public function testHasReturnsTrueIfServiceExists()
+    {
+        $pimple = new Container();
+        $pimple['service'] = function () {
+            return new Service();
+        };
+        $psr = new PsrContainer($pimple);
+
+        $this->assertTrue($psr->has('service'));
+    }
+
+    public function testHasReturnsFalseIfServiceDoesNotExist()
+    {
+        $pimple = new Container();
+        $psr = new PsrContainer($pimple);
+
+        $this->assertFalse($psr->has('service'));
+    }
+}
diff --git a/advancedcontentfilter/vendor/pimple/pimple/src/Pimple/Tests/Psr11/ServiceLocatorTest.php b/advancedcontentfilter/vendor/pimple/pimple/src/Pimple/Tests/Psr11/ServiceLocatorTest.php
new file mode 100644 (file)
index 0000000..c9a0812
--- /dev/null
@@ -0,0 +1,134 @@
+<?php
+
+/*
+ * This file is part of Pimple.
+ *
+ * Copyright (c) 2009 Fabien Potencier
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is furnished
+ * to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+namespace Pimple\Tests\Psr11;
+
+use PHPUnit\Framework\TestCase;
+use Pimple\Container;
+use Pimple\Psr11\ServiceLocator;
+use Pimple\Tests\Fixtures;
+
+/**
+ * ServiceLocator test case.
+ *
+ * @author Pascal Luna <skalpa@zetareticuli.org>
+ */
+class ServiceLocatorTest extends TestCase
+{
+    public function testCanAccessServices()
+    {
+        $pimple = new Container();
+        $pimple['service'] = function () {
+            return new Fixtures\Service();
+        };
+        $locator = new ServiceLocator($pimple, array('service'));
+
+        $this->assertSame($pimple['service'], $locator->get('service'));
+    }
+
+    public function testCanAccessAliasedServices()
+    {
+        $pimple = new Container();
+        $pimple['service'] = function () {
+            return new Fixtures\Service();
+        };
+        $locator = new ServiceLocator($pimple, array('alias' => 'service'));
+
+        $this->assertSame($pimple['service'], $locator->get('alias'));
+    }
+
+    /**
+     * @expectedException \Pimple\Exception\UnknownIdentifierException
+     * @expectedExceptionMessage Identifier "service" is not defined.
+     */
+    public function testCannotAccessAliasedServiceUsingRealIdentifier()
+    {
+        $pimple = new Container();
+        $pimple['service'] = function () {
+            return new Fixtures\Service();
+        };
+        $locator = new ServiceLocator($pimple, array('alias' => 'service'));
+
+        $service = $locator->get('service');
+    }
+
+    /**
+     * @expectedException \Pimple\Exception\UnknownIdentifierException
+     * @expectedExceptionMessage Identifier "foo" is not defined.
+     */
+    public function testGetValidatesServiceCanBeLocated()
+    {
+        $pimple = new Container();
+        $pimple['service'] = function () {
+            return new Fixtures\Service();
+        };
+        $locator = new ServiceLocator($pimple, array('alias' => 'service'));
+
+        $service = $locator->get('foo');
+    }
+
+    /**
+     * @expectedException \Pimple\Exception\UnknownIdentifierException
+     * @expectedExceptionMessage Identifier "invalid" is not defined.
+     */
+    public function testGetValidatesTargetServiceExists()
+    {
+        $pimple = new Container();
+        $pimple['service'] = function () {
+            return new Fixtures\Service();
+        };
+        $locator = new ServiceLocator($pimple, array('alias' => 'invalid'));
+
+        $service = $locator->get('alias');
+    }
+
+    public function testHasValidatesServiceCanBeLocated()
+    {
+        $pimple = new Container();
+        $pimple['service1'] = function () {
+            return new Fixtures\Service();
+        };
+        $pimple['service2'] = function () {
+            return new Fixtures\Service();
+        };
+        $locator = new ServiceLocator($pimple, array('service1'));
+
+        $this->assertTrue($locator->has('service1'));
+        $this->assertFalse($locator->has('service2'));
+    }
+
+    public function testHasChecksIfTargetServiceExists()
+    {
+        $pimple = new Container();
+        $pimple['service'] = function () {
+            return new Fixtures\Service();
+        };
+        $locator = new ServiceLocator($pimple, array('foo' => 'service', 'bar' => 'invalid'));
+
+        $this->assertTrue($locator->has('foo'));
+        $this->assertFalse($locator->has('bar'));
+    }
+}
diff --git a/advancedcontentfilter/vendor/pimple/pimple/src/Pimple/Tests/ServiceIteratorTest.php b/advancedcontentfilter/vendor/pimple/pimple/src/Pimple/Tests/ServiceIteratorTest.php
new file mode 100644 (file)
index 0000000..5dd52f0
--- /dev/null
@@ -0,0 +1,52 @@
+<?php
+
+/*
+ * This file is part of Pimple.
+ *
+ * Copyright (c) 2009 Fabien Potencier
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is furnished
+ * to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+namespace Pimple\Tests;
+
+use PHPUnit\Framework\TestCase;
+use Pimple\Container;
+use Pimple\ServiceIterator;
+use Pimple\Tests\Fixtures\Service;
+
+class ServiceIteratorTest extends TestCase
+{
+    public function testIsIterable()
+    {
+        $pimple = new Container();
+        $pimple['service1'] = function () {
+            return new Service();
+        };
+        $pimple['service2'] = function () {
+            return new Service();
+        };
+        $pimple['service3'] = function () {
+            return new Service();
+        };
+        $iterator = new ServiceIterator($pimple, array('service1', 'service2'));
+
+        $this->assertSame(array('service1' => $pimple['service1'], 'service2' => $pimple['service2']), iterator_to_array($iterator));
+    }
+}
diff --git a/advancedcontentfilter/vendor/psr/cache/CHANGELOG.md b/advancedcontentfilter/vendor/psr/cache/CHANGELOG.md
new file mode 100644 (file)
index 0000000..58ddab0
--- /dev/null
@@ -0,0 +1,16 @@
+# Changelog
+
+All notable changes to this project will be documented in this file, in reverse chronological order by release.
+
+## 1.0.1 - 2016-08-06
+
+### Fixed
+
+- Make spacing consistent in phpdoc annotations php-fig/cache#9 - chalasr
+- Fix grammar in phpdoc annotations php-fig/cache#10 - chalasr
+- Be more specific in docblocks that `getItems()` and `deleteItems()` take an array of strings (`string[]`) compared to just `array` php-fig/cache#8 - GrahamCampbell
+- For `expiresAt()` and `expiresAfter()` in CacheItemInterface fix docblock to specify null as a valid parameters as well as an implementation of DateTimeInterface php-fig/cache#7 - GrahamCampbell
+
+## 1.0.0 - 2015-12-11
+
+Initial stable release; reflects accepted PSR-6 specification
diff --git a/advancedcontentfilter/vendor/psr/cache/LICENSE.txt b/advancedcontentfilter/vendor/psr/cache/LICENSE.txt
new file mode 100644 (file)
index 0000000..b1c2c97
--- /dev/null
@@ -0,0 +1,19 @@
+Copyright (c) 2015 PHP Framework Interoperability Group
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/advancedcontentfilter/vendor/psr/cache/README.md b/advancedcontentfilter/vendor/psr/cache/README.md
new file mode 100644 (file)
index 0000000..c8706ce
--- /dev/null
@@ -0,0 +1,9 @@
+PSR Cache
+=========
+
+This repository holds all interfaces defined by
+[PSR-6](http://www.php-fig.org/psr/psr-6/).
+
+Note that this is not a Cache implementation of its own. It is merely an
+interface that describes a Cache implementation. See the specification for more 
+details.
diff --git a/advancedcontentfilter/vendor/psr/cache/composer.json b/advancedcontentfilter/vendor/psr/cache/composer.json
new file mode 100644 (file)
index 0000000..e828fec
--- /dev/null
@@ -0,0 +1,25 @@
+{
+    "name": "psr/cache",
+    "description": "Common interface for caching libraries",
+    "keywords": ["psr", "psr-6", "cache"],
+    "license": "MIT",
+    "authors": [
+        {
+            "name": "PHP-FIG",
+            "homepage": "http://www.php-fig.org/"
+        }
+    ],
+    "require": {
+        "php": ">=5.3.0"
+    },
+    "autoload": {
+        "psr-4": {
+            "Psr\\Cache\\": "src/"
+        }
+    },
+    "extra": {
+        "branch-alias": {
+            "dev-master": "1.0.x-dev"
+        }
+    }
+}
diff --git a/advancedcontentfilter/vendor/psr/cache/src/CacheException.php b/advancedcontentfilter/vendor/psr/cache/src/CacheException.php
new file mode 100644 (file)
index 0000000..e27f22f
--- /dev/null
@@ -0,0 +1,10 @@
+<?php
+
+namespace Psr\Cache;
+
+/**
+ * Exception interface for all exceptions thrown by an Implementing Library.
+ */
+interface CacheException
+{
+}
diff --git a/advancedcontentfilter/vendor/psr/cache/src/CacheItemInterface.php b/advancedcontentfilter/vendor/psr/cache/src/CacheItemInterface.php
new file mode 100644 (file)
index 0000000..63d05dd
--- /dev/null
@@ -0,0 +1,105 @@
+<?php
+
+namespace Psr\Cache;
+
+/**
+ * CacheItemInterface defines an interface for interacting with objects inside a cache.
+ *
+ * Each Item object MUST be associated with a specific key, which can be set
+ * according to the implementing system and is typically passed by the
+ * Cache\CacheItemPoolInterface object.
+ *
+ * The Cache\CacheItemInterface object encapsulates the storage and retrieval of
+ * cache items. Each Cache\CacheItemInterface is generated by a
+ * Cache\CacheItemPoolInterface object, which is responsible for any required
+ * setup as well as associating the object with a unique Key.
+ * Cache\CacheItemInterface objects MUST be able to store and retrieve any type
+ * of PHP value defined in the Data section of the specification.
+ *
+ * Calling Libraries MUST NOT instantiate Item objects themselves. They may only
+ * be requested from a Pool object via the getItem() method.  Calling Libraries
+ * SHOULD NOT assume that an Item created by one Implementing Library is
+ * compatible with a Pool from another Implementing Library.
+ */
+interface CacheItemInterface
+{
+    /**
+     * Returns the key for the current cache item.
+     *
+     * The key is loaded by the Implementing Library, but should be available to
+     * the higher level callers when needed.
+     *
+     * @return string
+     *   The key string for this cache item.
+     */
+    public function getKey();
+
+    /**
+     * Retrieves the value of the item from the cache associated with this object's key.
+     *
+     * The value returned must be identical to the value originally stored by set().
+     *
+     * If isHit() returns false, this method MUST return null. Note that null
+     * is a legitimate cached value, so the isHit() method SHOULD be used to
+     * differentiate between "null value was found" and "no value was found."
+     *
+     * @return mixed
+     *   The value corresponding to this cache item's key, or null if not found.
+     */
+    public function get();
+
+    /**
+     * Confirms if the cache item lookup resulted in a cache hit.
+     *
+     * Note: This method MUST NOT have a race condition between calling isHit()
+     * and calling get().
+     *
+     * @return bool
+     *   True if the request resulted in a cache hit. False otherwise.
+     */
+    public function isHit();
+
+    /**
+     * Sets the value represented by this cache item.
+     *
+     * The $value argument may be any item that can be serialized by PHP,
+     * although the method of serialization is left up to the Implementing
+     * Library.
+     *
+     * @param mixed $value
+     *   The serializable value to be stored.
+     *
+     * @return static
+     *   The invoked object.
+     */
+    public function set($value);
+
+    /**
+     * Sets the expiration time for this cache item.
+     *
+     * @param \DateTimeInterface|null $expiration
+     *   The point in time after which the item MUST be considered expired.
+     *   If null is passed explicitly, a default value MAY be used. If none is set,
+     *   the value should be stored permanently or for as long as the
+     *   implementation allows.
+     *
+     * @return static
+     *   The called object.
+     */
+    public function expiresAt($expiration);
+
+    /**
+     * Sets the expiration time for this cache item.
+     *
+     * @param int|\DateInterval|null $time
+     *   The period of time from the present after which the item MUST be considered
+     *   expired. An integer parameter is understood to be the time in seconds until
+     *   expiration. If null is passed explicitly, a default value MAY be used.
+     *   If none is set, the value should be stored permanently or for as long as the
+     *   implementation allows.
+     *
+     * @return static
+     *   The called object.
+     */
+    public function expiresAfter($time);
+}
diff --git a/advancedcontentfilter/vendor/psr/cache/src/CacheItemPoolInterface.php b/advancedcontentfilter/vendor/psr/cache/src/CacheItemPoolInterface.php
new file mode 100644 (file)
index 0000000..0351419
--- /dev/null
@@ -0,0 +1,138 @@
+<?php
+
+namespace Psr\Cache;
+
+/**
+ * CacheItemPoolInterface generates CacheItemInterface objects.
+ *
+ * The primary purpose of Cache\CacheItemPoolInterface is to accept a key from
+ * the Calling Library and return the associated Cache\CacheItemInterface object.
+ * It is also the primary point of interaction with the entire cache collection.
+ * All configuration and initialization of the Pool is left up to an
+ * Implementing Library.
+ */
+interface CacheItemPoolInterface
+{
+    /**
+     * Returns a Cache Item representing the specified key.
+     *
+     * This method must always return a CacheItemInterface object, even in case of
+     * a cache miss. It MUST NOT return null.
+     *
+     * @param string $key
+     *   The key for which to return the corresponding Cache Item.
+     *
+     * @throws InvalidArgumentException
+     *   If the $key string is not a legal value a \Psr\Cache\InvalidArgumentException
+     *   MUST be thrown.
+     *
+     * @return CacheItemInterface
+     *   The corresponding Cache Item.
+     */
+    public function getItem($key);
+
+    /**
+     * Returns a traversable set of cache items.
+     *
+     * @param string[] $keys
+     *   An indexed array of keys of items to retrieve.
+     *
+     * @throws InvalidArgumentException
+     *   If any of the keys in $keys are not a legal value a \Psr\Cache\InvalidArgumentException
+     *   MUST be thrown.
+     *
+     * @return array|\Traversable
+     *   A traversable collection of Cache Items keyed by the cache keys of
+     *   each item. A Cache item will be returned for each key, even if that
+     *   key is not found. However, if no keys are specified then an empty
+     *   traversable MUST be returned instead.
+     */
+    public function getItems(array $keys = array());
+
+    /**
+     * Confirms if the cache contains specified cache item.
+     *
+     * Note: This method MAY avoid retrieving the cached value for performance reasons.
+     * This could result in a race condition with CacheItemInterface::get(). To avoid
+     * such situation use CacheItemInterface::isHit() instead.
+     *
+     * @param string $key
+     *   The key for which to check existence.
+     *
+     * @throws InvalidArgumentException
+     *   If the $key string is not a legal value a \Psr\Cache\InvalidArgumentException
+     *   MUST be thrown.
+     *
+     * @return bool
+     *   True if item exists in the cache, false otherwise.
+     */
+    public function hasItem($key);
+
+    /**
+     * Deletes all items in the pool.
+     *
+     * @return bool
+     *   True if the pool was successfully cleared. False if there was an error.
+     */
+    public function clear();
+
+    /**
+     * Removes the item from the pool.
+     *
+     * @param string $key
+     *   The key to delete.
+     *
+     * @throws InvalidArgumentException
+     *   If the $key string is not a legal value a \Psr\Cache\InvalidArgumentException
+     *   MUST be thrown.
+     *
+     * @return bool
+     *   True if the item was successfully removed. False if there was an error.
+     */
+    public function deleteItem($key);
+
+    /**
+     * Removes multiple items from the pool.
+     *
+     * @param string[] $keys
+     *   An array of keys that should be removed from the pool.
+
+     * @throws InvalidArgumentException
+     *   If any of the keys in $keys are not a legal value a \Psr\Cache\InvalidArgumentException
+     *   MUST be thrown.
+     *
+     * @return bool
+     *   True if the items were successfully removed. False if there was an error.
+     */
+    public function deleteItems(array $keys);
+
+    /**
+     * Persists a cache item immediately.
+     *
+     * @param CacheItemInterface $item
+     *   The cache item to save.
+     *
+     * @return bool
+     *   True if the item was successfully persisted. False if there was an error.
+     */
+    public function save(CacheItemInterface $item);
+
+    /**
+     * Sets a cache item to be persisted later.
+     *
+     * @param CacheItemInterface $item
+     *   The cache item to save.
+     *
+     * @return bool
+     *   False if the item could not be queued or if a commit was attempted and failed. True otherwise.
+     */
+    public function saveDeferred(CacheItemInterface $item);
+
+    /**
+     * Persists any deferred cache items.
+     *
+     * @return bool
+     *   True if all not-yet-saved items were successfully saved or there were none. False otherwise.
+     */
+    public function commit();
+}
diff --git a/advancedcontentfilter/vendor/psr/cache/src/InvalidArgumentException.php b/advancedcontentfilter/vendor/psr/cache/src/InvalidArgumentException.php
new file mode 100644 (file)
index 0000000..be7c6fa
--- /dev/null
@@ -0,0 +1,13 @@
+<?php
+
+namespace Psr\Cache;
+
+/**
+ * Exception interface for invalid cache arguments.
+ *
+ * Any time an invalid argument is passed into a method it must throw an
+ * exception class which implements Psr\Cache\InvalidArgumentException.
+ */
+interface InvalidArgumentException extends CacheException
+{
+}
diff --git a/advancedcontentfilter/vendor/psr/container/.gitignore b/advancedcontentfilter/vendor/psr/container/.gitignore
new file mode 100644 (file)
index 0000000..b2395aa
--- /dev/null
@@ -0,0 +1,3 @@
+composer.lock
+composer.phar
+/vendor/
diff --git a/advancedcontentfilter/vendor/psr/container/LICENSE b/advancedcontentfilter/vendor/psr/container/LICENSE
new file mode 100644 (file)
index 0000000..2877a48
--- /dev/null
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2013-2016 container-interop
+Copyright (c) 2016 PHP Framework Interoperability Group
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/advancedcontentfilter/vendor/psr/container/README.md b/advancedcontentfilter/vendor/psr/container/README.md
new file mode 100644 (file)
index 0000000..084f6df
--- /dev/null
@@ -0,0 +1,5 @@
+# PSR Container
+
+This repository holds all interfaces/classes/traits related to [PSR-11](https://github.com/container-interop/fig-standards/blob/master/proposed/container.md).
+
+Note that this is not a container implementation of its own. See the specification for more details.
diff --git a/advancedcontentfilter/vendor/psr/container/composer.json b/advancedcontentfilter/vendor/psr/container/composer.json
new file mode 100644 (file)
index 0000000..b8ee012
--- /dev/null
@@ -0,0 +1,27 @@
+{
+    "name": "psr/container",
+    "type": "library",
+    "description": "Common Container Interface (PHP FIG PSR-11)",
+    "keywords": ["psr", "psr-11", "container", "container-interop", "container-interface"],
+    "homepage": "https://github.com/php-fig/container",
+    "license": "MIT",
+    "authors": [
+        {
+            "name": "PHP-FIG",
+            "homepage": "http://www.php-fig.org/"
+        }
+    ],
+    "require": {
+        "php": ">=5.3.0"
+    },
+    "autoload": {
+        "psr-4": {
+            "Psr\\Container\\": "src/"
+        }
+    },
+    "extra": {
+        "branch-alias": {
+            "dev-master": "1.0.x-dev"
+        }
+    }
+}
diff --git a/advancedcontentfilter/vendor/psr/container/src/ContainerExceptionInterface.php b/advancedcontentfilter/vendor/psr/container/src/ContainerExceptionInterface.php
new file mode 100644 (file)
index 0000000..d35c6b4
--- /dev/null
@@ -0,0 +1,13 @@
+<?php
+/**
+ * @license http://www.opensource.org/licenses/mit-license.php MIT (see the LICENSE file)
+ */
+
+namespace Psr\Container;
+
+/**
+ * Base interface representing a generic exception in a container.
+ */
+interface ContainerExceptionInterface
+{
+}
diff --git a/advancedcontentfilter/vendor/psr/container/src/ContainerInterface.php b/advancedcontentfilter/vendor/psr/container/src/ContainerInterface.php
new file mode 100644 (file)
index 0000000..c3a7206
--- /dev/null
@@ -0,0 +1,37 @@
+<?php
+/**
+ * @license http://www.opensource.org/licenses/mit-license.php MIT (see the LICENSE file)
+ */
+
+namespace Psr\Container;
+
+/**
+ * Describes the interface of a container that exposes methods to read its entries.
+ */
+interface ContainerInterface
+{
+    /**
+     * Finds an entry of the container by its identifier and returns it.
+     *
+     * @param string $id Identifier of the entry to look for.
+     *
+     * @throws NotFoundExceptionInterface  No entry was found for **this** identifier.
+     * @throws ContainerExceptionInterface Error while retrieving the entry.
+     *
+     * @return mixed Entry.
+     */
+    public function get($id);
+
+    /**
+     * Returns true if the container can return an entry for the given identifier.
+     * Returns false otherwise.
+     *
+     * `has($id)` returning true does not mean that `get($id)` will not throw an exception.
+     * It does however mean that `get($id)` will not throw a `NotFoundExceptionInterface`.
+     *
+     * @param string $id Identifier of the entry to look for.
+     *
+     * @return bool
+     */
+    public function has($id);
+}
diff --git a/advancedcontentfilter/vendor/psr/container/src/NotFoundExceptionInterface.php b/advancedcontentfilter/vendor/psr/container/src/NotFoundExceptionInterface.php
new file mode 100644 (file)
index 0000000..6566704
--- /dev/null
@@ -0,0 +1,13 @@
+<?php
+/**
+ * @license http://www.opensource.org/licenses/mit-license.php MIT (see the LICENSE file)
+ */
+
+namespace Psr\Container;
+
+/**
+ * No entry was found in the container.
+ */
+interface NotFoundExceptionInterface extends ContainerExceptionInterface
+{
+}
diff --git a/advancedcontentfilter/vendor/psr/http-message/CHANGELOG.md b/advancedcontentfilter/vendor/psr/http-message/CHANGELOG.md
new file mode 100644 (file)
index 0000000..74b1ef9
--- /dev/null
@@ -0,0 +1,36 @@
+# Changelog
+
+All notable changes to this project will be documented in this file, in reverse chronological order by release.
+
+## 1.0.1 - 2016-08-06
+
+### Added
+
+- Nothing.
+
+### Deprecated
+
+- Nothing.
+
+### Removed
+
+- Nothing.
+
+### Fixed
+
+- Updated all `@return self` annotation references in interfaces to use
+  `@return static`, which more closelly follows the semantics of the
+  specification.
+- Updated the `MessageInterface::getHeaders()` return annotation to use the
+  value `string[][]`, indicating the format is a nested array of strings.
+- Updated the `@link` annotation for `RequestInterface::withRequestTarget()`
+  to point to the correct section of RFC 7230.
+- Updated the `ServerRequestInterface::withUploadedFiles()` parameter annotation
+  to add the parameter name (`$uploadedFiles`).
+- Updated a `@throws` annotation for the `UploadedFileInterface::moveTo()`
+  method to correctly reference the method parameter (it was referencing an
+  incorrect parameter name previously).
+
+## 1.0.0 - 2016-05-18
+
+Initial stable release; reflects accepted PSR-7 specification.
diff --git a/advancedcontentfilter/vendor/psr/http-message/LICENSE b/advancedcontentfilter/vendor/psr/http-message/LICENSE
new file mode 100644 (file)
index 0000000..c2d8e45
--- /dev/null
@@ -0,0 +1,19 @@
+Copyright (c) 2014 PHP Framework Interoperability Group
+
+Permission is hereby granted, free of charge, to any person obtaining a copy 
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights 
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 
+copies of the Software, and to permit persons to whom the Software is 
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in 
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/advancedcontentfilter/vendor/psr/http-message/README.md b/advancedcontentfilter/vendor/psr/http-message/README.md
new file mode 100644 (file)
index 0000000..2818533
--- /dev/null
@@ -0,0 +1,13 @@
+PSR Http Message
+================
+
+This repository holds all interfaces/classes/traits related to
+[PSR-7](http://www.php-fig.org/psr/psr-7/).
+
+Note that this is not a HTTP message implementation of its own. It is merely an
+interface that describes a HTTP message. See the specification for more details.
+
+Usage
+-----
+
+We'll certainly need some stuff in here.
\ No newline at end of file
diff --git a/advancedcontentfilter/vendor/psr/http-message/composer.json b/advancedcontentfilter/vendor/psr/http-message/composer.json
new file mode 100644 (file)
index 0000000..b0d2937
--- /dev/null
@@ -0,0 +1,26 @@
+{
+    "name": "psr/http-message",
+    "description": "Common interface for HTTP messages",
+    "keywords": ["psr", "psr-7", "http", "http-message", "request", "response"],
+    "homepage": "https://github.com/php-fig/http-message",
+    "license": "MIT",
+    "authors": [
+        {
+            "name": "PHP-FIG",
+            "homepage": "http://www.php-fig.org/"
+        }
+    ],
+    "require": {
+        "php": ">=5.3.0"
+    },
+    "autoload": {
+        "psr-4": {
+            "Psr\\Http\\Message\\": "src/"
+        }
+    },
+    "extra": {
+        "branch-alias": {
+            "dev-master": "1.0.x-dev"
+        }
+    }
+}
diff --git a/advancedcontentfilter/vendor/psr/http-message/src/MessageInterface.php b/advancedcontentfilter/vendor/psr/http-message/src/MessageInterface.php
new file mode 100644 (file)
index 0000000..dd46e5e
--- /dev/null
@@ -0,0 +1,187 @@
+<?php
+
+namespace Psr\Http\Message;
+
+/**
+ * HTTP messages consist of requests from a client to a server and responses
+ * from a server to a client. This interface defines the methods common to
+ * each.
+ *
+ * Messages are considered immutable; all methods that might change state MUST
+ * be implemented such that they retain the internal state of the current
+ * message and return an instance that contains the changed state.
+ *
+ * @link http://www.ietf.org/rfc/rfc7230.txt
+ * @link http://www.ietf.org/rfc/rfc7231.txt
+ */
+interface MessageInterface
+{
+    /**
+     * Retrieves the HTTP protocol version as a string.
+     *
+     * The string MUST contain only the HTTP version number (e.g., "1.1", "1.0").
+     *
+     * @return string HTTP protocol version.
+     */
+    public function getProtocolVersion();
+
+    /**
+     * Return an instance with the specified HTTP protocol version.
+     *
+     * The version string MUST contain only the HTTP version number (e.g.,
+     * "1.1", "1.0").
+     *
+     * This method MUST be implemented in such a way as to retain the
+     * immutability of the message, and MUST return an instance that has the
+     * new protocol version.
+     *
+     * @param string $version HTTP protocol version
+     * @return static
+     */
+    public function withProtocolVersion($version);
+
+    /**
+     * Retrieves all message header values.
+     *
+     * The keys represent the header name as it will be sent over the wire, and
+     * each value is an array of strings associated with the header.
+     *
+     *     // Represent the headers as a string
+     *     foreach ($message->getHeaders() as $name => $values) {
+     *         echo $name . ": " . implode(", ", $values);
+     *     }
+     *
+     *     // Emit headers iteratively:
+     *     foreach ($message->getHeaders() as $name => $values) {
+     *         foreach ($values as $value) {
+     *             header(sprintf('%s: %s', $name, $value), false);
+     *         }
+     *     }
+     *
+     * While header names are not case-sensitive, getHeaders() will preserve the
+     * exact case in which headers were originally specified.
+     *
+     * @return string[][] Returns an associative array of the message's headers. Each
+     *     key MUST be a header name, and each value MUST be an array of strings
+     *     for that header.
+     */
+    public function getHeaders();
+
+    /**
+     * Checks if a header exists by the given case-insensitive name.
+     *
+     * @param string $name Case-insensitive header field name.
+     * @return bool Returns true if any header names match the given header
+     *     name using a case-insensitive string comparison. Returns false if
+     *     no matching header name is found in the message.
+     */
+    public function hasHeader($name);
+
+    /**
+     * Retrieves a message header value by the given case-insensitive name.
+     *
+     * This method returns an array of all the header values of the given
+     * case-insensitive header name.
+     *
+     * If the header does not appear in the message, this method MUST return an
+     * empty array.
+     *
+     * @param string $name Case-insensitive header field name.
+     * @return string[] An array of string values as provided for the given
+     *    header. If the header does not appear in the message, this method MUST
+     *    return an empty array.
+     */
+    public function getHeader($name);
+
+    /**
+     * Retrieves a comma-separated string of the values for a single header.
+     *
+     * This method returns all of the header values of the given
+     * case-insensitive header name as a string concatenated together using
+     * a comma.
+     *
+     * NOTE: Not all header values may be appropriately represented using
+     * comma concatenation. For such headers, use getHeader() instead
+     * and supply your own delimiter when concatenating.
+     *
+     * If the header does not appear in the message, this method MUST return
+     * an empty string.
+     *
+     * @param string $name Case-insensitive header field name.
+     * @return string A string of values as provided for the given header
+     *    concatenated together using a comma. If the header does not appear in
+     *    the message, this method MUST return an empty string.
+     */
+    public function getHeaderLine($name);
+
+    /**
+     * Return an instance with the provided value replacing the specified header.
+     *
+     * While header names are case-insensitive, the casing of the header will
+     * be preserved by this function, and returned from getHeaders().
+     *
+     * This method MUST be implemented in such a way as to retain the
+     * immutability of the message, and MUST return an instance that has the
+     * new and/or updated header and value.
+     *
+     * @param string $name Case-insensitive header field name.
+     * @param string|string[] $value Header value(s).
+     * @return static
+     * @throws \InvalidArgumentException for invalid header names or values.
+     */
+    public function withHeader($name, $value);
+
+    /**
+     * Return an instance with the specified header appended with the given value.
+     *
+     * Existing values for the specified header will be maintained. The new
+     * value(s) will be appended to the existing list. If the header did not
+     * exist previously, it will be added.
+     *
+     * This method MUST be implemented in such a way as to retain the
+     * immutability of the message, and MUST return an instance that has the
+     * new header and/or value.
+     *
+     * @param string $name Case-insensitive header field name to add.
+     * @param string|string[] $value Header value(s).
+     * @return static
+     * @throws \InvalidArgumentException for invalid header names or values.
+     */
+    public function withAddedHeader($name, $value);
+
+    /**
+     * Return an instance without the specified header.
+     *
+     * Header resolution MUST be done without case-sensitivity.
+     *
+     * This method MUST be implemented in such a way as to retain the
+     * immutability of the message, and MUST return an instance that removes
+     * the named header.
+     *
+     * @param string $name Case-insensitive header field name to remove.
+     * @return static
+     */
+    public function withoutHeader($name);
+
+    /**
+     * Gets the body of the message.
+     *
+     * @return StreamInterface Returns the body as a stream.
+     */
+    public function getBody();
+
+    /**
+     * Return an instance with the specified message body.
+     *
+     * The body MUST be a StreamInterface object.
+     *
+     * This method MUST be implemented in such a way as to retain the
+     * immutability of the message, and MUST return a new instance that has the
+     * new body stream.
+     *
+     * @param StreamInterface $body Body.
+     * @return static
+     * @throws \InvalidArgumentException When the body is not valid.
+     */
+    public function withBody(StreamInterface $body);
+}
diff --git a/advancedcontentfilter/vendor/psr/http-message/src/RequestInterface.php b/advancedcontentfilter/vendor/psr/http-message/src/RequestInterface.php
new file mode 100644 (file)
index 0000000..a96d4fd
--- /dev/null
@@ -0,0 +1,129 @@
+<?php
+
+namespace Psr\Http\Message;
+
+/**
+ * Representation of an outgoing, client-side request.
+ *
+ * Per the HTTP specification, this interface includes properties for
+ * each of the following:
+ *
+ * - Protocol version
+ * - HTTP method
+ * - URI
+ * - Headers
+ * - Message body
+ *
+ * During construction, implementations MUST attempt to set the Host header from
+ * a provided URI if no Host header is provided.
+ *
+ * Requests are considered immutable; all methods that might change state MUST
+ * be implemented such that they retain the internal state of the current
+ * message and return an instance that contains the changed state.
+ */
+interface RequestInterface extends MessageInterface
+{
+    /**
+     * Retrieves the message's request target.
+     *
+     * Retrieves the message's request-target either as it will appear (for
+     * clients), as it appeared at request (for servers), or as it was
+     * specified for the instance (see withRequestTarget()).
+     *
+     * In most cases, this will be the origin-form of the composed URI,
+     * unless a value was provided to the concrete implementation (see
+     * withRequestTarget() below).
+     *
+     * If no URI is available, and no request-target has been specifically
+     * provided, this method MUST return the string "/".
+     *
+     * @return string
+     */
+    public function getRequestTarget();
+
+    /**
+     * Return an instance with the specific request-target.
+     *
+     * If the request needs a non-origin-form request-target — e.g., for
+     * specifying an absolute-form, authority-form, or asterisk-form —
+     * this method may be used to create an instance with the specified
+     * request-target, verbatim.
+     *
+     * This method MUST be implemented in such a way as to retain the
+     * immutability of the message, and MUST return an instance that has the
+     * changed request target.
+     *
+     * @link http://tools.ietf.org/html/rfc7230#section-5.3 (for the various
+     *     request-target forms allowed in request messages)
+     * @param mixed $requestTarget
+     * @return static
+     */
+    public function withRequestTarget($requestTarget);
+
+    /**
+     * Retrieves the HTTP method of the request.
+     *
+     * @return string Returns the request method.
+     */
+    public function getMethod();
+
+    /**
+     * Return an instance with the provided HTTP method.
+     *
+     * While HTTP method names are typically all uppercase characters, HTTP
+     * method names are case-sensitive and thus implementations SHOULD NOT
+     * modify the given string.
+     *
+     * This method MUST be implemented in such a way as to retain the
+     * immutability of the message, and MUST return an instance that has the
+     * changed request method.
+     *
+     * @param string $method Case-sensitive method.
+     * @return static
+     * @throws \InvalidArgumentException for invalid HTTP methods.
+     */
+    public function withMethod($method);
+
+    /**
+     * Retrieves the URI instance.
+     *
+     * This method MUST return a UriInterface instance.
+     *
+     * @link http://tools.ietf.org/html/rfc3986#section-4.3
+     * @return UriInterface Returns a UriInterface instance
+     *     representing the URI of the request.
+     */
+    public function getUri();
+
+    /**
+     * Returns an instance with the provided URI.
+     *
+     * This method MUST update the Host header of the returned request by
+     * default if the URI contains a host component. If the URI does not
+     * contain a host component, any pre-existing Host header MUST be carried
+     * over to the returned request.
+     *
+     * You can opt-in to preserving the original state of the Host header by
+     * setting `$preserveHost` to `true`. When `$preserveHost` is set to
+     * `true`, this method interacts with the Host header in the following ways:
+     *
+     * - If the Host header is missing or empty, and the new URI contains
+     *   a host component, this method MUST update the Host header in the returned
+     *   request.
+     * - If the Host header is missing or empty, and the new URI does not contain a
+     *   host component, this method MUST NOT update the Host header in the returned
+     *   request.
+     * - If a Host header is present and non-empty, this method MUST NOT update
+     *   the Host header in the returned request.
+     *
+     * This method MUST be implemented in such a way as to retain the
+     * immutability of the message, and MUST return an instance that has the
+     * new UriInterface instance.
+     *
+     * @link http://tools.ietf.org/html/rfc3986#section-4.3
+     * @param UriInterface $uri New request URI to use.
+     * @param bool $preserveHost Preserve the original state of the Host header.
+     * @return static
+     */
+    public function withUri(UriInterface $uri, $preserveHost = false);
+}
diff --git a/advancedcontentfilter/vendor/psr/http-message/src/ResponseInterface.php b/advancedcontentfilter/vendor/psr/http-message/src/ResponseInterface.php
new file mode 100644 (file)
index 0000000..c306514
--- /dev/null
@@ -0,0 +1,68 @@
+<?php
+
+namespace Psr\Http\Message;
+
+/**
+ * Representation of an outgoing, server-side response.
+ *
+ * Per the HTTP specification, this interface includes properties for
+ * each of the following:
+ *
+ * - Protocol version
+ * - Status code and reason phrase
+ * - Headers
+ * - Message body
+ *
+ * Responses are considered immutable; all methods that might change state MUST
+ * be implemented such that they retain the internal state of the current
+ * message and return an instance that contains the changed state.
+ */
+interface ResponseInterface extends MessageInterface
+{
+    /**
+     * Gets the response status code.
+     *
+     * The status code is a 3-digit integer result code of the server's attempt
+     * to understand and satisfy the request.
+     *
+     * @return int Status code.
+     */
+    public function getStatusCode();
+
+    /**
+     * Return an instance with the specified status code and, optionally, reason phrase.
+     *
+     * If no reason phrase is specified, implementations MAY choose to default
+     * to the RFC 7231 or IANA recommended reason phrase for the response's
+     * status code.
+     *
+     * This method MUST be implemented in such a way as to retain the
+     * immutability of the message, and MUST return an instance that has the
+     * updated status and reason phrase.
+     *
+     * @link http://tools.ietf.org/html/rfc7231#section-6
+     * @link http://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml
+     * @param int $code The 3-digit integer result code to set.
+     * @param string $reasonPhrase The reason phrase to use with the
+     *     provided status code; if none is provided, implementations MAY
+     *     use the defaults as suggested in the HTTP specification.
+     * @return static
+     * @throws \InvalidArgumentException For invalid status code arguments.
+     */
+    public function withStatus($code, $reasonPhrase = '');
+
+    /**
+     * Gets the response reason phrase associated with the status code.
+     *
+     * Because a reason phrase is not a required element in a response
+     * status line, the reason phrase value MAY be null. Implementations MAY
+     * choose to return the default RFC 7231 recommended reason phrase (or those
+     * listed in the IANA HTTP Status Code Registry) for the response's
+     * status code.
+     *
+     * @link http://tools.ietf.org/html/rfc7231#section-6
+     * @link http://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml
+     * @return string Reason phrase; must return an empty string if none present.
+     */
+    public function getReasonPhrase();
+}
diff --git a/advancedcontentfilter/vendor/psr/http-message/src/ServerRequestInterface.php b/advancedcontentfilter/vendor/psr/http-message/src/ServerRequestInterface.php
new file mode 100644 (file)
index 0000000..0251234
--- /dev/null
@@ -0,0 +1,261 @@
+<?php
+
+namespace Psr\Http\Message;
+
+/**
+ * Representation of an incoming, server-side HTTP request.
+ *
+ * Per the HTTP specification, this interface includes properties for
+ * each of the following:
+ *
+ * - Protocol version
+ * - HTTP method
+ * - URI
+ * - Headers
+ * - Message body
+ *
+ * Additionally, it encapsulates all data as it has arrived to the
+ * application from the CGI and/or PHP environment, including:
+ *
+ * - The values represented in $_SERVER.
+ * - Any cookies provided (generally via $_COOKIE)
+ * - Query string arguments (generally via $_GET, or as parsed via parse_str())
+ * - Upload files, if any (as represented by $_FILES)
+ * - Deserialized body parameters (generally from $_POST)
+ *
+ * $_SERVER values MUST be treated as immutable, as they represent application
+ * state at the time of request; as such, no methods are provided to allow
+ * modification of those values. The other values provide such methods, as they
+ * can be restored from $_SERVER or the request body, and may need treatment
+ * during the application (e.g., body parameters may be deserialized based on
+ * content type).
+ *
+ * Additionally, this interface recognizes the utility of introspecting a
+ * request to derive and match additional parameters (e.g., via URI path
+ * matching, decrypting cookie values, deserializing non-form-encoded body
+ * content, matching authorization headers to users, etc). These parameters
+ * are stored in an "attributes" property.
+ *
+ * Requests are considered immutable; all methods that might change state MUST
+ * be implemented such that they retain the internal state of the current
+ * message and return an instance that contains the changed state.
+ */
+interface ServerRequestInterface extends RequestInterface
+{
+    /**
+     * Retrieve server parameters.
+     *
+     * Retrieves data related to the incoming request environment,
+     * typically derived from PHP's $_SERVER superglobal. The data IS NOT
+     * REQUIRED to originate from $_SERVER.
+     *
+     * @return array
+     */
+    public function getServerParams();
+
+    /**
+     * Retrieve cookies.
+     *
+     * Retrieves cookies sent by the client to the server.
+     *
+     * The data MUST be compatible with the structure of the $_COOKIE
+     * superglobal.
+     *
+     * @return array
+     */
+    public function getCookieParams();
+
+    /**
+     * Return an instance with the specified cookies.
+     *
+     * The data IS NOT REQUIRED to come from the $_COOKIE superglobal, but MUST
+     * be compatible with the structure of $_COOKIE. Typically, this data will
+     * be injected at instantiation.
+     *
+     * This method MUST NOT update the related Cookie header of the request
+     * instance, nor related values in the server params.
+     *
+     * This method MUST be implemented in such a way as to retain the
+     * immutability of the message, and MUST return an instance that has the
+     * updated cookie values.
+     *
+     * @param array $cookies Array of key/value pairs representing cookies.
+     * @return static
+     */
+    public function withCookieParams(array $cookies);
+
+    /**
+     * Retrieve query string arguments.
+     *
+     * Retrieves the deserialized query string arguments, if any.
+     *
+     * Note: the query params might not be in sync with the URI or server
+     * params. If you need to ensure you are only getting the original
+     * values, you may need to parse the query string from `getUri()->getQuery()`
+     * or from the `QUERY_STRING` server param.
+     *
+     * @return array
+     */
+    public function getQueryParams();
+
+    /**
+     * Return an instance with the specified query string arguments.
+     *
+     * These values SHOULD remain immutable over the course of the incoming
+     * request. They MAY be injected during instantiation, such as from PHP's
+     * $_GET superglobal, or MAY be derived from some other value such as the
+     * URI. In cases where the arguments are parsed from the URI, the data
+     * MUST be compatible with what PHP's parse_str() would return for
+     * purposes of how duplicate query parameters are handled, and how nested
+     * sets are handled.
+     *
+     * Setting query string arguments MUST NOT change the URI stored by the
+     * request, nor the values in the server params.
+     *
+     * This method MUST be implemented in such a way as to retain the
+     * immutability of the message, and MUST return an instance that has the
+     * updated query string arguments.
+     *
+     * @param array $query Array of query string arguments, typically from
+     *     $_GET.
+     * @return static
+     */
+    public function withQueryParams(array $query);
+
+    /**
+     * Retrieve normalized file upload data.
+     *
+     * This method returns upload metadata in a normalized tree, with each leaf
+     * an instance of Psr\Http\Message\UploadedFileInterface.
+     *
+     * These values MAY be prepared from $_FILES or the message body during
+     * instantiation, or MAY be injected via withUploadedFiles().
+     *
+     * @return array An array tree of UploadedFileInterface instances; an empty
+     *     array MUST be returned if no data is present.
+     */
+    public function getUploadedFiles();
+
+    /**
+     * Create a new instance with the specified uploaded files.
+     *
+     * This method MUST be implemented in such a way as to retain the
+     * immutability of the message, and MUST return an instance that has the
+     * updated body parameters.
+     *
+     * @param array $uploadedFiles An array tree of UploadedFileInterface instances.
+     * @return static
+     * @throws \InvalidArgumentException if an invalid structure is provided.
+     */
+    public function withUploadedFiles(array $uploadedFiles);
+
+    /**
+     * Retrieve any parameters provided in the request body.
+     *
+     * If the request Content-Type is either application/x-www-form-urlencoded
+     * or multipart/form-data, and the request method is POST, this method MUST
+     * return the contents of $_POST.
+     *
+     * Otherwise, this method may return any results of deserializing
+     * the request body content; as parsing returns structured content, the
+     * potential types MUST be arrays or objects only. A null value indicates
+     * the absence of body content.
+     *
+     * @return null|array|object The deserialized body parameters, if any.
+     *     These will typically be an array or object.
+     */
+    public function getParsedBody();
+
+    /**
+     * Return an instance with the specified body parameters.
+     *
+     * These MAY be injected during instantiation.
+     *
+     * If the request Content-Type is either application/x-www-form-urlencoded
+     * or multipart/form-data, and the request method is POST, use this method
+     * ONLY to inject the contents of $_POST.
+     *
+     * The data IS NOT REQUIRED to come from $_POST, but MUST be the results of
+     * deserializing the request body content. Deserialization/parsing returns
+     * structured data, and, as such, this method ONLY accepts arrays or objects,
+     * or a null value if nothing was available to parse.
+     *
+     * As an example, if content negotiation determines that the request data
+     * is a JSON payload, this method could be used to create a request
+     * instance with the deserialized parameters.
+     *
+     * This method MUST be implemented in such a way as to retain the
+     * immutability of the message, and MUST return an instance that has the
+     * updated body parameters.
+     *
+     * @param null|array|object $data The deserialized body data. This will
+     *     typically be in an array or object.
+     * @return static
+     * @throws \InvalidArgumentException if an unsupported argument type is
+     *     provided.
+     */
+    public function withParsedBody($data);
+
+    /**
+     * Retrieve attributes derived from the request.
+     *
+     * The request "attributes" may be used to allow injection of any
+     * parameters derived from the request: e.g., the results of path
+     * match operations; the results of decrypting cookies; the results of
+     * deserializing non-form-encoded message bodies; etc. Attributes
+     * will be application and request specific, and CAN be mutable.
+     *
+     * @return array Attributes derived from the request.
+     */
+    public function getAttributes();
+
+    /**
+     * Retrieve a single derived request attribute.
+     *
+     * Retrieves a single derived request attribute as described in
+     * getAttributes(). If the attribute has not been previously set, returns
+     * the default value as provided.
+     *
+     * This method obviates the need for a hasAttribute() method, as it allows
+     * specifying a default value to return if the attribute is not found.
+     *
+     * @see getAttributes()
+     * @param string $name The attribute name.
+     * @param mixed $default Default value to return if the attribute does not exist.
+     * @return mixed
+     */
+    public function getAttribute($name, $default = null);
+
+    /**
+     * Return an instance with the specified derived request attribute.
+     *
+     * This method allows setting a single derived request attribute as
+     * described in getAttributes().
+     *
+     * This method MUST be implemented in such a way as to retain the
+     * immutability of the message, and MUST return an instance that has the
+     * updated attribute.
+     *
+     * @see getAttributes()
+     * @param string $name The attribute name.
+     * @param mixed $value The value of the attribute.
+     * @return static
+     */
+    public function withAttribute($name, $value);
+
+    /**
+     * Return an instance that removes the specified derived request attribute.
+     *
+     * This method allows removing a single derived request attribute as
+     * described in getAttributes().
+     *
+     * This method MUST be implemented in such a way as to retain the
+     * immutability of the message, and MUST return an instance that removes
+     * the attribute.
+     *
+     * @see getAttributes()
+     * @param string $name The attribute name.
+     * @return static
+     */
+    public function withoutAttribute($name);
+}
diff --git a/advancedcontentfilter/vendor/psr/http-message/src/StreamInterface.php b/advancedcontentfilter/vendor/psr/http-message/src/StreamInterface.php
new file mode 100644 (file)
index 0000000..f68f391
--- /dev/null
@@ -0,0 +1,158 @@
+<?php
+
+namespace Psr\Http\Message;
+
+/**
+ * Describes a data stream.
+ *
+ * Typically, an instance will wrap a PHP stream; this interface provides
+ * a wrapper around the most common operations, including serialization of
+ * the entire stream to a string.
+ */
+interface StreamInterface
+{
+    /**
+     * Reads all data from the stream into a string, from the beginning to end.
+     *
+     * This method MUST attempt to seek to the beginning of the stream before
+     * reading data and read the stream until the end is reached.
+     *
+     * Warning: This could attempt to load a large amount of data into memory.
+     *
+     * This method MUST NOT raise an exception in order to conform with PHP's
+     * string casting operations.
+     *
+     * @see http://php.net/manual/en/language.oop5.magic.php#object.tostring
+     * @return string
+     */
+    public function __toString();
+
+    /**
+     * Closes the stream and any underlying resources.
+     *
+     * @return void
+     */
+    public function close();
+
+    /**
+     * Separates any underlying resources from the stream.
+     *
+     * After the stream has been detached, the stream is in an unusable state.
+     *
+     * @return resource|null Underlying PHP stream, if any
+     */
+    public function detach();
+
+    /**
+     * Get the size of the stream if known.
+     *
+     * @return int|null Returns the size in bytes if known, or null if unknown.
+     */
+    public function getSize();
+
+    /**
+     * Returns the current position of the file read/write pointer
+     *
+     * @return int Position of the file pointer
+     * @throws \RuntimeException on error.
+     */
+    public function tell();
+
+    /**
+     * Returns true if the stream is at the end of the stream.
+     *
+     * @return bool
+     */
+    public function eof();
+
+    /**
+     * Returns whether or not the stream is seekable.
+     *
+     * @return bool
+     */
+    public function isSeekable();
+
+    /**
+     * Seek to a position in the stream.
+     *
+     * @link http://www.php.net/manual/en/function.fseek.php
+     * @param int $offset Stream offset
+     * @param int $whence Specifies how the cursor position will be calculated
+     *     based on the seek offset. Valid values are identical to the built-in
+     *     PHP $whence values for `fseek()`.  SEEK_SET: Set position equal to
+     *     offset bytes SEEK_CUR: Set position to current location plus offset
+     *     SEEK_END: Set position to end-of-stream plus offset.
+     * @throws \RuntimeException on failure.
+     */
+    public function seek($offset, $whence = SEEK_SET);
+
+    /**
+     * Seek to the beginning of the stream.
+     *
+     * If the stream is not seekable, this method will raise an exception;
+     * otherwise, it will perform a seek(0).
+     *
+     * @see seek()
+     * @link http://www.php.net/manual/en/function.fseek.php
+     * @throws \RuntimeException on failure.
+     */
+    public function rewind();
+
+    /**
+     * Returns whether or not the stream is writable.
+     *
+     * @return bool
+     */
+    public function isWritable();
+
+    /**
+     * Write data to the stream.
+     *
+     * @param string $string The string that is to be written.
+     * @return int Returns the number of bytes written to the stream.
+     * @throws \RuntimeException on failure.
+     */
+    public function write($string);
+
+    /**
+     * Returns whether or not the stream is readable.
+     *
+     * @return bool
+     */
+    public function isReadable();
+
+    /**
+     * Read data from the stream.
+     *
+     * @param int $length Read up to $length bytes from the object and return
+     *     them. Fewer than $length bytes may be returned if underlying stream
+     *     call returns fewer bytes.
+     * @return string Returns the data read from the stream, or an empty string
+     *     if no bytes are available.
+     * @throws \RuntimeException if an error occurs.
+     */
+    public function read($length);
+
+    /**
+     * Returns the remaining contents in a string
+     *
+     * @return string
+     * @throws \RuntimeException if unable to read or an error occurs while
+     *     reading.
+     */
+    public function getContents();
+
+    /**
+     * Get stream metadata as an associative array or retrieve a specific key.
+     *
+     * The keys returned are identical to the keys returned from PHP's
+     * stream_get_meta_data() function.
+     *
+     * @link http://php.net/manual/en/function.stream-get-meta-data.php
+     * @param string $key Specific metadata to retrieve.
+     * @return array|mixed|null Returns an associative array if no key is
+     *     provided. Returns a specific key value if a key is provided and the
+     *     value is found, or null if the key is not found.
+     */
+    public function getMetadata($key = null);
+}
diff --git a/advancedcontentfilter/vendor/psr/http-message/src/UploadedFileInterface.php b/advancedcontentfilter/vendor/psr/http-message/src/UploadedFileInterface.php
new file mode 100644 (file)
index 0000000..f8a6901
--- /dev/null
@@ -0,0 +1,123 @@
+<?php
+
+namespace Psr\Http\Message;
+
+/**
+ * Value object representing a file uploaded through an HTTP request.
+ *
+ * Instances of this interface are considered immutable; all methods that
+ * might change state MUST be implemented such that they retain the internal
+ * state of the current instance and return an instance that contains the
+ * changed state.
+ */
+interface UploadedFileInterface
+{
+    /**
+     * Retrieve a stream representing the uploaded file.
+     *
+     * This method MUST return a StreamInterface instance, representing the
+     * uploaded file. The purpose of this method is to allow utilizing native PHP
+     * stream functionality to manipulate the file upload, such as
+     * stream_copy_to_stream() (though the result will need to be decorated in a
+     * native PHP stream wrapper to work with such functions).
+     *
+     * If the moveTo() method has been called previously, this method MUST raise
+     * an exception.
+     *
+     * @return StreamInterface Stream representation of the uploaded file.
+     * @throws \RuntimeException in cases when no stream is available or can be
+     *     created.
+     */
+    public function getStream();
+
+    /**
+     * Move the uploaded file to a new location.
+     *
+     * Use this method as an alternative to move_uploaded_file(). This method is
+     * guaranteed to work in both SAPI and non-SAPI environments.
+     * Implementations must determine which environment they are in, and use the
+     * appropriate method (move_uploaded_file(), rename(), or a stream
+     * operation) to perform the operation.
+     *
+     * $targetPath may be an absolute path, or a relative path. If it is a
+     * relative path, resolution should be the same as used by PHP's rename()
+     * function.
+     *
+     * The original file or stream MUST be removed on completion.
+     *
+     * If this method is called more than once, any subsequent calls MUST raise
+     * an exception.
+     *
+     * When used in an SAPI environment where $_FILES is populated, when writing
+     * files via moveTo(), is_uploaded_file() and move_uploaded_file() SHOULD be
+     * used to ensure permissions and upload status are verified correctly.
+     *
+     * If you wish to move to a stream, use getStream(), as SAPI operations
+     * cannot guarantee writing to stream destinations.
+     *
+     * @see http://php.net/is_uploaded_file
+     * @see http://php.net/move_uploaded_file
+     * @param string $targetPath Path to which to move the uploaded file.
+     * @throws \InvalidArgumentException if the $targetPath specified is invalid.
+     * @throws \RuntimeException on any error during the move operation, or on
+     *     the second or subsequent call to the method.
+     */
+    public function moveTo($targetPath);
+    
+    /**
+     * Retrieve the file size.
+     *
+     * Implementations SHOULD return the value stored in the "size" key of
+     * the file in the $_FILES array if available, as PHP calculates this based
+     * on the actual size transmitted.
+     *
+     * @return int|null The file size in bytes or null if unknown.
+     */
+    public function getSize();
+    
+    /**
+     * Retrieve the error associated with the uploaded file.
+     *
+     * The return value MUST be one of PHP's UPLOAD_ERR_XXX constants.
+     *
+     * If the file was uploaded successfully, this method MUST return
+     * UPLOAD_ERR_OK.
+     *
+     * Implementations SHOULD return the value stored in the "error" key of
+     * the file in the $_FILES array.
+     *
+     * @see http://php.net/manual/en/features.file-upload.errors.php
+     * @return int One of PHP's UPLOAD_ERR_XXX constants.
+     */
+    public function getError();
+    
+    /**
+     * Retrieve the filename sent by the client.
+     *
+     * Do not trust the value returned by this method. A client could send
+     * a malicious filename with the intention to corrupt or hack your
+     * application.
+     *
+     * Implementations SHOULD return the value stored in the "name" key of
+     * the file in the $_FILES array.
+     *
+     * @return string|null The filename sent by the client or null if none
+     *     was provided.
+     */
+    public function getClientFilename();
+    
+    /**
+     * Retrieve the media type sent by the client.
+     *
+     * Do not trust the value returned by this method. A client could send
+     * a malicious media type with the intention to corrupt or hack your
+     * application.
+     *
+     * Implementations SHOULD return the value stored in the "type" key of
+     * the file in the $_FILES array.
+     *
+     * @return string|null The media type sent by the client or null if none
+     *     was provided.
+     */
+    public function getClientMediaType();
+}
diff --git a/advancedcontentfilter/vendor/psr/http-message/src/UriInterface.php b/advancedcontentfilter/vendor/psr/http-message/src/UriInterface.php
new file mode 100644 (file)
index 0000000..9d7ab9e
--- /dev/null
@@ -0,0 +1,323 @@
+<?php
+namespace Psr\Http\Message;
+
+/**
+ * Value object representing a URI.
+ *
+ * This interface is meant to represent URIs according to RFC 3986 and to
+ * provide methods for most common operations. Additional functionality for
+ * working with URIs can be provided on top of the interface or externally.
+ * Its primary use is for HTTP requests, but may also be used in other
+ * contexts.
+ *
+ * Instances of this interface are considered immutable; all methods that
+ * might change state MUST be implemented such that they retain the internal
+ * state of the current instance and return an instance that contains the
+ * changed state.
+ *
+ * Typically the Host header will be also be present in the request message.
+ * For server-side requests, the scheme will typically be discoverable in the
+ * server parameters.
+ *
+ * @link http://tools.ietf.org/html/rfc3986 (the URI specification)
+ */
+interface UriInterface
+{
+    /**
+     * Retrieve the scheme component of the URI.
+     *
+     * If no scheme is present, this method MUST return an empty string.
+     *
+     * The value returned MUST be normalized to lowercase, per RFC 3986
+     * Section 3.1.
+     *
+     * The trailing ":" character is not part of the scheme and MUST NOT be
+     * added.
+     *
+     * @see https://tools.ietf.org/html/rfc3986#section-3.1
+     * @return string The URI scheme.
+     */
+    public function getScheme();
+
+    /**
+     * Retrieve the authority component of the URI.
+     *
+     * If no authority information is present, this method MUST return an empty
+     * string.
+     *
+     * The authority syntax of the URI is:
+     *
+     * <pre>
+     * [user-info@]host[:port]
+     * </pre>
+     *
+     * If the port component is not set or is the standard port for the current
+     * scheme, it SHOULD NOT be included.
+     *
+     * @see https://tools.ietf.org/html/rfc3986#section-3.2
+     * @return string The URI authority, in "[user-info@]host[:port]" format.
+     */
+    public function getAuthority();
+
+    /**
+     * Retrieve the user information component of the URI.
+     *
+     * If no user information is present, this method MUST return an empty
+     * string.
+     *
+     * If a user is present in the URI, this will return that value;
+     * additionally, if the password is also present, it will be appended to the
+     * user value, with a colon (":") separating the values.
+     *
+     * The trailing "@" character is not part of the user information and MUST
+     * NOT be added.
+     *
+     * @return string The URI user information, in "username[:password]" format.
+     */
+    public function getUserInfo();
+
+    /**
+     * Retrieve the host component of the URI.
+     *
+     * If no host is present, this method MUST return an empty string.
+     *
+     * The value returned MUST be normalized to lowercase, per RFC 3986
+     * Section 3.2.2.
+     *
+     * @see http://tools.ietf.org/html/rfc3986#section-3.2.2
+     * @return string The URI host.
+     */
+    public function getHost();
+
+    /**
+     * Retrieve the port component of the URI.
+     *
+     * If a port is present, and it is non-standard for the current scheme,
+     * this method MUST return it as an integer. If the port is the standard port
+     * used with the current scheme, this method SHOULD return null.
+     *
+     * If no port is present, and no scheme is present, this method MUST return
+     * a null value.
+     *
+     * If no port is present, but a scheme is present, this method MAY return
+     * the standard port for that scheme, but SHOULD return null.
+     *
+     * @return null|int The URI port.
+     */
+    public function getPort();
+
+    /**
+     * Retrieve the path component of the URI.
+     *
+     * The path can either be empty or absolute (starting with a slash) or
+     * rootless (not starting with a slash). Implementations MUST support all
+     * three syntaxes.
+     *
+     * Normally, the empty path "" and absolute path "/" are considered equal as
+     * defined in RFC 7230 Section 2.7.3. But this method MUST NOT automatically
+     * do this normalization because in contexts with a trimmed base path, e.g.
+     * the front controller, this difference becomes significant. It's the task
+     * of the user to handle both "" and "/".
+     *
+     * The value returned MUST be percent-encoded, but MUST NOT double-encode
+     * any characters. To determine what characters to encode, please refer to
+     * RFC 3986, Sections 2 and 3.3.
+     *
+     * As an example, if the value should include a slash ("/") not intended as
+     * delimiter between path segments, that value MUST be passed in encoded
+     * form (e.g., "%2F") to the instance.
+     *
+     * @see https://tools.ietf.org/html/rfc3986#section-2
+     * @see https://tools.ietf.org/html/rfc3986#section-3.3
+     * @return string The URI path.
+     */
+    public function getPath();
+
+    /**
+     * Retrieve the query string of the URI.
+     *
+     * If no query string is present, this method MUST return an empty string.
+     *
+     * The leading "?" character is not part of the query and MUST NOT be
+     * added.
+     *
+     * The value returned MUST be percent-encoded, but MUST NOT double-encode
+     * any characters. To determine what characters to encode, please refer to
+     * RFC 3986, Sections 2 and 3.4.
+     *
+     * As an example, if a value in a key/value pair of the query string should
+     * include an ampersand ("&") not intended as a delimiter between values,
+     * that value MUST be passed in encoded form (e.g., "%26") to the instance.
+     *
+     * @see https://tools.ietf.org/html/rfc3986#section-2
+     * @see https://tools.ietf.org/html/rfc3986#section-3.4
+     * @return string The URI query string.
+     */
+    public function getQuery();
+
+    /**
+     * Retrieve the fragment component of the URI.
+     *
+     * If no fragment is present, this method MUST return an empty string.
+     *
+     * The leading "#" character is not part of the fragment and MUST NOT be
+     * added.
+     *
+     * The value returned MUST be percent-encoded, but MUST NOT double-encode
+     * any characters. To determine what characters to encode, please refer to
+     * RFC 3986, Sections 2 and 3.5.
+     *
+     * @see https://tools.ietf.org/html/rfc3986#section-2
+     * @see https://tools.ietf.org/html/rfc3986#section-3.5
+     * @return string The URI fragment.
+     */
+    public function getFragment();
+
+    /**
+     * Return an instance with the specified scheme.
+     *
+     * This method MUST retain the state of the current instance, and return
+     * an instance that contains the specified scheme.
+     *
+     * Implementations MUST support the schemes "http" and "https" case
+     * insensitively, and MAY accommodate other schemes if required.
+     *
+     * An empty scheme is equivalent to removing the scheme.
+     *
+     * @param string $scheme The scheme to use with the new instance.
+     * @return static A new instance with the specified scheme.
+     * @throws \InvalidArgumentException for invalid or unsupported schemes.
+     */
+    public function withScheme($scheme);
+
+    /**
+     * Return an instance with the specified user information.
+     *
+     * This method MUST retain the state of the current instance, and return
+     * an instance that contains the specified user information.
+     *
+     * Password is optional, but the user information MUST include the
+     * user; an empty string for the user is equivalent to removing user
+     * information.
+     *
+     * @param string $user The user name to use for authority.
+     * @param null|string $password The password associated with $user.
+     * @return static A new instance with the specified user information.
+     */
+    public function withUserInfo($user, $password = null);
+
+    /**
+     * Return an instance with the specified host.
+     *
+     * This method MUST retain the state of the current instance, and return
+     * an instance that contains the specified host.
+     *
+     * An empty host value is equivalent to removing the host.
+     *
+     * @param string $host The hostname to use with the new instance.
+     * @return static A new instance with the specified host.
+     * @throws \InvalidArgumentException for invalid hostnames.
+     */
+    public function withHost($host);
+
+    /**
+     * Return an instance with the specified port.
+     *
+     * This method MUST retain the state of the current instance, and return
+     * an instance that contains the specified port.
+     *
+     * Implementations MUST raise an exception for ports outside the
+     * established TCP and UDP port ranges.
+     *
+     * A null value provided for the port is equivalent to removing the port
+     * information.
+     *
+     * @param null|int $port The port to use with the new instance; a null value
+     *     removes the port information.
+     * @return static A new instance with the specified port.
+     * @throws \InvalidArgumentException for invalid ports.
+     */
+    public function withPort($port);
+
+    /**
+     * Return an instance with the specified path.
+     *
+     * This method MUST retain the state of the current instance, and return
+     * an instance that contains the specified path.
+     *
+     * The path can either be empty or absolute (starting with a slash) or
+     * rootless (not starting with a slash). Implementations MUST support all
+     * three syntaxes.
+     *
+     * If the path is intended to be domain-relative rather than path relative then
+     * it must begin with a slash ("/"). Paths not starting with a slash ("/")
+     * are assumed to be relative to some base path known to the application or
+     * consumer.
+     *
+     * Users can provide both encoded and decoded path characters.
+     * Implementations ensure the correct encoding as outlined in getPath().
+     *
+     * @param string $path The path to use with the new instance.
+     * @return static A new instance with the specified path.
+     * @throws \InvalidArgumentException for invalid paths.
+     */
+    public function withPath($path);
+
+    /**
+     * Return an instance with the specified query string.
+     *
+     * This method MUST retain the state of the current instance, and return
+     * an instance that contains the specified query string.
+     *
+     * Users can provide both encoded and decoded query characters.
+     * Implementations ensure the correct encoding as outlined in getQuery().
+     *
+     * An empty query string value is equivalent to removing the query string.
+     *
+     * @param string $query The query string to use with the new instance.
+     * @return static A new instance with the specified query string.
+     * @throws \InvalidArgumentException for invalid query strings.
+     */
+    public function withQuery($query);
+
+    /**
+     * Return an instance with the specified URI fragment.
+     *
+     * This method MUST retain the state of the current instance, and return
+     * an instance that contains the specified URI fragment.
+     *
+     * Users can provide both encoded and decoded fragment characters.
+     * Implementations ensure the correct encoding as outlined in getFragment().
+     *
+     * An empty fragment value is equivalent to removing the fragment.
+     *
+     * @param string $fragment The fragment to use with the new instance.
+     * @return static A new instance with the specified fragment.
+     */
+    public function withFragment($fragment);
+
+    /**
+     * Return the string representation as a URI reference.
+     *
+     * Depending on which components of the URI are present, the resulting
+     * string is either a full URI or relative reference according to RFC 3986,
+     * Section 4.1. The method concatenates the various components of the URI,
+     * using the appropriate delimiters:
+     *
+     * - If a scheme is present, it MUST be suffixed by ":".
+     * - If an authority is present, it MUST be prefixed by "//".
+     * - The path can be concatenated without delimiters. But there are two
+     *   cases where the path has to be adjusted to make the URI reference
+     *   valid as PHP does not allow to throw an exception in __toString():
+     *     - If the path is rootless and an authority is present, the path MUST
+     *       be prefixed by "/".
+     *     - If the path is starting with more than one "/" and no authority is
+     *       present, the starting slashes MUST be reduced to one.
+     * - If a query is present, it MUST be prefixed by "?".
+     * - If a fragment is present, it MUST be prefixed by "#".
+     *
+     * @see http://tools.ietf.org/html/rfc3986#section-4.1
+     * @return string
+     */
+    public function __toString();
+}
diff --git a/advancedcontentfilter/vendor/psr/log/.gitignore b/advancedcontentfilter/vendor/psr/log/.gitignore
new file mode 100644 (file)
index 0000000..22d0d82
--- /dev/null
@@ -0,0 +1 @@
+vendor
diff --git a/advancedcontentfilter/vendor/psr/log/LICENSE b/advancedcontentfilter/vendor/psr/log/LICENSE
new file mode 100644 (file)
index 0000000..474c952
--- /dev/null
@@ -0,0 +1,19 @@
+Copyright (c) 2012 PHP Framework Interoperability Group
+
+Permission is hereby granted, free of charge, to any person obtaining a copy 
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights 
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 
+copies of the Software, and to permit persons to whom the Software is 
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in 
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/advancedcontentfilter/vendor/psr/log/Psr/Log/AbstractLogger.php b/advancedcontentfilter/vendor/psr/log/Psr/Log/AbstractLogger.php
new file mode 100644 (file)
index 0000000..90e721a
--- /dev/null
@@ -0,0 +1,128 @@
+<?php
+
+namespace Psr\Log;
+
+/**
+ * This is a simple Logger implementation that other Loggers can inherit from.
+ *
+ * It simply delegates all log-level-specific methods to the `log` method to
+ * reduce boilerplate code that a simple Logger that does the same thing with
+ * messages regardless of the error level has to implement.
+ */
+abstract class AbstractLogger implements LoggerInterface
+{
+    /**
+     * System is unusable.
+     *
+     * @param string $message
+     * @param array  $context
+     *
+     * @return void
+     */
+    public function emergency($message, array $context = array())
+    {
+        $this->log(LogLevel::EMERGENCY, $message, $context);
+    }
+
+    /**
+     * Action must be taken immediately.
+     *
+     * Example: Entire website down, database unavailable, etc. This should
+     * trigger the SMS alerts and wake you up.
+     *
+     * @param string $message
+     * @param array  $context
+     *
+     * @return void
+     */
+    public function alert($message, array $context = array())
+    {
+        $this->log(LogLevel::ALERT, $message, $context);
+    }
+
+    /**
+     * Critical conditions.
+     *
+     * Example: Application component unavailable, unexpected exception.
+     *
+     * @param string $message
+     * @param array  $context
+     *
+     * @return void
+     */
+    public function critical($message, array $context = array())
+    {
+        $this->log(LogLevel::CRITICAL, $message, $context);
+    }
+
+    /**
+     * Runtime errors that do not require immediate action but should typically
+     * be logged and monitored.
+     *
+     * @param string $message
+     * @param array  $context
+     *
+     * @return void
+     */
+    public function error($message, array $context = array())
+    {
+        $this->log(LogLevel::ERROR, $message, $context);
+    }
+
+    /**
+     * Exceptional occurrences that are not errors.
+     *
+     * Example: Use of deprecated APIs, poor use of an API, undesirable things
+     * that are not necessarily wrong.
+     *
+     * @param string $message
+     * @param array  $context
+     *
+     * @return void
+     */
+    public function warning($message, array $context = array())
+    {
+        $this->log(LogLevel::WARNING, $message, $context);
+    }
+
+    /**
+     * Normal but significant events.
+     *
+     * @param string $message
+     * @param array  $context
+     *
+     * @return void
+     */
+    public function notice($message, array $context = array())
+    {
+        $this->log(LogLevel::NOTICE, $message, $context);
+    }
+
+    /**
+     * Interesting events.
+     *
+     * Example: User logs in, SQL logs.
+     *
+     * @param string $message
+     * @param array  $context
+     *
+     * @return void
+     */
+    public function info($message, array $context = array())
+    {
+        $this->log(LogLevel::INFO, $message, $context);
+    }
+
+    /**
+     * Detailed debug information.
+     *
+     * @param string $message
+     * @param array  $context
+     *
+     * @return void
+     */
+    public function debug($message, array $context = array())
+    {
+        $this->log(LogLevel::DEBUG, $message, $context);
+    }
+}
diff --git a/advancedcontentfilter/vendor/psr/log/Psr/Log/InvalidArgumentException.php b/advancedcontentfilter/vendor/psr/log/Psr/Log/InvalidArgumentException.php
new file mode 100644 (file)
index 0000000..67f852d
--- /dev/null
@@ -0,0 +1,7 @@
+<?php
+
+namespace Psr\Log;
+
+class InvalidArgumentException extends \InvalidArgumentException
+{
+}
diff --git a/advancedcontentfilter/vendor/psr/log/Psr/Log/LogLevel.php b/advancedcontentfilter/vendor/psr/log/Psr/Log/LogLevel.php
new file mode 100644 (file)
index 0000000..9cebcac
--- /dev/null
@@ -0,0 +1,18 @@
+<?php
+
+namespace Psr\Log;
+
+/**
+ * Describes log levels.
+ */
+class LogLevel
+{
+    const EMERGENCY = 'emergency';
+    const ALERT     = 'alert';
+    const CRITICAL  = 'critical';
+    const ERROR     = 'error';
+    const WARNING   = 'warning';
+    const NOTICE    = 'notice';
+    const INFO      = 'info';
+    const DEBUG     = 'debug';
+}
diff --git a/advancedcontentfilter/vendor/psr/log/Psr/Log/LoggerAwareInterface.php b/advancedcontentfilter/vendor/psr/log/Psr/Log/LoggerAwareInterface.php
new file mode 100644 (file)
index 0000000..4d64f47
--- /dev/null
@@ -0,0 +1,18 @@
+<?php
+
+namespace Psr\Log;
+
+/**
+ * Describes a logger-aware instance.
+ */
+interface LoggerAwareInterface
+{
+    /**
+     * Sets a logger instance on the object.
+     *
+     * @param LoggerInterface $logger
+     *
+     * @return void
+     */
+    public function setLogger(LoggerInterface $logger);
+}
diff --git a/advancedcontentfilter/vendor/psr/log/Psr/Log/LoggerAwareTrait.php b/advancedcontentfilter/vendor/psr/log/Psr/Log/LoggerAwareTrait.php
new file mode 100644 (file)
index 0000000..639f79b
--- /dev/null
@@ -0,0 +1,26 @@
+<?php
+
+namespace Psr\Log;
+
+/**
+ * Basic Implementation of LoggerAwareInterface.
+ */
+trait LoggerAwareTrait
+{
+    /**
+     * The logger instance.
+     *
+     * @var LoggerInterface
+     */
+    protected $logger;
+
+    /**
+     * Sets a logger.
+     *
+     * @param LoggerInterface $logger
+     */
+    public function setLogger(LoggerInterface $logger)
+    {
+        $this->logger = $logger;
+    }
+}
diff --git a/advancedcontentfilter/vendor/psr/log/Psr/Log/LoggerInterface.php b/advancedcontentfilter/vendor/psr/log/Psr/Log/LoggerInterface.php
new file mode 100644 (file)
index 0000000..5ea7243
--- /dev/null
@@ -0,0 +1,123 @@
+<?php
+
+namespace Psr\Log;
+
+/**
+ * Describes a logger instance.
+ *
+ * The message MUST be a string or object implementing __toString().
+ *
+ * The message MAY contain placeholders in the form: {foo} where foo
+ * will be replaced by the context data in key "foo".
+ *
+ * The context array can contain arbitrary data. The only assumption that
+ * can be made by implementors is that if an Exception instance is given
+ * to produce a stack trace, it MUST be in a key named "exception".
+ *
+ * See https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md
+ * for the full interface specification.
+ */
+interface LoggerInterface
+{
+    /**
+     * System is unusable.
+     *
+     * @param string $message
+     * @param array  $context
+     *
+     * @return void
+     */
+    public function emergency($message, array $context = array());
+
+    /**
+     * Action must be taken immediately.
+     *
+     * Example: Entire website down, database unavailable, etc. This should
+     * trigger the SMS alerts and wake you up.
+     *
+     * @param string $message
+     * @param array  $context
+     *
+     * @return void
+     */
+    public function alert($message, array $context = array());
+
+    /**
+     * Critical conditions.
+     *
+     * Example: Application component unavailable, unexpected exception.
+     *
+     * @param string $message
+     * @param array  $context
+     *
+     * @return void
+     */
+    public function critical($message, array $context = array());
+
+    /**
+     * Runtime errors that do not require immediate action but should typically
+     * be logged and monitored.
+     *
+     * @param string $message
+     * @param array  $context
+     *
+     * @return void
+     */
+    public function error($message, array $context = array());
+
+    /**
+     * Exceptional occurrences that are not errors.
+     *
+     * Example: Use of deprecated APIs, poor use of an API, undesirable things
+     * that are not necessarily wrong.
+     *
+     * @param string $message
+     * @param array  $context
+     *
+     * @return void
+     */
+    public function warning($message, array $context = array());
+
+    /**
+     * Normal but significant events.
+     *
+     * @param string $message
+     * @param array  $context
+     *
+     * @return void
+     */
+    public function notice($message, array $context = array());
+
+    /**
+     * Interesting events.
+     *
+     * Example: User logs in, SQL logs.
+     *
+     * @param string $message
+     * @param array  $context
+     *
+     * @return void
+     */
+    public function info($message, array $context = array());
+
+    /**
+     * Detailed debug information.
+     *
+     * @param string $message
+     * @param array  $context
+     *
+     * @return void
+     */
+    public function debug($message, array $context = array());
+
+    /**
+     * Logs with an arbitrary level.
+     *
+     * @param mixed  $level
+     * @param string $message
+     * @param array  $context
+     *
+     * @return void
+     */
+    public function log($level, $message, array $context = array());
+}
diff --git a/advancedcontentfilter/vendor/psr/log/Psr/Log/LoggerTrait.php b/advancedcontentfilter/vendor/psr/log/Psr/Log/LoggerTrait.php
new file mode 100644 (file)
index 0000000..867225d
--- /dev/null
@@ -0,0 +1,140 @@
+<?php
+
+namespace Psr\Log;
+
+/**
+ * This is a simple Logger trait that classes unable to extend AbstractLogger
+ * (because they extend another class, etc) can include.
+ *
+ * It simply delegates all log-level-specific methods to the `log` method to
+ * reduce boilerplate code that a simple Logger that does the same thing with
+ * messages regardless of the error level has to implement.
+ */
+trait LoggerTrait
+{
+    /**
+     * System is unusable.
+     *
+     * @param string $message
+     * @param array  $context
+     *
+     * @return void
+     */
+    public function emergency($message, array $context = array())
+    {
+        $this->log(LogLevel::EMERGENCY, $message, $context);
+    }
+
+    /**
+     * Action must be taken immediately.
+     *
+     * Example: Entire website down, database unavailable, etc. This should
+     * trigger the SMS alerts and wake you up.
+     *
+     * @param string $message
+     * @param array  $context
+     *
+     * @return void
+     */
+    public function alert($message, array $context = array())
+    {
+        $this->log(LogLevel::ALERT, $message, $context);
+    }
+
+    /**
+     * Critical conditions.
+     *
+     * Example: Application component unavailable, unexpected exception.
+     *
+     * @param string $message
+     * @param array  $context
+     *
+     * @return void
+     */
+    public function critical($message, array $context = array())
+    {
+        $this->log(LogLevel::CRITICAL, $message, $context);
+    }
+
+    /**
+     * Runtime errors that do not require immediate action but should typically
+     * be logged and monitored.
+     *
+     * @param string $message
+     * @param array  $context
+     *
+     * @return void
+     */
+    public function error($message, array $context = array())
+    {
+        $this->log(LogLevel::ERROR, $message, $context);
+    }
+
+    /**
+     * Exceptional occurrences that are not errors.
+     *
+     * Example: Use of deprecated APIs, poor use of an API, undesirable things
+     * that are not necessarily wrong.
+     *
+     * @param string $message
+     * @param array  $context
+     *
+     * @return void
+     */
+    public function warning($message, array $context = array())
+    {
+        $this->log(LogLevel::WARNING, $message, $context);
+    }
+
+    /**
+     * Normal but significant events.
+     *
+     * @param string $message
+     * @param array  $context
+     *
+     * @return void
+     */
+    public function notice($message, array $context = array())
+    {
+        $this->log(LogLevel::NOTICE, $message, $context);
+    }
+
+    /**
+     * Interesting events.
+     *
+     * Example: User logs in, SQL logs.
+     *
+     * @param string $message
+     * @param array  $context
+     *
+     * @return void
+     */
+    public function info($message, array $context = array())
+    {
+        $this->log(LogLevel::INFO, $message, $context);
+    }
+
+    /**
+     * Detailed debug information.
+     *
+     * @param string $message
+     * @param array  $context
+     *
+     * @return void
+     */
+    public function debug($message, array $context = array())
+    {
+        $this->log(LogLevel::DEBUG, $message, $context);
+    }
+
+    /**
+     * Logs with an arbitrary level.
+     *
+     * @param mixed  $level
+     * @param string $message
+     * @param array  $context
+     *
+     * @return void
+     */
+    abstract public function log($level, $message, array $context = array());
+}
diff --git a/advancedcontentfilter/vendor/psr/log/Psr/Log/NullLogger.php b/advancedcontentfilter/vendor/psr/log/Psr/Log/NullLogger.php
new file mode 100644 (file)
index 0000000..d8cd682
--- /dev/null
@@ -0,0 +1,28 @@
+<?php
+
+namespace Psr\Log;
+
+/**
+ * This Logger can be used to avoid conditional log calls.
+ *
+ * Logging should always be optional, and if no logger is provided to your
+ * library creating a NullLogger instance to have something to throw logs at
+ * is a good way to avoid littering your code with `if ($this->logger) { }`
+ * blocks.
+ */
+class NullLogger extends AbstractLogger
+{
+    /**
+     * Logs with an arbitrary level.
+     *
+     * @param mixed  $level
+     * @param string $message
+     * @param array  $context
+     *
+     * @return void
+     */
+    public function log($level, $message, array $context = array())
+    {
+        // noop
+    }
+}
diff --git a/advancedcontentfilter/vendor/psr/log/Psr/Log/Test/LoggerInterfaceTest.php b/advancedcontentfilter/vendor/psr/log/Psr/Log/Test/LoggerInterfaceTest.php
new file mode 100644 (file)
index 0000000..a0391a5
--- /dev/null
@@ -0,0 +1,140 @@
+<?php
+
+namespace Psr\Log\Test;
+
+use Psr\Log\LoggerInterface;
+use Psr\Log\LogLevel;
+
+/**
+ * Provides a base test class for ensuring compliance with the LoggerInterface.
+ *
+ * Implementors can extend the class and implement abstract methods to run this
+ * as part of their test suite.
+ */
+abstract class LoggerInterfaceTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @return LoggerInterface
+     */
+    abstract public function getLogger();
+
+    /**
+     * This must return the log messages in order.
+     *
+     * The simple formatting of the messages is: "<LOG LEVEL> <MESSAGE>".
+     *
+     * Example ->error('Foo') would yield "error Foo".
+     *
+     * @return string[]
+     */
+    abstract public function getLogs();
+
+    public function testImplements()
+    {
+        $this->assertInstanceOf('Psr\Log\LoggerInterface', $this->getLogger());
+    }
+
+    /**
+     * @dataProvider provideLevelsAndMessages
+     */
+    public function testLogsAtAllLevels($level, $message)
+    {
+        $logger = $this->getLogger();
+        $logger->{$level}($message, array('user' => 'Bob'));
+        $logger->log($level, $message, array('user' => 'Bob'));
+
+        $expected = array(
+            $level.' message of level '.$level.' with context: Bob',
+            $level.' message of level '.$level.' with context: Bob',
+        );
+        $this->assertEquals($expected, $this->getLogs());
+    }
+
+    public function provideLevelsAndMessages()
+    {
+        return array(
+            LogLevel::EMERGENCY => array(LogLevel::EMERGENCY, 'message of level emergency with context: {user}'),
+            LogLevel::ALERT => array(LogLevel::ALERT, 'message of level alert with context: {user}'),
+            LogLevel::CRITICAL => array(LogLevel::CRITICAL, 'message of level critical with context: {user}'),
+            LogLevel::ERROR => array(LogLevel::ERROR, 'message of level error with context: {user}'),
+            LogLevel::WARNING => array(LogLevel::WARNING, 'message of level warning with context: {user}'),
+            LogLevel::NOTICE => array(LogLevel::NOTICE, 'message of level notice with context: {user}'),
+            LogLevel::INFO => array(LogLevel::INFO, 'message of level info with context: {user}'),
+            LogLevel::DEBUG => array(LogLevel::DEBUG, 'message of level debug with context: {user}'),
+        );
+    }
+
+    /**
+     * @expectedException \Psr\Log\InvalidArgumentException
+     */
+    public function testThrowsOnInvalidLevel()
+    {
+        $logger = $this->getLogger();
+        $logger->log('invalid level', 'Foo');
+    }
+
+    public function testContextReplacement()
+    {
+        $logger = $this->getLogger();
+        $logger->info('{Message {nothing} {user} {foo.bar} a}', array('user' => 'Bob', 'foo.bar' => 'Bar'));
+
+        $expected = array('info {Message {nothing} Bob Bar a}');
+        $this->assertEquals($expected, $this->getLogs());
+    }
+
+    public function testObjectCastToString()
+    {
+        if (method_exists($this, 'createPartialMock')) {
+            $dummy = $this->createPartialMock('Psr\Log\Test\DummyTest', array('__toString'));
+        } else {
+            $dummy = $this->getMock('Psr\Log\Test\DummyTest', array('__toString'));
+        }
+        $dummy->expects($this->once())
+            ->method('__toString')
+            ->will($this->returnValue('DUMMY'));
+
+        $this->getLogger()->warning($dummy);
+
+        $expected = array('warning DUMMY');
+        $this->assertEquals($expected, $this->getLogs());
+    }
+
+    public function testContextCanContainAnything()
+    {
+        $context = array(
+            'bool' => true,
+            'null' => null,
+            'string' => 'Foo',
+            'int' => 0,
+            'float' => 0.5,
+            'nested' => array('with object' => new DummyTest),
+            'object' => new \DateTime,
+            'resource' => fopen('php://memory', 'r'),
+        );
+
+        $this->getLogger()->warning('Crazy context data', $context);
+
+        $expected = array('warning Crazy context data');
+        $this->assertEquals($expected, $this->getLogs());
+    }
+
+    public function testContextExceptionKeyCanBeExceptionOrOtherValues()
+    {
+        $logger = $this->getLogger();
+        $logger->warning('Random message', array('exception' => 'oops'));
+        $logger->critical('Uncaught Exception!', array('exception' => new \LogicException('Fail')));
+
+        $expected = array(
+            'warning Random message',
+            'critical Uncaught Exception!'
+        );
+        $this->assertEquals($expected, $this->getLogs());
+    }
+}
+
+class DummyTest
+{
+    public function __toString()
+    {
+    }
+}
diff --git a/advancedcontentfilter/vendor/psr/log/README.md b/advancedcontentfilter/vendor/psr/log/README.md
new file mode 100644 (file)
index 0000000..574bc1c
--- /dev/null
@@ -0,0 +1,45 @@
+PSR Log
+=======
+
+This repository holds all interfaces/classes/traits related to
+[PSR-3](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md).
+
+Note that this is not a logger of its own. It is merely an interface that
+describes a logger. See the specification for more details.
+
+Usage
+-----
+
+If you need a logger, you can use the interface like this:
+
+```php
+<?php
+
+use Psr\Log\LoggerInterface;
+
+class Foo
+{
+    private $logger;
+
+    public function __construct(LoggerInterface $logger = null)
+    {
+        $this->logger = $logger;
+    }
+
+    public function doSomething()
+    {
+        if ($this->logger) {
+            $this->logger->info('Doing work');
+        }
+
+        // do something useful
+    }
+}
+```
+
+You can then pick one of the implementations of the interface to get a logger.
+
+If you want to implement the interface, you can require this package and
+implement `Psr\Log\LoggerInterface` in your code. Please read the
+[specification text](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md)
+for details.
diff --git a/advancedcontentfilter/vendor/psr/log/composer.json b/advancedcontentfilter/vendor/psr/log/composer.json
new file mode 100644 (file)
index 0000000..87934d7
--- /dev/null
@@ -0,0 +1,26 @@
+{
+    "name": "psr/log",
+    "description": "Common interface for logging libraries",
+    "keywords": ["psr", "psr-3", "log"],
+    "homepage": "https://github.com/php-fig/log",
+    "license": "MIT",
+    "authors": [
+        {
+            "name": "PHP-FIG",
+            "homepage": "http://www.php-fig.org/"
+        }
+    ],
+    "require": {
+        "php": ">=5.3.0"
+    },
+    "autoload": {
+        "psr-4": {
+            "Psr\\Log\\": "Psr/Log/"
+        }
+    },
+    "extra": {
+        "branch-alias": {
+            "dev-master": "1.0.x-dev"
+        }
+    }
+}
diff --git a/advancedcontentfilter/vendor/psr/simple-cache/.editorconfig b/advancedcontentfilter/vendor/psr/simple-cache/.editorconfig
new file mode 100644 (file)
index 0000000..48542cb
--- /dev/null
@@ -0,0 +1,12 @@
+; This file is for unifying the coding style for different editors and IDEs.
+; More information at http://editorconfig.org
+
+root = true
+
+[*]
+charset = utf-8
+indent_size = 4
+indent_style = space
+end_of_line = lf
+insert_final_newline = true
+trim_trailing_whitespace = true
diff --git a/advancedcontentfilter/vendor/psr/simple-cache/LICENSE.md b/advancedcontentfilter/vendor/psr/simple-cache/LICENSE.md
new file mode 100644 (file)
index 0000000..e49a7c8
--- /dev/null
@@ -0,0 +1,21 @@
+# The MIT License (MIT)
+
+Copyright (c) 2016 PHP Framework Interoperability Group
+
+> Permission is hereby granted, free of charge, to any person obtaining a copy
+> of this software and associated documentation files (the "Software"), to deal
+> in the Software without restriction, including without limitation the rights
+> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+> copies of the Software, and to permit persons to whom the Software is
+> furnished to do so, subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in
+> all copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+> THE SOFTWARE.
diff --git a/advancedcontentfilter/vendor/psr/simple-cache/README.md b/advancedcontentfilter/vendor/psr/simple-cache/README.md
new file mode 100644 (file)
index 0000000..43641d1
--- /dev/null
@@ -0,0 +1,8 @@
+PHP FIG Simple Cache PSR
+========================
+
+This repository holds all interfaces related to PSR-16.
+
+Note that this is not a cache implementation of its own. It is merely an interface that describes a cache implementation. See [the specification](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-16-simple-cache.md) for more details.
+
+You can find implementations of the specification by looking for packages providing the [psr/simple-cache-implementation](https://packagist.org/providers/psr/simple-cache-implementation) virtual package.
diff --git a/advancedcontentfilter/vendor/psr/simple-cache/composer.json b/advancedcontentfilter/vendor/psr/simple-cache/composer.json
new file mode 100644 (file)
index 0000000..2978fa5
--- /dev/null
@@ -0,0 +1,25 @@
+{
+    "name": "psr/simple-cache",
+    "description": "Common interfaces for simple caching",
+    "keywords": ["psr", "psr-16", "cache", "simple-cache", "caching"],
+    "license": "MIT",
+    "authors": [
+        {
+            "name": "PHP-FIG",
+            "homepage": "http://www.php-fig.org/"
+        }
+    ],
+    "require": {
+        "php": ">=5.3.0"
+    },
+    "autoload": {
+        "psr-4": {
+            "Psr\\SimpleCache\\": "src/"
+        }
+    },
+    "extra": {
+        "branch-alias": {
+            "dev-master": "1.0.x-dev"
+        }
+    }
+}
diff --git a/advancedcontentfilter/vendor/psr/simple-cache/src/CacheException.php b/advancedcontentfilter/vendor/psr/simple-cache/src/CacheException.php
new file mode 100644 (file)
index 0000000..eba5381
--- /dev/null
@@ -0,0 +1,10 @@
+<?php
+
+namespace Psr\SimpleCache;
+
+/**
+ * Interface used for all types of exceptions thrown by the implementing library.
+ */
+interface CacheException
+{
+}
diff --git a/advancedcontentfilter/vendor/psr/simple-cache/src/CacheInterface.php b/advancedcontentfilter/vendor/psr/simple-cache/src/CacheInterface.php
new file mode 100644 (file)
index 0000000..99e8d95
--- /dev/null
@@ -0,0 +1,114 @@
+<?php
+
+namespace Psr\SimpleCache;
+
+interface CacheInterface
+{
+    /**
+     * Fetches a value from the cache.
+     *
+     * @param string $key     The unique key of this item in the cache.
+     * @param mixed  $default Default value to return if the key does not exist.
+     *
+     * @return mixed The value of the item from the cache, or $default in case of cache miss.
+     *
+     * @throws \Psr\SimpleCache\InvalidArgumentException
+     *   MUST be thrown if the $key string is not a legal value.
+     */
+    public function get($key, $default = null);
+
+    /**
+     * Persists data in the cache, uniquely referenced by a key with an optional expiration TTL time.
+     *
+     * @param string                 $key   The key of the item to store.
+     * @param mixed                  $value The value of the item to store, must be serializable.
+     * @param null|int|\DateInterval $ttl   Optional. The TTL value of this item. If no value is sent and
+     *                                      the driver supports TTL then the library may set a default value
+     *                                      for it or let the driver take care of that.
+     *
+     * @return bool True on success and false on failure.
+     *
+     * @throws \Psr\SimpleCache\InvalidArgumentException
+     *   MUST be thrown if the $key string is not a legal value.
+     */
+    public function set($key, $value, $ttl = null);
+
+    /**
+     * Delete an item from the cache by its unique key.
+     *
+     * @param string $key The unique cache key of the item to delete.
+     *
+     * @return bool True if the item was successfully removed. False if there was an error.
+     *
+     * @throws \Psr\SimpleCache\InvalidArgumentException
+     *   MUST be thrown if the $key string is not a legal value.
+     */
+    public function delete($key);
+
+    /**
+     * Wipes clean the entire cache's keys.
+     *
+     * @return bool True on success and false on failure.
+     */
+    public function clear();
+
+    /**
+     * Obtains multiple cache items by their unique keys.
+     *
+     * @param iterable $keys    A list of keys that can obtained in a single operation.
+     * @param mixed    $default Default value to return for keys that do not exist.
+     *
+     * @return iterable A list of key => value pairs. Cache keys that do not exist or are stale will have $default as value.
+     *
+     * @throws \Psr\SimpleCache\InvalidArgumentException
+     *   MUST be thrown if $keys is neither an array nor a Traversable,
+     *   or if any of the $keys are not a legal value.
+     */
+    public function getMultiple($keys, $default = null);
+
+    /**
+     * Persists a set of key => value pairs in the cache, with an optional TTL.
+     *
+     * @param iterable               $values A list of key => value pairs for a multiple-set operation.
+     * @param null|int|\DateInterval $ttl    Optional. The TTL value of this item. If no value is sent and
+     *                                       the driver supports TTL then the library may set a default value
+     *                                       for it or let the driver take care of that.
+     *
+     * @return bool True on success and false on failure.
+     *
+     * @throws \Psr\SimpleCache\InvalidArgumentException
+     *   MUST be thrown if $values is neither an array nor a Traversable,
+     *   or if any of the $values are not a legal value.
+     */
+    public function setMultiple($values, $ttl = null);
+
+    /**
+     * Deletes multiple cache items in a single operation.
+     *
+     * @param iterable $keys A list of string-based keys to be deleted.
+     *
+     * @return bool True if the items were successfully removed. False if there was an error.
+     *
+     * @throws \Psr\SimpleCache\InvalidArgumentException
+     *   MUST be thrown if $keys is neither an array nor a Traversable,
+     *   or if any of the $keys are not a legal value.
+     */
+    public function deleteMultiple($keys);
+
+    /**
+     * Determines whether an item is present in the cache.
+     *
+     * NOTE: It is recommended that has() is only to be used for cache warming type purposes
+     * and not to be used within your live applications operations for get/set, as this method
+     * is subject to a race condition where your has() will return true and immediately after,
+     * another script can remove it making the state of your app out of date.
+     *
+     * @param string $key The cache item key.
+     *
+     * @return bool
+     *
+     * @throws \Psr\SimpleCache\InvalidArgumentException
+     *   MUST be thrown if the $key string is not a legal value.
+     */
+    public function has($key);
+}
diff --git a/advancedcontentfilter/vendor/psr/simple-cache/src/InvalidArgumentException.php b/advancedcontentfilter/vendor/psr/simple-cache/src/InvalidArgumentException.php
new file mode 100644 (file)
index 0000000..6a9524a
--- /dev/null
@@ -0,0 +1,13 @@
+<?php
+
+namespace Psr\SimpleCache;
+
+/**
+ * Exception interface for invalid cache arguments.
+ *
+ * When an invalid argument is passed it must throw an exception which implements
+ * this interface
+ */
+interface InvalidArgumentException extends CacheException
+{
+}
diff --git a/advancedcontentfilter/vendor/slim/slim-skeleton/.gitignore b/advancedcontentfilter/vendor/slim/slim-skeleton/.gitignore
new file mode 100644 (file)
index 0000000..adf1997
--- /dev/null
@@ -0,0 +1,3 @@
+/vendor/
+/logs/*
+!/logs/README.md
diff --git a/advancedcontentfilter/vendor/slim/slim-skeleton/CONTRIBUTING.md b/advancedcontentfilter/vendor/slim/slim-skeleton/CONTRIBUTING.md
new file mode 100644 (file)
index 0000000..4152c1a
--- /dev/null
@@ -0,0 +1,14 @@
+# How to Contribute
+
+## Pull Requests
+
+1. Fork the Slim Skeleton repository
+2. Create a new branch for each feature or improvement
+3. Send a pull request from each feature branch to the **3.x** branch
+
+It is very important to separate new features or improvements into separate feature branches, and to send a
+pull request for each branch. This allows us to review and pull in new features or improvements individually.
+
+## Style Guide
+
+All pull requests must adhere to the [PSR-2 standard](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md).
diff --git a/advancedcontentfilter/vendor/slim/slim-skeleton/README.md b/advancedcontentfilter/vendor/slim/slim-skeleton/README.md
new file mode 100644 (file)
index 0000000..189fa56
--- /dev/null
@@ -0,0 +1,27 @@
+# Slim Framework 3 Skeleton Application
+
+Use this skeleton application to quickly setup and start working on a new Slim Framework 3 application. This application uses the latest Slim 3 with the PHP-View template renderer. It also uses the Monolog logger.
+
+This skeleton application was built for Composer. This makes setting up a new Slim Framework application quick and easy.
+
+## Install the Application
+
+Run this command from the directory in which you want to install your new Slim Framework application.
+
+    php composer.phar create-project slim/slim-skeleton [my-app-name]
+
+Replace `[my-app-name]` with the desired directory name for your new application. You'll want to:
+
+* Point your virtual host document root to your new application's `public/` directory.
+* Ensure `logs/` is web writeable.
+
+To run the application in development, you can run these commands 
+
+       cd [my-app-name]
+       php composer.phar start
+
+Run this command in the application directory to run the test suite
+
+       php composer.phar test
+
+That's it! Now go build something cool.
diff --git a/advancedcontentfilter/vendor/slim/slim-skeleton/composer.json b/advancedcontentfilter/vendor/slim/slim-skeleton/composer.json
new file mode 100644 (file)
index 0000000..5ed5d2e
--- /dev/null
@@ -0,0 +1,36 @@
+{
+    "name": "slim/slim-skeleton",
+    "description": "A Slim Framework skeleton application for rapid development",
+    "keywords": ["microframework", "rest", "router", "psr7"],
+    "homepage": "http://github.com/slimphp/Slim-Skeleton",
+    "license": "MIT",
+    "authors": [
+        {
+            "name": "Josh Lockhart",
+            "email": "info@joshlockhart.com",
+            "homepage": "http://www.joshlockhart.com/"
+        }
+    ],
+    "require": {
+        "php": ">=5.5.0",
+        "slim/slim": "^3.1",
+        "slim/php-view": "^2.0",
+        "monolog/monolog": "^1.17"
+    },
+    "require-dev": {
+        "phpunit/phpunit": ">=4.8 < 6.0"
+    },
+    "autoload-dev": {
+        "psr-4": {
+            "Tests\\": "tests/"
+        }
+    },
+    "config": {
+        "process-timeout" : 0
+    },
+    "scripts": {
+        "start": "php -S localhost:8080 -t public",
+        "test": "phpunit"
+    }
+
+}
diff --git a/advancedcontentfilter/vendor/slim/slim-skeleton/docker-compose.yml b/advancedcontentfilter/vendor/slim/slim-skeleton/docker-compose.yml
new file mode 100644 (file)
index 0000000..e77790d
--- /dev/null
@@ -0,0 +1,18 @@
+version: '2'
+
+volumes:
+    logs:
+        driver: local
+
+services:
+    slim:
+        image: php:7-alpine
+        working_dir: /var/www
+        command: php -S 0.0.0.0:8080 -t public
+        environment:
+            docker: "true"
+        ports:
+            - 8080:8080
+        volumes:
+            - .:/var/www
+            - logs:/var/www/logs
diff --git a/advancedcontentfilter/vendor/slim/slim-skeleton/logs/README.md b/advancedcontentfilter/vendor/slim/slim-skeleton/logs/README.md
new file mode 100644 (file)
index 0000000..d4a602e
--- /dev/null
@@ -0,0 +1 @@
+Your Slim Framework application's log files will be written to this directory.
diff --git a/advancedcontentfilter/vendor/slim/slim-skeleton/phpunit.xml b/advancedcontentfilter/vendor/slim/slim-skeleton/phpunit.xml
new file mode 100644 (file)
index 0000000..c1441fd
--- /dev/null
@@ -0,0 +1,7 @@
+<phpunit bootstrap="vendor/autoload.php">
+    <testsuites>
+        <testsuite name="SlimSkeleton">
+            <directory>tests</directory>
+        </testsuite>
+    </testsuites>
+</phpunit>
\ No newline at end of file
diff --git a/advancedcontentfilter/vendor/slim/slim-skeleton/public/.htaccess b/advancedcontentfilter/vendor/slim/slim-skeleton/public/.htaccess
new file mode 100644 (file)
index 0000000..f5d1969
--- /dev/null
@@ -0,0 +1,21 @@
+<IfModule mod_rewrite.c>
+  RewriteEngine On
+
+  # Some hosts may require you to use the `RewriteBase` directive.
+  # Determine the RewriteBase automatically and set it as environment variable.
+  # If you are using Apache aliases to do mass virtual hosting or installed the
+  # project in a subdirectory, the base path will be prepended to allow proper
+  # resolution of the index.php file and to redirect to the correct URI. It will
+  # work in environments without path prefix as well, providing a safe, one-size
+  # fits all solution. But as you do not need it in this case, you can comment
+  # the following 2 lines to eliminate the overhead.
+  RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$
+  RewriteRule ^(.*) - [E=BASE:%1]
+  
+  # If the above doesn't work you might need to set the `RewriteBase` directive manually, it should be the
+  # absolute physical path to the directory that contains this htaccess file.
+  # RewriteBase /
+
+  RewriteCond %{REQUEST_FILENAME} !-f
+  RewriteRule ^ index.php [QSA,L]
+</IfModule>
diff --git a/advancedcontentfilter/vendor/slim/slim-skeleton/public/index.php b/advancedcontentfilter/vendor/slim/slim-skeleton/public/index.php
new file mode 100644 (file)
index 0000000..2784ee0
--- /dev/null
@@ -0,0 +1,30 @@
+<?php
+if (PHP_SAPI == 'cli-server') {
+    // To help the built-in PHP dev server, check if the request was actually for
+    // something which should probably be served as a static file
+    $url  = parse_url($_SERVER['REQUEST_URI']);
+    $file = __DIR__ . $url['path'];
+    if (is_file($file)) {
+        return false;
+    }
+}
+
+require __DIR__ . '/../vendor/autoload.php';
+
+session_start();
+
+// Instantiate the app
+$settings = require __DIR__ . '/../src/settings.php';
+$app = new \Slim\App($settings);
+
+// Set up dependencies
+require __DIR__ . '/../src/dependencies.php';
+
+// Register middleware
+require __DIR__ . '/../src/middleware.php';
+
+// Register routes
+require __DIR__ . '/../src/routes.php';
+
+// Run app
+$app->run();
diff --git a/advancedcontentfilter/vendor/slim/slim-skeleton/src/dependencies.php b/advancedcontentfilter/vendor/slim/slim-skeleton/src/dependencies.php
new file mode 100644 (file)
index 0000000..4c20bf8
--- /dev/null
@@ -0,0 +1,19 @@
+<?php
+// DIC configuration
+
+$container = $app->getContainer();
+
+// view renderer
+$container['renderer'] = function ($c) {
+    $settings = $c->get('settings')['renderer'];
+    return new Slim\Views\PhpRenderer($settings['template_path']);
+};
+
+// monolog
+$container['logger'] = function ($c) {
+    $settings = $c->get('settings')['logger'];
+    $logger = new Monolog\Logger($settings['name']);
+    $logger->pushProcessor(new Monolog\Processor\UidProcessor());
+    $logger->pushHandler(new Monolog\Handler\StreamHandler($settings['path'], $settings['level']));
+    return $logger;
+};
diff --git a/advancedcontentfilter/vendor/slim/slim-skeleton/src/middleware.php b/advancedcontentfilter/vendor/slim/slim-skeleton/src/middleware.php
new file mode 100644 (file)
index 0000000..116a0ff
--- /dev/null
@@ -0,0 +1,4 @@
+<?php
+// Application middleware
+
+// e.g: $app->add(new \Slim\Csrf\Guard);
diff --git a/advancedcontentfilter/vendor/slim/slim-skeleton/src/routes.php b/advancedcontentfilter/vendor/slim/slim-skeleton/src/routes.php
new file mode 100644 (file)
index 0000000..9363ec6
--- /dev/null
@@ -0,0 +1,14 @@
+<?php
+
+use Slim\Http\Request;
+use Slim\Http\Response;
+
+// Routes
+
+$app->get('/[{name}]', function (Request $request, Response $response, array $args) {
+    // Sample log message
+    $this->logger->info("Slim-Skeleton '/' route");
+
+    // Render index view
+    return $this->renderer->render($response, 'index.phtml', $args);
+});
diff --git a/advancedcontentfilter/vendor/slim/slim-skeleton/src/settings.php b/advancedcontentfilter/vendor/slim/slim-skeleton/src/settings.php
new file mode 100644 (file)
index 0000000..2346883
--- /dev/null
@@ -0,0 +1,19 @@
+<?php
+return [
+    'settings' => [
+        'displayErrorDetails' => true, // set to false in production
+        'addContentLengthHeader' => false, // Allow the web server to send the content-length header
+
+        // Renderer settings
+        'renderer' => [
+            'template_path' => __DIR__ . '/../templates/',
+        ],
+
+        // Monolog settings
+        'logger' => [
+            'name' => 'slim-app',
+            'path' => isset($_ENV['docker']) ? 'php://stdout' : __DIR__ . '/../logs/app.log',
+            'level' => \Monolog\Logger::DEBUG,
+        ],
+    ],
+];
diff --git a/advancedcontentfilter/vendor/slim/slim-skeleton/templates/index.phtml b/advancedcontentfilter/vendor/slim/slim-skeleton/templates/index.phtml
new file mode 100644 (file)
index 0000000..ea58714
--- /dev/null
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<html>
+    <head>
+        <meta charset="utf-8"/>
+        <title>Slim 3</title>
+        <link href='//fonts.googleapis.com/css?family=Lato:300' rel='stylesheet' type='text/css'>
+        <style>
+            body {
+                margin: 50px 0 0 0;
+                padding: 0;
+                width: 100%;
+                font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+                text-align: center;
+                color: #aaa;
+                font-size: 18px;
+            }
+
+            h1 {
+                color: #719e40;
+                letter-spacing: -3px;
+                font-family: 'Lato', sans-serif;
+                font-size: 100px;
+                font-weight: 200;
+                margin-bottom: 0;
+            }
+        </style>
+    </head>
+    <body>
+        <h1>Slim</h1>
+        <div>a microframework for PHP</div>
+
+        <?php if (isset($name)) : ?>
+            <h2>Hello <?= htmlspecialchars($name); ?>!</h2>
+        <?php else: ?>
+            <p>Try <a href="http://www.slimframework.com">SlimFramework</a></p>
+        <?php endif; ?>
+    </body>
+</html>
diff --git a/advancedcontentfilter/vendor/slim/slim-skeleton/tests/Functional/BaseTestCase.php b/advancedcontentfilter/vendor/slim/slim-skeleton/tests/Functional/BaseTestCase.php
new file mode 100644 (file)
index 0000000..095d8da
--- /dev/null
@@ -0,0 +1,77 @@
+<?php
+
+namespace Tests\Functional;
+
+use Slim\App;
+use Slim\Http\Request;
+use Slim\Http\Response;
+use Slim\Http\Environment;
+
+/**
+ * This is an example class that shows how you could set up a method that
+ * runs the application. Note that it doesn't cover all use-cases and is
+ * tuned to the specifics of this skeleton app, so if your needs are
+ * different, you'll need to change it.
+ */
+class BaseTestCase extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * Use middleware when running application?
+     *
+     * @var bool
+     */
+    protected $withMiddleware = true;
+
+    /**
+     * Process the application given a request method and URI
+     *
+     * @param string $requestMethod the request method (e.g. GET, POST, etc.)
+     * @param string $requestUri the request URI
+     * @param array|object|null $requestData the request data
+     * @return \Slim\Http\Response
+     */
+    public function runApp($requestMethod, $requestUri, $requestData = null)
+    {
+        // Create a mock environment for testing with
+        $environment = Environment::mock(
+            [
+                'REQUEST_METHOD' => $requestMethod,
+                'REQUEST_URI' => $requestUri
+            ]
+        );
+
+        // Set up a request object based on the environment
+        $request = Request::createFromEnvironment($environment);
+
+        // Add request data, if it exists
+        if (isset($requestData)) {
+            $request = $request->withParsedBody($requestData);
+        }
+
+        // Set up a response object
+        $response = new Response();
+
+        // Use the application settings
+        $settings = require __DIR__ . '/../../src/settings.php';
+
+        // Instantiate the application
+        $app = new App($settings);
+
+        // Set up dependencies
+        require __DIR__ . '/../../src/dependencies.php';
+
+        // Register middleware
+        if ($this->withMiddleware) {
+            require __DIR__ . '/../../src/middleware.php';
+        }
+
+        // Register routes
+        require __DIR__ . '/../../src/routes.php';
+
+        // Process the application
+        $response = $app->process($request, $response);
+
+        // Return the response
+        return $response;
+    }
+}
diff --git a/advancedcontentfilter/vendor/slim/slim-skeleton/tests/Functional/HomepageTest.php b/advancedcontentfilter/vendor/slim/slim-skeleton/tests/Functional/HomepageTest.php
new file mode 100644 (file)
index 0000000..17caf91
--- /dev/null
@@ -0,0 +1,40 @@
+<?php
+
+namespace Tests\Functional;
+
+class HomepageTest extends BaseTestCase
+{
+    /**
+     * Test that the index route returns a rendered response containing the text 'SlimFramework' but not a greeting
+     */
+    public function testGetHomepageWithoutName()
+    {
+        $response = $this->runApp('GET', '/');
+
+        $this->assertEquals(200, $response->getStatusCode());
+        $this->assertContains('SlimFramework', (string)$response->getBody());
+        $this->assertNotContains('Hello', (string)$response->getBody());
+    }
+
+    /**
+     * Test that the index route with optional name argument returns a rendered greeting
+     */
+    public function testGetHomepageWithGreeting()
+    {
+        $response = $this->runApp('GET', '/name');
+
+        $this->assertEquals(200, $response->getStatusCode());
+        $this->assertContains('Hello name!', (string)$response->getBody());
+    }
+
+    /**
+     * Test that the index route won't accept a post request
+     */
+    public function testPostHomepageNotAllowed()
+    {
+        $response = $this->runApp('POST', '/', ['test']);
+
+        $this->assertEquals(405, $response->getStatusCode());
+        $this->assertContains('Method not allowed', (string)$response->getBody());
+    }
+}
\ No newline at end of file
diff --git a/advancedcontentfilter/vendor/slim/slim/LICENSE.md b/advancedcontentfilter/vendor/slim/slim/LICENSE.md
new file mode 100644 (file)
index 0000000..682c21d
--- /dev/null
@@ -0,0 +1,19 @@
+Copyright (c) 2011-2017 Josh Lockhart
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is furnished
+to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/advancedcontentfilter/vendor/slim/slim/Slim/App.php b/advancedcontentfilter/vendor/slim/slim/Slim/App.php
new file mode 100644 (file)
index 0000000..c5a0f2d
--- /dev/null
@@ -0,0 +1,696 @@
+<?php
+/**
+ * Slim Framework (https://slimframework.com)
+ *
+ * @link      https://github.com/slimphp/Slim
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
+ * @license   https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
+ */
+namespace Slim;
+
+use Exception;
+use Slim\Exception\InvalidMethodException;
+use Slim\Http\Response;
+use Throwable;
+use Closure;
+use InvalidArgumentException;
+use Psr\Http\Message\RequestInterface;
+use Psr\Http\Message\ServerRequestInterface;
+use Psr\Http\Message\ResponseInterface;
+use Psr\Container\ContainerInterface;
+use FastRoute\Dispatcher;
+use Slim\Exception\SlimException;
+use Slim\Exception\MethodNotAllowedException;
+use Slim\Exception\NotFoundException;
+use Slim\Http\Uri;
+use Slim\Http\Headers;
+use Slim\Http\Body;
+use Slim\Http\Request;
+use Slim\Interfaces\Http\EnvironmentInterface;
+use Slim\Interfaces\RouteGroupInterface;
+use Slim\Interfaces\RouteInterface;
+use Slim\Interfaces\RouterInterface;
+
+/**
+ * App
+ *
+ * This is the primary class with which you instantiate,
+ * configure, and run a Slim Framework application.
+ * The \Slim\App class also accepts Slim Framework middleware.
+ *
+ * @property-read callable $errorHandler
+ * @property-read callable $phpErrorHandler
+ * @property-read callable $notFoundHandler function($request, $response)
+ * @property-read callable $notAllowedHandler function($request, $response, $allowedHttpMethods)
+ */
+class App
+{
+    use MiddlewareAwareTrait;
+
+    /**
+     * Current version
+     *
+     * @var string
+     */
+    const VERSION = '3.9.2';
+
+    /**
+     * Container
+     *
+     * @var ContainerInterface
+     */
+    private $container;
+
+    /********************************************************************************
+     * Constructor
+     *******************************************************************************/
+
+    /**
+     * Create new application
+     *
+     * @param ContainerInterface|array $container Either a ContainerInterface or an associative array of app settings
+     * @throws InvalidArgumentException when no container is provided that implements ContainerInterface
+     */
+    public function __construct($container = [])
+    {
+        if (is_array($container)) {
+            $container = new Container($container);
+        }
+        if (!$container instanceof ContainerInterface) {
+            throw new InvalidArgumentException('Expected a ContainerInterface');
+        }
+        $this->container = $container;
+    }
+
+    /**
+     * Enable access to the DI container by consumers of $app
+     *
+     * @return ContainerInterface
+     */
+    public function getContainer()
+    {
+        return $this->container;
+    }
+
+    /**
+     * Add middleware
+     *
+     * This method prepends new middleware to the app's middleware stack.
+     *
+     * @param  callable|string    $callable The callback routine
+     *
+     * @return static
+     */
+    public function add($callable)
+    {
+        return $this->addMiddleware(new DeferredCallable($callable, $this->container));
+    }
+
+    /**
+     * Calling a non-existant method on App checks to see if there's an item
+     * in the container that is callable and if so, calls it.
+     *
+     * @param  string $method
+     * @param  array $args
+     * @return mixed
+     */
+    public function __call($method, $args)
+    {
+        if ($this->container->has($method)) {
+            $obj = $this->container->get($method);
+            if (is_callable($obj)) {
+                return call_user_func_array($obj, $args);
+            }
+        }
+
+        throw new \BadMethodCallException("Method $method is not a valid method");
+    }
+
+    /********************************************************************************
+     * Router proxy methods
+     *******************************************************************************/
+
+    /**
+     * Add GET route
+     *
+     * @param  string $pattern  The route URI pattern
+     * @param  callable|string  $callable The route callback routine
+     *
+     * @return \Slim\Interfaces\RouteInterface
+     */
+    public function get($pattern, $callable)
+    {
+        return $this->map(['GET'], $pattern, $callable);
+    }
+
+    /**
+     * Add POST route
+     *
+     * @param  string $pattern  The route URI pattern
+     * @param  callable|string  $callable The route callback routine
+     *
+     * @return \Slim\Interfaces\RouteInterface
+     */
+    public function post($pattern, $callable)
+    {
+        return $this->map(['POST'], $pattern, $callable);
+    }
+
+    /**
+     * Add PUT route
+     *
+     * @param  string $pattern  The route URI pattern
+     * @param  callable|string  $callable The route callback routine
+     *
+     * @return \Slim\Interfaces\RouteInterface
+     */
+    public function put($pattern, $callable)
+    {
+        return $this->map(['PUT'], $pattern, $callable);
+    }
+
+    /**
+     * Add PATCH route
+     *
+     * @param  string $pattern  The route URI pattern
+     * @param  callable|string  $callable The route callback routine
+     *
+     * @return \Slim\Interfaces\RouteInterface
+     */
+    public function patch($pattern, $callable)
+    {
+        return $this->map(['PATCH'], $pattern, $callable);
+    }
+
+    /**
+     * Add DELETE route
+     *
+     * @param  string $pattern  The route URI pattern
+     * @param  callable|string  $callable The route callback routine
+     *
+     * @return \Slim\Interfaces\RouteInterface
+     */
+    public function delete($pattern, $callable)
+    {
+        return $this->map(['DELETE'], $pattern, $callable);
+    }
+
+    /**
+     * Add OPTIONS route
+     *
+     * @param  string $pattern  The route URI pattern
+     * @param  callable|string  $callable The route callback routine
+     *
+     * @return \Slim\Interfaces\RouteInterface
+     */
+    public function options($pattern, $callable)
+    {
+        return $this->map(['OPTIONS'], $pattern, $callable);
+    }
+
+    /**
+     * Add route for any HTTP method
+     *
+     * @param  string $pattern  The route URI pattern
+     * @param  callable|string  $callable The route callback routine
+     *
+     * @return \Slim\Interfaces\RouteInterface
+     */
+    public function any($pattern, $callable)
+    {
+        return $this->map(['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS'], $pattern, $callable);
+    }
+
+    /**
+     * Add route with multiple methods
+     *
+     * @param  string[] $methods  Numeric array of HTTP method names
+     * @param  string   $pattern  The route URI pattern
+     * @param  callable|string    $callable The route callback routine
+     *
+     * @return RouteInterface
+     */
+    public function map(array $methods, $pattern, $callable)
+    {
+        if ($callable instanceof Closure) {
+            $callable = $callable->bindTo($this->container);
+        }
+
+        $route = $this->container->get('router')->map($methods, $pattern, $callable);
+        if (is_callable([$route, 'setContainer'])) {
+            $route->setContainer($this->container);
+        }
+
+        if (is_callable([$route, 'setOutputBuffering'])) {
+            $route->setOutputBuffering($this->container->get('settings')['outputBuffering']);
+        }
+
+        return $route;
+    }
+
+    /**
+     * Route Groups
+     *
+     * This method accepts a route pattern and a callback. All route
+     * declarations in the callback will be prepended by the group(s)
+     * that it is in.
+     *
+     * @param string   $pattern
+     * @param callable $callable
+     *
+     * @return RouteGroupInterface
+     */
+    public function group($pattern, $callable)
+    {
+        /** @var RouteGroup $group */
+        $group = $this->container->get('router')->pushGroup($pattern, $callable);
+        $group->setContainer($this->container);
+        $group($this);
+        $this->container->get('router')->popGroup();
+        return $group;
+    }
+
+    /********************************************************************************
+     * Runner
+     *******************************************************************************/
+
+    /**
+     * Run application
+     *
+     * This method traverses the application middleware stack and then sends the
+     * resultant Response object to the HTTP client.
+     *
+     * @param bool|false $silent
+     * @return ResponseInterface
+     *
+     * @throws Exception
+     * @throws MethodNotAllowedException
+     * @throws NotFoundException
+     */
+    public function run($silent = false)
+    {
+        $response = $this->container->get('response');
+
+        try {
+            ob_start();
+            $response = $this->process($this->container->get('request'), $response);
+        } catch (InvalidMethodException $e) {
+            $response = $this->processInvalidMethod($e->getRequest(), $response);
+        } finally {
+            $output = ob_get_clean();
+        }
+
+        if (!empty($output) && $response->getBody()->isWritable()) {
+            $outputBuffering = $this->container->get('settings')['outputBuffering'];
+            if ($outputBuffering === 'prepend') {
+                // prepend output buffer content
+                $body = new Http\Body(fopen('php://temp', 'r+'));
+                $body->write($output . $response->getBody());
+                $response = $response->withBody($body);
+            } elseif ($outputBuffering === 'append') {
+                // append output buffer content
+                $response->getBody()->write($output);
+            }
+        }
+
+        $response = $this->finalize($response);
+
+        if (!$silent) {
+            $this->respond($response);
+        }
+
+        return $response;
+    }
+
+    /**
+     * Pull route info for a request with a bad method to decide whether to
+     * return a not-found error (default) or a bad-method error, then run
+     * the handler for that error, returning the resulting response.
+     *
+     * Used for cases where an incoming request has an unrecognized method,
+     * rather than throwing an exception and not catching it all the way up.
+     *
+     * @param ServerRequestInterface $request
+     * @param ResponseInterface $response
+     * @return ResponseInterface
+     */
+    protected function processInvalidMethod(ServerRequestInterface $request, ResponseInterface $response)
+    {
+        $router = $this->container->get('router');
+        if (is_callable([$request->getUri(), 'getBasePath']) && is_callable([$router, 'setBasePath'])) {
+            $router->setBasePath($request->getUri()->getBasePath());
+        }
+
+        $request = $this->dispatchRouterAndPrepareRoute($request, $router);
+        $routeInfo = $request->getAttribute('routeInfo', [RouterInterface::DISPATCH_STATUS => Dispatcher::NOT_FOUND]);
+
+        if ($routeInfo[RouterInterface::DISPATCH_STATUS] === Dispatcher::METHOD_NOT_ALLOWED) {
+            return $this->handleException(
+                new MethodNotAllowedException($request, $response, $routeInfo[RouterInterface::ALLOWED_METHODS]),
+                $request,
+                $response
+            );
+        }
+
+        return $this->handleException(new NotFoundException($request, $response), $request, $response);
+    }
+
+    /**
+     * Process a request
+     *
+     * This method traverses the application middleware stack and then returns the
+     * resultant Response object.
+     *
+     * @param ServerRequestInterface $request
+     * @param ResponseInterface $response
+     * @return ResponseInterface
+     *
+     * @throws Exception
+     * @throws MethodNotAllowedException
+     * @throws NotFoundException
+     */
+    public function process(ServerRequestInterface $request, ResponseInterface $response)
+    {
+        // Ensure basePath is set
+        $router = $this->container->get('router');
+        if (is_callable([$request->getUri(), 'getBasePath']) && is_callable([$router, 'setBasePath'])) {
+            $router->setBasePath($request->getUri()->getBasePath());
+        }
+
+        // Dispatch the Router first if the setting for this is on
+        if ($this->container->get('settings')['determineRouteBeforeAppMiddleware'] === true) {
+            // Dispatch router (note: you won't be able to alter routes after this)
+            $request = $this->dispatchRouterAndPrepareRoute($request, $router);
+        }
+
+        // Traverse middleware stack
+        try {
+            $response = $this->callMiddlewareStack($request, $response);
+        } catch (Exception $e) {
+            $response = $this->handleException($e, $request, $response);
+        } catch (Throwable $e) {
+            $response = $this->handlePhpError($e, $request, $response);
+        }
+
+        return $response;
+    }
+
+    /**
+     * Send the response to the client
+     *
+     * @param ResponseInterface $response
+     */
+    public function respond(ResponseInterface $response)
+    {
+        // Send response
+        if (!headers_sent()) {
+            // Headers
+            foreach ($response->getHeaders() as $name => $values) {
+                foreach ($values as $value) {
+                    header(sprintf('%s: %s', $name, $value), false);
+                }
+            }
+
+            // Set the status _after_ the headers, because of PHP's "helpful" behavior with location headers.
+            // See https://github.com/slimphp/Slim/issues/1730
+
+            // Status
+            header(sprintf(
+                'HTTP/%s %s %s',
+                $response->getProtocolVersion(),
+                $response->getStatusCode(),
+                $response->getReasonPhrase()
+            ));
+        }
+
+        // Body
+        if (!$this->isEmptyResponse($response)) {
+            $body = $response->getBody();
+            if ($body->isSeekable()) {
+                $body->rewind();
+            }
+            $settings       = $this->container->get('settings');
+            $chunkSize      = $settings['responseChunkSize'];
+
+            $contentLength  = $response->getHeaderLine('Content-Length');
+            if (!$contentLength) {
+                $contentLength = $body->getSize();
+            }
+
+
+            if (isset($contentLength)) {
+                $amountToRead = $contentLength;
+                while ($amountToRead > 0 && !$body->eof()) {
+                    $data = $body->read(min($chunkSize, $amountToRead));
+                    echo $data;
+
+                    $amountToRead -= strlen($data);
+
+                    if (connection_status() != CONNECTION_NORMAL) {
+                        break;
+                    }
+                }
+            } else {
+                while (!$body->eof()) {
+                    echo $body->read($chunkSize);
+                    if (connection_status() != CONNECTION_NORMAL) {
+                        break;
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * Invoke application
+     *
+     * This method implements the middleware interface. It receives
+     * Request and Response objects, and it returns a Response object
+     * after compiling the routes registered in the Router and dispatching
+     * the Request object to the appropriate Route callback routine.
+     *
+     * @param  ServerRequestInterface $request  The most recent Request object
+     * @param  ResponseInterface      $response The most recent Response object
+     *
+     * @return ResponseInterface
+     * @throws MethodNotAllowedException
+     * @throws NotFoundException
+     */
+    public function __invoke(ServerRequestInterface $request, ResponseInterface $response)
+    {
+        // Get the route info
+        $routeInfo = $request->getAttribute('routeInfo');
+
+        /** @var \Slim\Interfaces\RouterInterface $router */
+        $router = $this->container->get('router');
+
+        // If router hasn't been dispatched or the URI changed then dispatch
+        if (null === $routeInfo || ($routeInfo['request'] !== [$request->getMethod(), (string) $request->getUri()])) {
+            $request = $this->dispatchRouterAndPrepareRoute($request, $router);
+            $routeInfo = $request->getAttribute('routeInfo');
+        }
+
+        if ($routeInfo[0] === Dispatcher::FOUND) {
+            $route = $router->lookupRoute($routeInfo[1]);
+            return $route->run($request, $response);
+        } elseif ($routeInfo[0] === Dispatcher::METHOD_NOT_ALLOWED) {
+            if (!$this->container->has('notAllowedHandler')) {
+                throw new MethodNotAllowedException($request, $response, $routeInfo[1]);
+            }
+            /** @var callable $notAllowedHandler */
+            $notAllowedHandler = $this->container->get('notAllowedHandler');
+            return $notAllowedHandler($request, $response, $routeInfo[1]);
+        }
+
+        if (!$this->container->has('notFoundHandler')) {
+            throw new NotFoundException($request, $response);
+        }
+        /** @var callable $notFoundHandler */
+        $notFoundHandler = $this->container->get('notFoundHandler');
+        return $notFoundHandler($request, $response);
+    }
+
+    /**
+     * Perform a sub-request from within an application route
+     *
+     * This method allows you to prepare and initiate a sub-request, run within
+     * the context of the current request. This WILL NOT issue a remote HTTP
+     * request. Instead, it will route the provided URL, method, headers,
+     * cookies, body, and server variables against the set of registered
+     * application routes. The result response object is returned.
+     *
+     * @param  string            $method      The request method (e.g., GET, POST, PUT, etc.)
+     * @param  string            $path        The request URI path
+     * @param  string            $query       The request URI query string
+     * @param  array             $headers     The request headers (key-value array)
+     * @param  array             $cookies     The request cookies (key-value array)
+     * @param  string            $bodyContent The request body
+     * @param  ResponseInterface $response     The response object (optional)
+     * @return ResponseInterface
+     */
+    public function subRequest(
+        $method,
+        $path,
+        $query = '',
+        array $headers = [],
+        array $cookies = [],
+        $bodyContent = '',
+        ResponseInterface $response = null
+    ) {
+        $env = $this->container->get('environment');
+        $uri = Uri::createFromEnvironment($env)->withPath($path)->withQuery($query);
+        $headers = new Headers($headers);
+        $serverParams = $env->all();
+        $body = new Body(fopen('php://temp', 'r+'));
+        $body->write($bodyContent);
+        $body->rewind();
+        $request = new Request($method, $uri, $headers, $cookies, $serverParams, $body);
+
+        if (!$response) {
+            $response = $this->container->get('response');
+        }
+
+        return $this($request, $response);
+    }
+
+    /**
+     * Dispatch the router to find the route. Prepare the route for use.
+     *
+     * @param ServerRequestInterface $request
+     * @param RouterInterface        $router
+     * @return ServerRequestInterface
+     */
+    protected function dispatchRouterAndPrepareRoute(ServerRequestInterface $request, RouterInterface $router)
+    {
+        $routeInfo = $router->dispatch($request);
+
+        if ($routeInfo[0] === Dispatcher::FOUND) {
+            $routeArguments = [];
+            foreach ($routeInfo[2] as $k => $v) {
+                $routeArguments[$k] = urldecode($v);
+            }
+
+            $route = $router->lookupRoute($routeInfo[1]);
+            $route->prepare($request, $routeArguments);
+
+            // add route to the request's attributes in case a middleware or handler needs access to the route
+            $request = $request->withAttribute('route', $route);
+        }
+
+        $routeInfo['request'] = [$request->getMethod(), (string) $request->getUri()];
+
+        return $request->withAttribute('routeInfo', $routeInfo);
+    }
+
+    /**
+     * Finalize response
+     *
+     * @param ResponseInterface $response
+     * @return ResponseInterface
+     */
+    protected function finalize(ResponseInterface $response)
+    {
+        // stop PHP sending a Content-Type automatically
+        ini_set('default_mimetype', '');
+
+        if ($this->isEmptyResponse($response)) {
+            return $response->withoutHeader('Content-Type')->withoutHeader('Content-Length');
+        }
+
+        // Add Content-Length header if `addContentLengthHeader` setting is set
+        if (isset($this->container->get('settings')['addContentLengthHeader']) &&
+            $this->container->get('settings')['addContentLengthHeader'] == true) {
+            if (ob_get_length() > 0) {
+                throw new \RuntimeException("Unexpected data in output buffer. " .
+                    "Maybe you have characters before an opening <?php tag?");
+            }
+            $size = $response->getBody()->getSize();
+            if ($size !== null && !$response->hasHeader('Content-Length')) {
+                $response = $response->withHeader('Content-Length', (string) $size);
+            }
+        }
+
+        return $response;
+    }
+
+    /**
+     * Helper method, which returns true if the provided response must not output a body and false
+     * if the response could have a body.
+     *
+     * @see https://tools.ietf.org/html/rfc7231
+     *
+     * @param ResponseInterface $response
+     * @return bool
+     */
+    protected function isEmptyResponse(ResponseInterface $response)
+    {
+        if (method_exists($response, 'isEmpty')) {
+            return $response->isEmpty();
+        }
+
+        return in_array($response->getStatusCode(), [204, 205, 304]);
+    }
+
+    /**
+     * Call relevant handler from the Container if needed. If it doesn't exist,
+     * then just re-throw.
+     *
+     * @param  Exception $e
+     * @param  ServerRequestInterface $request
+     * @param  ResponseInterface $response
+     *
+     * @return ResponseInterface
+     * @throws Exception if a handler is needed and not found
+     */
+    protected function handleException(Exception $e, ServerRequestInterface $request, ResponseInterface $response)
+    {
+        if ($e instanceof MethodNotAllowedException) {
+            $handler = 'notAllowedHandler';
+            $params = [$e->getRequest(), $e->getResponse(), $e->getAllowedMethods()];
+        } elseif ($e instanceof NotFoundException) {
+            $handler = 'notFoundHandler';
+            $params = [$e->getRequest(), $e->getResponse(), $e];
+        } elseif ($e instanceof SlimException) {
+            // This is a Stop exception and contains the response
+            return $e->getResponse();
+        } else {
+            // Other exception, use $request and $response params
+            $handler = 'errorHandler';
+            $params = [$request, $response, $e];
+        }
+
+        if ($this->container->has($handler)) {
+            $callable = $this->container->get($handler);
+            // Call the registered handler
+            return call_user_func_array($callable, $params);
+        }
+
+        // No handlers found, so just throw the exception
+        throw $e;
+    }
+
+    /**
+     * Call relevant handler from the Container if needed. If it doesn't exist,
+     * then just re-throw.
+     *
+     * @param  Throwable $e
+     * @param  ServerRequestInterface $request
+     * @param  ResponseInterface $response
+     * @return ResponseInterface
+     * @throws Throwable
+     */
+    protected function handlePhpError(Throwable $e, ServerRequestInterface $request, ResponseInterface $response)
+    {
+        $handler = 'phpErrorHandler';
+        $params = [$request, $response, $e];
+
+        if ($this->container->has($handler)) {
+            $callable = $this->container->get($handler);
+            // Call the registered handler
+            return call_user_func_array($callable, $params);
+        }
+
+        // No handlers found, so just throw the exception
+        throw $e;
+    }
+}
diff --git a/advancedcontentfilter/vendor/slim/slim/Slim/CallableResolver.php b/advancedcontentfilter/vendor/slim/slim/Slim/CallableResolver.php
new file mode 100644 (file)
index 0000000..2211a32
--- /dev/null
@@ -0,0 +1,110 @@
+<?php
+/**
+ * Slim Framework (https://slimframework.com)
+ *
+ * @link      https://github.com/slimphp/Slim
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
+ * @license   https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
+ */
+namespace Slim;
+
+use RuntimeException;
+use Psr\Container\ContainerInterface;
+use Slim\Interfaces\CallableResolverInterface;
+
+/**
+ * This class resolves a string of the format 'class:method' into a closure
+ * that can be dispatched.
+ */
+final class CallableResolver implements CallableResolverInterface
+{
+    const CALLABLE_PATTERN = '!^([^\:]+)\:([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)$!';
+
+    /**
+     * @var ContainerInterface
+     */
+    private $container;
+
+    /**
+     * @param ContainerInterface $container
+     */
+    public function __construct(ContainerInterface $container)
+    {
+        $this->container = $container;
+    }
+
+    /**
+     * Resolve toResolve into a closure so that the router can dispatch.
+     *
+     * If toResolve is of the format 'class:method', then try to extract 'class'
+     * from the container otherwise instantiate it and then dispatch 'method'.
+     *
+     * @param mixed $toResolve
+     *
+     * @return callable
+     *
+     * @throws RuntimeException if the callable does not exist
+     * @throws RuntimeException if the callable is not resolvable
+     */
+    public function resolve($toResolve)
+    {
+        if (is_callable($toResolve)) {
+            return $toResolve;
+        }
+
+        if (!is_string($toResolve)) {
+            $this->assertCallable($toResolve);
+        }
+
+        // check for slim callable as "class:method"
+        if (preg_match(self::CALLABLE_PATTERN, $toResolve, $matches)) {
+            $resolved = $this->resolveCallable($matches[1], $matches[2]);
+            $this->assertCallable($resolved);
+
+            return $resolved;
+        }
+
+        $resolved = $this->resolveCallable($toResolve);
+        $this->assertCallable($resolved);
+
+        return $resolved;
+    }
+
+    /**
+     * Check if string is something in the DIC
+     * that's callable or is a class name which has an __invoke() method.
+     *
+     * @param string $class
+     * @param string $method
+     * @return callable
+     *
+     * @throws \RuntimeException if the callable does not exist
+     */
+    protected function resolveCallable($class, $method = '__invoke')
+    {
+        if ($this->container->has($class)) {
+            return [$this->container->get($class), $method];
+        }
+
+        if (!class_exists($class)) {
+            throw new RuntimeException(sprintf('Callable %s does not exist', $class));
+        }
+
+        return [new $class($this->container), $method];
+    }
+
+    /**
+     * @param Callable $callable
+     *
+     * @throws \RuntimeException if the callable is not resolvable
+     */
+    protected function assertCallable($callable)
+    {
+        if (!is_callable($callable)) {
+            throw new RuntimeException(sprintf(
+                '%s is not resolvable',
+                is_array($callable) || is_object($callable) ? json_encode($callable) : $callable
+            ));
+        }
+    }
+}
diff --git a/advancedcontentfilter/vendor/slim/slim/Slim/CallableResolverAwareTrait.php b/advancedcontentfilter/vendor/slim/slim/Slim/CallableResolverAwareTrait.php
new file mode 100644 (file)
index 0000000..ffb4eb2
--- /dev/null
@@ -0,0 +1,47 @@
+<?php
+/**
+ * Slim Framework (https://slimframework.com)
+ *
+ * @link      https://github.com/slimphp/Slim
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
+ * @license   https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
+ */
+namespace Slim;
+
+use RuntimeException;
+use Psr\Container\ContainerInterface;
+use Slim\Interfaces\CallableResolverInterface;
+
+/**
+ * ResolveCallable
+ *
+ * This is an internal class that enables resolution of 'class:method' strings
+ * into a closure. This class is an implementation detail and is used only inside
+ * of the Slim application.
+ *
+ * @property ContainerInterface $container
+ */
+trait CallableResolverAwareTrait
+{
+    /**
+     * Resolve a string of the format 'class:method' into a closure that the
+     * router can dispatch.
+     *
+     * @param callable|string $callable
+     *
+     * @return \Closure
+     *
+     * @throws RuntimeException If the string cannot be resolved as a callable
+     */
+    protected function resolveCallable($callable)
+    {
+        if (!$this->container instanceof ContainerInterface) {
+            return $callable;
+        }
+
+        /** @var CallableResolverInterface $resolver */
+        $resolver = $this->container->get('callableResolver');
+
+        return $resolver->resolve($callable);
+    }
+}
diff --git a/advancedcontentfilter/vendor/slim/slim/Slim/Collection.php b/advancedcontentfilter/vendor/slim/slim/Slim/Collection.php
new file mode 100644 (file)
index 0000000..728bb73
--- /dev/null
@@ -0,0 +1,202 @@
+<?php
+/**
+ * Slim Framework (https://slimframework.com)
+ *
+ * @link      https://github.com/slimphp/Slim
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
+ * @license   https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
+ */
+namespace Slim;
+
+use ArrayIterator;
+use Slim\Interfaces\CollectionInterface;
+
+/**
+ * Collection
+ *
+ * This class provides a common interface used by many other
+ * classes in a Slim application that manage "collections"
+ * of data that must be inspected and/or manipulated
+ */
+class Collection implements CollectionInterface
+{
+    /**
+     * The source data
+     *
+     * @var array
+     */
+    protected $data = [];
+
+    /**
+     * Create new collection
+     *
+     * @param array $items Pre-populate collection with this key-value array
+     */
+    public function __construct(array $items = [])
+    {
+        $this->replace($items);
+    }
+
+    /********************************************************************************
+     * Collection interface
+     *******************************************************************************/
+
+    /**
+     * Set collection item
+     *
+     * @param string $key   The data key
+     * @param mixed  $value The data value
+     */
+    public function set($key, $value)
+    {
+        $this->data[$key] = $value;
+    }
+
+    /**
+     * Get collection item for key
+     *
+     * @param string $key     The data key
+     * @param mixed  $default The default value to return if data key does not exist
+     *
+     * @return mixed The key's value, or the default value
+     */
+    public function get($key, $default = null)
+    {
+        return $this->has($key) ? $this->data[$key] : $default;
+    }
+
+    /**
+     * Add item to collection, replacing existing items with the same data key
+     *
+     * @param array $items Key-value array of data to append to this collection
+     */
+    public function replace(array $items)
+    {
+        foreach ($items as $key => $value) {
+            $this->set($key, $value);
+        }
+    }
+
+    /**
+     * Get all items in collection
+     *
+     * @return array The collection's source data
+     */
+    public function all()
+    {
+        return $this->data;
+    }
+
+    /**
+     * Get collection keys
+     *
+     * @return array The collection's source data keys
+     */
+    public function keys()
+    {
+        return array_keys($this->data);
+    }
+
+    /**
+     * Does this collection have a given key?
+     *
+     * @param string $key The data key
+     *
+     * @return bool
+     */
+    public function has($key)
+    {
+        return array_key_exists($key, $this->data);
+    }
+
+    /**
+     * Remove item from collection
+     *
+     * @param string $key The data key
+     */
+    public function remove($key)
+    {
+        unset($this->data[$key]);
+    }
+
+    /**
+     * Remove all items from collection
+     */
+    public function clear()
+    {
+        $this->data = [];
+    }
+
+    /********************************************************************************
+     * ArrayAccess interface
+     *******************************************************************************/
+
+    /**
+     * Does this collection have a given key?
+     *
+     * @param  string $key The data key
+     *
+     * @return bool
+     */
+    public function offsetExists($key)
+    {
+        return $this->has($key);
+    }
+
+    /**
+     * Get collection item for key
+     *
+     * @param string $key The data key
+     *
+     * @return mixed The key's value, or the default value
+     */
+    public function offsetGet($key)
+    {
+        return $this->get($key);
+    }
+
+    /**
+     * Set collection item
+     *
+     * @param string $key   The data key
+     * @param mixed  $value The data value
+     */
+    public function offsetSet($key, $value)
+    {
+        $this->set($key, $value);
+    }
+
+    /**
+     * Remove item from collection
+     *
+     * @param string $key The data key
+     */
+    public function offsetUnset($key)
+    {
+        $this->remove($key);
+    }
+
+    /**
+     * Get number of items in collection
+     *
+     * @return int
+     */
+    public function count()
+    {
+        return count($this->data);
+    }
+
+    /********************************************************************************
+     * IteratorAggregate interface
+     *******************************************************************************/
+
+    /**
+     * Get collection iterator
+     *
+     * @return \ArrayIterator
+     */
+    public function getIterator()
+    {
+        return new ArrayIterator($this->data);
+    }
+}
diff --git a/advancedcontentfilter/vendor/slim/slim/Slim/Container.php b/advancedcontentfilter/vendor/slim/slim/Slim/Container.php
new file mode 100644 (file)
index 0000000..1f713ac
--- /dev/null
@@ -0,0 +1,179 @@
+<?php
+/**
+ * Slim Framework (https://slimframework.com)
+ *
+ * @link      https://github.com/slimphp/Slim
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
+ * @license   https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
+ */
+namespace Slim;
+
+use Interop\Container\ContainerInterface;
+use Interop\Container\Exception\ContainerException;
+use Pimple\Container as PimpleContainer;
+use Slim\Exception\ContainerValueNotFoundException;
+use Slim\Exception\ContainerException as SlimContainerException;
+
+/**
+ * Slim's default DI container is Pimple.
+ *
+ * Slim\App expects a container that implements Psr\Container\ContainerInterface
+ * with these service keys configured and ready for use:
+ *
+ *  - settings: an array or instance of \ArrayAccess
+ *  - environment: an instance of \Slim\Interfaces\Http\EnvironmentInterface
+ *  - request: an instance of \Psr\Http\Message\ServerRequestInterface
+ *  - response: an instance of \Psr\Http\Message\ResponseInterface
+ *  - router: an instance of \Slim\Interfaces\RouterInterface
+ *  - foundHandler: an instance of \Slim\Interfaces\InvocationStrategyInterface
+ *  - errorHandler: a callable with the signature: function($request, $response, $exception)
+ *  - notFoundHandler: a callable with the signature: function($request, $response)
+ *  - notAllowedHandler: a callable with the signature: function($request, $response, $allowedHttpMethods)
+ *  - callableResolver: an instance of \Slim\Interfaces\CallableResolverInterface
+ *
+ * @property-read array settings
+ * @property-read \Slim\Interfaces\Http\EnvironmentInterface environment
+ * @property-read \Psr\Http\Message\ServerRequestInterface request
+ * @property-read \Psr\Http\Message\ResponseInterface response
+ * @property-read \Slim\Interfaces\RouterInterface router
+ * @property-read \Slim\Interfaces\InvocationStrategyInterface foundHandler
+ * @property-read callable errorHandler
+ * @property-read callable notFoundHandler
+ * @property-read callable notAllowedHandler
+ * @property-read \Slim\Interfaces\CallableResolverInterface callableResolver
+ */
+class Container extends PimpleContainer implements ContainerInterface
+{
+    /**
+     * Default settings
+     *
+     * @var array
+     */
+    private $defaultSettings = [
+        'httpVersion' => '1.1',
+        'responseChunkSize' => 4096,
+        'outputBuffering' => 'append',
+        'determineRouteBeforeAppMiddleware' => false,
+        'displayErrorDetails' => false,
+        'addContentLengthHeader' => true,
+        'routerCacheFile' => false,
+    ];
+
+    /**
+     * Create new container
+     *
+     * @param array $values The parameters or objects.
+     */
+    public function __construct(array $values = [])
+    {
+        parent::__construct($values);
+
+        $userSettings = isset($values['settings']) ? $values['settings'] : [];
+        $this->registerDefaultServices($userSettings);
+    }
+
+    /**
+     * This function registers the default services that Slim needs to work.
+     *
+     * All services are shared - that is, they are registered such that the
+     * same instance is returned on subsequent calls.
+     *
+     * @param array $userSettings Associative array of application settings
+     *
+     * @return void
+     */
+    private function registerDefaultServices($userSettings)
+    {
+        $defaultSettings = $this->defaultSettings;
+
+        /**
+         * This service MUST return an array or an
+         * instance of \ArrayAccess.
+         *
+         * @return array|\ArrayAccess
+         */
+        $this['settings'] = function () use ($userSettings, $defaultSettings) {
+            return new Collection(array_merge($defaultSettings, $userSettings));
+        };
+
+        $defaultProvider = new DefaultServicesProvider();
+        $defaultProvider->register($this);
+    }
+
+    /********************************************************************************
+     * Methods to satisfy Psr\Container\ContainerInterface
+     *******************************************************************************/
+
+    /**
+     * Finds an entry of the container by its identifier and returns it.
+     *
+     * @param string $id Identifier of the entry to look for.
+     *
+     * @throws ContainerValueNotFoundException  No entry was found for this identifier.
+     * @throws ContainerException               Error while retrieving the entry.
+     *
+     * @return mixed Entry.
+     */
+    public function get($id)
+    {
+        if (!$this->offsetExists($id)) {
+            throw new ContainerValueNotFoundException(sprintf('Identifier "%s" is not defined.', $id));
+        }
+        try {
+            return $this->offsetGet($id);
+        } catch (\InvalidArgumentException $exception) {
+            if ($this->exceptionThrownByContainer($exception)) {
+                throw new SlimContainerException(
+                    sprintf('Container error while retrieving "%s"', $id),
+                    null,
+                    $exception
+                );
+            } else {
+                throw $exception;
+            }
+        }
+    }
+
+    /**
+     * Tests whether an exception needs to be recast for compliance with Container-Interop.  This will be if the
+     * exception was thrown by Pimple.
+     *
+     * @param \InvalidArgumentException $exception
+     *
+     * @return bool
+     */
+    private function exceptionThrownByContainer(\InvalidArgumentException $exception)
+    {
+        $trace = $exception->getTrace()[0];
+
+        return $trace['class'] === PimpleContainer::class && $trace['function'] === 'offsetGet';
+    }
+
+    /**
+     * Returns true if the container can return an entry for the given identifier.
+     * Returns false otherwise.
+     *
+     * @param string $id Identifier of the entry to look for.
+     *
+     * @return boolean
+     */
+    public function has($id)
+    {
+        return $this->offsetExists($id);
+    }
+
+
+    /********************************************************************************
+     * Magic methods for convenience
+     *******************************************************************************/
+
+    public function __get($name)
+    {
+        return $this->get($name);
+    }
+
+    public function __isset($name)
+    {
+        return $this->has($name);
+    }
+}
diff --git a/advancedcontentfilter/vendor/slim/slim/Slim/DefaultServicesProvider.php b/advancedcontentfilter/vendor/slim/slim/Slim/DefaultServicesProvider.php
new file mode 100644 (file)
index 0000000..13fe1fb
--- /dev/null
@@ -0,0 +1,211 @@
+<?php
+/**
+ * Slim Framework (https://slimframework.com)
+ *
+ * @link      https://github.com/slimphp/Slim
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
+ * @license   https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
+ */
+namespace Slim;
+
+use Psr\Http\Message\ResponseInterface;
+use Psr\Http\Message\ServerRequestInterface;
+use Slim\Handlers\PhpError;
+use Slim\Handlers\Error;
+use Slim\Handlers\NotFound;
+use Slim\Handlers\NotAllowed;
+use Slim\Handlers\Strategies\RequestResponse;
+use Slim\Http\Environment;
+use Slim\Http\Headers;
+use Slim\Http\Request;
+use Slim\Http\Response;
+use Slim\Interfaces\CallableResolverInterface;
+use Slim\Interfaces\Http\EnvironmentInterface;
+use Slim\Interfaces\InvocationStrategyInterface;
+use Slim\Interfaces\RouterInterface;
+
+/**
+ * Slim's default Service Provider.
+ */
+class DefaultServicesProvider
+{
+    /**
+     * Register Slim's default services.
+     *
+     * @param Container $container A DI container implementing ArrayAccess and container-interop.
+     */
+    public function register($container)
+    {
+        if (!isset($container['environment'])) {
+            /**
+             * This service MUST return a shared instance
+             * of \Slim\Interfaces\Http\EnvironmentInterface.
+             *
+             * @return EnvironmentInterface
+             */
+            $container['environment'] = function () {
+                return new Environment($_SERVER);
+            };
+        }
+
+        if (!isset($container['request'])) {
+            /**
+             * PSR-7 Request object
+             *
+             * @param Container $container
+             *
+             * @return ServerRequestInterface
+             */
+            $container['request'] = function ($container) {
+                return Request::createFromEnvironment($container->get('environment'));
+            };
+        }
+
+        if (!isset($container['response'])) {
+            /**
+             * PSR-7 Response object
+             *
+             * @param Container $container
+             *
+             * @return ResponseInterface
+             */
+            $container['response'] = function ($container) {
+                $headers = new Headers(['Content-Type' => 'text/html; charset=UTF-8']);
+                $response = new Response(200, $headers);
+
+                return $response->withProtocolVersion($container->get('settings')['httpVersion']);
+            };
+        }
+
+        if (!isset($container['router'])) {
+            /**
+             * This service MUST return a SHARED instance
+             * of \Slim\Interfaces\RouterInterface.
+             *
+             * @param Container $container
+             *
+             * @return RouterInterface
+             */
+            $container['router'] = function ($container) {
+                $routerCacheFile = false;
+                if (isset($container->get('settings')['routerCacheFile'])) {
+                    $routerCacheFile = $container->get('settings')['routerCacheFile'];
+                }
+
+
+                $router = (new Router)->setCacheFile($routerCacheFile);
+                if (method_exists($router, 'setContainer')) {
+                    $router->setContainer($container);
+                }
+
+                return $router;
+            };
+        }
+
+        if (!isset($container['foundHandler'])) {
+            /**
+             * This service MUST return a SHARED instance
+             * of \Slim\Interfaces\InvocationStrategyInterface.
+             *
+             * @return InvocationStrategyInterface
+             */
+            $container['foundHandler'] = function () {
+                return new RequestResponse;
+            };
+        }
+
+        if (!isset($container['phpErrorHandler'])) {
+            /**
+             * This service MUST return a callable
+             * that accepts three arguments:
+             *
+             * 1. Instance of \Psr\Http\Message\ServerRequestInterface
+             * 2. Instance of \Psr\Http\Message\ResponseInterface
+             * 3. Instance of \Error
+             *
+             * The callable MUST return an instance of
+             * \Psr\Http\Message\ResponseInterface.
+             *
+             * @param Container $container
+             *
+             * @return callable
+             */
+            $container['phpErrorHandler'] = function ($container) {
+                return new PhpError($container->get('settings')['displayErrorDetails']);
+            };
+        }
+
+        if (!isset($container['errorHandler'])) {
+            /**
+             * This service MUST return a callable
+             * that accepts three arguments:
+             *
+             * 1. Instance of \Psr\Http\Message\ServerRequestInterface
+             * 2. Instance of \Psr\Http\Message\ResponseInterface
+             * 3. Instance of \Exception
+             *
+             * The callable MUST return an instance of
+             * \Psr\Http\Message\ResponseInterface.
+             *
+             * @param Container $container
+             *
+             * @return callable
+             */
+            $container['errorHandler'] = function ($container) {
+                return new Error(
+                    $container->get('settings')['displayErrorDetails']
+                );
+            };
+        }
+
+        if (!isset($container['notFoundHandler'])) {
+            /**
+             * This service MUST return a callable
+             * that accepts two arguments:
+             *
+             * 1. Instance of \Psr\Http\Message\ServerRequestInterface
+             * 2. Instance of \Psr\Http\Message\ResponseInterface
+             *
+             * The callable MUST return an instance of
+             * \Psr\Http\Message\ResponseInterface.
+             *
+             * @return callable
+             */
+            $container['notFoundHandler'] = function () {
+                return new NotFound;
+            };
+        }
+
+        if (!isset($container['notAllowedHandler'])) {
+            /**
+             * This service MUST return a callable
+             * that accepts three arguments:
+             *
+             * 1. Instance of \Psr\Http\Message\ServerRequestInterface
+             * 2. Instance of \Psr\Http\Message\ResponseInterface
+             * 3. Array of allowed HTTP methods
+             *
+             * The callable MUST return an instance of
+             * \Psr\Http\Message\ResponseInterface.
+             *
+             * @return callable
+             */
+            $container['notAllowedHandler'] = function () {
+                return new NotAllowed;
+            };
+        }
+
+        if (!isset($container['callableResolver'])) {
+            /**
+             * Instance of \Slim\Interfaces\CallableResolverInterface
+             *
+             * @param Container $container
+             *
+             * @return CallableResolverInterface
+             */
+            $container['callableResolver'] = function ($container) {
+                return new CallableResolver($container);
+            };
+        }
+    }
+}
diff --git a/advancedcontentfilter/vendor/slim/slim/Slim/DeferredCallable.php b/advancedcontentfilter/vendor/slim/slim/Slim/DeferredCallable.php
new file mode 100644 (file)
index 0000000..22887c0
--- /dev/null
@@ -0,0 +1,45 @@
+<?php
+/**
+ * Slim Framework (https://slimframework.com)
+ *
+ * @link      https://github.com/slimphp/Slim
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
+ * @license   https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
+ */
+
+namespace Slim;
+
+use Closure;
+use Psr\Container\ContainerInterface;
+
+class DeferredCallable
+{
+    use CallableResolverAwareTrait;
+
+    private $callable;
+    /** @var  ContainerInterface */
+    private $container;
+
+    /**
+     * DeferredMiddleware constructor.
+     * @param callable|string $callable
+     * @param ContainerInterface $container
+     */
+    public function __construct($callable, ContainerInterface $container = null)
+    {
+        $this->callable = $callable;
+        $this->container = $container;
+    }
+
+    public function __invoke()
+    {
+        $callable = $this->resolveCallable($this->callable);
+        if ($callable instanceof Closure) {
+            $callable = $callable->bindTo($this->container);
+        }
+
+        $args = func_get_args();
+
+        return call_user_func_array($callable, $args);
+    }
+}
diff --git a/advancedcontentfilter/vendor/slim/slim/Slim/Exception/ContainerException.php b/advancedcontentfilter/vendor/slim/slim/Slim/Exception/ContainerException.php
new file mode 100644 (file)
index 0000000..06163f1
--- /dev/null
@@ -0,0 +1,20 @@
+<?php
+/**
+ * Slim Framework (https://slimframework.com)
+ *
+ * @link      https://github.com/slimphp/Slim
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
+ * @license   https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
+ */
+namespace Slim\Exception;
+
+use InvalidArgumentException;
+use Interop\Container\Exception\ContainerException as InteropContainerException;
+
+/**
+ * Container Exception
+ */
+class ContainerException extends InvalidArgumentException implements InteropContainerException
+{
+
+}
diff --git a/advancedcontentfilter/vendor/slim/slim/Slim/Exception/ContainerValueNotFoundException.php b/advancedcontentfilter/vendor/slim/slim/Slim/Exception/ContainerValueNotFoundException.php
new file mode 100644 (file)
index 0000000..33de07e
--- /dev/null
@@ -0,0 +1,20 @@
+<?php
+/**
+ * Slim Framework (https://slimframework.com)
+ *
+ * @link      https://github.com/slimphp/Slim
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
+ * @license   https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
+ */
+namespace Slim\Exception;
+
+use RuntimeException;
+use Interop\Container\Exception\NotFoundException as InteropNotFoundException;
+
+/**
+ * Not Found Exception
+ */
+class ContainerValueNotFoundException extends RuntimeException implements InteropNotFoundException
+{
+
+}
diff --git a/advancedcontentfilter/vendor/slim/slim/Slim/Exception/InvalidMethodException.php b/advancedcontentfilter/vendor/slim/slim/Slim/Exception/InvalidMethodException.php
new file mode 100644 (file)
index 0000000..4aabf83
--- /dev/null
@@ -0,0 +1,27 @@
+<?php
+/**
+ * Slim Framework (https://slimframework.com)
+ *
+ * @link      https://github.com/slimphp/Slim
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
+ * @license   https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
+ */
+namespace Slim\Exception;
+
+use Psr\Http\Message\ServerRequestInterface;
+
+class InvalidMethodException extends \InvalidArgumentException
+{
+    protected $request;
+
+    public function __construct(ServerRequestInterface $request, $method)
+    {
+        $this->request = $request;
+        parent::__construct(sprintf('Unsupported HTTP method "%s" provided', $method));
+    }
+
+    public function getRequest()
+    {
+        return $this->request;
+    }
+}
diff --git a/advancedcontentfilter/vendor/slim/slim/Slim/Exception/MethodNotAllowedException.php b/advancedcontentfilter/vendor/slim/slim/Slim/Exception/MethodNotAllowedException.php
new file mode 100644 (file)
index 0000000..951f5df
--- /dev/null
@@ -0,0 +1,45 @@
+<?php
+/**
+ * Slim Framework (https://slimframework.com)
+ *
+ * @link      https://github.com/slimphp/Slim
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
+ * @license   https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
+ */
+namespace Slim\Exception;
+
+use Psr\Http\Message\ServerRequestInterface;
+use Psr\Http\Message\ResponseInterface;
+
+class MethodNotAllowedException extends SlimException
+{
+    /**
+     * HTTP methods allowed
+     *
+     * @var string[]
+     */
+    protected $allowedMethods;
+
+    /**
+     * Create new exception
+     *
+     * @param ServerRequestInterface $request
+     * @param ResponseInterface $response
+     * @param string[] $allowedMethods
+     */
+    public function __construct(ServerRequestInterface $request, ResponseInterface $response, array $allowedMethods)
+    {
+        parent::__construct($request, $response);
+        $this->allowedMethods = $allowedMethods;
+    }
+
+    /**
+     * Get allowed methods
+     *
+     * @return string[]
+     */
+    public function getAllowedMethods()
+    {
+        return $this->allowedMethods;
+    }
+}
diff --git a/advancedcontentfilter/vendor/slim/slim/Slim/Exception/NotFoundException.php b/advancedcontentfilter/vendor/slim/slim/Slim/Exception/NotFoundException.php
new file mode 100644 (file)
index 0000000..9e72e14
--- /dev/null
@@ -0,0 +1,14 @@
+<?php
+/**
+ * Slim Framework (https://slimframework.com)
+ *
+ * @link      https://github.com/slimphp/Slim
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
+ * @license   https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
+ */
+namespace Slim\Exception;
+
+class NotFoundException extends SlimException
+{
+
+}
diff --git a/advancedcontentfilter/vendor/slim/slim/Slim/Exception/SlimException.php b/advancedcontentfilter/vendor/slim/slim/Slim/Exception/SlimException.php
new file mode 100644 (file)
index 0000000..2480d73
--- /dev/null
@@ -0,0 +1,69 @@
+<?php
+/**
+ * Slim Framework (https://slimframework.com)
+ *
+ * @link      https://github.com/slimphp/Slim
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
+ * @license   https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
+ */
+namespace Slim\Exception;
+
+use Exception;
+use Psr\Http\Message\ServerRequestInterface;
+use Psr\Http\Message\ResponseInterface;
+
+/**
+ * Stop Exception
+ *
+ * This Exception is thrown when the Slim application needs to abort
+ * processing and return control flow to the outer PHP script.
+ */
+class SlimException extends Exception
+{
+    /**
+     * A request object
+     *
+     * @var ServerRequestInterface
+     */
+    protected $request;
+
+    /**
+     * A response object to send to the HTTP client
+     *
+     * @var ResponseInterface
+     */
+    protected $response;
+
+    /**
+     * Create new exception
+     *
+     * @param ServerRequestInterface $request
+     * @param ResponseInterface $response
+     */
+    public function __construct(ServerRequestInterface $request, ResponseInterface $response)
+    {
+        parent::__construct();
+        $this->request = $request;
+        $this->response = $response;
+    }
+
+    /**
+     * Get request
+     *
+     * @return ServerRequestInterface
+     */
+    public function getRequest()
+    {
+        return $this->request;
+    }
+
+    /**
+     * Get response
+     *
+     * @return ResponseInterface
+     */
+    public function getResponse()
+    {
+        return $this->response;
+    }
+}
diff --git a/advancedcontentfilter/vendor/slim/slim/Slim/Handlers/AbstractError.php b/advancedcontentfilter/vendor/slim/slim/Slim/Handlers/AbstractError.php
new file mode 100644 (file)
index 0000000..42f8dde
--- /dev/null
@@ -0,0 +1,99 @@
+<?php
+/**
+ * Slim Framework (https://slimframework.com)
+ *
+ * @link      https://github.com/slimphp/Slim
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
+ * @license   https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
+ */
+namespace Slim\Handlers;
+
+/**
+ * Abstract Slim application error handler
+ */
+abstract class AbstractError extends AbstractHandler
+{
+    /**
+     * @var bool
+     */
+    protected $displayErrorDetails;
+
+    /**
+     * Constructor
+     *
+     * @param bool $displayErrorDetails Set to true to display full details
+     */
+    public function __construct($displayErrorDetails = false)
+    {
+        $this->displayErrorDetails = (bool) $displayErrorDetails;
+    }
+
+    /**
+     * Write to the error log if displayErrorDetails is false
+     *
+     * @param \Exception|\Throwable $throwable
+     *
+     * @return void
+     */
+    protected function writeToErrorLog($throwable)
+    {
+        if ($this->displayErrorDetails) {
+            return;
+        }
+
+        $message = 'Slim Application Error:' . PHP_EOL;
+        $message .= $this->renderThrowableAsText($throwable);
+        while ($throwable = $throwable->getPrevious()) {
+            $message .= PHP_EOL . 'Previous error:' . PHP_EOL;
+            $message .= $this->renderThrowableAsText($throwable);
+        }
+
+        $message .= PHP_EOL . 'View in rendered output by enabling the "displayErrorDetails" setting.' . PHP_EOL;
+
+        $this->logError($message);
+    }
+
+    /**
+     * Render error as Text.
+     *
+     * @param \Exception|\Throwable $throwable
+     *
+     * @return string
+     */
+    protected function renderThrowableAsText($throwable)
+    {
+        $text = sprintf('Type: %s' . PHP_EOL, get_class($throwable));
+
+        if ($code = $throwable->getCode()) {
+            $text .= sprintf('Code: %s' . PHP_EOL, $code);
+        }
+
+        if ($message = $throwable->getMessage()) {
+            $text .= sprintf('Message: %s' . PHP_EOL, htmlentities($message));
+        }
+
+        if ($file = $throwable->getFile()) {
+            $text .= sprintf('File: %s' . PHP_EOL, $file);
+        }
+
+        if ($line = $throwable->getLine()) {
+            $text .= sprintf('Line: %s' . PHP_EOL, $line);
+        }
+
+        if ($trace = $throwable->getTraceAsString()) {
+            $text .= sprintf('Trace: %s', $trace);
+        }
+
+        return $text;
+    }
+
+    /**
+     * Wraps the error_log function so that this can be easily tested
+     *
+     * @param $message
+     */
+    protected function logError($message)
+    {
+        error_log($message);
+    }
+}
diff --git a/advancedcontentfilter/vendor/slim/slim/Slim/Handlers/AbstractHandler.php b/advancedcontentfilter/vendor/slim/slim/Slim/Handlers/AbstractHandler.php
new file mode 100644 (file)
index 0000000..b166a15
--- /dev/null
@@ -0,0 +1,59 @@
+<?php
+/**
+ * Slim Framework (https://slimframework.com)
+ *
+ * @link      https://github.com/slimphp/Slim
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
+ * @license   https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
+ */
+namespace Slim\Handlers;
+
+use Psr\Http\Message\ServerRequestInterface;
+
+/**
+ * Abstract Slim application handler
+ */
+abstract class AbstractHandler
+{
+    /**
+     * Known handled content types
+     *
+     * @var array
+     */
+    protected $knownContentTypes = [
+        'application/json',
+        'application/xml',
+        'text/xml',
+        'text/html',
+    ];
+
+    /**
+     * Determine which content type we know about is wanted using Accept header
+     *
+     * Note: This method is a bare-bones implementation designed specifically for
+     * Slim's error handling requirements. Consider a fully-feature solution such
+     * as willdurand/negotiation for any other situation.
+     *
+     * @param ServerRequestInterface $request
+     * @return string
+     */
+    protected function determineContentType(ServerRequestInterface $request)
+    {
+        $acceptHeader = $request->getHeaderLine('Accept');
+        $selectedContentTypes = array_intersect(explode(',', $acceptHeader), $this->knownContentTypes);
+
+        if (count($selectedContentTypes)) {
+            return current($selectedContentTypes);
+        }
+
+        // handle +json and +xml specially
+        if (preg_match('/\+(json|xml)/', $acceptHeader, $matches)) {
+            $mediaType = 'application/' . $matches[1];
+            if (in_array($mediaType, $this->knownContentTypes)) {
+                return $mediaType;
+            }
+        }
+
+        return 'text/html';
+    }
+}
diff --git a/advancedcontentfilter/vendor/slim/slim/Slim/Handlers/Error.php b/advancedcontentfilter/vendor/slim/slim/Slim/Handlers/Error.php
new file mode 100644 (file)
index 0000000..dd0bc8d
--- /dev/null
@@ -0,0 +1,224 @@
+<?php
+/**
+ * Slim Framework (https://slimframework.com)
+ *
+ * @link      https://github.com/slimphp/Slim
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
+ * @license   https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
+ */
+namespace Slim\Handlers;
+
+use Psr\Http\Message\ResponseInterface;
+use Psr\Http\Message\ServerRequestInterface;
+use Slim\Http\Body;
+use UnexpectedValueException;
+
+/**
+ * Default Slim application error handler
+ *
+ * It outputs the error message and diagnostic information in either JSON, XML,
+ * or HTML based on the Accept header.
+ */
+class Error extends AbstractError
+{
+    /**
+     * Invoke error handler
+     *
+     * @param ServerRequestInterface $request   The most recent Request object
+     * @param ResponseInterface      $response  The most recent Response object
+     * @param \Exception             $exception The caught Exception object
+     *
+     * @return ResponseInterface
+     * @throws UnexpectedValueException
+     */
+    public function __invoke(ServerRequestInterface $request, ResponseInterface $response, \Exception $exception)
+    {
+        $contentType = $this->determineContentType($request);
+        switch ($contentType) {
+            case 'application/json':
+                $output = $this->renderJsonErrorMessage($exception);
+                break;
+
+            case 'text/xml':
+            case 'application/xml':
+                $output = $this->renderXmlErrorMessage($exception);
+                break;
+
+            case 'text/html':
+                $output = $this->renderHtmlErrorMessage($exception);
+                break;
+
+            default:
+                throw new UnexpectedValueException('Cannot render unknown content type ' . $contentType);
+        }
+
+        $this->writeToErrorLog($exception);
+
+        $body = new Body(fopen('php://temp', 'r+'));
+        $body->write($output);
+
+        return $response
+                ->withStatus(500)
+                ->withHeader('Content-type', $contentType)
+                ->withBody($body);
+    }
+
+    /**
+     * Render HTML error page
+     *
+     * @param  \Exception $exception
+     *
+     * @return string
+     */
+    protected function renderHtmlErrorMessage(\Exception $exception)
+    {
+        $title = 'Slim Application Error';
+
+        if ($this->displayErrorDetails) {
+            $html = '<p>The application could not run because of the following error:</p>';
+            $html .= '<h2>Details</h2>';
+            $html .= $this->renderHtmlException($exception);
+
+            while ($exception = $exception->getPrevious()) {
+                $html .= '<h2>Previous exception</h2>';
+                $html .= $this->renderHtmlExceptionOrError($exception);
+            }
+        } else {
+            $html = '<p>A website error has occurred. Sorry for the temporary inconvenience.</p>';
+        }
+
+        $output = sprintf(
+            "<html><head><meta http-equiv='Content-Type' content='text/html; charset=utf-8'>" .
+            "<title>%s</title><style>body{margin:0;padding:30px;font:12px/1.5 Helvetica,Arial,Verdana," .
+            "sans-serif;}h1{margin:0;font-size:48px;font-weight:normal;line-height:48px;}strong{" .
+            "display:inline-block;width:65px;}</style></head><body><h1>%s</h1>%s</body></html>",
+            $title,
+            $title,
+            $html
+        );
+
+        return $output;
+    }
+
+    /**
+     * Render exception as HTML.
+     *
+     * Provided for backwards compatibility; use renderHtmlExceptionOrError().
+     *
+     * @param \Exception $exception
+     *
+     * @return string
+     */
+    protected function renderHtmlException(\Exception $exception)
+    {
+        return $this->renderHtmlExceptionOrError($exception);
+    }
+
+    /**
+     * Render exception or error as HTML.
+     *
+     * @param \Exception|\Error $exception
+     *
+     * @return string
+     */
+    protected function renderHtmlExceptionOrError($exception)
+    {
+        if (!$exception instanceof \Exception && !$exception instanceof \Error) {
+            throw new \RuntimeException("Unexpected type. Expected Exception or Error.");
+        }
+
+        $html = sprintf('<div><strong>Type:</strong> %s</div>', get_class($exception));
+
+        if (($code = $exception->getCode())) {
+            $html .= sprintf('<div><strong>Code:</strong> %s</div>', $code);
+        }
+
+        if (($message = $exception->getMessage())) {
+            $html .= sprintf('<div><strong>Message:</strong> %s</div>', htmlentities($message));
+        }
+
+        if (($file = $exception->getFile())) {
+            $html .= sprintf('<div><strong>File:</strong> %s</div>', $file);
+        }
+
+        if (($line = $exception->getLine())) {
+            $html .= sprintf('<div><strong>Line:</strong> %s</div>', $line);
+        }
+
+        if (($trace = $exception->getTraceAsString())) {
+            $html .= '<h2>Trace</h2>';
+            $html .= sprintf('<pre>%s</pre>', htmlentities($trace));
+        }
+
+        return $html;
+    }
+
+    /**
+     * Render JSON error
+     *
+     * @param \Exception $exception
+     *
+     * @return string
+     */
+    protected function renderJsonErrorMessage(\Exception $exception)
+    {
+        $error = [
+            'message' => 'Slim Application Error',
+        ];
+
+        if ($this->displayErrorDetails) {
+            $error['exception'] = [];
+
+            do {
+                $error['exception'][] = [
+                    'type' => get_class($exception),
+                    'code' => $exception->getCode(),
+                    'message' => $exception->getMessage(),
+                    'file' => $exception->getFile(),
+                    'line' => $exception->getLine(),
+                    'trace' => explode("\n", $exception->getTraceAsString()),
+                ];
+            } while ($exception = $exception->getPrevious());
+        }
+
+        return json_encode($error, JSON_PRETTY_PRINT);
+    }
+
+    /**
+     * Render XML error
+     *
+     * @param \Exception $exception
+     *
+     * @return string
+     */
+    protected function renderXmlErrorMessage(\Exception $exception)
+    {
+        $xml = "<error>\n  <message>Slim Application Error</message>\n";
+        if ($this->displayErrorDetails) {
+            do {
+                $xml .= "  <exception>\n";
+                $xml .= "    <type>" . get_class($exception) . "</type>\n";
+                $xml .= "    <code>" . $exception->getCode() . "</code>\n";
+                $xml .= "    <message>" . $this->createCdataSection($exception->getMessage()) . "</message>\n";
+                $xml .= "    <file>" . $exception->getFile() . "</file>\n";
+                $xml .= "    <line>" . $exception->getLine() . "</line>\n";
+                $xml .= "    <trace>" . $this->createCdataSection($exception->getTraceAsString()) . "</trace>\n";
+                $xml .= "  </exception>\n";
+            } while ($exception = $exception->getPrevious());
+        }
+        $xml .= "</error>";
+
+        return $xml;
+    }
+
+    /**
+     * Returns a CDATA section with the given content.
+     *
+     * @param  string $content
+     * @return string
+     */
+    private function createCdataSection($content)
+    {
+        return sprintf('<![CDATA[%s]]>', str_replace(']]>', ']]]]><![CDATA[>', $content));
+    }
+}
diff --git a/advancedcontentfilter/vendor/slim/slim/Slim/Handlers/NotAllowed.php b/advancedcontentfilter/vendor/slim/slim/Slim/Handlers/NotAllowed.php
new file mode 100644 (file)
index 0000000..345f0ff
--- /dev/null
@@ -0,0 +1,147 @@
+<?php
+/**
+ * Slim Framework (https://slimframework.com)
+ *
+ * @link      https://github.com/slimphp/Slim
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
+ * @license   https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
+ */
+namespace Slim\Handlers;
+
+use Psr\Http\Message\ServerRequestInterface;
+use Psr\Http\Message\ResponseInterface;
+use Slim\Http\Body;
+use UnexpectedValueException;
+
+/**
+ * Default Slim application not allowed handler
+ *
+ * It outputs a simple message in either JSON, XML or HTML based on the
+ * Accept header.
+ */
+class NotAllowed extends AbstractHandler
+{
+    /**
+     * Invoke error handler
+     *
+     * @param  ServerRequestInterface $request  The most recent Request object
+     * @param  ResponseInterface      $response The most recent Response object
+     * @param  string[]               $methods  Allowed HTTP methods
+     *
+     * @return ResponseInterface
+     * @throws UnexpectedValueException
+     */
+    public function __invoke(ServerRequestInterface $request, ResponseInterface $response, array $methods)
+    {
+        if ($request->getMethod() === 'OPTIONS') {
+            $status = 200;
+            $contentType = 'text/plain';
+            $output = $this->renderPlainOptionsMessage($methods);
+        } else {
+            $status = 405;
+            $contentType = $this->determineContentType($request);
+            switch ($contentType) {
+                case 'application/json':
+                    $output = $this->renderJsonNotAllowedMessage($methods);
+                    break;
+
+                case 'text/xml':
+                case 'application/xml':
+                    $output = $this->renderXmlNotAllowedMessage($methods);
+                    break;
+
+                case 'text/html':
+                    $output = $this->renderHtmlNotAllowedMessage($methods);
+                    break;
+                default:
+                    throw new UnexpectedValueException('Cannot render unknown content type ' . $contentType);
+            }
+        }
+
+        $body = new Body(fopen('php://temp', 'r+'));
+        $body->write($output);
+        $allow = implode(', ', $methods);
+
+        return $response
+                ->withStatus($status)
+                ->withHeader('Content-type', $contentType)
+                ->withHeader('Allow', $allow)
+                ->withBody($body);
+    }
+
+    /**
+     * Render PLAIN message for OPTIONS response
+     *
+     * @param  array                  $methods
+     * @return string
+     */
+    protected function renderPlainOptionsMessage($methods)
+    {
+        $allow = implode(', ', $methods);
+
+        return 'Allowed methods: ' . $allow;
+    }
+
+    /**
+     * Render JSON not allowed message
+     *
+     * @param  array                  $methods
+     * @return string
+     */
+    protected function renderJsonNotAllowedMessage($methods)
+    {
+        $allow = implode(', ', $methods);
+
+        return '{"message":"Method not allowed. Must be one of: ' . $allow . '"}';
+    }
+
+    /**
+     * Render XML not allowed message
+     *
+     * @param  array                  $methods
+     * @return string
+     */
+    protected function renderXmlNotAllowedMessage($methods)
+    {
+        $allow = implode(', ', $methods);
+
+        return "<root><message>Method not allowed. Must be one of: $allow</message></root>";
+    }
+
+    /**
+     * Render HTML not allowed message
+     *
+     * @param  array                  $methods
+     * @return string
+     */
+    protected function renderHtmlNotAllowedMessage($methods)
+    {
+        $allow = implode(', ', $methods);
+        $output = <<<END
+<html>
+    <head>
+        <title>Method not allowed</title>
+        <style>
+            body{
+                margin:0;
+                padding:30px;
+                font:12px/1.5 Helvetica,Arial,Verdana,sans-serif;
+            }
+            h1{
+                margin:0;
+                font-size:48px;
+                font-weight:normal;
+                line-height:48px;
+            }
+        </style>
+    </head>
+    <body>
+        <h1>Method not allowed</h1>
+        <p>Method not allowed. Must be one of: <strong>$allow</strong></p>
+    </body>
+</html>
+END;
+
+        return $output;
+    }
+}
diff --git a/advancedcontentfilter/vendor/slim/slim/Slim/Handlers/NotFound.php b/advancedcontentfilter/vendor/slim/slim/Slim/Handlers/NotFound.php
new file mode 100644 (file)
index 0000000..b333032
--- /dev/null
@@ -0,0 +1,141 @@
+<?php
+/**
+ * Slim Framework (https://slimframework.com)
+ *
+ * @link      https://github.com/slimphp/Slim
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
+ * @license   https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
+ */
+namespace Slim\Handlers;
+
+use Psr\Http\Message\ServerRequestInterface;
+use Psr\Http\Message\ResponseInterface;
+use Slim\Http\Body;
+use UnexpectedValueException;
+
+/**
+ * Default Slim application not found handler.
+ *
+ * It outputs a simple message in either JSON, XML or HTML based on the
+ * Accept header.
+ */
+class NotFound extends AbstractHandler
+{
+    /**
+     * Invoke not found handler
+     *
+     * @param  ServerRequestInterface $request  The most recent Request object
+     * @param  ResponseInterface      $response The most recent Response object
+     *
+     * @return ResponseInterface
+     * @throws UnexpectedValueException
+     */
+    public function __invoke(ServerRequestInterface $request, ResponseInterface $response)
+    {
+        if ($request->getMethod() === 'OPTIONS') {
+            $contentType = 'text/plain';
+            $output = $this->renderPlainNotFoundOutput();
+        } else {
+            $contentType = $this->determineContentType($request);
+            switch ($contentType) {
+                case 'application/json':
+                    $output = $this->renderJsonNotFoundOutput();
+                    break;
+
+                case 'text/xml':
+                case 'application/xml':
+                    $output = $this->renderXmlNotFoundOutput();
+                    break;
+
+                case 'text/html':
+                    $output = $this->renderHtmlNotFoundOutput($request);
+                    break;
+
+                default:
+                    throw new UnexpectedValueException('Cannot render unknown content type ' . $contentType);
+            }
+        }
+
+        $body = new Body(fopen('php://temp', 'r+'));
+        $body->write($output);
+
+        return $response->withStatus(404)
+                        ->withHeader('Content-Type', $contentType)
+                        ->withBody($body);
+    }
+
+    /**
+     * Render plain not found message
+     *
+     * @return ResponseInterface
+     */
+    protected function renderPlainNotFoundOutput()
+    {
+        return 'Not found';
+    }
+
+    /**
+     * Return a response for application/json content not found
+     *
+     * @return ResponseInterface
+     */
+    protected function renderJsonNotFoundOutput()
+    {
+        return '{"message":"Not found"}';
+    }
+
+    /**
+     * Return a response for xml content not found
+     *
+     * @return ResponseInterface
+     */
+    protected function renderXmlNotFoundOutput()
+    {
+        return '<root><message>Not found</message></root>';
+    }
+
+    /**
+     * Return a response for text/html content not found
+     *
+     * @param  ServerRequestInterface $request  The most recent Request object
+     *
+     * @return ResponseInterface
+     */
+    protected function renderHtmlNotFoundOutput(ServerRequestInterface $request)
+    {
+        $homeUrl = (string)($request->getUri()->withPath('')->withQuery('')->withFragment(''));
+        return <<<END
+<html>
+    <head>
+        <title>Page Not Found</title>
+        <style>
+            body{
+                margin:0;
+                padding:30px;
+                font:12px/1.5 Helvetica,Arial,Verdana,sans-serif;
+            }
+            h1{
+                margin:0;
+                font-size:48px;
+                font-weight:normal;
+                line-height:48px;
+            }
+            strong{
+                display:inline-block;
+                width:65px;
+            }
+        </style>
+    </head>
+    <body>
+        <h1>Page Not Found</h1>
+        <p>
+            The page you are looking for could not be found. Check the address bar
+            to ensure your URL is spelled correctly. If all else fails, you can
+            visit our home page at the link below.
+        </p>
+        <a href='$homeUrl'>Visit the Home Page</a>
+    </body>
+</html>
+END;
+    }
+}
diff --git a/advancedcontentfilter/vendor/slim/slim/Slim/Handlers/PhpError.php b/advancedcontentfilter/vendor/slim/slim/Slim/Handlers/PhpError.php
new file mode 100644 (file)
index 0000000..3ecce30
--- /dev/null
@@ -0,0 +1,205 @@
+<?php
+/**
+ * Slim Framework (https://slimframework.com)
+ *
+ * @link      https://github.com/slimphp/Slim
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
+ * @license   https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
+ */
+namespace Slim\Handlers;
+
+use Psr\Http\Message\ResponseInterface;
+use Psr\Http\Message\ServerRequestInterface;
+use Slim\Http\Body;
+use UnexpectedValueException;
+
+/**
+ * Default Slim application error handler for PHP 7+ Throwables
+ *
+ * It outputs the error message and diagnostic information in either JSON, XML,
+ * or HTML based on the Accept header.
+ */
+class PhpError extends AbstractError
+{
+    /**
+     * Invoke error handler
+     *
+     * @param ServerRequestInterface $request   The most recent Request object
+     * @param ResponseInterface      $response  The most recent Response object
+     * @param \Throwable             $error     The caught Throwable object
+     *
+     * @return ResponseInterface
+     * @throws UnexpectedValueException
+     */
+    public function __invoke(ServerRequestInterface $request, ResponseInterface $response, \Throwable $error)
+    {
+        $contentType = $this->determineContentType($request);
+        switch ($contentType) {
+            case 'application/json':
+                $output = $this->renderJsonErrorMessage($error);
+                break;
+
+            case 'text/xml':
+            case 'application/xml':
+                $output = $this->renderXmlErrorMessage($error);
+                break;
+
+            case 'text/html':
+                $output = $this->renderHtmlErrorMessage($error);
+                break;
+            default:
+                throw new UnexpectedValueException('Cannot render unknown content type ' . $contentType);
+        }
+
+        $this->writeToErrorLog($error);
+
+        $body = new Body(fopen('php://temp', 'r+'));
+        $body->write($output);
+
+        return $response
+                ->withStatus(500)
+                ->withHeader('Content-type', $contentType)
+                ->withBody($body);
+    }
+
+    /**
+     * Render HTML error page
+     *
+     * @param \Throwable $error
+     *
+     * @return string
+     */
+    protected function renderHtmlErrorMessage(\Throwable $error)
+    {
+        $title = 'Slim Application Error';
+
+        if ($this->displayErrorDetails) {
+            $html = '<p>The application could not run because of the following error:</p>';
+            $html .= '<h2>Details</h2>';
+            $html .= $this->renderHtmlError($error);
+
+            while ($error = $error->getPrevious()) {
+                $html .= '<h2>Previous error</h2>';
+                $html .= $this->renderHtmlError($error);
+            }
+        } else {
+            $html = '<p>A website error has occurred. Sorry for the temporary inconvenience.</p>';
+        }
+
+        $output = sprintf(
+            "<html><head><meta http-equiv='Content-Type' content='text/html; charset=utf-8'>" .
+            "<title>%s</title><style>body{margin:0;padding:30px;font:12px/1.5 Helvetica,Arial,Verdana," .
+            "sans-serif;}h1{margin:0;font-size:48px;font-weight:normal;line-height:48px;}strong{" .
+            "display:inline-block;width:65px;}</style></head><body><h1>%s</h1>%s</body></html>",
+            $title,
+            $title,
+            $html
+        );
+
+        return $output;
+    }
+
+    /**
+     * Render error as HTML.
+     *
+     * @param \Throwable $error
+     *
+     * @return string
+     */
+    protected function renderHtmlError(\Throwable $error)
+    {
+        $html = sprintf('<div><strong>Type:</strong> %s</div>', get_class($error));
+
+        if (($code = $error->getCode())) {
+            $html .= sprintf('<div><strong>Code:</strong> %s</div>', $code);
+        }
+
+        if (($message = $error->getMessage())) {
+            $html .= sprintf('<div><strong>Message:</strong> %s</div>', htmlentities($message));
+        }
+
+        if (($file = $error->getFile())) {
+            $html .= sprintf('<div><strong>File:</strong> %s</div>', $file);
+        }
+
+        if (($line = $error->getLine())) {
+            $html .= sprintf('<div><strong>Line:</strong> %s</div>', $line);
+        }
+
+        if (($trace = $error->getTraceAsString())) {
+            $html .= '<h2>Trace</h2>';
+            $html .= sprintf('<pre>%s</pre>', htmlentities($trace));
+        }
+
+        return $html;
+    }
+
+    /**
+     * Render JSON error
+     *
+     * @param \Throwable $error
+     *
+     * @return string
+     */
+    protected function renderJsonErrorMessage(\Throwable $error)
+    {
+        $json = [
+            'message' => 'Slim Application Error',
+        ];
+
+        if ($this->displayErrorDetails) {
+            $json['error'] = [];
+
+            do {
+                $json['error'][] = [
+                    'type' => get_class($error),
+                    'code' => $error->getCode(),
+                    'message' => $error->getMessage(),
+                    'file' => $error->getFile(),
+                    'line' => $error->getLine(),
+                    'trace' => explode("\n", $error->getTraceAsString()),
+                ];
+            } while ($error = $error->getPrevious());
+        }
+
+        return json_encode($json, JSON_PRETTY_PRINT);
+    }
+
+    /**
+     * Render XML error
+     *
+     * @param \Throwable $error
+     *
+     * @return string
+     */
+    protected function renderXmlErrorMessage(\Throwable $error)
+    {
+        $xml = "<error>\n  <message>Slim Application Error</message>\n";
+        if ($this->displayErrorDetails) {
+            do {
+                $xml .= "  <error>\n";
+                $xml .= "    <type>" . get_class($error) . "</type>\n";
+                $xml .= "    <code>" . $error->getCode() . "</code>\n";
+                $xml .= "    <message>" . $this->createCdataSection($error->getMessage()) . "</message>\n";
+                $xml .= "    <file>" . $error->getFile() . "</file>\n";
+                $xml .= "    <line>" . $error->getLine() . "</line>\n";
+                $xml .= "    <trace>" . $this->createCdataSection($error->getTraceAsString()) . "</trace>\n";
+                $xml .= "  </error>\n";
+            } while ($error = $error->getPrevious());
+        }
+        $xml .= "</error>";
+
+        return $xml;
+    }
+
+    /**
+     * Returns a CDATA section with the given content.
+     *
+     * @param  string $content
+     * @return string
+     */
+    private function createCdataSection($content)
+    {
+        return sprintf('<![CDATA[%s]]>', str_replace(']]>', ']]]]><![CDATA[>', $content));
+    }
+}
diff --git a/advancedcontentfilter/vendor/slim/slim/Slim/Handlers/Strategies/RequestResponse.php b/advancedcontentfilter/vendor/slim/slim/Slim/Handlers/Strategies/RequestResponse.php
new file mode 100644 (file)
index 0000000..ad99b56
--- /dev/null
@@ -0,0 +1,43 @@
+<?php
+/**
+ * Slim Framework (https://slimframework.com)
+ *
+ * @link      https://github.com/slimphp/Slim
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
+ * @license   https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
+ */
+namespace Slim\Handlers\Strategies;
+
+use Psr\Http\Message\ResponseInterface;
+use Psr\Http\Message\ServerRequestInterface;
+use Slim\Interfaces\InvocationStrategyInterface;
+
+/**
+ * Default route callback strategy with route parameters as an array of arguments.
+ */
+class RequestResponse implements InvocationStrategyInterface
+{
+    /**
+     * Invoke a route callable with request, response, and all route parameters
+     * as an array of arguments.
+     *
+     * @param array|callable         $callable
+     * @param ServerRequestInterface $request
+     * @param ResponseInterface      $response
+     * @param array                  $routeArguments
+     *
+     * @return mixed
+     */
+    public function __invoke(
+        callable $callable,
+        ServerRequestInterface $request,
+        ResponseInterface $response,
+        array $routeArguments
+    ) {
+        foreach ($routeArguments as $k => $v) {
+            $request = $request->withAttribute($k, $v);
+        }
+
+        return call_user_func($callable, $request, $response, $routeArguments);
+    }
+}
diff --git a/advancedcontentfilter/vendor/slim/slim/Slim/Handlers/Strategies/RequestResponseArgs.php b/advancedcontentfilter/vendor/slim/slim/Slim/Handlers/Strategies/RequestResponseArgs.php
new file mode 100644 (file)
index 0000000..739cc7e
--- /dev/null
@@ -0,0 +1,42 @@
+<?php
+/**
+ * Slim Framework (https://slimframework.com)
+ *
+ * @link      https://github.com/slimphp/Slim
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
+ * @license   https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
+ */
+namespace Slim\Handlers\Strategies;
+
+use Psr\Http\Message\ResponseInterface;
+use Psr\Http\Message\ServerRequestInterface;
+use Slim\Interfaces\InvocationStrategyInterface;
+
+/**
+ * Route callback strategy with route parameters as individual arguments.
+ */
+class RequestResponseArgs implements InvocationStrategyInterface
+{
+
+    /**
+     * Invoke a route callable with request, response and all route parameters
+     * as individual arguments.
+     *
+     * @param array|callable         $callable
+     * @param ServerRequestInterface $request
+     * @param ResponseInterface      $response
+     * @param array                  $routeArguments
+     *
+     * @return mixed
+     */
+    public function __invoke(
+        callable $callable,
+        ServerRequestInterface $request,
+        ResponseInterface $response,
+        array $routeArguments
+    ) {
+        array_unshift($routeArguments, $request, $response);
+
+        return call_user_func_array($callable, $routeArguments);
+    }
+}
diff --git a/advancedcontentfilter/vendor/slim/slim/Slim/Http/Body.php b/advancedcontentfilter/vendor/slim/slim/Slim/Http/Body.php
new file mode 100644 (file)
index 0000000..7a7b4df
--- /dev/null
@@ -0,0 +1,22 @@
+<?php
+/**
+ * Slim Framework (https://slimframework.com)
+ *
+ * @link      https://github.com/slimphp/Slim
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
+ * @license   https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
+ */
+namespace Slim\Http;
+
+/**
+ * Body
+ *
+ * This class represents an HTTP message body and encapsulates a
+ * streamable resource according to the PSR-7 standard.
+ *
+ * @link https://github.com/php-fig/http-message/blob/master/src/StreamInterface.php
+ */
+class Body extends Stream
+{
+
+}
diff --git a/advancedcontentfilter/vendor/slim/slim/Slim/Http/Cookies.php b/advancedcontentfilter/vendor/slim/slim/Slim/Http/Cookies.php
new file mode 100644 (file)
index 0000000..c07c96f
--- /dev/null
@@ -0,0 +1,195 @@
+<?php
+/**
+ * Slim Framework (https://slimframework.com)
+ *
+ * @link      https://github.com/slimphp/Slim
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
+ * @license   https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
+ */
+namespace Slim\Http;
+
+use InvalidArgumentException;
+use Slim\Interfaces\Http\CookiesInterface;
+
+/**
+ * Cookie helper
+ */
+class Cookies implements CookiesInterface
+{
+    /**
+     * Cookies from HTTP request
+     *
+     * @var array
+     */
+    protected $requestCookies = [];
+
+    /**
+     * Cookies for HTTP response
+     *
+     * @var array
+     */
+    protected $responseCookies = [];
+
+    /**
+     * Default cookie properties
+     *
+     * @var array
+     */
+    protected $defaults = [
+        'value' => '',
+        'domain' => null,
+        'hostonly' => null,
+        'path' => null,
+        'expires' => null,
+        'secure' => false,
+        'httponly' => false
+    ];
+
+    /**
+     * Create new cookies helper
+     *
+     * @param array $cookies
+     */
+    public function __construct(array $cookies = [])
+    {
+        $this->requestCookies = $cookies;
+    }
+
+    /**
+     * Set default cookie properties
+     *
+     * @param array $settings
+     */
+    public function setDefaults(array $settings)
+    {
+        $this->defaults = array_replace($this->defaults, $settings);
+    }
+
+    /**
+     * Get request cookie
+     *
+     * @param  string $name    Cookie name
+     * @param  mixed  $default Cookie default value
+     *
+     * @return mixed Cookie value if present, else default
+     */
+    public function get($name, $default = null)
+    {
+        return isset($this->requestCookies[$name]) ? $this->requestCookies[$name] : $default;
+    }
+
+    /**
+     * Set response cookie
+     *
+     * @param string       $name  Cookie name
+     * @param string|array $value Cookie value, or cookie properties
+     */
+    public function set($name, $value)
+    {
+        if (!is_array($value)) {
+            $value = ['value' => (string)$value];
+        }
+        $this->responseCookies[$name] = array_replace($this->defaults, $value);
+    }
+
+    /**
+     * Convert to `Set-Cookie` headers
+     *
+     * @return string[]
+     */
+    public function toHeaders()
+    {
+        $headers = [];
+        foreach ($this->responseCookies as $name => $properties) {
+            $headers[] = $this->toHeader($name, $properties);
+        }
+
+        return $headers;
+    }
+
+    /**
+     * Convert to `Set-Cookie` header
+     *
+     * @param  string $name       Cookie name
+     * @param  array  $properties Cookie properties
+     *
+     * @return string
+     */
+    protected function toHeader($name, array $properties)
+    {
+        $result = urlencode($name) . '=' . urlencode($properties['value']);
+
+        if (isset($properties['domain'])) {
+            $result .= '; domain=' . $properties['domain'];
+        }
+
+        if (isset($properties['path'])) {
+            $result .= '; path=' . $properties['path'];
+        }
+
+        if (isset($properties['expires'])) {
+            if (is_string($properties['expires'])) {
+                $timestamp = strtotime($properties['expires']);
+            } else {
+                $timestamp = (int)$properties['expires'];
+            }
+            if ($timestamp !== 0) {
+                $result .= '; expires=' . gmdate('D, d-M-Y H:i:s e', $timestamp);
+            }
+        }
+
+        if (isset($properties['secure']) && $properties['secure']) {
+            $result .= '; secure';
+        }
+
+        if (isset($properties['hostonly']) && $properties['hostonly']) {
+            $result .= '; HostOnly';
+        }
+
+        if (isset($properties['httponly']) && $properties['httponly']) {
+            $result .= '; HttpOnly';
+        }
+
+        return $result;
+    }
+
+    /**
+     * Parse HTTP request `Cookie:` header and extract
+     * into a PHP associative array.
+     *
+     * @param  string $header The raw HTTP request `Cookie:` header
+     *
+     * @return array Associative array of cookie names and values
+     *
+     * @throws InvalidArgumentException if the cookie data cannot be parsed
+     */
+    public static function parseHeader($header)
+    {
+        if (is_array($header) === true) {
+            $header = isset($header[0]) ? $header[0] : '';
+        }
+
+        if (is_string($header) === false) {
+            throw new InvalidArgumentException('Cannot parse Cookie data. Header value must be a string.');
+        }
+
+        $header = rtrim($header, "\r\n");
+        $pieces = preg_split('@[;]\s*@', $header);
+        $cookies = [];
+
+        foreach ($pieces as $cookie) {
+            $cookie = explode('=', $cookie, 2);
+
+            if (count($cookie) === 2) {
+                $key = urldecode($cookie[0]);
+                $value = urldecode($cookie[1]);
+
+                if (!isset($cookies[$key])) {
+                    $cookies[$key] = $value;
+                }
+            }
+        }
+
+        return $cookies;
+    }
+}
diff --git a/advancedcontentfilter/vendor/slim/slim/Slim/Http/Environment.php b/advancedcontentfilter/vendor/slim/slim/Slim/Http/Environment.php
new file mode 100644 (file)
index 0000000..cd452fc
--- /dev/null
@@ -0,0 +1,63 @@
+<?php
+/**
+ * Slim Framework (https://slimframework.com)
+ *
+ * @link      https://github.com/slimphp/Slim
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
+ * @license   https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
+ */
+namespace Slim\Http;
+
+use Slim\Collection;
+use Slim\Interfaces\Http\EnvironmentInterface;
+
+/**
+ * Environment
+ *
+ * This class decouples the Slim application from the global PHP environment.
+ * This is particularly useful for unit testing, but it also lets us create
+ * custom sub-requests.
+ */
+class Environment extends Collection implements EnvironmentInterface
+{
+    /**
+     * Create mock environment
+     *
+     * @param  array $userData Array of custom environment keys and values
+     *
+     * @return self
+     */
+    public static function mock(array $userData = [])
+    {
+        //Validates if default protocol is HTTPS to set default port 443
+        if ((isset($userData['HTTPS']) && $userData['HTTPS'] !== 'off') ||
+            ((isset($userData['REQUEST_SCHEME']) && $userData['REQUEST_SCHEME'] === 'https'))) {
+            $defscheme = 'https';
+            $defport = 443;
+        } else {
+            $defscheme = 'http';
+            $defport = 80;
+        }
+
+        $data = array_merge([
+            'SERVER_PROTOCOL'      => 'HTTP/1.1',
+            'REQUEST_METHOD'       => 'GET',
+            'REQUEST_SCHEME'       => $defscheme,
+            'SCRIPT_NAME'          => '',
+            'REQUEST_URI'          => '',
+            'QUERY_STRING'         => '',
+            'SERVER_NAME'          => 'localhost',
+            'SERVER_PORT'          => $defport,
+            'HTTP_HOST'            => 'localhost',
+            'HTTP_ACCEPT'          => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
+            'HTTP_ACCEPT_LANGUAGE' => 'en-US,en;q=0.8',
+            'HTTP_ACCEPT_CHARSET'  => 'ISO-8859-1,utf-8;q=0.7,*;q=0.3',
+            'HTTP_USER_AGENT'      => 'Slim Framework',
+            'REMOTE_ADDR'          => '127.0.0.1',
+            'REQUEST_TIME'         => time(),
+            'REQUEST_TIME_FLOAT'   => microtime(true),
+        ], $userData);
+
+        return new static($data);
+    }
+}
diff --git a/advancedcontentfilter/vendor/slim/slim/Slim/Http/Headers.php b/advancedcontentfilter/vendor/slim/slim/Slim/Http/Headers.php
new file mode 100644 (file)
index 0000000..ef50f84
--- /dev/null
@@ -0,0 +1,222 @@
+<?php
+/**
+ * Slim Framework (https://slimframework.com)
+ *
+ * @link      https://github.com/slimphp/Slim
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
+ * @license   https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
+ */
+namespace Slim\Http;
+
+use Slim\Collection;
+use Slim\Interfaces\Http\HeadersInterface;
+
+/**
+ * Headers
+ *
+ * This class represents a collection of HTTP headers
+ * that is used in both the HTTP request and response objects.
+ * It also enables header name case-insensitivity when
+ * getting or setting a header value.
+ *
+ * Each HTTP header can have multiple values. This class
+ * stores values into an array for each header name. When
+ * you request a header value, you receive an array of values
+ * for that header.
+ */
+class Headers extends Collection implements HeadersInterface
+{
+    /**
+     * Special HTTP headers that do not have the "HTTP_" prefix
+     *
+     * @var array
+     */
+    protected static $special = [
+        'CONTENT_TYPE' => 1,
+        'CONTENT_LENGTH' => 1,
+        'PHP_AUTH_USER' => 1,
+        'PHP_AUTH_PW' => 1,
+        'PHP_AUTH_DIGEST' => 1,
+        'AUTH_TYPE' => 1,
+    ];
+
+    /**
+     * Create new headers collection with data extracted from
+     * the application Environment object
+     *
+     * @param Environment $environment The Slim application Environment
+     *
+     * @return self
+     */
+    public static function createFromEnvironment(Environment $environment)
+    {
+        $data = [];
+        $environment = self::determineAuthorization($environment);
+        foreach ($environment as $key => $value) {
+            $key = strtoupper($key);
+            if (isset(static::$special[$key]) || strpos($key, 'HTTP_') === 0) {
+                if ($key !== 'HTTP_CONTENT_LENGTH') {
+                    $data[$key] =  $value;
+                }
+            }
+        }
+
+        return new static($data);
+    }
+
+    /**
+     * If HTTP_AUTHORIZATION does not exist tries to get it from
+     * getallheaders() when available.
+     *
+     * @param Environment $environment The Slim application Environment
+     *
+     * @return Environment
+     */
+
+    public static function determineAuthorization(Environment $environment)
+    {
+        $authorization = $environment->get('HTTP_AUTHORIZATION');
+
+        if (empty($authorization) && is_callable('getallheaders')) {
+            $headers = getallheaders();
+            $headers = array_change_key_case($headers, CASE_LOWER);
+            if (isset($headers['authorization'])) {
+                $environment->set('HTTP_AUTHORIZATION', $headers['authorization']);
+            }
+        }
+
+        return $environment;
+    }
+
+    /**
+     * Return array of HTTP header names and values.
+     * This method returns the _original_ header name
+     * as specified by the end user.
+     *
+     * @return array
+     */
+    public function all()
+    {
+        $all = parent::all();
+        $out = [];
+        foreach ($all as $key => $props) {
+            $out[$props['originalKey']] = $props['value'];
+        }
+
+        return $out;
+    }
+
+    /**
+     * Set HTTP header value
+     *
+     * This method sets a header value. It replaces
+     * any values that may already exist for the header name.
+     *
+     * @param string $key   The case-insensitive header name
+     * @param string $value The header value
+     */
+    public function set($key, $value)
+    {
+        if (!is_array($value)) {
+            $value = [$value];
+        }
+        parent::set($this->normalizeKey($key), [
+            'value' => $value,
+            'originalKey' => $key
+        ]);
+    }
+
+    /**
+     * Get HTTP header value
+     *
+     * @param  string  $key     The case-insensitive header name
+     * @param  mixed   $default The default value if key does not exist
+     *
+     * @return string[]
+     */
+    public function get($key, $default = null)
+    {
+        if ($this->has($key)) {
+            return parent::get($this->normalizeKey($key))['value'];
+        }
+
+        return $default;
+    }
+
+    /**
+     * Get HTTP header key as originally specified
+     *
+     * @param  string   $key     The case-insensitive header name
+     * @param  mixed    $default The default value if key does not exist
+     *
+     * @return string
+     */
+    public function getOriginalKey($key, $default = null)
+    {
+        if ($this->has($key)) {
+            return parent::get($this->normalizeKey($key))['originalKey'];
+        }
+
+        return $default;
+    }
+
+    /**
+     * Add HTTP header value
+     *
+     * This method appends a header value. Unlike the set() method,
+     * this method _appends_ this new value to any values
+     * that already exist for this header name.
+     *
+     * @param string       $key   The case-insensitive header name
+     * @param array|string $value The new header value(s)
+     */
+    public function add($key, $value)
+    {
+        $oldValues = $this->get($key, []);
+        $newValues = is_array($value) ? $value : [$value];
+        $this->set($key, array_merge($oldValues, array_values($newValues)));
+    }
+
+    /**
+     * Does this collection have a given header?
+     *
+     * @param  string $key The case-insensitive header name
+     *
+     * @return bool
+     */
+    public function has($key)
+    {
+        return parent::has($this->normalizeKey($key));
+    }
+
+    /**
+     * Remove header from collection
+     *
+     * @param  string $key The case-insensitive header name
+     */
+    public function remove($key)
+    {
+        parent::remove($this->normalizeKey($key));
+    }
+
+    /**
+     * Normalize header name
+     *
+     * This method transforms header names into a
+     * normalized form. This is how we enable case-insensitive
+     * header names in the other methods in this class.
+     *
+     * @param  string $key The case-insensitive header name
+     *
+     * @return string Normalized header name
+     */
+    public function normalizeKey($key)
+    {
+        $key = strtr(strtolower($key), '_', '-');
+        if (strpos($key, 'http-') === 0) {
+            $key = substr($key, 5);
+        }
+
+        return $key;
+    }
+}
diff --git a/advancedcontentfilter/vendor/slim/slim/Slim/Http/Message.php b/advancedcontentfilter/vendor/slim/slim/Slim/Http/Message.php
new file mode 100644 (file)
index 0000000..9195fb5
--- /dev/null
@@ -0,0 +1,305 @@
+<?php
+/**
+ * Slim Framework (https://slimframework.com)
+ *
+ * @link      https://github.com/slimphp/Slim
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
+ * @license   https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
+ */
+namespace Slim\Http;
+
+use InvalidArgumentException;
+use Psr\Http\Message\MessageInterface;
+use Psr\Http\Message\StreamInterface;
+
+/**
+ * Abstract message (base class for Request and Response)
+ *
+ * This class represents a general HTTP message. It provides common properties and methods for
+ * the HTTP request and response, as defined in the PSR-7 MessageInterface.
+ *
+ * @link https://github.com/php-fig/http-message/blob/master/src/MessageInterface.php
+ * @see Slim\Http\Request
+ * @see Slim\Http\Response
+ */
+abstract class Message implements MessageInterface
+{
+    /**
+     * Protocol version
+     *
+     * @var string
+     */
+    protected $protocolVersion = '1.1';
+
+    /**
+     * A map of valid protocol versions
+     *
+     * @var array
+     */
+    protected static $validProtocolVersions = [
+        '1.0' => true,
+        '1.1' => true,
+        '2.0' => true,
+        '2' => true,
+    ];
+
+    /**
+     * Headers
+     *
+     * @var \Slim\Interfaces\Http\HeadersInterface
+     */
+    protected $headers;
+
+    /**
+     * Body object
+     *
+     * @var \Psr\Http\Message\StreamInterface
+     */
+    protected $body;
+
+
+    /**
+     * Disable magic setter to ensure immutability
+     */
+    public function __set($name, $value)
+    {
+        // Do nothing
+    }
+
+    /*******************************************************************************
+     * Protocol
+     ******************************************************************************/
+
+    /**
+     * Retrieves the HTTP protocol version as a string.
+     *
+     * The string MUST contain only the HTTP version number (e.g., "1.1", "1.0").
+     *
+     * @return string HTTP protocol version.
+     */
+    public function getProtocolVersion()
+    {
+        return $this->protocolVersion;
+    }
+
+    /**
+     * Return an instance with the specified HTTP protocol version.
+     *
+     * The version string MUST contain only the HTTP version number (e.g.,
+     * "1.1", "1.0").
+     *
+     * This method MUST be implemented in such a way as to retain the
+     * immutability of the message, and MUST return an instance that has the
+     * new protocol version.
+     *
+     * @param string $version HTTP protocol version
+     * @return static
+     * @throws InvalidArgumentException if the http version is an invalid number
+     */
+    public function withProtocolVersion($version)
+    {
+        if (!isset(self::$validProtocolVersions[$version])) {
+            throw new InvalidArgumentException(
+                'Invalid HTTP version. Must be one of: '
+                . implode(', ', array_keys(self::$validProtocolVersions))
+            );
+        }
+        $clone = clone $this;
+        $clone->protocolVersion = $version;
+
+        return $clone;
+    }
+
+    /*******************************************************************************
+     * Headers
+     ******************************************************************************/
+
+    /**
+     * Retrieves all message header values.
+     *
+     * The keys represent the header name as it will be sent over the wire, and
+     * each value is an array of strings associated with the header.
+     *
+     *     // Represent the headers as a string
+     *     foreach ($message->getHeaders() as $name => $values) {
+     *         echo $name . ": " . implode(", ", $values);
+     *     }
+     *
+     *     // Emit headers iteratively:
+     *     foreach ($message->getHeaders() as $name => $values) {
+     *         foreach ($values as $value) {
+     *             header(sprintf('%s: %s', $name, $value), false);
+     *         }
+     *     }
+     *
+     * While header names are not case-sensitive, getHeaders() will preserve the
+     * exact case in which headers were originally specified.
+     *
+     * @return array Returns an associative array of the message's headers. Each
+     *     key MUST be a header name, and each value MUST be an array of strings
+     *     for that header.
+     */
+    public function getHeaders()
+    {
+        return $this->headers->all();
+    }
+
+    /**
+     * Checks if a header exists by the given case-insensitive name.
+     *
+     * @param string $name Case-insensitive header field name.
+     * @return bool Returns true if any header names match the given header
+     *     name using a case-insensitive string comparison. Returns false if
+     *     no matching header name is found in the message.
+     */
+    public function hasHeader($name)
+    {
+        return $this->headers->has($name);
+    }
+
+    /**
+     * Retrieves a message header value by the given case-insensitive name.
+     *
+     * This method returns an array of all the header values of the given
+     * case-insensitive header name.
+     *
+     * If the header does not appear in the message, this method MUST return an
+     * empty array.
+     *
+     * @param string $name Case-insensitive header field name.
+     * @return string[] An array of string values as provided for the given
+     *    header. If the header does not appear in the message, this method MUST
+     *    return an empty array.
+     */
+    public function getHeader($name)
+    {
+        return $this->headers->get($name, []);
+    }
+
+    /**
+     * Retrieves a comma-separated string of the values for a single header.
+     *
+     * This method returns all of the header values of the given
+     * case-insensitive header name as a string concatenated together using
+     * a comma.
+     *
+     * NOTE: Not all header values may be appropriately represented using
+     * comma concatenation. For such headers, use getHeader() instead
+     * and supply your own delimiter when concatenating.
+     *
+     * If the header does not appear in the message, this method MUST return
+     * an empty string.
+     *
+     * @param string $name Case-insensitive header field name.
+     * @return string A string of values as provided for the given header
+     *    concatenated together using a comma. If the header does not appear in
+     *    the message, this method MUST return an empty string.
+     */
+    public function getHeaderLine($name)
+    {
+        return implode(',', $this->headers->get($name, []));
+    }
+
+    /**
+     * Return an instance with the provided value replacing the specified header.
+     *
+     * While header names are case-insensitive, the casing of the header will
+     * be preserved by this function, and returned from getHeaders().
+     *
+     * This method MUST be implemented in such a way as to retain the
+     * immutability of the message, and MUST return an instance that has the
+     * new and/or updated header and value.
+     *
+     * @param string $name Case-insensitive header field name.
+     * @param string|string[] $value Header value(s).
+     * @return static
+     * @throws \InvalidArgumentException for invalid header names or values.
+     */
+    public function withHeader($name, $value)
+    {
+        $clone = clone $this;
+        $clone->headers->set($name, $value);
+
+        return $clone;
+    }
+
+    /**
+     * Return an instance with the specified header appended with the given value.
+     *
+     * Existing values for the specified header will be maintained. The new
+     * value(s) will be appended to the existing list. If the header did not
+     * exist previously, it will be added.
+     *
+     * This method MUST be implemented in such a way as to retain the
+     * immutability of the message, and MUST return an instance that has the
+     * new header and/or value.
+     *
+     * @param string $name Case-insensitive header field name to add.
+     * @param string|string[] $value Header value(s).
+     * @return static
+     * @throws \InvalidArgumentException for invalid header names or values.
+     */
+    public function withAddedHeader($name, $value)
+    {
+        $clone = clone $this;
+        $clone->headers->add($name, $value);
+
+        return $clone;
+    }
+
+    /**
+     * Return an instance without the specified header.
+     *
+     * Header resolution MUST be done without case-sensitivity.
+     *
+     * This method MUST be implemented in such a way as to retain the
+     * immutability of the message, and MUST return an instance that removes
+     * the named header.
+     *
+     * @param string $name Case-insensitive header field name to remove.
+     * @return static
+     */
+    public function withoutHeader($name)
+    {
+        $clone = clone $this;
+        $clone->headers->remove($name);
+
+        return $clone;
+    }
+
+    /*******************************************************************************
+     * Body
+     ******************************************************************************/
+
+    /**
+     * Gets the body of the message.
+     *
+     * @return StreamInterface Returns the body as a stream.
+     */
+    public function getBody()
+    {
+        return $this->body;
+    }
+
+    /**
+     * Return an instance with the specified message body.
+     *
+     * The body MUST be a StreamInterface object.
+     *
+     * This method MUST be implemented in such a way as to retain the
+     * immutability of the message, and MUST return a new instance that has the
+     * new body stream.
+     *
+     * @param StreamInterface $body Body.
+     * @return static
+     * @throws \InvalidArgumentException When the body is not valid.
+     */
+    public function withBody(StreamInterface $body)
+    {
+        // TODO: Test for invalid body?
+        $clone = clone $this;
+        $clone->body = $body;
+
+        return $clone;
+    }
+}
diff --git a/advancedcontentfilter/vendor/slim/slim/Slim/Http/Request.php b/advancedcontentfilter/vendor/slim/slim/Slim/Http/Request.php
new file mode 100644 (file)
index 0000000..4bea07e
--- /dev/null
@@ -0,0 +1,1227 @@
+<?php
+/**
+ * Slim Framework (https://slimframework.com)
+ *
+ * @link      https://github.com/slimphp/Slim
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
+ * @license   https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
+ */
+namespace Slim\Http;
+
+use Closure;
+use InvalidArgumentException;
+use Psr\Http\Message\UploadedFileInterface;
+use RuntimeException;
+use Psr\Http\Message\ServerRequestInterface;
+use Psr\Http\Message\UriInterface;
+use Psr\Http\Message\StreamInterface;
+use Slim\Collection;
+use Slim\Exception\InvalidMethodException;
+use Slim\Interfaces\Http\HeadersInterface;
+
+/**
+ * Request
+ *
+ * This class represents an HTTP request. It manages
+ * the request method, URI, headers, cookies, and body
+ * according to the PSR-7 standard.
+ *
+ * @link https://github.com/php-fig/http-message/blob/master/src/MessageInterface.php
+ * @link https://github.com/php-fig/http-message/blob/master/src/RequestInterface.php
+ * @link https://github.com/php-fig/http-message/blob/master/src/ServerRequestInterface.php
+ */
+class Request extends Message implements ServerRequestInterface
+{
+    /**
+     * The request method
+     *
+     * @var string
+     */
+    protected $method;
+
+    /**
+     * The original request method (ignoring override)
+     *
+     * @var string
+     */
+    protected $originalMethod;
+
+    /**
+     * The request URI object
+     *
+     * @var \Psr\Http\Message\UriInterface
+     */
+    protected $uri;
+
+    /**
+     * The request URI target (path + query string)
+     *
+     * @var string
+     */
+    protected $requestTarget;
+
+    /**
+     * The request query string params
+     *
+     * @var array
+     */
+    protected $queryParams;
+
+    /**
+     * The request cookies
+     *
+     * @var array
+     */
+    protected $cookies;
+
+    /**
+     * The server environment variables at the time the request was created.
+     *
+     * @var array
+     */
+    protected $serverParams;
+
+    /**
+     * The request attributes (route segment names and values)
+     *
+     * @var \Slim\Collection
+     */
+    protected $attributes;
+
+    /**
+     * The request body parsed (if possible) into a PHP array or object
+     *
+     * @var null|array|object
+     */
+    protected $bodyParsed = false;
+
+    /**
+     * List of request body parsers (e.g., url-encoded, JSON, XML, multipart)
+     *
+     * @var callable[]
+     */
+    protected $bodyParsers = [];
+
+    /**
+     * List of uploaded files
+     *
+     * @var UploadedFileInterface[]
+     */
+    protected $uploadedFiles;
+
+    /**
+     * Valid request methods
+     *
+     * @var string[]
+     * @deprecated
+     */
+    protected $validMethods = [
+        'CONNECT' => 1,
+        'DELETE' => 1,
+        'GET' => 1,
+        'HEAD' => 1,
+        'OPTIONS' => 1,
+        'PATCH' => 1,
+        'POST' => 1,
+        'PUT' => 1,
+        'TRACE' => 1,
+    ];
+
+    /**
+     * Create new HTTP request with data extracted from the application
+     * Environment object
+     *
+     * @param  Environment $environment The Slim application Environment
+     *
+     * @return static
+     */
+    public static function createFromEnvironment(Environment $environment)
+    {
+        $method = $environment['REQUEST_METHOD'];
+        $uri = Uri::createFromEnvironment($environment);
+        $headers = Headers::createFromEnvironment($environment);
+        $cookies = Cookies::parseHeader($headers->get('Cookie', []));
+        $serverParams = $environment->all();
+        $body = new RequestBody();
+        $uploadedFiles = UploadedFile::createFromEnvironment($environment);
+
+        $request = new static($method, $uri, $headers, $cookies, $serverParams, $body, $uploadedFiles);
+
+        if ($method === 'POST' &&
+            in_array($request->getMediaType(), ['application/x-www-form-urlencoded', 'multipart/form-data'])
+        ) {
+            // parsed body must be $_POST
+            $request = $request->withParsedBody($_POST);
+        }
+        return $request;
+    }
+
+    /**
+     * Create new HTTP request.
+     *
+     * Adds a host header when none was provided and a host is defined in uri.
+     *
+     * @param string           $method        The request method
+     * @param UriInterface     $uri           The request URI object
+     * @param HeadersInterface $headers       The request headers collection
+     * @param array            $cookies       The request cookies collection
+     * @param array            $serverParams  The server environment variables
+     * @param StreamInterface  $body          The request body object
+     * @param array            $uploadedFiles The request uploadedFiles collection
+     * @throws InvalidMethodException on invalid HTTP method
+     */
+    public function __construct(
+        $method,
+        UriInterface $uri,
+        HeadersInterface $headers,
+        array $cookies,
+        array $serverParams,
+        StreamInterface $body,
+        array $uploadedFiles = []
+    ) {
+        try {
+            $this->originalMethod = $this->filterMethod($method);
+        } catch (InvalidMethodException $e) {
+            $this->originalMethod = $method;
+        }
+
+        $this->uri = $uri;
+        $this->headers = $headers;
+        $this->cookies = $cookies;
+        $this->serverParams = $serverParams;
+        $this->attributes = new Collection();
+        $this->body = $body;
+        $this->uploadedFiles = $uploadedFiles;
+
+        if (isset($serverParams['SERVER_PROTOCOL'])) {
+            $this->protocolVersion = str_replace('HTTP/', '', $serverParams['SERVER_PROTOCOL']);
+        }
+
+        if (!$this->headers->has('Host') || $this->uri->getHost() !== '') {
+            $this->headers->set('Host', $this->uri->getHost());
+        }
+
+        $this->registerMediaTypeParser('application/json', function ($input) {
+            $result = json_decode($input, true);
+            if (!is_array($result)) {
+                return null;
+            }
+            return $result;
+        });
+
+        $this->registerMediaTypeParser('application/xml', function ($input) {
+            $backup = libxml_disable_entity_loader(true);
+            $backup_errors = libxml_use_internal_errors(true);
+            $result = simplexml_load_string($input);
+            libxml_disable_entity_loader($backup);
+            libxml_clear_errors();
+            libxml_use_internal_errors($backup_errors);
+            if ($result === false) {
+                return null;
+            }
+            return $result;
+        });
+
+        $this->registerMediaTypeParser('text/xml', function ($input) {
+            $backup = libxml_disable_entity_loader(true);
+            $backup_errors = libxml_use_internal_errors(true);
+            $result = simplexml_load_string($input);
+            libxml_disable_entity_loader($backup);
+            libxml_clear_errors();
+            libxml_use_internal_errors($backup_errors);
+            if ($result === false) {
+                return null;
+            }
+            return $result;
+        });
+
+        $this->registerMediaTypeParser('application/x-www-form-urlencoded', function ($input) {
+            parse_str($input, $data);
+            return $data;
+        });
+
+        // if the request had an invalid method, we can throw it now
+        if (isset($e) && $e instanceof InvalidMethodException) {
+            throw $e;
+        }
+    }
+
+    /**
+     * This method is applied to the cloned object
+     * after PHP performs an initial shallow-copy. This
+     * method completes a deep-copy by creating new objects
+     * for the cloned object's internal reference pointers.
+     */
+    public function __clone()
+    {
+        $this->headers = clone $this->headers;
+        $this->attributes = clone $this->attributes;
+        $this->body = clone $this->body;
+    }
+
+    /*******************************************************************************
+     * Method
+     ******************************************************************************/
+
+    /**
+     * Retrieves the HTTP method of the request.
+     *
+     * @return string Returns the request method.
+     */
+    public function getMethod()
+    {
+        if ($this->method === null) {
+            $this->method = $this->originalMethod;
+            $customMethod = $this->getHeaderLine('X-Http-Method-Override');
+
+            if ($customMethod) {
+                $this->method = $this->filterMethod($customMethod);
+            } elseif ($this->originalMethod === 'POST') {
+                $overrideMethod = $this->filterMethod($this->getParsedBodyParam('_METHOD'));
+                if ($overrideMethod !== null) {
+                    $this->method = $overrideMethod;
+                }
+
+                if ($this->getBody()->eof()) {
+                    $this->getBody()->rewind();
+                }
+            }
+        }
+
+        return $this->method;
+    }
+
+    /**
+     * Get the original HTTP method (ignore override).
+     *
+     * Note: This method is not part of the PSR-7 standard.
+     *
+     * @return string
+     */
+    public function getOriginalMethod()
+    {
+        return $this->originalMethod;
+    }
+
+    /**
+     * Return an instance with the provided HTTP method.
+     *
+     * While HTTP method names are typically all uppercase characters, HTTP
+     * method names are case-sensitive and thus implementations SHOULD NOT
+     * modify the given string.
+     *
+     * This method MUST be implemented in such a way as to retain the
+     * immutability of the message, and MUST return an instance that has the
+     * changed request method.
+     *
+     * @param string $method Case-sensitive method.
+     * @return static
+     * @throws \InvalidArgumentException for invalid HTTP methods.
+     */
+    public function withMethod($method)
+    {
+        $method = $this->filterMethod($method);
+        $clone = clone $this;
+        $clone->originalMethod = $method;
+        $clone->method = $method;
+
+        return $clone;
+    }
+
+    /**
+     * Validate the HTTP method
+     *
+     * @param  null|string $method
+     * @return null|string
+     * @throws \InvalidArgumentException on invalid HTTP method.
+     */
+    protected function filterMethod($method)
+    {
+        if ($method === null) {
+            return $method;
+        }
+
+        if (!is_string($method)) {
+            throw new InvalidArgumentException(sprintf(
+                'Unsupported HTTP method; must be a string, received %s',
+                (is_object($method) ? get_class($method) : gettype($method))
+            ));
+        }
+
+        $method = strtoupper($method);
+        if (preg_match("/^[!#$%&'*+.^_`|~0-9a-z-]+$/i", $method) !== 1) {
+            throw new InvalidMethodException($this, $method);
+        }
+
+        return $method;
+    }
+
+    /**
+     * Does this request use a given method?
+     *
+     * Note: This method is not part of the PSR-7 standard.
+     *
+     * @param  string $method HTTP method
+     * @return bool
+     */
+    public function isMethod($method)
+    {
+        return $this->getMethod() === $method;
+    }
+
+    /**
+     * Is this a GET request?
+     *
+     * Note: This method is not part of the PSR-7 standard.
+     *
+     * @return bool
+     */
+    public function isGet()
+    {
+        return $this->isMethod('GET');
+    }
+
+    /**
+     * Is this a POST request?
+     *
+     * Note: This method is not part of the PSR-7 standard.
+     *
+     * @return bool
+     */
+    public function isPost()
+    {
+        return $this->isMethod('POST');
+    }
+
+    /**
+     * Is this a PUT request?
+     *
+     * Note: This method is not part of the PSR-7 standard.
+     *
+     * @return bool
+     */
+    public function isPut()
+    {
+        return $this->isMethod('PUT');
+    }
+
+    /**
+     * Is this a PATCH request?
+     *
+     * Note: This method is not part of the PSR-7 standard.
+     *
+     * @return bool
+     */
+    public function isPatch()
+    {
+        return $this->isMethod('PATCH');
+    }
+
+    /**
+     * Is this a DELETE request?
+     *
+     * Note: This method is not part of the PSR-7 standard.
+     *
+     * @return bool
+     */
+    public function isDelete()
+    {
+        return $this->isMethod('DELETE');
+    }
+
+    /**
+     * Is this a HEAD request?
+     *
+     * Note: This method is not part of the PSR-7 standard.
+     *
+     * @return bool
+     */
+    public function isHead()
+    {
+        return $this->isMethod('HEAD');
+    }
+
+    /**
+     * Is this a OPTIONS request?
+     *
+     * Note: This method is not part of the PSR-7 standard.
+     *
+     * @return bool
+     */
+    public function isOptions()
+    {
+        return $this->isMethod('OPTIONS');
+    }
+
+    /**
+     * Is this an XHR request?
+     *
+     * Note: This method is not part of the PSR-7 standard.
+     *
+     * @return bool
+     */
+    public function isXhr()
+    {
+        return $this->getHeaderLine('X-Requested-With') === 'XMLHttpRequest';
+    }
+
+    /*******************************************************************************
+     * URI
+     ******************************************************************************/
+
+    /**
+     * Retrieves the message's request target.
+     *
+     * Retrieves the message's request-target either as it will appear (for
+     * clients), as it appeared at request (for servers), or as it was
+     * specified for the instance (see withRequestTarget()).
+     *
+     * In most cases, this will be the origin-form of the composed URI,
+     * unless a value was provided to the concrete implementation (see
+     * withRequestTarget() below).
+     *
+     * If no URI is available, and no request-target has been specifically
+     * provided, this method MUST return the string "/".
+     *
+     * @return string
+     */
+    public function getRequestTarget()
+    {
+        if ($this->requestTarget) {
+            return $this->requestTarget;
+        }
+
+        if ($this->uri === null) {
+            return '/';
+        }
+
+        $basePath = $this->uri->getBasePath();
+        $path = $this->uri->getPath();
+        $path = $basePath . '/' . ltrim($path, '/');
+
+        $query = $this->uri->getQuery();
+        if ($query) {
+            $path .= '?' . $query;
+        }
+        $this->requestTarget = $path;
+
+        return $this->requestTarget;
+    }
+
+    /**
+     * Return an instance with the specific request-target.
+     *
+     * If the request needs a non-origin-form request-target — e.g., for
+     * specifying an absolute-form, authority-form, or asterisk-form —
+     * this method may be used to create an instance with the specified
+     * request-target, verbatim.
+     *
+     * This method MUST be implemented in such a way as to retain the
+     * immutability of the message, and MUST return an instance that has the
+     * changed request target.
+     *
+     * @link http://tools.ietf.org/html/rfc7230#section-2.7 (for the various
+     *     request-target forms allowed in request messages)
+     * @param mixed $requestTarget
+     * @return static
+     * @throws InvalidArgumentException if the request target is invalid
+     */
+    public function withRequestTarget($requestTarget)
+    {
+        if (preg_match('#\s#', $requestTarget)) {
+            throw new InvalidArgumentException(
+                'Invalid request target provided; must be a string and cannot contain whitespace'
+            );
+        }
+        $clone = clone $this;
+        $clone->requestTarget = $requestTarget;
+
+        return $clone;
+    }
+
+    /**
+     * Retrieves the URI instance.
+     *
+     * This method MUST return a UriInterface instance.
+     *
+     * @link http://tools.ietf.org/html/rfc3986#section-4.3
+     * @return UriInterface Returns a UriInterface instance
+     *     representing the URI of the request.
+     */
+    public function getUri()
+    {
+        return $this->uri;
+    }
+
+    /**
+     * Returns an instance with the provided URI.
+     *
+     * This method MUST update the Host header of the returned request by
+     * default if the URI contains a host component. If the URI does not
+     * contain a host component, any pre-existing Host header MUST be carried
+     * over to the returned request.
+     *
+     * You can opt-in to preserving the original state of the Host header by
+     * setting `$preserveHost` to `true`. When `$preserveHost` is set to
+     * `true`, this method interacts with the Host header in the following ways:
+     *
+     * - If the the Host header is missing or empty, and the new URI contains
+     *   a host component, this method MUST update the Host header in the returned
+     *   request.
+     * - If the Host header is missing or empty, and the new URI does not contain a
+     *   host component, this method MUST NOT update the Host header in the returned
+     *   request.
+     * - If a Host header is present and non-empty, this method MUST NOT update
+     *   the Host header in the returned request.
+     *
+     * This method MUST be implemented in such a way as to retain the
+     * immutability of the message, and MUST return an instance that has the
+     * new UriInterface instance.
+     *
+     * @link http://tools.ietf.org/html/rfc3986#section-4.3
+     * @param UriInterface $uri New request URI to use.
+     * @param bool $preserveHost Preserve the original state of the Host header.
+     * @return static
+     */
+    public function withUri(UriInterface $uri, $preserveHost = false)
+    {
+        $clone = clone $this;
+        $clone->uri = $uri;
+
+        if (!$preserveHost) {
+            if ($uri->getHost() !== '') {
+                $clone->headers->set('Host', $uri->getHost());
+            }
+        } else {
+            if ($uri->getHost() !== '' && (!$this->hasHeader('Host') || $this->getHeaderLine('Host') === '')) {
+                $clone->headers->set('Host', $uri->getHost());
+            }
+        }
+
+        return $clone;
+    }
+
+    /**
+     * Get request content type.
+     *
+     * Note: This method is not part of the PSR-7 standard.
+     *
+     * @return string|null The request content type, if known
+     */
+    public function getContentType()
+    {
+        $result = $this->getHeader('Content-Type');
+
+        return $result ? $result[0] : null;
+    }
+
+    /**
+     * Get request media type, if known.
+     *
+     * Note: This method is not part of the PSR-7 standard.
+     *
+     * @return string|null The request media type, minus content-type params
+     */
+    public function getMediaType()
+    {
+        $contentType = $this->getContentType();
+        if ($contentType) {
+            $contentTypeParts = preg_split('/\s*[;,]\s*/', $contentType);
+
+            return strtolower($contentTypeParts[0]);
+        }
+
+        return null;
+    }
+
+    /**
+     * Get request media type params, if known.
+     *
+     * Note: This method is not part of the PSR-7 standard.
+     *
+     * @return array
+     */
+    public function getMediaTypeParams()
+    {
+        $contentType = $this->getContentType();
+        $contentTypeParams = [];
+        if ($contentType) {
+            $contentTypeParts = preg_split('/\s*[;,]\s*/', $contentType);
+            $contentTypePartsLength = count($contentTypeParts);
+            for ($i = 1; $i < $contentTypePartsLength; $i++) {
+                $paramParts = explode('=', $contentTypeParts[$i]);
+                $contentTypeParams[strtolower($paramParts[0])] = $paramParts[1];
+            }
+        }
+
+        return $contentTypeParams;
+    }
+
+    /**
+     * Get request content character set, if known.
+     *
+     * Note: This method is not part of the PSR-7 standard.
+     *
+     * @return string|null
+     */
+    public function getContentCharset()
+    {
+        $mediaTypeParams = $this->getMediaTypeParams();
+        if (isset($mediaTypeParams['charset'])) {
+            return $mediaTypeParams['charset'];
+        }
+
+        return null;
+    }
+
+    /**
+     * Get request content length, if known.
+     *
+     * Note: This method is not part of the PSR-7 standard.
+     *
+     * @return int|null
+     */
+    public function getContentLength()
+    {
+        $result = $this->headers->get('Content-Length');
+
+        return $result ? (int)$result[0] : null;
+    }
+
+    /*******************************************************************************
+     * Cookies
+     ******************************************************************************/
+
+    /**
+     * Retrieve cookies.
+     *
+     * Retrieves cookies sent by the client to the server.
+     *
+     * The data MUST be compatible with the structure of the $_COOKIE
+     * superglobal.
+     *
+     * @return array
+     */
+    public function getCookieParams()
+    {
+        return $this->cookies;
+    }
+
+    /**
+     * Fetch cookie value from cookies sent by the client to the server.
+     *
+     * Note: This method is not part of the PSR-7 standard.
+     *
+     * @param string $key     The attribute name.
+     * @param mixed  $default Default value to return if the attribute does not exist.
+     *
+     * @return mixed
+     */
+    public function getCookieParam($key, $default = null)
+    {
+        $cookies = $this->getCookieParams();
+        $result = $default;
+        if (isset($cookies[$key])) {
+            $result = $cookies[$key];
+        }
+
+        return $result;
+    }
+
+    /**
+     * Return an instance with the specified cookies.
+     *
+     * The data IS NOT REQUIRED to come from the $_COOKIE superglobal, but MUST
+     * be compatible with the structure of $_COOKIE. Typically, this data will
+     * be injected at instantiation.
+     *
+     * This method MUST NOT update the related Cookie header of the request
+     * instance, nor related values in the server params.
+     *
+     * This method MUST be implemented in such a way as to retain the
+     * immutability of the message, and MUST return an instance that has the
+     * updated cookie values.
+     *
+     * @param array $cookies Array of key/value pairs representing cookies.
+     * @return static
+     */
+    public function withCookieParams(array $cookies)
+    {
+        $clone = clone $this;
+        $clone->cookies = $cookies;
+
+        return $clone;
+    }
+
+    /*******************************************************************************
+     * Query Params
+     ******************************************************************************/
+
+    /**
+     * Retrieve query string arguments.
+     *
+     * Retrieves the deserialized query string arguments, if any.
+     *
+     * Note: the query params might not be in sync with the URI or server
+     * params. If you need to ensure you are only getting the original
+     * values, you may need to parse the query string from `getUri()->getQuery()`
+     * or from the `QUERY_STRING` server param.
+     *
+     * @return array
+     */
+    public function getQueryParams()
+    {
+        if (is_array($this->queryParams)) {
+            return $this->queryParams;
+        }
+
+        if ($this->uri === null) {
+            return [];
+        }
+
+        parse_str($this->uri->getQuery(), $this->queryParams); // <-- URL decodes data
+
+        return $this->queryParams;
+    }
+
+    /**
+     * Return an instance with the specified query string arguments.
+     *
+     * These values SHOULD remain immutable over the course of the incoming
+     * request. They MAY be injected during instantiation, such as from PHP's
+     * $_GET superglobal, or MAY be derived from some other value such as the
+     * URI. In cases where the arguments are parsed from the URI, the data
+     * MUST be compatible with what PHP's parse_str() would return for
+     * purposes of how duplicate query parameters are handled, and how nested
+     * sets are handled.
+     *
+     * Setting query string arguments MUST NOT change the URI stored by the
+     * request, nor the values in the server params.
+     *
+     * This method MUST be implemented in such a way as to retain the
+     * immutability of the message, and MUST return an instance that has the
+     * updated query string arguments.
+     *
+     * @param array $query Array of query string arguments, typically from
+     *     $_GET.
+     * @return static
+     */
+    public function withQueryParams(array $query)
+    {
+        $clone = clone $this;
+        $clone->queryParams = $query;
+
+        return $clone;
+    }
+
+    /*******************************************************************************
+     * File Params
+     ******************************************************************************/
+
+    /**
+     * Retrieve normalized file upload data.
+     *
+     * This method returns upload metadata in a normalized tree, with each leaf
+     * an instance of Psr\Http\Message\UploadedFileInterface.
+     *
+     * These values MAY be prepared from $_FILES or the message body during
+     * instantiation, or MAY be injected via withUploadedFiles().
+     *
+     * @return array An array tree of UploadedFileInterface instances; an empty
+     *     array MUST be returned if no data is present.
+     */
+    public function getUploadedFiles()
+    {
+        return $this->uploadedFiles;
+    }
+
+    /**
+     * Create a new instance with the specified uploaded files.
+     *
+     * This method MUST be implemented in such a way as to retain the
+     * immutability of the message, and MUST return an instance that has the
+     * updated body parameters.
+     *
+     * @param array $uploadedFiles An array tree of UploadedFileInterface instances.
+     * @return static
+     * @throws \InvalidArgumentException if an invalid structure is provided.
+     */
+    public function withUploadedFiles(array $uploadedFiles)
+    {
+        $clone = clone $this;
+        $clone->uploadedFiles = $uploadedFiles;
+
+        return $clone;
+    }
+
+    /*******************************************************************************
+     * Server Params
+     ******************************************************************************/
+
+    /**
+     * Retrieve server parameters.
+     *
+     * Retrieves data related to the incoming request environment,
+     * typically derived from PHP's $_SERVER superglobal. The data IS NOT
+     * REQUIRED to originate from $_SERVER.
+     *
+     * @return array
+     */
+    public function getServerParams()
+    {
+        return $this->serverParams;
+    }
+
+    /**
+     * Retrieve a server parameter.
+     *
+     * Note: This method is not part of the PSR-7 standard.
+     *
+     * @param  string $key
+     * @param  mixed  $default
+     * @return mixed
+     */
+    public function getServerParam($key, $default = null)
+    {
+        $serverParams = $this->getServerParams();
+
+        return isset($serverParams[$key]) ? $serverParams[$key] : $default;
+    }
+
+    /*******************************************************************************
+     * Attributes
+     ******************************************************************************/
+
+    /**
+     * Retrieve attributes derived from the request.
+     *
+     * The request "attributes" may be used to allow injection of any
+     * parameters derived from the request: e.g., the results of path
+     * match operations; the results of decrypting cookies; the results of
+     * deserializing non-form-encoded message bodies; etc. Attributes
+     * will be application and request specific, and CAN be mutable.
+     *
+     * @return array Attributes derived from the request.
+     */
+    public function getAttributes()
+    {
+        return $this->attributes->all();
+    }
+
+    /**
+     * Retrieve a single derived request attribute.
+     *
+     * Retrieves a single derived request attribute as described in
+     * getAttributes(). If the attribute has not been previously set, returns
+     * the default value as provided.
+     *
+     * This method obviates the need for a hasAttribute() method, as it allows
+     * specifying a default value to return if the attribute is not found.
+     *
+     * @see getAttributes()
+     * @param string $name The attribute name.
+     * @param mixed $default Default value to return if the attribute does not exist.
+     * @return mixed
+     */
+    public function getAttribute($name, $default = null)
+    {
+        return $this->attributes->get($name, $default);
+    }
+
+    /**
+     * Return an instance with the specified derived request attribute.
+     *
+     * This method allows setting a single derived request attribute as
+     * described in getAttributes().
+     *
+     * This method MUST be implemented in such a way as to retain the
+     * immutability of the message, and MUST return an instance that has the
+     * updated attribute.
+     *
+     * @see getAttributes()
+     * @param string $name The attribute name.
+     * @param mixed $value The value of the attribute.
+     * @return static
+     */
+    public function withAttribute($name, $value)
+    {
+        $clone = clone $this;
+        $clone->attributes->set($name, $value);
+
+        return $clone;
+    }
+
+    /**
+     * Create a new instance with the specified derived request attributes.
+     *
+     * Note: This method is not part of the PSR-7 standard.
+     *
+     * This method allows setting all new derived request attributes as
+     * described in getAttributes().
+     *
+     * This method MUST be implemented in such a way as to retain the
+     * immutability of the message, and MUST return a new instance that has the
+     * updated attributes.
+     *
+     * @param  array $attributes New attributes
+     * @return static
+     */
+    public function withAttributes(array $attributes)
+    {
+        $clone = clone $this;
+        $clone->attributes = new Collection($attributes);
+
+        return $clone;
+    }
+
+    /**
+     * Return an instance that removes the specified derived request attribute.
+     *
+     * This method allows removing a single derived request attribute as
+     * described in getAttributes().
+     *
+     * This method MUST be implemented in such a way as to retain the
+     * immutability of the message, and MUST return an instance that removes
+     * the attribute.
+     *
+     * @see getAttributes()
+     * @param string $name The attribute name.
+     * @return static
+     */
+    public function withoutAttribute($name)
+    {
+        $clone = clone $this;
+        $clone->attributes->remove($name);
+
+        return $clone;
+    }
+
+    /*******************************************************************************
+     * Body
+     ******************************************************************************/
+
+    /**
+     * Retrieve any parameters provided in the request body.
+     *
+     * If the request Content-Type is either application/x-www-form-urlencoded
+     * or multipart/form-data, and the request method is POST, this method MUST
+     * return the contents of $_POST.
+     *
+     * Otherwise, this method may return any results of deserializing
+     * the request body content; as parsing returns structured content, the
+     * potential types MUST be arrays or objects only. A null value indicates
+     * the absence of body content.
+     *
+     * @return null|array|object The deserialized body parameters, if any.
+     *     These will typically be an array or object.
+     * @throws RuntimeException if the request body media type parser returns an invalid value
+     */
+    public function getParsedBody()
+    {
+        if ($this->bodyParsed !== false) {
+            return $this->bodyParsed;
+        }
+
+        if (!$this->body) {
+            return null;
+        }
+
+        $mediaType = $this->getMediaType();
+
+        // look for a media type with a structured syntax suffix (RFC 6839)
+        $parts = explode('+', $mediaType);
+        if (count($parts) >= 2) {
+            $mediaType = 'application/' . $parts[count($parts)-1];
+        }
+
+        if (isset($this->bodyParsers[$mediaType]) === true) {
+            $body = (string)$this->getBody();
+            $parsed = $this->bodyParsers[$mediaType]($body);
+
+            if (!is_null($parsed) && !is_object($parsed) && !is_array($parsed)) {
+                throw new RuntimeException(
+                    'Request body media type parser return value must be an array, an object, or null'
+                );
+            }
+            $this->bodyParsed = $parsed;
+            return $this->bodyParsed;
+        }
+
+        return null;
+    }
+
+    /**
+     * Return an instance with the specified body parameters.
+     *
+     * These MAY be injected during instantiation.
+     *
+     * If the request Content-Type is either application/x-www-form-urlencoded
+     * or multipart/form-data, and the request method is POST, use this method
+     * ONLY to inject the contents of $_POST.
+     *
+     * The data IS NOT REQUIRED to come from $_POST, but MUST be the results of
+     * deserializing the request body content. Deserialization/parsing returns
+     * structured data, and, as such, this method ONLY accepts arrays or objects,
+     * or a null value if nothing was available to parse.
+     *
+     * As an example, if content negotiation determines that the request data
+     * is a JSON payload, this method could be used to create a request
+     * instance with the deserialized parameters.
+     *
+     * This method MUST be implemented in such a way as to retain the
+     * immutability of the message, and MUST return an instance that has the
+     * updated body parameters.
+     *
+     * @param null|array|object $data The deserialized body data. This will
+     *     typically be in an array or object.
+     * @return static
+     * @throws \InvalidArgumentException if an unsupported argument type is
+     *     provided.
+     */
+    public function withParsedBody($data)
+    {
+        if (!is_null($data) && !is_object($data) && !is_array($data)) {
+            throw new InvalidArgumentException('Parsed body value must be an array, an object, or null');
+        }
+
+        $clone = clone $this;
+        $clone->bodyParsed = $data;
+
+        return $clone;
+    }
+
+    /**
+     * Force Body to be parsed again.
+     *
+     * Note: This method is not part of the PSR-7 standard.
+     *
+     * @return $this
+     */
+    public function reparseBody()
+    {
+        $this->bodyParsed = false;
+
+        return $this;
+    }
+
+    /**
+     * Register media type parser.
+     *
+     * Note: This method is not part of the PSR-7 standard.
+     *
+     * @param string   $mediaType A HTTP media type (excluding content-type
+     *     params).
+     * @param callable $callable  A callable that returns parsed contents for
+     *     media type.
+     */
+    public function registerMediaTypeParser($mediaType, callable $callable)
+    {
+        if ($callable instanceof Closure) {
+            $callable = $callable->bindTo($this);
+        }
+        $this->bodyParsers[(string)$mediaType] = $callable;
+    }
+
+    /*******************************************************************************
+     * Parameters (e.g., POST and GET data)
+     ******************************************************************************/
+
+    /**
+     * Fetch request parameter value from body or query string (in that order).
+     *
+     * Note: This method is not part of the PSR-7 standard.
+     *
+     * @param  string $key The parameter key.
+     * @param  string $default The default value.
+     *
+     * @return mixed The parameter value.
+     */
+    public function getParam($key, $default = null)
+    {
+        $postParams = $this->getParsedBody();
+        $getParams = $this->getQueryParams();
+        $result = $default;
+        if (is_array($postParams) && isset($postParams[$key])) {
+            $result = $postParams[$key];
+        } elseif (is_object($postParams) && property_exists($postParams, $key)) {
+            $result = $postParams->$key;
+        } elseif (isset($getParams[$key])) {
+            $result = $getParams[$key];
+        }
+
+        return $result;
+    }
+
+    /**
+     * Fetch parameter value from request body.
+     *
+     * Note: This method is not part of the PSR-7 standard.
+     *
+     * @param string $key
+     * @param mixed $default
+     *
+     * @return mixed
+     */
+    public function getParsedBodyParam($key, $default = null)
+    {
+        $postParams = $this->getParsedBody();
+        $result = $default;
+        if (is_array($postParams) && isset($postParams[$key])) {
+            $result = $postParams[$key];
+        } elseif (is_object($postParams) && property_exists($postParams, $key)) {
+            $result = $postParams->$key;
+        }
+
+        return $result;
+    }
+
+    /**
+     * Fetch parameter value from query string.
+     *
+     * Note: This method is not part of the PSR-7 standard.
+     *
+     * @param string $key
+     * @param mixed $default
+     *
+     * @return mixed
+     */
+    public function getQueryParam($key, $default = null)
+    {
+        $getParams = $this->getQueryParams();
+        $result = $default;
+        if (isset($getParams[$key])) {
+            $result = $getParams[$key];
+        }
+
+        return $result;
+    }
+
+    /**
+     * Fetch associative array of body and query string parameters.
+     *
+     * Note: This method is not part of the PSR-7 standard.
+     *
+     * @param array|null $only list the keys to retrieve.
+     * @return array|null
+     */
+    public function getParams(array $only = null)
+    {
+        $params = $this->getQueryParams();
+        $postParams = $this->getParsedBody();
+        if ($postParams) {
+            $params = array_merge($params, (array)$postParams);
+        }
+
+        if ($only) {
+            $onlyParams = [];
+            foreach ($only as $key) {
+                if (array_key_exists($key, $params)) {
+                    $onlyParams[$key] = $params[$key];
+                }
+            }
+            return $onlyParams;
+        }
+
+        return $params;
+    }
+}
diff --git a/advancedcontentfilter/vendor/slim/slim/Slim/Http/RequestBody.php b/advancedcontentfilter/vendor/slim/slim/Slim/Http/RequestBody.php
new file mode 100644 (file)
index 0000000..50887fd
--- /dev/null
@@ -0,0 +1,27 @@
+<?php
+/**
+ * Slim Framework (https://slimframework.com)
+ *
+ * @link      https://github.com/slimphp/Slim
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
+ * @license   https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
+ */
+namespace Slim\Http;
+
+/**
+ * Provides a PSR-7 implementation of a reusable raw request body
+ */
+class RequestBody extends Body
+{
+    /**
+     * Create a new RequestBody.
+     */
+    public function __construct()
+    {
+        $stream = fopen('php://temp', 'w+');
+        stream_copy_to_stream(fopen('php://input', 'r'), $stream);
+        rewind($stream);
+
+        parent::__construct($stream);
+    }
+}
diff --git a/advancedcontentfilter/vendor/slim/slim/Slim/Http/Response.php b/advancedcontentfilter/vendor/slim/slim/Slim/Http/Response.php
new file mode 100644 (file)
index 0000000..d8fb8dc
--- /dev/null
@@ -0,0 +1,508 @@
+<?php
+/**
+ * Slim Framework (https://slimframework.com)
+ *
+ * @link      https://github.com/slimphp/Slim
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
+ * @license   https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
+ */
+namespace Slim\Http;
+
+use InvalidArgumentException;
+use Psr\Http\Message\ResponseInterface;
+use Psr\Http\Message\StreamInterface;
+use Psr\Http\Message\UriInterface;
+use Slim\Interfaces\Http\HeadersInterface;
+
+/**
+ * Response
+ *
+ * This class represents an HTTP response. It manages
+ * the response status, headers, and body
+ * according to the PSR-7 standard.
+ *
+ * @link https://github.com/php-fig/http-message/blob/master/src/MessageInterface.php
+ * @link https://github.com/php-fig/http-message/blob/master/src/ResponseInterface.php
+ */
+class Response extends Message implements ResponseInterface
+{
+    /**
+     * Status code
+     *
+     * @var int
+     */
+    protected $status = 200;
+
+    /**
+     * Reason phrase
+     *
+     * @var string
+     */
+    protected $reasonPhrase = '';
+
+    /**
+     * Status codes and reason phrases
+     *
+     * @var array
+     */
+    protected static $messages = [
+        //Informational 1xx
+        100 => 'Continue',
+        101 => 'Switching Protocols',
+        102 => 'Processing',
+        //Successful 2xx
+        200 => 'OK',
+        201 => 'Created',
+        202 => 'Accepted',
+        203 => 'Non-Authoritative Information',
+        204 => 'No Content',
+        205 => 'Reset Content',
+        206 => 'Partial Content',
+        207 => 'Multi-Status',
+        208 => 'Already Reported',
+        226 => 'IM Used',
+        //Redirection 3xx
+        300 => 'Multiple Choices',
+        301 => 'Moved Permanently',
+        302 => 'Found',
+        303 => 'See Other',
+        304 => 'Not Modified',
+        305 => 'Use Proxy',
+        306 => '(Unused)',
+        307 => 'Temporary Redirect',
+        308 => 'Permanent Redirect',
+        //Client Error 4xx
+        400 => 'Bad Request',
+        401 => 'Unauthorized',
+        402 => 'Payment Required',
+        403 => 'Forbidden',
+        404 => 'Not Found',
+        405 => 'Method Not Allowed',
+        406 => 'Not Acceptable',
+        407 => 'Proxy Authentication Required',
+        408 => 'Request Timeout',
+        409 => 'Conflict',
+        410 => 'Gone',
+        411 => 'Length Required',
+        412 => 'Precondition Failed',
+        413 => 'Request Entity Too Large',
+        414 => 'Request-URI Too Long',
+        415 => 'Unsupported Media Type',
+        416 => 'Requested Range Not Satisfiable',
+        417 => 'Expectation Failed',
+        418 => 'I\'m a teapot',
+        421 => 'Misdirected Request',
+        422 => 'Unprocessable Entity',
+        423 => 'Locked',
+        424 => 'Failed Dependency',
+        426 => 'Upgrade Required',
+        428 => 'Precondition Required',
+        429 => 'Too Many Requests',
+        431 => 'Request Header Fields Too Large',
+        444 => 'Connection Closed Without Response',
+        451 => 'Unavailable For Legal Reasons',
+        499 => 'Client Closed Request',
+        //Server Error 5xx
+        500 => 'Internal Server Error',
+        501 => 'Not Implemented',
+        502 => 'Bad Gateway',
+        503 => 'Service Unavailable',
+        504 => 'Gateway Timeout',
+        505 => 'HTTP Version Not Supported',
+        506 => 'Variant Also Negotiates',
+        507 => 'Insufficient Storage',
+        508 => 'Loop Detected',
+        510 => 'Not Extended',
+        511 => 'Network Authentication Required',
+        599 => 'Network Connect Timeout Error',
+    ];
+
+    /**
+     * EOL characters used for HTTP response.
+     *
+     * @var string
+     */
+     const EOL = "\r\n";
+
+    /**
+     * Create new HTTP response.
+     *
+     * @param int                   $status  The response status code.
+     * @param HeadersInterface|null $headers The response headers.
+     * @param StreamInterface|null  $body    The response body.
+     */
+    public function __construct($status = 200, HeadersInterface $headers = null, StreamInterface $body = null)
+    {
+        $this->status = $this->filterStatus($status);
+        $this->headers = $headers ? $headers : new Headers();
+        $this->body = $body ? $body : new Body(fopen('php://temp', 'r+'));
+    }
+
+    /**
+     * This method is applied to the cloned object
+     * after PHP performs an initial shallow-copy. This
+     * method completes a deep-copy by creating new objects
+     * for the cloned object's internal reference pointers.
+     */
+    public function __clone()
+    {
+        $this->headers = clone $this->headers;
+    }
+
+    /*******************************************************************************
+     * Status
+     ******************************************************************************/
+
+    /**
+     * Gets the response status code.
+     *
+     * The status code is a 3-digit integer result code of the server's attempt
+     * to understand and satisfy the request.
+     *
+     * @return int Status code.
+     */
+    public function getStatusCode()
+    {
+        return $this->status;
+    }
+
+    /**
+     * Return an instance with the specified status code and, optionally, reason phrase.
+     *
+     * If no reason phrase is specified, implementations MAY choose to default
+     * to the RFC 7231 or IANA recommended reason phrase for the response's
+     * status code.
+     *
+     * This method MUST be implemented in such a way as to retain the
+     * immutability of the message, and MUST return an instance that has the
+     * updated status and reason phrase.
+     *
+     * @link http://tools.ietf.org/html/rfc7231#section-6
+     * @link http://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml
+     * @param int $code The 3-digit integer result code to set.
+     * @param string $reasonPhrase The reason phrase to use with the
+     *     provided status code; if none is provided, implementations MAY
+     *     use the defaults as suggested in the HTTP specification.
+     * @return static
+     * @throws \InvalidArgumentException For invalid status code arguments.
+     */
+    public function withStatus($code, $reasonPhrase = '')
+    {
+        $code = $this->filterStatus($code);
+
+        if (!is_string($reasonPhrase) && !method_exists($reasonPhrase, '__toString')) {
+            throw new InvalidArgumentException('ReasonPhrase must be a string');
+        }
+
+        $clone = clone $this;
+        $clone->status = $code;
+        if ($reasonPhrase === '' && isset(static::$messages[$code])) {
+            $reasonPhrase = static::$messages[$code];
+        }
+
+        if ($reasonPhrase === '') {
+            throw new InvalidArgumentException('ReasonPhrase must be supplied for this code');
+        }
+
+        $clone->reasonPhrase = $reasonPhrase;
+
+        return $clone;
+    }
+
+    /**
+     * Filter HTTP status code.
+     *
+     * @param  int $status HTTP status code.
+     * @return int
+     * @throws \InvalidArgumentException If an invalid HTTP status code is provided.
+     */
+    protected function filterStatus($status)
+    {
+        if (!is_integer($status) || $status<100 || $status>599) {
+            throw new InvalidArgumentException('Invalid HTTP status code');
+        }
+
+        return $status;
+    }
+
+    /**
+     * Gets the response reason phrase associated with the status code.
+     *
+     * Because a reason phrase is not a required element in a response
+     * status line, the reason phrase value MAY be null. Implementations MAY
+     * choose to return the default RFC 7231 recommended reason phrase (or those
+     * listed in the IANA HTTP Status Code Registry) for the response's
+     * status code.
+     *
+     * @link http://tools.ietf.org/html/rfc7231#section-6
+     * @link http://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml
+     * @return string Reason phrase; must return an empty string if none present.
+     */
+    public function getReasonPhrase()
+    {
+        if ($this->reasonPhrase) {
+            return $this->reasonPhrase;
+        }
+        if (isset(static::$messages[$this->status])) {
+            return static::$messages[$this->status];
+        }
+        return '';
+    }
+
+    /*******************************************************************************
+     * Headers
+     ******************************************************************************/
+
+    /**
+     * Return an instance with the provided value replacing the specified header.
+     *
+     * If a Location header is set and the status code is 200, then set the status
+     * code to 302 to mimic what PHP does. See https://github.com/slimphp/Slim/issues/1730
+     *
+     * @param string $name Case-insensitive header field name.
+     * @param string|string[] $value Header value(s).
+     * @return static
+     * @throws \InvalidArgumentException for invalid header names or values.
+     */
+    public function withHeader($name, $value)
+    {
+        $clone = clone $this;
+        $clone->headers->set($name, $value);
+
+        if ($clone->getStatusCode() === 200 && strtolower($name) === 'location') {
+            $clone = $clone->withStatus(302);
+        }
+
+        return $clone;
+    }
+
+
+    /*******************************************************************************
+     * Body
+     ******************************************************************************/
+
+    /**
+     * Write data to the response body.
+     *
+     * Note: This method is not part of the PSR-7 standard.
+     *
+     * Proxies to the underlying stream and writes the provided data to it.
+     *
+     * @param string $data
+     * @return $this
+     */
+    public function write($data)
+    {
+        $this->getBody()->write($data);
+
+        return $this;
+    }
+
+    /*******************************************************************************
+     * Response Helpers
+     ******************************************************************************/
+
+    /**
+     * Redirect.
+     *
+     * Note: This method is not part of the PSR-7 standard.
+     *
+     * This method prepares the response object to return an HTTP Redirect
+     * response to the client.
+     *
+     * @param  string|UriInterface $url    The redirect destination.
+     * @param  int|null            $status The redirect HTTP status code.
+     * @return static
+     */
+    public function withRedirect($url, $status = null)
+    {
+        $responseWithRedirect = $this->withHeader('Location', (string)$url);
+
+        if (is_null($status) && $this->getStatusCode() === 200) {
+            $status = 302;
+        }
+
+        if (!is_null($status)) {
+            return $responseWithRedirect->withStatus($status);
+        }
+
+        return $responseWithRedirect;
+    }
+
+    /**
+     * Json.
+     *
+     * Note: This method is not part of the PSR-7 standard.
+     *
+     * This method prepares the response object to return an HTTP Json
+     * response to the client.
+     *
+     * @param  mixed  $data   The data
+     * @param  int    $status The HTTP status code.
+     * @param  int    $encodingOptions Json encoding options
+     * @throws \RuntimeException
+     * @return static
+     */
+    public function withJson($data, $status = null, $encodingOptions = 0)
+    {
+        $response = $this->withBody(new Body(fopen('php://temp', 'r+')));
+        $response->body->write($json = json_encode($data, $encodingOptions));
+
+        // Ensure that the json encoding passed successfully
+        if ($json === false) {
+            throw new \RuntimeException(json_last_error_msg(), json_last_error());
+        }
+
+        $responseWithJson = $response->withHeader('Content-Type', 'application/json;charset=utf-8');
+        if (isset($status)) {
+            return $responseWithJson->withStatus($status);
+        }
+        return $responseWithJson;
+    }
+
+    /**
+     * Is this response empty?
+     *
+     * Note: This method is not part of the PSR-7 standard.
+     *
+     * @return bool
+     */
+    public function isEmpty()
+    {
+        return in_array($this->getStatusCode(), [204, 205, 304]);
+    }
+
+    /**
+     * Is this response informational?
+     *
+     * Note: This method is not part of the PSR-7 standard.
+     *
+     * @return bool
+     */
+    public function isInformational()
+    {
+        return $this->getStatusCode() >= 100 && $this->getStatusCode() < 200;
+    }
+
+    /**
+     * Is this response OK?
+     *
+     * Note: This method is not part of the PSR-7 standard.
+     *
+     * @return bool
+     */
+    public function isOk()
+    {
+        return $this->getStatusCode() === 200;
+    }
+
+    /**
+     * Is this response successful?
+     *
+     * Note: This method is not part of the PSR-7 standard.
+     *
+     * @return bool
+     */
+    public function isSuccessful()
+    {
+        return $this->getStatusCode() >= 200 && $this->getStatusCode() < 300;
+    }
+
+    /**
+     * Is this response a redirect?
+     *
+     * Note: This method is not part of the PSR-7 standard.
+     *
+     * @return bool
+     */
+    public function isRedirect()
+    {
+        return in_array($this->getStatusCode(), [301, 302, 303, 307]);
+    }
+
+    /**
+     * Is this response a redirection?
+     *
+     * Note: This method is not part of the PSR-7 standard.
+     *
+     * @return bool
+     */
+    public function isRedirection()
+    {
+        return $this->getStatusCode() >= 300 && $this->getStatusCode() < 400;
+    }
+
+    /**
+     * Is this response forbidden?
+     *
+     * Note: This method is not part of the PSR-7 standard.
+     *
+     * @return bool
+     * @api
+     */
+    public function isForbidden()
+    {
+        return $this->getStatusCode() === 403;
+    }
+
+    /**
+     * Is this response not Found?
+     *
+     * Note: This method is not part of the PSR-7 standard.
+     *
+     * @return bool
+     */
+    public function isNotFound()
+    {
+        return $this->getStatusCode() === 404;
+    }
+
+    /**
+     * Is this response a client error?
+     *
+     * Note: This method is not part of the PSR-7 standard.
+     *
+     * @return bool
+     */
+    public function isClientError()
+    {
+        return $this->getStatusCode() >= 400 && $this->getStatusCode() < 500;
+    }
+
+    /**
+     * Is this response a server error?
+     *
+     * Note: This method is not part of the PSR-7 standard.
+     *
+     * @return bool
+     */
+    public function isServerError()
+    {
+        return $this->getStatusCode() >= 500 && $this->getStatusCode() < 600;
+    }
+
+    /**
+     * Convert response to string.
+     *
+     * Note: This method is not part of the PSR-7 standard.
+     *
+     * @return string
+     */
+    public function __toString()
+    {
+        $output = sprintf(
+            'HTTP/%s %s %s',
+            $this->getProtocolVersion(),
+            $this->getStatusCode(),
+            $this->getReasonPhrase()
+        );
+        $output .= Response::EOL;
+        foreach ($this->getHeaders() as $name => $values) {
+            $output .= sprintf('%s: %s', $name, $this->getHeaderLine($name)) . Response::EOL;
+        }
+        $output .= Response::EOL;
+        $output .= (string)$this->getBody();
+
+        return $output;
+    }
+}
diff --git a/advancedcontentfilter/vendor/slim/slim/Slim/Http/Stream.php b/advancedcontentfilter/vendor/slim/slim/Slim/Http/Stream.php
new file mode 100644 (file)
index 0000000..27c7a76
--- /dev/null
@@ -0,0 +1,450 @@
+<?php
+/**
+ * Slim Framework (https://slimframework.com)
+ *
+ * @link      https://github.com/slimphp/Slim
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
+ * @license   https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
+ */
+namespace Slim\Http;
+
+use InvalidArgumentException;
+use Psr\Http\Message\StreamInterface;
+use RuntimeException;
+
+/**
+ * Represents a data stream as defined in PSR-7.
+ *
+ * @link https://github.com/php-fig/http-message/blob/master/src/StreamInterface.php
+ */
+class Stream implements StreamInterface
+{
+    /**
+     * Bit mask to determine if the stream is a pipe
+     *
+     * This is octal as per header stat.h
+     */
+    const FSTAT_MODE_S_IFIFO = 0010000;
+
+    /**
+     * Resource modes
+     *
+     * @var  array
+     * @link http://php.net/manual/function.fopen.php
+     */
+    protected static $modes = [
+        'readable' => ['r', 'r+', 'w+', 'a+', 'x+', 'c+'],
+        'writable' => ['r+', 'w', 'w+', 'a', 'a+', 'x', 'x+', 'c', 'c+'],
+    ];
+
+    /**
+     * The underlying stream resource
+     *
+     * @var resource
+     */
+    protected $stream;
+
+    /**
+     * Stream metadata
+     *
+     * @var array
+     */
+    protected $meta;
+
+    /**
+     * Is this stream readable?
+     *
+     * @var bool
+     */
+    protected $readable;
+
+    /**
+     * Is this stream writable?
+     *
+     * @var bool
+     */
+    protected $writable;
+
+    /**
+     * Is this stream seekable?
+     *
+     * @var bool
+     */
+    protected $seekable;
+
+    /**
+     * The size of the stream if known
+     *
+     * @var null|int
+     */
+    protected $size;
+
+    /**
+     * Is this stream a pipe?
+     *
+     * @var bool
+     */
+    protected $isPipe;
+
+    /**
+     * Create a new Stream.
+     *
+     * @param  resource $stream A PHP resource handle.
+     *
+     * @throws InvalidArgumentException If argument is not a resource.
+     */
+    public function __construct($stream)
+    {
+        $this->attach($stream);
+    }
+
+    /**
+     * Get stream metadata as an associative array or retrieve a specific key.
+     *
+     * The keys returned are identical to the keys returned from PHP's
+     * stream_get_meta_data() function.
+     *
+     * @link http://php.net/manual/en/function.stream-get-meta-data.php
+     *
+     * @param string $key Specific metadata to retrieve.
+     *
+     * @return array|mixed|null Returns an associative array if no key is
+     *     provided. Returns a specific key value if a key is provided and the
+     *     value is found, or null if the key is not found.
+     */
+    public function getMetadata($key = null)
+    {
+        $this->meta = stream_get_meta_data($this->stream);
+        if (is_null($key) === true) {
+            return $this->meta;
+        }
+
+        return isset($this->meta[$key]) ? $this->meta[$key] : null;
+    }
+
+    /**
+     * Is a resource attached to this stream?
+     *
+     * Note: This method is not part of the PSR-7 standard.
+     *
+     * @return bool
+     */
+    protected function isAttached()
+    {
+        return is_resource($this->stream);
+    }
+
+    /**
+     * Attach new resource to this object.
+     *
+     * Note: This method is not part of the PSR-7 standard.
+     *
+     * @param resource $newStream A PHP resource handle.
+     *
+     * @throws InvalidArgumentException If argument is not a valid PHP resource.
+     */
+    protected function attach($newStream)
+    {
+        if (is_resource($newStream) === false) {
+            throw new InvalidArgumentException(__METHOD__ . ' argument must be a valid PHP resource');
+        }
+
+        if ($this->isAttached() === true) {
+            $this->detach();
+        }
+
+        $this->stream = $newStream;
+    }
+
+    /**
+     * Separates any underlying resources from the stream.
+     *
+     * After the stream has been detached, the stream is in an unusable state.
+     *
+     * @return resource|null Underlying PHP stream, if any
+     */
+    public function detach()
+    {
+        $oldResource = $this->stream;
+        $this->stream = null;
+        $this->meta = null;
+        $this->readable = null;
+        $this->writable = null;
+        $this->seekable = null;
+        $this->size = null;
+        $this->isPipe = null;
+
+        return $oldResource;
+    }
+
+    /**
+     * Reads all data from the stream into a string, from the beginning to end.
+     *
+     * This method MUST attempt to seek to the beginning of the stream before
+     * reading data and read the stream until the end is reached.
+     *
+     * Warning: This could attempt to load a large amount of data into memory.
+     *
+     * This method MUST NOT raise an exception in order to conform with PHP's
+     * string casting operations.
+     *
+     * @see http://php.net/manual/en/language.oop5.magic.php#object.tostring
+     * @return string
+     */
+    public function __toString()
+    {
+        if (!$this->isAttached()) {
+            return '';
+        }
+
+        try {
+            $this->rewind();
+            return $this->getContents();
+        } catch (RuntimeException $e) {
+            return '';
+        }
+    }
+
+    /**
+     * Closes the stream and any underlying resources.
+     */
+    public function close()
+    {
+        if ($this->isAttached() === true) {
+            if ($this->isPipe()) {
+                pclose($this->stream);
+            } else {
+                fclose($this->stream);
+            }
+        }
+
+        $this->detach();
+    }
+
+    /**
+     * Get the size of the stream if known.
+     *
+     * @return int|null Returns the size in bytes if known, or null if unknown.
+     */
+    public function getSize()
+    {
+        if (!$this->size && $this->isAttached() === true) {
+            $stats = fstat($this->stream);
+            $this->size = isset($stats['size']) && !$this->isPipe() ? $stats['size'] : null;
+        }
+
+        return $this->size;
+    }
+
+    /**
+     * Returns the current position of the file read/write pointer
+     *
+     * @return int Position of the file pointer
+     *
+     * @throws RuntimeException on error.
+     */
+    public function tell()
+    {
+        if (!$this->isAttached() || ($position = ftell($this->stream)) === false || $this->isPipe()) {
+            throw new RuntimeException('Could not get the position of the pointer in stream');
+        }
+
+        return $position;
+    }
+
+    /**
+     * Returns true if the stream is at the end of the stream.
+     *
+     * @return bool
+     */
+    public function eof()
+    {
+        return $this->isAttached() ? feof($this->stream) : true;
+    }
+
+    /**
+     * Returns whether or not the stream is readable.
+     *
+     * @return bool
+     */
+    public function isReadable()
+    {
+        if ($this->readable === null) {
+            if ($this->isPipe()) {
+                $this->readable = true;
+            } else {
+                $this->readable = false;
+                if ($this->isAttached()) {
+                    $meta = $this->getMetadata();
+                    foreach (self::$modes['readable'] as $mode) {
+                        if (strpos($meta['mode'], $mode) === 0) {
+                            $this->readable = true;
+                            break;
+                        }
+                    }
+                }
+            }
+        }
+
+        return $this->readable;
+    }
+
+    /**
+     * Returns whether or not the stream is writable.
+     *
+     * @return bool
+     */
+    public function isWritable()
+    {
+        if ($this->writable === null) {
+            $this->writable = false;
+            if ($this->isAttached()) {
+                $meta = $this->getMetadata();
+                foreach (self::$modes['writable'] as $mode) {
+                    if (strpos($meta['mode'], $mode) === 0) {
+                        $this->writable = true;
+                        break;
+                    }
+                }
+            }
+        }
+
+        return $this->writable;
+    }
+
+    /**
+     * Returns whether or not the stream is seekable.
+     *
+     * @return bool
+     */
+    public function isSeekable()
+    {
+        if ($this->seekable === null) {
+            $this->seekable = false;
+            if ($this->isAttached()) {
+                $meta = $this->getMetadata();
+                $this->seekable = !$this->isPipe() && $meta['seekable'];
+            }
+        }
+
+        return $this->seekable;
+    }
+
+    /**
+     * Seek to a position in the stream.
+     *
+     * @link http://www.php.net/manual/en/function.fseek.php
+     *
+     * @param int $offset Stream offset
+     * @param int $whence Specifies how the cursor position will be calculated
+     *     based on the seek offset. Valid values are identical to the built-in
+     *     PHP $whence values for `fseek()`.  SEEK_SET: Set position equal to
+     *     offset bytes SEEK_CUR: Set position to current location plus offset
+     *     SEEK_END: Set position to end-of-stream plus offset.
+     *
+     * @throws RuntimeException on failure.
+     */
+    public function seek($offset, $whence = SEEK_SET)
+    {
+        // Note that fseek returns 0 on success!
+        if (!$this->isSeekable() || fseek($this->stream, $offset, $whence) === -1) {
+            throw new RuntimeException('Could not seek in stream');
+        }
+    }
+
+    /**
+     * Seek to the beginning of the stream.
+     *
+     * If the stream is not seekable, this method will raise an exception;
+     * otherwise, it will perform a seek(0).
+     *
+     * @see seek()
+     *
+     * @link http://www.php.net/manual/en/function.fseek.php
+     *
+     * @throws RuntimeException on failure.
+     */
+    public function rewind()
+    {
+        if (!$this->isSeekable() || rewind($this->stream) === false) {
+            throw new RuntimeException('Could not rewind stream');
+        }
+    }
+
+    /**
+     * Read data from the stream.
+     *
+     * @param int $length Read up to $length bytes from the object and return
+     *     them. Fewer than $length bytes may be returned if underlying stream
+     *     call returns fewer bytes.
+     *
+     * @return string Returns the data read from the stream, or an empty string
+     *     if no bytes are available.
+     *
+     * @throws RuntimeException if an error occurs.
+     */
+    public function read($length)
+    {
+        if (!$this->isReadable() || ($data = fread($this->stream, $length)) === false) {
+            throw new RuntimeException('Could not read from stream');
+        }
+
+        return $data;
+    }
+
+    /**
+     * Write data to the stream.
+     *
+     * @param string $string The string that is to be written.
+     *
+     * @return int Returns the number of bytes written to the stream.
+     *
+     * @throws RuntimeException on failure.
+     */
+    public function write($string)
+    {
+        if (!$this->isWritable() || ($written = fwrite($this->stream, $string)) === false) {
+            throw new RuntimeException('Could not write to stream');
+        }
+
+        // reset size so that it will be recalculated on next call to getSize()
+        $this->size = null;
+
+        return $written;
+    }
+
+    /**
+     * Returns the remaining contents in a string
+     *
+     * @return string
+     *
+     * @throws RuntimeException if unable to read or an error occurs while
+     *     reading.
+     */
+    public function getContents()
+    {
+        if (!$this->isReadable() || ($contents = stream_get_contents($this->stream)) === false) {
+            throw new RuntimeException('Could not get contents of stream');
+        }
+
+        return $contents;
+    }
+
+    /**
+     * Returns whether or not the stream is a pipe.
+     *
+     * @return bool
+     */
+    public function isPipe()
+    {
+        if ($this->isPipe === null) {
+            $this->isPipe = false;
+            if ($this->isAttached()) {
+                $mode = fstat($this->stream)['mode'];
+                $this->isPipe = ($mode & self::FSTAT_MODE_S_IFIFO) !== 0;
+            }
+        }
+
+        return $this->isPipe;
+    }
+}
diff --git a/advancedcontentfilter/vendor/slim/slim/Slim/Http/UploadedFile.php b/advancedcontentfilter/vendor/slim/slim/Slim/Http/UploadedFile.php
new file mode 100644 (file)
index 0000000..ae5dfb6
--- /dev/null
@@ -0,0 +1,327 @@
+<?php
+/**
+ * Slim Framework (https://slimframework.com)
+ *
+ * @link      https://github.com/slimphp/Slim
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
+ * @license   https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
+ */
+namespace Slim\Http;
+
+use RuntimeException;
+use InvalidArgumentException;
+use Psr\Http\Message\StreamInterface;
+use Psr\Http\Message\UploadedFileInterface;
+
+/**
+ * Represents Uploaded Files.
+ *
+ * It manages and normalizes uploaded files according to the PSR-7 standard.
+ *
+ * @link https://github.com/php-fig/http-message/blob/master/src/UploadedFileInterface.php
+ * @link https://github.com/php-fig/http-message/blob/master/src/StreamInterface.php
+ */
+class UploadedFile implements UploadedFileInterface
+{
+    /**
+     * The client-provided full path to the file
+     *
+     * @note this is public to maintain BC with 3.1.0 and earlier.
+     *
+     * @var string
+     */
+    public $file;
+    /**
+     * The client-provided file name.
+     *
+     * @var string
+     */
+    protected $name;
+    /**
+     * The client-provided media type of the file.
+     *
+     * @var string
+     */
+    protected $type;
+    /**
+     * The size of the file in bytes.
+     *
+     * @var int
+     */
+    protected $size;
+    /**
+     * A valid PHP UPLOAD_ERR_xxx code for the file upload.
+     *
+     * @var int
+     */
+    protected $error = UPLOAD_ERR_OK;
+    /**
+     * Indicates if the upload is from a SAPI environment.
+     *
+     * @var bool
+     */
+    protected $sapi = false;
+    /**
+     * An optional StreamInterface wrapping the file resource.
+     *
+     * @var StreamInterface
+     */
+    protected $stream;
+    /**
+     * Indicates if the uploaded file has already been moved.
+     *
+     * @var bool
+     */
+    protected $moved = false;
+
+    /**
+     * Create a normalized tree of UploadedFile instances from the Environment.
+     *
+     * @param Environment $env The environment
+     *
+     * @return array|null A normalized tree of UploadedFile instances or null if none are provided.
+     */
+    public static function createFromEnvironment(Environment $env)
+    {
+        if (is_array($env['slim.files']) && $env->has('slim.files')) {
+            return $env['slim.files'];
+        } elseif (isset($_FILES)) {
+            return static::parseUploadedFiles($_FILES);
+        }
+
+        return [];
+    }
+
+    /**
+     * Parse a non-normalized, i.e. $_FILES superglobal, tree of uploaded file data.
+     *
+     * @param array $uploadedFiles The non-normalized tree of uploaded file data.
+     *
+     * @return array A normalized tree of UploadedFile instances.
+     */
+    private static function parseUploadedFiles(array $uploadedFiles)
+    {
+        $parsed = [];
+        foreach ($uploadedFiles as $field => $uploadedFile) {
+            if (!isset($uploadedFile['error'])) {
+                if (is_array($uploadedFile)) {
+                    $parsed[$field] = static::parseUploadedFiles($uploadedFile);
+                }
+                continue;
+            }
+
+            $parsed[$field] = [];
+            if (!is_array($uploadedFile['error'])) {
+                $parsed[$field] = new static(
+                    $uploadedFile['tmp_name'],
+                    isset($uploadedFile['name']) ? $uploadedFile['name'] : null,
+                    isset($uploadedFile['type']) ? $uploadedFile['type'] : null,
+                    isset($uploadedFile['size']) ? $uploadedFile['size'] : null,
+                    $uploadedFile['error'],
+                    true
+                );
+            } else {
+                $subArray = [];
+                foreach ($uploadedFile['error'] as $fileIdx => $error) {
+                    // normalise subarray and re-parse to move the input's keyname up a level
+                    $subArray[$fileIdx]['name'] = $uploadedFile['name'][$fileIdx];
+                    $subArray[$fileIdx]['type'] = $uploadedFile['type'][$fileIdx];
+                    $subArray[$fileIdx]['tmp_name'] = $uploadedFile['tmp_name'][$fileIdx];
+                    $subArray[$fileIdx]['error'] = $uploadedFile['error'][$fileIdx];
+                    $subArray[$fileIdx]['size'] = $uploadedFile['size'][$fileIdx];
+
+                    $parsed[$field] = static::parseUploadedFiles($subArray);
+                }
+            }
+        }
+
+        return $parsed;
+    }
+
+    /**
+     * Construct a new UploadedFile instance.
+     *
+     * @param string      $file The full path to the uploaded file provided by the client.
+     * @param string|null $name The file name.
+     * @param string|null $type The file media type.
+     * @param int|null    $size The file size in bytes.
+     * @param int         $error The UPLOAD_ERR_XXX code representing the status of the upload.
+     * @param bool        $sapi Indicates if the upload is in a SAPI environment.
+     */
+    public function __construct($file, $name = null, $type = null, $size = null, $error = UPLOAD_ERR_OK, $sapi = false)
+    {
+        $this->file = $file;
+        $this->name = $name;
+        $this->type = $type;
+        $this->size = $size;
+        $this->error = $error;
+        $this->sapi = $sapi;
+    }
+
+    /**
+     * Retrieve a stream representing the uploaded file.
+     *
+     * This method MUST return a StreamInterface instance, representing the
+     * uploaded file. The purpose of this method is to allow utilizing native PHP
+     * stream functionality to manipulate the file upload, such as
+     * stream_copy_to_stream() (though the result will need to be decorated in a
+     * native PHP stream wrapper to work with such functions).
+     *
+     * If the moveTo() method has been called previously, this method MUST raise
+     * an exception.
+     *
+     * @return StreamInterface Stream representation of the uploaded file.
+     * @throws \RuntimeException in cases when no stream is available or can be
+     *     created.
+     */
+    public function getStream()
+    {
+        if ($this->moved) {
+            throw new \RuntimeException(sprintf('Uploaded file %1s has already been moved', $this->name));
+        }
+        if ($this->stream === null) {
+            $this->stream = new Stream(fopen($this->file, 'r'));
+        }
+
+        return $this->stream;
+    }
+
+    /**
+     * Move the uploaded file to a new location.
+     *
+     * Use this method as an alternative to move_uploaded_file(). This method is
+     * guaranteed to work in both SAPI and non-SAPI environments.
+     * Implementations must determine which environment they are in, and use the
+     * appropriate method (move_uploaded_file(), rename(), or a stream
+     * operation) to perform the operation.
+     *
+     * $targetPath may be an absolute path, or a relative path. If it is a
+     * relative path, resolution should be the same as used by PHP's rename()
+     * function.
+     *
+     * The original file or stream MUST be removed on completion.
+     *
+     * If this method is called more than once, any subsequent calls MUST raise
+     * an exception.
+     *
+     * When used in an SAPI environment where $_FILES is populated, when writing
+     * files via moveTo(), is_uploaded_file() and move_uploaded_file() SHOULD be
+     * used to ensure permissions and upload status are verified correctly.
+     *
+     * If you wish to move to a stream, use getStream(), as SAPI operations
+     * cannot guarantee writing to stream destinations.
+     *
+     * @see http://php.net/is_uploaded_file
+     * @see http://php.net/move_uploaded_file
+     *
+     * @param string $targetPath Path to which to move the uploaded file.
+     *
+     * @throws InvalidArgumentException if the $path specified is invalid.
+     * @throws RuntimeException on any error during the move operation, or on
+     *     the second or subsequent call to the method.
+     */
+    public function moveTo($targetPath)
+    {
+        if ($this->moved) {
+            throw new RuntimeException('Uploaded file already moved');
+        }
+
+        $targetIsStream = strpos($targetPath, '://') > 0;
+        if (!$targetIsStream && !is_writable(dirname($targetPath))) {
+            throw new InvalidArgumentException('Upload target path is not writable');
+        }
+
+        if ($targetIsStream) {
+            if (!copy($this->file, $targetPath)) {
+                throw new RuntimeException(sprintf('Error moving uploaded file %1s to %2s', $this->name, $targetPath));
+            }
+            if (!unlink($this->file)) {
+                throw new RuntimeException(sprintf('Error removing uploaded file %1s', $this->name));
+            }
+        } elseif ($this->sapi) {
+            if (!is_uploaded_file($this->file)) {
+                throw new RuntimeException(sprintf('%1s is not a valid uploaded file', $this->file));
+            }
+
+            if (!move_uploaded_file($this->file, $targetPath)) {
+                throw new RuntimeException(sprintf('Error moving uploaded file %1s to %2s', $this->name, $targetPath));
+            }
+        } else {
+            if (!rename($this->file, $targetPath)) {
+                throw new RuntimeException(sprintf('Error moving uploaded file %1s to %2s', $this->name, $targetPath));
+            }
+        }
+
+        $this->moved = true;
+    }
+
+    /**
+     * Retrieve the error associated with the uploaded file.
+     *
+     * The return value MUST be one of PHP's UPLOAD_ERR_XXX constants.
+     *
+     * If the file was uploaded successfully, this method MUST return
+     * UPLOAD_ERR_OK.
+     *
+     * Implementations SHOULD return the value stored in the "error" key of
+     * the file in the $_FILES array.
+     *
+     * @see http://php.net/manual/en/features.file-upload.errors.php
+     *
+     * @return int One of PHP's UPLOAD_ERR_XXX constants.
+     */
+    public function getError()
+    {
+        return $this->error;
+    }
+
+    /**
+     * Retrieve the filename sent by the client.
+     *
+     * Do not trust the value returned by this method. A client could send
+     * a malicious filename with the intention to corrupt or hack your
+     * application.
+     *
+     * Implementations SHOULD return the value stored in the "name" key of
+     * the file in the $_FILES array.
+     *
+     * @return string|null The filename sent by the client or null if none
+     *     was provided.
+     */
+    public function getClientFilename()
+    {
+        return $this->name;
+    }
+
+    /**
+     * Retrieve the media type sent by the client.
+     *
+     * Do not trust the value returned by this method. A client could send
+     * a malicious media type with the intention to corrupt or hack your
+     * application.
+     *
+     * Implementations SHOULD return the value stored in the "type" key of
+     * the file in the $_FILES array.
+     *
+     * @return string|null The media type sent by the client or null if none
+     *     was provided.
+     */
+    public function getClientMediaType()
+    {
+        return $this->type;
+    }
+
+    /**
+     * Retrieve the file size.
+     *
+     * Implementations SHOULD return the value stored in the "size" key of
+     * the file in the $_FILES array if available, as PHP calculates this based
+     * on the actual size transmitted.
+     *
+     * @return int|null The file size in bytes or null if unknown.
+     */
+    public function getSize()
+    {
+        return $this->size;
+    }
+}
diff --git a/advancedcontentfilter/vendor/slim/slim/Slim/Http/Uri.php b/advancedcontentfilter/vendor/slim/slim/Slim/Http/Uri.php
new file mode 100644 (file)
index 0000000..fb0f04b
--- /dev/null
@@ -0,0 +1,845 @@
+<?php
+/**
+ * Slim Framework (https://slimframework.com)
+ *
+ * @link      https://github.com/slimphp/Slim
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
+ * @license   https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
+ */
+namespace Slim\Http;
+
+use InvalidArgumentException;
+use \Psr\Http\Message\UriInterface;
+use Slim\Http\Environment;
+
+/**
+ * Value object representing a URI.
+ *
+ * This interface is meant to represent URIs according to RFC 3986 and to
+ * provide methods for most common operations. Additional functionality for
+ * working with URIs can be provided on top of the interface or externally.
+ * Its primary use is for HTTP requests, but may also be used in other
+ * contexts.
+ *
+ * Instances of this interface are considered immutable; all methods that
+ * might change state MUST be implemented such that they retain the internal
+ * state of the current instance and return an instance that contains the
+ * changed state.
+ *
+ * Typically the Host header will be also be present in the request message.
+ * For server-side requests, the scheme will typically be discoverable in the
+ * server parameters.
+ *
+ * @link http://tools.ietf.org/html/rfc3986 (the URI specification)
+ */
+class Uri implements UriInterface
+{
+    /**
+     * Uri scheme (without "://" suffix)
+     *
+     * @var string
+     */
+    protected $scheme = '';
+
+    /**
+     * Uri user
+     *
+     * @var string
+     */
+    protected $user = '';
+
+    /**
+     * Uri password
+     *
+     * @var string
+     */
+    protected $password = '';
+
+    /**
+     * Uri host
+     *
+     * @var string
+     */
+    protected $host = '';
+
+    /**
+     * Uri port number
+     *
+     * @var null|int
+     */
+    protected $port;
+
+    /**
+     * Uri base path
+     *
+     * @var string
+     */
+    protected $basePath = '';
+
+    /**
+     * Uri path
+     *
+     * @var string
+     */
+    protected $path = '';
+
+    /**
+     * Uri query string (without "?" prefix)
+     *
+     * @var string
+     */
+    protected $query = '';
+
+    /**
+     * Uri fragment string (without "#" prefix)
+     *
+     * @var string
+     */
+    protected $fragment = '';
+
+    /**
+     * Create new Uri.
+     *
+     * @param string $scheme   Uri scheme.
+     * @param string $host     Uri host.
+     * @param int    $port     Uri port number.
+     * @param string $path     Uri path.
+     * @param string $query    Uri query string.
+     * @param string $fragment Uri fragment.
+     * @param string $user     Uri user.
+     * @param string $password Uri password.
+     */
+    public function __construct(
+        $scheme,
+        $host,
+        $port = null,
+        $path = '/',
+        $query = '',
+        $fragment = '',
+        $user = '',
+        $password = ''
+    ) {
+        $this->scheme = $this->filterScheme($scheme);
+        $this->host = $host;
+        $this->port = $this->filterPort($port);
+        $this->path = empty($path) ? '/' : $this->filterPath($path);
+        $this->query = $this->filterQuery($query);
+        $this->fragment = $this->filterQuery($fragment);
+        $this->user = $user;
+        $this->password = $password;
+    }
+
+    /**
+     * Create new Uri from string.
+     *
+     * @param  string $uri Complete Uri string
+     *     (i.e., https://user:pass@host:443/path?query).
+     *
+     * @return self
+     */
+    public static function createFromString($uri)
+    {
+        if (!is_string($uri) && !method_exists($uri, '__toString')) {
+            throw new InvalidArgumentException('Uri must be a string');
+        }
+
+        $parts = parse_url($uri);
+        $scheme = isset($parts['scheme']) ? $parts['scheme'] : '';
+        $user = isset($parts['user']) ? $parts['user'] : '';
+        $pass = isset($parts['pass']) ? $parts['pass'] : '';
+        $host = isset($parts['host']) ? $parts['host'] : '';
+        $port = isset($parts['port']) ? $parts['port'] : null;
+        $path = isset($parts['path']) ? $parts['path'] : '';
+        $query = isset($parts['query']) ? $parts['query'] : '';
+        $fragment = isset($parts['fragment']) ? $parts['fragment'] : '';
+
+        return new static($scheme, $host, $port, $path, $query, $fragment, $user, $pass);
+    }
+
+    /**
+     * Create new Uri from environment.
+     *
+     * @param Environment $env
+     *
+     * @return self
+     */
+    public static function createFromEnvironment(Environment $env)
+    {
+        // Scheme
+        $isSecure = $env->get('HTTPS');
+        $scheme = (empty($isSecure) || $isSecure === 'off') ? 'http' : 'https';
+
+        // Authority: Username and password
+        $username = $env->get('PHP_AUTH_USER', '');
+        $password = $env->get('PHP_AUTH_PW', '');
+
+        // Authority: Host
+        if ($env->has('HTTP_HOST')) {
+            $host = $env->get('HTTP_HOST');
+        } else {
+            $host = $env->get('SERVER_NAME');
+        }
+
+        // Authority: Port
+        $port = (int)$env->get('SERVER_PORT', 80);
+        if (preg_match('/^(\[[a-fA-F0-9:.]+\])(:\d+)?\z/', $host, $matches)) {
+            $host = $matches[1];
+
+            if (isset($matches[2])) {
+                $port = (int) substr($matches[2], 1);
+            }
+        } else {
+            $pos = strpos($host, ':');
+            if ($pos !== false) {
+                $port = (int) substr($host, $pos + 1);
+                $host = strstr($host, ':', true);
+            }
+        }
+
+        // Path
+        $requestScriptName = parse_url($env->get('SCRIPT_NAME'), PHP_URL_PATH);
+        $requestScriptDir = dirname($requestScriptName);
+
+        // parse_url() requires a full URL. As we don't extract the domain name or scheme,
+        // we use a stand-in.
+        $requestUri = parse_url('http://example.com' . $env->get('REQUEST_URI'), PHP_URL_PATH);
+
+        $basePath = '';
+        $virtualPath = $requestUri;
+        if (stripos($requestUri, $requestScriptName) === 0) {
+            $basePath = $requestScriptName;
+        } elseif ($requestScriptDir !== '/' && stripos($requestUri, $requestScriptDir) === 0) {
+            $basePath = $requestScriptDir;
+        }
+
+        if ($basePath) {
+            $virtualPath = ltrim(substr($requestUri, strlen($basePath)), '/');
+        }
+
+        // Query string
+        $queryString = $env->get('QUERY_STRING', '');
+        if ($queryString === '') {
+            $queryString = parse_url('http://example.com' . $env->get('REQUEST_URI'), PHP_URL_QUERY);
+        }
+
+        // Fragment
+        $fragment = '';
+
+        // Build Uri
+        $uri = new static($scheme, $host, $port, $virtualPath, $queryString, $fragment, $username, $password);
+        if ($basePath) {
+            $uri = $uri->withBasePath($basePath);
+        }
+
+        return $uri;
+    }
+
+    /********************************************************************************
+     * Scheme
+     *******************************************************************************/
+
+    /**
+     * Retrieve the scheme component of the URI.
+     *
+     * If no scheme is present, this method MUST return an empty string.
+     *
+     * The value returned MUST be normalized to lowercase, per RFC 3986
+     * Section 3.1.
+     *
+     * The trailing ":" character is not part of the scheme and MUST NOT be
+     * added.
+     *
+     * @see https://tools.ietf.org/html/rfc3986#section-3.1
+     * @return string The URI scheme.
+     */
+    public function getScheme()
+    {
+        return $this->scheme;
+    }
+
+    /**
+     * Return an instance with the specified scheme.
+     *
+     * This method MUST retain the state of the current instance, and return
+     * an instance that contains the specified scheme.
+     *
+     * Implementations MUST support the schemes "http" and "https" case
+     * insensitively, and MAY accommodate other schemes if required.
+     *
+     * An empty scheme is equivalent to removing the scheme.
+     *
+     * @param string $scheme The scheme to use with the new instance.
+     * @return self A new instance with the specified scheme.
+     * @throws \InvalidArgumentException for invalid or unsupported schemes.
+     */
+    public function withScheme($scheme)
+    {
+        $scheme = $this->filterScheme($scheme);
+        $clone = clone $this;
+        $clone->scheme = $scheme;
+
+        return $clone;
+    }
+
+    /**
+     * Filter Uri scheme.
+     *
+     * @param  string $scheme Raw Uri scheme.
+     * @return string
+     *
+     * @throws InvalidArgumentException If the Uri scheme is not a string.
+     * @throws InvalidArgumentException If Uri scheme is not "", "https", or "http".
+     */
+    protected function filterScheme($scheme)
+    {
+        static $valid = [
+            '' => true,
+            'https' => true,
+            'http' => true,
+        ];
+
+        if (!is_string($scheme) && !method_exists($scheme, '__toString')) {
+            throw new InvalidArgumentException('Uri scheme must be a string');
+        }
+
+        $scheme = str_replace('://', '', strtolower((string)$scheme));
+        if (!isset($valid[$scheme])) {
+            throw new InvalidArgumentException('Uri scheme must be one of: "", "https", "http"');
+        }
+
+        return $scheme;
+    }
+
+    /********************************************************************************
+     * Authority
+     *******************************************************************************/
+
+    /**
+     * Retrieve the authority component of the URI.
+     *
+     * If no authority information is present, this method MUST return an empty
+     * string.
+     *
+     * The authority syntax of the URI is:
+     *
+     * <pre>
+     * [user-info@]host[:port]
+     * </pre>
+     *
+     * If the port component is not set or is the standard port for the current
+     * scheme, it SHOULD NOT be included.
+     *
+     * @see https://tools.ietf.org/html/rfc3986#section-3.2
+     * @return string The URI authority, in "[user-info@]host[:port]" format.
+     */
+    public function getAuthority()
+    {
+        $userInfo = $this->getUserInfo();
+        $host = $this->getHost();
+        $port = $this->getPort();
+
+        return ($userInfo ? $userInfo . '@' : '') . $host . ($port !== null ? ':' . $port : '');
+    }
+
+    /**
+     * Retrieve the user information component of the URI.
+     *
+     * If no user information is present, this method MUST return an empty
+     * string.
+     *
+     * If a user is present in the URI, this will return that value;
+     * additionally, if the password is also present, it will be appended to the
+     * user value, with a colon (":") separating the values.
+     *
+     * The trailing "@" character is not part of the user information and MUST
+     * NOT be added.
+     *
+     * @return string The URI user information, in "username[:password]" format.
+     */
+    public function getUserInfo()
+    {
+        return $this->user . ($this->password ? ':' . $this->password : '');
+    }
+
+    /**
+     * Return an instance with the specified user information.
+     *
+     * This method MUST retain the state of the current instance, and return
+     * an instance that contains the specified user information.
+     *
+     * Password is optional, but the user information MUST include the
+     * user; an empty string for the user is equivalent to removing user
+     * information.
+     *
+     * @param string $user The user name to use for authority.
+     * @param null|string $password The password associated with $user.
+     * @return self A new instance with the specified user information.
+     */
+    public function withUserInfo($user, $password = null)
+    {
+        $clone = clone $this;
+        $clone->user = $this->filterUserInfo($user);
+        if ($clone->user) {
+            $clone->password = $password ? $this->filterUserInfo($password) : '';
+        } else {
+            $clone->password = '';
+        }
+
+        return $clone;
+    }
+
+    /**
+     * Filters the user info string.
+     *
+     * @param string $query The raw uri query string.
+     * @return string The percent-encoded query string.
+     */
+    protected function filterUserInfo($query)
+    {
+        return preg_replace_callback(
+            '/(?:[^a-zA-Z0-9_\-\.~!\$&\'\(\)\*\+,;=]+|%(?![A-Fa-f0-9]{2}))/u',
+            function ($match) {
+                return rawurlencode($match[0]);
+            },
+            $query
+        );
+    }
+
+    /**
+     * Retrieve the host component of the URI.
+     *
+     * If no host is present, this method MUST return an empty string.
+     *
+     * The value returned MUST be normalized to lowercase, per RFC 3986
+     * Section 3.2.2.
+     *
+     * @see http://tools.ietf.org/html/rfc3986#section-3.2.2
+     * @return string The URI host.
+     */
+    public function getHost()
+    {
+        return $this->host;
+    }
+
+    /**
+     * Return an instance with the specified host.
+     *
+     * This method MUST retain the state of the current instance, and return
+     * an instance that contains the specified host.
+     *
+     * An empty host value is equivalent to removing the host.
+     *
+     * @param string $host The hostname to use with the new instance.
+     * @return self A new instance with the specified host.
+     * @throws \InvalidArgumentException for invalid hostnames.
+     */
+    public function withHost($host)
+    {
+        $clone = clone $this;
+        $clone->host = $host;
+
+        return $clone;
+    }
+
+    /**
+     * Retrieve the port component of the URI.
+     *
+     * If a port is present, and it is non-standard for the current scheme,
+     * this method MUST return it as an integer. If the port is the standard port
+     * used with the current scheme, this method SHOULD return null.
+     *
+     * If no port is present, and no scheme is present, this method MUST return
+     * a null value.
+     *
+     * If no port is present, but a scheme is present, this method MAY return
+     * the standard port for that scheme, but SHOULD return null.
+     *
+     * @return null|int The URI port.
+     */
+    public function getPort()
+    {
+        return $this->port && !$this->hasStandardPort() ? $this->port : null;
+    }
+
+    /**
+     * Return an instance with the specified port.
+     *
+     * This method MUST retain the state of the current instance, and return
+     * an instance that contains the specified port.
+     *
+     * Implementations MUST raise an exception for ports outside the
+     * established TCP and UDP port ranges.
+     *
+     * A null value provided for the port is equivalent to removing the port
+     * information.
+     *
+     * @param null|int $port The port to use with the new instance; a null value
+     *     removes the port information.
+     * @return self A new instance with the specified port.
+     * @throws \InvalidArgumentException for invalid ports.
+     */
+    public function withPort($port)
+    {
+        $port = $this->filterPort($port);
+        $clone = clone $this;
+        $clone->port = $port;
+
+        return $clone;
+    }
+
+    /**
+     * Does this Uri use a standard port?
+     *
+     * @return bool
+     */
+    protected function hasStandardPort()
+    {
+        return ($this->scheme === 'http' && $this->port === 80) || ($this->scheme === 'https' && $this->port === 443);
+    }
+
+    /**
+     * Filter Uri port.
+     *
+     * @param  null|int $port The Uri port number.
+     * @return null|int
+     *
+     * @throws InvalidArgumentException If the port is invalid.
+     */
+    protected function filterPort($port)
+    {
+        if (is_null($port) || (is_integer($port) && ($port >= 1 && $port <= 65535))) {
+            return $port;
+        }
+
+        throw new InvalidArgumentException('Uri port must be null or an integer between 1 and 65535 (inclusive)');
+    }
+
+    /********************************************************************************
+     * Path
+     *******************************************************************************/
+
+    /**
+     * Retrieve the path component of the URI.
+     *
+     * The path can either be empty or absolute (starting with a slash) or
+     * rootless (not starting with a slash). Implementations MUST support all
+     * three syntaxes.
+     *
+     * Normally, the empty path "" and absolute path "/" are considered equal as
+     * defined in RFC 7230 Section 2.7.3. But this method MUST NOT automatically
+     * do this normalization because in contexts with a trimmed base path, e.g.
+     * the front controller, this difference becomes significant. It's the task
+     * of the user to handle both "" and "/".
+     *
+     * The value returned MUST be percent-encoded, but MUST NOT double-encode
+     * any characters. To determine what characters to encode, please refer to
+     * RFC 3986, Sections 2 and 3.3.
+     *
+     * As an example, if the value should include a slash ("/") not intended as
+     * delimiter between path segments, that value MUST be passed in encoded
+     * form (e.g., "%2F") to the instance.
+     *
+     * @see https://tools.ietf.org/html/rfc3986#section-2
+     * @see https://tools.ietf.org/html/rfc3986#section-3.3
+     * @return string The URI path.
+     */
+    public function getPath()
+    {
+        return $this->path;
+    }
+
+    /**
+     * Return an instance with the specified path.
+     *
+     * This method MUST retain the state of the current instance, and return
+     * an instance that contains the specified path.
+     *
+     * The path can either be empty or absolute (starting with a slash) or
+     * rootless (not starting with a slash). Implementations MUST support all
+     * three syntaxes.
+     *
+     * If the path is intended to be domain-relative rather than path relative then
+     * it must begin with a slash ("/"). Paths not starting with a slash ("/")
+     * are assumed to be relative to some base path known to the application or
+     * consumer.
+     *
+     * Users can provide both encoded and decoded path characters.
+     * Implementations ensure the correct encoding as outlined in getPath().
+     *
+     * @param string $path The path to use with the new instance.
+     * @return self A new instance with the specified path.
+     * @throws \InvalidArgumentException for invalid paths.
+     */
+    public function withPath($path)
+    {
+        if (!is_string($path)) {
+            throw new InvalidArgumentException('Uri path must be a string');
+        }
+
+        $clone = clone $this;
+        $clone->path = $this->filterPath($path);
+
+        // if the path is absolute, then clear basePath
+        if (substr($path, 0, 1) == '/') {
+            $clone->basePath = '';
+        }
+
+        return $clone;
+    }
+
+    /**
+     * Retrieve the base path segment of the URI.
+     *
+     * Note: This method is not part of the PSR-7 standard.
+     *
+     * This method MUST return a string; if no path is present it MUST return
+     * an empty string.
+     *
+     * @return string The base path segment of the URI.
+     */
+    public function getBasePath()
+    {
+        return $this->basePath;
+    }
+
+    /**
+     * Set base path.
+     *
+     * Note: This method is not part of the PSR-7 standard.
+     *
+     * @param  string $basePath
+     * @return self
+     */
+    public function withBasePath($basePath)
+    {
+        if (!is_string($basePath)) {
+            throw new InvalidArgumentException('Uri path must be a string');
+        }
+        if (!empty($basePath)) {
+            $basePath = '/' . trim($basePath, '/'); // <-- Trim on both sides
+        }
+        $clone = clone $this;
+
+        if ($basePath !== '/') {
+            $clone->basePath = $this->filterPath($basePath);
+        }
+
+        return $clone;
+    }
+
+    /**
+     * Filter Uri path.
+     *
+     * This method percent-encodes all reserved
+     * characters in the provided path string. This method
+     * will NOT double-encode characters that are already
+     * percent-encoded.
+     *
+     * @param  string $path The raw uri path.
+     * @return string       The RFC 3986 percent-encoded uri path.
+     * @link   http://www.faqs.org/rfcs/rfc3986.html
+     */
+    protected function filterPath($path)
+    {
+        return preg_replace_callback(
+            '/(?:[^a-zA-Z0-9_\-\.~:@&=\+\$,\/;%]+|%(?![A-Fa-f0-9]{2}))/',
+            function ($match) {
+                return rawurlencode($match[0]);
+            },
+            $path
+        );
+    }
+
+    /********************************************************************************
+     * Query
+     *******************************************************************************/
+
+    /**
+     * Retrieve the query string of the URI.
+     *
+     * If no query string is present, this method MUST return an empty string.
+     *
+     * The leading "?" character is not part of the query and MUST NOT be
+     * added.
+     *
+     * The value returned MUST be percent-encoded, but MUST NOT double-encode
+     * any characters. To determine what characters to encode, please refer to
+     * RFC 3986, Sections 2 and 3.4.
+     *
+     * As an example, if a value in a key/value pair of the query string should
+     * include an ampersand ("&") not intended as a delimiter between values,
+     * that value MUST be passed in encoded form (e.g., "%26") to the instance.
+     *
+     * @see https://tools.ietf.org/html/rfc3986#section-2
+     * @see https://tools.ietf.org/html/rfc3986#section-3.4
+     * @return string The URI query string.
+     */
+    public function getQuery()
+    {
+        return $this->query;
+    }
+
+    /**
+     * Return an instance with the specified query string.
+     *
+     * This method MUST retain the state of the current instance, and return
+     * an instance that contains the specified query string.
+     *
+     * Users can provide both encoded and decoded query characters.
+     * Implementations ensure the correct encoding as outlined in getQuery().
+     *
+     * An empty query string value is equivalent to removing the query string.
+     *
+     * @param string $query The query string to use with the new instance.
+     * @return self A new instance with the specified query string.
+     * @throws \InvalidArgumentException for invalid query strings.
+     */
+    public function withQuery($query)
+    {
+        if (!is_string($query) && !method_exists($query, '__toString')) {
+            throw new InvalidArgumentException('Uri query must be a string');
+        }
+        $query = ltrim((string)$query, '?');
+        $clone = clone $this;
+        $clone->query = $this->filterQuery($query);
+
+        return $clone;
+    }
+
+    /**
+     * Filters the query string or fragment of a URI.
+     *
+     * @param string $query The raw uri query string.
+     * @return string The percent-encoded query string.
+     */
+    protected function filterQuery($query)
+    {
+        return preg_replace_callback(
+            '/(?:[^a-zA-Z0-9_\-\.~!\$&\'\(\)\*\+,;=%:@\/\?]+|%(?![A-Fa-f0-9]{2}))/',
+            function ($match) {
+                return rawurlencode($match[0]);
+            },
+            $query
+        );
+    }
+
+    /********************************************************************************
+     * Fragment
+     *******************************************************************************/
+
+    /**
+     * Retrieve the fragment component of the URI.
+     *
+     * If no fragment is present, this method MUST return an empty string.
+     *
+     * The leading "#" character is not part of the fragment and MUST NOT be
+     * added.
+     *
+     * The value returned MUST be percent-encoded, but MUST NOT double-encode
+     * any characters. To determine what characters to encode, please refer to
+     * RFC 3986, Sections 2 and 3.5.
+     *
+     * @see https://tools.ietf.org/html/rfc3986#section-2
+     * @see https://tools.ietf.org/html/rfc3986#section-3.5
+     * @return string The URI fragment.
+     */
+    public function getFragment()
+    {
+        return $this->fragment;
+    }
+
+    /**
+     * Return an instance with the specified URI fragment.
+     *
+     * This method MUST retain the state of the current instance, and return
+     * an instance that contains the specified URI fragment.
+     *
+     * Users can provide both encoded and decoded fragment characters.
+     * Implementations ensure the correct encoding as outlined in getFragment().
+     *
+     * An empty fragment value is equivalent to removing the fragment.
+     *
+     * @param string $fragment The fragment to use with the new instance.
+     * @return self A new instance with the specified fragment.
+     */
+    public function withFragment($fragment)
+    {
+        if (!is_string($fragment) && !method_exists($fragment, '__toString')) {
+            throw new InvalidArgumentException('Uri fragment must be a string');
+        }
+        $fragment = ltrim((string)$fragment, '#');
+        $clone = clone $this;
+        $clone->fragment = $this->filterQuery($fragment);
+
+        return $clone;
+    }
+
+    /********************************************************************************
+     * Helpers
+     *******************************************************************************/
+
+    /**
+     * Return the string representation as a URI reference.
+     *
+     * Depending on which components of the URI are present, the resulting
+     * string is either a full URI or relative reference according to RFC 3986,
+     * Section 4.1. The method concatenates the various components of the URI,
+     * using the appropriate delimiters:
+     *
+     * - If a scheme is present, it MUST be suffixed by ":".
+     * - If an authority is present, it MUST be prefixed by "//".
+     * - The path can be concatenated without delimiters. But there are two
+     *   cases where the path has to be adjusted to make the URI reference
+     *   valid as PHP does not allow to throw an exception in __toString():
+     *     - If the path is rootless and an authority is present, the path MUST
+     *       be prefixed by "/".
+     *     - If the path is starting with more than one "/" and no authority is
+     *       present, the starting slashes MUST be reduced to one.
+     * - If a query is present, it MUST be prefixed by "?".
+     * - If a fragment is present, it MUST be prefixed by "#".
+     *
+     * @see http://tools.ietf.org/html/rfc3986#section-4.1
+     * @return string
+     */
+    public function __toString()
+    {
+        $scheme = $this->getScheme();
+        $authority = $this->getAuthority();
+        $basePath = $this->getBasePath();
+        $path = $this->getPath();
+        $query = $this->getQuery();
+        $fragment = $this->getFragment();
+
+        $path = $basePath . '/' . ltrim($path, '/');
+
+        return ($scheme ? $scheme . ':' : '')
+            . ($authority ? '//' . $authority : '')
+            . $path
+            . ($query ? '?' . $query : '')
+            . ($fragment ? '#' . $fragment : '');
+    }
+
+    /**
+     * Return the fully qualified base URL.
+     *
+     * Note that this method never includes a trailing /
+     *
+     * This method is not part of PSR-7.
+     *
+     * @return string
+     */
+    public function getBaseUrl()
+    {
+        $scheme = $this->getScheme();
+        $authority = $this->getAuthority();
+        $basePath = $this->getBasePath();
+
+        if ($authority && substr($basePath, 0, 1) !== '/') {
+            $basePath = $basePath . '/' . $basePath;
+        }
+
+        return ($scheme ? $scheme . ':' : '')
+            . ($authority ? '//' . $authority : '')
+            . rtrim($basePath, '/');
+    }
+}
diff --git a/advancedcontentfilter/vendor/slim/slim/Slim/Interfaces/CallableResolverInterface.php b/advancedcontentfilter/vendor/slim/slim/Slim/Interfaces/CallableResolverInterface.php
new file mode 100644 (file)
index 0000000..17d81db
--- /dev/null
@@ -0,0 +1,27 @@
+<?php
+/**
+ * Slim Framework (https://slimframework.com)
+ *
+ * @link      https://github.com/slimphp/Slim
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
+ * @license   https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
+ */
+namespace Slim\Interfaces;
+
+/**
+ * Resolves a callable.
+ *
+ * @package Slim
+ * @since 3.0.0
+ */
+interface CallableResolverInterface
+{
+    /**
+     * Invoke the resolved callable.
+     *
+     * @param mixed $toResolve
+     *
+     * @return callable
+     */
+    public function resolve($toResolve);
+}
diff --git a/advancedcontentfilter/vendor/slim/slim/Slim/Interfaces/CollectionInterface.php b/advancedcontentfilter/vendor/slim/slim/Slim/Interfaces/CollectionInterface.php
new file mode 100644 (file)
index 0000000..be995bf
--- /dev/null
@@ -0,0 +1,32 @@
+<?php
+/**
+ * Slim Framework (https://slimframework.com)
+ *
+ * @link      https://github.com/slimphp/Slim
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
+ * @license   https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
+ */
+namespace Slim\Interfaces;
+
+/**
+ * Collection Interface
+ *
+ * @package Slim
+ * @since   3.0.0
+ */
+interface CollectionInterface extends \ArrayAccess, \Countable, \IteratorAggregate
+{
+    public function set($key, $value);
+
+    public function get($key, $default = null);
+
+    public function replace(array $items);
+
+    public function all();
+
+    public function has($key);
+
+    public function remove($key);
+
+    public function clear();
+}
diff --git a/advancedcontentfilter/vendor/slim/slim/Slim/Interfaces/Http/CookiesInterface.php b/advancedcontentfilter/vendor/slim/slim/Slim/Interfaces/Http/CookiesInterface.php
new file mode 100644 (file)
index 0000000..206175a
--- /dev/null
@@ -0,0 +1,23 @@
+<?php
+/**
+ * Slim Framework (https://slimframework.com)
+ *
+ * @link      https://github.com/slimphp/Slim
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
+ * @license   https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
+ */
+namespace Slim\Interfaces\Http;
+
+/**
+ * Cookies Interface
+ *
+ * @package Slim
+ * @since   3.0.0
+ */
+interface CookiesInterface
+{
+    public function get($name, $default = null);
+    public function set($name, $value);
+    public function toHeaders();
+    public static function parseHeader($header);
+}
diff --git a/advancedcontentfilter/vendor/slim/slim/Slim/Interfaces/Http/EnvironmentInterface.php b/advancedcontentfilter/vendor/slim/slim/Slim/Interfaces/Http/EnvironmentInterface.php
new file mode 100644 (file)
index 0000000..af19d28
--- /dev/null
@@ -0,0 +1,20 @@
+<?php
+/**
+ * Slim Framework (https://slimframework.com)
+ *
+ * @link      https://github.com/slimphp/Slim
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
+ * @license   https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
+ */
+namespace Slim\Interfaces\Http;
+
+/**
+ * Environment Interface
+ *
+ * @package Slim
+ * @since   3.0.0
+ */
+interface EnvironmentInterface
+{
+    public static function mock(array $settings = []);
+}
diff --git a/advancedcontentfilter/vendor/slim/slim/Slim/Interfaces/Http/HeadersInterface.php b/advancedcontentfilter/vendor/slim/slim/Slim/Interfaces/Http/HeadersInterface.php
new file mode 100644 (file)
index 0000000..b737705
--- /dev/null
@@ -0,0 +1,24 @@
+<?php
+/**
+ * Slim Framework (https://slimframework.com)
+ *
+ * @link      https://github.com/slimphp/Slim
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
+ * @license   https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
+ */
+namespace Slim\Interfaces\Http;
+
+use Slim\Interfaces\CollectionInterface;
+
+/**
+ * Headers Interface
+ *
+ * @package Slim
+ * @since   3.0.0
+ */
+interface HeadersInterface extends CollectionInterface
+{
+    public function add($key, $value);
+
+    public function normalizeKey($key);
+}
diff --git a/advancedcontentfilter/vendor/slim/slim/Slim/Interfaces/InvocationStrategyInterface.php b/advancedcontentfilter/vendor/slim/slim/Slim/Interfaces/InvocationStrategyInterface.php
new file mode 100644 (file)
index 0000000..14a92c1
--- /dev/null
@@ -0,0 +1,35 @@
+<?php
+/**
+ * Slim Framework (https://slimframework.com)
+ *
+ * @link      https://github.com/slimphp/Slim
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
+ * @license   https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
+ */
+namespace Slim\Interfaces;
+
+use Psr\Http\Message\ResponseInterface;
+use Psr\Http\Message\ServerRequestInterface;
+
+/**
+ * Defines a contract for invoking a route callable.
+ */
+interface InvocationStrategyInterface
+{
+    /**
+     * Invoke a route callable.
+     *
+     * @param callable               $callable The callable to invoke using the strategy.
+     * @param ServerRequestInterface $request The request object.
+     * @param ResponseInterface      $response The response object.
+     * @param array                  $routeArguments The route's placholder arguments
+     *
+     * @return ResponseInterface|string The response from the callable.
+     */
+    public function __invoke(
+        callable $callable,
+        ServerRequestInterface $request,
+        ResponseInterface $response,
+        array $routeArguments
+    );
+}
diff --git a/advancedcontentfilter/vendor/slim/slim/Slim/Interfaces/RouteGroupInterface.php b/advancedcontentfilter/vendor/slim/slim/Slim/Interfaces/RouteGroupInterface.php
new file mode 100644 (file)
index 0000000..5ed3303
--- /dev/null
@@ -0,0 +1,46 @@
+<?php
+/**
+ * Slim Framework (https://slimframework.com)
+ *
+ * @link      https://github.com/slimphp/Slim
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
+ * @license   https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
+ */
+namespace Slim\Interfaces;
+
+use Slim\App;
+
+/**
+ * RouteGroup Interface
+ *
+ * @package Slim
+ * @since   3.0.0
+ */
+interface RouteGroupInterface
+{
+    /**
+     * Get route pattern
+     *
+     * @return string
+     */
+    public function getPattern();
+
+    /**
+     * Prepend middleware to the group middleware collection
+     *
+     * @param callable|string $callable The callback routine
+     *
+     * @return RouteGroupInterface
+     */
+    public function add($callable);
+
+    /**
+     * Execute route group callable in the context of the Slim App
+     *
+     * This method invokes the route group object's callable, collecting
+     * nested route objects
+     *
+     * @param App $app
+     */
+    public function __invoke(App $app);
+}
diff --git a/advancedcontentfilter/vendor/slim/slim/Slim/Interfaces/RouteInterface.php b/advancedcontentfilter/vendor/slim/slim/Slim/Interfaces/RouteInterface.php
new file mode 100644 (file)
index 0000000..64be534
--- /dev/null
@@ -0,0 +1,140 @@
+<?php
+/**
+ * Slim Framework (https://slimframework.com)
+ *
+ * @link      https://github.com/slimphp/Slim
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
+ * @license   https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
+ */
+namespace Slim\Interfaces;
+
+use InvalidArgumentException;
+use Psr\Http\Message\ServerRequestInterface;
+use Psr\Http\Message\ResponseInterface;
+
+/**
+ * Route Interface
+ *
+ * @package Slim
+ * @since   3.0.0
+ */
+interface RouteInterface
+{
+
+    /**
+     * Retrieve a specific route argument
+     *
+     * @param string $name
+     * @param string|null $default
+     *
+     * @return string|null
+     */
+    public function getArgument($name, $default = null);
+
+    /**
+     * Get route arguments
+     *
+     * @return string[]
+     */
+    public function getArguments();
+
+    /**
+     * Get route name
+     *
+     * @return null|string
+     */
+    public function getName();
+
+    /**
+     * Get route pattern
+     *
+     * @return string
+     */
+    public function getPattern();
+
+    /**
+     * Set a route argument
+     *
+     * @param string $name
+     * @param string $value
+     *
+     * @return self
+     */
+    public function setArgument($name, $value);
+
+    /**
+     * Replace route arguments
+     *
+     * @param string[] $arguments
+     *
+     * @return self
+     */
+    public function setArguments(array $arguments);
+
+    /**
+     * Set output buffering mode
+     *
+     * One of: false, 'prepend' or 'append'
+     *
+     * @param boolean|string $mode
+     *
+     * @throws InvalidArgumentException If an unknown buffering mode is specified
+     */
+    public function setOutputBuffering($mode);
+
+    /**
+     * Set route name
+     *
+     * @param string $name
+     *
+     * @return static
+     * @throws InvalidArgumentException if the route name is not a string
+     */
+    public function setName($name);
+
+    /**
+     * Add middleware
+     *
+     * This method prepends new middleware to the route's middleware stack.
+     *
+     * @param callable|string $callable The callback routine
+     *
+     * @return RouteInterface
+     */
+    public function add($callable);
+
+    /**
+     * Prepare the route for use
+     *
+     * @param ServerRequestInterface $request
+     * @param array $arguments
+     */
+    public function prepare(ServerRequestInterface $request, array $arguments);
+
+    /**
+     * Run route
+     *
+     * This method traverses the middleware stack, including the route's callable
+     * and captures the resultant HTTP response object. It then sends the response
+     * back to the Application.
+     *
+     * @param ServerRequestInterface $request
+     * @param ResponseInterface $response
+     * @return ResponseInterface
+     */
+    public function run(ServerRequestInterface $request, ResponseInterface $response);
+
+    /**
+     * Dispatch route callable against current Request and Response objects
+     *
+     * This method invokes the route object's callable. If middleware is
+     * registered for the route, each callable middleware is invoked in
+     * the order specified.
+     *
+     * @param ServerRequestInterface $request  The current Request object
+     * @param ResponseInterface      $response The current Response object
+     *
+     * @return ResponseInterface
+     */
+    public function __invoke(ServerRequestInterface $request, ResponseInterface $response);
+}
diff --git a/advancedcontentfilter/vendor/slim/slim/Slim/Interfaces/RouterInterface.php b/advancedcontentfilter/vendor/slim/slim/Slim/Interfaces/RouterInterface.php
new file mode 100644 (file)
index 0000000..2ab8b67
--- /dev/null
@@ -0,0 +1,111 @@
+<?php
+/**
+ * Slim Framework (https://slimframework.com)
+ *
+ * @link      https://github.com/slimphp/Slim
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
+ * @license   https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
+ */
+namespace Slim\Interfaces;
+
+use RuntimeException;
+use InvalidArgumentException;
+use Psr\Http\Message\ServerRequestInterface;
+
+/**
+ * Router Interface
+ *
+ * @package Slim
+ * @since   3.0.0
+ */
+interface RouterInterface
+{
+    // array keys from route result
+    const DISPATCH_STATUS = 0;
+    const ALLOWED_METHODS = 1;
+
+    /**
+     * Add route
+     *
+     * @param string[] $methods Array of HTTP methods
+     * @param string   $pattern The route pattern
+     * @param callable $handler The route callable
+     *
+     * @return RouteInterface
+     */
+    public function map($methods, $pattern, $handler);
+
+    /**
+     * Dispatch router for HTTP request
+     *
+     * @param  ServerRequestInterface $request The current HTTP request object
+     *
+     * @return array
+     *
+     * @link   https://github.com/nikic/FastRoute/blob/master/src/Dispatcher.php
+     */
+    public function dispatch(ServerRequestInterface $request);
+
+    /**
+     * Add a route group to the array
+     *
+     * @param string   $pattern The group pattern
+     * @param callable $callable A group callable
+     *
+     * @return RouteGroupInterface
+     */
+    public function pushGroup($pattern, $callable);
+
+    /**
+     * Removes the last route group from the array
+     *
+     * @return bool True if successful, else False
+     */
+    public function popGroup();
+
+    /**
+     * Get named route object
+     *
+     * @param string $name        Route name
+     *
+     * @return \Slim\Interfaces\RouteInterface
+     *
+     * @throws RuntimeException   If named route does not exist
+     */
+    public function getNamedRoute($name);
+
+    /**
+     * @param $identifier
+     *
+     * @return \Slim\Interfaces\RouteInterface
+     */
+    public function lookupRoute($identifier);
+
+    /**
+     * Build the path for a named route excluding the base path
+     *
+     * @param string $name        Route name
+     * @param array  $data        Named argument replacement data
+     * @param array  $queryParams Optional query string parameters
+     *
+     * @return string
+     *
+     * @throws RuntimeException         If named route does not exist
+     * @throws InvalidArgumentException If required data not provided
+     */
+    public function relativePathFor($name, array $data = [], array $queryParams = []);
+
+    /**
+     * Build the path for a named route including the base path
+     *
+     * @param string $name        Route name
+     * @param array  $data        Named argument replacement data
+     * @param array  $queryParams Optional query string parameters
+     *
+     * @return string
+     *
+     * @throws RuntimeException         If named route does not exist
+     * @throws InvalidArgumentException If required data not provided
+     */
+    public function pathFor($name, array $data = [], array $queryParams = []);
+}
diff --git a/advancedcontentfilter/vendor/slim/slim/Slim/MiddlewareAwareTrait.php b/advancedcontentfilter/vendor/slim/slim/Slim/MiddlewareAwareTrait.php
new file mode 100644 (file)
index 0000000..8b8a175
--- /dev/null
@@ -0,0 +1,121 @@
+<?php
+/**
+ * Slim Framework (https://slimframework.com)
+ *
+ * @link      https://github.com/slimphp/Slim
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
+ * @license   https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
+ */
+namespace Slim;
+
+use RuntimeException;
+use Psr\Http\Message\ServerRequestInterface;
+use Psr\Http\Message\ResponseInterface;
+use UnexpectedValueException;
+
+/**
+ * Middleware
+ *
+ * This is an internal class that enables concentric middleware layers. This
+ * class is an implementation detail and is used only inside of the Slim
+ * application; it is not visible to—and should not be used by—end users.
+ */
+trait MiddlewareAwareTrait
+{
+    /**
+     * Tip of the middleware call stack
+     *
+     * @var callable
+     */
+    protected $tip;
+
+    /**
+     * Middleware stack lock
+     *
+     * @var bool
+     */
+    protected $middlewareLock = false;
+
+    /**
+     * Add middleware
+     *
+     * This method prepends new middleware to the application middleware stack.
+     *
+     * @param callable $callable Any callable that accepts three arguments:
+     *                           1. A Request object
+     *                           2. A Response object
+     *                           3. A "next" middleware callable
+     * @return static
+     *
+     * @throws RuntimeException         If middleware is added while the stack is dequeuing
+     * @throws UnexpectedValueException If the middleware doesn't return a Psr\Http\Message\ResponseInterface
+     */
+    protected function addMiddleware(callable $callable)
+    {
+        if ($this->middlewareLock) {
+            throw new RuntimeException('Middleware can’t be added once the stack is dequeuing');
+        }
+
+        if (is_null($this->tip)) {
+            $this->seedMiddlewareStack();
+        }
+        $next = $this->tip;
+        $this->tip = function (
+            ServerRequestInterface $request,
+            ResponseInterface $response
+        ) use (
+            $callable,
+            $next
+        ) {
+            $result = call_user_func($callable, $request, $response, $next);
+            if ($result instanceof ResponseInterface === false) {
+                throw new UnexpectedValueException(
+                    'Middleware must return instance of \Psr\Http\Message\ResponseInterface'
+                );
+            }
+
+            return $result;
+        };
+
+        return $this;
+    }
+
+    /**
+     * Seed middleware stack with first callable
+     *
+     * @param callable $kernel The last item to run as middleware
+     *
+     * @throws RuntimeException if the stack is seeded more than once
+     */
+    protected function seedMiddlewareStack(callable $kernel = null)
+    {
+        if (!is_null($this->tip)) {
+            throw new RuntimeException('MiddlewareStack can only be seeded once.');
+        }
+        if ($kernel === null) {
+            $kernel = $this;
+        }
+        $this->tip = $kernel;
+    }
+
+    /**
+     * Call middleware stack
+     *
+     * @param  ServerRequestInterface $request A request object
+     * @param  ResponseInterface      $response A response object
+     *
+     * @return ResponseInterface
+     */
+    public function callMiddlewareStack(ServerRequestInterface $request, ResponseInterface $response)
+    {
+        if (is_null($this->tip)) {
+            $this->seedMiddlewareStack();
+        }
+        /** @var callable $start */
+        $start = $this->tip;
+        $this->middlewareLock = true;
+        $response = $start($request, $response);
+        $this->middlewareLock = false;
+        return $response;
+    }
+}
diff --git a/advancedcontentfilter/vendor/slim/slim/Slim/Routable.php b/advancedcontentfilter/vendor/slim/slim/Slim/Routable.php
new file mode 100644 (file)
index 0000000..c912db4
--- /dev/null
@@ -0,0 +1,106 @@
+<?php
+/**
+ * Slim Framework (https://slimframework.com)
+ *
+ * @link      https://github.com/slimphp/Slim
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
+ * @license   https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
+ */
+namespace Slim;
+
+use Psr\Container\ContainerInterface;
+
+/**
+ * A routable, middleware-aware object
+ *
+ * @package Slim
+ * @since   3.0.0
+ */
+abstract class Routable
+{
+    use CallableResolverAwareTrait;
+
+    /**
+     * Route callable
+     *
+     * @var callable
+     */
+    protected $callable;
+
+    /**
+     * Container
+     *
+     * @var ContainerInterface
+     */
+    protected $container;
+
+    /**
+     * Route middleware
+     *
+     * @var callable[]
+     */
+    protected $middleware = [];
+
+    /**
+     * Route pattern
+     *
+     * @var string
+     */
+    protected $pattern;
+
+    /**
+     * Get the middleware registered for the group
+     *
+     * @return callable[]
+     */
+    public function getMiddleware()
+    {
+        return $this->middleware;
+    }
+
+    /**
+     * Get the route pattern
+     *
+     * @return string
+     */
+    public function getPattern()
+    {
+        return $this->pattern;
+    }
+
+    /**
+     * Set container for use with resolveCallable
+     *
+     * @param ContainerInterface $container
+     *
+     * @return self
+     */
+    public function setContainer(ContainerInterface $container)
+    {
+        $this->container = $container;
+        return $this;
+    }
+
+    /**
+     * Prepend middleware to the middleware collection
+     *
+     * @param callable|string $callable The callback routine
+     *
+     * @return static
+     */
+    public function add($callable)
+    {
+        $this->middleware[] = new DeferredCallable($callable, $this->container);
+        return $this;
+    }
+
+    /**
+     * Set the route pattern
+     *
+     * @param string $newPattern
+     */
+    public function setPattern($newPattern)
+    {
+        $this->pattern = $newPattern;
+    }
+}
diff --git a/advancedcontentfilter/vendor/slim/slim/Slim/Route.php b/advancedcontentfilter/vendor/slim/slim/Slim/Route.php
new file mode 100644 (file)
index 0000000..fa8be4e
--- /dev/null
@@ -0,0 +1,349 @@
+<?php
+/**
+ * Slim Framework (https://slimframework.com)
+ *
+ * @link      https://github.com/slimphp/Slim
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
+ * @license   https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
+ */
+namespace Slim;
+
+use InvalidArgumentException;
+use Psr\Http\Message\ServerRequestInterface;
+use Psr\Http\Message\ResponseInterface;
+use Slim\Handlers\Strategies\RequestResponse;
+use Slim\Interfaces\InvocationStrategyInterface;
+use Slim\Interfaces\RouteInterface;
+
+/**
+ * Route
+ */
+class Route extends Routable implements RouteInterface
+{
+    use MiddlewareAwareTrait;
+
+    /**
+     * HTTP methods supported by this route
+     *
+     * @var string[]
+     */
+    protected $methods = [];
+
+    /**
+     * Route identifier
+     *
+     * @var string
+     */
+    protected $identifier;
+
+    /**
+     * Route name
+     *
+     * @var null|string
+     */
+    protected $name;
+
+    /**
+     * Parent route groups
+     *
+     * @var RouteGroup[]
+     */
+    protected $groups;
+
+    private $finalized = false;
+
+    /**
+     * Output buffering mode
+     *
+     * One of: false, 'prepend' or 'append'
+     *
+     * @var boolean|string
+     */
+    protected $outputBuffering = 'append';
+
+    /**
+     * Route parameters
+     *
+     * @var array
+     */
+    protected $arguments = [];
+
+    /**
+     * The callable payload
+     *
+     * @var callable
+     */
+    protected $callable;
+
+    /**
+     * Create new route
+     *
+     * @param string|string[]   $methods The route HTTP methods
+     * @param string            $pattern The route pattern
+     * @param callable          $callable The route callable
+     * @param RouteGroup[]      $groups The parent route groups
+     * @param int               $identifier The route identifier
+     */
+    public function __construct($methods, $pattern, $callable, $groups = [], $identifier = 0)
+    {
+        $this->methods  = is_string($methods) ? [$methods] : $methods;
+        $this->pattern  = $pattern;
+        $this->callable = $callable;
+        $this->groups   = $groups;
+        $this->identifier = 'route' . $identifier;
+    }
+
+    /**
+     * Finalize the route in preparation for dispatching
+     */
+    public function finalize()
+    {
+        if ($this->finalized) {
+            return;
+        }
+
+        $groupMiddleware = [];
+        foreach ($this->getGroups() as $group) {
+            $groupMiddleware = array_merge($group->getMiddleware(), $groupMiddleware);
+        }
+
+        $this->middleware = array_merge($this->middleware, $groupMiddleware);
+
+        foreach ($this->getMiddleware() as $middleware) {
+            $this->addMiddleware($middleware);
+        }
+
+        $this->finalized = true;
+    }
+
+    /**
+     * Get route callable
+     *
+     * @return callable
+     */
+    public function getCallable()
+    {
+        return $this->callable;
+    }
+
+    /**
+     * This method enables you to override the Route's callable
+     *
+     * @param string|\Closure $callable
+     */
+    public function setCallable($callable)
+    {
+        $this->callable = $callable;
+    }
+
+    /**
+     * Get route methods
+     *
+     * @return string[]
+     */
+    public function getMethods()
+    {
+        return $this->methods;
+    }
+
+    /**
+     * Get parent route groups
+     *
+     * @return RouteGroup[]
+     */
+    public function getGroups()
+    {
+        return $this->groups;
+    }
+
+    /**
+     * Get route name
+     *
+     * @return null|string
+     */
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    /**
+     * Get route identifier
+     *
+     * @return string
+     */
+    public function getIdentifier()
+    {
+        return $this->identifier;
+    }
+
+    /**
+     * Get output buffering mode
+     *
+     * @return boolean|string
+     */
+    public function getOutputBuffering()
+    {
+        return $this->outputBuffering;
+    }
+
+    /**
+     * Set output buffering mode
+     *
+     * One of: false, 'prepend' or 'append'
+     *
+     * @param boolean|string $mode
+     *
+     * @throws InvalidArgumentException If an unknown buffering mode is specified
+     */
+    public function setOutputBuffering($mode)
+    {
+        if (!in_array($mode, [false, 'prepend', 'append'], true)) {
+            throw new InvalidArgumentException('Unknown output buffering mode');
+        }
+        $this->outputBuffering = $mode;
+    }
+
+    /**
+     * Set route name
+     *
+     * @param string $name
+     *
+     * @return self
+     *
+     * @throws InvalidArgumentException if the route name is not a string
+     */
+    public function setName($name)
+    {
+        if (!is_string($name)) {
+            throw new InvalidArgumentException('Route name must be a string');
+        }
+        $this->name = $name;
+        return $this;
+    }
+
+    /**
+     * Set a route argument
+     *
+     * @param string $name
+     * @param string $value
+     *
+     * @return self
+     */
+    public function setArgument($name, $value)
+    {
+        $this->arguments[$name] = $value;
+        return $this;
+    }
+
+    /**
+     * Replace route arguments
+     *
+     * @param array $arguments
+     *
+     * @return self
+     */
+    public function setArguments(array $arguments)
+    {
+        $this->arguments = $arguments;
+        return $this;
+    }
+
+    /**
+     * Retrieve route arguments
+     *
+     * @return array
+     */
+    public function getArguments()
+    {
+        return $this->arguments;
+    }
+
+    /**
+     * Retrieve a specific route argument
+     *
+     * @param string $name
+     * @param string|null $default
+     *
+     * @return mixed
+     */
+    public function getArgument($name, $default = null)
+    {
+        if (array_key_exists($name, $this->arguments)) {
+            return $this->arguments[$name];
+        }
+        return $default;
+    }
+
+    /********************************************************************************
+     * Route Runner
+     *******************************************************************************/
+
+    /**
+     * Prepare the route for use
+     *
+     * @param ServerRequestInterface $request
+     * @param array $arguments
+     */
+    public function prepare(ServerRequestInterface $request, array $arguments)
+    {
+        // Add the arguments
+        foreach ($arguments as $k => $v) {
+            $this->setArgument($k, $v);
+        }
+    }
+
+    /**
+     * Run route
+     *
+     * This method traverses the middleware stack, including the route's callable
+     * and captures the resultant HTTP response object. It then sends the response
+     * back to the Application.
+     *
+     * @param ServerRequestInterface $request
+     * @param ResponseInterface      $response
+     *
+     * @return ResponseInterface
+     */
+    public function run(ServerRequestInterface $request, ResponseInterface $response)
+    {
+        // Finalise route now that we are about to run it
+        $this->finalize();
+
+        // Traverse middleware stack and fetch updated response
+        return $this->callMiddlewareStack($request, $response);
+    }
+
+    /**
+     * Dispatch route callable against current Request and Response objects
+     *
+     * This method invokes the route object's callable. If middleware is
+     * registered for the route, each callable middleware is invoked in
+     * the order specified.
+     *
+     * @param ServerRequestInterface $request  The current Request object
+     * @param ResponseInterface      $response The current Response object
+     * @return \Psr\Http\Message\ResponseInterface
+     * @throws \Exception  if the route callable throws an exception
+     */
+    public function __invoke(ServerRequestInterface $request, ResponseInterface $response)
+    {
+        $this->callable = $this->resolveCallable($this->callable);
+
+        /** @var InvocationStrategyInterface $handler */
+        $handler = isset($this->container) ? $this->container->get('foundHandler') : new RequestResponse();
+
+        $newResponse = $handler($this->callable, $request, $response, $this->arguments);
+
+        if ($newResponse instanceof ResponseInterface) {
+            // if route callback returns a ResponseInterface, then use it
+            $response = $newResponse;
+        } elseif (is_string($newResponse)) {
+            // if route callback returns a string, then append it to the response
+            if ($response->getBody()->isWritable()) {
+                $response->getBody()->write($newResponse);
+            }
+        }
+
+        return $response;
+    }
+}
diff --git a/advancedcontentfilter/vendor/slim/slim/Slim/RouteGroup.php b/advancedcontentfilter/vendor/slim/slim/Slim/RouteGroup.php
new file mode 100644 (file)
index 0000000..8260bbd
--- /dev/null
@@ -0,0 +1,47 @@
+<?php
+/**
+ * Slim Framework (https://slimframework.com)
+ *
+ * @link      https://github.com/slimphp/Slim
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
+ * @license   https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
+ */
+namespace Slim;
+
+use Closure;
+use Slim\Interfaces\RouteGroupInterface;
+
+/**
+ * A collector for Routable objects with a common middleware stack
+ *
+ * @package Slim
+ */
+class RouteGroup extends Routable implements RouteGroupInterface
+{
+    /**
+     * Create a new RouteGroup
+     *
+     * @param string   $pattern  The pattern prefix for the group
+     * @param callable $callable The group callable
+     */
+    public function __construct($pattern, $callable)
+    {
+        $this->pattern = $pattern;
+        $this->callable = $callable;
+    }
+
+    /**
+     * Invoke the group to register any Routable objects within it.
+     *
+     * @param App $app The App instance to bind/pass to the group callable
+     */
+    public function __invoke(App $app = null)
+    {
+        $callable = $this->resolveCallable($this->callable);
+        if ($callable instanceof Closure && $app !== null) {
+            $callable = $callable->bindTo($app);
+        }
+
+        $callable($app);
+    }
+}
diff --git a/advancedcontentfilter/vendor/slim/slim/Slim/Router.php b/advancedcontentfilter/vendor/slim/slim/Slim/Router.php
new file mode 100644 (file)
index 0000000..8311628
--- /dev/null
@@ -0,0 +1,455 @@
+<?php
+/**
+ * Slim Framework (https://slimframework.com)
+ *
+ * @link      https://github.com/slimphp/Slim
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
+ * @license   https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
+ */
+namespace Slim;
+
+use FastRoute\Dispatcher;
+use Psr\Container\ContainerInterface;
+use InvalidArgumentException;
+use RuntimeException;
+use Psr\Http\Message\ServerRequestInterface;
+use FastRoute\RouteCollector;
+use FastRoute\RouteParser;
+use FastRoute\RouteParser\Std as StdParser;
+use Slim\Interfaces\RouteGroupInterface;
+use Slim\Interfaces\RouterInterface;
+use Slim\Interfaces\RouteInterface;
+
+/**
+ * Router
+ *
+ * This class organizes Slim application route objects. It is responsible
+ * for registering route objects, assigning names to route objects,
+ * finding routes that match the current HTTP request, and creating
+ * URLs for a named route.
+ */
+class Router implements RouterInterface
+{
+    /**
+     * Container Interface
+     *
+     * @var ContainerInterface
+     */
+    protected $container;
+
+    /**
+     * Parser
+     *
+     * @var \FastRoute\RouteParser
+     */
+    protected $routeParser;
+
+    /**
+     * Base path used in pathFor()
+     *
+     * @var string
+     */
+    protected $basePath = '';
+
+    /**
+     * Path to fast route cache file. Set to false to disable route caching
+     *
+     * @var string|False
+     */
+    protected $cacheFile = false;
+
+    /**
+     * Routes
+     *
+     * @var Route[]
+     */
+    protected $routes = [];
+
+    /**
+     * Route counter incrementer
+     * @var int
+     */
+    protected $routeCounter = 0;
+
+    /**
+     * Route groups
+     *
+     * @var RouteGroup[]
+     */
+    protected $routeGroups = [];
+
+    /**
+     * @var \FastRoute\Dispatcher
+     */
+    protected $dispatcher;
+
+    /**
+     * Create new router
+     *
+     * @param RouteParser   $parser
+     */
+    public function __construct(RouteParser $parser = null)
+    {
+        $this->routeParser = $parser ?: new StdParser;
+    }
+
+    /**
+     * Set the base path used in pathFor()
+     *
+     * @param string $basePath
+     *
+     * @return self
+     */
+    public function setBasePath($basePath)
+    {
+        if (!is_string($basePath)) {
+            throw new InvalidArgumentException('Router basePath must be a string');
+        }
+
+        $this->basePath = $basePath;
+
+        return $this;
+    }
+
+    /**
+     * Set path to fast route cache file. If this is false then route caching is disabled.
+     *
+     * @param string|false $cacheFile
+     *
+     * @return self
+     */
+    public function setCacheFile($cacheFile)
+    {
+        if (!is_string($cacheFile) && $cacheFile !== false) {
+            throw new InvalidArgumentException('Router cacheFile must be a string or false');
+        }
+
+        $this->cacheFile = $cacheFile;
+
+        if ($cacheFile !== false && !is_writable(dirname($cacheFile))) {
+            throw new RuntimeException('Router cacheFile directory must be writable');
+        }
+
+
+        return $this;
+    }
+
+    /**
+     * @param ContainerInterface $container
+     */
+    public function setContainer(ContainerInterface $container)
+    {
+        $this->container = $container;
+    }
+
+    /**
+     * Add route
+     *
+     * @param  string[] $methods Array of HTTP methods
+     * @param  string   $pattern The route pattern
+     * @param  callable $handler The route callable
+     *
+     * @return RouteInterface
+     *
+     * @throws InvalidArgumentException if the route pattern isn't a string
+     */
+    public function map($methods, $pattern, $handler)
+    {
+        if (!is_string($pattern)) {
+            throw new InvalidArgumentException('Route pattern must be a string');
+        }
+
+        // Prepend parent group pattern(s)
+        if ($this->routeGroups) {
+            $pattern = $this->processGroups() . $pattern;
+        }
+
+        // According to RFC methods are defined in uppercase (See RFC 7231)
+        $methods = array_map("strtoupper", $methods);
+
+        // Add route
+        $route = $this->createRoute($methods, $pattern, $handler);
+        $this->routes[$route->getIdentifier()] = $route;
+        $this->routeCounter++;
+
+        return $route;
+    }
+
+    /**
+     * Dispatch router for HTTP request
+     *
+     * @param  ServerRequestInterface $request The current HTTP request object
+     *
+     * @return array
+     *
+     * @link   https://github.com/nikic/FastRoute/blob/master/src/Dispatcher.php
+     */
+    public function dispatch(ServerRequestInterface $request)
+    {
+        $uri = '/' . ltrim($request->getUri()->getPath(), '/');
+
+        return $this->createDispatcher()->dispatch(
+            $request->getMethod(),
+            $uri
+        );
+    }
+
+    /**
+     * Create a new Route object
+     *
+     * @param  string[] $methods Array of HTTP methods
+     * @param  string   $pattern The route pattern
+     * @param  callable $callable The route callable
+     *
+     * @return \Slim\Interfaces\RouteInterface
+     */
+    protected function createRoute($methods, $pattern, $callable)
+    {
+        $route = new Route($methods, $pattern, $callable, $this->routeGroups, $this->routeCounter);
+        if (!empty($this->container)) {
+            $route->setContainer($this->container);
+        }
+
+        return $route;
+    }
+
+    /**
+     * @return \FastRoute\Dispatcher
+     */
+    protected function createDispatcher()
+    {
+        if ($this->dispatcher) {
+            return $this->dispatcher;
+        }
+
+        $routeDefinitionCallback = function (RouteCollector $r) {
+            foreach ($this->getRoutes() as $route) {
+                $r->addRoute($route->getMethods(), $route->getPattern(), $route->getIdentifier());
+            }
+        };
+
+        if ($this->cacheFile) {
+            $this->dispatcher = \FastRoute\cachedDispatcher($routeDefinitionCallback, [
+                'routeParser' => $this->routeParser,
+                'cacheFile' => $this->cacheFile,
+            ]);
+        } else {
+            $this->dispatcher = \FastRoute\simpleDispatcher($routeDefinitionCallback, [
+                'routeParser' => $this->routeParser,
+            ]);
+        }
+
+        return $this->dispatcher;
+    }
+
+    /**
+     * @param \FastRoute\Dispatcher $dispatcher
+     */
+    public function setDispatcher(Dispatcher $dispatcher)
+    {
+        $this->dispatcher = $dispatcher;
+    }
+
+    /**
+     * Get route objects
+     *
+     * @return Route[]
+     */
+    public function getRoutes()
+    {
+        return $this->routes;
+    }
+
+    /**
+     * Get named route object
+     *
+     * @param string $name        Route name
+     *
+     * @return Route
+     *
+     * @throws RuntimeException   If named route does not exist
+     */
+    public function getNamedRoute($name)
+    {
+        foreach ($this->routes as $route) {
+            if ($name == $route->getName()) {
+                return $route;
+            }
+        }
+        throw new RuntimeException('Named route does not exist for name: ' . $name);
+    }
+
+    /**
+     * Remove named route
+     *
+     * @param string $name        Route name
+     *
+     * @throws RuntimeException   If named route does not exist
+     */
+    public function removeNamedRoute($name)
+    {
+        $route = $this->getNamedRoute($name);
+
+        // no exception, route exists, now remove by id
+        unset($this->routes[$route->getIdentifier()]);
+    }
+
+    /**
+     * Process route groups
+     *
+     * @return string A group pattern to prefix routes with
+     */
+    protected function processGroups()
+    {
+        $pattern = "";
+        foreach ($this->routeGroups as $group) {
+            $pattern .= $group->getPattern();
+        }
+        return $pattern;
+    }
+
+    /**
+     * Add a route group to the array
+     *
+     * @param string   $pattern
+     * @param callable $callable
+     *
+     * @return RouteGroupInterface
+     */
+    public function pushGroup($pattern, $callable)
+    {
+        $group = new RouteGroup($pattern, $callable);
+        array_push($this->routeGroups, $group);
+        return $group;
+    }
+
+    /**
+     * Removes the last route group from the array
+     *
+     * @return RouteGroup|bool The RouteGroup if successful, else False
+     */
+    public function popGroup()
+    {
+        $group = array_pop($this->routeGroups);
+        return $group instanceof RouteGroup ? $group : false;
+    }
+
+    /**
+     * @param $identifier
+     * @return \Slim\Interfaces\RouteInterface
+     */
+    public function lookupRoute($identifier)
+    {
+        if (!isset($this->routes[$identifier])) {
+            throw new RuntimeException('Route not found, looks like your route cache is stale.');
+        }
+        return $this->routes[$identifier];
+    }
+
+    /**
+     * Build the path for a named route excluding the base path
+     *
+     * @param string $name        Route name
+     * @param array  $data        Named argument replacement data
+     * @param array  $queryParams Optional query string parameters
+     *
+     * @return string
+     *
+     * @throws RuntimeException         If named route does not exist
+     * @throws InvalidArgumentException If required data not provided
+     */
+    public function relativePathFor($name, array $data = [], array $queryParams = [])
+    {
+        $route = $this->getNamedRoute($name);
+        $pattern = $route->getPattern();
+
+        $routeDatas = $this->routeParser->parse($pattern);
+        // $routeDatas is an array of all possible routes that can be made. There is
+        // one routedata for each optional parameter plus one for no optional parameters.
+        //
+        // The most specific is last, so we look for that first.
+        $routeDatas = array_reverse($routeDatas);
+
+        $segments = [];
+        foreach ($routeDatas as $routeData) {
+            foreach ($routeData as $item) {
+                if (is_string($item)) {
+                    // this segment is a static string
+                    $segments[] = $item;
+                    continue;
+                }
+
+                // This segment has a parameter: first element is the name
+                if (!array_key_exists($item[0], $data)) {
+                    // we don't have a data element for this segment: cancel
+                    // testing this routeData item, so that we can try a less
+                    // specific routeData item.
+                    $segments = [];
+                    $segmentName = $item[0];
+                    break;
+                }
+                $segments[] = $data[$item[0]];
+            }
+            if (!empty($segments)) {
+                // we found all the parameters for this route data, no need to check
+                // less specific ones
+                break;
+            }
+        }
+
+        if (empty($segments)) {
+            throw new InvalidArgumentException('Missing data for URL segment: ' . $segmentName);
+        }
+        $url = implode('', $segments);
+
+        if ($queryParams) {
+            $url .= '?' . http_build_query($queryParams);
+        }
+
+        return $url;
+    }
+
+
+    /**
+     * Build the path for a named route including the base path
+     *
+     * @param string $name        Route name
+     * @param array  $data        Named argument replacement data
+     * @param array  $queryParams Optional query string parameters
+     *
+     * @return string
+     *
+     * @throws RuntimeException         If named route does not exist
+     * @throws InvalidArgumentException If required data not provided
+     */
+    public function pathFor($name, array $data = [], array $queryParams = [])
+    {
+        $url = $this->relativePathFor($name, $data, $queryParams);
+
+        if ($this->basePath) {
+            $url = $this->basePath . $url;
+        }
+
+        return $url;
+    }
+
+    /**
+     * Build the path for a named route.
+     *
+     * This method is deprecated. Use pathFor() from now on.
+     *
+     * @param string $name        Route name
+     * @param array  $data        Named argument replacement data
+     * @param array  $queryParams Optional query string parameters
+     *
+     * @return string
+     *
+     * @throws RuntimeException         If named route does not exist
+     * @throws InvalidArgumentException If required data not provided
+     */
+    public function urlFor($name, array $data = [], array $queryParams = [])
+    {
+        trigger_error('urlFor() is deprecated. Use pathFor() instead.', E_USER_DEPRECATED);
+        return $this->pathFor($name, $data, $queryParams);
+    }
+}
diff --git a/advancedcontentfilter/vendor/slim/slim/composer.json b/advancedcontentfilter/vendor/slim/slim/composer.json
new file mode 100644 (file)
index 0000000..554a838
--- /dev/null
@@ -0,0 +1,58 @@
+{
+    "name": "slim/slim",
+    "type": "library",
+    "description": "Slim is a PHP micro framework that helps you quickly write simple yet powerful web applications and APIs",
+    "keywords": ["framework","micro","api","router"],
+    "homepage": "https://slimframework.com",
+    "license": "MIT",
+    "authors": [
+        {
+            "name": "Josh Lockhart",
+            "email": "hello@joshlockhart.com",
+            "homepage": "https://joshlockhart.com"
+        },
+        {
+            "name": "Andrew Smith",
+            "email": "a.smith@silentworks.co.uk",
+            "homepage": "http://silentworks.co.uk"
+        },
+        {
+            "name": "Rob Allen",
+            "email": "rob@akrabat.com",
+            "homepage": "http://akrabat.com"
+        },
+        {
+            "name": "Gabriel Manricks",
+            "email": "gmanricks@me.com",
+            "homepage": "http://gabrielmanricks.com"
+        }
+    ],
+    "require": {
+        "php": ">=5.5.0",
+        "pimple/pimple": "^3.0",
+        "psr/http-message": "^1.0",
+        "nikic/fast-route": "^1.0",
+        "container-interop/container-interop": "^1.2",
+        "psr/container": "^1.0"
+    },
+    "require-dev": {
+        "squizlabs/php_codesniffer": "^2.5",
+        "phpunit/phpunit": "^4.0"
+    },
+    "provide": {
+        "psr/http-message-implementation": "1.0"
+    },
+    "autoload": {
+        "psr-4": {
+            "Slim\\": "Slim"
+        }
+    },
+    "scripts": {
+        "test": [
+            "@phpunit",
+            "@phpcs"
+        ],
+        "phpunit": "php vendor/bin/phpunit",
+        "phpcs": "php vendor/bin/phpcs"
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/.gitignore b/advancedcontentfilter/vendor/symfony/cache/.gitignore
new file mode 100644 (file)
index 0000000..5414c2c
--- /dev/null
@@ -0,0 +1,3 @@
+composer.lock
+phpunit.xml
+vendor/
diff --git a/advancedcontentfilter/vendor/symfony/cache/Adapter/AbstractAdapter.php b/advancedcontentfilter/vendor/symfony/cache/Adapter/AbstractAdapter.php
new file mode 100644 (file)
index 0000000..727fc84
--- /dev/null
@@ -0,0 +1,302 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Adapter;
+
+use Psr\Cache\CacheItemInterface;
+use Psr\Log\LoggerAwareInterface;
+use Psr\Log\LoggerInterface;
+use Psr\Log\NullLogger;
+use Symfony\Component\Cache\CacheItem;
+use Symfony\Component\Cache\Exception\InvalidArgumentException;
+use Symfony\Component\Cache\ResettableInterface;
+use Symfony\Component\Cache\Traits\AbstractTrait;
+
+/**
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+abstract class AbstractAdapter implements AdapterInterface, LoggerAwareInterface, ResettableInterface
+{
+    use AbstractTrait;
+
+    private static $apcuSupported;
+    private static $phpFilesSupported;
+
+    private $createCacheItem;
+    private $mergeByLifetime;
+
+    /**
+     * @param string $namespace
+     * @param int    $defaultLifetime
+     */
+    protected function __construct($namespace = '', $defaultLifetime = 0)
+    {
+        $this->namespace = '' === $namespace ? '' : CacheItem::validateKey($namespace).':';
+        if (null !== $this->maxIdLength && strlen($namespace) > $this->maxIdLength - 24) {
+            throw new InvalidArgumentException(sprintf('Namespace must be %d chars max, %d given ("%s")', $this->maxIdLength - 24, strlen($namespace), $namespace));
+        }
+        $this->createCacheItem = \Closure::bind(
+            function ($key, $value, $isHit) use ($defaultLifetime) {
+                $item = new CacheItem();
+                $item->key = $key;
+                $item->value = $value;
+                $item->isHit = $isHit;
+                $item->defaultLifetime = $defaultLifetime;
+
+                return $item;
+            },
+            null,
+            CacheItem::class
+        );
+        $getId = function ($key) { return $this->getId((string) $key); };
+        $this->mergeByLifetime = \Closure::bind(
+            function ($deferred, $namespace, &$expiredIds) use ($getId) {
+                $byLifetime = array();
+                $now = time();
+                $expiredIds = array();
+
+                foreach ($deferred as $key => $item) {
+                    if (null === $item->expiry) {
+                        $byLifetime[0 < $item->defaultLifetime ? $item->defaultLifetime : 0][$getId($key)] = $item->value;
+                    } elseif ($item->expiry > $now) {
+                        $byLifetime[$item->expiry - $now][$getId($key)] = $item->value;
+                    } else {
+                        $expiredIds[] = $getId($key);
+                    }
+                }
+
+                return $byLifetime;
+            },
+            null,
+            CacheItem::class
+        );
+    }
+
+    /**
+     * @param string               $namespace
+     * @param int                  $defaultLifetime
+     * @param string               $version
+     * @param string               $directory
+     * @param LoggerInterface|null $logger
+     *
+     * @return AdapterInterface
+     */
+    public static function createSystemCache($namespace, $defaultLifetime, $version, $directory, LoggerInterface $logger = null)
+    {
+        if (null === self::$apcuSupported) {
+            self::$apcuSupported = ApcuAdapter::isSupported();
+        }
+
+        if (!self::$apcuSupported && null === self::$phpFilesSupported) {
+            self::$phpFilesSupported = PhpFilesAdapter::isSupported();
+        }
+
+        if (self::$phpFilesSupported) {
+            $opcache = new PhpFilesAdapter($namespace, $defaultLifetime, $directory);
+            if (null !== $logger) {
+                $opcache->setLogger($logger);
+            }
+
+            return $opcache;
+        }
+
+        $fs = new FilesystemAdapter($namespace, $defaultLifetime, $directory);
+        if (null !== $logger) {
+            $fs->setLogger($logger);
+        }
+        if (!self::$apcuSupported) {
+            return $fs;
+        }
+
+        $apcu = new ApcuAdapter($namespace, (int) $defaultLifetime / 5, $version);
+        if ('cli' === \PHP_SAPI && !ini_get('apc.enable_cli')) {
+            $apcu->setLogger(new NullLogger());
+        } elseif (null !== $logger) {
+            $apcu->setLogger($logger);
+        }
+
+        return new ChainAdapter(array($apcu, $fs));
+    }
+
+    public static function createConnection($dsn, array $options = array())
+    {
+        if (!is_string($dsn)) {
+            throw new InvalidArgumentException(sprintf('The %s() method expect argument #1 to be string, %s given.', __METHOD__, gettype($dsn)));
+        }
+        if (0 === strpos($dsn, 'redis://')) {
+            return RedisAdapter::createConnection($dsn, $options);
+        }
+        if (0 === strpos($dsn, 'memcached://')) {
+            return MemcachedAdapter::createConnection($dsn, $options);
+        }
+
+        throw new InvalidArgumentException(sprintf('Unsupported DSN: %s.', $dsn));
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getItem($key)
+    {
+        if ($this->deferred) {
+            $this->commit();
+        }
+        $id = $this->getId($key);
+
+        $f = $this->createCacheItem;
+        $isHit = false;
+        $value = null;
+
+        try {
+            foreach ($this->doFetch(array($id)) as $value) {
+                $isHit = true;
+            }
+        } catch (\Exception $e) {
+            CacheItem::log($this->logger, 'Failed to fetch key "{key}"', array('key' => $key, 'exception' => $e));
+        }
+
+        return $f($key, $value, $isHit);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getItems(array $keys = array())
+    {
+        if ($this->deferred) {
+            $this->commit();
+        }
+        $ids = array();
+
+        foreach ($keys as $key) {
+            $ids[] = $this->getId($key);
+        }
+        try {
+            $items = $this->doFetch($ids);
+        } catch (\Exception $e) {
+            CacheItem::log($this->logger, 'Failed to fetch requested items', array('keys' => $keys, 'exception' => $e));
+            $items = array();
+        }
+        $ids = array_combine($ids, $keys);
+
+        return $this->generateItems($items, $ids);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function save(CacheItemInterface $item)
+    {
+        if (!$item instanceof CacheItem) {
+            return false;
+        }
+        $this->deferred[$item->getKey()] = $item;
+
+        return $this->commit();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function saveDeferred(CacheItemInterface $item)
+    {
+        if (!$item instanceof CacheItem) {
+            return false;
+        }
+        $this->deferred[$item->getKey()] = $item;
+
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function commit()
+    {
+        $ok = true;
+        $byLifetime = $this->mergeByLifetime;
+        $byLifetime = $byLifetime($this->deferred, $this->namespace, $expiredIds);
+        $retry = $this->deferred = array();
+
+        if ($expiredIds) {
+            $this->doDelete($expiredIds);
+        }
+        foreach ($byLifetime as $lifetime => $values) {
+            try {
+                $e = $this->doSave($values, $lifetime);
+            } catch (\Exception $e) {
+            }
+            if (true === $e || array() === $e) {
+                continue;
+            }
+            if (is_array($e) || 1 === count($values)) {
+                foreach (is_array($e) ? $e : array_keys($values) as $id) {
+                    $ok = false;
+                    $v = $values[$id];
+                    $type = is_object($v) ? get_class($v) : gettype($v);
+                    CacheItem::log($this->logger, 'Failed to save key "{key}" ({type})', array('key' => substr($id, strlen($this->namespace)), 'type' => $type, 'exception' => $e instanceof \Exception ? $e : null));
+                }
+            } else {
+                foreach ($values as $id => $v) {
+                    $retry[$lifetime][] = $id;
+                }
+            }
+        }
+
+        // When bulk-save failed, retry each item individually
+        foreach ($retry as $lifetime => $ids) {
+            foreach ($ids as $id) {
+                try {
+                    $v = $byLifetime[$lifetime][$id];
+                    $e = $this->doSave(array($id => $v), $lifetime);
+                } catch (\Exception $e) {
+                }
+                if (true === $e || array() === $e) {
+                    continue;
+                }
+                $ok = false;
+                $type = is_object($v) ? get_class($v) : gettype($v);
+                CacheItem::log($this->logger, 'Failed to save key "{key}" ({type})', array('key' => substr($id, strlen($this->namespace)), 'type' => $type, 'exception' => $e instanceof \Exception ? $e : null));
+            }
+        }
+
+        return $ok;
+    }
+
+    public function __destruct()
+    {
+        if ($this->deferred) {
+            $this->commit();
+        }
+    }
+
+    private function generateItems($items, &$keys)
+    {
+        $f = $this->createCacheItem;
+
+        try {
+            foreach ($items as $id => $value) {
+                if (!isset($keys[$id])) {
+                    $id = key($keys);
+                }
+                $key = $keys[$id];
+                unset($keys[$id]);
+                yield $key => $f($key, $value, true);
+            }
+        } catch (\Exception $e) {
+            CacheItem::log($this->logger, 'Failed to fetch requested items', array('keys' => array_values($keys), 'exception' => $e));
+        }
+
+        foreach ($keys as $key) {
+            yield $key => $f($key, null, false);
+        }
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Adapter/AdapterInterface.php b/advancedcontentfilter/vendor/symfony/cache/Adapter/AdapterInterface.php
new file mode 100644 (file)
index 0000000..41222c1
--- /dev/null
@@ -0,0 +1,37 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Adapter;
+
+use Psr\Cache\CacheItemPoolInterface;
+use Symfony\Component\Cache\CacheItem;
+
+/**
+ * Interface for adapters managing instances of Symfony's CacheItem.
+ *
+ * @author Kévin Dunglas <dunglas@gmail.com>
+ */
+interface AdapterInterface extends CacheItemPoolInterface
+{
+    /**
+     * {@inheritdoc}
+     *
+     * @return CacheItem
+     */
+    public function getItem($key);
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return \Traversable|CacheItem[]
+     */
+    public function getItems(array $keys = array());
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Adapter/ApcuAdapter.php b/advancedcontentfilter/vendor/symfony/cache/Adapter/ApcuAdapter.php
new file mode 100644 (file)
index 0000000..50554ed
--- /dev/null
@@ -0,0 +1,31 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Adapter;
+
+use Symfony\Component\Cache\Traits\ApcuTrait;
+
+class ApcuAdapter extends AbstractAdapter
+{
+    use ApcuTrait;
+
+    /**
+     * @param string      $namespace
+     * @param int         $defaultLifetime
+     * @param string|null $version
+     *
+     * @throws CacheException if APCu is not enabled
+     */
+    public function __construct($namespace = '', $defaultLifetime = 0, $version = null)
+    {
+        $this->init($namespace, $defaultLifetime, $version);
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Adapter/ArrayAdapter.php b/advancedcontentfilter/vendor/symfony/cache/Adapter/ArrayAdapter.php
new file mode 100644 (file)
index 0000000..2118e9c
--- /dev/null
@@ -0,0 +1,155 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Adapter;
+
+use Psr\Cache\CacheItemInterface;
+use Psr\Log\LoggerAwareInterface;
+use Symfony\Component\Cache\CacheItem;
+use Symfony\Component\Cache\ResettableInterface;
+use Symfony\Component\Cache\Traits\ArrayTrait;
+
+/**
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class ArrayAdapter implements AdapterInterface, LoggerAwareInterface, ResettableInterface
+{
+    use ArrayTrait;
+
+    private $createCacheItem;
+
+    /**
+     * @param int  $defaultLifetime
+     * @param bool $storeSerialized Disabling serialization can lead to cache corruptions when storing mutable values but increases performance otherwise
+     */
+    public function __construct($defaultLifetime = 0, $storeSerialized = true)
+    {
+        $this->storeSerialized = $storeSerialized;
+        $this->createCacheItem = \Closure::bind(
+            function ($key, $value, $isHit) use ($defaultLifetime) {
+                $item = new CacheItem();
+                $item->key = $key;
+                $item->value = $value;
+                $item->isHit = $isHit;
+                $item->defaultLifetime = $defaultLifetime;
+
+                return $item;
+            },
+            null,
+            CacheItem::class
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getItem($key)
+    {
+        $isHit = $this->hasItem($key);
+        try {
+            if (!$isHit) {
+                $this->values[$key] = $value = null;
+            } elseif (!$this->storeSerialized) {
+                $value = $this->values[$key];
+            } elseif ('b:0;' === $value = $this->values[$key]) {
+                $value = false;
+            } elseif (false === $value = unserialize($value)) {
+                $this->values[$key] = $value = null;
+                $isHit = false;
+            }
+        } catch (\Exception $e) {
+            CacheItem::log($this->logger, 'Failed to unserialize key "{key}"', array('key' => $key, 'exception' => $e));
+            $this->values[$key] = $value = null;
+            $isHit = false;
+        }
+        $f = $this->createCacheItem;
+
+        return $f($key, $value, $isHit);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getItems(array $keys = array())
+    {
+        foreach ($keys as $key) {
+            CacheItem::validateKey($key);
+        }
+
+        return $this->generateItems($keys, time(), $this->createCacheItem);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function deleteItems(array $keys)
+    {
+        foreach ($keys as $key) {
+            $this->deleteItem($key);
+        }
+
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function save(CacheItemInterface $item)
+    {
+        if (!$item instanceof CacheItem) {
+            return false;
+        }
+        $item = (array) $item;
+        $key = $item["\0*\0key"];
+        $value = $item["\0*\0value"];
+        $expiry = $item["\0*\0expiry"];
+
+        if (null !== $expiry && $expiry <= time()) {
+            $this->deleteItem($key);
+
+            return true;
+        }
+        if ($this->storeSerialized) {
+            try {
+                $value = serialize($value);
+            } catch (\Exception $e) {
+                $type = is_object($value) ? get_class($value) : gettype($value);
+                CacheItem::log($this->logger, 'Failed to save key "{key}" ({type})', array('key' => $key, 'type' => $type, 'exception' => $e));
+
+                return false;
+            }
+        }
+        if (null === $expiry && 0 < $item["\0*\0defaultLifetime"]) {
+            $expiry = time() + $item["\0*\0defaultLifetime"];
+        }
+
+        $this->values[$key] = $value;
+        $this->expiries[$key] = null !== $expiry ? $expiry : PHP_INT_MAX;
+
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function saveDeferred(CacheItemInterface $item)
+    {
+        return $this->save($item);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function commit()
+    {
+        return true;
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Adapter/ChainAdapter.php b/advancedcontentfilter/vendor/symfony/cache/Adapter/ChainAdapter.php
new file mode 100644 (file)
index 0000000..6bdf6b2
--- /dev/null
@@ -0,0 +1,264 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Adapter;
+
+use Psr\Cache\CacheItemInterface;
+use Psr\Cache\CacheItemPoolInterface;
+use Symfony\Component\Cache\CacheItem;
+use Symfony\Component\Cache\Exception\InvalidArgumentException;
+use Symfony\Component\Cache\PruneableInterface;
+use Symfony\Component\Cache\ResettableInterface;
+
+/**
+ * Chains several adapters together.
+ *
+ * Cached items are fetched from the first adapter having them in its data store.
+ * They are saved and deleted in all adapters at once.
+ *
+ * @author Kévin Dunglas <dunglas@gmail.com>
+ */
+class ChainAdapter implements AdapterInterface, PruneableInterface, ResettableInterface
+{
+    private $adapters = array();
+    private $adapterCount;
+    private $saveUp;
+
+    /**
+     * @param CacheItemPoolInterface[] $adapters    The ordered list of adapters used to fetch cached items
+     * @param int                      $maxLifetime The max lifetime of items propagated from lower adapters to upper ones
+     */
+    public function __construct(array $adapters, $maxLifetime = 0)
+    {
+        if (!$adapters) {
+            throw new InvalidArgumentException('At least one adapter must be specified.');
+        }
+
+        foreach ($adapters as $adapter) {
+            if (!$adapter instanceof CacheItemPoolInterface) {
+                throw new InvalidArgumentException(sprintf('The class "%s" does not implement the "%s" interface.', get_class($adapter), CacheItemPoolInterface::class));
+            }
+
+            if ($adapter instanceof AdapterInterface) {
+                $this->adapters[] = $adapter;
+            } else {
+                $this->adapters[] = new ProxyAdapter($adapter);
+            }
+        }
+        $this->adapterCount = count($this->adapters);
+
+        $this->saveUp = \Closure::bind(
+            function ($adapter, $item) use ($maxLifetime) {
+                $origDefaultLifetime = $item->defaultLifetime;
+
+                if (0 < $maxLifetime && ($origDefaultLifetime <= 0 || $maxLifetime < $origDefaultLifetime)) {
+                    $item->defaultLifetime = $maxLifetime;
+                }
+
+                $adapter->save($item);
+                $item->defaultLifetime = $origDefaultLifetime;
+            },
+            null,
+            CacheItem::class
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getItem($key)
+    {
+        $saveUp = $this->saveUp;
+
+        foreach ($this->adapters as $i => $adapter) {
+            $item = $adapter->getItem($key);
+
+            if ($item->isHit()) {
+                while (0 <= --$i) {
+                    $saveUp($this->adapters[$i], $item);
+                }
+
+                return $item;
+            }
+        }
+
+        return $item;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getItems(array $keys = array())
+    {
+        return $this->generateItems($this->adapters[0]->getItems($keys), 0);
+    }
+
+    private function generateItems($items, $adapterIndex)
+    {
+        $missing = array();
+        $nextAdapterIndex = $adapterIndex + 1;
+        $nextAdapter = isset($this->adapters[$nextAdapterIndex]) ? $this->adapters[$nextAdapterIndex] : null;
+
+        foreach ($items as $k => $item) {
+            if (!$nextAdapter || $item->isHit()) {
+                yield $k => $item;
+            } else {
+                $missing[] = $k;
+            }
+        }
+
+        if ($missing) {
+            $saveUp = $this->saveUp;
+            $adapter = $this->adapters[$adapterIndex];
+            $items = $this->generateItems($nextAdapter->getItems($missing), $nextAdapterIndex);
+
+            foreach ($items as $k => $item) {
+                if ($item->isHit()) {
+                    $saveUp($adapter, $item);
+                }
+
+                yield $k => $item;
+            }
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function hasItem($key)
+    {
+        foreach ($this->adapters as $adapter) {
+            if ($adapter->hasItem($key)) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function clear()
+    {
+        $cleared = true;
+        $i = $this->adapterCount;
+
+        while ($i--) {
+            $cleared = $this->adapters[$i]->clear() && $cleared;
+        }
+
+        return $cleared;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function deleteItem($key)
+    {
+        $deleted = true;
+        $i = $this->adapterCount;
+
+        while ($i--) {
+            $deleted = $this->adapters[$i]->deleteItem($key) && $deleted;
+        }
+
+        return $deleted;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function deleteItems(array $keys)
+    {
+        $deleted = true;
+        $i = $this->adapterCount;
+
+        while ($i--) {
+            $deleted = $this->adapters[$i]->deleteItems($keys) && $deleted;
+        }
+
+        return $deleted;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function save(CacheItemInterface $item)
+    {
+        $saved = true;
+        $i = $this->adapterCount;
+
+        while ($i--) {
+            $saved = $this->adapters[$i]->save($item) && $saved;
+        }
+
+        return $saved;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function saveDeferred(CacheItemInterface $item)
+    {
+        $saved = true;
+        $i = $this->adapterCount;
+
+        while ($i--) {
+            $saved = $this->adapters[$i]->saveDeferred($item) && $saved;
+        }
+
+        return $saved;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function commit()
+    {
+        $committed = true;
+        $i = $this->adapterCount;
+
+        while ($i--) {
+            $committed = $this->adapters[$i]->commit() && $committed;
+        }
+
+        return $committed;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function prune()
+    {
+        $pruned = true;
+
+        foreach ($this->adapters as $adapter) {
+            if ($adapter instanceof PruneableInterface) {
+                $pruned = $adapter->prune() && $pruned;
+            }
+        }
+
+        return $pruned;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function reset()
+    {
+        foreach ($this->adapters as $adapter) {
+            if ($adapter instanceof ResettableInterface) {
+                $adapter->reset();
+            }
+        }
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Adapter/DoctrineAdapter.php b/advancedcontentfilter/vendor/symfony/cache/Adapter/DoctrineAdapter.php
new file mode 100644 (file)
index 0000000..972d2b4
--- /dev/null
@@ -0,0 +1,32 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Adapter;
+
+use Doctrine\Common\Cache\CacheProvider;
+use Symfony\Component\Cache\Traits\DoctrineTrait;
+
+class DoctrineAdapter extends AbstractAdapter
+{
+    use DoctrineTrait;
+
+    /**
+     * @param CacheProvider $provider
+     * @param string        $namespace
+     * @param int           $defaultLifetime
+     */
+    public function __construct(CacheProvider $provider, $namespace = '', $defaultLifetime = 0)
+    {
+        parent::__construct('', $defaultLifetime);
+        $this->provider = $provider;
+        $provider->setNamespace($namespace);
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Adapter/FilesystemAdapter.php b/advancedcontentfilter/vendor/symfony/cache/Adapter/FilesystemAdapter.php
new file mode 100644 (file)
index 0000000..d071964
--- /dev/null
@@ -0,0 +1,31 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Adapter;
+
+use Symfony\Component\Cache\PruneableInterface;
+use Symfony\Component\Cache\Traits\FilesystemTrait;
+
+class FilesystemAdapter extends AbstractAdapter implements PruneableInterface
+{
+    use FilesystemTrait;
+
+    /**
+     * @param string      $namespace
+     * @param int         $defaultLifetime
+     * @param string|null $directory
+     */
+    public function __construct($namespace = '', $defaultLifetime = 0, $directory = null)
+    {
+        parent::__construct('', $defaultLifetime);
+        $this->init($namespace, $directory);
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Adapter/MemcachedAdapter.php b/advancedcontentfilter/vendor/symfony/cache/Adapter/MemcachedAdapter.php
new file mode 100644 (file)
index 0000000..5637141
--- /dev/null
@@ -0,0 +1,36 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Adapter;
+
+use Symfony\Component\Cache\Traits\MemcachedTrait;
+
+class MemcachedAdapter extends AbstractAdapter
+{
+    use MemcachedTrait;
+
+    protected $maxIdLength = 250;
+
+    /**
+     * Using a MemcachedAdapter with a TagAwareAdapter for storing tags is discouraged.
+     * Using a RedisAdapter is recommended instead. If you cannot do otherwise, be aware that:
+     * - the Memcached::OPT_BINARY_PROTOCOL must be enabled
+     *   (that's the default when using MemcachedAdapter::createConnection());
+     * - tags eviction by Memcached's LRU algorithm will break by-tags invalidation;
+     *   your Memcached memory should be large enough to never trigger LRU.
+     *
+     * Using a MemcachedAdapter as a pure items store is fine.
+     */
+    public function __construct(\Memcached $client, $namespace = '', $defaultLifetime = 0)
+    {
+        $this->init($client, $namespace, $defaultLifetime);
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Adapter/NullAdapter.php b/advancedcontentfilter/vendor/symfony/cache/Adapter/NullAdapter.php
new file mode 100644 (file)
index 0000000..f58f81e
--- /dev/null
@@ -0,0 +1,121 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Adapter;
+
+use Psr\Cache\CacheItemInterface;
+use Symfony\Component\Cache\CacheItem;
+
+/**
+ * @author Titouan Galopin <galopintitouan@gmail.com>
+ */
+class NullAdapter implements AdapterInterface
+{
+    private $createCacheItem;
+
+    public function __construct()
+    {
+        $this->createCacheItem = \Closure::bind(
+            function ($key) {
+                $item = new CacheItem();
+                $item->key = $key;
+                $item->isHit = false;
+
+                return $item;
+            },
+            $this,
+            CacheItem::class
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getItem($key)
+    {
+        $f = $this->createCacheItem;
+
+        return $f($key);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getItems(array $keys = array())
+    {
+        return $this->generateItems($keys);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function hasItem($key)
+    {
+        return false;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function clear()
+    {
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function deleteItem($key)
+    {
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function deleteItems(array $keys)
+    {
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function save(CacheItemInterface $item)
+    {
+        return false;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function saveDeferred(CacheItemInterface $item)
+    {
+        return false;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function commit()
+    {
+        return false;
+    }
+
+    private function generateItems(array $keys)
+    {
+        $f = $this->createCacheItem;
+
+        foreach ($keys as $key) {
+            yield $key => $f($key);
+        }
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Adapter/PdoAdapter.php b/advancedcontentfilter/vendor/symfony/cache/Adapter/PdoAdapter.php
new file mode 100644 (file)
index 0000000..c3fc45b
--- /dev/null
@@ -0,0 +1,53 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Adapter;
+
+use Doctrine\DBAL\Connection;
+use Symfony\Component\Cache\Exception\InvalidArgumentException;
+use Symfony\Component\Cache\PruneableInterface;
+use Symfony\Component\Cache\Traits\PdoTrait;
+
+class PdoAdapter extends AbstractAdapter implements PruneableInterface
+{
+    use PdoTrait;
+
+    protected $maxIdLength = 255;
+
+    /**
+     * You can either pass an existing database connection as PDO instance or
+     * a Doctrine DBAL Connection or a DSN string that will be used to
+     * lazy-connect to the database when the cache is actually used.
+     *
+     * List of available options:
+     *  * db_table: The name of the table [default: cache_items]
+     *  * db_id_col: The column where to store the cache id [default: item_id]
+     *  * db_data_col: The column where to store the cache data [default: item_data]
+     *  * db_lifetime_col: The column where to store the lifetime [default: item_lifetime]
+     *  * db_time_col: The column where to store the timestamp [default: item_time]
+     *  * db_username: The username when lazy-connect [default: '']
+     *  * db_password: The password when lazy-connect [default: '']
+     *  * db_connection_options: An array of driver-specific connection options [default: array()]
+     *
+     * @param \PDO|Connection|string $connOrDsn       A \PDO or Connection instance or DSN string or null
+     * @param string                 $namespace
+     * @param int                    $defaultLifetime
+     * @param array                  $options         An associative array of options
+     *
+     * @throws InvalidArgumentException When first argument is not PDO nor Connection nor string
+     * @throws InvalidArgumentException When PDO error mode is not PDO::ERRMODE_EXCEPTION
+     * @throws InvalidArgumentException When namespace contains invalid characters
+     */
+    public function __construct($connOrDsn, $namespace = '', $defaultLifetime = 0, array $options = array())
+    {
+        $this->init($connOrDsn, $namespace, $defaultLifetime, $options);
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Adapter/PhpArrayAdapter.php b/advancedcontentfilter/vendor/symfony/cache/Adapter/PhpArrayAdapter.php
new file mode 100644 (file)
index 0000000..d3b9d77
--- /dev/null
@@ -0,0 +1,303 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Adapter;
+
+use Psr\Cache\CacheItemInterface;
+use Psr\Cache\CacheItemPoolInterface;
+use Symfony\Component\Cache\CacheItem;
+use Symfony\Component\Cache\Exception\InvalidArgumentException;
+use Symfony\Component\Cache\PruneableInterface;
+use Symfony\Component\Cache\ResettableInterface;
+use Symfony\Component\Cache\Traits\PhpArrayTrait;
+
+/**
+ * Caches items at warm up time using a PHP array that is stored in shared memory by OPCache since PHP 7.0.
+ * Warmed up items are read-only and run-time discovered items are cached using a fallback adapter.
+ *
+ * @author Titouan Galopin <galopintitouan@gmail.com>
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class PhpArrayAdapter implements AdapterInterface, PruneableInterface, ResettableInterface
+{
+    use PhpArrayTrait;
+
+    private $createCacheItem;
+
+    /**
+     * @param string           $file         The PHP file were values are cached
+     * @param AdapterInterface $fallbackPool A pool to fallback on when an item is not hit
+     */
+    public function __construct($file, AdapterInterface $fallbackPool)
+    {
+        $this->file = $file;
+        $this->pool = $fallbackPool;
+        $this->zendDetectUnicode = ini_get('zend.detect_unicode');
+        $this->createCacheItem = \Closure::bind(
+            function ($key, $value, $isHit) {
+                $item = new CacheItem();
+                $item->key = $key;
+                $item->value = $value;
+                $item->isHit = $isHit;
+
+                return $item;
+            },
+            null,
+            CacheItem::class
+        );
+    }
+
+    /**
+     * This adapter should only be used on PHP 7.0+ to take advantage of how PHP
+     * stores arrays in its latest versions. This factory method decorates the given
+     * fallback pool with this adapter only if the current PHP version is supported.
+     *
+     * @param string                 $file         The PHP file were values are cached
+     * @param CacheItemPoolInterface $fallbackPool Fallback for old PHP versions or opcache disabled
+     *
+     * @return CacheItemPoolInterface
+     */
+    public static function create($file, CacheItemPoolInterface $fallbackPool)
+    {
+        // Shared memory is available in PHP 7.0+ with OPCache enabled and in HHVM
+        if ((\PHP_VERSION_ID >= 70000 && ini_get('opcache.enable')) || defined('HHVM_VERSION')) {
+            if (!$fallbackPool instanceof AdapterInterface) {
+                $fallbackPool = new ProxyAdapter($fallbackPool);
+            }
+
+            return new static($file, $fallbackPool);
+        }
+
+        return $fallbackPool;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getItem($key)
+    {
+        if (!is_string($key)) {
+            throw new InvalidArgumentException(sprintf('Cache key must be string, "%s" given.', is_object($key) ? get_class($key) : gettype($key)));
+        }
+        if (null === $this->values) {
+            $this->initialize();
+        }
+        if (!isset($this->values[$key])) {
+            return $this->pool->getItem($key);
+        }
+
+        $value = $this->values[$key];
+        $isHit = true;
+
+        if ('N;' === $value) {
+            $value = null;
+        } elseif (is_string($value) && isset($value[2]) && ':' === $value[1]) {
+            try {
+                $e = null;
+                $value = unserialize($value);
+            } catch (\Error $e) {
+            } catch (\Exception $e) {
+            }
+            if (null !== $e) {
+                $value = null;
+                $isHit = false;
+            }
+        }
+
+        $f = $this->createCacheItem;
+
+        return $f($key, $value, $isHit);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getItems(array $keys = array())
+    {
+        foreach ($keys as $key) {
+            if (!is_string($key)) {
+                throw new InvalidArgumentException(sprintf('Cache key must be string, "%s" given.', is_object($key) ? get_class($key) : gettype($key)));
+            }
+        }
+        if (null === $this->values) {
+            $this->initialize();
+        }
+
+        return $this->generateItems($keys);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function hasItem($key)
+    {
+        if (!is_string($key)) {
+            throw new InvalidArgumentException(sprintf('Cache key must be string, "%s" given.', is_object($key) ? get_class($key) : gettype($key)));
+        }
+        if (null === $this->values) {
+            $this->initialize();
+        }
+
+        return isset($this->values[$key]) || $this->pool->hasItem($key);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function deleteItem($key)
+    {
+        if (!is_string($key)) {
+            throw new InvalidArgumentException(sprintf('Cache key must be string, "%s" given.', is_object($key) ? get_class($key) : gettype($key)));
+        }
+        if (null === $this->values) {
+            $this->initialize();
+        }
+
+        return !isset($this->values[$key]) && $this->pool->deleteItem($key);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function deleteItems(array $keys)
+    {
+        $deleted = true;
+        $fallbackKeys = array();
+
+        foreach ($keys as $key) {
+            if (!is_string($key)) {
+                throw new InvalidArgumentException(sprintf('Cache key must be string, "%s" given.', is_object($key) ? get_class($key) : gettype($key)));
+            }
+
+            if (isset($this->values[$key])) {
+                $deleted = false;
+            } else {
+                $fallbackKeys[] = $key;
+            }
+        }
+        if (null === $this->values) {
+            $this->initialize();
+        }
+
+        if ($fallbackKeys) {
+            $deleted = $this->pool->deleteItems($fallbackKeys) && $deleted;
+        }
+
+        return $deleted;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function save(CacheItemInterface $item)
+    {
+        if (null === $this->values) {
+            $this->initialize();
+        }
+
+        return !isset($this->values[$item->getKey()]) && $this->pool->save($item);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function saveDeferred(CacheItemInterface $item)
+    {
+        if (null === $this->values) {
+            $this->initialize();
+        }
+
+        return !isset($this->values[$item->getKey()]) && $this->pool->saveDeferred($item);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function commit()
+    {
+        return $this->pool->commit();
+    }
+
+    /**
+     * @return \Generator
+     */
+    private function generateItems(array $keys)
+    {
+        $f = $this->createCacheItem;
+        $fallbackKeys = array();
+
+        foreach ($keys as $key) {
+            if (isset($this->values[$key])) {
+                $value = $this->values[$key];
+
+                if ('N;' === $value) {
+                    yield $key => $f($key, null, true);
+                } elseif (is_string($value) && isset($value[2]) && ':' === $value[1]) {
+                    try {
+                        yield $key => $f($key, unserialize($value), true);
+                    } catch (\Error $e) {
+                        yield $key => $f($key, null, false);
+                    } catch (\Exception $e) {
+                        yield $key => $f($key, null, false);
+                    }
+                } else {
+                    yield $key => $f($key, $value, true);
+                }
+            } else {
+                $fallbackKeys[] = $key;
+            }
+        }
+
+        if ($fallbackKeys) {
+            foreach ($this->pool->getItems($fallbackKeys) as $key => $item) {
+                yield $key => $item;
+            }
+        }
+    }
+
+    /**
+     * @throws \ReflectionException When $class is not found and is required
+     *
+     * @internal
+     */
+    public static function throwOnRequiredClass($class)
+    {
+        $e = new \ReflectionException("Class $class does not exist");
+        $trace = $e->getTrace();
+        $autoloadFrame = array(
+            'function' => 'spl_autoload_call',
+            'args' => array($class),
+        );
+        $i = 1 + array_search($autoloadFrame, $trace, true);
+
+        if (isset($trace[$i]['function']) && !isset($trace[$i]['class'])) {
+            switch ($trace[$i]['function']) {
+                case 'get_class_methods':
+                case 'get_class_vars':
+                case 'get_parent_class':
+                case 'is_a':
+                case 'is_subclass_of':
+                case 'class_exists':
+                case 'class_implements':
+                case 'class_parents':
+                case 'trait_exists':
+                case 'defined':
+                case 'interface_exists':
+                case 'method_exists':
+                case 'property_exists':
+                case 'is_callable':
+                    return;
+            }
+        }
+
+        throw $e;
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Adapter/PhpFilesAdapter.php b/advancedcontentfilter/vendor/symfony/cache/Adapter/PhpFilesAdapter.php
new file mode 100644 (file)
index 0000000..528d9c0
--- /dev/null
@@ -0,0 +1,41 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Adapter;
+
+use Symfony\Component\Cache\Exception\CacheException;
+use Symfony\Component\Cache\PruneableInterface;
+use Symfony\Component\Cache\Traits\PhpFilesTrait;
+
+class PhpFilesAdapter extends AbstractAdapter implements PruneableInterface
+{
+    use PhpFilesTrait;
+
+    /**
+     * @param string      $namespace
+     * @param int         $defaultLifetime
+     * @param string|null $directory
+     *
+     * @throws CacheException if OPcache is not enabled
+     */
+    public function __construct($namespace = '', $defaultLifetime = 0, $directory = null)
+    {
+        if (!static::isSupported()) {
+            throw new CacheException('OPcache is not enabled');
+        }
+        parent::__construct('', $defaultLifetime);
+        $this->init($namespace, $directory);
+
+        $e = new \Exception();
+        $this->includeHandler = function () use ($e) { throw $e; };
+        $this->zendDetectUnicode = ini_get('zend.detect_unicode');
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Adapter/ProxyAdapter.php b/advancedcontentfilter/vendor/symfony/cache/Adapter/ProxyAdapter.php
new file mode 100644 (file)
index 0000000..82c95c5
--- /dev/null
@@ -0,0 +1,185 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Adapter;
+
+use Psr\Cache\CacheItemInterface;
+use Psr\Cache\CacheItemPoolInterface;
+use Symfony\Component\Cache\CacheItem;
+use Symfony\Component\Cache\PruneableInterface;
+use Symfony\Component\Cache\ResettableInterface;
+use Symfony\Component\Cache\Traits\ProxyTrait;
+
+/**
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class ProxyAdapter implements AdapterInterface, PruneableInterface, ResettableInterface
+{
+    use ProxyTrait;
+
+    private $namespace;
+    private $namespaceLen;
+    private $createCacheItem;
+    private $poolHash;
+
+    /**
+     * @param CacheItemPoolInterface $pool
+     * @param string                 $namespace
+     * @param int                    $defaultLifetime
+     */
+    public function __construct(CacheItemPoolInterface $pool, $namespace = '', $defaultLifetime = 0)
+    {
+        $this->pool = $pool;
+        $this->poolHash = $poolHash = spl_object_hash($pool);
+        $this->namespace = '' === $namespace ? '' : CacheItem::validateKey($namespace);
+        $this->namespaceLen = strlen($namespace);
+        $this->createCacheItem = \Closure::bind(
+            function ($key, $innerItem) use ($defaultLifetime, $poolHash) {
+                $item = new CacheItem();
+                $item->key = $key;
+                $item->value = $innerItem->get();
+                $item->isHit = $innerItem->isHit();
+                $item->defaultLifetime = $defaultLifetime;
+                $item->innerItem = $innerItem;
+                $item->poolHash = $poolHash;
+                $innerItem->set(null);
+
+                return $item;
+            },
+            null,
+            CacheItem::class
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getItem($key)
+    {
+        $f = $this->createCacheItem;
+        $item = $this->pool->getItem($this->getId($key));
+
+        return $f($key, $item);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getItems(array $keys = array())
+    {
+        if ($this->namespaceLen) {
+            foreach ($keys as $i => $key) {
+                $keys[$i] = $this->getId($key);
+            }
+        }
+
+        return $this->generateItems($this->pool->getItems($keys));
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function hasItem($key)
+    {
+        return $this->pool->hasItem($this->getId($key));
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function clear()
+    {
+        return $this->pool->clear();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function deleteItem($key)
+    {
+        return $this->pool->deleteItem($this->getId($key));
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function deleteItems(array $keys)
+    {
+        if ($this->namespaceLen) {
+            foreach ($keys as $i => $key) {
+                $keys[$i] = $this->getId($key);
+            }
+        }
+
+        return $this->pool->deleteItems($keys);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function save(CacheItemInterface $item)
+    {
+        return $this->doSave($item, __FUNCTION__);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function saveDeferred(CacheItemInterface $item)
+    {
+        return $this->doSave($item, __FUNCTION__);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function commit()
+    {
+        return $this->pool->commit();
+    }
+
+    private function doSave(CacheItemInterface $item, $method)
+    {
+        if (!$item instanceof CacheItem) {
+            return false;
+        }
+        $item = (array) $item;
+        $expiry = $item["\0*\0expiry"];
+        if (null === $expiry && 0 < $item["\0*\0defaultLifetime"]) {
+            $expiry = time() + $item["\0*\0defaultLifetime"];
+        }
+        $innerItem = $item["\0*\0poolHash"] === $this->poolHash ? $item["\0*\0innerItem"] : $this->pool->getItem($this->namespace.$item["\0*\0key"]);
+        $innerItem->set($item["\0*\0value"]);
+        $innerItem->expiresAt(null !== $expiry ? \DateTime::createFromFormat('U', $expiry) : null);
+
+        return $this->pool->$method($innerItem);
+    }
+
+    private function generateItems($items)
+    {
+        $f = $this->createCacheItem;
+
+        foreach ($items as $key => $item) {
+            if ($this->namespaceLen) {
+                $key = substr($key, $this->namespaceLen);
+            }
+
+            yield $key => $f($key, $item);
+        }
+    }
+
+    private function getId($key)
+    {
+        CacheItem::validateKey($key);
+
+        return $this->namespace.$key;
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Adapter/RedisAdapter.php b/advancedcontentfilter/vendor/symfony/cache/Adapter/RedisAdapter.php
new file mode 100644 (file)
index 0000000..c1e1799
--- /dev/null
@@ -0,0 +1,29 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Adapter;
+
+use Symfony\Component\Cache\Traits\RedisTrait;
+
+class RedisAdapter extends AbstractAdapter
+{
+    use RedisTrait;
+
+    /**
+     * @param \Redis|\RedisArray|\RedisCluster|\Predis\Client $redisClient     The redis client
+     * @param string                                          $namespace       The default namespace
+     * @param int                                             $defaultLifetime The default lifetime
+     */
+    public function __construct($redisClient, $namespace = '', $defaultLifetime = 0)
+    {
+        $this->init($redisClient, $namespace, $defaultLifetime);
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Adapter/SimpleCacheAdapter.php b/advancedcontentfilter/vendor/symfony/cache/Adapter/SimpleCacheAdapter.php
new file mode 100644 (file)
index 0000000..24db5d5
--- /dev/null
@@ -0,0 +1,79 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Adapter;
+
+use Psr\SimpleCache\CacheInterface;
+use Symfony\Component\Cache\PruneableInterface;
+use Symfony\Component\Cache\ResettableInterface;
+use Symfony\Component\Cache\Traits\ProxyTrait;
+
+/**
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class SimpleCacheAdapter extends AbstractAdapter implements PruneableInterface, ResettableInterface
+{
+    use ProxyTrait;
+
+    private $miss;
+
+    public function __construct(CacheInterface $pool, $namespace = '', $defaultLifetime = 0)
+    {
+        parent::__construct($namespace, $defaultLifetime);
+
+        $this->pool = $pool;
+        $this->miss = new \stdClass();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doFetch(array $ids)
+    {
+        foreach ($this->pool->getMultiple($ids, $this->miss) as $key => $value) {
+            if ($this->miss !== $value) {
+                yield $key => $value;
+            }
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doHave($id)
+    {
+        return $this->pool->has($id);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doClear($namespace)
+    {
+        return $this->pool->clear();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doDelete(array $ids)
+    {
+        return $this->pool->deleteMultiple($ids);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doSave(array $values, $lifetime)
+    {
+        return $this->pool->setMultiple($values, 0 === $lifetime ? null : $lifetime);
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Adapter/TagAwareAdapter.php b/advancedcontentfilter/vendor/symfony/cache/Adapter/TagAwareAdapter.php
new file mode 100644 (file)
index 0000000..72bbc14
--- /dev/null
@@ -0,0 +1,334 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Adapter;
+
+use Psr\Cache\CacheItemInterface;
+use Psr\Cache\InvalidArgumentException;
+use Symfony\Component\Cache\CacheItem;
+use Symfony\Component\Cache\PruneableInterface;
+use Symfony\Component\Cache\ResettableInterface;
+use Symfony\Component\Cache\Traits\ProxyTrait;
+
+/**
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class TagAwareAdapter implements TagAwareAdapterInterface, PruneableInterface, ResettableInterface
+{
+    const TAGS_PREFIX = "\0tags\0";
+
+    use ProxyTrait;
+
+    private $deferred = array();
+    private $createCacheItem;
+    private $setCacheItemTags;
+    private $getTagsByKey;
+    private $invalidateTags;
+    private $tags;
+
+    public function __construct(AdapterInterface $itemsPool, AdapterInterface $tagsPool = null)
+    {
+        $this->pool = $itemsPool;
+        $this->tags = $tagsPool ?: $itemsPool;
+        $this->createCacheItem = \Closure::bind(
+            function ($key, $value, CacheItem $protoItem) {
+                $item = new CacheItem();
+                $item->key = $key;
+                $item->value = $value;
+                $item->defaultLifetime = $protoItem->defaultLifetime;
+                $item->expiry = $protoItem->expiry;
+                $item->innerItem = $protoItem->innerItem;
+                $item->poolHash = $protoItem->poolHash;
+
+                return $item;
+            },
+            null,
+            CacheItem::class
+        );
+        $this->setCacheItemTags = \Closure::bind(
+            function (CacheItem $item, $key, array &$itemTags) {
+                if (!$item->isHit) {
+                    return $item;
+                }
+                if (isset($itemTags[$key])) {
+                    foreach ($itemTags[$key] as $tag => $version) {
+                        $item->prevTags[$tag] = $tag;
+                    }
+                    unset($itemTags[$key]);
+                } else {
+                    $item->value = null;
+                    $item->isHit = false;
+                }
+
+                return $item;
+            },
+            null,
+            CacheItem::class
+        );
+        $this->getTagsByKey = \Closure::bind(
+            function ($deferred) {
+                $tagsByKey = array();
+                foreach ($deferred as $key => $item) {
+                    $tagsByKey[$key] = $item->tags;
+                }
+
+                return $tagsByKey;
+            },
+            null,
+            CacheItem::class
+        );
+        $this->invalidateTags = \Closure::bind(
+            function (AdapterInterface $tagsAdapter, array $tags) {
+                foreach ($tagsAdapter->getItems($tags) as $v) {
+                    $v->set(1 + (int) $v->get());
+                    $v->defaultLifetime = 0;
+                    $v->expiry = null;
+                    $tagsAdapter->saveDeferred($v);
+                }
+
+                return $tagsAdapter->commit();
+            },
+            null,
+            CacheItem::class
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function invalidateTags(array $tags)
+    {
+        foreach ($tags as $k => $tag) {
+            if ('' !== $tag && is_string($tag)) {
+                $tags[$k] = $tag.static::TAGS_PREFIX;
+            }
+        }
+        $f = $this->invalidateTags;
+
+        return $f($this->tags, $tags);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function hasItem($key)
+    {
+        if ($this->deferred) {
+            $this->commit();
+        }
+        if (!$this->pool->hasItem($key)) {
+            return false;
+        }
+        if (!$itemTags = $this->pool->getItem(static::TAGS_PREFIX.$key)->get()) {
+            return true;
+        }
+
+        foreach ($this->getTagVersions(array($itemTags)) as $tag => $version) {
+            if ($itemTags[$tag] !== $version) {
+                return false;
+            }
+        }
+
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getItem($key)
+    {
+        foreach ($this->getItems(array($key)) as $item) {
+            return $item;
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getItems(array $keys = array())
+    {
+        if ($this->deferred) {
+            $this->commit();
+        }
+        $tagKeys = array();
+
+        foreach ($keys as $key) {
+            if ('' !== $key && is_string($key)) {
+                $key = static::TAGS_PREFIX.$key;
+                $tagKeys[$key] = $key;
+            }
+        }
+
+        try {
+            $items = $this->pool->getItems($tagKeys + $keys);
+        } catch (InvalidArgumentException $e) {
+            $this->pool->getItems($keys); // Should throw an exception
+
+            throw $e;
+        }
+
+        return $this->generateItems($items, $tagKeys);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function clear()
+    {
+        $this->deferred = array();
+
+        return $this->pool->clear();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function deleteItem($key)
+    {
+        return $this->deleteItems(array($key));
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function deleteItems(array $keys)
+    {
+        foreach ($keys as $key) {
+            if ('' !== $key && is_string($key)) {
+                $keys[] = static::TAGS_PREFIX.$key;
+            }
+        }
+
+        return $this->pool->deleteItems($keys);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function save(CacheItemInterface $item)
+    {
+        if (!$item instanceof CacheItem) {
+            return false;
+        }
+        $this->deferred[$item->getKey()] = $item;
+
+        return $this->commit();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function saveDeferred(CacheItemInterface $item)
+    {
+        if (!$item instanceof CacheItem) {
+            return false;
+        }
+        $this->deferred[$item->getKey()] = $item;
+
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function commit()
+    {
+        $ok = true;
+
+        if ($this->deferred) {
+            $items = $this->deferred;
+            foreach ($items as $key => $item) {
+                if (!$this->pool->saveDeferred($item)) {
+                    unset($this->deferred[$key]);
+                    $ok = false;
+                }
+            }
+
+            $f = $this->getTagsByKey;
+            $tagsByKey = $f($items);
+            $this->deferred = array();
+            $tagVersions = $this->getTagVersions($tagsByKey);
+            $f = $this->createCacheItem;
+
+            foreach ($tagsByKey as $key => $tags) {
+                $this->pool->saveDeferred($f(static::TAGS_PREFIX.$key, array_intersect_key($tagVersions, $tags), $items[$key]));
+            }
+        }
+
+        return $this->pool->commit() && $ok;
+    }
+
+    public function __destruct()
+    {
+        $this->commit();
+    }
+
+    private function generateItems($items, array $tagKeys)
+    {
+        $bufferedItems = $itemTags = array();
+        $f = $this->setCacheItemTags;
+
+        foreach ($items as $key => $item) {
+            if (!$tagKeys) {
+                yield $key => $f($item, static::TAGS_PREFIX.$key, $itemTags);
+                continue;
+            }
+            if (!isset($tagKeys[$key])) {
+                $bufferedItems[$key] = $item;
+                continue;
+            }
+
+            unset($tagKeys[$key]);
+            $itemTags[$key] = $item->get() ?: array();
+
+            if (!$tagKeys) {
+                $tagVersions = $this->getTagVersions($itemTags);
+
+                foreach ($itemTags as $key => $tags) {
+                    foreach ($tags as $tag => $version) {
+                        if ($tagVersions[$tag] !== $version) {
+                            unset($itemTags[$key]);
+                            continue 2;
+                        }
+                    }
+                }
+                $tagVersions = $tagKeys = null;
+
+                foreach ($bufferedItems as $key => $item) {
+                    yield $key => $f($item, static::TAGS_PREFIX.$key, $itemTags);
+                }
+                $bufferedItems = null;
+            }
+        }
+    }
+
+    private function getTagVersions(array $tagsByKey)
+    {
+        $tagVersions = array();
+
+        foreach ($tagsByKey as $tags) {
+            $tagVersions += $tags;
+        }
+
+        if ($tagVersions) {
+            $tags = array();
+            foreach ($tagVersions as $tag => $version) {
+                $tagVersions[$tag] = $tag.static::TAGS_PREFIX;
+                $tags[$tag.static::TAGS_PREFIX] = $tag;
+            }
+            foreach ($this->tags->getItems($tagVersions) as $tag => $version) {
+                $tagVersions[$tags[$tag]] = $version->get() ?: 0;
+            }
+        }
+
+        return $tagVersions;
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Adapter/TagAwareAdapterInterface.php b/advancedcontentfilter/vendor/symfony/cache/Adapter/TagAwareAdapterInterface.php
new file mode 100644 (file)
index 0000000..340048c
--- /dev/null
@@ -0,0 +1,33 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Adapter;
+
+use Psr\Cache\InvalidArgumentException;
+
+/**
+ * Interface for invalidating cached items using tags.
+ *
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+interface TagAwareAdapterInterface extends AdapterInterface
+{
+    /**
+     * Invalidates cached items using tags.
+     *
+     * @param string[] $tags An array of tags to invalidate
+     *
+     * @return bool True on success
+     *
+     * @throws InvalidArgumentException When $tags is not valid
+     */
+    public function invalidateTags(array $tags);
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Adapter/TraceableAdapter.php b/advancedcontentfilter/vendor/symfony/cache/Adapter/TraceableAdapter.php
new file mode 100644 (file)
index 0000000..98d0e52
--- /dev/null
@@ -0,0 +1,233 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Adapter;
+
+use Psr\Cache\CacheItemInterface;
+use Symfony\Component\Cache\PruneableInterface;
+use Symfony\Component\Cache\ResettableInterface;
+
+/**
+ * An adapter that collects data about all cache calls.
+ *
+ * @author Aaron Scherer <aequasi@gmail.com>
+ * @author Tobias Nyholm <tobias.nyholm@gmail.com>
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class TraceableAdapter implements AdapterInterface, PruneableInterface, ResettableInterface
+{
+    protected $pool;
+    private $calls = array();
+
+    public function __construct(AdapterInterface $pool)
+    {
+        $this->pool = $pool;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getItem($key)
+    {
+        $event = $this->start(__FUNCTION__);
+        try {
+            $item = $this->pool->getItem($key);
+        } finally {
+            $event->end = microtime(true);
+        }
+        if ($event->result[$key] = $item->isHit()) {
+            ++$event->hits;
+        } else {
+            ++$event->misses;
+        }
+
+        return $item;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function hasItem($key)
+    {
+        $event = $this->start(__FUNCTION__);
+        try {
+            return $event->result[$key] = $this->pool->hasItem($key);
+        } finally {
+            $event->end = microtime(true);
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function deleteItem($key)
+    {
+        $event = $this->start(__FUNCTION__);
+        try {
+            return $event->result[$key] = $this->pool->deleteItem($key);
+        } finally {
+            $event->end = microtime(true);
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function save(CacheItemInterface $item)
+    {
+        $event = $this->start(__FUNCTION__);
+        try {
+            return $event->result[$item->getKey()] = $this->pool->save($item);
+        } finally {
+            $event->end = microtime(true);
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function saveDeferred(CacheItemInterface $item)
+    {
+        $event = $this->start(__FUNCTION__);
+        try {
+            return $event->result[$item->getKey()] = $this->pool->saveDeferred($item);
+        } finally {
+            $event->end = microtime(true);
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getItems(array $keys = array())
+    {
+        $event = $this->start(__FUNCTION__);
+        try {
+            $result = $this->pool->getItems($keys);
+        } finally {
+            $event->end = microtime(true);
+        }
+        $f = function () use ($result, $event) {
+            $event->result = array();
+            foreach ($result as $key => $item) {
+                if ($event->result[$key] = $item->isHit()) {
+                    ++$event->hits;
+                } else {
+                    ++$event->misses;
+                }
+                yield $key => $item;
+            }
+        };
+
+        return $f();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function clear()
+    {
+        $event = $this->start(__FUNCTION__);
+        try {
+            return $event->result = $this->pool->clear();
+        } finally {
+            $event->end = microtime(true);
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function deleteItems(array $keys)
+    {
+        $event = $this->start(__FUNCTION__);
+        $event->result['keys'] = $keys;
+        try {
+            return $event->result['result'] = $this->pool->deleteItems($keys);
+        } finally {
+            $event->end = microtime(true);
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function commit()
+    {
+        $event = $this->start(__FUNCTION__);
+        try {
+            return $event->result = $this->pool->commit();
+        } finally {
+            $event->end = microtime(true);
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function prune()
+    {
+        if (!$this->pool instanceof PruneableInterface) {
+            return false;
+        }
+        $event = $this->start(__FUNCTION__);
+        try {
+            return $event->result = $this->pool->prune();
+        } finally {
+            $event->end = microtime(true);
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function reset()
+    {
+        if (!$this->pool instanceof ResettableInterface) {
+            return;
+        }
+        $event = $this->start(__FUNCTION__);
+        try {
+            $this->pool->reset();
+        } finally {
+            $event->end = microtime(true);
+        }
+    }
+
+    public function getCalls()
+    {
+        return $this->calls;
+    }
+
+    public function clearCalls()
+    {
+        $this->calls = array();
+    }
+
+    protected function start($name)
+    {
+        $this->calls[] = $event = new TraceableAdapterEvent();
+        $event->name = $name;
+        $event->start = microtime(true);
+
+        return $event;
+    }
+}
+
+class TraceableAdapterEvent
+{
+    public $name;
+    public $start;
+    public $end;
+    public $result;
+    public $hits = 0;
+    public $misses = 0;
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Adapter/TraceableTagAwareAdapter.php b/advancedcontentfilter/vendor/symfony/cache/Adapter/TraceableTagAwareAdapter.php
new file mode 100644 (file)
index 0000000..de68955
--- /dev/null
@@ -0,0 +1,36 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Adapter;
+
+/**
+ * @author Robin Chalas <robin.chalas@gmail.com>
+ */
+class TraceableTagAwareAdapter extends TraceableAdapter implements TagAwareAdapterInterface
+{
+    public function __construct(TagAwareAdapterInterface $pool)
+    {
+        parent::__construct($pool);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function invalidateTags(array $tags)
+    {
+        $event = $this->start(__FUNCTION__);
+        try {
+            return $event->result = $this->pool->invalidateTags($tags);
+        } finally {
+            $event->end = microtime(true);
+        }
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/CHANGELOG.md b/advancedcontentfilter/vendor/symfony/cache/CHANGELOG.md
new file mode 100644 (file)
index 0000000..11c1b93
--- /dev/null
@@ -0,0 +1,36 @@
+CHANGELOG
+=========
+
+3.4.0
+-----
+
+ * added using options from Memcached DSN
+ * added PruneableInterface so PSR-6 or PSR-16 cache implementations can declare support for manual stale cache pruning
+ * added prune logic to FilesystemTrait, PhpFilesTrait, PdoTrait, TagAwareAdapter and ChainTrait
+ * now FilesystemAdapter, PhpFilesAdapter, FilesystemCache, PhpFilesCache, PdoAdapter, PdoCache, ChainAdapter, and
+   ChainCache implement PruneableInterface and support manual stale cache pruning
+
+3.3.0
+-----
+
+ * [EXPERIMENTAL] added CacheItem::getPreviousTags() to get bound tags coming from the pool storage if any
+ * added PSR-16 "Simple Cache" implementations for all existing PSR-6 adapters
+ * added Psr6Cache and SimpleCacheAdapter for bidirectional interoperability between PSR-6 and PSR-16
+ * added MemcachedAdapter (PSR-6) and MemcachedCache (PSR-16)
+ * added TraceableAdapter (PSR-6) and TraceableCache (PSR-16)
+
+3.2.0
+-----
+
+ * added TagAwareAdapter for tags-based invalidation
+ * added PdoAdapter with PDO and Doctrine DBAL support
+ * added PhpArrayAdapter and PhpFilesAdapter for OPcache-backed shared memory storage (PHP 7+ only)
+ * added NullAdapter
+
+3.1.0
+-----
+
+ * added the component with strict PSR-6 implementations
+ * added ApcuAdapter, ArrayAdapter, FilesystemAdapter and RedisAdapter
+ * added AbstractAdapter, ChainAdapter and ProxyAdapter
+ * added DoctrineAdapter and DoctrineProvider for bidirectional interoperability with Doctrine Cache
diff --git a/advancedcontentfilter/vendor/symfony/cache/CacheItem.php b/advancedcontentfilter/vendor/symfony/cache/CacheItem.php
new file mode 100644 (file)
index 0000000..93ffea4
--- /dev/null
@@ -0,0 +1,187 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache;
+
+use Psr\Cache\CacheItemInterface;
+use Psr\Log\LoggerInterface;
+use Symfony\Component\Cache\Exception\InvalidArgumentException;
+
+/**
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+final class CacheItem implements CacheItemInterface
+{
+    protected $key;
+    protected $value;
+    protected $isHit = false;
+    protected $expiry;
+    protected $defaultLifetime;
+    protected $tags = array();
+    protected $prevTags = array();
+    protected $innerItem;
+    protected $poolHash;
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getKey()
+    {
+        return $this->key;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function get()
+    {
+        return $this->value;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function isHit()
+    {
+        return $this->isHit;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function set($value)
+    {
+        $this->value = $value;
+
+        return $this;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function expiresAt($expiration)
+    {
+        if (null === $expiration) {
+            $this->expiry = $this->defaultLifetime > 0 ? time() + $this->defaultLifetime : null;
+        } elseif ($expiration instanceof \DateTimeInterface) {
+            $this->expiry = (int) $expiration->format('U');
+        } else {
+            throw new InvalidArgumentException(sprintf('Expiration date must implement DateTimeInterface or be null, "%s" given', is_object($expiration) ? get_class($expiration) : gettype($expiration)));
+        }
+
+        return $this;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function expiresAfter($time)
+    {
+        if (null === $time) {
+            $this->expiry = $this->defaultLifetime > 0 ? time() + $this->defaultLifetime : null;
+        } elseif ($time instanceof \DateInterval) {
+            $this->expiry = (int) \DateTime::createFromFormat('U', time())->add($time)->format('U');
+        } elseif (is_int($time)) {
+            $this->expiry = $time + time();
+        } else {
+            throw new InvalidArgumentException(sprintf('Expiration date must be an integer, a DateInterval or null, "%s" given', is_object($time) ? get_class($time) : gettype($time)));
+        }
+
+        return $this;
+    }
+
+    /**
+     * Adds a tag to a cache item.
+     *
+     * @param string|string[] $tags A tag or array of tags
+     *
+     * @return static
+     *
+     * @throws InvalidArgumentException When $tag is not valid
+     */
+    public function tag($tags)
+    {
+        if (!is_array($tags)) {
+            $tags = array($tags);
+        }
+        foreach ($tags as $tag) {
+            if (!is_string($tag)) {
+                throw new InvalidArgumentException(sprintf('Cache tag must be string, "%s" given', is_object($tag) ? get_class($tag) : gettype($tag)));
+            }
+            if (isset($this->tags[$tag])) {
+                continue;
+            }
+            if (!isset($tag[0])) {
+                throw new InvalidArgumentException('Cache tag length must be greater than zero');
+            }
+            if (false !== strpbrk($tag, '{}()/\@:')) {
+                throw new InvalidArgumentException(sprintf('Cache tag "%s" contains reserved characters {}()/\@:', $tag));
+            }
+            $this->tags[$tag] = $tag;
+        }
+
+        return $this;
+    }
+
+    /**
+     * Returns the list of tags bound to the value coming from the pool storage if any.
+     *
+     * @return array
+     */
+    public function getPreviousTags()
+    {
+        return $this->prevTags;
+    }
+
+    /**
+     * Validates a cache key according to PSR-6.
+     *
+     * @param string $key The key to validate
+     *
+     * @return string
+     *
+     * @throws InvalidArgumentException When $key is not valid
+     */
+    public static function validateKey($key)
+    {
+        if (!is_string($key)) {
+            throw new InvalidArgumentException(sprintf('Cache key must be string, "%s" given', is_object($key) ? get_class($key) : gettype($key)));
+        }
+        if (!isset($key[0])) {
+            throw new InvalidArgumentException('Cache key length must be greater than zero');
+        }
+        if (false !== strpbrk($key, '{}()/\@:')) {
+            throw new InvalidArgumentException(sprintf('Cache key "%s" contains reserved characters {}()/\@:', $key));
+        }
+
+        return $key;
+    }
+
+    /**
+     * Internal logging helper.
+     *
+     * @internal
+     */
+    public static function log(LoggerInterface $logger = null, $message, $context = array())
+    {
+        if ($logger) {
+            $logger->warning($message, $context);
+        } else {
+            $replace = array();
+            foreach ($context as $k => $v) {
+                if (is_scalar($v)) {
+                    $replace['{'.$k.'}'] = $v;
+                }
+            }
+            @trigger_error(strtr($message, $replace), E_USER_WARNING);
+        }
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/DataCollector/CacheDataCollector.php b/advancedcontentfilter/vendor/symfony/cache/DataCollector/CacheDataCollector.php
new file mode 100644 (file)
index 0000000..ceef45a
--- /dev/null
@@ -0,0 +1,190 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\DataCollector;
+
+use Symfony\Component\Cache\Adapter\TraceableAdapter;
+use Symfony\Component\Cache\Adapter\TraceableAdapterEvent;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\HttpKernel\DataCollector\DataCollector;
+use Symfony\Component\HttpKernel\DataCollector\LateDataCollectorInterface;
+
+/**
+ * @author Aaron Scherer <aequasi@gmail.com>
+ * @author Tobias Nyholm <tobias.nyholm@gmail.com>
+ */
+class CacheDataCollector extends DataCollector implements LateDataCollectorInterface
+{
+    /**
+     * @var TraceableAdapter[]
+     */
+    private $instances = array();
+
+    /**
+     * @param string           $name
+     * @param TraceableAdapter $instance
+     */
+    public function addInstance($name, TraceableAdapter $instance)
+    {
+        $this->instances[$name] = $instance;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function collect(Request $request, Response $response, \Exception $exception = null)
+    {
+        $empty = array('calls' => array(), 'config' => array(), 'options' => array(), 'statistics' => array());
+        $this->data = array('instances' => $empty, 'total' => $empty);
+        foreach ($this->instances as $name => $instance) {
+            $this->data['instances']['calls'][$name] = $instance->getCalls();
+        }
+
+        $this->data['instances']['statistics'] = $this->calculateStatistics();
+        $this->data['total']['statistics'] = $this->calculateTotalStatistics();
+    }
+
+    public function reset()
+    {
+        $this->data = array();
+        foreach ($this->instances as $instance) {
+            $instance->clearCalls();
+        }
+    }
+
+    public function lateCollect()
+    {
+        $this->data = $this->cloneVar($this->data);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getName()
+    {
+        return 'cache';
+    }
+
+    /**
+     * Method returns amount of logged Cache reads: "get" calls.
+     *
+     * @return array
+     */
+    public function getStatistics()
+    {
+        return $this->data['instances']['statistics'];
+    }
+
+    /**
+     * Method returns the statistic totals.
+     *
+     * @return array
+     */
+    public function getTotals()
+    {
+        return $this->data['total']['statistics'];
+    }
+
+    /**
+     * Method returns all logged Cache call objects.
+     *
+     * @return mixed
+     */
+    public function getCalls()
+    {
+        return $this->data['instances']['calls'];
+    }
+
+    /**
+     * @return array
+     */
+    private function calculateStatistics()
+    {
+        $statistics = array();
+        foreach ($this->data['instances']['calls'] as $name => $calls) {
+            $statistics[$name] = array(
+                'calls' => 0,
+                'time' => 0,
+                'reads' => 0,
+                'writes' => 0,
+                'deletes' => 0,
+                'hits' => 0,
+                'misses' => 0,
+            );
+            /** @var TraceableAdapterEvent $call */
+            foreach ($calls as $call) {
+                $statistics[$name]['calls'] += 1;
+                $statistics[$name]['time'] += $call->end - $call->start;
+                if ('getItem' === $call->name) {
+                    $statistics[$name]['reads'] += 1;
+                    if ($call->hits) {
+                        $statistics[$name]['hits'] += 1;
+                    } else {
+                        $statistics[$name]['misses'] += 1;
+                    }
+                } elseif ('getItems' === $call->name) {
+                    $count = $call->hits + $call->misses;
+                    $statistics[$name]['reads'] += $count;
+                    $statistics[$name]['hits'] += $call->hits;
+                    $statistics[$name]['misses'] += $count - $call->misses;
+                } elseif ('hasItem' === $call->name) {
+                    $statistics[$name]['reads'] += 1;
+                    if (false === $call->result) {
+                        $statistics[$name]['misses'] += 1;
+                    } else {
+                        $statistics[$name]['hits'] += 1;
+                    }
+                } elseif ('save' === $call->name) {
+                    $statistics[$name]['writes'] += 1;
+                } elseif ('deleteItem' === $call->name) {
+                    $statistics[$name]['deletes'] += 1;
+                }
+            }
+            if ($statistics[$name]['reads']) {
+                $statistics[$name]['hit_read_ratio'] = round(100 * $statistics[$name]['hits'] / $statistics[$name]['reads'], 2);
+            } else {
+                $statistics[$name]['hit_read_ratio'] = null;
+            }
+        }
+
+        return $statistics;
+    }
+
+    /**
+     * @return array
+     */
+    private function calculateTotalStatistics()
+    {
+        $statistics = $this->getStatistics();
+        $totals = array(
+            'calls' => 0,
+            'time' => 0,
+            'reads' => 0,
+            'writes' => 0,
+            'deletes' => 0,
+            'hits' => 0,
+            'misses' => 0,
+        );
+        foreach ($statistics as $name => $values) {
+            foreach ($totals as $key => $value) {
+                $totals[$key] += $statistics[$name][$key];
+            }
+        }
+        if ($totals['reads']) {
+            $totals['hit_read_ratio'] = round(100 * $totals['hits'] / $totals['reads'], 2);
+        } else {
+            $totals['hit_read_ratio'] = null;
+        }
+
+        return $totals;
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/DoctrineProvider.php b/advancedcontentfilter/vendor/symfony/cache/DoctrineProvider.php
new file mode 100644 (file)
index 0000000..cebe95f
--- /dev/null
@@ -0,0 +1,102 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache;
+
+use Doctrine\Common\Cache\CacheProvider;
+use Psr\Cache\CacheItemPoolInterface;
+
+/**
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class DoctrineProvider extends CacheProvider implements PruneableInterface, ResettableInterface
+{
+    private $pool;
+
+    public function __construct(CacheItemPoolInterface $pool)
+    {
+        $this->pool = $pool;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function prune()
+    {
+        return $this->pool instanceof PruneableInterface && $this->pool->prune();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function reset()
+    {
+        if ($this->pool instanceof ResettableInterface) {
+            $this->pool->reset();
+        }
+        $this->setNamespace($this->getNamespace());
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doFetch($id)
+    {
+        $item = $this->pool->getItem(rawurlencode($id));
+
+        return $item->isHit() ? $item->get() : false;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doContains($id)
+    {
+        return $this->pool->hasItem(rawurlencode($id));
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doSave($id, $data, $lifeTime = 0)
+    {
+        $item = $this->pool->getItem(rawurlencode($id));
+
+        if (0 < $lifeTime) {
+            $item->expiresAfter($lifeTime);
+        }
+
+        return $this->pool->save($item->set($data));
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doDelete($id)
+    {
+        return $this->pool->deleteItem(rawurlencode($id));
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doFlush()
+    {
+        $this->pool->clear();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doGetStats()
+    {
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Exception/CacheException.php b/advancedcontentfilter/vendor/symfony/cache/Exception/CacheException.php
new file mode 100644 (file)
index 0000000..e87b2db
--- /dev/null
@@ -0,0 +1,19 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Exception;
+
+use Psr\Cache\CacheException as Psr6CacheInterface;
+use Psr\SimpleCache\CacheException as SimpleCacheInterface;
+
+class CacheException extends \Exception implements Psr6CacheInterface, SimpleCacheInterface
+{
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Exception/InvalidArgumentException.php b/advancedcontentfilter/vendor/symfony/cache/Exception/InvalidArgumentException.php
new file mode 100644 (file)
index 0000000..828bf3e
--- /dev/null
@@ -0,0 +1,19 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Exception;
+
+use Psr\Cache\InvalidArgumentException as Psr6CacheInterface;
+use Psr\SimpleCache\InvalidArgumentException as SimpleCacheInterface;
+
+class InvalidArgumentException extends \InvalidArgumentException implements Psr6CacheInterface, SimpleCacheInterface
+{
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/LICENSE b/advancedcontentfilter/vendor/symfony/cache/LICENSE
new file mode 100644 (file)
index 0000000..fcd3fa7
--- /dev/null
@@ -0,0 +1,19 @@
+Copyright (c) 2016-2018 Fabien Potencier
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is furnished
+to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/advancedcontentfilter/vendor/symfony/cache/PruneableInterface.php b/advancedcontentfilter/vendor/symfony/cache/PruneableInterface.php
new file mode 100644 (file)
index 0000000..4261525
--- /dev/null
@@ -0,0 +1,23 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache;
+
+/**
+ * Interface extends psr-6 and psr-16 caches to allow for pruning (deletion) of all expired cache items.
+ */
+interface PruneableInterface
+{
+    /**
+     * @return bool
+     */
+    public function prune();
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/README.md b/advancedcontentfilter/vendor/symfony/cache/README.md
new file mode 100644 (file)
index 0000000..c4ab752
--- /dev/null
@@ -0,0 +1,18 @@
+Symfony PSR-6 implementation for caching
+========================================
+
+This component provides an extended [PSR-6](http://www.php-fig.org/psr/psr-6/)
+implementation for adding cache to your applications. It is designed to have a
+low overhead so that caching is fastest. It ships with a few caching adapters
+for the most widespread and suited to caching backends. It also provides a
+`doctrine/cache` proxy adapter to cover more advanced caching needs and a proxy
+adapter for greater interoperability between PSR-6 implementations.
+
+Resources
+---------
+
+  * [Documentation](https://symfony.com/doc/current/components/cache.html)
+  * [Contributing](https://symfony.com/doc/current/contributing/index.html)
+  * [Report issues](https://github.com/symfony/symfony/issues) and
+    [send Pull Requests](https://github.com/symfony/symfony/pulls)
+    in the [main Symfony repository](https://github.com/symfony/symfony)
diff --git a/advancedcontentfilter/vendor/symfony/cache/ResettableInterface.php b/advancedcontentfilter/vendor/symfony/cache/ResettableInterface.php
new file mode 100644 (file)
index 0000000..6be7286
--- /dev/null
@@ -0,0 +1,20 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache;
+
+/**
+ * Resets a pool's local state.
+ */
+interface ResettableInterface
+{
+    public function reset();
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Simple/AbstractCache.php b/advancedcontentfilter/vendor/symfony/cache/Simple/AbstractCache.php
new file mode 100644 (file)
index 0000000..e666eff
--- /dev/null
@@ -0,0 +1,185 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Simple;
+
+use Psr\Log\LoggerAwareInterface;
+use Psr\SimpleCache\CacheInterface;
+use Symfony\Component\Cache\CacheItem;
+use Symfony\Component\Cache\Exception\InvalidArgumentException;
+use Symfony\Component\Cache\Traits\AbstractTrait;
+use Symfony\Component\Cache\ResettableInterface;
+
+/**
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+abstract class AbstractCache implements CacheInterface, LoggerAwareInterface, ResettableInterface
+{
+    use AbstractTrait {
+        deleteItems as private;
+        AbstractTrait::deleteItem as delete;
+        AbstractTrait::hasItem as has;
+    }
+
+    private $defaultLifetime;
+
+    /**
+     * @param string $namespace
+     * @param int    $defaultLifetime
+     */
+    protected function __construct($namespace = '', $defaultLifetime = 0)
+    {
+        $this->defaultLifetime = max(0, (int) $defaultLifetime);
+        $this->namespace = '' === $namespace ? '' : CacheItem::validateKey($namespace).':';
+        if (null !== $this->maxIdLength && strlen($namespace) > $this->maxIdLength - 24) {
+            throw new InvalidArgumentException(sprintf('Namespace must be %d chars max, %d given ("%s")', $this->maxIdLength - 24, strlen($namespace), $namespace));
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function get($key, $default = null)
+    {
+        $id = $this->getId($key);
+
+        try {
+            foreach ($this->doFetch(array($id)) as $value) {
+                return $value;
+            }
+        } catch (\Exception $e) {
+            CacheItem::log($this->logger, 'Failed to fetch key "{key}"', array('key' => $key, 'exception' => $e));
+        }
+
+        return $default;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function set($key, $value, $ttl = null)
+    {
+        CacheItem::validateKey($key);
+
+        return $this->setMultiple(array($key => $value), $ttl);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getMultiple($keys, $default = null)
+    {
+        if ($keys instanceof \Traversable) {
+            $keys = iterator_to_array($keys, false);
+        } elseif (!is_array($keys)) {
+            throw new InvalidArgumentException(sprintf('Cache keys must be array or Traversable, "%s" given', is_object($keys) ? get_class($keys) : gettype($keys)));
+        }
+        $ids = array();
+
+        foreach ($keys as $key) {
+            $ids[] = $this->getId($key);
+        }
+        try {
+            $values = $this->doFetch($ids);
+        } catch (\Exception $e) {
+            CacheItem::log($this->logger, 'Failed to fetch requested values', array('keys' => $keys, 'exception' => $e));
+            $values = array();
+        }
+        $ids = array_combine($ids, $keys);
+
+        return $this->generateValues($values, $ids, $default);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setMultiple($values, $ttl = null)
+    {
+        if (!is_array($values) && !$values instanceof \Traversable) {
+            throw new InvalidArgumentException(sprintf('Cache values must be array or Traversable, "%s" given', is_object($values) ? get_class($values) : gettype($values)));
+        }
+        $valuesById = array();
+
+        foreach ($values as $key => $value) {
+            if (is_int($key)) {
+                $key = (string) $key;
+            }
+            $valuesById[$this->getId($key)] = $value;
+        }
+        if (false === $ttl = $this->normalizeTtl($ttl)) {
+            return $this->doDelete(array_keys($valuesById));
+        }
+
+        try {
+            $e = $this->doSave($valuesById, $ttl);
+        } catch (\Exception $e) {
+        }
+        if (true === $e || array() === $e) {
+            return true;
+        }
+        $keys = array();
+        foreach (is_array($e) ? $e : array_keys($valuesById) as $id) {
+            $keys[] = substr($id, strlen($this->namespace));
+        }
+        CacheItem::log($this->logger, 'Failed to save values', array('keys' => $keys, 'exception' => $e instanceof \Exception ? $e : null));
+
+        return false;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function deleteMultiple($keys)
+    {
+        if ($keys instanceof \Traversable) {
+            $keys = iterator_to_array($keys, false);
+        } elseif (!is_array($keys)) {
+            throw new InvalidArgumentException(sprintf('Cache keys must be array or Traversable, "%s" given', is_object($keys) ? get_class($keys) : gettype($keys)));
+        }
+
+        return $this->deleteItems($keys);
+    }
+
+    private function normalizeTtl($ttl)
+    {
+        if (null === $ttl) {
+            return $this->defaultLifetime;
+        }
+        if ($ttl instanceof \DateInterval) {
+            $ttl = (int) \DateTime::createFromFormat('U', 0)->add($ttl)->format('U');
+        }
+        if (is_int($ttl)) {
+            return 0 < $ttl ? $ttl : false;
+        }
+
+        throw new InvalidArgumentException(sprintf('Expiration date must be an integer, a DateInterval or null, "%s" given', is_object($ttl) ? get_class($ttl) : gettype($ttl)));
+    }
+
+    private function generateValues($values, &$keys, $default)
+    {
+        try {
+            foreach ($values as $id => $value) {
+                if (!isset($keys[$id])) {
+                    $id = key($keys);
+                }
+                $key = $keys[$id];
+                unset($keys[$id]);
+                yield $key => $value;
+            }
+        } catch (\Exception $e) {
+            CacheItem::log($this->logger, 'Failed to fetch requested values', array('keys' => array_values($keys), 'exception' => $e));
+        }
+
+        foreach ($keys as $key) {
+            yield $key => $default;
+        }
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Simple/ApcuCache.php b/advancedcontentfilter/vendor/symfony/cache/Simple/ApcuCache.php
new file mode 100644 (file)
index 0000000..e583b44
--- /dev/null
@@ -0,0 +1,29 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Simple;
+
+use Symfony\Component\Cache\Traits\ApcuTrait;
+
+class ApcuCache extends AbstractCache
+{
+    use ApcuTrait;
+
+    /**
+     * @param string      $namespace
+     * @param int         $defaultLifetime
+     * @param string|null $version
+     */
+    public function __construct($namespace = '', $defaultLifetime = 0, $version = null)
+    {
+        $this->init($namespace, $defaultLifetime, $version);
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Simple/ArrayCache.php b/advancedcontentfilter/vendor/symfony/cache/Simple/ArrayCache.php
new file mode 100644 (file)
index 0000000..8d027cd
--- /dev/null
@@ -0,0 +1,148 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Simple;
+
+use Psr\Log\LoggerAwareInterface;
+use Psr\SimpleCache\CacheInterface;
+use Symfony\Component\Cache\CacheItem;
+use Symfony\Component\Cache\Exception\InvalidArgumentException;
+use Symfony\Component\Cache\ResettableInterface;
+use Symfony\Component\Cache\Traits\ArrayTrait;
+
+/**
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class ArrayCache implements CacheInterface, LoggerAwareInterface, ResettableInterface
+{
+    use ArrayTrait {
+        ArrayTrait::deleteItem as delete;
+        ArrayTrait::hasItem as has;
+    }
+
+    private $defaultLifetime;
+
+    /**
+     * @param int  $defaultLifetime
+     * @param bool $storeSerialized Disabling serialization can lead to cache corruptions when storing mutable values but increases performance otherwise
+     */
+    public function __construct($defaultLifetime = 0, $storeSerialized = true)
+    {
+        $this->defaultLifetime = (int) $defaultLifetime;
+        $this->storeSerialized = $storeSerialized;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function get($key, $default = null)
+    {
+        foreach ($this->getMultiple(array($key), $default) as $v) {
+            return $v;
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getMultiple($keys, $default = null)
+    {
+        if ($keys instanceof \Traversable) {
+            $keys = iterator_to_array($keys, false);
+        } elseif (!is_array($keys)) {
+            throw new InvalidArgumentException(sprintf('Cache keys must be array or Traversable, "%s" given', is_object($keys) ? get_class($keys) : gettype($keys)));
+        }
+        foreach ($keys as $key) {
+            CacheItem::validateKey($key);
+        }
+
+        return $this->generateItems($keys, time(), function ($k, $v, $hit) use ($default) { return $hit ? $v : $default; });
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function deleteMultiple($keys)
+    {
+        if (!is_array($keys) && !$keys instanceof \Traversable) {
+            throw new InvalidArgumentException(sprintf('Cache keys must be array or Traversable, "%s" given', is_object($keys) ? get_class($keys) : gettype($keys)));
+        }
+        foreach ($keys as $key) {
+            $this->delete($key);
+        }
+
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function set($key, $value, $ttl = null)
+    {
+        CacheItem::validateKey($key);
+
+        return $this->setMultiple(array($key => $value), $ttl);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setMultiple($values, $ttl = null)
+    {
+        if (!is_array($values) && !$values instanceof \Traversable) {
+            throw new InvalidArgumentException(sprintf('Cache values must be array or Traversable, "%s" given', is_object($values) ? get_class($values) : gettype($values)));
+        }
+        $valuesArray = array();
+
+        foreach ($values as $key => $value) {
+            is_int($key) || CacheItem::validateKey($key);
+            $valuesArray[$key] = $value;
+        }
+        if (false === $ttl = $this->normalizeTtl($ttl)) {
+            return $this->deleteMultiple(array_keys($valuesArray));
+        }
+        if ($this->storeSerialized) {
+            foreach ($valuesArray as $key => $value) {
+                try {
+                    $valuesArray[$key] = serialize($value);
+                } catch (\Exception $e) {
+                    $type = is_object($value) ? get_class($value) : gettype($value);
+                    CacheItem::log($this->logger, 'Failed to save key "{key}" ({type})', array('key' => $key, 'type' => $type, 'exception' => $e));
+
+                    return false;
+                }
+            }
+        }
+        $expiry = 0 < $ttl ? time() + $ttl : PHP_INT_MAX;
+
+        foreach ($valuesArray as $key => $value) {
+            $this->values[$key] = $value;
+            $this->expiries[$key] = $expiry;
+        }
+
+        return true;
+    }
+
+    private function normalizeTtl($ttl)
+    {
+        if (null === $ttl) {
+            return $this->defaultLifetime;
+        }
+        if ($ttl instanceof \DateInterval) {
+            $ttl = (int) \DateTime::createFromFormat('U', 0)->add($ttl)->format('U');
+        }
+        if (is_int($ttl)) {
+            return 0 < $ttl ? $ttl : false;
+        }
+
+        throw new InvalidArgumentException(sprintf('Expiration date must be an integer, a DateInterval or null, "%s" given', is_object($ttl) ? get_class($ttl) : gettype($ttl)));
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Simple/ChainCache.php b/advancedcontentfilter/vendor/symfony/cache/Simple/ChainCache.php
new file mode 100644 (file)
index 0000000..9d0c758
--- /dev/null
@@ -0,0 +1,252 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Simple;
+
+use Psr\SimpleCache\CacheInterface;
+use Symfony\Component\Cache\Exception\InvalidArgumentException;
+use Symfony\Component\Cache\PruneableInterface;
+use Symfony\Component\Cache\ResettableInterface;
+
+/**
+ * Chains several caches together.
+ *
+ * Cached items are fetched from the first cache having them in its data store.
+ * They are saved and deleted in all caches at once.
+ *
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class ChainCache implements CacheInterface, PruneableInterface, ResettableInterface
+{
+    private $miss;
+    private $caches = array();
+    private $defaultLifetime;
+    private $cacheCount;
+
+    /**
+     * @param CacheInterface[] $caches          The ordered list of caches used to fetch cached items
+     * @param int              $defaultLifetime The lifetime of items propagated from lower caches to upper ones
+     */
+    public function __construct(array $caches, $defaultLifetime = 0)
+    {
+        if (!$caches) {
+            throw new InvalidArgumentException('At least one cache must be specified.');
+        }
+
+        foreach ($caches as $cache) {
+            if (!$cache instanceof CacheInterface) {
+                throw new InvalidArgumentException(sprintf('The class "%s" does not implement the "%s" interface.', get_class($cache), CacheInterface::class));
+            }
+        }
+
+        $this->miss = new \stdClass();
+        $this->caches = array_values($caches);
+        $this->cacheCount = count($this->caches);
+        $this->defaultLifetime = 0 < $defaultLifetime ? (int) $defaultLifetime : null;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function get($key, $default = null)
+    {
+        $miss = null !== $default && is_object($default) ? $default : $this->miss;
+
+        foreach ($this->caches as $i => $cache) {
+            $value = $cache->get($key, $miss);
+
+            if ($miss !== $value) {
+                while (0 <= --$i) {
+                    $this->caches[$i]->set($key, $value, $this->defaultLifetime);
+                }
+
+                return $value;
+            }
+        }
+
+        return $default;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getMultiple($keys, $default = null)
+    {
+        $miss = null !== $default && is_object($default) ? $default : $this->miss;
+
+        return $this->generateItems($this->caches[0]->getMultiple($keys, $miss), 0, $miss, $default);
+    }
+
+    private function generateItems($values, $cacheIndex, $miss, $default)
+    {
+        $missing = array();
+        $nextCacheIndex = $cacheIndex + 1;
+        $nextCache = isset($this->caches[$nextCacheIndex]) ? $this->caches[$nextCacheIndex] : null;
+
+        foreach ($values as $k => $value) {
+            if ($miss !== $value) {
+                yield $k => $value;
+            } elseif (!$nextCache) {
+                yield $k => $default;
+            } else {
+                $missing[] = $k;
+            }
+        }
+
+        if ($missing) {
+            $cache = $this->caches[$cacheIndex];
+            $values = $this->generateItems($nextCache->getMultiple($missing, $miss), $nextCacheIndex, $miss, $default);
+
+            foreach ($values as $k => $value) {
+                if ($miss !== $value) {
+                    $cache->set($k, $value, $this->defaultLifetime);
+                    yield $k => $value;
+                } else {
+                    yield $k => $default;
+                }
+            }
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function has($key)
+    {
+        foreach ($this->caches as $cache) {
+            if ($cache->has($key)) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function clear()
+    {
+        $cleared = true;
+        $i = $this->cacheCount;
+
+        while ($i--) {
+            $cleared = $this->caches[$i]->clear() && $cleared;
+        }
+
+        return $cleared;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function delete($key)
+    {
+        $deleted = true;
+        $i = $this->cacheCount;
+
+        while ($i--) {
+            $deleted = $this->caches[$i]->delete($key) && $deleted;
+        }
+
+        return $deleted;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function deleteMultiple($keys)
+    {
+        if ($keys instanceof \Traversable) {
+            $keys = iterator_to_array($keys, false);
+        }
+        $deleted = true;
+        $i = $this->cacheCount;
+
+        while ($i--) {
+            $deleted = $this->caches[$i]->deleteMultiple($keys) && $deleted;
+        }
+
+        return $deleted;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function set($key, $value, $ttl = null)
+    {
+        $saved = true;
+        $i = $this->cacheCount;
+
+        while ($i--) {
+            $saved = $this->caches[$i]->set($key, $value, $ttl) && $saved;
+        }
+
+        return $saved;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setMultiple($values, $ttl = null)
+    {
+        if ($values instanceof \Traversable) {
+            $valuesIterator = $values;
+            $values = function () use ($valuesIterator, &$values) {
+                $generatedValues = array();
+
+                foreach ($valuesIterator as $key => $value) {
+                    yield $key => $value;
+                    $generatedValues[$key] = $value;
+                }
+
+                $values = $generatedValues;
+            };
+            $values = $values();
+        }
+        $saved = true;
+        $i = $this->cacheCount;
+
+        while ($i--) {
+            $saved = $this->caches[$i]->setMultiple($values, $ttl) && $saved;
+        }
+
+        return $saved;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function prune()
+    {
+        $pruned = true;
+
+        foreach ($this->caches as $cache) {
+            if ($cache instanceof PruneableInterface) {
+                $pruned = $cache->prune() && $pruned;
+            }
+        }
+
+        return $pruned;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function reset()
+    {
+        foreach ($this->caches as $cache) {
+            if ($cache instanceof ResettableInterface) {
+                $cache->reset();
+            }
+        }
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Simple/DoctrineCache.php b/advancedcontentfilter/vendor/symfony/cache/Simple/DoctrineCache.php
new file mode 100644 (file)
index 0000000..00f0b9c
--- /dev/null
@@ -0,0 +1,32 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Simple;
+
+use Doctrine\Common\Cache\CacheProvider;
+use Symfony\Component\Cache\Traits\DoctrineTrait;
+
+class DoctrineCache extends AbstractCache
+{
+    use DoctrineTrait;
+
+    /**
+     * @param CacheProvider $provider
+     * @param string        $namespace
+     * @param int           $defaultLifetime
+     */
+    public function __construct(CacheProvider $provider, $namespace = '', $defaultLifetime = 0)
+    {
+        parent::__construct('', $defaultLifetime);
+        $this->provider = $provider;
+        $provider->setNamespace($namespace);
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Simple/FilesystemCache.php b/advancedcontentfilter/vendor/symfony/cache/Simple/FilesystemCache.php
new file mode 100644 (file)
index 0000000..ccd5795
--- /dev/null
@@ -0,0 +1,31 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Simple;
+
+use Symfony\Component\Cache\PruneableInterface;
+use Symfony\Component\Cache\Traits\FilesystemTrait;
+
+class FilesystemCache extends AbstractCache implements PruneableInterface
+{
+    use FilesystemTrait;
+
+    /**
+     * @param string      $namespace
+     * @param int         $defaultLifetime
+     * @param string|null $directory
+     */
+    public function __construct($namespace = '', $defaultLifetime = 0, $directory = null)
+    {
+        parent::__construct('', $defaultLifetime);
+        $this->init($namespace, $directory);
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Simple/MemcachedCache.php b/advancedcontentfilter/vendor/symfony/cache/Simple/MemcachedCache.php
new file mode 100644 (file)
index 0000000..7717740
--- /dev/null
@@ -0,0 +1,31 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Simple;
+
+use Symfony\Component\Cache\Traits\MemcachedTrait;
+
+class MemcachedCache extends AbstractCache
+{
+    use MemcachedTrait;
+
+    protected $maxIdLength = 250;
+
+    /**
+     * @param \Memcached $client
+     * @param string     $namespace
+     * @param int        $defaultLifetime
+     */
+    public function __construct(\Memcached $client, $namespace = '', $defaultLifetime = 0)
+    {
+        $this->init($client, $namespace, $defaultLifetime);
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Simple/NullCache.php b/advancedcontentfilter/vendor/symfony/cache/Simple/NullCache.php
new file mode 100644 (file)
index 0000000..fa986ae
--- /dev/null
@@ -0,0 +1,86 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Simple;
+
+use Psr\SimpleCache\CacheInterface;
+
+/**
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class NullCache implements CacheInterface
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function get($key, $default = null)
+    {
+        return $default;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getMultiple($keys, $default = null)
+    {
+        foreach ($keys as $key) {
+            yield $key => $default;
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function has($key)
+    {
+        return false;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function clear()
+    {
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function delete($key)
+    {
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function deleteMultiple($keys)
+    {
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function set($key, $value, $ttl = null)
+    {
+        return false;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setMultiple($values, $ttl = null)
+    {
+        return false;
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Simple/PdoCache.php b/advancedcontentfilter/vendor/symfony/cache/Simple/PdoCache.php
new file mode 100644 (file)
index 0000000..931a3b1
--- /dev/null
@@ -0,0 +1,51 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Simple;
+
+use Symfony\Component\Cache\PruneableInterface;
+use Symfony\Component\Cache\Traits\PdoTrait;
+
+class PdoCache extends AbstractCache implements PruneableInterface
+{
+    use PdoTrait;
+
+    protected $maxIdLength = 255;
+
+    /**
+     * You can either pass an existing database connection as PDO instance or
+     * a Doctrine DBAL Connection or a DSN string that will be used to
+     * lazy-connect to the database when the cache is actually used.
+     *
+     * List of available options:
+     *  * db_table: The name of the table [default: cache_items]
+     *  * db_id_col: The column where to store the cache id [default: item_id]
+     *  * db_data_col: The column where to store the cache data [default: item_data]
+     *  * db_lifetime_col: The column where to store the lifetime [default: item_lifetime]
+     *  * db_time_col: The column where to store the timestamp [default: item_time]
+     *  * db_username: The username when lazy-connect [default: '']
+     *  * db_password: The password when lazy-connect [default: '']
+     *  * db_connection_options: An array of driver-specific connection options [default: array()]
+     *
+     * @param \PDO|Connection|string $connOrDsn       A \PDO or Connection instance or DSN string or null
+     * @param string                 $namespace
+     * @param int                    $defaultLifetime
+     * @param array                  $options         An associative array of options
+     *
+     * @throws InvalidArgumentException When first argument is not PDO nor Connection nor string
+     * @throws InvalidArgumentException When PDO error mode is not PDO::ERRMODE_EXCEPTION
+     * @throws InvalidArgumentException When namespace contains invalid characters
+     */
+    public function __construct($connOrDsn, $namespace = '', $defaultLifetime = 0, array $options = array())
+    {
+        $this->init($connOrDsn, $namespace, $defaultLifetime, $options);
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Simple/PhpArrayCache.php b/advancedcontentfilter/vendor/symfony/cache/Simple/PhpArrayCache.php
new file mode 100644 (file)
index 0000000..3db8a2a
--- /dev/null
@@ -0,0 +1,259 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Simple;
+
+use Psr\SimpleCache\CacheInterface;
+use Symfony\Component\Cache\Exception\InvalidArgumentException;
+use Symfony\Component\Cache\Traits\PhpArrayTrait;
+use Symfony\Component\Cache\PruneableInterface;
+use Symfony\Component\Cache\ResettableInterface;
+
+/**
+ * Caches items at warm up time using a PHP array that is stored in shared memory by OPCache since PHP 7.0.
+ * Warmed up items are read-only and run-time discovered items are cached using a fallback adapter.
+ *
+ * @author Titouan Galopin <galopintitouan@gmail.com>
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class PhpArrayCache implements CacheInterface, PruneableInterface, ResettableInterface
+{
+    use PhpArrayTrait;
+
+    /**
+     * @param string         $file         The PHP file were values are cached
+     * @param CacheInterface $fallbackPool A pool to fallback on when an item is not hit
+     */
+    public function __construct($file, CacheInterface $fallbackPool)
+    {
+        $this->file = $file;
+        $this->pool = $fallbackPool;
+        $this->zendDetectUnicode = ini_get('zend.detect_unicode');
+    }
+
+    /**
+     * This adapter should only be used on PHP 7.0+ to take advantage of how PHP
+     * stores arrays in its latest versions. This factory method decorates the given
+     * fallback pool with this adapter only if the current PHP version is supported.
+     *
+     * @param string $file The PHP file were values are cached
+     *
+     * @return CacheInterface
+     */
+    public static function create($file, CacheInterface $fallbackPool)
+    {
+        // Shared memory is available in PHP 7.0+ with OPCache enabled and in HHVM
+        if ((\PHP_VERSION_ID >= 70000 && ini_get('opcache.enable')) || defined('HHVM_VERSION')) {
+            return new static($file, $fallbackPool);
+        }
+
+        return $fallbackPool;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function get($key, $default = null)
+    {
+        if (!is_string($key)) {
+            throw new InvalidArgumentException(sprintf('Cache key must be string, "%s" given.', is_object($key) ? get_class($key) : gettype($key)));
+        }
+        if (null === $this->values) {
+            $this->initialize();
+        }
+        if (!isset($this->values[$key])) {
+            return $this->pool->get($key, $default);
+        }
+
+        $value = $this->values[$key];
+
+        if ('N;' === $value) {
+            $value = null;
+        } elseif (is_string($value) && isset($value[2]) && ':' === $value[1]) {
+            try {
+                $e = null;
+                $value = unserialize($value);
+            } catch (\Error $e) {
+            } catch (\Exception $e) {
+            }
+            if (null !== $e) {
+                return $default;
+            }
+        }
+
+        return $value;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getMultiple($keys, $default = null)
+    {
+        if ($keys instanceof \Traversable) {
+            $keys = iterator_to_array($keys, false);
+        } elseif (!is_array($keys)) {
+            throw new InvalidArgumentException(sprintf('Cache keys must be array or Traversable, "%s" given', is_object($keys) ? get_class($keys) : gettype($keys)));
+        }
+        foreach ($keys as $key) {
+            if (!is_string($key)) {
+                throw new InvalidArgumentException(sprintf('Cache key must be string, "%s" given.', is_object($key) ? get_class($key) : gettype($key)));
+            }
+        }
+        if (null === $this->values) {
+            $this->initialize();
+        }
+
+        return $this->generateItems($keys, $default);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function has($key)
+    {
+        if (!is_string($key)) {
+            throw new InvalidArgumentException(sprintf('Cache key must be string, "%s" given.', is_object($key) ? get_class($key) : gettype($key)));
+        }
+        if (null === $this->values) {
+            $this->initialize();
+        }
+
+        return isset($this->values[$key]) || $this->pool->has($key);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function delete($key)
+    {
+        if (!is_string($key)) {
+            throw new InvalidArgumentException(sprintf('Cache key must be string, "%s" given.', is_object($key) ? get_class($key) : gettype($key)));
+        }
+        if (null === $this->values) {
+            $this->initialize();
+        }
+
+        return !isset($this->values[$key]) && $this->pool->delete($key);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function deleteMultiple($keys)
+    {
+        if (!is_array($keys) && !$keys instanceof \Traversable) {
+            throw new InvalidArgumentException(sprintf('Cache keys must be array or Traversable, "%s" given', is_object($keys) ? get_class($keys) : gettype($keys)));
+        }
+
+        $deleted = true;
+        $fallbackKeys = array();
+
+        foreach ($keys as $key) {
+            if (!is_string($key)) {
+                throw new InvalidArgumentException(sprintf('Cache key must be string, "%s" given.', is_object($key) ? get_class($key) : gettype($key)));
+            }
+
+            if (isset($this->values[$key])) {
+                $deleted = false;
+            } else {
+                $fallbackKeys[] = $key;
+            }
+        }
+        if (null === $this->values) {
+            $this->initialize();
+        }
+
+        if ($fallbackKeys) {
+            $deleted = $this->pool->deleteMultiple($fallbackKeys) && $deleted;
+        }
+
+        return $deleted;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function set($key, $value, $ttl = null)
+    {
+        if (!is_string($key)) {
+            throw new InvalidArgumentException(sprintf('Cache key must be string, "%s" given.', is_object($key) ? get_class($key) : gettype($key)));
+        }
+        if (null === $this->values) {
+            $this->initialize();
+        }
+
+        return !isset($this->values[$key]) && $this->pool->set($key, $value, $ttl);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setMultiple($values, $ttl = null)
+    {
+        if (!is_array($values) && !$values instanceof \Traversable) {
+            throw new InvalidArgumentException(sprintf('Cache values must be array or Traversable, "%s" given', is_object($values) ? get_class($values) : gettype($values)));
+        }
+
+        $saved = true;
+        $fallbackValues = array();
+
+        foreach ($values as $key => $value) {
+            if (!is_string($key) && !is_int($key)) {
+                throw new InvalidArgumentException(sprintf('Cache key must be string, "%s" given.', is_object($key) ? get_class($key) : gettype($key)));
+            }
+
+            if (isset($this->values[$key])) {
+                $saved = false;
+            } else {
+                $fallbackValues[$key] = $value;
+            }
+        }
+
+        if ($fallbackValues) {
+            $saved = $this->pool->setMultiple($fallbackValues, $ttl) && $saved;
+        }
+
+        return $saved;
+    }
+
+    private function generateItems(array $keys, $default)
+    {
+        $fallbackKeys = array();
+
+        foreach ($keys as $key) {
+            if (isset($this->values[$key])) {
+                $value = $this->values[$key];
+
+                if ('N;' === $value) {
+                    yield $key => null;
+                } elseif (is_string($value) && isset($value[2]) && ':' === $value[1]) {
+                    try {
+                        yield $key => unserialize($value);
+                    } catch (\Error $e) {
+                        yield $key => $default;
+                    } catch (\Exception $e) {
+                        yield $key => $default;
+                    }
+                } else {
+                    yield $key => $value;
+                }
+            } else {
+                $fallbackKeys[] = $key;
+            }
+        }
+
+        if ($fallbackKeys) {
+            foreach ($this->pool->getMultiple($fallbackKeys, $default) as $key => $item) {
+                yield $key => $item;
+            }
+        }
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Simple/PhpFilesCache.php b/advancedcontentfilter/vendor/symfony/cache/Simple/PhpFilesCache.php
new file mode 100644 (file)
index 0000000..9231c8c
--- /dev/null
@@ -0,0 +1,41 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Simple;
+
+use Symfony\Component\Cache\Exception\CacheException;
+use Symfony\Component\Cache\PruneableInterface;
+use Symfony\Component\Cache\Traits\PhpFilesTrait;
+
+class PhpFilesCache extends AbstractCache implements PruneableInterface
+{
+    use PhpFilesTrait;
+
+    /**
+     * @param string      $namespace
+     * @param int         $defaultLifetime
+     * @param string|null $directory
+     *
+     * @throws CacheException if OPcache is not enabled
+     */
+    public function __construct($namespace = '', $defaultLifetime = 0, $directory = null)
+    {
+        if (!static::isSupported()) {
+            throw new CacheException('OPcache is not enabled');
+        }
+        parent::__construct('', $defaultLifetime);
+        $this->init($namespace, $directory);
+
+        $e = new \Exception();
+        $this->includeHandler = function () use ($e) { throw $e; };
+        $this->zendDetectUnicode = ini_get('zend.detect_unicode');
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Simple/Psr6Cache.php b/advancedcontentfilter/vendor/symfony/cache/Simple/Psr6Cache.php
new file mode 100644 (file)
index 0000000..81f14d4
--- /dev/null
@@ -0,0 +1,228 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Simple;
+
+use Psr\Cache\CacheItemPoolInterface;
+use Psr\Cache\CacheException as Psr6CacheException;
+use Psr\SimpleCache\CacheInterface;
+use Psr\SimpleCache\CacheException as SimpleCacheException;
+use Symfony\Component\Cache\Adapter\AbstractAdapter;
+use Symfony\Component\Cache\CacheItem;
+use Symfony\Component\Cache\Exception\InvalidArgumentException;
+use Symfony\Component\Cache\PruneableInterface;
+use Symfony\Component\Cache\ResettableInterface;
+use Symfony\Component\Cache\Traits\ProxyTrait;
+
+/**
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class Psr6Cache implements CacheInterface, PruneableInterface, ResettableInterface
+{
+    use ProxyTrait;
+
+    private $createCacheItem;
+
+    public function __construct(CacheItemPoolInterface $pool)
+    {
+        $this->pool = $pool;
+
+        if ($pool instanceof AbstractAdapter) {
+            $this->createCacheItem = \Closure::bind(
+                function ($key, $value, $allowInt = false) {
+                    if ($allowInt && is_int($key)) {
+                        $key = (string) $key;
+                    } else {
+                        CacheItem::validateKey($key);
+                    }
+                    $f = $this->createCacheItem;
+
+                    return $f($key, $value, false);
+                },
+                $pool,
+                AbstractAdapter::class
+            );
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function get($key, $default = null)
+    {
+        try {
+            $item = $this->pool->getItem($key);
+        } catch (SimpleCacheException $e) {
+            throw $e;
+        } catch (Psr6CacheException $e) {
+            throw new InvalidArgumentException($e->getMessage(), $e->getCode(), $e);
+        }
+
+        return $item->isHit() ? $item->get() : $default;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function set($key, $value, $ttl = null)
+    {
+        try {
+            if (null !== $f = $this->createCacheItem) {
+                $item = $f($key, $value);
+            } else {
+                $item = $this->pool->getItem($key)->set($value);
+            }
+        } catch (SimpleCacheException $e) {
+            throw $e;
+        } catch (Psr6CacheException $e) {
+            throw new InvalidArgumentException($e->getMessage(), $e->getCode(), $e);
+        }
+        if (null !== $ttl) {
+            $item->expiresAfter($ttl);
+        }
+
+        return $this->pool->save($item);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function delete($key)
+    {
+        try {
+            return $this->pool->deleteItem($key);
+        } catch (SimpleCacheException $e) {
+            throw $e;
+        } catch (Psr6CacheException $e) {
+            throw new InvalidArgumentException($e->getMessage(), $e->getCode(), $e);
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function clear()
+    {
+        return $this->pool->clear();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getMultiple($keys, $default = null)
+    {
+        if ($keys instanceof \Traversable) {
+            $keys = iterator_to_array($keys, false);
+        } elseif (!is_array($keys)) {
+            throw new InvalidArgumentException(sprintf('Cache keys must be array or Traversable, "%s" given', is_object($keys) ? get_class($keys) : gettype($keys)));
+        }
+
+        try {
+            $items = $this->pool->getItems($keys);
+        } catch (SimpleCacheException $e) {
+            throw $e;
+        } catch (Psr6CacheException $e) {
+            throw new InvalidArgumentException($e->getMessage(), $e->getCode(), $e);
+        }
+        $values = array();
+
+        foreach ($items as $key => $item) {
+            $values[$key] = $item->isHit() ? $item->get() : $default;
+        }
+
+        return $values;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setMultiple($values, $ttl = null)
+    {
+        $valuesIsArray = is_array($values);
+        if (!$valuesIsArray && !$values instanceof \Traversable) {
+            throw new InvalidArgumentException(sprintf('Cache values must be array or Traversable, "%s" given', is_object($values) ? get_class($values) : gettype($values)));
+        }
+        $items = array();
+
+        try {
+            if (null !== $f = $this->createCacheItem) {
+                $valuesIsArray = false;
+                foreach ($values as $key => $value) {
+                    $items[$key] = $f($key, $value, true);
+                }
+            } elseif ($valuesIsArray) {
+                $items = array();
+                foreach ($values as $key => $value) {
+                    $items[] = (string) $key;
+                }
+                $items = $this->pool->getItems($items);
+            } else {
+                foreach ($values as $key => $value) {
+                    if (is_int($key)) {
+                        $key = (string) $key;
+                    }
+                    $items[$key] = $this->pool->getItem($key)->set($value);
+                }
+            }
+        } catch (SimpleCacheException $e) {
+            throw $e;
+        } catch (Psr6CacheException $e) {
+            throw new InvalidArgumentException($e->getMessage(), $e->getCode(), $e);
+        }
+        $ok = true;
+
+        foreach ($items as $key => $item) {
+            if ($valuesIsArray) {
+                $item->set($values[$key]);
+            }
+            if (null !== $ttl) {
+                $item->expiresAfter($ttl);
+            }
+            $ok = $this->pool->saveDeferred($item) && $ok;
+        }
+
+        return $this->pool->commit() && $ok;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function deleteMultiple($keys)
+    {
+        if ($keys instanceof \Traversable) {
+            $keys = iterator_to_array($keys, false);
+        } elseif (!is_array($keys)) {
+            throw new InvalidArgumentException(sprintf('Cache keys must be array or Traversable, "%s" given', is_object($keys) ? get_class($keys) : gettype($keys)));
+        }
+
+        try {
+            return $this->pool->deleteItems($keys);
+        } catch (SimpleCacheException $e) {
+            throw $e;
+        } catch (Psr6CacheException $e) {
+            throw new InvalidArgumentException($e->getMessage(), $e->getCode(), $e);
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function has($key)
+    {
+        try {
+            return $this->pool->hasItem($key);
+        } catch (SimpleCacheException $e) {
+            throw $e;
+        } catch (Psr6CacheException $e) {
+            throw new InvalidArgumentException($e->getMessage(), $e->getCode(), $e);
+        }
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Simple/RedisCache.php b/advancedcontentfilter/vendor/symfony/cache/Simple/RedisCache.php
new file mode 100644 (file)
index 0000000..e82c062
--- /dev/null
@@ -0,0 +1,29 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Simple;
+
+use Symfony\Component\Cache\Traits\RedisTrait;
+
+class RedisCache extends AbstractCache
+{
+    use RedisTrait;
+
+    /**
+     * @param \Redis|\RedisArray|\RedisCluster|\Predis\Client $redisClient
+     * @param string                                          $namespace
+     * @param int                                             $defaultLifetime
+     */
+    public function __construct($redisClient, $namespace = '', $defaultLifetime = 0)
+    {
+        $this->init($redisClient, $namespace, $defaultLifetime);
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Simple/TraceableCache.php b/advancedcontentfilter/vendor/symfony/cache/Simple/TraceableCache.php
new file mode 100644 (file)
index 0000000..756403b
--- /dev/null
@@ -0,0 +1,241 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Simple;
+
+use Psr\SimpleCache\CacheInterface;
+use Symfony\Component\Cache\PruneableInterface;
+use Symfony\Component\Cache\ResettableInterface;
+
+/**
+ * An adapter that collects data about all cache calls.
+ *
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class TraceableCache implements CacheInterface, PruneableInterface, ResettableInterface
+{
+    private $pool;
+    private $miss;
+    private $calls = array();
+
+    public function __construct(CacheInterface $pool)
+    {
+        $this->pool = $pool;
+        $this->miss = new \stdClass();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function get($key, $default = null)
+    {
+        $miss = null !== $default && is_object($default) ? $default : $this->miss;
+        $event = $this->start(__FUNCTION__);
+        try {
+            $value = $this->pool->get($key, $miss);
+        } finally {
+            $event->end = microtime(true);
+        }
+        if ($event->result[$key] = $miss !== $value) {
+            ++$event->hits;
+        } else {
+            ++$event->misses;
+            $value = $default;
+        }
+
+        return $value;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function has($key)
+    {
+        $event = $this->start(__FUNCTION__);
+        try {
+            return $event->result[$key] = $this->pool->has($key);
+        } finally {
+            $event->end = microtime(true);
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function delete($key)
+    {
+        $event = $this->start(__FUNCTION__);
+        try {
+            return $event->result[$key] = $this->pool->delete($key);
+        } finally {
+            $event->end = microtime(true);
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function set($key, $value, $ttl = null)
+    {
+        $event = $this->start(__FUNCTION__);
+        try {
+            return $event->result[$key] = $this->pool->set($key, $value, $ttl);
+        } finally {
+            $event->end = microtime(true);
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setMultiple($values, $ttl = null)
+    {
+        $event = $this->start(__FUNCTION__);
+        $event->result['keys'] = array();
+
+        if ($values instanceof \Traversable) {
+            $values = function () use ($values, $event) {
+                foreach ($values as $k => $v) {
+                    $event->result['keys'][] = $k;
+                    yield $k => $v;
+                }
+            };
+            $values = $values();
+        } elseif (is_array($values)) {
+            $event->result['keys'] = array_keys($values);
+        }
+
+        try {
+            return $event->result['result'] = $this->pool->setMultiple($values, $ttl);
+        } finally {
+            $event->end = microtime(true);
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getMultiple($keys, $default = null)
+    {
+        $miss = null !== $default && is_object($default) ? $default : $this->miss;
+        $event = $this->start(__FUNCTION__);
+        try {
+            $result = $this->pool->getMultiple($keys, $miss);
+        } finally {
+            $event->end = microtime(true);
+        }
+        $f = function () use ($result, $event, $miss, $default) {
+            $event->result = array();
+            foreach ($result as $key => $value) {
+                if ($event->result[$key] = $miss !== $value) {
+                    ++$event->hits;
+                } else {
+                    ++$event->misses;
+                    $value = $default;
+                }
+                yield $key => $value;
+            }
+        };
+
+        return $f();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function clear()
+    {
+        $event = $this->start(__FUNCTION__);
+        try {
+            return $event->result = $this->pool->clear();
+        } finally {
+            $event->end = microtime(true);
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function deleteMultiple($keys)
+    {
+        $event = $this->start(__FUNCTION__);
+        if ($keys instanceof \Traversable) {
+            $keys = $event->result['keys'] = iterator_to_array($keys, false);
+        } else {
+            $event->result['keys'] = $keys;
+        }
+        try {
+            return $event->result['result'] = $this->pool->deleteMultiple($keys);
+        } finally {
+            $event->end = microtime(true);
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function prune()
+    {
+        if (!$this->pool instanceof PruneableInterface) {
+            return false;
+        }
+        $event = $this->start(__FUNCTION__);
+        try {
+            return $event->result = $this->pool->prune();
+        } finally {
+            $event->end = microtime(true);
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function reset()
+    {
+        if (!$this->pool instanceof ResettableInterface) {
+            return;
+        }
+        $event = $this->start(__FUNCTION__);
+        try {
+            $this->pool->reset();
+        } finally {
+            $event->end = microtime(true);
+        }
+    }
+
+    public function getCalls()
+    {
+        try {
+            return $this->calls;
+        } finally {
+            $this->calls = array();
+        }
+    }
+
+    private function start($name)
+    {
+        $this->calls[] = $event = new TraceableCacheEvent();
+        $event->name = $name;
+        $event->start = microtime(true);
+
+        return $event;
+    }
+}
+
+class TraceableCacheEvent
+{
+    public $name;
+    public $start;
+    public $end;
+    public $result;
+    public $hits = 0;
+    public $misses = 0;
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Tests/Adapter/AbstractRedisAdapterTest.php b/advancedcontentfilter/vendor/symfony/cache/Tests/Adapter/AbstractRedisAdapterTest.php
new file mode 100644 (file)
index 0000000..d935382
--- /dev/null
@@ -0,0 +1,46 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Tests\Adapter;
+
+use Symfony\Component\Cache\Adapter\RedisAdapter;
+
+abstract class AbstractRedisAdapterTest extends AdapterTestCase
+{
+    protected $skippedTests = array(
+        'testExpiration' => 'Testing expiration slows down the test suite',
+        'testHasItemReturnsFalseWhenDeferredItemIsExpired' => 'Testing expiration slows down the test suite',
+        'testDefaultLifeTime' => 'Testing expiration slows down the test suite',
+    );
+
+    protected static $redis;
+
+    public function createCachePool($defaultLifetime = 0)
+    {
+        return new RedisAdapter(self::$redis, str_replace('\\', '.', __CLASS__), $defaultLifetime);
+    }
+
+    public static function setupBeforeClass()
+    {
+        if (!extension_loaded('redis')) {
+            self::markTestSkipped('Extension redis required.');
+        }
+        if (!@((new \Redis())->connect(getenv('REDIS_HOST')))) {
+            $e = error_get_last();
+            self::markTestSkipped($e['message']);
+        }
+    }
+
+    public static function tearDownAfterClass()
+    {
+        self::$redis = null;
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Tests/Adapter/AdapterTestCase.php b/advancedcontentfilter/vendor/symfony/cache/Tests/Adapter/AdapterTestCase.php
new file mode 100644 (file)
index 0000000..a0b74b4
--- /dev/null
@@ -0,0 +1,175 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Tests\Adapter;
+
+use Cache\IntegrationTests\CachePoolTest;
+use Psr\Cache\CacheItemPoolInterface;
+use Symfony\Component\Cache\PruneableInterface;
+
+abstract class AdapterTestCase extends CachePoolTest
+{
+    protected function setUp()
+    {
+        parent::setUp();
+
+        if (!array_key_exists('testDeferredSaveWithoutCommit', $this->skippedTests) && defined('HHVM_VERSION')) {
+            $this->skippedTests['testDeferredSaveWithoutCommit'] = 'Destructors are called late on HHVM.';
+        }
+
+        if (!array_key_exists('testPrune', $this->skippedTests) && !$this->createCachePool() instanceof PruneableInterface) {
+            $this->skippedTests['testPrune'] = 'Not a pruneable cache pool.';
+        }
+    }
+
+    public function testDefaultLifeTime()
+    {
+        if (isset($this->skippedTests[__FUNCTION__])) {
+            $this->markTestSkipped($this->skippedTests[__FUNCTION__]);
+        }
+
+        $cache = $this->createCachePool(2);
+
+        $item = $cache->getItem('key.dlt');
+        $item->set('value');
+        $cache->save($item);
+        sleep(1);
+
+        $item = $cache->getItem('key.dlt');
+        $this->assertTrue($item->isHit());
+
+        sleep(2);
+        $item = $cache->getItem('key.dlt');
+        $this->assertFalse($item->isHit());
+    }
+
+    public function testExpiration()
+    {
+        if (isset($this->skippedTests[__FUNCTION__])) {
+            $this->markTestSkipped($this->skippedTests[__FUNCTION__]);
+        }
+
+        $cache = $this->createCachePool();
+        $cache->save($cache->getItem('k1')->set('v1')->expiresAfter(2));
+        $cache->save($cache->getItem('k2')->set('v2')->expiresAfter(366 * 86400));
+
+        sleep(3);
+        $item = $cache->getItem('k1');
+        $this->assertFalse($item->isHit());
+        $this->assertNull($item->get(), "Item's value must be null when isHit() is false.");
+
+        $item = $cache->getItem('k2');
+        $this->assertTrue($item->isHit());
+        $this->assertSame('v2', $item->get());
+    }
+
+    public function testNotUnserializable()
+    {
+        if (isset($this->skippedTests[__FUNCTION__])) {
+            $this->markTestSkipped($this->skippedTests[__FUNCTION__]);
+        }
+
+        $cache = $this->createCachePool();
+
+        $item = $cache->getItem('foo');
+        $cache->save($item->set(new NotUnserializable()));
+
+        $item = $cache->getItem('foo');
+        $this->assertFalse($item->isHit());
+
+        foreach ($cache->getItems(array('foo')) as $item) {
+        }
+        $cache->save($item->set(new NotUnserializable()));
+
+        foreach ($cache->getItems(array('foo')) as $item) {
+        }
+        $this->assertFalse($item->isHit());
+    }
+
+    public function testPrune()
+    {
+        if (isset($this->skippedTests[__FUNCTION__])) {
+            $this->markTestSkipped($this->skippedTests[__FUNCTION__]);
+        }
+
+        if (!method_exists($this, 'isPruned')) {
+            $this->fail('Test classes for pruneable caches must implement `isPruned($cache, $name)` method.');
+        }
+
+        /** @var PruneableInterface|CacheItemPoolInterface $cache */
+        $cache = $this->createCachePool();
+
+        $doSet = function ($name, $value, \DateInterval $expiresAfter = null) use ($cache) {
+            $item = $cache->getItem($name);
+            $item->set($value);
+
+            if ($expiresAfter) {
+                $item->expiresAfter($expiresAfter);
+            }
+
+            $cache->save($item);
+        };
+
+        $doSet('foo', 'foo-val', new \DateInterval('PT05S'));
+        $doSet('bar', 'bar-val', new \DateInterval('PT10S'));
+        $doSet('baz', 'baz-val', new \DateInterval('PT15S'));
+        $doSet('qux', 'qux-val', new \DateInterval('PT20S'));
+
+        sleep(30);
+        $cache->prune();
+        $this->assertTrue($this->isPruned($cache, 'foo'));
+        $this->assertTrue($this->isPruned($cache, 'bar'));
+        $this->assertTrue($this->isPruned($cache, 'baz'));
+        $this->assertTrue($this->isPruned($cache, 'qux'));
+
+        $doSet('foo', 'foo-val');
+        $doSet('bar', 'bar-val', new \DateInterval('PT20S'));
+        $doSet('baz', 'baz-val', new \DateInterval('PT40S'));
+        $doSet('qux', 'qux-val', new \DateInterval('PT80S'));
+
+        $cache->prune();
+        $this->assertFalse($this->isPruned($cache, 'foo'));
+        $this->assertFalse($this->isPruned($cache, 'bar'));
+        $this->assertFalse($this->isPruned($cache, 'baz'));
+        $this->assertFalse($this->isPruned($cache, 'qux'));
+
+        sleep(30);
+        $cache->prune();
+        $this->assertFalse($this->isPruned($cache, 'foo'));
+        $this->assertTrue($this->isPruned($cache, 'bar'));
+        $this->assertFalse($this->isPruned($cache, 'baz'));
+        $this->assertFalse($this->isPruned($cache, 'qux'));
+
+        sleep(30);
+        $cache->prune();
+        $this->assertFalse($this->isPruned($cache, 'foo'));
+        $this->assertTrue($this->isPruned($cache, 'baz'));
+        $this->assertFalse($this->isPruned($cache, 'qux'));
+
+        sleep(30);
+        $cache->prune();
+        $this->assertFalse($this->isPruned($cache, 'foo'));
+        $this->assertTrue($this->isPruned($cache, 'qux'));
+    }
+}
+
+class NotUnserializable implements \Serializable
+{
+    public function serialize()
+    {
+        return serialize(123);
+    }
+
+    public function unserialize($ser)
+    {
+        throw new \Exception(__CLASS__);
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Tests/Adapter/ApcuAdapterTest.php b/advancedcontentfilter/vendor/symfony/cache/Tests/Adapter/ApcuAdapterTest.php
new file mode 100644 (file)
index 0000000..72df12e
--- /dev/null
@@ -0,0 +1,124 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Tests\Adapter;
+
+use Psr\Log\NullLogger;
+use Symfony\Component\Cache\Adapter\ApcuAdapter;
+
+class ApcuAdapterTest extends AdapterTestCase
+{
+    protected $skippedTests = array(
+        'testExpiration' => 'Testing expiration slows down the test suite',
+        'testHasItemReturnsFalseWhenDeferredItemIsExpired' => 'Testing expiration slows down the test suite',
+        'testDefaultLifeTime' => 'Testing expiration slows down the test suite',
+    );
+
+    public function createCachePool($defaultLifetime = 0)
+    {
+        if (!function_exists('apcu_fetch') || !ini_get('apc.enabled')) {
+            $this->markTestSkipped('APCu extension is required.');
+        }
+        if ('cli' === PHP_SAPI && !ini_get('apc.enable_cli')) {
+            if ('testWithCliSapi' !== $this->getName()) {
+                $this->markTestSkipped('apc.enable_cli=1 is required.');
+            }
+        }
+        if ('\\' === DIRECTORY_SEPARATOR) {
+            $this->markTestSkipped('Fails transiently on Windows.');
+        }
+
+        return new ApcuAdapter(str_replace('\\', '.', __CLASS__), $defaultLifetime);
+    }
+
+    public function testUnserializable()
+    {
+        $pool = $this->createCachePool();
+
+        $item = $pool->getItem('foo');
+        $item->set(function () {});
+
+        $this->assertFalse($pool->save($item));
+
+        $item = $pool->getItem('foo');
+        $this->assertFalse($item->isHit());
+    }
+
+    public function testVersion()
+    {
+        $namespace = str_replace('\\', '.', get_class($this));
+
+        $pool1 = new ApcuAdapter($namespace, 0, 'p1');
+
+        $item = $pool1->getItem('foo');
+        $this->assertFalse($item->isHit());
+        $this->assertTrue($pool1->save($item->set('bar')));
+
+        $item = $pool1->getItem('foo');
+        $this->assertTrue($item->isHit());
+        $this->assertSame('bar', $item->get());
+
+        $pool2 = new ApcuAdapter($namespace, 0, 'p2');
+
+        $item = $pool2->getItem('foo');
+        $this->assertFalse($item->isHit());
+        $this->assertNull($item->get());
+
+        $item = $pool1->getItem('foo');
+        $this->assertFalse($item->isHit());
+        $this->assertNull($item->get());
+    }
+
+    public function testNamespace()
+    {
+        $namespace = str_replace('\\', '.', get_class($this));
+
+        $pool1 = new ApcuAdapter($namespace.'_1', 0, 'p1');
+
+        $item = $pool1->getItem('foo');
+        $this->assertFalse($item->isHit());
+        $this->assertTrue($pool1->save($item->set('bar')));
+
+        $item = $pool1->getItem('foo');
+        $this->assertTrue($item->isHit());
+        $this->assertSame('bar', $item->get());
+
+        $pool2 = new ApcuAdapter($namespace.'_2', 0, 'p1');
+
+        $item = $pool2->getItem('foo');
+        $this->assertFalse($item->isHit());
+        $this->assertNull($item->get());
+
+        $item = $pool1->getItem('foo');
+        $this->assertTrue($item->isHit());
+        $this->assertSame('bar', $item->get());
+    }
+
+    public function testWithCliSapi()
+    {
+        try {
+            // disable PHPUnit error handler to mimic a production environment
+            $isCalled = false;
+            set_error_handler(function () use (&$isCalled) {
+                $isCalled = true;
+            });
+            $pool = new ApcuAdapter(str_replace('\\', '.', __CLASS__));
+            $pool->setLogger(new NullLogger());
+
+            $item = $pool->getItem('foo');
+            $item->isHit();
+            $pool->save($item->set('bar'));
+            $this->assertFalse($isCalled);
+        } finally {
+            restore_error_handler();
+        }
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Tests/Adapter/ArrayAdapterTest.php b/advancedcontentfilter/vendor/symfony/cache/Tests/Adapter/ArrayAdapterTest.php
new file mode 100644 (file)
index 0000000..725d790
--- /dev/null
@@ -0,0 +1,56 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Tests\Adapter;
+
+use Symfony\Component\Cache\Adapter\ArrayAdapter;
+
+/**
+ * @group time-sensitive
+ */
+class ArrayAdapterTest extends AdapterTestCase
+{
+    protected $skippedTests = array(
+        'testDeferredSaveWithoutCommit' => 'Assumes a shared cache which ArrayAdapter is not.',
+        'testSaveWithoutExpire' => 'Assumes a shared cache which ArrayAdapter is not.',
+    );
+
+    public function createCachePool($defaultLifetime = 0)
+    {
+        return new ArrayAdapter($defaultLifetime);
+    }
+
+    public function testGetValuesHitAndMiss()
+    {
+        /** @var ArrayAdapter $cache */
+        $cache = $this->createCachePool();
+
+        // Hit
+        $item = $cache->getItem('foo');
+        $item->set('4711');
+        $cache->save($item);
+
+        $fooItem = $cache->getItem('foo');
+        $this->assertTrue($fooItem->isHit());
+        $this->assertEquals('4711', $fooItem->get());
+
+        // Miss (should be present as NULL in $values)
+        $cache->getItem('bar');
+
+        $values = $cache->getValues();
+
+        $this->assertCount(2, $values);
+        $this->assertArrayHasKey('foo', $values);
+        $this->assertSame(serialize('4711'), $values['foo']);
+        $this->assertArrayHasKey('bar', $values);
+        $this->assertNull($values['bar']);
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Tests/Adapter/ChainAdapterTest.php b/advancedcontentfilter/vendor/symfony/cache/Tests/Adapter/ChainAdapterTest.php
new file mode 100644 (file)
index 0000000..293a90c
--- /dev/null
@@ -0,0 +1,118 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Tests\Adapter;
+
+use Symfony\Component\Cache\Adapter\AdapterInterface;
+use Symfony\Component\Cache\Adapter\FilesystemAdapter;
+use Symfony\Component\Cache\Adapter\ArrayAdapter;
+use Symfony\Component\Cache\Adapter\ChainAdapter;
+use Symfony\Component\Cache\PruneableInterface;
+use Symfony\Component\Cache\Tests\Fixtures\ExternalAdapter;
+
+/**
+ * @author Kévin Dunglas <dunglas@gmail.com>
+ * @group time-sensitive
+ */
+class ChainAdapterTest extends AdapterTestCase
+{
+    public function createCachePool($defaultLifetime = 0)
+    {
+        return new ChainAdapter(array(new ArrayAdapter($defaultLifetime), new ExternalAdapter(), new FilesystemAdapter('', $defaultLifetime)), $defaultLifetime);
+    }
+
+    /**
+     * @expectedException \Symfony\Component\Cache\Exception\InvalidArgumentException
+     * @expectedExceptionMessage At least one adapter must be specified.
+     */
+    public function testEmptyAdaptersException()
+    {
+        new ChainAdapter(array());
+    }
+
+    /**
+     * @expectedException \Symfony\Component\Cache\Exception\InvalidArgumentException
+     * @expectedExceptionMessage The class "stdClass" does not implement
+     */
+    public function testInvalidAdapterException()
+    {
+        new ChainAdapter(array(new \stdClass()));
+    }
+
+    public function testPrune()
+    {
+        if (isset($this->skippedTests[__FUNCTION__])) {
+            $this->markTestSkipped($this->skippedTests[__FUNCTION__]);
+        }
+
+        $cache = new ChainAdapter(array(
+            $this->getPruneableMock(),
+            $this->getNonPruneableMock(),
+            $this->getPruneableMock(),
+        ));
+        $this->assertTrue($cache->prune());
+
+        $cache = new ChainAdapter(array(
+            $this->getPruneableMock(),
+            $this->getFailingPruneableMock(),
+            $this->getPruneableMock(),
+        ));
+        $this->assertFalse($cache->prune());
+    }
+
+    /**
+     * @return \PHPUnit_Framework_MockObject_MockObject|PruneableCacheInterface
+     */
+    private function getPruneableMock()
+    {
+        $pruneable = $this
+            ->getMockBuilder(PruneableCacheInterface::class)
+            ->getMock();
+
+        $pruneable
+            ->expects($this->atLeastOnce())
+            ->method('prune')
+            ->will($this->returnValue(true));
+
+        return $pruneable;
+    }
+
+    /**
+     * @return \PHPUnit_Framework_MockObject_MockObject|PruneableCacheInterface
+     */
+    private function getFailingPruneableMock()
+    {
+        $pruneable = $this
+            ->getMockBuilder(PruneableCacheInterface::class)
+            ->getMock();
+
+        $pruneable
+            ->expects($this->atLeastOnce())
+            ->method('prune')
+            ->will($this->returnValue(false));
+
+        return $pruneable;
+    }
+
+    /**
+     * @return \PHPUnit_Framework_MockObject_MockObject|AdapterInterface
+     */
+    private function getNonPruneableMock()
+    {
+        return $this
+            ->getMockBuilder(AdapterInterface::class)
+            ->getMock();
+    }
+}
+
+interface PruneableCacheInterface extends PruneableInterface, AdapterInterface
+{
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Tests/Adapter/DoctrineAdapterTest.php b/advancedcontentfilter/vendor/symfony/cache/Tests/Adapter/DoctrineAdapterTest.php
new file mode 100644 (file)
index 0000000..8d4dfe2
--- /dev/null
@@ -0,0 +1,32 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Tests\Adapter;
+
+use Symfony\Component\Cache\Adapter\DoctrineAdapter;
+use Symfony\Component\Cache\Tests\Fixtures\ArrayCache;
+
+/**
+ * @group time-sensitive
+ */
+class DoctrineAdapterTest extends AdapterTestCase
+{
+    protected $skippedTests = array(
+        'testDeferredSaveWithoutCommit' => 'Assumes a shared cache which ArrayCache is not.',
+        'testSaveWithoutExpire' => 'Assumes a shared cache which ArrayCache is not.',
+        'testNotUnserializable' => 'ArrayCache does not use serialize/unserialize',
+    );
+
+    public function createCachePool($defaultLifetime = 0)
+    {
+        return new DoctrineAdapter(new ArrayCache($defaultLifetime), '', $defaultLifetime);
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Tests/Adapter/FilesystemAdapterTest.php b/advancedcontentfilter/vendor/symfony/cache/Tests/Adapter/FilesystemAdapterTest.php
new file mode 100644 (file)
index 0000000..b675751
--- /dev/null
@@ -0,0 +1,61 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Tests\Adapter;
+
+use Psr\Cache\CacheItemPoolInterface;
+use Symfony\Component\Cache\Adapter\FilesystemAdapter;
+
+/**
+ * @group time-sensitive
+ */
+class FilesystemAdapterTest extends AdapterTestCase
+{
+    public function createCachePool($defaultLifetime = 0)
+    {
+        return new FilesystemAdapter('', $defaultLifetime);
+    }
+
+    public static function tearDownAfterClass()
+    {
+        self::rmdir(sys_get_temp_dir().'/symfony-cache');
+    }
+
+    public static function rmdir($dir)
+    {
+        if (!file_exists($dir)) {
+            return;
+        }
+        if (!$dir || 0 !== strpos(dirname($dir), sys_get_temp_dir())) {
+            throw new \Exception(__METHOD__."() operates only on subdirs of system's temp dir");
+        }
+        $children = new \RecursiveIteratorIterator(
+            new \RecursiveDirectoryIterator($dir, \RecursiveDirectoryIterator::SKIP_DOTS),
+            \RecursiveIteratorIterator::CHILD_FIRST
+        );
+        foreach ($children as $child) {
+            if ($child->isDir()) {
+                rmdir($child);
+            } else {
+                unlink($child);
+            }
+        }
+        rmdir($dir);
+    }
+
+    protected function isPruned(CacheItemPoolInterface $cache, $name)
+    {
+        $getFileMethod = (new \ReflectionObject($cache))->getMethod('getFile');
+        $getFileMethod->setAccessible(true);
+
+        return !file_exists($getFileMethod->invoke($cache, $name));
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Tests/Adapter/MaxIdLengthAdapterTest.php b/advancedcontentfilter/vendor/symfony/cache/Tests/Adapter/MaxIdLengthAdapterTest.php
new file mode 100644 (file)
index 0000000..cf2384c
--- /dev/null
@@ -0,0 +1,57 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Tests\Adapter;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\Cache\Adapter\AbstractAdapter;
+
+class MaxIdLengthAdapterTest extends TestCase
+{
+    public function testLongKey()
+    {
+        $cache = $this->getMockBuilder(MaxIdLengthAdapter::class)
+            ->setConstructorArgs(array(str_repeat('-', 10)))
+            ->setMethods(array('doHave', 'doFetch', 'doDelete', 'doSave', 'doClear'))
+            ->getMock();
+
+        $cache->expects($this->exactly(2))
+            ->method('doHave')
+            ->withConsecutive(
+                array($this->equalTo('----------:0GTYWa9n4ed8vqNlOT2iEr:')),
+                array($this->equalTo('----------:---------------------------------------'))
+            );
+
+        $cache->hasItem(str_repeat('-', 40));
+        $cache->hasItem(str_repeat('-', 39));
+    }
+
+    /**
+     * @expectedException \Symfony\Component\Cache\Exception\InvalidArgumentException
+     * @expectedExceptionMessage Namespace must be 26 chars max, 40 given ("----------------------------------------")
+     */
+    public function testTooLongNamespace()
+    {
+        $cache = $this->getMockBuilder(MaxIdLengthAdapter::class)
+            ->setConstructorArgs(array(str_repeat('-', 40)))
+            ->getMock();
+    }
+}
+
+abstract class MaxIdLengthAdapter extends AbstractAdapter
+{
+    protected $maxIdLength = 50;
+
+    public function __construct($ns)
+    {
+        parent::__construct($ns);
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Tests/Adapter/MemcachedAdapterTest.php b/advancedcontentfilter/vendor/symfony/cache/Tests/Adapter/MemcachedAdapterTest.php
new file mode 100644 (file)
index 0000000..76e0608
--- /dev/null
@@ -0,0 +1,194 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Tests\Adapter;
+
+use Symfony\Component\Cache\Adapter\AbstractAdapter;
+use Symfony\Component\Cache\Adapter\MemcachedAdapter;
+
+class MemcachedAdapterTest extends AdapterTestCase
+{
+    protected $skippedTests = array(
+        'testHasItemReturnsFalseWhenDeferredItemIsExpired' => 'Testing expiration slows down the test suite',
+        'testDefaultLifeTime' => 'Testing expiration slows down the test suite',
+    );
+
+    protected static $client;
+
+    public static function setupBeforeClass()
+    {
+        if (!MemcachedAdapter::isSupported()) {
+            self::markTestSkipped('Extension memcached >=2.2.0 required.');
+        }
+        self::$client = AbstractAdapter::createConnection('memcached://'.getenv('MEMCACHED_HOST'), array('binary_protocol' => false));
+        self::$client->get('foo');
+        $code = self::$client->getResultCode();
+
+        if (\Memcached::RES_SUCCESS !== $code && \Memcached::RES_NOTFOUND !== $code) {
+            self::markTestSkipped('Memcached error: '.strtolower(self::$client->getResultMessage()));
+        }
+    }
+
+    public function createCachePool($defaultLifetime = 0)
+    {
+        $client = $defaultLifetime ? AbstractAdapter::createConnection('memcached://'.getenv('MEMCACHED_HOST')) : self::$client;
+
+        return new MemcachedAdapter($client, str_replace('\\', '.', __CLASS__), $defaultLifetime);
+    }
+
+    public function testOptions()
+    {
+        $client = MemcachedAdapter::createConnection(array(), array(
+            'libketama_compatible' => false,
+            'distribution' => 'modula',
+            'compression' => true,
+            'serializer' => 'php',
+            'hash' => 'md5',
+        ));
+
+        $this->assertSame(\Memcached::SERIALIZER_PHP, $client->getOption(\Memcached::OPT_SERIALIZER));
+        $this->assertSame(\Memcached::HASH_MD5, $client->getOption(\Memcached::OPT_HASH));
+        $this->assertTrue($client->getOption(\Memcached::OPT_COMPRESSION));
+        $this->assertSame(0, $client->getOption(\Memcached::OPT_LIBKETAMA_COMPATIBLE));
+        $this->assertSame(\Memcached::DISTRIBUTION_MODULA, $client->getOption(\Memcached::OPT_DISTRIBUTION));
+    }
+
+    /**
+     * @dataProvider provideBadOptions
+     * @expectedException \ErrorException
+     * @expectedExceptionMessage constant(): Couldn't find constant Memcached::
+     */
+    public function testBadOptions($name, $value)
+    {
+        MemcachedAdapter::createConnection(array(), array($name => $value));
+    }
+
+    public function provideBadOptions()
+    {
+        return array(
+            array('foo', 'bar'),
+            array('hash', 'zyx'),
+            array('serializer', 'zyx'),
+            array('distribution', 'zyx'),
+        );
+    }
+
+    public function testDefaultOptions()
+    {
+        $this->assertTrue(MemcachedAdapter::isSupported());
+
+        $client = MemcachedAdapter::createConnection(array());
+
+        $this->assertTrue($client->getOption(\Memcached::OPT_COMPRESSION));
+        $this->assertSame(1, $client->getOption(\Memcached::OPT_BINARY_PROTOCOL));
+        $this->assertSame(1, $client->getOption(\Memcached::OPT_LIBKETAMA_COMPATIBLE));
+    }
+
+    /**
+     * @expectedException \Symfony\Component\Cache\Exception\CacheException
+     * @expectedExceptionMessage MemcachedAdapter: "serializer" option must be "php" or "igbinary".
+     */
+    public function testOptionSerializer()
+    {
+        if (!\Memcached::HAVE_JSON) {
+            $this->markTestSkipped('Memcached::HAVE_JSON required');
+        }
+
+        new MemcachedAdapter(MemcachedAdapter::createConnection(array(), array('serializer' => 'json')));
+    }
+
+    /**
+     * @dataProvider provideServersSetting
+     */
+    public function testServersSetting($dsn, $host, $port)
+    {
+        $client1 = MemcachedAdapter::createConnection($dsn);
+        $client2 = MemcachedAdapter::createConnection(array($dsn));
+        $client3 = MemcachedAdapter::createConnection(array(array($host, $port)));
+        $expect = array(
+            'host' => $host,
+            'port' => $port,
+        );
+
+        $f = function ($s) { return array('host' => $s['host'], 'port' => $s['port']); };
+        $this->assertSame(array($expect), array_map($f, $client1->getServerList()));
+        $this->assertSame(array($expect), array_map($f, $client2->getServerList()));
+        $this->assertSame(array($expect), array_map($f, $client3->getServerList()));
+    }
+
+    public function provideServersSetting()
+    {
+        yield array(
+            'memcached://127.0.0.1/50',
+            '127.0.0.1',
+            11211,
+        );
+        yield array(
+            'memcached://localhost:11222?weight=25',
+            'localhost',
+            11222,
+        );
+        if (ini_get('memcached.use_sasl')) {
+            yield array(
+                'memcached://user:password@127.0.0.1?weight=50',
+                '127.0.0.1',
+                11211,
+            );
+        }
+        yield array(
+            'memcached:///var/run/memcached.sock?weight=25',
+            '/var/run/memcached.sock',
+            0,
+        );
+        yield array(
+            'memcached:///var/local/run/memcached.socket?weight=25',
+            '/var/local/run/memcached.socket',
+            0,
+        );
+        if (ini_get('memcached.use_sasl')) {
+            yield array(
+                'memcached://user:password@/var/local/run/memcached.socket?weight=25',
+                '/var/local/run/memcached.socket',
+                0,
+            );
+        }
+    }
+
+    /**
+     * @dataProvider provideDsnWithOptions
+     */
+    public function testDsnWithOptions($dsn, array $options, array $expectedOptions)
+    {
+        $client = MemcachedAdapter::createConnection($dsn, $options);
+
+        foreach ($expectedOptions as $option => $expect) {
+            $this->assertSame($expect, $client->getOption($option));
+        }
+    }
+
+    public function provideDsnWithOptions()
+    {
+        if (!class_exists('\Memcached')) {
+            self::markTestSkipped('Extension memcached required.');
+        }
+
+        yield array(
+            'memcached://localhost:11222?retry_timeout=10',
+            array(\Memcached::OPT_RETRY_TIMEOUT => 8),
+            array(\Memcached::OPT_RETRY_TIMEOUT => 10),
+        );
+        yield array(
+            'memcached://localhost:11222?socket_recv_size=1&socket_send_size=2',
+            array(\Memcached::OPT_RETRY_TIMEOUT => 8),
+            array(\Memcached::OPT_SOCKET_RECV_SIZE => 1, \Memcached::OPT_SOCKET_SEND_SIZE => 2, \Memcached::OPT_RETRY_TIMEOUT => 8),
+        );
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Tests/Adapter/NamespacedProxyAdapterTest.php b/advancedcontentfilter/vendor/symfony/cache/Tests/Adapter/NamespacedProxyAdapterTest.php
new file mode 100644 (file)
index 0000000..c271403
--- /dev/null
@@ -0,0 +1,26 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Tests\Adapter;
+
+use Symfony\Component\Cache\Adapter\ArrayAdapter;
+use Symfony\Component\Cache\Adapter\ProxyAdapter;
+
+/**
+ * @group time-sensitive
+ */
+class NamespacedProxyAdapterTest extends ProxyAdapterTest
+{
+    public function createCachePool($defaultLifetime = 0)
+    {
+        return new ProxyAdapter(new ArrayAdapter($defaultLifetime), 'foo', $defaultLifetime);
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Tests/Adapter/NullAdapterTest.php b/advancedcontentfilter/vendor/symfony/cache/Tests/Adapter/NullAdapterTest.php
new file mode 100644 (file)
index 0000000..73e5cad
--- /dev/null
@@ -0,0 +1,128 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Tests\Adapter;
+
+use PHPUnit\Framework\TestCase;
+use Psr\Cache\CacheItemInterface;
+use Symfony\Component\Cache\Adapter\NullAdapter;
+
+/**
+ * @group time-sensitive
+ */
+class NullAdapterTest extends TestCase
+{
+    public function createCachePool()
+    {
+        return new NullAdapter();
+    }
+
+    public function testGetItem()
+    {
+        $adapter = $this->createCachePool();
+
+        $item = $adapter->getItem('key');
+        $this->assertFalse($item->isHit());
+        $this->assertNull($item->get(), "Item's value must be null when isHit is false.");
+    }
+
+    public function testHasItem()
+    {
+        $this->assertFalse($this->createCachePool()->hasItem('key'));
+    }
+
+    public function testGetItems()
+    {
+        $adapter = $this->createCachePool();
+
+        $keys = array('foo', 'bar', 'baz', 'biz');
+
+        /** @var CacheItemInterface[] $items */
+        $items = $adapter->getItems($keys);
+        $count = 0;
+
+        foreach ($items as $key => $item) {
+            $itemKey = $item->getKey();
+
+            $this->assertEquals($itemKey, $key, 'Keys must be preserved when fetching multiple items');
+            $this->assertContains($key, $keys, 'Cache key can not change.');
+            $this->assertFalse($item->isHit());
+
+            // Remove $key for $keys
+            foreach ($keys as $k => $v) {
+                if ($v === $key) {
+                    unset($keys[$k]);
+                }
+            }
+
+            ++$count;
+        }
+
+        $this->assertSame(4, $count);
+    }
+
+    public function testIsHit()
+    {
+        $adapter = $this->createCachePool();
+
+        $item = $adapter->getItem('key');
+        $this->assertFalse($item->isHit());
+    }
+
+    public function testClear()
+    {
+        $this->assertTrue($this->createCachePool()->clear());
+    }
+
+    public function testDeleteItem()
+    {
+        $this->assertTrue($this->createCachePool()->deleteItem('key'));
+    }
+
+    public function testDeleteItems()
+    {
+        $this->assertTrue($this->createCachePool()->deleteItems(array('key', 'foo', 'bar')));
+    }
+
+    public function testSave()
+    {
+        $adapter = $this->createCachePool();
+
+        $item = $adapter->getItem('key');
+        $this->assertFalse($item->isHit());
+        $this->assertNull($item->get(), "Item's value must be null when isHit is false.");
+
+        $this->assertFalse($adapter->save($item));
+    }
+
+    public function testDeferredSave()
+    {
+        $adapter = $this->createCachePool();
+
+        $item = $adapter->getItem('key');
+        $this->assertFalse($item->isHit());
+        $this->assertNull($item->get(), "Item's value must be null when isHit is false.");
+
+        $this->assertFalse($adapter->saveDeferred($item));
+    }
+
+    public function testCommit()
+    {
+        $adapter = $this->createCachePool();
+
+        $item = $adapter->getItem('key');
+        $this->assertFalse($item->isHit());
+        $this->assertNull($item->get(), "Item's value must be null when isHit is false.");
+
+        $this->assertFalse($adapter->saveDeferred($item));
+        $this->assertFalse($this->createCachePool()->commit());
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Tests/Adapter/PdoAdapterTest.php b/advancedcontentfilter/vendor/symfony/cache/Tests/Adapter/PdoAdapterTest.php
new file mode 100644 (file)
index 0000000..24e3f9b
--- /dev/null
@@ -0,0 +1,73 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Tests\Adapter;
+
+use Symfony\Component\Cache\Adapter\PdoAdapter;
+use Symfony\Component\Cache\Tests\Traits\PdoPruneableTrait;
+
+/**
+ * @group time-sensitive
+ */
+class PdoAdapterTest extends AdapterTestCase
+{
+    use PdoPruneableTrait;
+
+    protected static $dbFile;
+
+    public static function setupBeforeClass()
+    {
+        if (!extension_loaded('pdo_sqlite')) {
+            self::markTestSkipped('Extension pdo_sqlite required.');
+        }
+
+        self::$dbFile = tempnam(sys_get_temp_dir(), 'sf_sqlite_cache');
+
+        $pool = new PdoAdapter('sqlite:'.self::$dbFile);
+        $pool->createTable();
+    }
+
+    public static function tearDownAfterClass()
+    {
+        @unlink(self::$dbFile);
+    }
+
+    public function createCachePool($defaultLifetime = 0)
+    {
+        return new PdoAdapter('sqlite:'.self::$dbFile, 'ns', $defaultLifetime);
+    }
+
+    public function testCleanupExpiredItems()
+    {
+        $pdo = new \PDO('sqlite:'.self::$dbFile);
+
+        $getCacheItemCount = function () use ($pdo) {
+            return (int) $pdo->query('SELECT COUNT(*) FROM cache_items')->fetch(\PDO::FETCH_COLUMN);
+        };
+
+        $this->assertSame(0, $getCacheItemCount());
+
+        $cache = $this->createCachePool();
+
+        $item = $cache->getItem('some_nice_key');
+        $item->expiresAfter(1);
+        $item->set(1);
+
+        $cache->save($item);
+        $this->assertSame(1, $getCacheItemCount());
+
+        sleep(2);
+
+        $newItem = $cache->getItem($item->getKey());
+        $this->assertFalse($newItem->isHit());
+        $this->assertSame(0, $getCacheItemCount(), 'PDOAdapter must clean up expired items');
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Tests/Adapter/PdoDbalAdapterTest.php b/advancedcontentfilter/vendor/symfony/cache/Tests/Adapter/PdoDbalAdapterTest.php
new file mode 100644 (file)
index 0000000..1e8c615
--- /dev/null
@@ -0,0 +1,48 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Tests\Adapter;
+
+use Doctrine\DBAL\DriverManager;
+use Symfony\Component\Cache\Adapter\PdoAdapter;
+use Symfony\Component\Cache\Tests\Traits\PdoPruneableTrait;
+
+/**
+ * @group time-sensitive
+ */
+class PdoDbalAdapterTest extends AdapterTestCase
+{
+    use PdoPruneableTrait;
+
+    protected static $dbFile;
+
+    public static function setupBeforeClass()
+    {
+        if (!extension_loaded('pdo_sqlite')) {
+            self::markTestSkipped('Extension pdo_sqlite required.');
+        }
+
+        self::$dbFile = tempnam(sys_get_temp_dir(), 'sf_sqlite_cache');
+
+        $pool = new PdoAdapter(DriverManager::getConnection(array('driver' => 'pdo_sqlite', 'path' => self::$dbFile)));
+        $pool->createTable();
+    }
+
+    public static function tearDownAfterClass()
+    {
+        @unlink(self::$dbFile);
+    }
+
+    public function createCachePool($defaultLifetime = 0)
+    {
+        return new PdoAdapter(DriverManager::getConnection(array('driver' => 'pdo_sqlite', 'path' => self::$dbFile)), '', $defaultLifetime);
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Tests/Adapter/PhpArrayAdapterTest.php b/advancedcontentfilter/vendor/symfony/cache/Tests/Adapter/PhpArrayAdapterTest.php
new file mode 100644 (file)
index 0000000..14b6126
--- /dev/null
@@ -0,0 +1,133 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Tests\Adapter;
+
+use Psr\Cache\CacheItemInterface;
+use Symfony\Component\Cache\Adapter\NullAdapter;
+use Symfony\Component\Cache\Adapter\PhpArrayAdapter;
+
+/**
+ * @group time-sensitive
+ */
+class PhpArrayAdapterTest extends AdapterTestCase
+{
+    protected $skippedTests = array(
+        'testBasicUsage' => 'PhpArrayAdapter is read-only.',
+        'testBasicUsageWithLongKey' => 'PhpArrayAdapter is read-only.',
+        'testClear' => 'PhpArrayAdapter is read-only.',
+        'testClearWithDeferredItems' => 'PhpArrayAdapter is read-only.',
+        'testDeleteItem' => 'PhpArrayAdapter is read-only.',
+        'testSaveExpired' => 'PhpArrayAdapter is read-only.',
+        'testSaveWithoutExpire' => 'PhpArrayAdapter is read-only.',
+        'testDeferredSave' => 'PhpArrayAdapter is read-only.',
+        'testDeferredSaveWithoutCommit' => 'PhpArrayAdapter is read-only.',
+        'testDeleteItems' => 'PhpArrayAdapter is read-only.',
+        'testDeleteDeferredItem' => 'PhpArrayAdapter is read-only.',
+        'testCommit' => 'PhpArrayAdapter is read-only.',
+        'testSaveDeferredWhenChangingValues' => 'PhpArrayAdapter is read-only.',
+        'testSaveDeferredOverwrite' => 'PhpArrayAdapter is read-only.',
+        'testIsHitDeferred' => 'PhpArrayAdapter is read-only.',
+
+        'testExpiresAt' => 'PhpArrayAdapter does not support expiration.',
+        'testExpiresAtWithNull' => 'PhpArrayAdapter does not support expiration.',
+        'testExpiresAfterWithNull' => 'PhpArrayAdapter does not support expiration.',
+        'testDeferredExpired' => 'PhpArrayAdapter does not support expiration.',
+        'testExpiration' => 'PhpArrayAdapter does not support expiration.',
+
+        'testGetItemInvalidKeys' => 'PhpArrayAdapter does not throw exceptions on invalid key.',
+        'testGetItemsInvalidKeys' => 'PhpArrayAdapter does not throw exceptions on invalid key.',
+        'testHasItemInvalidKeys' => 'PhpArrayAdapter does not throw exceptions on invalid key.',
+        'testDeleteItemInvalidKeys' => 'PhpArrayAdapter does not throw exceptions on invalid key.',
+        'testDeleteItemsInvalidKeys' => 'PhpArrayAdapter does not throw exceptions on invalid key.',
+
+        'testDefaultLifeTime' => 'PhpArrayAdapter does not allow configuring a default lifetime.',
+        'testPrune' => 'PhpArrayAdapter just proxies',
+    );
+
+    protected static $file;
+
+    public static function setupBeforeClass()
+    {
+        self::$file = sys_get_temp_dir().'/symfony-cache/php-array-adapter-test.php';
+    }
+
+    protected function tearDown()
+    {
+        if (file_exists(sys_get_temp_dir().'/symfony-cache')) {
+            FilesystemAdapterTest::rmdir(sys_get_temp_dir().'/symfony-cache');
+        }
+    }
+
+    public function createCachePool()
+    {
+        return new PhpArrayAdapterWrapper(self::$file, new NullAdapter());
+    }
+
+    public function testStore()
+    {
+        $arrayWithRefs = array();
+        $arrayWithRefs[0] = 123;
+        $arrayWithRefs[1] = &$arrayWithRefs[0];
+
+        $object = (object) array(
+            'foo' => 'bar',
+            'foo2' => 'bar2',
+        );
+
+        $expected = array(
+            'null' => null,
+            'serializedString' => serialize($object),
+            'arrayWithRefs' => $arrayWithRefs,
+            'object' => $object,
+            'arrayWithObject' => array('bar' => $object),
+        );
+
+        $adapter = $this->createCachePool();
+        $adapter->warmUp($expected);
+
+        foreach ($expected as $key => $value) {
+            $this->assertSame(serialize($value), serialize($adapter->getItem($key)->get()), 'Warm up should create a PHP file that OPCache can load in memory');
+        }
+    }
+
+    public function testStoredFile()
+    {
+        $expected = array(
+            'integer' => 42,
+            'float' => 42.42,
+            'boolean' => true,
+            'array_simple' => array('foo', 'bar'),
+            'array_associative' => array('foo' => 'bar', 'foo2' => 'bar2'),
+        );
+
+        $adapter = $this->createCachePool();
+        $adapter->warmUp($expected);
+
+        $values = eval(substr(file_get_contents(self::$file), 6));
+
+        $this->assertSame($expected, $values, 'Warm up should create a PHP file that OPCache can load in memory');
+    }
+}
+
+class PhpArrayAdapterWrapper extends PhpArrayAdapter
+{
+    public function save(CacheItemInterface $item)
+    {
+        call_user_func(\Closure::bind(function () use ($item) {
+            $this->values[$item->getKey()] = $item->get();
+            $this->warmUp($this->values);
+            $this->values = eval(substr(file_get_contents($this->file), 6));
+        }, $this, PhpArrayAdapter::class));
+
+        return true;
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Tests/Adapter/PhpArrayAdapterWithFallbackTest.php b/advancedcontentfilter/vendor/symfony/cache/Tests/Adapter/PhpArrayAdapterWithFallbackTest.php
new file mode 100644 (file)
index 0000000..1a23198
--- /dev/null
@@ -0,0 +1,49 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Tests\Adapter;
+
+use Symfony\Component\Cache\Adapter\FilesystemAdapter;
+use Symfony\Component\Cache\Adapter\PhpArrayAdapter;
+
+/**
+ * @group time-sensitive
+ */
+class PhpArrayAdapterWithFallbackTest extends AdapterTestCase
+{
+    protected $skippedTests = array(
+        'testGetItemInvalidKeys' => 'PhpArrayAdapter does not throw exceptions on invalid key.',
+        'testGetItemsInvalidKeys' => 'PhpArrayAdapter does not throw exceptions on invalid key.',
+        'testHasItemInvalidKeys' => 'PhpArrayAdapter does not throw exceptions on invalid key.',
+        'testDeleteItemInvalidKeys' => 'PhpArrayAdapter does not throw exceptions on invalid key.',
+        'testDeleteItemsInvalidKeys' => 'PhpArrayAdapter does not throw exceptions on invalid key.',
+        'testPrune' => 'PhpArrayAdapter just proxies',
+    );
+
+    protected static $file;
+
+    public static function setupBeforeClass()
+    {
+        self::$file = sys_get_temp_dir().'/symfony-cache/php-array-adapter-test.php';
+    }
+
+    protected function tearDown()
+    {
+        if (file_exists(sys_get_temp_dir().'/symfony-cache')) {
+            FilesystemAdapterTest::rmdir(sys_get_temp_dir().'/symfony-cache');
+        }
+    }
+
+    public function createCachePool($defaultLifetime = 0)
+    {
+        return new PhpArrayAdapter(self::$file, new FilesystemAdapter('php-array-fallback', $defaultLifetime));
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Tests/Adapter/PhpFilesAdapterTest.php b/advancedcontentfilter/vendor/symfony/cache/Tests/Adapter/PhpFilesAdapterTest.php
new file mode 100644 (file)
index 0000000..8e93c93
--- /dev/null
@@ -0,0 +1,47 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Tests\Adapter;
+
+use Psr\Cache\CacheItemPoolInterface;
+use Symfony\Component\Cache\Adapter\PhpFilesAdapter;
+
+/**
+ * @group time-sensitive
+ */
+class PhpFilesAdapterTest extends AdapterTestCase
+{
+    protected $skippedTests = array(
+        'testDefaultLifeTime' => 'PhpFilesAdapter does not allow configuring a default lifetime.',
+    );
+
+    public function createCachePool()
+    {
+        if (!PhpFilesAdapter::isSupported()) {
+            $this->markTestSkipped('OPcache extension is not enabled.');
+        }
+
+        return new PhpFilesAdapter('sf-cache');
+    }
+
+    public static function tearDownAfterClass()
+    {
+        FilesystemAdapterTest::rmdir(sys_get_temp_dir().'/symfony-cache');
+    }
+
+    protected function isPruned(CacheItemPoolInterface $cache, $name)
+    {
+        $getFileMethod = (new \ReflectionObject($cache))->getMethod('getFile');
+        $getFileMethod->setAccessible(true);
+
+        return !file_exists($getFileMethod->invoke($cache, $name));
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Tests/Adapter/PredisAdapterTest.php b/advancedcontentfilter/vendor/symfony/cache/Tests/Adapter/PredisAdapterTest.php
new file mode 100644 (file)
index 0000000..c005d64
--- /dev/null
@@ -0,0 +1,53 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Tests\Adapter;
+
+use Predis\Connection\StreamConnection;
+use Symfony\Component\Cache\Adapter\RedisAdapter;
+
+class PredisAdapterTest extends AbstractRedisAdapterTest
+{
+    public static function setupBeforeClass()
+    {
+        parent::setupBeforeClass();
+        self::$redis = new \Predis\Client(array('host' => getenv('REDIS_HOST')));
+    }
+
+    public function testCreateConnection()
+    {
+        $redisHost = getenv('REDIS_HOST');
+
+        $redis = RedisAdapter::createConnection('redis://'.$redisHost.'/1', array('class' => \Predis\Client::class, 'timeout' => 3));
+        $this->assertInstanceOf(\Predis\Client::class, $redis);
+
+        $connection = $redis->getConnection();
+        $this->assertInstanceOf(StreamConnection::class, $connection);
+
+        $params = array(
+            'scheme' => 'tcp',
+            'host' => $redisHost,
+            'path' => '',
+            'dbindex' => '1',
+            'port' => 6379,
+            'class' => 'Predis\Client',
+            'timeout' => 3,
+            'persistent' => 0,
+            'persistent_id' => null,
+            'read_timeout' => 0,
+            'retry_interval' => 0,
+            'lazy' => false,
+            'database' => '1',
+            'password' => null,
+        );
+        $this->assertSame($params, $connection->getParameters()->toArray());
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Tests/Adapter/PredisClusterAdapterTest.php b/advancedcontentfilter/vendor/symfony/cache/Tests/Adapter/PredisClusterAdapterTest.php
new file mode 100644 (file)
index 0000000..3891539
--- /dev/null
@@ -0,0 +1,26 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Tests\Adapter;
+
+class PredisClusterAdapterTest extends AbstractRedisAdapterTest
+{
+    public static function setupBeforeClass()
+    {
+        parent::setupBeforeClass();
+        self::$redis = new \Predis\Client(array(array('host' => getenv('REDIS_HOST'))));
+    }
+
+    public static function tearDownAfterClass()
+    {
+        self::$redis = null;
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Tests/Adapter/ProxyAdapterTest.php b/advancedcontentfilter/vendor/symfony/cache/Tests/Adapter/ProxyAdapterTest.php
new file mode 100644 (file)
index 0000000..ff4b9d3
--- /dev/null
@@ -0,0 +1,71 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Tests\Adapter;
+
+use Psr\Cache\CacheItemInterface;
+use Symfony\Component\Cache\Adapter\ArrayAdapter;
+use Symfony\Component\Cache\Adapter\ProxyAdapter;
+use Symfony\Component\Cache\CacheItem;
+
+/**
+ * @group time-sensitive
+ */
+class ProxyAdapterTest extends AdapterTestCase
+{
+    protected $skippedTests = array(
+        'testDeferredSaveWithoutCommit' => 'Assumes a shared cache which ArrayAdapter is not.',
+        'testSaveWithoutExpire' => 'Assumes a shared cache which ArrayAdapter is not.',
+        'testPrune' => 'ProxyAdapter just proxies',
+    );
+
+    public function createCachePool($defaultLifetime = 0)
+    {
+        return new ProxyAdapter(new ArrayAdapter(), '', $defaultLifetime);
+    }
+
+    /**
+     * @expectedException \Exception
+     * @expectedExceptionMessage OK bar
+     */
+    public function testProxyfiedItem()
+    {
+        $item = new CacheItem();
+        $pool = new ProxyAdapter(new TestingArrayAdapter($item));
+
+        $proxyItem = $pool->getItem('foo');
+
+        $this->assertNotSame($item, $proxyItem);
+        $pool->save($proxyItem->set('bar'));
+    }
+}
+
+class TestingArrayAdapter extends ArrayAdapter
+{
+    private $item;
+
+    public function __construct(CacheItemInterface $item)
+    {
+        $this->item = $item;
+    }
+
+    public function getItem($key)
+    {
+        return $this->item;
+    }
+
+    public function save(CacheItemInterface $item)
+    {
+        if ($item === $this->item) {
+            throw new \Exception('OK '.$item->get());
+        }
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Tests/Adapter/RedisAdapterTest.php b/advancedcontentfilter/vendor/symfony/cache/Tests/Adapter/RedisAdapterTest.php
new file mode 100644 (file)
index 0000000..28c310f
--- /dev/null
@@ -0,0 +1,92 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Tests\Adapter;
+
+use Symfony\Component\Cache\Adapter\AbstractAdapter;
+use Symfony\Component\Cache\Adapter\RedisAdapter;
+use Symfony\Component\Cache\Traits\RedisProxy;
+
+class RedisAdapterTest extends AbstractRedisAdapterTest
+{
+    public static function setupBeforeClass()
+    {
+        parent::setupBeforeClass();
+        self::$redis = AbstractAdapter::createConnection('redis://'.getenv('REDIS_HOST'), array('lazy' => true));
+    }
+
+    public function createCachePool($defaultLifetime = 0)
+    {
+        $adapter = parent::createCachePool($defaultLifetime);
+        $this->assertInstanceOf(RedisProxy::class, self::$redis);
+
+        return $adapter;
+    }
+
+    public function testCreateConnection()
+    {
+        $redisHost = getenv('REDIS_HOST');
+
+        $redis = RedisAdapter::createConnection('redis://'.$redisHost);
+        $this->assertInstanceOf(\Redis::class, $redis);
+        $this->assertTrue($redis->isConnected());
+        $this->assertSame(0, $redis->getDbNum());
+
+        $redis = RedisAdapter::createConnection('redis://'.$redisHost.'/2');
+        $this->assertSame(2, $redis->getDbNum());
+
+        $redis = RedisAdapter::createConnection('redis://'.$redisHost, array('timeout' => 3));
+        $this->assertEquals(3, $redis->getTimeout());
+
+        $redis = RedisAdapter::createConnection('redis://'.$redisHost.'?timeout=4');
+        $this->assertEquals(4, $redis->getTimeout());
+
+        $redis = RedisAdapter::createConnection('redis://'.$redisHost, array('read_timeout' => 5));
+        $this->assertEquals(5, $redis->getReadTimeout());
+    }
+
+    /**
+     * @dataProvider provideFailedCreateConnection
+     * @expectedException \Symfony\Component\Cache\Exception\InvalidArgumentException
+     * @expectedExceptionMessage Redis connection failed
+     */
+    public function testFailedCreateConnection($dsn)
+    {
+        RedisAdapter::createConnection($dsn);
+    }
+
+    public function provideFailedCreateConnection()
+    {
+        return array(
+            array('redis://localhost:1234'),
+            array('redis://foo@localhost'),
+            array('redis://localhost/123'),
+        );
+    }
+
+    /**
+     * @dataProvider provideInvalidCreateConnection
+     * @expectedException \Symfony\Component\Cache\Exception\InvalidArgumentException
+     * @expectedExceptionMessage Invalid Redis DSN
+     */
+    public function testInvalidCreateConnection($dsn)
+    {
+        RedisAdapter::createConnection($dsn);
+    }
+
+    public function provideInvalidCreateConnection()
+    {
+        return array(
+            array('foo://localhost'),
+            array('redis://'),
+        );
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Tests/Adapter/RedisArrayAdapterTest.php b/advancedcontentfilter/vendor/symfony/cache/Tests/Adapter/RedisArrayAdapterTest.php
new file mode 100644 (file)
index 0000000..bef3eb8
--- /dev/null
@@ -0,0 +1,24 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Tests\Adapter;
+
+class RedisArrayAdapterTest extends AbstractRedisAdapterTest
+{
+    public static function setupBeforeClass()
+    {
+        parent::setupBeforeClass();
+        if (!class_exists('RedisArray')) {
+            self::markTestSkipped('The RedisArray class is required.');
+        }
+        self::$redis = new \RedisArray(array(getenv('REDIS_HOST')), array('lazy_connect' => true));
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Tests/Adapter/SimpleCacheAdapterTest.php b/advancedcontentfilter/vendor/symfony/cache/Tests/Adapter/SimpleCacheAdapterTest.php
new file mode 100644 (file)
index 0000000..d5795d5
--- /dev/null
@@ -0,0 +1,30 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Tests\Adapter;
+
+use Symfony\Component\Cache\Simple\FilesystemCache;
+use Symfony\Component\Cache\Adapter\SimpleCacheAdapter;
+
+/**
+ * @group time-sensitive
+ */
+class SimpleCacheAdapterTest extends AdapterTestCase
+{
+    protected $skippedTests = array(
+        'testPrune' => 'SimpleCache just proxies',
+    );
+
+    public function createCachePool($defaultLifetime = 0)
+    {
+        return new SimpleCacheAdapter(new FilesystemCache(), '', $defaultLifetime);
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Tests/Adapter/TagAwareAdapterTest.php b/advancedcontentfilter/vendor/symfony/cache/Tests/Adapter/TagAwareAdapterTest.php
new file mode 100644 (file)
index 0000000..0e4e07a
--- /dev/null
@@ -0,0 +1,185 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Tests\Adapter;
+
+use Symfony\Component\Cache\Adapter\AdapterInterface;
+use Symfony\Component\Cache\Adapter\FilesystemAdapter;
+use Symfony\Component\Cache\Adapter\TagAwareAdapter;
+
+/**
+ * @group time-sensitive
+ */
+class TagAwareAdapterTest extends AdapterTestCase
+{
+    public function createCachePool($defaultLifetime = 0)
+    {
+        return new TagAwareAdapter(new FilesystemAdapter('', $defaultLifetime));
+    }
+
+    public static function tearDownAfterClass()
+    {
+        FilesystemAdapterTest::rmdir(sys_get_temp_dir().'/symfony-cache');
+    }
+
+    /**
+     * @expectedException \Psr\Cache\InvalidArgumentException
+     */
+    public function testInvalidTag()
+    {
+        $pool = $this->createCachePool();
+        $item = $pool->getItem('foo');
+        $item->tag(':');
+    }
+
+    public function testInvalidateTags()
+    {
+        $pool = $this->createCachePool();
+
+        $i0 = $pool->getItem('i0');
+        $i1 = $pool->getItem('i1');
+        $i2 = $pool->getItem('i2');
+        $i3 = $pool->getItem('i3');
+        $foo = $pool->getItem('foo');
+
+        $pool->save($i0->tag('bar'));
+        $pool->save($i1->tag('foo'));
+        $pool->save($i2->tag('foo')->tag('bar'));
+        $pool->save($i3->tag('foo')->tag('baz'));
+        $pool->save($foo);
+
+        $pool->invalidateTags(array('bar'));
+
+        $this->assertFalse($pool->getItem('i0')->isHit());
+        $this->assertTrue($pool->getItem('i1')->isHit());
+        $this->assertFalse($pool->getItem('i2')->isHit());
+        $this->assertTrue($pool->getItem('i3')->isHit());
+        $this->assertTrue($pool->getItem('foo')->isHit());
+
+        $pool->invalidateTags(array('foo'));
+
+        $this->assertFalse($pool->getItem('i1')->isHit());
+        $this->assertFalse($pool->getItem('i3')->isHit());
+        $this->assertTrue($pool->getItem('foo')->isHit());
+    }
+
+    public function testTagsAreCleanedOnSave()
+    {
+        $pool = $this->createCachePool();
+
+        $i = $pool->getItem('k');
+        $pool->save($i->tag('foo'));
+
+        $i = $pool->getItem('k');
+        $pool->save($i->tag('bar'));
+
+        $pool->invalidateTags(array('foo'));
+        $this->assertTrue($pool->getItem('k')->isHit());
+    }
+
+    public function testTagsAreCleanedOnDelete()
+    {
+        $pool = $this->createCachePool();
+
+        $i = $pool->getItem('k');
+        $pool->save($i->tag('foo'));
+        $pool->deleteItem('k');
+
+        $pool->save($pool->getItem('k'));
+        $pool->invalidateTags(array('foo'));
+
+        $this->assertTrue($pool->getItem('k')->isHit());
+    }
+
+    public function testTagItemExpiry()
+    {
+        $pool = $this->createCachePool(10);
+
+        $item = $pool->getItem('foo');
+        $item->tag(array('baz'));
+        $item->expiresAfter(100);
+
+        $pool->save($item);
+        $pool->invalidateTags(array('baz'));
+        $this->assertFalse($pool->getItem('foo')->isHit());
+
+        sleep(20);
+
+        $this->assertFalse($pool->getItem('foo')->isHit());
+    }
+
+    public function testGetPreviousTags()
+    {
+        $pool = $this->createCachePool();
+
+        $i = $pool->getItem('k');
+        $pool->save($i->tag('foo'));
+
+        $i = $pool->getItem('k');
+        $this->assertSame(array('foo' => 'foo'), $i->getPreviousTags());
+    }
+
+    public function testPrune()
+    {
+        $cache = new TagAwareAdapter($this->getPruneableMock());
+        $this->assertTrue($cache->prune());
+
+        $cache = new TagAwareAdapter($this->getNonPruneableMock());
+        $this->assertFalse($cache->prune());
+
+        $cache = new TagAwareAdapter($this->getFailingPruneableMock());
+        $this->assertFalse($cache->prune());
+    }
+
+    /**
+     * @return \PHPUnit_Framework_MockObject_MockObject|PruneableCacheInterface
+     */
+    private function getPruneableMock()
+    {
+        $pruneable = $this
+            ->getMockBuilder(PruneableCacheInterface::class)
+            ->getMock();
+
+        $pruneable
+            ->expects($this->atLeastOnce())
+            ->method('prune')
+            ->will($this->returnValue(true));
+
+        return $pruneable;
+    }
+
+    /**
+     * @return \PHPUnit_Framework_MockObject_MockObject|PruneableCacheInterface
+     */
+    private function getFailingPruneableMock()
+    {
+        $pruneable = $this
+            ->getMockBuilder(PruneableCacheInterface::class)
+            ->getMock();
+
+        $pruneable
+            ->expects($this->atLeastOnce())
+            ->method('prune')
+            ->will($this->returnValue(false));
+
+        return $pruneable;
+    }
+
+    /**
+     * @return \PHPUnit_Framework_MockObject_MockObject|AdapterInterface
+     */
+    private function getNonPruneableMock()
+    {
+        return $this
+            ->getMockBuilder(AdapterInterface::class)
+            ->getMock();
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Tests/Adapter/TraceableAdapterTest.php b/advancedcontentfilter/vendor/symfony/cache/Tests/Adapter/TraceableAdapterTest.php
new file mode 100644 (file)
index 0000000..3755e88
--- /dev/null
@@ -0,0 +1,191 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Tests\Adapter;
+
+use Symfony\Component\Cache\Adapter\FilesystemAdapter;
+use Symfony\Component\Cache\Adapter\TraceableAdapter;
+
+/**
+ * @group time-sensitive
+ */
+class TraceableAdapterTest extends AdapterTestCase
+{
+    protected $skippedTests = array(
+        'testPrune' => 'TraceableAdapter just proxies',
+    );
+
+    public function createCachePool($defaultLifetime = 0)
+    {
+        return new TraceableAdapter(new FilesystemAdapter('', $defaultLifetime));
+    }
+
+    public function testGetItemMissTrace()
+    {
+        $pool = $this->createCachePool();
+        $pool->getItem('k');
+        $calls = $pool->getCalls();
+        $this->assertCount(1, $calls);
+
+        $call = $calls[0];
+        $this->assertSame('getItem', $call->name);
+        $this->assertSame(array('k' => false), $call->result);
+        $this->assertSame(0, $call->hits);
+        $this->assertSame(1, $call->misses);
+        $this->assertNotEmpty($call->start);
+        $this->assertNotEmpty($call->end);
+    }
+
+    public function testGetItemHitTrace()
+    {
+        $pool = $this->createCachePool();
+        $item = $pool->getItem('k')->set('foo');
+        $pool->save($item);
+        $pool->getItem('k');
+        $calls = $pool->getCalls();
+        $this->assertCount(3, $calls);
+
+        $call = $calls[2];
+        $this->assertSame(1, $call->hits);
+        $this->assertSame(0, $call->misses);
+    }
+
+    public function testGetItemsMissTrace()
+    {
+        $pool = $this->createCachePool();
+        $arg = array('k0', 'k1');
+        $items = $pool->getItems($arg);
+        foreach ($items as $item) {
+        }
+        $calls = $pool->getCalls();
+        $this->assertCount(1, $calls);
+
+        $call = $calls[0];
+        $this->assertSame('getItems', $call->name);
+        $this->assertSame(array('k0' => false, 'k1' => false), $call->result);
+        $this->assertSame(2, $call->misses);
+        $this->assertNotEmpty($call->start);
+        $this->assertNotEmpty($call->end);
+    }
+
+    public function testHasItemMissTrace()
+    {
+        $pool = $this->createCachePool();
+        $pool->hasItem('k');
+        $calls = $pool->getCalls();
+        $this->assertCount(1, $calls);
+
+        $call = $calls[0];
+        $this->assertSame('hasItem', $call->name);
+        $this->assertSame(array('k' => false), $call->result);
+        $this->assertNotEmpty($call->start);
+        $this->assertNotEmpty($call->end);
+    }
+
+    public function testHasItemHitTrace()
+    {
+        $pool = $this->createCachePool();
+        $item = $pool->getItem('k')->set('foo');
+        $pool->save($item);
+        $pool->hasItem('k');
+        $calls = $pool->getCalls();
+        $this->assertCount(3, $calls);
+
+        $call = $calls[2];
+        $this->assertSame('hasItem', $call->name);
+        $this->assertSame(array('k' => true), $call->result);
+        $this->assertNotEmpty($call->start);
+        $this->assertNotEmpty($call->end);
+    }
+
+    public function testDeleteItemTrace()
+    {
+        $pool = $this->createCachePool();
+        $pool->deleteItem('k');
+        $calls = $pool->getCalls();
+        $this->assertCount(1, $calls);
+
+        $call = $calls[0];
+        $this->assertSame('deleteItem', $call->name);
+        $this->assertSame(array('k' => true), $call->result);
+        $this->assertSame(0, $call->hits);
+        $this->assertSame(0, $call->misses);
+        $this->assertNotEmpty($call->start);
+        $this->assertNotEmpty($call->end);
+    }
+
+    public function testDeleteItemsTrace()
+    {
+        $pool = $this->createCachePool();
+        $arg = array('k0', 'k1');
+        $pool->deleteItems($arg);
+        $calls = $pool->getCalls();
+        $this->assertCount(1, $calls);
+
+        $call = $calls[0];
+        $this->assertSame('deleteItems', $call->name);
+        $this->assertSame(array('keys' => $arg, 'result' => true), $call->result);
+        $this->assertSame(0, $call->hits);
+        $this->assertSame(0, $call->misses);
+        $this->assertNotEmpty($call->start);
+        $this->assertNotEmpty($call->end);
+    }
+
+    public function testSaveTrace()
+    {
+        $pool = $this->createCachePool();
+        $item = $pool->getItem('k')->set('foo');
+        $pool->save($item);
+        $calls = $pool->getCalls();
+        $this->assertCount(2, $calls);
+
+        $call = $calls[1];
+        $this->assertSame('save', $call->name);
+        $this->assertSame(array('k' => true), $call->result);
+        $this->assertSame(0, $call->hits);
+        $this->assertSame(0, $call->misses);
+        $this->assertNotEmpty($call->start);
+        $this->assertNotEmpty($call->end);
+    }
+
+    public function testSaveDeferredTrace()
+    {
+        $pool = $this->createCachePool();
+        $item = $pool->getItem('k')->set('foo');
+        $pool->saveDeferred($item);
+        $calls = $pool->getCalls();
+        $this->assertCount(2, $calls);
+
+        $call = $calls[1];
+        $this->assertSame('saveDeferred', $call->name);
+        $this->assertSame(array('k' => true), $call->result);
+        $this->assertSame(0, $call->hits);
+        $this->assertSame(0, $call->misses);
+        $this->assertNotEmpty($call->start);
+        $this->assertNotEmpty($call->end);
+    }
+
+    public function testCommitTrace()
+    {
+        $pool = $this->createCachePool();
+        $pool->commit();
+        $calls = $pool->getCalls();
+        $this->assertCount(1, $calls);
+
+        $call = $calls[0];
+        $this->assertSame('commit', $call->name);
+        $this->assertTrue($call->result);
+        $this->assertSame(0, $call->hits);
+        $this->assertSame(0, $call->misses);
+        $this->assertNotEmpty($call->start);
+        $this->assertNotEmpty($call->end);
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Tests/Adapter/TraceableTagAwareAdapterTest.php b/advancedcontentfilter/vendor/symfony/cache/Tests/Adapter/TraceableTagAwareAdapterTest.php
new file mode 100644 (file)
index 0000000..9b50bfa
--- /dev/null
@@ -0,0 +1,37 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Tests\Adapter;
+
+use Symfony\Component\Cache\Adapter\FilesystemAdapter;
+use Symfony\Component\Cache\Adapter\TagAwareAdapter;
+use Symfony\Component\Cache\Adapter\TraceableTagAwareAdapter;
+
+/**
+ * @group time-sensitive
+ */
+class TraceableTagAwareAdapterTest extends TraceableAdapterTest
+{
+    public function testInvalidateTags()
+    {
+        $pool = new TraceableTagAwareAdapter(new TagAwareAdapter(new FilesystemAdapter()));
+        $pool->invalidateTags(array('foo'));
+        $calls = $pool->getCalls();
+        $this->assertCount(1, $calls);
+
+        $call = $calls[0];
+        $this->assertSame('invalidateTags', $call->name);
+        $this->assertSame(0, $call->hits);
+        $this->assertSame(0, $call->misses);
+        $this->assertNotEmpty($call->start);
+        $this->assertNotEmpty($call->end);
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Tests/CacheItemTest.php b/advancedcontentfilter/vendor/symfony/cache/Tests/CacheItemTest.php
new file mode 100644 (file)
index 0000000..daca925
--- /dev/null
@@ -0,0 +1,77 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Tests;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\Cache\CacheItem;
+
+class CacheItemTest extends TestCase
+{
+    public function testValidKey()
+    {
+        $this->assertSame('foo', CacheItem::validateKey('foo'));
+    }
+
+    /**
+     * @dataProvider provideInvalidKey
+     * @expectedException \Symfony\Component\Cache\Exception\InvalidArgumentException
+     * @expectedExceptionMessage Cache key
+     */
+    public function testInvalidKey($key)
+    {
+        CacheItem::validateKey($key);
+    }
+
+    public function provideInvalidKey()
+    {
+        return array(
+            array(''),
+            array('{'),
+            array('}'),
+            array('('),
+            array(')'),
+            array('/'),
+            array('\\'),
+            array('@'),
+            array(':'),
+            array(true),
+            array(null),
+            array(1),
+            array(1.1),
+            array(array(array())),
+            array(new \Exception('foo')),
+        );
+    }
+
+    public function testTag()
+    {
+        $item = new CacheItem();
+
+        $this->assertSame($item, $item->tag('foo'));
+        $this->assertSame($item, $item->tag(array('bar', 'baz')));
+
+        call_user_func(\Closure::bind(function () use ($item) {
+            $this->assertSame(array('foo' => 'foo', 'bar' => 'bar', 'baz' => 'baz'), $item->tags);
+        }, $this, CacheItem::class));
+    }
+
+    /**
+     * @dataProvider provideInvalidKey
+     * @expectedException \Symfony\Component\Cache\Exception\InvalidArgumentException
+     * @expectedExceptionMessage Cache tag
+     */
+    public function testInvalidTag($tag)
+    {
+        $item = new CacheItem();
+        $item->tag($tag);
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Tests/DoctrineProviderTest.php b/advancedcontentfilter/vendor/symfony/cache/Tests/DoctrineProviderTest.php
new file mode 100644 (file)
index 0000000..91a5516
--- /dev/null
@@ -0,0 +1,45 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Tests;
+
+use Doctrine\Common\Cache\CacheProvider;
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\Cache\Adapter\ArrayAdapter;
+use Symfony\Component\Cache\DoctrineProvider;
+
+class DoctrineProviderTest extends TestCase
+{
+    public function testProvider()
+    {
+        $pool = new ArrayAdapter();
+        $cache = new DoctrineProvider($pool);
+
+        $this->assertInstanceOf(CacheProvider::class, $cache);
+
+        $key = '{}()/\@:';
+
+        $this->assertTrue($cache->delete($key));
+        $this->assertFalse($cache->contains($key));
+
+        $this->assertTrue($cache->save($key, 'bar'));
+        $this->assertTrue($cache->contains($key));
+        $this->assertSame('bar', $cache->fetch($key));
+
+        $this->assertTrue($cache->delete($key));
+        $this->assertFalse($cache->fetch($key));
+        $this->assertTrue($cache->save($key, 'bar'));
+
+        $cache->flushAll();
+        $this->assertFalse($cache->fetch($key));
+        $this->assertFalse($cache->contains($key));
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Tests/Fixtures/ArrayCache.php b/advancedcontentfilter/vendor/symfony/cache/Tests/Fixtures/ArrayCache.php
new file mode 100644 (file)
index 0000000..1a6157e
--- /dev/null
@@ -0,0 +1,52 @@
+<?php
+
+namespace Symfony\Component\Cache\Tests\Fixtures;
+
+use Doctrine\Common\Cache\CacheProvider;
+
+class ArrayCache extends CacheProvider
+{
+    private $data = array();
+
+    protected function doFetch($id)
+    {
+        return $this->doContains($id) ? $this->data[$id][0] : false;
+    }
+
+    protected function doContains($id)
+    {
+        if (!isset($this->data[$id])) {
+            return false;
+        }
+
+        $expiry = $this->data[$id][1];
+
+        return !$expiry || time() <= $expiry || !$this->doDelete($id);
+    }
+
+    protected function doSave($id, $data, $lifeTime = 0)
+    {
+        $this->data[$id] = array($data, $lifeTime ? time() + $lifeTime : false);
+
+        return true;
+    }
+
+    protected function doDelete($id)
+    {
+        unset($this->data[$id]);
+
+        return true;
+    }
+
+    protected function doFlush()
+    {
+        $this->data = array();
+
+        return true;
+    }
+
+    protected function doGetStats()
+    {
+        return null;
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Tests/Fixtures/ExternalAdapter.php b/advancedcontentfilter/vendor/symfony/cache/Tests/Fixtures/ExternalAdapter.php
new file mode 100644 (file)
index 0000000..493906e
--- /dev/null
@@ -0,0 +1,76 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Tests\Fixtures;
+
+use Psr\Cache\CacheItemInterface;
+use Psr\Cache\CacheItemPoolInterface;
+use Symfony\Component\Cache\Adapter\ArrayAdapter;
+
+/**
+ * Adapter not implementing the {@see \Symfony\Component\Cache\Adapter\AdapterInterface}.
+ *
+ * @author Kévin Dunglas <dunglas@gmail.com>
+ */
+class ExternalAdapter implements CacheItemPoolInterface
+{
+    private $cache;
+
+    public function __construct()
+    {
+        $this->cache = new ArrayAdapter();
+    }
+
+    public function getItem($key)
+    {
+        return $this->cache->getItem($key);
+    }
+
+    public function getItems(array $keys = array())
+    {
+        return $this->cache->getItems($keys);
+    }
+
+    public function hasItem($key)
+    {
+        return $this->cache->hasItem($key);
+    }
+
+    public function clear()
+    {
+        return $this->cache->clear();
+    }
+
+    public function deleteItem($key)
+    {
+        return $this->cache->deleteItem($key);
+    }
+
+    public function deleteItems(array $keys)
+    {
+        return $this->cache->deleteItems($keys);
+    }
+
+    public function save(CacheItemInterface $item)
+    {
+        return $this->cache->save($item);
+    }
+
+    public function saveDeferred(CacheItemInterface $item)
+    {
+        return $this->cache->saveDeferred($item);
+    }
+
+    public function commit()
+    {
+        return $this->cache->commit();
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Tests/Simple/AbstractRedisCacheTest.php b/advancedcontentfilter/vendor/symfony/cache/Tests/Simple/AbstractRedisCacheTest.php
new file mode 100644 (file)
index 0000000..f70f49d
--- /dev/null
@@ -0,0 +1,46 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Tests\Simple;
+
+use Symfony\Component\Cache\Simple\RedisCache;
+
+abstract class AbstractRedisCacheTest extends CacheTestCase
+{
+    protected $skippedTests = array(
+        'testSetTtl' => 'Testing expiration slows down the test suite',
+        'testSetMultipleTtl' => 'Testing expiration slows down the test suite',
+        'testDefaultLifeTime' => 'Testing expiration slows down the test suite',
+    );
+
+    protected static $redis;
+
+    public function createSimpleCache($defaultLifetime = 0)
+    {
+        return new RedisCache(self::$redis, str_replace('\\', '.', __CLASS__), $defaultLifetime);
+    }
+
+    public static function setupBeforeClass()
+    {
+        if (!extension_loaded('redis')) {
+            self::markTestSkipped('Extension redis required.');
+        }
+        if (!@((new \Redis())->connect(getenv('REDIS_HOST')))) {
+            $e = error_get_last();
+            self::markTestSkipped($e['message']);
+        }
+    }
+
+    public static function tearDownAfterClass()
+    {
+        self::$redis = null;
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Tests/Simple/ApcuCacheTest.php b/advancedcontentfilter/vendor/symfony/cache/Tests/Simple/ApcuCacheTest.php
new file mode 100644 (file)
index 0000000..297a417
--- /dev/null
@@ -0,0 +1,35 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Tests\Simple;
+
+use Symfony\Component\Cache\Simple\ApcuCache;
+
+class ApcuCacheTest extends CacheTestCase
+{
+    protected $skippedTests = array(
+        'testSetTtl' => 'Testing expiration slows down the test suite',
+        'testSetMultipleTtl' => 'Testing expiration slows down the test suite',
+        'testDefaultLifeTime' => 'Testing expiration slows down the test suite',
+    );
+
+    public function createSimpleCache($defaultLifetime = 0)
+    {
+        if (!function_exists('apcu_fetch') || !ini_get('apc.enabled') || ('cli' === PHP_SAPI && !ini_get('apc.enable_cli'))) {
+            $this->markTestSkipped('APCu extension is required.');
+        }
+        if ('\\' === DIRECTORY_SEPARATOR) {
+            $this->markTestSkipped('Fails transiently on Windows.');
+        }
+
+        return new ApcuCache(str_replace('\\', '.', __CLASS__), $defaultLifetime);
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Tests/Simple/ArrayCacheTest.php b/advancedcontentfilter/vendor/symfony/cache/Tests/Simple/ArrayCacheTest.php
new file mode 100644 (file)
index 0000000..26c3e14
--- /dev/null
@@ -0,0 +1,25 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Tests\Simple;
+
+use Symfony\Component\Cache\Simple\ArrayCache;
+
+/**
+ * @group time-sensitive
+ */
+class ArrayCacheTest extends CacheTestCase
+{
+    public function createSimpleCache($defaultLifetime = 0)
+    {
+        return new ArrayCache($defaultLifetime);
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Tests/Simple/CacheTestCase.php b/advancedcontentfilter/vendor/symfony/cache/Tests/Simple/CacheTestCase.php
new file mode 100644 (file)
index 0000000..48b9728
--- /dev/null
@@ -0,0 +1,141 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Tests\Simple;
+
+use Cache\IntegrationTests\SimpleCacheTest;
+use Psr\SimpleCache\CacheInterface;
+use Symfony\Component\Cache\PruneableInterface;
+
+abstract class CacheTestCase extends SimpleCacheTest
+{
+    protected function setUp()
+    {
+        parent::setUp();
+
+        if (!array_key_exists('testPrune', $this->skippedTests) && !$this->createSimpleCache() instanceof PruneableInterface) {
+            $this->skippedTests['testPrune'] = 'Not a pruneable cache pool.';
+        }
+    }
+
+    public static function validKeys()
+    {
+        if (defined('HHVM_VERSION')) {
+            return parent::validKeys();
+        }
+
+        return array_merge(parent::validKeys(), array(array("a\0b")));
+    }
+
+    public function testDefaultLifeTime()
+    {
+        if (isset($this->skippedTests[__FUNCTION__])) {
+            $this->markTestSkipped($this->skippedTests[__FUNCTION__]);
+        }
+
+        $cache = $this->createSimpleCache(2);
+
+        $cache->set('key.dlt', 'value');
+        sleep(1);
+
+        $this->assertSame('value', $cache->get('key.dlt'));
+
+        sleep(2);
+        $this->assertNull($cache->get('key.dlt'));
+    }
+
+    public function testNotUnserializable()
+    {
+        if (isset($this->skippedTests[__FUNCTION__])) {
+            $this->markTestSkipped($this->skippedTests[__FUNCTION__]);
+        }
+
+        $cache = $this->createSimpleCache();
+
+        $cache->set('foo', new NotUnserializable());
+
+        $this->assertNull($cache->get('foo'));
+
+        $cache->setMultiple(array('foo' => new NotUnserializable()));
+
+        foreach ($cache->getMultiple(array('foo')) as $value) {
+        }
+        $this->assertNull($value);
+    }
+
+    public function testPrune()
+    {
+        if (isset($this->skippedTests[__FUNCTION__])) {
+            $this->markTestSkipped($this->skippedTests[__FUNCTION__]);
+        }
+
+        if (!method_exists($this, 'isPruned')) {
+            $this->fail('Test classes for pruneable caches must implement `isPruned($cache, $name)` method.');
+        }
+
+        /** @var PruneableInterface|CacheInterface $cache */
+        $cache = $this->createSimpleCache();
+
+        $cache->set('foo', 'foo-val', new \DateInterval('PT05S'));
+        $cache->set('bar', 'bar-val', new \DateInterval('PT10S'));
+        $cache->set('baz', 'baz-val', new \DateInterval('PT15S'));
+        $cache->set('qux', 'qux-val', new \DateInterval('PT20S'));
+
+        sleep(30);
+        $cache->prune();
+        $this->assertTrue($this->isPruned($cache, 'foo'));
+        $this->assertTrue($this->isPruned($cache, 'bar'));
+        $this->assertTrue($this->isPruned($cache, 'baz'));
+        $this->assertTrue($this->isPruned($cache, 'qux'));
+
+        $cache->set('foo', 'foo-val');
+        $cache->set('bar', 'bar-val', new \DateInterval('PT20S'));
+        $cache->set('baz', 'baz-val', new \DateInterval('PT40S'));
+        $cache->set('qux', 'qux-val', new \DateInterval('PT80S'));
+
+        $cache->prune();
+        $this->assertFalse($this->isPruned($cache, 'foo'));
+        $this->assertFalse($this->isPruned($cache, 'bar'));
+        $this->assertFalse($this->isPruned($cache, 'baz'));
+        $this->assertFalse($this->isPruned($cache, 'qux'));
+
+        sleep(30);
+        $cache->prune();
+        $this->assertFalse($this->isPruned($cache, 'foo'));
+        $this->assertTrue($this->isPruned($cache, 'bar'));
+        $this->assertFalse($this->isPruned($cache, 'baz'));
+        $this->assertFalse($this->isPruned($cache, 'qux'));
+
+        sleep(30);
+        $cache->prune();
+        $this->assertFalse($this->isPruned($cache, 'foo'));
+        $this->assertTrue($this->isPruned($cache, 'baz'));
+        $this->assertFalse($this->isPruned($cache, 'qux'));
+
+        sleep(30);
+        $cache->prune();
+        $this->assertFalse($this->isPruned($cache, 'foo'));
+        $this->assertTrue($this->isPruned($cache, 'qux'));
+    }
+}
+
+class NotUnserializable implements \Serializable
+{
+    public function serialize()
+    {
+        return serialize(123);
+    }
+
+    public function unserialize($ser)
+    {
+        throw new \Exception(__CLASS__);
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Tests/Simple/ChainCacheTest.php b/advancedcontentfilter/vendor/symfony/cache/Tests/Simple/ChainCacheTest.php
new file mode 100644 (file)
index 0000000..ab28e3b
--- /dev/null
@@ -0,0 +1,116 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Tests\Simple;
+
+use Psr\SimpleCache\CacheInterface;
+use Symfony\Component\Cache\PruneableInterface;
+use Symfony\Component\Cache\Simple\ArrayCache;
+use Symfony\Component\Cache\Simple\ChainCache;
+use Symfony\Component\Cache\Simple\FilesystemCache;
+
+/**
+ * @group time-sensitive
+ */
+class ChainCacheTest extends CacheTestCase
+{
+    public function createSimpleCache($defaultLifetime = 0)
+    {
+        return new ChainCache(array(new ArrayCache($defaultLifetime), new FilesystemCache('', $defaultLifetime)), $defaultLifetime);
+    }
+
+    /**
+     * @expectedException \Symfony\Component\Cache\Exception\InvalidArgumentException
+     * @expectedExceptionMessage At least one cache must be specified.
+     */
+    public function testEmptyCachesException()
+    {
+        new ChainCache(array());
+    }
+
+    /**
+     * @expectedException \Symfony\Component\Cache\Exception\InvalidArgumentException
+     * @expectedExceptionMessage The class "stdClass" does not implement
+     */
+    public function testInvalidCacheException()
+    {
+        new ChainCache(array(new \stdClass()));
+    }
+
+    public function testPrune()
+    {
+        if (isset($this->skippedTests[__FUNCTION__])) {
+            $this->markTestSkipped($this->skippedTests[__FUNCTION__]);
+        }
+
+        $cache = new ChainCache(array(
+            $this->getPruneableMock(),
+            $this->getNonPruneableMock(),
+            $this->getPruneableMock(),
+        ));
+        $this->assertTrue($cache->prune());
+
+        $cache = new ChainCache(array(
+            $this->getPruneableMock(),
+            $this->getFailingPruneableMock(),
+            $this->getPruneableMock(),
+        ));
+        $this->assertFalse($cache->prune());
+    }
+
+    /**
+     * @return \PHPUnit_Framework_MockObject_MockObject|PruneableCacheInterface
+     */
+    private function getPruneableMock()
+    {
+        $pruneable = $this
+            ->getMockBuilder(PruneableCacheInterface::class)
+            ->getMock();
+
+        $pruneable
+            ->expects($this->atLeastOnce())
+            ->method('prune')
+            ->will($this->returnValue(true));
+
+        return $pruneable;
+    }
+
+    /**
+     * @return \PHPUnit_Framework_MockObject_MockObject|PruneableCacheInterface
+     */
+    private function getFailingPruneableMock()
+    {
+        $pruneable = $this
+            ->getMockBuilder(PruneableCacheInterface::class)
+            ->getMock();
+
+        $pruneable
+            ->expects($this->atLeastOnce())
+            ->method('prune')
+            ->will($this->returnValue(false));
+
+        return $pruneable;
+    }
+
+    /**
+     * @return \PHPUnit_Framework_MockObject_MockObject|CacheInterface
+     */
+    private function getNonPruneableMock()
+    {
+        return $this
+            ->getMockBuilder(CacheInterface::class)
+            ->getMock();
+    }
+}
+
+interface PruneableCacheInterface extends PruneableInterface, CacheInterface
+{
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Tests/Simple/DoctrineCacheTest.php b/advancedcontentfilter/vendor/symfony/cache/Tests/Simple/DoctrineCacheTest.php
new file mode 100644 (file)
index 0000000..127c968
--- /dev/null
@@ -0,0 +1,31 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Tests\Simple;
+
+use Symfony\Component\Cache\Simple\DoctrineCache;
+use Symfony\Component\Cache\Tests\Fixtures\ArrayCache;
+
+/**
+ * @group time-sensitive
+ */
+class DoctrineCacheTest extends CacheTestCase
+{
+    protected $skippedTests = array(
+        'testObjectDoesNotChangeInCache' => 'ArrayCache does not use serialize/unserialize',
+        'testNotUnserializable' => 'ArrayCache does not use serialize/unserialize',
+    );
+
+    public function createSimpleCache($defaultLifetime = 0)
+    {
+        return new DoctrineCache(new ArrayCache($defaultLifetime), '', $defaultLifetime);
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Tests/Simple/FilesystemCacheTest.php b/advancedcontentfilter/vendor/symfony/cache/Tests/Simple/FilesystemCacheTest.php
new file mode 100644 (file)
index 0000000..620305a
--- /dev/null
@@ -0,0 +1,34 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Tests\Simple;
+
+use Psr\SimpleCache\CacheInterface;
+use Symfony\Component\Cache\Simple\FilesystemCache;
+
+/**
+ * @group time-sensitive
+ */
+class FilesystemCacheTest extends CacheTestCase
+{
+    public function createSimpleCache($defaultLifetime = 0)
+    {
+        return new FilesystemCache('', $defaultLifetime);
+    }
+
+    protected function isPruned(CacheInterface $cache, $name)
+    {
+        $getFileMethod = (new \ReflectionObject($cache))->getMethod('getFile');
+        $getFileMethod->setAccessible(true);
+
+        return !file_exists($getFileMethod->invoke($cache, $name));
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Tests/Simple/MemcachedCacheTest.php b/advancedcontentfilter/vendor/symfony/cache/Tests/Simple/MemcachedCacheTest.php
new file mode 100644 (file)
index 0000000..c4af891
--- /dev/null
@@ -0,0 +1,165 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Tests\Simple;
+
+use Symfony\Component\Cache\Adapter\AbstractAdapter;
+use Symfony\Component\Cache\Simple\MemcachedCache;
+
+class MemcachedCacheTest extends CacheTestCase
+{
+    protected $skippedTests = array(
+        'testSetTtl' => 'Testing expiration slows down the test suite',
+        'testSetMultipleTtl' => 'Testing expiration slows down the test suite',
+        'testDefaultLifeTime' => 'Testing expiration slows down the test suite',
+    );
+
+    protected static $client;
+
+    public static function setupBeforeClass()
+    {
+        if (!MemcachedCache::isSupported()) {
+            self::markTestSkipped('Extension memcached >=2.2.0 required.');
+        }
+        self::$client = AbstractAdapter::createConnection('memcached://'.getenv('MEMCACHED_HOST'));
+        self::$client->get('foo');
+        $code = self::$client->getResultCode();
+
+        if (\Memcached::RES_SUCCESS !== $code && \Memcached::RES_NOTFOUND !== $code) {
+            self::markTestSkipped('Memcached error: '.strtolower(self::$client->getResultMessage()));
+        }
+    }
+
+    public function createSimpleCache($defaultLifetime = 0)
+    {
+        $client = $defaultLifetime ? AbstractAdapter::createConnection('memcached://'.getenv('MEMCACHED_HOST'), array('binary_protocol' => false)) : self::$client;
+
+        return new MemcachedCache($client, str_replace('\\', '.', __CLASS__), $defaultLifetime);
+    }
+
+    public function testOptions()
+    {
+        $client = MemcachedCache::createConnection(array(), array(
+            'libketama_compatible' => false,
+            'distribution' => 'modula',
+            'compression' => true,
+            'serializer' => 'php',
+            'hash' => 'md5',
+        ));
+
+        $this->assertSame(\Memcached::SERIALIZER_PHP, $client->getOption(\Memcached::OPT_SERIALIZER));
+        $this->assertSame(\Memcached::HASH_MD5, $client->getOption(\Memcached::OPT_HASH));
+        $this->assertTrue($client->getOption(\Memcached::OPT_COMPRESSION));
+        $this->assertSame(0, $client->getOption(\Memcached::OPT_LIBKETAMA_COMPATIBLE));
+        $this->assertSame(\Memcached::DISTRIBUTION_MODULA, $client->getOption(\Memcached::OPT_DISTRIBUTION));
+    }
+
+    /**
+     * @dataProvider provideBadOptions
+     * @expectedException \ErrorException
+     * @expectedExceptionMessage constant(): Couldn't find constant Memcached::
+     */
+    public function testBadOptions($name, $value)
+    {
+        MemcachedCache::createConnection(array(), array($name => $value));
+    }
+
+    public function provideBadOptions()
+    {
+        return array(
+            array('foo', 'bar'),
+            array('hash', 'zyx'),
+            array('serializer', 'zyx'),
+            array('distribution', 'zyx'),
+        );
+    }
+
+    public function testDefaultOptions()
+    {
+        $this->assertTrue(MemcachedCache::isSupported());
+
+        $client = MemcachedCache::createConnection(array());
+
+        $this->assertTrue($client->getOption(\Memcached::OPT_COMPRESSION));
+        $this->assertSame(1, $client->getOption(\Memcached::OPT_BINARY_PROTOCOL));
+        $this->assertSame(1, $client->getOption(\Memcached::OPT_LIBKETAMA_COMPATIBLE));
+    }
+
+    /**
+     * @expectedException \Symfony\Component\Cache\Exception\CacheException
+     * @expectedExceptionMessage MemcachedAdapter: "serializer" option must be "php" or "igbinary".
+     */
+    public function testOptionSerializer()
+    {
+        if (!\Memcached::HAVE_JSON) {
+            $this->markTestSkipped('Memcached::HAVE_JSON required');
+        }
+
+        new MemcachedCache(MemcachedCache::createConnection(array(), array('serializer' => 'json')));
+    }
+
+    /**
+     * @dataProvider provideServersSetting
+     */
+    public function testServersSetting($dsn, $host, $port)
+    {
+        $client1 = MemcachedCache::createConnection($dsn);
+        $client2 = MemcachedCache::createConnection(array($dsn));
+        $client3 = MemcachedCache::createConnection(array(array($host, $port)));
+        $expect = array(
+            'host' => $host,
+            'port' => $port,
+        );
+
+        $f = function ($s) { return array('host' => $s['host'], 'port' => $s['port']); };
+        $this->assertSame(array($expect), array_map($f, $client1->getServerList()));
+        $this->assertSame(array($expect), array_map($f, $client2->getServerList()));
+        $this->assertSame(array($expect), array_map($f, $client3->getServerList()));
+    }
+
+    public function provideServersSetting()
+    {
+        yield array(
+            'memcached://127.0.0.1/50',
+            '127.0.0.1',
+            11211,
+        );
+        yield array(
+            'memcached://localhost:11222?weight=25',
+            'localhost',
+            11222,
+        );
+        if (ini_get('memcached.use_sasl')) {
+            yield array(
+                'memcached://user:password@127.0.0.1?weight=50',
+                '127.0.0.1',
+                11211,
+            );
+        }
+        yield array(
+            'memcached:///var/run/memcached.sock?weight=25',
+            '/var/run/memcached.sock',
+            0,
+        );
+        yield array(
+            'memcached:///var/local/run/memcached.socket?weight=25',
+            '/var/local/run/memcached.socket',
+            0,
+        );
+        if (ini_get('memcached.use_sasl')) {
+            yield array(
+                'memcached://user:password@/var/local/run/memcached.socket?weight=25',
+                '/var/local/run/memcached.socket',
+                0,
+            );
+        }
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Tests/Simple/NullCacheTest.php b/advancedcontentfilter/vendor/symfony/cache/Tests/Simple/NullCacheTest.php
new file mode 100644 (file)
index 0000000..7b760fd
--- /dev/null
@@ -0,0 +1,96 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Tests\Simple;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\Cache\Simple\NullCache;
+
+/**
+ * @group time-sensitive
+ */
+class NullCacheTest extends TestCase
+{
+    public function createCachePool()
+    {
+        return new NullCache();
+    }
+
+    public function testGetItem()
+    {
+        $cache = $this->createCachePool();
+
+        $this->assertNull($cache->get('key'));
+    }
+
+    public function testHas()
+    {
+        $this->assertFalse($this->createCachePool()->has('key'));
+    }
+
+    public function testGetMultiple()
+    {
+        $cache = $this->createCachePool();
+
+        $keys = array('foo', 'bar', 'baz', 'biz');
+
+        $default = new \stdClass();
+        $items = $cache->getMultiple($keys, $default);
+        $count = 0;
+
+        foreach ($items as $key => $item) {
+            $this->assertContains($key, $keys, 'Cache key can not change.');
+            $this->assertSame($default, $item);
+
+            // Remove $key for $keys
+            foreach ($keys as $k => $v) {
+                if ($v === $key) {
+                    unset($keys[$k]);
+                }
+            }
+
+            ++$count;
+        }
+
+        $this->assertSame(4, $count);
+    }
+
+    public function testClear()
+    {
+        $this->assertTrue($this->createCachePool()->clear());
+    }
+
+    public function testDelete()
+    {
+        $this->assertTrue($this->createCachePool()->delete('key'));
+    }
+
+    public function testDeleteMultiple()
+    {
+        $this->assertTrue($this->createCachePool()->deleteMultiple(array('key', 'foo', 'bar')));
+    }
+
+    public function testSet()
+    {
+        $cache = $this->createCachePool();
+
+        $this->assertFalse($cache->set('key', 'val'));
+        $this->assertNull($cache->get('key'));
+    }
+
+    public function testSetMultiple()
+    {
+        $cache = $this->createCachePool();
+
+        $this->assertFalse($cache->setMultiple(array('key' => 'val')));
+        $this->assertNull($cache->get('key'));
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Tests/Simple/PdoCacheTest.php b/advancedcontentfilter/vendor/symfony/cache/Tests/Simple/PdoCacheTest.php
new file mode 100644 (file)
index 0000000..cf57309
--- /dev/null
@@ -0,0 +1,47 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Tests\Simple;
+
+use Symfony\Component\Cache\Simple\PdoCache;
+use Symfony\Component\Cache\Tests\Traits\PdoPruneableTrait;
+
+/**
+ * @group time-sensitive
+ */
+class PdoCacheTest extends CacheTestCase
+{
+    use PdoPruneableTrait;
+
+    protected static $dbFile;
+
+    public static function setupBeforeClass()
+    {
+        if (!extension_loaded('pdo_sqlite')) {
+            self::markTestSkipped('Extension pdo_sqlite required.');
+        }
+
+        self::$dbFile = tempnam(sys_get_temp_dir(), 'sf_sqlite_cache');
+
+        $pool = new PdoCache('sqlite:'.self::$dbFile);
+        $pool->createTable();
+    }
+
+    public static function tearDownAfterClass()
+    {
+        @unlink(self::$dbFile);
+    }
+
+    public function createSimpleCache($defaultLifetime = 0)
+    {
+        return new PdoCache('sqlite:'.self::$dbFile, 'ns', $defaultLifetime);
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Tests/Simple/PdoDbalCacheTest.php b/advancedcontentfilter/vendor/symfony/cache/Tests/Simple/PdoDbalCacheTest.php
new file mode 100644 (file)
index 0000000..0c40c04
--- /dev/null
@@ -0,0 +1,48 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Tests\Simple;
+
+use Doctrine\DBAL\DriverManager;
+use Symfony\Component\Cache\Simple\PdoCache;
+use Symfony\Component\Cache\Tests\Traits\PdoPruneableTrait;
+
+/**
+ * @group time-sensitive
+ */
+class PdoDbalCacheTest extends CacheTestCase
+{
+    use PdoPruneableTrait;
+
+    protected static $dbFile;
+
+    public static function setupBeforeClass()
+    {
+        if (!extension_loaded('pdo_sqlite')) {
+            self::markTestSkipped('Extension pdo_sqlite required.');
+        }
+
+        self::$dbFile = tempnam(sys_get_temp_dir(), 'sf_sqlite_cache');
+
+        $pool = new PdoCache(DriverManager::getConnection(array('driver' => 'pdo_sqlite', 'path' => self::$dbFile)));
+        $pool->createTable();
+    }
+
+    public static function tearDownAfterClass()
+    {
+        @unlink(self::$dbFile);
+    }
+
+    public function createSimpleCache($defaultLifetime = 0)
+    {
+        return new PdoCache(DriverManager::getConnection(array('driver' => 'pdo_sqlite', 'path' => self::$dbFile)), '', $defaultLifetime);
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Tests/Simple/PhpArrayCacheTest.php b/advancedcontentfilter/vendor/symfony/cache/Tests/Simple/PhpArrayCacheTest.php
new file mode 100644 (file)
index 0000000..1bd0ca2
--- /dev/null
@@ -0,0 +1,143 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Tests\Simple;
+
+use Symfony\Component\Cache\Tests\Adapter\FilesystemAdapterTest;
+use Symfony\Component\Cache\Simple\NullCache;
+use Symfony\Component\Cache\Simple\PhpArrayCache;
+
+/**
+ * @group time-sensitive
+ */
+class PhpArrayCacheTest extends CacheTestCase
+{
+    protected $skippedTests = array(
+        'testBasicUsageWithLongKey' => 'PhpArrayCache does no writes',
+
+        'testDelete' => 'PhpArrayCache does no writes',
+        'testDeleteMultiple' => 'PhpArrayCache does no writes',
+        'testDeleteMultipleGenerator' => 'PhpArrayCache does no writes',
+
+        'testSetTtl' => 'PhpArrayCache does no expiration',
+        'testSetMultipleTtl' => 'PhpArrayCache does no expiration',
+        'testSetExpiredTtl' => 'PhpArrayCache does no expiration',
+        'testSetMultipleExpiredTtl' => 'PhpArrayCache does no expiration',
+
+        'testGetInvalidKeys' => 'PhpArrayCache does no validation',
+        'testGetMultipleInvalidKeys' => 'PhpArrayCache does no validation',
+        'testSetInvalidKeys' => 'PhpArrayCache does no validation',
+        'testDeleteInvalidKeys' => 'PhpArrayCache does no validation',
+        'testDeleteMultipleInvalidKeys' => 'PhpArrayCache does no validation',
+        'testSetInvalidTtl' => 'PhpArrayCache does no validation',
+        'testSetMultipleInvalidKeys' => 'PhpArrayCache does no validation',
+        'testSetMultipleInvalidTtl' => 'PhpArrayCache does no validation',
+        'testHasInvalidKeys' => 'PhpArrayCache does no validation',
+        'testSetValidData' => 'PhpArrayCache does no validation',
+
+        'testDefaultLifeTime' => 'PhpArrayCache does not allow configuring a default lifetime.',
+        'testPrune' => 'PhpArrayCache just proxies',
+    );
+
+    protected static $file;
+
+    public static function setupBeforeClass()
+    {
+        self::$file = sys_get_temp_dir().'/symfony-cache/php-array-adapter-test.php';
+    }
+
+    protected function tearDown()
+    {
+        if (file_exists(sys_get_temp_dir().'/symfony-cache')) {
+            FilesystemAdapterTest::rmdir(sys_get_temp_dir().'/symfony-cache');
+        }
+    }
+
+    public function createSimpleCache()
+    {
+        return new PhpArrayCacheWrapper(self::$file, new NullCache());
+    }
+
+    public function testStore()
+    {
+        $arrayWithRefs = array();
+        $arrayWithRefs[0] = 123;
+        $arrayWithRefs[1] = &$arrayWithRefs[0];
+
+        $object = (object) array(
+            'foo' => 'bar',
+            'foo2' => 'bar2',
+        );
+
+        $expected = array(
+            'null' => null,
+            'serializedString' => serialize($object),
+            'arrayWithRefs' => $arrayWithRefs,
+            'object' => $object,
+            'arrayWithObject' => array('bar' => $object),
+        );
+
+        $cache = new PhpArrayCache(self::$file, new NullCache());
+        $cache->warmUp($expected);
+
+        foreach ($expected as $key => $value) {
+            $this->assertSame(serialize($value), serialize($cache->get($key)), 'Warm up should create a PHP file that OPCache can load in memory');
+        }
+    }
+
+    public function testStoredFile()
+    {
+        $expected = array(
+            'integer' => 42,
+            'float' => 42.42,
+            'boolean' => true,
+            'array_simple' => array('foo', 'bar'),
+            'array_associative' => array('foo' => 'bar', 'foo2' => 'bar2'),
+        );
+
+        $cache = new PhpArrayCache(self::$file, new NullCache());
+        $cache->warmUp($expected);
+
+        $values = eval(substr(file_get_contents(self::$file), 6));
+
+        $this->assertSame($expected, $values, 'Warm up should create a PHP file that OPCache can load in memory');
+    }
+}
+
+class PhpArrayCacheWrapper extends PhpArrayCache
+{
+    public function set($key, $value, $ttl = null)
+    {
+        call_user_func(\Closure::bind(function () use ($key, $value) {
+            $this->values[$key] = $value;
+            $this->warmUp($this->values);
+            $this->values = eval(substr(file_get_contents($this->file), 6));
+        }, $this, PhpArrayCache::class));
+
+        return true;
+    }
+
+    public function setMultiple($values, $ttl = null)
+    {
+        if (!is_array($values) && !$values instanceof \Traversable) {
+            return parent::setMultiple($values, $ttl);
+        }
+        call_user_func(\Closure::bind(function () use ($values) {
+            foreach ($values as $key => $value) {
+                $this->values[$key] = $value;
+            }
+            $this->warmUp($this->values);
+            $this->values = eval(substr(file_get_contents($this->file), 6));
+        }, $this, PhpArrayCache::class));
+
+        return true;
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Tests/Simple/PhpArrayCacheWithFallbackTest.php b/advancedcontentfilter/vendor/symfony/cache/Tests/Simple/PhpArrayCacheWithFallbackTest.php
new file mode 100644 (file)
index 0000000..4b6a94f
--- /dev/null
@@ -0,0 +1,55 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Tests\Simple;
+
+use Symfony\Component\Cache\Simple\FilesystemCache;
+use Symfony\Component\Cache\Simple\PhpArrayCache;
+use Symfony\Component\Cache\Tests\Adapter\FilesystemAdapterTest;
+
+/**
+ * @group time-sensitive
+ */
+class PhpArrayCacheWithFallbackTest extends CacheTestCase
+{
+    protected $skippedTests = array(
+        'testGetInvalidKeys' => 'PhpArrayCache does no validation',
+        'testGetMultipleInvalidKeys' => 'PhpArrayCache does no validation',
+        'testDeleteInvalidKeys' => 'PhpArrayCache does no validation',
+        'testDeleteMultipleInvalidKeys' => 'PhpArrayCache does no validation',
+        //'testSetValidData' => 'PhpArrayCache does no validation',
+        'testSetInvalidKeys' => 'PhpArrayCache does no validation',
+        'testSetInvalidTtl' => 'PhpArrayCache does no validation',
+        'testSetMultipleInvalidKeys' => 'PhpArrayCache does no validation',
+        'testSetMultipleInvalidTtl' => 'PhpArrayCache does no validation',
+        'testHasInvalidKeys' => 'PhpArrayCache does no validation',
+        'testPrune' => 'PhpArrayCache just proxies',
+    );
+
+    protected static $file;
+
+    public static function setupBeforeClass()
+    {
+        self::$file = sys_get_temp_dir().'/symfony-cache/php-array-adapter-test.php';
+    }
+
+    protected function tearDown()
+    {
+        if (file_exists(sys_get_temp_dir().'/symfony-cache')) {
+            FilesystemAdapterTest::rmdir(sys_get_temp_dir().'/symfony-cache');
+        }
+    }
+
+    public function createSimpleCache($defaultLifetime = 0)
+    {
+        return new PhpArrayCache(self::$file, new FilesystemCache('php-array-fallback', $defaultLifetime));
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Tests/Simple/PhpFilesCacheTest.php b/advancedcontentfilter/vendor/symfony/cache/Tests/Simple/PhpFilesCacheTest.php
new file mode 100644 (file)
index 0000000..7a40268
--- /dev/null
@@ -0,0 +1,42 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Tests\Simple;
+
+use Psr\SimpleCache\CacheInterface;
+use Symfony\Component\Cache\Simple\PhpFilesCache;
+
+/**
+ * @group time-sensitive
+ */
+class PhpFilesCacheTest extends CacheTestCase
+{
+    protected $skippedTests = array(
+        'testDefaultLifeTime' => 'PhpFilesCache does not allow configuring a default lifetime.',
+    );
+
+    public function createSimpleCache()
+    {
+        if (!PhpFilesCache::isSupported()) {
+            $this->markTestSkipped('OPcache extension is not enabled.');
+        }
+
+        return new PhpFilesCache('sf-cache');
+    }
+
+    protected function isPruned(CacheInterface $cache, $name)
+    {
+        $getFileMethod = (new \ReflectionObject($cache))->getMethod('getFile');
+        $getFileMethod->setAccessible(true);
+
+        return !file_exists($getFileMethod->invoke($cache, $name));
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Tests/Simple/Psr6CacheTest.php b/advancedcontentfilter/vendor/symfony/cache/Tests/Simple/Psr6CacheTest.php
new file mode 100644 (file)
index 0000000..7858289
--- /dev/null
@@ -0,0 +1,30 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Tests\Simple;
+
+use Symfony\Component\Cache\Adapter\FilesystemAdapter;
+use Symfony\Component\Cache\Simple\Psr6Cache;
+
+/**
+ * @group time-sensitive
+ */
+class Psr6CacheTest extends CacheTestCase
+{
+    protected $skippedTests = array(
+        'testPrune' => 'Psr6Cache just proxies',
+    );
+
+    public function createSimpleCache($defaultLifetime = 0)
+    {
+        return new Psr6Cache(new FilesystemAdapter('', $defaultLifetime));
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Tests/Simple/RedisArrayCacheTest.php b/advancedcontentfilter/vendor/symfony/cache/Tests/Simple/RedisArrayCacheTest.php
new file mode 100644 (file)
index 0000000..3c903c8
--- /dev/null
@@ -0,0 +1,24 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Tests\Simple;
+
+class RedisArrayCacheTest extends AbstractRedisCacheTest
+{
+    public static function setupBeforeClass()
+    {
+        parent::setupBeforeClass();
+        if (!class_exists('RedisArray')) {
+            self::markTestSkipped('The RedisArray class is required.');
+        }
+        self::$redis = new \RedisArray(array(getenv('REDIS_HOST')), array('lazy_connect' => true));
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Tests/Simple/RedisCacheTest.php b/advancedcontentfilter/vendor/symfony/cache/Tests/Simple/RedisCacheTest.php
new file mode 100644 (file)
index 0000000..d33421f
--- /dev/null
@@ -0,0 +1,82 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Tests\Simple;
+
+use Symfony\Component\Cache\Simple\RedisCache;
+
+class RedisCacheTest extends AbstractRedisCacheTest
+{
+    public static function setupBeforeClass()
+    {
+        parent::setupBeforeClass();
+        self::$redis = RedisCache::createConnection('redis://'.getenv('REDIS_HOST'));
+    }
+
+    public function testCreateConnection()
+    {
+        $redisHost = getenv('REDIS_HOST');
+
+        $redis = RedisCache::createConnection('redis://'.$redisHost);
+        $this->assertInstanceOf(\Redis::class, $redis);
+        $this->assertTrue($redis->isConnected());
+        $this->assertSame(0, $redis->getDbNum());
+
+        $redis = RedisCache::createConnection('redis://'.$redisHost.'/2');
+        $this->assertSame(2, $redis->getDbNum());
+
+        $redis = RedisCache::createConnection('redis://'.$redisHost, array('timeout' => 3));
+        $this->assertEquals(3, $redis->getTimeout());
+
+        $redis = RedisCache::createConnection('redis://'.$redisHost.'?timeout=4');
+        $this->assertEquals(4, $redis->getTimeout());
+
+        $redis = RedisCache::createConnection('redis://'.$redisHost, array('read_timeout' => 5));
+        $this->assertEquals(5, $redis->getReadTimeout());
+    }
+
+    /**
+     * @dataProvider provideFailedCreateConnection
+     * @expectedException \Symfony\Component\Cache\Exception\InvalidArgumentException
+     * @expectedExceptionMessage Redis connection failed
+     */
+    public function testFailedCreateConnection($dsn)
+    {
+        RedisCache::createConnection($dsn);
+    }
+
+    public function provideFailedCreateConnection()
+    {
+        return array(
+            array('redis://localhost:1234'),
+            array('redis://foo@localhost'),
+            array('redis://localhost/123'),
+        );
+    }
+
+    /**
+     * @dataProvider provideInvalidCreateConnection
+     * @expectedException \Symfony\Component\Cache\Exception\InvalidArgumentException
+     * @expectedExceptionMessage Invalid Redis DSN
+     */
+    public function testInvalidCreateConnection($dsn)
+    {
+        RedisCache::createConnection($dsn);
+    }
+
+    public function provideInvalidCreateConnection()
+    {
+        return array(
+            array('foo://localhost'),
+            array('redis://'),
+        );
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Tests/Simple/TraceableCacheTest.php b/advancedcontentfilter/vendor/symfony/cache/Tests/Simple/TraceableCacheTest.php
new file mode 100644 (file)
index 0000000..535f93d
--- /dev/null
@@ -0,0 +1,171 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Tests\Simple;
+
+use Symfony\Component\Cache\Simple\FilesystemCache;
+use Symfony\Component\Cache\Simple\TraceableCache;
+
+/**
+ * @group time-sensitive
+ */
+class TraceableCacheTest extends CacheTestCase
+{
+    protected $skippedTests = array(
+        'testPrune' => 'TraceableCache just proxies',
+    );
+
+    public function createSimpleCache($defaultLifetime = 0)
+    {
+        return new TraceableCache(new FilesystemCache('', $defaultLifetime));
+    }
+
+    public function testGetMissTrace()
+    {
+        $pool = $this->createSimpleCache();
+        $pool->get('k');
+        $calls = $pool->getCalls();
+        $this->assertCount(1, $calls);
+
+        $call = $calls[0];
+        $this->assertSame('get', $call->name);
+        $this->assertSame(array('k' => false), $call->result);
+        $this->assertSame(0, $call->hits);
+        $this->assertSame(1, $call->misses);
+        $this->assertNotEmpty($call->start);
+        $this->assertNotEmpty($call->end);
+    }
+
+    public function testGetHitTrace()
+    {
+        $pool = $this->createSimpleCache();
+        $pool->set('k', 'foo');
+        $pool->get('k');
+        $calls = $pool->getCalls();
+        $this->assertCount(2, $calls);
+
+        $call = $calls[1];
+        $this->assertSame(1, $call->hits);
+        $this->assertSame(0, $call->misses);
+    }
+
+    public function testGetMultipleMissTrace()
+    {
+        $pool = $this->createSimpleCache();
+        $pool->set('k1', 123);
+        $values = $pool->getMultiple(array('k0', 'k1'));
+        foreach ($values as $value) {
+        }
+        $calls = $pool->getCalls();
+        $this->assertCount(2, $calls);
+
+        $call = $calls[1];
+        $this->assertSame('getMultiple', $call->name);
+        $this->assertSame(array('k1' => true, 'k0' => false), $call->result);
+        $this->assertSame(1, $call->misses);
+        $this->assertNotEmpty($call->start);
+        $this->assertNotEmpty($call->end);
+    }
+
+    public function testHasMissTrace()
+    {
+        $pool = $this->createSimpleCache();
+        $pool->has('k');
+        $calls = $pool->getCalls();
+        $this->assertCount(1, $calls);
+
+        $call = $calls[0];
+        $this->assertSame('has', $call->name);
+        $this->assertSame(array('k' => false), $call->result);
+        $this->assertNotEmpty($call->start);
+        $this->assertNotEmpty($call->end);
+    }
+
+    public function testHasHitTrace()
+    {
+        $pool = $this->createSimpleCache();
+        $pool->set('k', 'foo');
+        $pool->has('k');
+        $calls = $pool->getCalls();
+        $this->assertCount(2, $calls);
+
+        $call = $calls[1];
+        $this->assertSame('has', $call->name);
+        $this->assertSame(array('k' => true), $call->result);
+        $this->assertNotEmpty($call->start);
+        $this->assertNotEmpty($call->end);
+    }
+
+    public function testDeleteTrace()
+    {
+        $pool = $this->createSimpleCache();
+        $pool->delete('k');
+        $calls = $pool->getCalls();
+        $this->assertCount(1, $calls);
+
+        $call = $calls[0];
+        $this->assertSame('delete', $call->name);
+        $this->assertSame(array('k' => true), $call->result);
+        $this->assertSame(0, $call->hits);
+        $this->assertSame(0, $call->misses);
+        $this->assertNotEmpty($call->start);
+        $this->assertNotEmpty($call->end);
+    }
+
+    public function testDeleteMultipleTrace()
+    {
+        $pool = $this->createSimpleCache();
+        $arg = array('k0', 'k1');
+        $pool->deleteMultiple($arg);
+        $calls = $pool->getCalls();
+        $this->assertCount(1, $calls);
+
+        $call = $calls[0];
+        $this->assertSame('deleteMultiple', $call->name);
+        $this->assertSame(array('keys' => $arg, 'result' => true), $call->result);
+        $this->assertSame(0, $call->hits);
+        $this->assertSame(0, $call->misses);
+        $this->assertNotEmpty($call->start);
+        $this->assertNotEmpty($call->end);
+    }
+
+    public function testTraceSetTrace()
+    {
+        $pool = $this->createSimpleCache();
+        $pool->set('k', 'foo');
+        $calls = $pool->getCalls();
+        $this->assertCount(1, $calls);
+
+        $call = $calls[0];
+        $this->assertSame('set', $call->name);
+        $this->assertSame(array('k' => true), $call->result);
+        $this->assertSame(0, $call->hits);
+        $this->assertSame(0, $call->misses);
+        $this->assertNotEmpty($call->start);
+        $this->assertNotEmpty($call->end);
+    }
+
+    public function testSetMultipleTrace()
+    {
+        $pool = $this->createSimpleCache();
+        $pool->setMultiple(array('k' => 'foo'));
+        $calls = $pool->getCalls();
+        $this->assertCount(1, $calls);
+
+        $call = $calls[0];
+        $this->assertSame('setMultiple', $call->name);
+        $this->assertSame(array('keys' => array('k'), 'result' => true), $call->result);
+        $this->assertSame(0, $call->hits);
+        $this->assertSame(0, $call->misses);
+        $this->assertNotEmpty($call->start);
+        $this->assertNotEmpty($call->end);
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Tests/Traits/PdoPruneableTrait.php b/advancedcontentfilter/vendor/symfony/cache/Tests/Traits/PdoPruneableTrait.php
new file mode 100644 (file)
index 0000000..a9c459f
--- /dev/null
@@ -0,0 +1,34 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Tests\Traits;
+
+trait PdoPruneableTrait
+{
+    protected function isPruned($cache, $name)
+    {
+        $o = new \ReflectionObject($cache);
+
+        if (!$o->hasMethod('getConnection')) {
+            self::fail('Cache does not have "getConnection()" method.');
+        }
+
+        $getPdoConn = $o->getMethod('getConnection');
+        $getPdoConn->setAccessible(true);
+
+        /** @var \Doctrine\DBAL\Statement $select */
+        $select = $getPdoConn->invoke($cache)->prepare('SELECT 1 FROM cache_items WHERE item_id LIKE :id');
+        $select->bindValue(':id', sprintf('%%%s', $name));
+        $select->execute();
+
+        return 0 === count($select->fetchAll(\PDO::FETCH_COLUMN));
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Traits/AbstractTrait.php b/advancedcontentfilter/vendor/symfony/cache/Traits/AbstractTrait.php
new file mode 100644 (file)
index 0000000..d7af3b5
--- /dev/null
@@ -0,0 +1,258 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Traits;
+
+use Psr\Log\LoggerAwareTrait;
+use Symfony\Component\Cache\CacheItem;
+
+/**
+ * @author Nicolas Grekas <p@tchwork.com>
+ *
+ * @internal
+ */
+trait AbstractTrait
+{
+    use LoggerAwareTrait;
+
+    private $namespace;
+    private $namespaceVersion = '';
+    private $versioningIsEnabled = false;
+    private $deferred = array();
+
+    /**
+     * @var int|null The maximum length to enforce for identifiers or null when no limit applies
+     */
+    protected $maxIdLength;
+
+    /**
+     * Fetches several cache items.
+     *
+     * @param array $ids The cache identifiers to fetch
+     *
+     * @return array|\Traversable The corresponding values found in the cache
+     */
+    abstract protected function doFetch(array $ids);
+
+    /**
+     * Confirms if the cache contains specified cache item.
+     *
+     * @param string $id The identifier for which to check existence
+     *
+     * @return bool True if item exists in the cache, false otherwise
+     */
+    abstract protected function doHave($id);
+
+    /**
+     * Deletes all items in the pool.
+     *
+     * @param string The prefix used for all identifiers managed by this pool
+     *
+     * @return bool True if the pool was successfully cleared, false otherwise
+     */
+    abstract protected function doClear($namespace);
+
+    /**
+     * Removes multiple items from the pool.
+     *
+     * @param array $ids An array of identifiers that should be removed from the pool
+     *
+     * @return bool True if the items were successfully removed, false otherwise
+     */
+    abstract protected function doDelete(array $ids);
+
+    /**
+     * Persists several cache items immediately.
+     *
+     * @param array $values   The values to cache, indexed by their cache identifier
+     * @param int   $lifetime The lifetime of the cached values, 0 for persisting until manual cleaning
+     *
+     * @return array|bool The identifiers that failed to be cached or a boolean stating if caching succeeded or not
+     */
+    abstract protected function doSave(array $values, $lifetime);
+
+    /**
+     * {@inheritdoc}
+     */
+    public function hasItem($key)
+    {
+        $id = $this->getId($key);
+
+        if (isset($this->deferred[$key])) {
+            $this->commit();
+        }
+
+        try {
+            return $this->doHave($id);
+        } catch (\Exception $e) {
+            CacheItem::log($this->logger, 'Failed to check if key "{key}" is cached', array('key' => $key, 'exception' => $e));
+
+            return false;
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function clear()
+    {
+        if ($cleared = $this->versioningIsEnabled) {
+            $this->namespaceVersion = 2;
+            foreach ($this->doFetch(array('@'.$this->namespace)) as $v) {
+                $this->namespaceVersion = 1 + (int) $v;
+            }
+            $this->namespaceVersion .= ':';
+            $cleared = $this->doSave(array('@'.$this->namespace => $this->namespaceVersion), 0);
+        }
+        $this->deferred = array();
+
+        try {
+            return $this->doClear($this->namespace) || $cleared;
+        } catch (\Exception $e) {
+            CacheItem::log($this->logger, 'Failed to clear the cache', array('exception' => $e));
+
+            return false;
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function deleteItem($key)
+    {
+        return $this->deleteItems(array($key));
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function deleteItems(array $keys)
+    {
+        $ids = array();
+
+        foreach ($keys as $key) {
+            $ids[$key] = $this->getId($key);
+            unset($this->deferred[$key]);
+        }
+
+        try {
+            if ($this->doDelete($ids)) {
+                return true;
+            }
+        } catch (\Exception $e) {
+        }
+
+        $ok = true;
+
+        // When bulk-delete failed, retry each item individually
+        foreach ($ids as $key => $id) {
+            try {
+                $e = null;
+                if ($this->doDelete(array($id))) {
+                    continue;
+                }
+            } catch (\Exception $e) {
+            }
+            CacheItem::log($this->logger, 'Failed to delete key "{key}"', array('key' => $key, 'exception' => $e));
+            $ok = false;
+        }
+
+        return $ok;
+    }
+
+    /**
+     * Enables/disables versioning of items.
+     *
+     * When versioning is enabled, clearing the cache is atomic and doesn't require listing existing keys to proceed,
+     * but old keys may need garbage collection and extra round-trips to the back-end are required.
+     *
+     * Calling this method also clears the memoized namespace version and thus forces a resynchonization of it.
+     *
+     * @param bool $enable
+     *
+     * @return bool the previous state of versioning
+     */
+    public function enableVersioning($enable = true)
+    {
+        $wasEnabled = $this->versioningIsEnabled;
+        $this->versioningIsEnabled = (bool) $enable;
+        $this->namespaceVersion = '';
+
+        return $wasEnabled;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function reset()
+    {
+        if ($this->deferred) {
+            $this->commit();
+        }
+        $this->namespaceVersion = '';
+    }
+
+    /**
+     * Like the native unserialize() function but throws an exception if anything goes wrong.
+     *
+     * @param string $value
+     *
+     * @return mixed
+     *
+     * @throws \Exception
+     */
+    protected static function unserialize($value)
+    {
+        if ('b:0;' === $value) {
+            return false;
+        }
+        $unserializeCallbackHandler = ini_set('unserialize_callback_func', __CLASS__.'::handleUnserializeCallback');
+        try {
+            if (false !== $value = unserialize($value)) {
+                return $value;
+            }
+            throw new \DomainException('Failed to unserialize cached value');
+        } catch (\Error $e) {
+            throw new \ErrorException($e->getMessage(), $e->getCode(), E_ERROR, $e->getFile(), $e->getLine());
+        } finally {
+            ini_set('unserialize_callback_func', $unserializeCallbackHandler);
+        }
+    }
+
+    private function getId($key)
+    {
+        CacheItem::validateKey($key);
+
+        if ($this->versioningIsEnabled && '' === $this->namespaceVersion) {
+            $this->namespaceVersion = '1:';
+            foreach ($this->doFetch(array('@'.$this->namespace)) as $v) {
+                $this->namespaceVersion = $v;
+            }
+        }
+
+        if (null === $this->maxIdLength) {
+            return $this->namespace.$this->namespaceVersion.$key;
+        }
+        if (strlen($id = $this->namespace.$this->namespaceVersion.$key) > $this->maxIdLength) {
+            $id = $this->namespace.$this->namespaceVersion.substr_replace(base64_encode(hash('sha256', $key, true)), ':', -22);
+        }
+
+        return $id;
+    }
+
+    /**
+     * @internal
+     */
+    public static function handleUnserializeCallback($class)
+    {
+        throw new \DomainException('Class not found: '.$class);
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Traits/ApcuTrait.php b/advancedcontentfilter/vendor/symfony/cache/Traits/ApcuTrait.php
new file mode 100644 (file)
index 0000000..fe7dfba
--- /dev/null
@@ -0,0 +1,117 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Traits;
+
+use Symfony\Component\Cache\CacheItem;
+use Symfony\Component\Cache\Exception\CacheException;
+
+/**
+ * @author Nicolas Grekas <p@tchwork.com>
+ *
+ * @internal
+ */
+trait ApcuTrait
+{
+    public static function isSupported()
+    {
+        return function_exists('apcu_fetch') && ini_get('apc.enabled');
+    }
+
+    private function init($namespace, $defaultLifetime, $version)
+    {
+        if (!static::isSupported()) {
+            throw new CacheException('APCu is not enabled');
+        }
+        if ('cli' === PHP_SAPI) {
+            ini_set('apc.use_request_time', 0);
+        }
+        parent::__construct($namespace, $defaultLifetime);
+
+        if (null !== $version) {
+            CacheItem::validateKey($version);
+
+            if (!apcu_exists($version.'@'.$namespace)) {
+                $this->doClear($namespace);
+                apcu_add($version.'@'.$namespace, null);
+            }
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doFetch(array $ids)
+    {
+        try {
+            foreach (apcu_fetch($ids, $ok) ?: array() as $k => $v) {
+                if (null !== $v || $ok) {
+                    yield $k => $v;
+                }
+            }
+        } catch (\Error $e) {
+            throw new \ErrorException($e->getMessage(), $e->getCode(), E_ERROR, $e->getFile(), $e->getLine());
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doHave($id)
+    {
+        return apcu_exists($id);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doClear($namespace)
+    {
+        return isset($namespace[0]) && class_exists('APCuIterator', false) && ('cli' !== PHP_SAPI || ini_get('apc.enable_cli'))
+            ? apcu_delete(new \APCuIterator(sprintf('/^%s/', preg_quote($namespace, '/')), APC_ITER_KEY))
+            : apcu_clear_cache();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doDelete(array $ids)
+    {
+        foreach ($ids as $id) {
+            apcu_delete($id);
+        }
+
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doSave(array $values, $lifetime)
+    {
+        try {
+            if (false === $failures = apcu_store($values, null, $lifetime)) {
+                $failures = $values;
+            }
+
+            return array_keys($failures);
+        } catch (\Error $e) {
+        } catch (\Exception $e) {
+        }
+
+        if (1 === count($values)) {
+            // Workaround https://github.com/krakjoe/apcu/issues/170
+            apcu_delete(key($values));
+        }
+
+        throw $e;
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Traits/ArrayTrait.php b/advancedcontentfilter/vendor/symfony/cache/Traits/ArrayTrait.php
new file mode 100644 (file)
index 0000000..b7d2ad6
--- /dev/null
@@ -0,0 +1,108 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Traits;
+
+use Psr\Log\LoggerAwareTrait;
+use Symfony\Component\Cache\CacheItem;
+
+/**
+ * @author Nicolas Grekas <p@tchwork.com>
+ *
+ * @internal
+ */
+trait ArrayTrait
+{
+    use LoggerAwareTrait;
+
+    private $storeSerialized;
+    private $values = array();
+    private $expiries = array();
+
+    /**
+     * Returns all cached values, with cache miss as null.
+     *
+     * @return array
+     */
+    public function getValues()
+    {
+        return $this->values;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function hasItem($key)
+    {
+        CacheItem::validateKey($key);
+
+        return isset($this->expiries[$key]) && ($this->expiries[$key] >= time() || !$this->deleteItem($key));
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function clear()
+    {
+        $this->values = $this->expiries = array();
+
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function deleteItem($key)
+    {
+        CacheItem::validateKey($key);
+
+        unset($this->values[$key], $this->expiries[$key]);
+
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function reset()
+    {
+        $this->clear();
+    }
+
+    private function generateItems(array $keys, $now, $f)
+    {
+        foreach ($keys as $i => $key) {
+            try {
+                if (!$isHit = isset($this->expiries[$key]) && ($this->expiries[$key] >= $now || !$this->deleteItem($key))) {
+                    $this->values[$key] = $value = null;
+                } elseif (!$this->storeSerialized) {
+                    $value = $this->values[$key];
+                } elseif ('b:0;' === $value = $this->values[$key]) {
+                    $value = false;
+                } elseif (false === $value = unserialize($value)) {
+                    $this->values[$key] = $value = null;
+                    $isHit = false;
+                }
+            } catch (\Exception $e) {
+                CacheItem::log($this->logger, 'Failed to unserialize key "{key}"', array('key' => $key, 'exception' => $e));
+                $this->values[$key] = $value = null;
+                $isHit = false;
+            }
+            unset($keys[$i]);
+
+            yield $key => $f($key, $value, $isHit);
+        }
+
+        foreach ($keys as $key) {
+            yield $key => $f($key, null, false);
+        }
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Traits/DoctrineTrait.php b/advancedcontentfilter/vendor/symfony/cache/Traits/DoctrineTrait.php
new file mode 100644 (file)
index 0000000..c87ecab
--- /dev/null
@@ -0,0 +1,98 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Traits;
+
+/**
+ * @author Nicolas Grekas <p@tchwork.com>
+ *
+ * @internal
+ */
+trait DoctrineTrait
+{
+    private $provider;
+
+    /**
+     * {@inheritdoc}
+     */
+    public function reset()
+    {
+        parent::reset();
+        $this->provider->setNamespace($this->provider->getNamespace());
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doFetch(array $ids)
+    {
+        $unserializeCallbackHandler = ini_set('unserialize_callback_func', parent::class.'::handleUnserializeCallback');
+        try {
+            return $this->provider->fetchMultiple($ids);
+        } catch (\Error $e) {
+            $trace = $e->getTrace();
+
+            if (isset($trace[0]['function']) && !isset($trace[0]['class'])) {
+                switch ($trace[0]['function']) {
+                    case 'unserialize':
+                    case 'apcu_fetch':
+                    case 'apc_fetch':
+                        throw new \ErrorException($e->getMessage(), $e->getCode(), E_ERROR, $e->getFile(), $e->getLine());
+                }
+            }
+
+            throw $e;
+        } finally {
+            ini_set('unserialize_callback_func', $unserializeCallbackHandler);
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doHave($id)
+    {
+        return $this->provider->contains($id);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doClear($namespace)
+    {
+        $namespace = $this->provider->getNamespace();
+
+        return isset($namespace[0])
+            ? $this->provider->deleteAll()
+            : $this->provider->flushAll();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doDelete(array $ids)
+    {
+        $ok = true;
+        foreach ($ids as $id) {
+            $ok = $this->provider->delete($id) && $ok;
+        }
+
+        return $ok;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doSave(array $values, $lifetime)
+    {
+        return $this->provider->saveMultiple($values, $lifetime);
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Traits/FilesystemCommonTrait.php b/advancedcontentfilter/vendor/symfony/cache/Traits/FilesystemCommonTrait.php
new file mode 100644 (file)
index 0000000..b0f495e
--- /dev/null
@@ -0,0 +1,128 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Traits;
+
+use Symfony\Component\Cache\Exception\InvalidArgumentException;
+
+/**
+ * @author Nicolas Grekas <p@tchwork.com>
+ *
+ * @internal
+ */
+trait FilesystemCommonTrait
+{
+    private $directory;
+    private $tmp;
+
+    private function init($namespace, $directory)
+    {
+        if (!isset($directory[0])) {
+            $directory = sys_get_temp_dir().'/symfony-cache';
+        } else {
+            $directory = realpath($directory) ?: $directory;
+        }
+        if (isset($namespace[0])) {
+            if (preg_match('#[^-+_.A-Za-z0-9]#', $namespace, $match)) {
+                throw new InvalidArgumentException(sprintf('Namespace contains "%s" but only characters in [-+_.A-Za-z0-9] are allowed.', $match[0]));
+            }
+            $directory .= DIRECTORY_SEPARATOR.$namespace;
+        }
+        if (!file_exists($directory)) {
+            @mkdir($directory, 0777, true);
+        }
+        $directory .= DIRECTORY_SEPARATOR;
+        // On Windows the whole path is limited to 258 chars
+        if ('\\' === DIRECTORY_SEPARATOR && strlen($directory) > 234) {
+            throw new InvalidArgumentException(sprintf('Cache directory too long (%s)', $directory));
+        }
+
+        $this->directory = $directory;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doClear($namespace)
+    {
+        $ok = true;
+
+        foreach (new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($this->directory, \FilesystemIterator::SKIP_DOTS)) as $file) {
+            $ok = ($file->isDir() || @unlink($file) || !file_exists($file)) && $ok;
+        }
+
+        return $ok;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doDelete(array $ids)
+    {
+        $ok = true;
+
+        foreach ($ids as $id) {
+            $file = $this->getFile($id);
+            $ok = (!file_exists($file) || @unlink($file) || !file_exists($file)) && $ok;
+        }
+
+        return $ok;
+    }
+
+    private function write($file, $data, $expiresAt = null)
+    {
+        set_error_handler(__CLASS__.'::throwError');
+        try {
+            if (null === $this->tmp) {
+                $this->tmp = $this->directory.uniqid('', true);
+            }
+            file_put_contents($this->tmp, $data);
+
+            if (null !== $expiresAt) {
+                touch($this->tmp, $expiresAt);
+            }
+
+            return rename($this->tmp, $file);
+        } finally {
+            restore_error_handler();
+        }
+    }
+
+    private function getFile($id, $mkdir = false)
+    {
+        $hash = str_replace('/', '-', base64_encode(hash('sha256', static::class.$id, true)));
+        $dir = $this->directory.strtoupper($hash[0].DIRECTORY_SEPARATOR.$hash[1].DIRECTORY_SEPARATOR);
+
+        if ($mkdir && !file_exists($dir)) {
+            @mkdir($dir, 0777, true);
+        }
+
+        return $dir.substr($hash, 2, 20);
+    }
+
+    /**
+     * @internal
+     */
+    public static function throwError($type, $message, $file, $line)
+    {
+        throw new \ErrorException($message, 0, $type, $file, $line);
+    }
+
+    public function __destruct()
+    {
+        if (method_exists(parent::class, '__destruct')) {
+            parent::__destruct();
+        }
+        if (null !== $this->tmp && file_exists($this->tmp)) {
+            unlink($this->tmp);
+        }
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Traits/FilesystemTrait.php b/advancedcontentfilter/vendor/symfony/cache/Traits/FilesystemTrait.php
new file mode 100644 (file)
index 0000000..23974b3
--- /dev/null
@@ -0,0 +1,107 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Traits;
+
+use Symfony\Component\Cache\Exception\CacheException;
+
+/**
+ * @author Nicolas Grekas <p@tchwork.com>
+ * @author Rob Frawley 2nd <rmf@src.run>
+ *
+ * @internal
+ */
+trait FilesystemTrait
+{
+    use FilesystemCommonTrait;
+
+    /**
+     * @return bool
+     */
+    public function prune()
+    {
+        $time = time();
+        $pruned = true;
+
+        foreach (new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($this->directory, \FilesystemIterator::SKIP_DOTS), \RecursiveIteratorIterator::LEAVES_ONLY) as $file) {
+            if (!$h = @fopen($file, 'rb')) {
+                continue;
+            }
+
+            if (($expiresAt = (int) fgets($h)) && $time >= $expiresAt) {
+                fclose($h);
+                $pruned = @unlink($file) && !file_exists($file) && $pruned;
+            } else {
+                fclose($h);
+            }
+        }
+
+        return $pruned;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doFetch(array $ids)
+    {
+        $values = array();
+        $now = time();
+
+        foreach ($ids as $id) {
+            $file = $this->getFile($id);
+            if (!file_exists($file) || !$h = @fopen($file, 'rb')) {
+                continue;
+            }
+            if (($expiresAt = (int) fgets($h)) && $now >= $expiresAt) {
+                fclose($h);
+                @unlink($file);
+            } else {
+                $i = rawurldecode(rtrim(fgets($h)));
+                $value = stream_get_contents($h);
+                fclose($h);
+                if ($i === $id) {
+                    $values[$id] = parent::unserialize($value);
+                }
+            }
+        }
+
+        return $values;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doHave($id)
+    {
+        $file = $this->getFile($id);
+
+        return file_exists($file) && (@filemtime($file) > time() || $this->doFetch(array($id)));
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doSave(array $values, $lifetime)
+    {
+        $ok = true;
+        $expiresAt = $lifetime ? (time() + $lifetime) : 0;
+
+        foreach ($values as $id => $value) {
+            $ok = $this->write($this->getFile($id, true), $expiresAt."\n".rawurlencode($id)."\n".serialize($value), $expiresAt) && $ok;
+        }
+
+        if (!$ok && !is_writable($this->directory)) {
+            throw new CacheException(sprintf('Cache directory is not writable (%s)', $this->directory));
+        }
+
+        return $ok;
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Traits/MemcachedTrait.php b/advancedcontentfilter/vendor/symfony/cache/Traits/MemcachedTrait.php
new file mode 100644 (file)
index 0000000..9b877ef
--- /dev/null
@@ -0,0 +1,280 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Traits;
+
+use Symfony\Component\Cache\Exception\CacheException;
+use Symfony\Component\Cache\Exception\InvalidArgumentException;
+
+/**
+ * @author Rob Frawley 2nd <rmf@src.run>
+ * @author Nicolas Grekas <p@tchwork.com>
+ *
+ * @internal
+ */
+trait MemcachedTrait
+{
+    private static $defaultClientOptions = array(
+        'persistent_id' => null,
+        'username' => null,
+        'password' => null,
+        'serializer' => 'php',
+    );
+
+    private $client;
+    private $lazyClient;
+
+    public static function isSupported()
+    {
+        return extension_loaded('memcached') && version_compare(phpversion('memcached'), '2.2.0', '>=');
+    }
+
+    private function init(\Memcached $client, $namespace, $defaultLifetime)
+    {
+        if (!static::isSupported()) {
+            throw new CacheException('Memcached >= 2.2.0 is required');
+        }
+        if ('Memcached' === get_class($client)) {
+            $opt = $client->getOption(\Memcached::OPT_SERIALIZER);
+            if (\Memcached::SERIALIZER_PHP !== $opt && \Memcached::SERIALIZER_IGBINARY !== $opt) {
+                throw new CacheException('MemcachedAdapter: "serializer" option must be "php" or "igbinary".');
+            }
+            $this->maxIdLength -= strlen($client->getOption(\Memcached::OPT_PREFIX_KEY));
+            $this->client = $client;
+        } else {
+            $this->lazyClient = $client;
+        }
+
+        parent::__construct($namespace, $defaultLifetime);
+        $this->enableVersioning();
+    }
+
+    /**
+     * Creates a Memcached instance.
+     *
+     * By default, the binary protocol, no block, and libketama compatible options are enabled.
+     *
+     * Examples for servers:
+     * - 'memcached://user:pass@localhost?weight=33'
+     * - array(array('localhost', 11211, 33))
+     *
+     * @param array[]|string|string[] An array of servers, a DSN, or an array of DSNs
+     * @param array                   An array of options
+     *
+     * @return \Memcached
+     *
+     * @throws \ErrorException When invalid options or servers are provided
+     */
+    public static function createConnection($servers, array $options = array())
+    {
+        if (is_string($servers)) {
+            $servers = array($servers);
+        } elseif (!is_array($servers)) {
+            throw new InvalidArgumentException(sprintf('MemcachedAdapter::createClient() expects array or string as first argument, %s given.', gettype($servers)));
+        }
+        if (!static::isSupported()) {
+            throw new CacheException('Memcached >= 2.2.0 is required');
+        }
+        set_error_handler(function ($type, $msg, $file, $line) { throw new \ErrorException($msg, 0, $type, $file, $line); });
+        try {
+            $options += static::$defaultClientOptions;
+            $client = new \Memcached($options['persistent_id']);
+            $username = $options['username'];
+            $password = $options['password'];
+
+            // parse any DSN in $servers
+            foreach ($servers as $i => $dsn) {
+                if (is_array($dsn)) {
+                    continue;
+                }
+                if (0 !== strpos($dsn, 'memcached://')) {
+                    throw new InvalidArgumentException(sprintf('Invalid Memcached DSN: %s does not start with "memcached://"', $dsn));
+                }
+                $params = preg_replace_callback('#^memcached://(?:([^@]*+)@)?#', function ($m) use (&$username, &$password) {
+                    if (!empty($m[1])) {
+                        list($username, $password) = explode(':', $m[1], 2) + array(1 => null);
+                    }
+
+                    return 'file://';
+                }, $dsn);
+                if (false === $params = parse_url($params)) {
+                    throw new InvalidArgumentException(sprintf('Invalid Memcached DSN: %s', $dsn));
+                }
+                if (!isset($params['host']) && !isset($params['path'])) {
+                    throw new InvalidArgumentException(sprintf('Invalid Memcached DSN: %s', $dsn));
+                }
+                if (isset($params['path']) && preg_match('#/(\d+)$#', $params['path'], $m)) {
+                    $params['weight'] = $m[1];
+                    $params['path'] = substr($params['path'], 0, -strlen($m[0]));
+                }
+                $params += array(
+                    'host' => isset($params['host']) ? $params['host'] : $params['path'],
+                    'port' => isset($params['host']) ? 11211 : null,
+                    'weight' => 0,
+                );
+                if (isset($params['query'])) {
+                    parse_str($params['query'], $query);
+                    $params += $query;
+                    $options = $query + $options;
+                }
+
+                $servers[$i] = array($params['host'], $params['port'], $params['weight']);
+            }
+
+            // set client's options
+            unset($options['persistent_id'], $options['username'], $options['password'], $options['weight'], $options['lazy']);
+            $options = array_change_key_case($options, CASE_UPPER);
+            $client->setOption(\Memcached::OPT_BINARY_PROTOCOL, true);
+            $client->setOption(\Memcached::OPT_NO_BLOCK, true);
+            if (!array_key_exists('LIBKETAMA_COMPATIBLE', $options) && !array_key_exists(\Memcached::OPT_LIBKETAMA_COMPATIBLE, $options)) {
+                $client->setOption(\Memcached::OPT_LIBKETAMA_COMPATIBLE, true);
+            }
+            foreach ($options as $name => $value) {
+                if (is_int($name)) {
+                    continue;
+                }
+                if ('HASH' === $name || 'SERIALIZER' === $name || 'DISTRIBUTION' === $name) {
+                    $value = constant('Memcached::'.$name.'_'.strtoupper($value));
+                }
+                $opt = constant('Memcached::OPT_'.$name);
+
+                unset($options[$name]);
+                $options[$opt] = $value;
+            }
+            $client->setOptions($options);
+
+            // set client's servers, taking care of persistent connections
+            if (!$client->isPristine()) {
+                $oldServers = array();
+                foreach ($client->getServerList() as $server) {
+                    $oldServers[] = array($server['host'], $server['port']);
+                }
+
+                $newServers = array();
+                foreach ($servers as $server) {
+                    if (1 < count($server)) {
+                        $server = array_values($server);
+                        unset($server[2]);
+                        $server[1] = (int) $server[1];
+                    }
+                    $newServers[] = $server;
+                }
+
+                if ($oldServers !== $newServers) {
+                    // before resetting, ensure $servers is valid
+                    $client->addServers($servers);
+                    $client->resetServerList();
+                }
+            }
+            $client->addServers($servers);
+
+            if (null !== $username || null !== $password) {
+                if (!method_exists($client, 'setSaslAuthData')) {
+                    trigger_error('Missing SASL support: the memcached extension must be compiled with --enable-memcached-sasl.');
+                }
+                $client->setSaslAuthData($username, $password);
+            }
+
+            return $client;
+        } finally {
+            restore_error_handler();
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doSave(array $values, $lifetime)
+    {
+        if ($lifetime && $lifetime > 30 * 86400) {
+            $lifetime += time();
+        }
+
+        return $this->checkResultCode($this->getClient()->setMulti($values, $lifetime));
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doFetch(array $ids)
+    {
+        $unserializeCallbackHandler = ini_set('unserialize_callback_func', __CLASS__.'::handleUnserializeCallback');
+        try {
+            return $this->checkResultCode($this->getClient()->getMulti($ids));
+        } catch (\Error $e) {
+            throw new \ErrorException($e->getMessage(), $e->getCode(), E_ERROR, $e->getFile(), $e->getLine());
+        } finally {
+            ini_set('unserialize_callback_func', $unserializeCallbackHandler);
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doHave($id)
+    {
+        return false !== $this->getClient()->get($id) || $this->checkResultCode(\Memcached::RES_SUCCESS === $this->client->getResultCode());
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doDelete(array $ids)
+    {
+        $ok = true;
+        foreach ($this->checkResultCode($this->getClient()->deleteMulti($ids)) as $result) {
+            if (\Memcached::RES_SUCCESS !== $result && \Memcached::RES_NOTFOUND !== $result) {
+                $ok = false;
+            }
+        }
+
+        return $ok;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doClear($namespace)
+    {
+        return false;
+    }
+
+    private function checkResultCode($result)
+    {
+        $code = $this->client->getResultCode();
+
+        if (\Memcached::RES_SUCCESS === $code || \Memcached::RES_NOTFOUND === $code) {
+            return $result;
+        }
+
+        throw new CacheException(sprintf('MemcachedAdapter client error: %s.', strtolower($this->client->getResultMessage())));
+    }
+
+    /**
+     * @return \Memcached
+     */
+    private function getClient()
+    {
+        if ($this->client) {
+            return $this->client;
+        }
+
+        $opt = $this->lazyClient->getOption(\Memcached::OPT_SERIALIZER);
+        if (\Memcached::SERIALIZER_PHP !== $opt && \Memcached::SERIALIZER_IGBINARY !== $opt) {
+            throw new CacheException('MemcachedAdapter: "serializer" option must be "php" or "igbinary".');
+        }
+        if ('' !== $prefix = (string) $this->lazyClient->getOption(\Memcached::OPT_PREFIX_KEY)) {
+            throw new CacheException(sprintf('MemcachedAdapter: "prefix_key" option must be empty when using proxified connections, "%s" given.', $prefix));
+        }
+
+        return $this->client = $this->lazyClient;
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Traits/PdoTrait.php b/advancedcontentfilter/vendor/symfony/cache/Traits/PdoTrait.php
new file mode 100644 (file)
index 0000000..a88099e
--- /dev/null
@@ -0,0 +1,404 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Traits;
+
+use Doctrine\DBAL\Connection;
+use Doctrine\DBAL\Driver\ServerInfoAwareConnection;
+use Doctrine\DBAL\DBALException;
+use Doctrine\DBAL\Schema\Schema;
+use Symfony\Component\Cache\Exception\InvalidArgumentException;
+
+/**
+ * @internal
+ */
+trait PdoTrait
+{
+    private $conn;
+    private $dsn;
+    private $driver;
+    private $serverVersion;
+    private $table = 'cache_items';
+    private $idCol = 'item_id';
+    private $dataCol = 'item_data';
+    private $lifetimeCol = 'item_lifetime';
+    private $timeCol = 'item_time';
+    private $username = '';
+    private $password = '';
+    private $connectionOptions = array();
+    private $namespace;
+
+    private function init($connOrDsn, $namespace, $defaultLifetime, array $options)
+    {
+        if (isset($namespace[0]) && preg_match('#[^-+.A-Za-z0-9]#', $namespace, $match)) {
+            throw new InvalidArgumentException(sprintf('Namespace contains "%s" but only characters in [-+.A-Za-z0-9] are allowed.', $match[0]));
+        }
+
+        if ($connOrDsn instanceof \PDO) {
+            if (\PDO::ERRMODE_EXCEPTION !== $connOrDsn->getAttribute(\PDO::ATTR_ERRMODE)) {
+                throw new InvalidArgumentException(sprintf('"%s" requires PDO error mode attribute be set to throw Exceptions (i.e. $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION))', __CLASS__));
+            }
+
+            $this->conn = $connOrDsn;
+        } elseif ($connOrDsn instanceof Connection) {
+            $this->conn = $connOrDsn;
+        } elseif (is_string($connOrDsn)) {
+            $this->dsn = $connOrDsn;
+        } else {
+            throw new InvalidArgumentException(sprintf('"%s" requires PDO or Doctrine\DBAL\Connection instance or DSN string as first argument, "%s" given.', __CLASS__, is_object($connOrDsn) ? get_class($connOrDsn) : gettype($connOrDsn)));
+        }
+
+        $this->table = isset($options['db_table']) ? $options['db_table'] : $this->table;
+        $this->idCol = isset($options['db_id_col']) ? $options['db_id_col'] : $this->idCol;
+        $this->dataCol = isset($options['db_data_col']) ? $options['db_data_col'] : $this->dataCol;
+        $this->lifetimeCol = isset($options['db_lifetime_col']) ? $options['db_lifetime_col'] : $this->lifetimeCol;
+        $this->timeCol = isset($options['db_time_col']) ? $options['db_time_col'] : $this->timeCol;
+        $this->username = isset($options['db_username']) ? $options['db_username'] : $this->username;
+        $this->password = isset($options['db_password']) ? $options['db_password'] : $this->password;
+        $this->connectionOptions = isset($options['db_connection_options']) ? $options['db_connection_options'] : $this->connectionOptions;
+        $this->namespace = $namespace;
+
+        parent::__construct($namespace, $defaultLifetime);
+    }
+
+    /**
+     * Creates the table to store cache items which can be called once for setup.
+     *
+     * Cache ID are saved in a column of maximum length 255. Cache data is
+     * saved in a BLOB.
+     *
+     * @throws \PDOException    When the table already exists
+     * @throws DBALException    When the table already exists
+     * @throws \DomainException When an unsupported PDO driver is used
+     */
+    public function createTable()
+    {
+        // connect if we are not yet
+        $conn = $this->getConnection();
+
+        if ($conn instanceof Connection) {
+            $types = array(
+                'mysql' => 'binary',
+                'sqlite' => 'text',
+                'pgsql' => 'string',
+                'oci' => 'string',
+                'sqlsrv' => 'string',
+            );
+            if (!isset($types[$this->driver])) {
+                throw new \DomainException(sprintf('Creating the cache table is currently not implemented for PDO driver "%s".', $this->driver));
+            }
+
+            $schema = new Schema();
+            $table = $schema->createTable($this->table);
+            $table->addColumn($this->idCol, $types[$this->driver], array('length' => 255));
+            $table->addColumn($this->dataCol, 'blob', array('length' => 16777215));
+            $table->addColumn($this->lifetimeCol, 'integer', array('unsigned' => true, 'notnull' => false));
+            $table->addColumn($this->timeCol, 'integer', array('unsigned' => true));
+            $table->setPrimaryKey(array($this->idCol));
+
+            foreach ($schema->toSql($conn->getDatabasePlatform()) as $sql) {
+                $conn->exec($sql);
+            }
+
+            return;
+        }
+
+        switch ($this->driver) {
+            case 'mysql':
+                // We use varbinary for the ID column because it prevents unwanted conversions:
+                // - character set conversions between server and client
+                // - trailing space removal
+                // - case-insensitivity
+                // - language processing like é == e
+                $sql = "CREATE TABLE $this->table ($this->idCol VARBINARY(255) NOT NULL PRIMARY KEY, $this->dataCol MEDIUMBLOB NOT NULL, $this->lifetimeCol INTEGER UNSIGNED, $this->timeCol INTEGER UNSIGNED NOT NULL) COLLATE utf8_bin, ENGINE = InnoDB";
+                break;
+            case 'sqlite':
+                $sql = "CREATE TABLE $this->table ($this->idCol TEXT NOT NULL PRIMARY KEY, $this->dataCol BLOB NOT NULL, $this->lifetimeCol INTEGER, $this->timeCol INTEGER NOT NULL)";
+                break;
+            case 'pgsql':
+                $sql = "CREATE TABLE $this->table ($this->idCol VARCHAR(255) NOT NULL PRIMARY KEY, $this->dataCol BYTEA NOT NULL, $this->lifetimeCol INTEGER, $this->timeCol INTEGER NOT NULL)";
+                break;
+            case 'oci':
+                $sql = "CREATE TABLE $this->table ($this->idCol VARCHAR2(255) NOT NULL PRIMARY KEY, $this->dataCol BLOB NOT NULL, $this->lifetimeCol INTEGER, $this->timeCol INTEGER NOT NULL)";
+                break;
+            case 'sqlsrv':
+                $sql = "CREATE TABLE $this->table ($this->idCol VARCHAR(255) NOT NULL PRIMARY KEY, $this->dataCol VARBINARY(MAX) NOT NULL, $this->lifetimeCol INTEGER, $this->timeCol INTEGER NOT NULL)";
+                break;
+            default:
+                throw new \DomainException(sprintf('Creating the cache table is currently not implemented for PDO driver "%s".', $this->driver));
+        }
+
+        $conn->exec($sql);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function prune()
+    {
+        $deleteSql = "DELETE FROM $this->table WHERE $this->lifetimeCol + $this->timeCol <= :time";
+
+        if ('' !== $this->namespace) {
+            $deleteSql .= " AND $this->idCol LIKE :namespace";
+        }
+
+        $delete = $this->getConnection()->prepare($deleteSql);
+        $delete->bindValue(':time', time(), \PDO::PARAM_INT);
+
+        if ('' !== $this->namespace) {
+            $delete->bindValue(':namespace', sprintf('%s%%', $this->namespace), \PDO::PARAM_STR);
+        }
+
+        return $delete->execute();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doFetch(array $ids)
+    {
+        $now = time();
+        $expired = array();
+
+        $sql = str_pad('', (count($ids) << 1) - 1, '?,');
+        $sql = "SELECT $this->idCol, CASE WHEN $this->lifetimeCol IS NULL OR $this->lifetimeCol + $this->timeCol > ? THEN $this->dataCol ELSE NULL END FROM $this->table WHERE $this->idCol IN ($sql)";
+        $stmt = $this->getConnection()->prepare($sql);
+        $stmt->bindValue($i = 1, $now, \PDO::PARAM_INT);
+        foreach ($ids as $id) {
+            $stmt->bindValue(++$i, $id);
+        }
+        $stmt->execute();
+
+        while ($row = $stmt->fetch(\PDO::FETCH_NUM)) {
+            if (null === $row[1]) {
+                $expired[] = $row[0];
+            } else {
+                yield $row[0] => parent::unserialize(is_resource($row[1]) ? stream_get_contents($row[1]) : $row[1]);
+            }
+        }
+
+        if ($expired) {
+            $sql = str_pad('', (count($expired) << 1) - 1, '?,');
+            $sql = "DELETE FROM $this->table WHERE $this->lifetimeCol + $this->timeCol <= ? AND $this->idCol IN ($sql)";
+            $stmt = $this->getConnection()->prepare($sql);
+            $stmt->bindValue($i = 1, $now, \PDO::PARAM_INT);
+            foreach ($expired as $id) {
+                $stmt->bindValue(++$i, $id);
+            }
+            $stmt->execute();
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doHave($id)
+    {
+        $sql = "SELECT 1 FROM $this->table WHERE $this->idCol = :id AND ($this->lifetimeCol IS NULL OR $this->lifetimeCol + $this->timeCol > :time)";
+        $stmt = $this->getConnection()->prepare($sql);
+
+        $stmt->bindValue(':id', $id);
+        $stmt->bindValue(':time', time(), \PDO::PARAM_INT);
+        $stmt->execute();
+
+        return (bool) $stmt->fetchColumn();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doClear($namespace)
+    {
+        $conn = $this->getConnection();
+
+        if ('' === $namespace) {
+            if ('sqlite' === $this->driver) {
+                $sql = "DELETE FROM $this->table";
+            } else {
+                $sql = "TRUNCATE TABLE $this->table";
+            }
+        } else {
+            $sql = "DELETE FROM $this->table WHERE $this->idCol LIKE '$namespace%'";
+        }
+
+        $conn->exec($sql);
+
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doDelete(array $ids)
+    {
+        $sql = str_pad('', (count($ids) << 1) - 1, '?,');
+        $sql = "DELETE FROM $this->table WHERE $this->idCol IN ($sql)";
+        $stmt = $this->getConnection()->prepare($sql);
+        $stmt->execute(array_values($ids));
+
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doSave(array $values, $lifetime)
+    {
+        $serialized = array();
+        $failed = array();
+
+        foreach ($values as $id => $value) {
+            try {
+                $serialized[$id] = serialize($value);
+            } catch (\Exception $e) {
+                $failed[] = $id;
+            }
+        }
+
+        if (!$serialized) {
+            return $failed;
+        }
+
+        $conn = $this->getConnection();
+        $driver = $this->driver;
+        $insertSql = "INSERT INTO $this->table ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (:id, :data, :lifetime, :time)";
+
+        switch (true) {
+            case 'mysql' === $driver:
+                $sql = $insertSql." ON DUPLICATE KEY UPDATE $this->dataCol = VALUES($this->dataCol), $this->lifetimeCol = VALUES($this->lifetimeCol), $this->timeCol = VALUES($this->timeCol)";
+                break;
+            case 'oci' === $driver:
+                // DUAL is Oracle specific dummy table
+                $sql = "MERGE INTO $this->table USING DUAL ON ($this->idCol = ?) ".
+                    "WHEN NOT MATCHED THEN INSERT ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (?, ?, ?, ?) ".
+                    "WHEN MATCHED THEN UPDATE SET $this->dataCol = ?, $this->lifetimeCol = ?, $this->timeCol = ?";
+                break;
+            case 'sqlsrv' === $driver && version_compare($this->getServerVersion(), '10', '>='):
+                // MERGE is only available since SQL Server 2008 and must be terminated by semicolon
+                // It also requires HOLDLOCK according to http://weblogs.sqlteam.com/dang/archive/2009/01/31/UPSERT-Race-Condition-With-MERGE.aspx
+                $sql = "MERGE INTO $this->table WITH (HOLDLOCK) USING (SELECT 1 AS dummy) AS src ON ($this->idCol = ?) ".
+                    "WHEN NOT MATCHED THEN INSERT ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (?, ?, ?, ?) ".
+                    "WHEN MATCHED THEN UPDATE SET $this->dataCol = ?, $this->lifetimeCol = ?, $this->timeCol = ?;";
+                break;
+            case 'sqlite' === $driver:
+                $sql = 'INSERT OR REPLACE'.substr($insertSql, 6);
+                break;
+            case 'pgsql' === $driver && version_compare($this->getServerVersion(), '9.5', '>='):
+                $sql = $insertSql." ON CONFLICT ($this->idCol) DO UPDATE SET ($this->dataCol, $this->lifetimeCol, $this->timeCol) = (EXCLUDED.$this->dataCol, EXCLUDED.$this->lifetimeCol, EXCLUDED.$this->timeCol)";
+                break;
+            default:
+                $driver = null;
+                $sql = "UPDATE $this->table SET $this->dataCol = :data, $this->lifetimeCol = :lifetime, $this->timeCol = :time WHERE $this->idCol = :id";
+                break;
+        }
+
+        $now = time();
+        $lifetime = $lifetime ?: null;
+        $stmt = $conn->prepare($sql);
+
+        if ('sqlsrv' === $driver || 'oci' === $driver) {
+            $stmt->bindParam(1, $id);
+            $stmt->bindParam(2, $id);
+            $stmt->bindParam(3, $data, \PDO::PARAM_LOB);
+            $stmt->bindValue(4, $lifetime, \PDO::PARAM_INT);
+            $stmt->bindValue(5, $now, \PDO::PARAM_INT);
+            $stmt->bindParam(6, $data, \PDO::PARAM_LOB);
+            $stmt->bindValue(7, $lifetime, \PDO::PARAM_INT);
+            $stmt->bindValue(8, $now, \PDO::PARAM_INT);
+        } else {
+            $stmt->bindParam(':id', $id);
+            $stmt->bindParam(':data', $data, \PDO::PARAM_LOB);
+            $stmt->bindValue(':lifetime', $lifetime, \PDO::PARAM_INT);
+            $stmt->bindValue(':time', $now, \PDO::PARAM_INT);
+        }
+        if (null === $driver) {
+            $insertStmt = $conn->prepare($insertSql);
+
+            $insertStmt->bindParam(':id', $id);
+            $insertStmt->bindParam(':data', $data, \PDO::PARAM_LOB);
+            $insertStmt->bindValue(':lifetime', $lifetime, \PDO::PARAM_INT);
+            $insertStmt->bindValue(':time', $now, \PDO::PARAM_INT);
+        }
+
+        foreach ($serialized as $id => $data) {
+            $stmt->execute();
+
+            if (null === $driver && !$stmt->rowCount()) {
+                try {
+                    $insertStmt->execute();
+                } catch (DBALException $e) {
+                } catch (\PDOException $e) {
+                    // A concurrent write won, let it be
+                }
+            }
+        }
+
+        return $failed;
+    }
+
+    /**
+     * @return \PDO|Connection
+     */
+    private function getConnection()
+    {
+        if (null === $this->conn) {
+            $this->conn = new \PDO($this->dsn, $this->username, $this->password, $this->connectionOptions);
+            $this->conn->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
+        }
+        if (null === $this->driver) {
+            if ($this->conn instanceof \PDO) {
+                $this->driver = $this->conn->getAttribute(\PDO::ATTR_DRIVER_NAME);
+            } else {
+                switch ($this->driver = $this->conn->getDriver()->getName()) {
+                    case 'mysqli':
+                    case 'pdo_mysql':
+                    case 'drizzle_pdo_mysql':
+                        $this->driver = 'mysql';
+                        break;
+                    case 'pdo_sqlite':
+                        $this->driver = 'sqlite';
+                        break;
+                    case 'pdo_pgsql':
+                        $this->driver = 'pgsql';
+                        break;
+                    case 'oci8':
+                    case 'pdo_oracle':
+                        $this->driver = 'oci';
+                        break;
+                    case 'pdo_sqlsrv':
+                        $this->driver = 'sqlsrv';
+                        break;
+                }
+            }
+        }
+
+        return $this->conn;
+    }
+
+    /**
+     * @return string
+     */
+    private function getServerVersion()
+    {
+        if (null === $this->serverVersion) {
+            $conn = $this->conn instanceof \PDO ? $this->conn : $this->conn->getWrappedConnection();
+            if ($conn instanceof \PDO) {
+                $this->serverVersion = $conn->getAttribute(\PDO::ATTR_SERVER_VERSION);
+            } elseif ($conn instanceof ServerInfoAwareConnection) {
+                $this->serverVersion = $conn->getServerVersion();
+            } else {
+                $this->serverVersion = '0';
+            }
+        }
+
+        return $this->serverVersion;
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Traits/PhpArrayTrait.php b/advancedcontentfilter/vendor/symfony/cache/Traits/PhpArrayTrait.php
new file mode 100644 (file)
index 0000000..ae634d6
--- /dev/null
@@ -0,0 +1,142 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Traits;
+
+use Symfony\Component\Cache\CacheItem;
+use Symfony\Component\Cache\Exception\InvalidArgumentException;
+
+/**
+ * @author Titouan Galopin <galopintitouan@gmail.com>
+ * @author Nicolas Grekas <p@tchwork.com>
+ *
+ * @internal
+ */
+trait PhpArrayTrait
+{
+    use ProxyTrait;
+
+    private $file;
+    private $values;
+    private $zendDetectUnicode;
+
+    /**
+     * Store an array of cached values.
+     *
+     * @param array $values The cached values
+     */
+    public function warmUp(array $values)
+    {
+        if (file_exists($this->file)) {
+            if (!is_file($this->file)) {
+                throw new InvalidArgumentException(sprintf('Cache path exists and is not a file: %s.', $this->file));
+            }
+
+            if (!is_writable($this->file)) {
+                throw new InvalidArgumentException(sprintf('Cache file is not writable: %s.', $this->file));
+            }
+        } else {
+            $directory = dirname($this->file);
+
+            if (!is_dir($directory) && !@mkdir($directory, 0777, true)) {
+                throw new InvalidArgumentException(sprintf('Cache directory does not exist and cannot be created: %s.', $directory));
+            }
+
+            if (!is_writable($directory)) {
+                throw new InvalidArgumentException(sprintf('Cache directory is not writable: %s.', $directory));
+            }
+        }
+
+        $dump = <<<'EOF'
+<?php
+
+// This file has been auto-generated by the Symfony Cache Component.
+
+return array(
+
+
+EOF;
+
+        foreach ($values as $key => $value) {
+            CacheItem::validateKey(is_int($key) ? (string) $key : $key);
+
+            if (null === $value || is_object($value)) {
+                try {
+                    $value = serialize($value);
+                } catch (\Exception $e) {
+                    throw new InvalidArgumentException(sprintf('Cache key "%s" has non-serializable %s value.', $key, get_class($value)), 0, $e);
+                }
+            } elseif (is_array($value)) {
+                try {
+                    $serialized = serialize($value);
+                    $unserialized = unserialize($serialized);
+                } catch (\Exception $e) {
+                    throw new InvalidArgumentException(sprintf('Cache key "%s" has non-serializable array value.', $key), 0, $e);
+                }
+                // Store arrays serialized if they contain any objects or references
+                if ($unserialized !== $value || (false !== strpos($serialized, ';R:') && preg_match('/;R:[1-9]/', $serialized))) {
+                    $value = $serialized;
+                }
+            } elseif (is_string($value)) {
+                // Serialize strings if they could be confused with serialized objects or arrays
+                if ('N;' === $value || (isset($value[2]) && ':' === $value[1])) {
+                    $value = serialize($value);
+                }
+            } elseif (!is_scalar($value)) {
+                throw new InvalidArgumentException(sprintf('Cache key "%s" has non-serializable %s value.', $key, gettype($value)));
+            }
+
+            $dump .= var_export($key, true).' => '.var_export($value, true).",\n";
+        }
+
+        $dump .= "\n);\n";
+        $dump = str_replace("' . \"\\0\" . '", "\0", $dump);
+
+        $tmpFile = uniqid($this->file, true);
+
+        file_put_contents($tmpFile, $dump);
+        @chmod($tmpFile, 0666 & ~umask());
+        unset($serialized, $unserialized, $value, $dump);
+
+        @rename($tmpFile, $this->file);
+
+        $this->initialize();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function clear()
+    {
+        $this->values = array();
+
+        $cleared = @unlink($this->file) || !file_exists($this->file);
+
+        return $this->pool->clear() && $cleared;
+    }
+
+    /**
+     * Load the cache file.
+     */
+    private function initialize()
+    {
+        if ($this->zendDetectUnicode) {
+            $zmb = ini_set('zend.detect_unicode', 0);
+        }
+        try {
+            $this->values = file_exists($this->file) ? (include $this->file ?: array()) : array();
+        } finally {
+            if ($this->zendDetectUnicode) {
+                ini_set('zend.detect_unicode', $zmb);
+            }
+        }
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Traits/PhpFilesTrait.php b/advancedcontentfilter/vendor/symfony/cache/Traits/PhpFilesTrait.php
new file mode 100644 (file)
index 0000000..c800e1a
--- /dev/null
@@ -0,0 +1,158 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Traits;
+
+use Symfony\Component\Cache\Exception\CacheException;
+use Symfony\Component\Cache\Exception\InvalidArgumentException;
+
+/**
+ * @author Piotr Stankowski <git@trakos.pl>
+ * @author Nicolas Grekas <p@tchwork.com>
+ * @author Rob Frawley 2nd <rmf@src.run>
+ *
+ * @internal
+ */
+trait PhpFilesTrait
+{
+    use FilesystemCommonTrait;
+
+    private $includeHandler;
+    private $zendDetectUnicode;
+
+    public static function isSupported()
+    {
+        return function_exists('opcache_invalidate') && ini_get('opcache.enable');
+    }
+
+    /**
+     * @return bool
+     */
+    public function prune()
+    {
+        $time = time();
+        $pruned = true;
+        $allowCompile = 'cli' !== PHP_SAPI || ini_get('opcache.enable_cli');
+
+        set_error_handler($this->includeHandler);
+        try {
+            foreach (new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($this->directory, \FilesystemIterator::SKIP_DOTS), \RecursiveIteratorIterator::LEAVES_ONLY) as $file) {
+                list($expiresAt) = include $file;
+
+                if ($time >= $expiresAt) {
+                    $pruned = @unlink($file) && !file_exists($file) && $pruned;
+
+                    if ($allowCompile) {
+                        @opcache_invalidate($file, true);
+                    }
+                }
+            }
+        } finally {
+            restore_error_handler();
+        }
+
+        return $pruned;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doFetch(array $ids)
+    {
+        $values = array();
+        $now = time();
+
+        if ($this->zendDetectUnicode) {
+            $zmb = ini_set('zend.detect_unicode', 0);
+        }
+        set_error_handler($this->includeHandler);
+        try {
+            foreach ($ids as $id) {
+                try {
+                    $file = $this->getFile($id);
+                    list($expiresAt, $values[$id]) = include $file;
+                    if ($now >= $expiresAt) {
+                        unset($values[$id]);
+                    }
+                } catch (\Exception $e) {
+                    continue;
+                }
+            }
+        } finally {
+            restore_error_handler();
+            if ($this->zendDetectUnicode) {
+                ini_set('zend.detect_unicode', $zmb);
+            }
+        }
+
+        foreach ($values as $id => $value) {
+            if ('N;' === $value) {
+                $values[$id] = null;
+            } elseif (is_string($value) && isset($value[2]) && ':' === $value[1]) {
+                $values[$id] = parent::unserialize($value);
+            }
+        }
+
+        return $values;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doHave($id)
+    {
+        return (bool) $this->doFetch(array($id));
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doSave(array $values, $lifetime)
+    {
+        $ok = true;
+        $data = array($lifetime ? time() + $lifetime : PHP_INT_MAX, '');
+        $allowCompile = 'cli' !== PHP_SAPI || ini_get('opcache.enable_cli');
+
+        foreach ($values as $key => $value) {
+            if (null === $value || is_object($value)) {
+                $value = serialize($value);
+            } elseif (is_array($value)) {
+                $serialized = serialize($value);
+                $unserialized = parent::unserialize($serialized);
+                // Store arrays serialized if they contain any objects or references
+                if ($unserialized !== $value || (false !== strpos($serialized, ';R:') && preg_match('/;R:[1-9]/', $serialized))) {
+                    $value = $serialized;
+                }
+            } elseif (is_string($value)) {
+                // Serialize strings if they could be confused with serialized objects or arrays
+                if ('N;' === $value || (isset($value[2]) && ':' === $value[1])) {
+                    $value = serialize($value);
+                }
+            } elseif (!is_scalar($value)) {
+                throw new InvalidArgumentException(sprintf('Cache key "%s" has non-serializable %s value.', $key, gettype($value)));
+            }
+
+            $data[1] = $value;
+            $file = $this->getFile($key, true);
+            $ok = $this->write($file, '<?php return '.var_export($data, true).';') && $ok;
+
+            if ($allowCompile) {
+                @opcache_invalidate($file, true);
+            }
+        }
+
+        if (!$ok && !is_writable($this->directory)) {
+            throw new CacheException(sprintf('Cache directory is not writable (%s)', $this->directory));
+        }
+
+        return $ok;
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Traits/ProxyTrait.php b/advancedcontentfilter/vendor/symfony/cache/Traits/ProxyTrait.php
new file mode 100644 (file)
index 0000000..06dba7e
--- /dev/null
@@ -0,0 +1,41 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Traits;
+
+use Symfony\Component\Cache\PruneableInterface;
+use Symfony\Component\Cache\ResettableInterface;
+
+/**
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+trait ProxyTrait
+{
+    private $pool;
+
+    /**
+     * {@inheritdoc}
+     */
+    public function prune()
+    {
+        return $this->pool instanceof PruneableInterface && $this->pool->prune();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function reset()
+    {
+        if ($this->pool instanceof ResettableInterface) {
+            $this->pool->reset();
+        }
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Traits/RedisProxy.php b/advancedcontentfilter/vendor/symfony/cache/Traits/RedisProxy.php
new file mode 100644 (file)
index 0000000..b328f94
--- /dev/null
@@ -0,0 +1,65 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Traits;
+
+/**
+ * @author Nicolas Grekas <p@tchwork.com>
+ *
+ * @internal
+ */
+class RedisProxy
+{
+    private $redis;
+    private $initializer;
+    private $ready = false;
+
+    public function __construct(\Redis $redis, \Closure $initializer)
+    {
+        $this->redis = $redis;
+        $this->initializer = $initializer;
+    }
+
+    public function __call($method, array $args)
+    {
+        $this->ready ?: $this->ready = $this->initializer->__invoke($this->redis);
+
+        return \call_user_func_array(array($this->redis, $method), $args);
+    }
+
+    public function hscan($strKey, &$iIterator, $strPattern = null, $iCount = null)
+    {
+        $this->ready ?: $this->ready = $this->initializer->__invoke($this->redis);
+
+        return $this->redis->hscan($strKey, $iIterator, $strPattern, $iCount);
+    }
+
+    public function scan(&$iIterator, $strPattern = null, $iCount = null)
+    {
+        $this->ready ?: $this->ready = $this->initializer->__invoke($this->redis);
+
+        return $this->redis->scan($iIterator, $strPattern, $iCount);
+    }
+
+    public function sscan($strKey, &$iIterator, $strPattern = null, $iCount = null)
+    {
+        $this->ready ?: $this->ready = $this->initializer->__invoke($this->redis);
+
+        return $this->redis->sscan($strKey, $iIterator, $strPattern, $iCount);
+    }
+
+    public function zscan($strKey, &$iIterator, $strPattern = null, $iCount = null)
+    {
+        $this->ready ?: $this->ready = $this->initializer->__invoke($this->redis);
+
+        return $this->redis->zscan($strKey, $iIterator, $strPattern, $iCount);
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/Traits/RedisTrait.php b/advancedcontentfilter/vendor/symfony/cache/Traits/RedisTrait.php
new file mode 100644 (file)
index 0000000..ac8b5a5
--- /dev/null
@@ -0,0 +1,356 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Cache\Traits;
+
+use Predis\Connection\Factory;
+use Predis\Connection\Aggregate\ClusterInterface;
+use Predis\Connection\Aggregate\PredisCluster;
+use Predis\Connection\Aggregate\RedisCluster;
+use Predis\Response\Status;
+use Symfony\Component\Cache\Exception\CacheException;
+use Symfony\Component\Cache\Exception\InvalidArgumentException;
+
+/**
+ * @author Aurimas Niekis <aurimas@niekis.lt>
+ * @author Nicolas Grekas <p@tchwork.com>
+ *
+ * @internal
+ */
+trait RedisTrait
+{
+    private static $defaultConnectionOptions = array(
+        'class' => null,
+        'persistent' => 0,
+        'persistent_id' => null,
+        'timeout' => 30,
+        'read_timeout' => 0,
+        'retry_interval' => 0,
+        'lazy' => false,
+    );
+    private $redis;
+
+    /**
+     * @param \Redis|\RedisArray|\RedisCluster|\Predis\Client $redisClient
+     */
+    public function init($redisClient, $namespace = '', $defaultLifetime = 0)
+    {
+        parent::__construct($namespace, $defaultLifetime);
+
+        if (preg_match('#[^-+_.A-Za-z0-9]#', $namespace, $match)) {
+            throw new InvalidArgumentException(sprintf('RedisAdapter namespace contains "%s" but only characters in [-+_.A-Za-z0-9] are allowed.', $match[0]));
+        }
+        if ($redisClient instanceof \RedisCluster) {
+            $this->enableVersioning();
+        } elseif (!$redisClient instanceof \Redis && !$redisClient instanceof \RedisArray && !$redisClient instanceof \Predis\Client && !$redisClient instanceof RedisProxy) {
+            throw new InvalidArgumentException(sprintf('%s() expects parameter 1 to be Redis, RedisArray, RedisCluster or Predis\Client, %s given', __METHOD__, is_object($redisClient) ? get_class($redisClient) : gettype($redisClient)));
+        }
+        $this->redis = $redisClient;
+    }
+
+    /**
+     * Creates a Redis connection using a DSN configuration.
+     *
+     * Example DSN:
+     *   - redis://localhost
+     *   - redis://example.com:1234
+     *   - redis://secret@example.com/13
+     *   - redis:///var/run/redis.sock
+     *   - redis://secret@/var/run/redis.sock/13
+     *
+     * @param string $dsn
+     * @param array  $options See self::$defaultConnectionOptions
+     *
+     * @throws InvalidArgumentException when the DSN is invalid
+     *
+     * @return \Redis|\Predis\Client According to the "class" option
+     */
+    public static function createConnection($dsn, array $options = array())
+    {
+        if (0 !== strpos($dsn, 'redis://')) {
+            throw new InvalidArgumentException(sprintf('Invalid Redis DSN: %s does not start with "redis://"', $dsn));
+        }
+        $params = preg_replace_callback('#^redis://(?:(?:[^:@]*+:)?([^@]*+)@)?#', function ($m) use (&$auth) {
+            if (isset($m[1])) {
+                $auth = $m[1];
+            }
+
+            return 'file://';
+        }, $dsn);
+        if (false === $params = parse_url($params)) {
+            throw new InvalidArgumentException(sprintf('Invalid Redis DSN: %s', $dsn));
+        }
+        if (!isset($params['host']) && !isset($params['path'])) {
+            throw new InvalidArgumentException(sprintf('Invalid Redis DSN: %s', $dsn));
+        }
+        if (isset($params['path']) && preg_match('#/(\d+)$#', $params['path'], $m)) {
+            $params['dbindex'] = $m[1];
+            $params['path'] = substr($params['path'], 0, -strlen($m[0]));
+        }
+        if (isset($params['host'])) {
+            $scheme = 'tcp';
+        } else {
+            $scheme = 'unix';
+        }
+        $params += array(
+            'host' => isset($params['host']) ? $params['host'] : $params['path'],
+            'port' => isset($params['host']) ? 6379 : null,
+            'dbindex' => 0,
+        );
+        if (isset($params['query'])) {
+            parse_str($params['query'], $query);
+            $params += $query;
+        }
+        $params += $options + self::$defaultConnectionOptions;
+        if (null === $params['class'] && !extension_loaded('redis') && !class_exists(\Predis\Client::class)) {
+            throw new CacheException(sprintf('Cannot find the "redis" extension, and "predis/predis" is not installed: %s', $dsn));
+        }
+        $class = null === $params['class'] ? (extension_loaded('redis') ? \Redis::class : \Predis\Client::class) : $params['class'];
+
+        if (is_a($class, \Redis::class, true)) {
+            $connect = $params['persistent'] || $params['persistent_id'] ? 'pconnect' : 'connect';
+            $redis = new $class();
+
+            $initializer = function ($redis) use ($connect, $params, $dsn, $auth) {
+                try {
+                    @$redis->{$connect}($params['host'], $params['port'], $params['timeout'], $params['persistent_id'], $params['retry_interval']);
+                } catch (\RedisException $e) {
+                    throw new InvalidArgumentException(sprintf('Redis connection failed (%s): %s', $e->getMessage(), $dsn));
+                }
+
+                if (@!$redis->isConnected()) {
+                    $e = ($e = error_get_last()) && preg_match('/^Redis::p?connect\(\): (.*)/', $e['message'], $e) ? sprintf(' (%s)', $e[1]) : '';
+                    throw new InvalidArgumentException(sprintf('Redis connection failed%s: %s', $e, $dsn));
+                }
+
+                if ((null !== $auth && !$redis->auth($auth))
+                    || ($params['dbindex'] && !$redis->select($params['dbindex']))
+                    || ($params['read_timeout'] && !$redis->setOption(\Redis::OPT_READ_TIMEOUT, $params['read_timeout']))
+                ) {
+                    $e = preg_replace('/^ERR /', '', $redis->getLastError());
+                    throw new InvalidArgumentException(sprintf('Redis connection failed (%s): %s', $e, $dsn));
+                }
+
+                return true;
+            };
+
+            if ($params['lazy']) {
+                $redis = new RedisProxy($redis, $initializer);
+            } else {
+                $initializer($redis);
+            }
+        } elseif (is_a($class, \Predis\Client::class, true)) {
+            $params['scheme'] = $scheme;
+            $params['database'] = $params['dbindex'] ?: null;
+            $params['password'] = $auth;
+            $redis = new $class((new Factory())->create($params));
+        } elseif (class_exists($class, false)) {
+            throw new InvalidArgumentException(sprintf('"%s" is not a subclass of "Redis" or "Predis\Client"', $class));
+        } else {
+            throw new InvalidArgumentException(sprintf('Class "%s" does not exist', $class));
+        }
+
+        return $redis;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doFetch(array $ids)
+    {
+        if ($ids) {
+            $values = $this->pipeline(function () use ($ids) {
+                foreach ($ids as $id) {
+                    yield 'get' => array($id);
+                }
+            });
+            foreach ($values as $id => $v) {
+                if ($v) {
+                    yield $id => parent::unserialize($v);
+                }
+            }
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doHave($id)
+    {
+        return (bool) $this->redis->exists($id);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doClear($namespace)
+    {
+        // When using a native Redis cluster, clearing the cache is done by versioning in AbstractTrait::clear().
+        // This means old keys are not really removed until they expire and may need gargage collection.
+
+        $cleared = true;
+        $hosts = array($this->redis);
+        $evalArgs = array(array($namespace), 0);
+
+        if ($this->redis instanceof \Predis\Client) {
+            $evalArgs = array(0, $namespace);
+
+            $connection = $this->redis->getConnection();
+            if ($connection instanceof PredisCluster) {
+                $hosts = array();
+                foreach ($connection as $c) {
+                    $hosts[] = new \Predis\Client($c);
+                }
+            } elseif ($connection instanceof RedisCluster) {
+                return false;
+            }
+        } elseif ($this->redis instanceof \RedisArray) {
+            $hosts = array();
+            foreach ($this->redis->_hosts() as $host) {
+                $hosts[] = $this->redis->_instance($host);
+            }
+        } elseif ($this->redis instanceof \RedisCluster) {
+            return false;
+        }
+        foreach ($hosts as $host) {
+            if (!isset($namespace[0])) {
+                $cleared = $host->flushDb() && $cleared;
+                continue;
+            }
+
+            $info = $host->info('Server');
+            $info = isset($info['Server']) ? $info['Server'] : $info;
+
+            if (!version_compare($info['redis_version'], '2.8', '>=')) {
+                // As documented in Redis documentation (http://redis.io/commands/keys) using KEYS
+                // can hang your server when it is executed against large databases (millions of items).
+                // Whenever you hit this scale, you should really consider upgrading to Redis 2.8 or above.
+                $cleared = $host->eval("local keys=redis.call('KEYS',ARGV[1]..'*') for i=1,#keys,5000 do redis.call('DEL',unpack(keys,i,math.min(i+4999,#keys))) end return 1", $evalArgs[0], $evalArgs[1]) && $cleared;
+                continue;
+            }
+
+            $cursor = null;
+            do {
+                $keys = $host instanceof \Predis\Client ? $host->scan($cursor, 'MATCH', $namespace.'*', 'COUNT', 1000) : $host->scan($cursor, $namespace.'*', 1000);
+                if (isset($keys[1]) && is_array($keys[1])) {
+                    $cursor = $keys[0];
+                    $keys = $keys[1];
+                }
+                if ($keys) {
+                    $host->del($keys);
+                }
+            } while ($cursor = (int) $cursor);
+        }
+
+        return $cleared;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doDelete(array $ids)
+    {
+        if ($ids) {
+            $this->redis->del($ids);
+        }
+
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doSave(array $values, $lifetime)
+    {
+        $serialized = array();
+        $failed = array();
+
+        foreach ($values as $id => $value) {
+            try {
+                $serialized[$id] = serialize($value);
+            } catch (\Exception $e) {
+                $failed[] = $id;
+            }
+        }
+
+        if (!$serialized) {
+            return $failed;
+        }
+
+        $results = $this->pipeline(function () use ($serialized, $lifetime) {
+            foreach ($serialized as $id => $value) {
+                if (0 >= $lifetime) {
+                    yield 'set' => array($id, $value);
+                } else {
+                    yield 'setEx' => array($id, $lifetime, $value);
+                }
+            }
+        });
+        foreach ($results as $id => $result) {
+            if (true !== $result && (!$result instanceof Status || $result !== Status::get('OK'))) {
+                $failed[] = $id;
+            }
+        }
+
+        return $failed;
+    }
+
+    private function pipeline(\Closure $generator)
+    {
+        $ids = array();
+
+        if ($this->redis instanceof \Predis\Client && !$this->redis->getConnection() instanceof ClusterInterface) {
+            $results = $this->redis->pipeline(function ($redis) use ($generator, &$ids) {
+                foreach ($generator() as $command => $args) {
+                    call_user_func_array(array($redis, $command), $args);
+                    $ids[] = $args[0];
+                }
+            });
+        } elseif ($this->redis instanceof \RedisArray) {
+            $connections = $results = $ids = array();
+            foreach ($generator() as $command => $args) {
+                if (!isset($connections[$h = $this->redis->_target($args[0])])) {
+                    $connections[$h] = array($this->redis->_instance($h), -1);
+                    $connections[$h][0]->multi(\Redis::PIPELINE);
+                }
+                call_user_func_array(array($connections[$h][0], $command), $args);
+                $results[] = array($h, ++$connections[$h][1]);
+                $ids[] = $args[0];
+            }
+            foreach ($connections as $h => $c) {
+                $connections[$h] = $c[0]->exec();
+            }
+            foreach ($results as $k => list($h, $c)) {
+                $results[$k] = $connections[$h][$c];
+            }
+        } elseif ($this->redis instanceof \RedisCluster || ($this->redis instanceof \Predis\Client && $this->redis->getConnection() instanceof ClusterInterface)) {
+            // phpredis & predis don't support pipelining with RedisCluster
+            // see https://github.com/phpredis/phpredis/blob/develop/cluster.markdown#pipelining
+            // see https://github.com/nrk/predis/issues/267#issuecomment-123781423
+            $results = array();
+            foreach ($generator() as $command => $args) {
+                $results[] = call_user_func_array(array($this->redis, $command), $args);
+                $ids[] = $args[0];
+            }
+        } else {
+            $this->redis->multi(\Redis::PIPELINE);
+            foreach ($generator() as $command => $args) {
+                call_user_func_array(array($this->redis, $command), $args);
+                $ids[] = $args[0];
+            }
+            $results = $this->redis->exec();
+        }
+
+        foreach ($ids as $k => $id) {
+            yield $id => $results[$k];
+        }
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/composer.json b/advancedcontentfilter/vendor/symfony/cache/composer.json
new file mode 100644 (file)
index 0000000..e13cd96
--- /dev/null
@@ -0,0 +1,50 @@
+{
+    "name": "symfony/cache",
+    "type": "library",
+    "description": "Symfony Cache component with PSR-6, PSR-16, and tags",
+    "keywords": ["caching", "psr6"],
+    "homepage": "https://symfony.com",
+    "license": "MIT",
+    "authors": [
+        {
+            "name": "Nicolas Grekas",
+            "email": "p@tchwork.com"
+        },
+        {
+            "name": "Symfony Community",
+            "homepage": "https://symfony.com/contributors"
+        }
+    ],
+    "provide": {
+        "psr/cache-implementation": "1.0",
+        "psr/simple-cache-implementation": "1.0"
+    },
+    "require": {
+        "php": "^5.5.9|>=7.0.8",
+        "psr/cache": "~1.0",
+        "psr/log": "~1.0",
+        "psr/simple-cache": "^1.0",
+        "symfony/polyfill-apcu": "~1.1"
+    },
+    "require-dev": {
+        "cache/integration-tests": "dev-master",
+        "doctrine/cache": "~1.6",
+        "doctrine/dbal": "~2.4",
+        "predis/predis": "~1.0"
+    },
+    "conflict": {
+        "symfony/var-dumper": "<3.3"
+    },
+    "autoload": {
+        "psr-4": { "Symfony\\Component\\Cache\\": "" },
+        "exclude-from-classmap": [
+            "/Tests/"
+        ]
+    },
+    "minimum-stability": "dev",
+    "extra": {
+        "branch-alias": {
+            "dev-master": "3.4-dev"
+        }
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/cache/phpunit.xml.dist b/advancedcontentfilter/vendor/symfony/cache/phpunit.xml.dist
new file mode 100644 (file)
index 0000000..9b3c30d
--- /dev/null
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:noNamespaceSchemaLocation="http://schema.phpunit.de/4.1/phpunit.xsd"
+         backupGlobals="false"
+         colors="true"
+         bootstrap="vendor/autoload.php"
+         failOnRisky="true"
+         failOnWarning="true"
+>
+    <php>
+        <ini name="error_reporting" value="-1" />
+        <env name="REDIS_HOST" value="localhost" />
+        <env name="MEMCACHED_HOST" value="localhost" />
+    </php>
+
+    <testsuites>
+        <testsuite name="Symfony Cache Component Test Suite">
+            <directory>./Tests/</directory>
+        </testsuite>
+    </testsuites>
+
+    <filter>
+        <whitelist>
+            <directory>./</directory>
+            <exclude>
+                <directory>./Tests</directory>
+                <directory>./vendor</directory>
+            </exclude>
+        </whitelist>
+    </filter>
+
+    <listeners>
+        <listener class="Symfony\Bridge\PhpUnit\SymfonyTestsListener">
+            <arguments>
+                <array>
+                    <element key="time-sensitive">
+                        <array>
+                            <element><string>Cache\IntegrationTests</string></element>
+                            <element><string>Doctrine\Common\Cache</string></element>
+                            <element><string>Symfony\Component\Cache</string></element>
+                            <element><string>Symfony\Component\Cache\Tests\Fixtures</string></element>
+                            <element><string>Symfony\Component\Cache\Traits</string></element>
+                        </array>
+                    </element>
+                </array>
+            </arguments>
+        </listener>
+    </listeners>
+</phpunit>
diff --git a/advancedcontentfilter/vendor/symfony/expression-language/.gitignore b/advancedcontentfilter/vendor/symfony/expression-language/.gitignore
new file mode 100644 (file)
index 0000000..c49a5d8
--- /dev/null
@@ -0,0 +1,3 @@
+vendor/
+composer.lock
+phpunit.xml
diff --git a/advancedcontentfilter/vendor/symfony/expression-language/CHANGELOG.md b/advancedcontentfilter/vendor/symfony/expression-language/CHANGELOG.md
new file mode 100644 (file)
index 0000000..d00d17c
--- /dev/null
@@ -0,0 +1,12 @@
+CHANGELOG
+=========
+
+2.6.0
+-----
+
+ * Added ExpressionFunction and ExpressionFunctionProviderInterface
+
+2.4.0
+-----
+
+ * added the component
diff --git a/advancedcontentfilter/vendor/symfony/expression-language/Compiler.php b/advancedcontentfilter/vendor/symfony/expression-language/Compiler.php
new file mode 100644 (file)
index 0000000..66d1060
--- /dev/null
@@ -0,0 +1,146 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\ExpressionLanguage;
+
+/**
+ * Compiles a node to PHP code.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class Compiler
+{
+    private $source;
+    private $functions;
+
+    public function __construct(array $functions)
+    {
+        $this->functions = $functions;
+    }
+
+    public function getFunction($name)
+    {
+        return $this->functions[$name];
+    }
+
+    /**
+     * Gets the current PHP code after compilation.
+     *
+     * @return string The PHP code
+     */
+    public function getSource()
+    {
+        return $this->source;
+    }
+
+    public function reset()
+    {
+        $this->source = '';
+
+        return $this;
+    }
+
+    /**
+     * Compiles a node.
+     *
+     * @return $this
+     */
+    public function compile(Node\Node $node)
+    {
+        $node->compile($this);
+
+        return $this;
+    }
+
+    public function subcompile(Node\Node $node)
+    {
+        $current = $this->source;
+        $this->source = '';
+
+        $node->compile($this);
+
+        $source = $this->source;
+        $this->source = $current;
+
+        return $source;
+    }
+
+    /**
+     * Adds a raw string to the compiled code.
+     *
+     * @param string $string The string
+     *
+     * @return $this
+     */
+    public function raw($string)
+    {
+        $this->source .= $string;
+
+        return $this;
+    }
+
+    /**
+     * Adds a quoted string to the compiled code.
+     *
+     * @param string $value The string
+     *
+     * @return $this
+     */
+    public function string($value)
+    {
+        $this->source .= sprintf('"%s"', addcslashes($value, "\0\t\"\$\\"));
+
+        return $this;
+    }
+
+    /**
+     * Returns a PHP representation of a given value.
+     *
+     * @param mixed $value The value to convert
+     *
+     * @return $this
+     */
+    public function repr($value)
+    {
+        if (is_int($value) || is_float($value)) {
+            if (false !== $locale = setlocale(LC_NUMERIC, 0)) {
+                setlocale(LC_NUMERIC, 'C');
+            }
+
+            $this->raw($value);
+
+            if (false !== $locale) {
+                setlocale(LC_NUMERIC, $locale);
+            }
+        } elseif (null === $value) {
+            $this->raw('null');
+        } elseif (is_bool($value)) {
+            $this->raw($value ? 'true' : 'false');
+        } elseif (is_array($value)) {
+            $this->raw('array(');
+            $first = true;
+            foreach ($value as $key => $value) {
+                if (!$first) {
+                    $this->raw(', ');
+                }
+                $first = false;
+                $this->repr($key);
+                $this->raw(' => ');
+                $this->repr($value);
+            }
+            $this->raw(')');
+        } else {
+            $this->string($value);
+        }
+
+        return $this;
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/expression-language/Expression.php b/advancedcontentfilter/vendor/symfony/expression-language/Expression.php
new file mode 100644 (file)
index 0000000..ac656cc
--- /dev/null
@@ -0,0 +1,40 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\ExpressionLanguage;
+
+/**
+ * Represents an expression.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class Expression
+{
+    protected $expression;
+
+    /**
+     * @param string $expression An expression
+     */
+    public function __construct($expression)
+    {
+        $this->expression = (string) $expression;
+    }
+
+    /**
+     * Gets the expression.
+     *
+     * @return string The expression
+     */
+    public function __toString()
+    {
+        return $this->expression;
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/expression-language/ExpressionFunction.php b/advancedcontentfilter/vendor/symfony/expression-language/ExpressionFunction.php
new file mode 100644 (file)
index 0000000..ad775db
--- /dev/null
@@ -0,0 +1,100 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\ExpressionLanguage;
+
+/**
+ * Represents a function that can be used in an expression.
+ *
+ * A function is defined by two PHP callables. The callables are used
+ * by the language to compile and/or evaluate the function.
+ *
+ * The "compiler" function is used at compilation time and must return a
+ * PHP representation of the function call (it receives the function
+ * arguments as arguments).
+ *
+ * The "evaluator" function is used for expression evaluation and must return
+ * the value of the function call based on the values defined for the
+ * expression (it receives the values as a first argument and the function
+ * arguments as remaining arguments).
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class ExpressionFunction
+{
+    private $name;
+    private $compiler;
+    private $evaluator;
+
+    /**
+     * @param string   $name      The function name
+     * @param callable $compiler  A callable able to compile the function
+     * @param callable $evaluator A callable able to evaluate the function
+     */
+    public function __construct($name, callable $compiler, callable $evaluator)
+    {
+        $this->name = $name;
+        $this->compiler = $compiler;
+        $this->evaluator = $evaluator;
+    }
+
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    public function getCompiler()
+    {
+        return $this->compiler;
+    }
+
+    public function getEvaluator()
+    {
+        return $this->evaluator;
+    }
+
+    /**
+     * Creates an ExpressionFunction from a PHP function name.
+     *
+     * @param string      $phpFunctionName        The PHP function name
+     * @param string|null $expressionFunctionName The expression function name (default: same than the PHP function name)
+     *
+     * @return self
+     *
+     * @throws \InvalidArgumentException if given PHP function name does not exist
+     * @throws \InvalidArgumentException if given PHP function name is in namespace
+     *                                   and expression function name is not defined
+     */
+    public static function fromPhp($phpFunctionName, $expressionFunctionName = null)
+    {
+        $phpFunctionName = ltrim($phpFunctionName, '\\');
+        if (!function_exists($phpFunctionName)) {
+            throw new \InvalidArgumentException(sprintf('PHP function "%s" does not exist.', $phpFunctionName));
+        }
+
+        $parts = explode('\\', $phpFunctionName);
+        if (!$expressionFunctionName && count($parts) > 1) {
+            throw new \InvalidArgumentException(sprintf('An expression function name must be defined when PHP function "%s" is namespaced.', $phpFunctionName));
+        }
+
+        $compiler = function () use ($phpFunctionName) {
+            return sprintf('\%s(%s)', $phpFunctionName, implode(', ', func_get_args()));
+        };
+
+        $evaluator = function () use ($phpFunctionName) {
+            $args = func_get_args();
+
+            return call_user_func_array($phpFunctionName, array_splice($args, 1));
+        };
+
+        return new self($expressionFunctionName ?: end($parts), $compiler, $evaluator);
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/expression-language/ExpressionFunctionProviderInterface.php b/advancedcontentfilter/vendor/symfony/expression-language/ExpressionFunctionProviderInterface.php
new file mode 100644 (file)
index 0000000..414b013
--- /dev/null
@@ -0,0 +1,23 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\ExpressionLanguage;
+
+/**
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+interface ExpressionFunctionProviderInterface
+{
+    /**
+     * @return ExpressionFunction[] An array of Function instances
+     */
+    public function getFunctions();
+}
diff --git a/advancedcontentfilter/vendor/symfony/expression-language/ExpressionLanguage.php b/advancedcontentfilter/vendor/symfony/expression-language/ExpressionLanguage.php
new file mode 100644 (file)
index 0000000..a9cfc4c
--- /dev/null
@@ -0,0 +1,178 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\ExpressionLanguage;
+
+use Psr\Cache\CacheItemPoolInterface;
+use Symfony\Component\Cache\Adapter\ArrayAdapter;
+use Symfony\Component\ExpressionLanguage\ParserCache\ParserCacheAdapter;
+use Symfony\Component\ExpressionLanguage\ParserCache\ParserCacheInterface;
+
+/**
+ * Allows to compile and evaluate expressions written in your own DSL.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class ExpressionLanguage
+{
+    private $cache;
+    private $lexer;
+    private $parser;
+    private $compiler;
+
+    protected $functions = array();
+
+    /**
+     * @param CacheItemPoolInterface                $cache
+     * @param ExpressionFunctionProviderInterface[] $providers
+     */
+    public function __construct($cache = null, array $providers = array())
+    {
+        if (null !== $cache) {
+            if ($cache instanceof ParserCacheInterface) {
+                @trigger_error(sprintf('Passing an instance of %s as constructor argument for %s is deprecated as of 3.2 and will be removed in 4.0. Pass an instance of %s instead.', ParserCacheInterface::class, self::class, CacheItemPoolInterface::class), E_USER_DEPRECATED);
+                $cache = new ParserCacheAdapter($cache);
+            } elseif (!$cache instanceof CacheItemPoolInterface) {
+                throw new \InvalidArgumentException(sprintf('Cache argument has to implement %s.', CacheItemPoolInterface::class));
+            }
+        }
+
+        $this->cache = $cache ?: new ArrayAdapter();
+        $this->registerFunctions();
+        foreach ($providers as $provider) {
+            $this->registerProvider($provider);
+        }
+    }
+
+    /**
+     * Compiles an expression source code.
+     *
+     * @param Expression|string $expression The expression to compile
+     * @param array             $names      An array of valid names
+     *
+     * @return string The compiled PHP source code
+     */
+    public function compile($expression, $names = array())
+    {
+        return $this->getCompiler()->compile($this->parse($expression, $names)->getNodes())->getSource();
+    }
+
+    /**
+     * Evaluate an expression.
+     *
+     * @param Expression|string $expression The expression to compile
+     * @param array             $values     An array of values
+     *
+     * @return string The result of the evaluation of the expression
+     */
+    public function evaluate($expression, $values = array())
+    {
+        return $this->parse($expression, array_keys($values))->getNodes()->evaluate($this->functions, $values);
+    }
+
+    /**
+     * Parses an expression.
+     *
+     * @param Expression|string $expression The expression to parse
+     * @param array             $names      An array of valid names
+     *
+     * @return ParsedExpression A ParsedExpression instance
+     */
+    public function parse($expression, $names)
+    {
+        if ($expression instanceof ParsedExpression) {
+            return $expression;
+        }
+
+        asort($names);
+        $cacheKeyItems = array();
+
+        foreach ($names as $nameKey => $name) {
+            $cacheKeyItems[] = is_int($nameKey) ? $name : $nameKey.':'.$name;
+        }
+
+        $cacheItem = $this->cache->getItem(rawurlencode($expression.'//'.implode('|', $cacheKeyItems)));
+
+        if (null === $parsedExpression = $cacheItem->get()) {
+            $nodes = $this->getParser()->parse($this->getLexer()->tokenize((string) $expression), $names);
+            $parsedExpression = new ParsedExpression((string) $expression, $nodes);
+
+            $cacheItem->set($parsedExpression);
+            $this->cache->save($cacheItem);
+        }
+
+        return $parsedExpression;
+    }
+
+    /**
+     * Registers a function.
+     *
+     * @param string   $name      The function name
+     * @param callable $compiler  A callable able to compile the function
+     * @param callable $evaluator A callable able to evaluate the function
+     *
+     * @throws \LogicException when registering a function after calling evaluate(), compile() or parse()
+     *
+     * @see ExpressionFunction
+     */
+    public function register($name, callable $compiler, callable $evaluator)
+    {
+        if (null !== $this->parser) {
+            throw new \LogicException('Registering functions after calling evaluate(), compile() or parse() is not supported.');
+        }
+
+        $this->functions[$name] = array('compiler' => $compiler, 'evaluator' => $evaluator);
+    }
+
+    public function addFunction(ExpressionFunction $function)
+    {
+        $this->register($function->getName(), $function->getCompiler(), $function->getEvaluator());
+    }
+
+    public function registerProvider(ExpressionFunctionProviderInterface $provider)
+    {
+        foreach ($provider->getFunctions() as $function) {
+            $this->addFunction($function);
+        }
+    }
+
+    protected function registerFunctions()
+    {
+        $this->addFunction(ExpressionFunction::fromPhp('constant'));
+    }
+
+    private function getLexer()
+    {
+        if (null === $this->lexer) {
+            $this->lexer = new Lexer();
+        }
+
+        return $this->lexer;
+    }
+
+    private function getParser()
+    {
+        if (null === $this->parser) {
+            $this->parser = new Parser($this->functions);
+        }
+
+        return $this->parser;
+    }
+
+    private function getCompiler()
+    {
+        if (null === $this->compiler) {
+            $this->compiler = new Compiler($this->functions);
+        }
+
+        return $this->compiler->reset();
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/expression-language/LICENSE b/advancedcontentfilter/vendor/symfony/expression-language/LICENSE
new file mode 100644 (file)
index 0000000..21d7fb9
--- /dev/null
@@ -0,0 +1,19 @@
+Copyright (c) 2004-2018 Fabien Potencier
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is furnished
+to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/advancedcontentfilter/vendor/symfony/expression-language/Lexer.php b/advancedcontentfilter/vendor/symfony/expression-language/Lexer.php
new file mode 100644 (file)
index 0000000..aeeda8a
--- /dev/null
@@ -0,0 +1,103 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\ExpressionLanguage;
+
+/**
+ * Lexes an expression.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class Lexer
+{
+    /**
+     * Tokenizes an expression.
+     *
+     * @param string $expression The expression to tokenize
+     *
+     * @return TokenStream A token stream instance
+     *
+     * @throws SyntaxError
+     */
+    public function tokenize($expression)
+    {
+        $expression = str_replace(array("\r", "\n", "\t", "\v", "\f"), ' ', $expression);
+        $cursor = 0;
+        $tokens = array();
+        $brackets = array();
+        $end = strlen($expression);
+
+        while ($cursor < $end) {
+            if (' ' == $expression[$cursor]) {
+                ++$cursor;
+
+                continue;
+            }
+
+            if (preg_match('/[0-9]+(?:\.[0-9]+)?/A', $expression, $match, 0, $cursor)) {
+                // numbers
+                $number = (float) $match[0];  // floats
+                if (preg_match('/^[0-9]+$/', $match[0]) && $number <= PHP_INT_MAX) {
+                    $number = (int) $match[0]; // integers lower than the maximum
+                }
+                $tokens[] = new Token(Token::NUMBER_TYPE, $number, $cursor + 1);
+                $cursor += strlen($match[0]);
+            } elseif (false !== strpos('([{', $expression[$cursor])) {
+                // opening bracket
+                $brackets[] = array($expression[$cursor], $cursor);
+
+                $tokens[] = new Token(Token::PUNCTUATION_TYPE, $expression[$cursor], $cursor + 1);
+                ++$cursor;
+            } elseif (false !== strpos(')]}', $expression[$cursor])) {
+                // closing bracket
+                if (empty($brackets)) {
+                    throw new SyntaxError(sprintf('Unexpected "%s"', $expression[$cursor]), $cursor, $expression);
+                }
+
+                list($expect, $cur) = array_pop($brackets);
+                if ($expression[$cursor] != strtr($expect, '([{', ')]}')) {
+                    throw new SyntaxError(sprintf('Unclosed "%s"', $expect), $cur, $expression);
+                }
+
+                $tokens[] = new Token(Token::PUNCTUATION_TYPE, $expression[$cursor], $cursor + 1);
+                ++$cursor;
+            } elseif (preg_match('/"([^"\\\\]*(?:\\\\.[^"\\\\]*)*)"|\'([^\'\\\\]*(?:\\\\.[^\'\\\\]*)*)\'/As', $expression, $match, 0, $cursor)) {
+                // strings
+                $tokens[] = new Token(Token::STRING_TYPE, stripcslashes(substr($match[0], 1, -1)), $cursor + 1);
+                $cursor += strlen($match[0]);
+            } elseif (preg_match('/not in(?=[\s(])|\!\=\=|not(?=[\s(])|and(?=[\s(])|\=\=\=|\>\=|or(?=[\s(])|\<\=|\*\*|\.\.|in(?=[\s(])|&&|\|\||matches|\=\=|\!\=|\*|~|%|\/|\>|\||\!|\^|&|\+|\<|\-/A', $expression, $match, 0, $cursor)) {
+                // operators
+                $tokens[] = new Token(Token::OPERATOR_TYPE, $match[0], $cursor + 1);
+                $cursor += strlen($match[0]);
+            } elseif (false !== strpos('.,?:', $expression[$cursor])) {
+                // punctuation
+                $tokens[] = new Token(Token::PUNCTUATION_TYPE, $expression[$cursor], $cursor + 1);
+                ++$cursor;
+            } elseif (preg_match('/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/A', $expression, $match, 0, $cursor)) {
+                // names
+                $tokens[] = new Token(Token::NAME_TYPE, $match[0], $cursor + 1);
+                $cursor += strlen($match[0]);
+            } else {
+                // unlexable
+                throw new SyntaxError(sprintf('Unexpected character "%s"', $expression[$cursor]), $cursor, $expression);
+            }
+        }
+
+        $tokens[] = new Token(Token::EOF_TYPE, null, $cursor + 1);
+
+        if (!empty($brackets)) {
+            list($expect, $cur) = array_pop($brackets);
+            throw new SyntaxError(sprintf('Unclosed "%s"', $expect), $cur, $expression);
+        }
+
+        return new TokenStream($tokens, $expression);
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/expression-language/Node/ArgumentsNode.php b/advancedcontentfilter/vendor/symfony/expression-language/Node/ArgumentsNode.php
new file mode 100644 (file)
index 0000000..1c78d80
--- /dev/null
@@ -0,0 +1,40 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\ExpressionLanguage\Node;
+
+use Symfony\Component\ExpressionLanguage\Compiler;
+
+/**
+ * @author Fabien Potencier <fabien@symfony.com>
+ *
+ * @internal
+ */
+class ArgumentsNode extends ArrayNode
+{
+    public function compile(Compiler $compiler)
+    {
+        $this->compileArguments($compiler, false);
+    }
+
+    public function toArray()
+    {
+        $array = array();
+
+        foreach ($this->getKeyValuePairs() as $pair) {
+            $array[] = $pair['value'];
+            $array[] = ', ';
+        }
+        array_pop($array);
+
+        return $array;
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/expression-language/Node/ArrayNode.php b/advancedcontentfilter/vendor/symfony/expression-language/Node/ArrayNode.php
new file mode 100644 (file)
index 0000000..e1a2f2e
--- /dev/null
@@ -0,0 +1,118 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\ExpressionLanguage\Node;
+
+use Symfony\Component\ExpressionLanguage\Compiler;
+
+/**
+ * @author Fabien Potencier <fabien@symfony.com>
+ *
+ * @internal
+ */
+class ArrayNode extends Node
+{
+    protected $index;
+
+    public function __construct()
+    {
+        $this->index = -1;
+    }
+
+    public function addElement(Node $value, Node $key = null)
+    {
+        if (null === $key) {
+            $key = new ConstantNode(++$this->index);
+        }
+
+        array_push($this->nodes, $key, $value);
+    }
+
+    /**
+     * Compiles the node to PHP.
+     */
+    public function compile(Compiler $compiler)
+    {
+        $compiler->raw('array(');
+        $this->compileArguments($compiler);
+        $compiler->raw(')');
+    }
+
+    public function evaluate($functions, $values)
+    {
+        $result = array();
+        foreach ($this->getKeyValuePairs() as $pair) {
+            $result[$pair['key']->evaluate($functions, $values)] = $pair['value']->evaluate($functions, $values);
+        }
+
+        return $result;
+    }
+
+    public function toArray()
+    {
+        $value = array();
+        foreach ($this->getKeyValuePairs() as $pair) {
+            $value[$pair['key']->attributes['value']] = $pair['value'];
+        }
+
+        $array = array();
+
+        if ($this->isHash($value)) {
+            foreach ($value as $k => $v) {
+                $array[] = ', ';
+                $array[] = new ConstantNode($k);
+                $array[] = ': ';
+                $array[] = $v;
+            }
+            $array[0] = '{';
+            $array[] = '}';
+        } else {
+            foreach ($value as $v) {
+                $array[] = ', ';
+                $array[] = $v;
+            }
+            $array[0] = '[';
+            $array[] = ']';
+        }
+
+        return $array;
+    }
+
+    protected function getKeyValuePairs()
+    {
+        $pairs = array();
+        foreach (array_chunk($this->nodes, 2) as $pair) {
+            $pairs[] = array('key' => $pair[0], 'value' => $pair[1]);
+        }
+
+        return $pairs;
+    }
+
+    protected function compileArguments(Compiler $compiler, $withKeys = true)
+    {
+        $first = true;
+        foreach ($this->getKeyValuePairs() as $pair) {
+            if (!$first) {
+                $compiler->raw(', ');
+            }
+            $first = false;
+
+            if ($withKeys) {
+                $compiler
+                    ->compile($pair['key'])
+                    ->raw(' => ')
+                ;
+            }
+
+            $compiler->compile($pair['value']);
+        }
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/expression-language/Node/BinaryNode.php b/advancedcontentfilter/vendor/symfony/expression-language/Node/BinaryNode.php
new file mode 100644 (file)
index 0000000..33b4c8f
--- /dev/null
@@ -0,0 +1,162 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\ExpressionLanguage\Node;
+
+use Symfony\Component\ExpressionLanguage\Compiler;
+
+/**
+ * @author Fabien Potencier <fabien@symfony.com>
+ *
+ * @internal
+ */
+class BinaryNode extends Node
+{
+    private static $operators = array(
+        '~' => '.',
+        'and' => '&&',
+        'or' => '||',
+    );
+
+    private static $functions = array(
+        '**' => 'pow',
+        '..' => 'range',
+        'in' => 'in_array',
+        'not in' => '!in_array',
+    );
+
+    public function __construct($operator, Node $left, Node $right)
+    {
+        parent::__construct(
+            array('left' => $left, 'right' => $right),
+            array('operator' => $operator)
+        );
+    }
+
+    public function compile(Compiler $compiler)
+    {
+        $operator = $this->attributes['operator'];
+
+        if ('matches' == $operator) {
+            $compiler
+                ->raw('preg_match(')
+                ->compile($this->nodes['right'])
+                ->raw(', ')
+                ->compile($this->nodes['left'])
+                ->raw(')')
+            ;
+
+            return;
+        }
+
+        if (isset(self::$functions[$operator])) {
+            $compiler
+                ->raw(sprintf('%s(', self::$functions[$operator]))
+                ->compile($this->nodes['left'])
+                ->raw(', ')
+                ->compile($this->nodes['right'])
+                ->raw(')')
+            ;
+
+            return;
+        }
+
+        if (isset(self::$operators[$operator])) {
+            $operator = self::$operators[$operator];
+        }
+
+        $compiler
+            ->raw('(')
+            ->compile($this->nodes['left'])
+            ->raw(' ')
+            ->raw($operator)
+            ->raw(' ')
+            ->compile($this->nodes['right'])
+            ->raw(')')
+        ;
+    }
+
+    public function evaluate($functions, $values)
+    {
+        $operator = $this->attributes['operator'];
+        $left = $this->nodes['left']->evaluate($functions, $values);
+
+        if (isset(self::$functions[$operator])) {
+            $right = $this->nodes['right']->evaluate($functions, $values);
+
+            if ('not in' === $operator) {
+                return !in_array($left, $right);
+            }
+            $f = self::$functions[$operator];
+
+            return $f($left, $right);
+        }
+
+        switch ($operator) {
+            case 'or':
+            case '||':
+                return $left || $this->nodes['right']->evaluate($functions, $values);
+            case 'and':
+            case '&&':
+                return $left && $this->nodes['right']->evaluate($functions, $values);
+        }
+
+        $right = $this->nodes['right']->evaluate($functions, $values);
+
+        switch ($operator) {
+            case '|':
+                return $left | $right;
+            case '^':
+                return $left ^ $right;
+            case '&':
+                return $left & $right;
+            case '==':
+                return $left == $right;
+            case '===':
+                return $left === $right;
+            case '!=':
+                return $left != $right;
+            case '!==':
+                return $left !== $right;
+            case '<':
+                return $left < $right;
+            case '>':
+                return $left > $right;
+            case '>=':
+                return $left >= $right;
+            case '<=':
+                return $left <= $right;
+            case 'not in':
+                return !in_array($left, $right);
+            case 'in':
+                return in_array($left, $right);
+            case '+':
+                return $left + $right;
+            case '-':
+                return $left - $right;
+            case '~':
+                return $left.$right;
+            case '*':
+                return $left * $right;
+            case '/':
+                return $left / $right;
+            case '%':
+                return $left % $right;
+            case 'matches':
+                return preg_match($right, $left);
+        }
+    }
+
+    public function toArray()
+    {
+        return array('(', $this->nodes['left'], ' '.$this->attributes['operator'].' ', $this->nodes['right'], ')');
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/expression-language/Node/ConditionalNode.php b/advancedcontentfilter/vendor/symfony/expression-language/Node/ConditionalNode.php
new file mode 100644 (file)
index 0000000..9db0f93
--- /dev/null
@@ -0,0 +1,56 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\ExpressionLanguage\Node;
+
+use Symfony\Component\ExpressionLanguage\Compiler;
+
+/**
+ * @author Fabien Potencier <fabien@symfony.com>
+ *
+ * @internal
+ */
+class ConditionalNode extends Node
+{
+    public function __construct(Node $expr1, Node $expr2, Node $expr3)
+    {
+        parent::__construct(
+            array('expr1' => $expr1, 'expr2' => $expr2, 'expr3' => $expr3)
+        );
+    }
+
+    public function compile(Compiler $compiler)
+    {
+        $compiler
+            ->raw('((')
+            ->compile($this->nodes['expr1'])
+            ->raw(') ? (')
+            ->compile($this->nodes['expr2'])
+            ->raw(') : (')
+            ->compile($this->nodes['expr3'])
+            ->raw('))')
+        ;
+    }
+
+    public function evaluate($functions, $values)
+    {
+        if ($this->nodes['expr1']->evaluate($functions, $values)) {
+            return $this->nodes['expr2']->evaluate($functions, $values);
+        }
+
+        return $this->nodes['expr3']->evaluate($functions, $values);
+    }
+
+    public function toArray()
+    {
+        return array('(', $this->nodes['expr1'], ' ? ', $this->nodes['expr2'], ' : ', $this->nodes['expr3'], ')');
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/expression-language/Node/ConstantNode.php b/advancedcontentfilter/vendor/symfony/expression-language/Node/ConstantNode.php
new file mode 100644 (file)
index 0000000..733d481
--- /dev/null
@@ -0,0 +1,81 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\ExpressionLanguage\Node;
+
+use Symfony\Component\ExpressionLanguage\Compiler;
+
+/**
+ * @author Fabien Potencier <fabien@symfony.com>
+ *
+ * @internal
+ */
+class ConstantNode extends Node
+{
+    private $isIdentifier;
+
+    public function __construct($value, $isIdentifier = false)
+    {
+        $this->isIdentifier = $isIdentifier;
+        parent::__construct(
+            array(),
+            array('value' => $value)
+        );
+    }
+
+    public function compile(Compiler $compiler)
+    {
+        $compiler->repr($this->attributes['value']);
+    }
+
+    public function evaluate($functions, $values)
+    {
+        return $this->attributes['value'];
+    }
+
+    public function toArray()
+    {
+        $array = array();
+        $value = $this->attributes['value'];
+
+        if ($this->isIdentifier) {
+            $array[] = $value;
+        } elseif (true === $value) {
+            $array[] = 'true';
+        } elseif (false === $value) {
+            $array[] = 'false';
+        } elseif (null === $value) {
+            $array[] = 'null';
+        } elseif (is_numeric($value)) {
+            $array[] = $value;
+        } elseif (!is_array($value)) {
+            $array[] = $this->dumpString($value);
+        } elseif ($this->isHash($value)) {
+            foreach ($value as $k => $v) {
+                $array[] = ', ';
+                $array[] = new self($k);
+                $array[] = ': ';
+                $array[] = new self($v);
+            }
+            $array[0] = '{';
+            $array[] = '}';
+        } else {
+            foreach ($value as $v) {
+                $array[] = ', ';
+                $array[] = new self($v);
+            }
+            $array[0] = '[';
+            $array[] = ']';
+        }
+
+        return $array;
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/expression-language/Node/FunctionNode.php b/advancedcontentfilter/vendor/symfony/expression-language/Node/FunctionNode.php
new file mode 100644 (file)
index 0000000..13928c8
--- /dev/null
@@ -0,0 +1,67 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\ExpressionLanguage\Node;
+
+use Symfony\Component\ExpressionLanguage\Compiler;
+
+/**
+ * @author Fabien Potencier <fabien@symfony.com>
+ *
+ * @internal
+ */
+class FunctionNode extends Node
+{
+    public function __construct($name, Node $arguments)
+    {
+        parent::__construct(
+            array('arguments' => $arguments),
+            array('name' => $name)
+        );
+    }
+
+    public function compile(Compiler $compiler)
+    {
+        $arguments = array();
+        foreach ($this->nodes['arguments']->nodes as $node) {
+            $arguments[] = $compiler->subcompile($node);
+        }
+
+        $function = $compiler->getFunction($this->attributes['name']);
+
+        $compiler->raw(call_user_func_array($function['compiler'], $arguments));
+    }
+
+    public function evaluate($functions, $values)
+    {
+        $arguments = array($values);
+        foreach ($this->nodes['arguments']->nodes as $node) {
+            $arguments[] = $node->evaluate($functions, $values);
+        }
+
+        return call_user_func_array($functions[$this->attributes['name']]['evaluator'], $arguments);
+    }
+
+    public function toArray()
+    {
+        $array = array();
+        $array[] = $this->attributes['name'];
+
+        foreach ($this->nodes['arguments']->nodes as $node) {
+            $array[] = ', ';
+            $array[] = $node;
+        }
+        $array[1] = '(';
+        $array[] = ')';
+
+        return $array;
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/expression-language/Node/GetAttrNode.php b/advancedcontentfilter/vendor/symfony/expression-language/Node/GetAttrNode.php
new file mode 100644 (file)
index 0000000..2ecba97
--- /dev/null
@@ -0,0 +1,114 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\ExpressionLanguage\Node;
+
+use Symfony\Component\ExpressionLanguage\Compiler;
+
+/**
+ * @author Fabien Potencier <fabien@symfony.com>
+ *
+ * @internal
+ */
+class GetAttrNode extends Node
+{
+    const PROPERTY_CALL = 1;
+    const METHOD_CALL = 2;
+    const ARRAY_CALL = 3;
+
+    public function __construct(Node $node, Node $attribute, ArrayNode $arguments, $type)
+    {
+        parent::__construct(
+            array('node' => $node, 'attribute' => $attribute, 'arguments' => $arguments),
+            array('type' => $type)
+        );
+    }
+
+    public function compile(Compiler $compiler)
+    {
+        switch ($this->attributes['type']) {
+            case self::PROPERTY_CALL:
+                $compiler
+                    ->compile($this->nodes['node'])
+                    ->raw('->')
+                    ->raw($this->nodes['attribute']->attributes['value'])
+                ;
+                break;
+
+            case self::METHOD_CALL:
+                $compiler
+                    ->compile($this->nodes['node'])
+                    ->raw('->')
+                    ->raw($this->nodes['attribute']->attributes['value'])
+                    ->raw('(')
+                    ->compile($this->nodes['arguments'])
+                    ->raw(')')
+                ;
+                break;
+
+            case self::ARRAY_CALL:
+                $compiler
+                    ->compile($this->nodes['node'])
+                    ->raw('[')
+                    ->compile($this->nodes['attribute'])->raw(']')
+                ;
+                break;
+        }
+    }
+
+    public function evaluate($functions, $values)
+    {
+        switch ($this->attributes['type']) {
+            case self::PROPERTY_CALL:
+                $obj = $this->nodes['node']->evaluate($functions, $values);
+                if (!is_object($obj)) {
+                    throw new \RuntimeException('Unable to get a property on a non-object.');
+                }
+
+                $property = $this->nodes['attribute']->attributes['value'];
+
+                return $obj->$property;
+
+            case self::METHOD_CALL:
+                $obj = $this->nodes['node']->evaluate($functions, $values);
+                if (!is_object($obj)) {
+                    throw new \RuntimeException('Unable to get a property on a non-object.');
+                }
+                if (!is_callable($toCall = array($obj, $this->nodes['attribute']->attributes['value']))) {
+                    throw new \RuntimeException(sprintf('Unable to call method "%s" of object "%s".', $this->nodes['attribute']->attributes['value'], get_class($obj)));
+                }
+
+                return call_user_func_array($toCall, $this->nodes['arguments']->evaluate($functions, $values));
+
+            case self::ARRAY_CALL:
+                $array = $this->nodes['node']->evaluate($functions, $values);
+                if (!is_array($array) && !$array instanceof \ArrayAccess) {
+                    throw new \RuntimeException('Unable to get an item on a non-array.');
+                }
+
+                return $array[$this->nodes['attribute']->evaluate($functions, $values)];
+        }
+    }
+
+    public function toArray()
+    {
+        switch ($this->attributes['type']) {
+            case self::PROPERTY_CALL:
+                return array($this->nodes['node'], '.', $this->nodes['attribute']);
+
+            case self::METHOD_CALL:
+                return array($this->nodes['node'], '.', $this->nodes['attribute'], '(', $this->nodes['arguments'], ')');
+
+            case self::ARRAY_CALL:
+                return array($this->nodes['node'], '[', $this->nodes['attribute'], ']');
+        }
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/expression-language/Node/NameNode.php b/advancedcontentfilter/vendor/symfony/expression-language/Node/NameNode.php
new file mode 100644 (file)
index 0000000..9e1462f
--- /dev/null
@@ -0,0 +1,45 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\ExpressionLanguage\Node;
+
+use Symfony\Component\ExpressionLanguage\Compiler;
+
+/**
+ * @author Fabien Potencier <fabien@symfony.com>
+ *
+ * @internal
+ */
+class NameNode extends Node
+{
+    public function __construct($name)
+    {
+        parent::__construct(
+            array(),
+            array('name' => $name)
+        );
+    }
+
+    public function compile(Compiler $compiler)
+    {
+        $compiler->raw('$'.$this->attributes['name']);
+    }
+
+    public function evaluate($functions, $values)
+    {
+        return $values[$this->attributes['name']];
+    }
+
+    public function toArray()
+    {
+        return array($this->attributes['name']);
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/expression-language/Node/Node.php b/advancedcontentfilter/vendor/symfony/expression-language/Node/Node.php
new file mode 100644 (file)
index 0000000..1db4e85
--- /dev/null
@@ -0,0 +1,110 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\ExpressionLanguage\Node;
+
+use Symfony\Component\ExpressionLanguage\Compiler;
+
+/**
+ * Represents a node in the AST.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class Node
+{
+    public $nodes = array();
+    public $attributes = array();
+
+    /**
+     * @param array $nodes      An array of nodes
+     * @param array $attributes An array of attributes
+     */
+    public function __construct(array $nodes = array(), array $attributes = array())
+    {
+        $this->nodes = $nodes;
+        $this->attributes = $attributes;
+    }
+
+    public function __toString()
+    {
+        $attributes = array();
+        foreach ($this->attributes as $name => $value) {
+            $attributes[] = sprintf('%s: %s', $name, str_replace("\n", '', var_export($value, true)));
+        }
+
+        $repr = array(str_replace('Symfony\Component\ExpressionLanguage\Node\\', '', get_class($this)).'('.implode(', ', $attributes));
+
+        if (count($this->nodes)) {
+            foreach ($this->nodes as $node) {
+                foreach (explode("\n", (string) $node) as $line) {
+                    $repr[] = '    '.$line;
+                }
+            }
+
+            $repr[] = ')';
+        } else {
+            $repr[0] .= ')';
+        }
+
+        return implode("\n", $repr);
+    }
+
+    public function compile(Compiler $compiler)
+    {
+        foreach ($this->nodes as $node) {
+            $node->compile($compiler);
+        }
+    }
+
+    public function evaluate($functions, $values)
+    {
+        $results = array();
+        foreach ($this->nodes as $node) {
+            $results[] = $node->evaluate($functions, $values);
+        }
+
+        return $results;
+    }
+
+    public function toArray()
+    {
+        throw new \BadMethodCallException(sprintf('Dumping a "%s" instance is not supported yet.', get_class($this)));
+    }
+
+    public function dump()
+    {
+        $dump = '';
+
+        foreach ($this->toArray() as $v) {
+            $dump .= is_scalar($v) ? $v : $v->dump();
+        }
+
+        return $dump;
+    }
+
+    protected function dumpString($value)
+    {
+        return sprintf('"%s"', addcslashes($value, "\0\t\"\\"));
+    }
+
+    protected function isHash(array $value)
+    {
+        $expectedKey = 0;
+
+        foreach ($value as $key => $val) {
+            if ($key !== $expectedKey++) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/expression-language/Node/UnaryNode.php b/advancedcontentfilter/vendor/symfony/expression-language/Node/UnaryNode.php
new file mode 100644 (file)
index 0000000..5831032
--- /dev/null
@@ -0,0 +1,66 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\ExpressionLanguage\Node;
+
+use Symfony\Component\ExpressionLanguage\Compiler;
+
+/**
+ * @author Fabien Potencier <fabien@symfony.com>
+ *
+ * @internal
+ */
+class UnaryNode extends Node
+{
+    private static $operators = array(
+        '!' => '!',
+        'not' => '!',
+        '+' => '+',
+        '-' => '-',
+    );
+
+    public function __construct($operator, Node $node)
+    {
+        parent::__construct(
+            array('node' => $node),
+            array('operator' => $operator)
+        );
+    }
+
+    public function compile(Compiler $compiler)
+    {
+        $compiler
+            ->raw('(')
+            ->raw(self::$operators[$this->attributes['operator']])
+            ->compile($this->nodes['node'])
+            ->raw(')')
+        ;
+    }
+
+    public function evaluate($functions, $values)
+    {
+        $value = $this->nodes['node']->evaluate($functions, $values);
+        switch ($this->attributes['operator']) {
+            case 'not':
+            case '!':
+                return !$value;
+            case '-':
+                return -$value;
+        }
+
+        return $value;
+    }
+
+    public function toArray()
+    {
+        return array('(', $this->attributes['operator'].' ', $this->nodes['node'], ')');
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/expression-language/ParsedExpression.php b/advancedcontentfilter/vendor/symfony/expression-language/ParsedExpression.php
new file mode 100644 (file)
index 0000000..a5603fc
--- /dev/null
@@ -0,0 +1,40 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\ExpressionLanguage;
+
+use Symfony\Component\ExpressionLanguage\Node\Node;
+
+/**
+ * Represents an already parsed expression.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class ParsedExpression extends Expression
+{
+    private $nodes;
+
+    /**
+     * @param string $expression An expression
+     * @param Node   $nodes      A Node representing the expression
+     */
+    public function __construct($expression, Node $nodes)
+    {
+        parent::__construct($expression);
+
+        $this->nodes = $nodes;
+    }
+
+    public function getNodes()
+    {
+        return $this->nodes;
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/expression-language/Parser.php b/advancedcontentfilter/vendor/symfony/expression-language/Parser.php
new file mode 100644 (file)
index 0000000..4b1ce8e
--- /dev/null
@@ -0,0 +1,380 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\ExpressionLanguage;
+
+/**
+ * Parsers a token stream.
+ *
+ * This parser implements a "Precedence climbing" algorithm.
+ *
+ * @see http://www.engr.mun.ca/~theo/Misc/exp_parsing.htm
+ * @see http://en.wikipedia.org/wiki/Operator-precedence_parser
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class Parser
+{
+    const OPERATOR_LEFT = 1;
+    const OPERATOR_RIGHT = 2;
+
+    private $stream;
+    private $unaryOperators;
+    private $binaryOperators;
+    private $functions;
+    private $names;
+
+    public function __construct(array $functions)
+    {
+        $this->functions = $functions;
+
+        $this->unaryOperators = array(
+            'not' => array('precedence' => 50),
+            '!' => array('precedence' => 50),
+            '-' => array('precedence' => 500),
+            '+' => array('precedence' => 500),
+        );
+        $this->binaryOperators = array(
+            'or' => array('precedence' => 10, 'associativity' => self::OPERATOR_LEFT),
+            '||' => array('precedence' => 10, 'associativity' => self::OPERATOR_LEFT),
+            'and' => array('precedence' => 15, 'associativity' => self::OPERATOR_LEFT),
+            '&&' => array('precedence' => 15, 'associativity' => self::OPERATOR_LEFT),
+            '|' => array('precedence' => 16, 'associativity' => self::OPERATOR_LEFT),
+            '^' => array('precedence' => 17, 'associativity' => self::OPERATOR_LEFT),
+            '&' => array('precedence' => 18, 'associativity' => self::OPERATOR_LEFT),
+            '==' => array('precedence' => 20, 'associativity' => self::OPERATOR_LEFT),
+            '===' => array('precedence' => 20, 'associativity' => self::OPERATOR_LEFT),
+            '!=' => array('precedence' => 20, 'associativity' => self::OPERATOR_LEFT),
+            '!==' => array('precedence' => 20, 'associativity' => self::OPERATOR_LEFT),
+            '<' => array('precedence' => 20, 'associativity' => self::OPERATOR_LEFT),
+            '>' => array('precedence' => 20, 'associativity' => self::OPERATOR_LEFT),
+            '>=' => array('precedence' => 20, 'associativity' => self::OPERATOR_LEFT),
+            '<=' => array('precedence' => 20, 'associativity' => self::OPERATOR_LEFT),
+            'not in' => array('precedence' => 20, 'associativity' => self::OPERATOR_LEFT),
+            'in' => array('precedence' => 20, 'associativity' => self::OPERATOR_LEFT),
+            'matches' => array('precedence' => 20, 'associativity' => self::OPERATOR_LEFT),
+            '..' => array('precedence' => 25, 'associativity' => self::OPERATOR_LEFT),
+            '+' => array('precedence' => 30, 'associativity' => self::OPERATOR_LEFT),
+            '-' => array('precedence' => 30, 'associativity' => self::OPERATOR_LEFT),
+            '~' => array('precedence' => 40, 'associativity' => self::OPERATOR_LEFT),
+            '*' => array('precedence' => 60, 'associativity' => self::OPERATOR_LEFT),
+            '/' => array('precedence' => 60, 'associativity' => self::OPERATOR_LEFT),
+            '%' => array('precedence' => 60, 'associativity' => self::OPERATOR_LEFT),
+            '**' => array('precedence' => 200, 'associativity' => self::OPERATOR_RIGHT),
+        );
+    }
+
+    /**
+     * Converts a token stream to a node tree.
+     *
+     * The valid names is an array where the values
+     * are the names that the user can use in an expression.
+     *
+     * If the variable name in the compiled PHP code must be
+     * different, define it as the key.
+     *
+     * For instance, ['this' => 'container'] means that the
+     * variable 'container' can be used in the expression
+     * but the compiled code will use 'this'.
+     *
+     * @param TokenStream $stream A token stream instance
+     * @param array       $names  An array of valid names
+     *
+     * @return Node\Node A node tree
+     *
+     * @throws SyntaxError
+     */
+    public function parse(TokenStream $stream, $names = array())
+    {
+        $this->stream = $stream;
+        $this->names = $names;
+
+        $node = $this->parseExpression();
+        if (!$stream->isEOF()) {
+            throw new SyntaxError(sprintf('Unexpected token "%s" of value "%s"', $stream->current->type, $stream->current->value), $stream->current->cursor, $stream->getExpression());
+        }
+
+        return $node;
+    }
+
+    public function parseExpression($precedence = 0)
+    {
+        $expr = $this->getPrimary();
+        $token = $this->stream->current;
+        while ($token->test(Token::OPERATOR_TYPE) && isset($this->binaryOperators[$token->value]) && $this->binaryOperators[$token->value]['precedence'] >= $precedence) {
+            $op = $this->binaryOperators[$token->value];
+            $this->stream->next();
+
+            $expr1 = $this->parseExpression(self::OPERATOR_LEFT === $op['associativity'] ? $op['precedence'] + 1 : $op['precedence']);
+            $expr = new Node\BinaryNode($token->value, $expr, $expr1);
+
+            $token = $this->stream->current;
+        }
+
+        if (0 === $precedence) {
+            return $this->parseConditionalExpression($expr);
+        }
+
+        return $expr;
+    }
+
+    protected function getPrimary()
+    {
+        $token = $this->stream->current;
+
+        if ($token->test(Token::OPERATOR_TYPE) && isset($this->unaryOperators[$token->value])) {
+            $operator = $this->unaryOperators[$token->value];
+            $this->stream->next();
+            $expr = $this->parseExpression($operator['precedence']);
+
+            return $this->parsePostfixExpression(new Node\UnaryNode($token->value, $expr));
+        }
+
+        if ($token->test(Token::PUNCTUATION_TYPE, '(')) {
+            $this->stream->next();
+            $expr = $this->parseExpression();
+            $this->stream->expect(Token::PUNCTUATION_TYPE, ')', 'An opened parenthesis is not properly closed');
+
+            return $this->parsePostfixExpression($expr);
+        }
+
+        return $this->parsePrimaryExpression();
+    }
+
+    protected function parseConditionalExpression($expr)
+    {
+        while ($this->stream->current->test(Token::PUNCTUATION_TYPE, '?')) {
+            $this->stream->next();
+            if (!$this->stream->current->test(Token::PUNCTUATION_TYPE, ':')) {
+                $expr2 = $this->parseExpression();
+                if ($this->stream->current->test(Token::PUNCTUATION_TYPE, ':')) {
+                    $this->stream->next();
+                    $expr3 = $this->parseExpression();
+                } else {
+                    $expr3 = new Node\ConstantNode(null);
+                }
+            } else {
+                $this->stream->next();
+                $expr2 = $expr;
+                $expr3 = $this->parseExpression();
+            }
+
+            $expr = new Node\ConditionalNode($expr, $expr2, $expr3);
+        }
+
+        return $expr;
+    }
+
+    public function parsePrimaryExpression()
+    {
+        $token = $this->stream->current;
+        switch ($token->type) {
+            case Token::NAME_TYPE:
+                $this->stream->next();
+                switch ($token->value) {
+                    case 'true':
+                    case 'TRUE':
+                        return new Node\ConstantNode(true);
+
+                    case 'false':
+                    case 'FALSE':
+                        return new Node\ConstantNode(false);
+
+                    case 'null':
+                    case 'NULL':
+                        return new Node\ConstantNode(null);
+
+                    default:
+                        if ('(' === $this->stream->current->value) {
+                            if (false === isset($this->functions[$token->value])) {
+                                throw new SyntaxError(sprintf('The function "%s" does not exist', $token->value), $token->cursor, $this->stream->getExpression(), $token->value, array_keys($this->functions));
+                            }
+
+                            $node = new Node\FunctionNode($token->value, $this->parseArguments());
+                        } else {
+                            if (!in_array($token->value, $this->names, true)) {
+                                throw new SyntaxError(sprintf('Variable "%s" is not valid', $token->value), $token->cursor, $this->stream->getExpression(), $token->value, $this->names);
+                            }
+
+                            // is the name used in the compiled code different
+                            // from the name used in the expression?
+                            if (is_int($name = array_search($token->value, $this->names))) {
+                                $name = $token->value;
+                            }
+
+                            $node = new Node\NameNode($name);
+                        }
+                }
+                break;
+
+            case Token::NUMBER_TYPE:
+            case Token::STRING_TYPE:
+                $this->stream->next();
+
+                return new Node\ConstantNode($token->value);
+
+            default:
+                if ($token->test(Token::PUNCTUATION_TYPE, '[')) {
+                    $node = $this->parseArrayExpression();
+                } elseif ($token->test(Token::PUNCTUATION_TYPE, '{')) {
+                    $node = $this->parseHashExpression();
+                } else {
+                    throw new SyntaxError(sprintf('Unexpected token "%s" of value "%s"', $token->type, $token->value), $token->cursor, $this->stream->getExpression());
+                }
+        }
+
+        return $this->parsePostfixExpression($node);
+    }
+
+    public function parseArrayExpression()
+    {
+        $this->stream->expect(Token::PUNCTUATION_TYPE, '[', 'An array element was expected');
+
+        $node = new Node\ArrayNode();
+        $first = true;
+        while (!$this->stream->current->test(Token::PUNCTUATION_TYPE, ']')) {
+            if (!$first) {
+                $this->stream->expect(Token::PUNCTUATION_TYPE, ',', 'An array element must be followed by a comma');
+
+                // trailing ,?
+                if ($this->stream->current->test(Token::PUNCTUATION_TYPE, ']')) {
+                    break;
+                }
+            }
+            $first = false;
+
+            $node->addElement($this->parseExpression());
+        }
+        $this->stream->expect(Token::PUNCTUATION_TYPE, ']', 'An opened array is not properly closed');
+
+        return $node;
+    }
+
+    public function parseHashExpression()
+    {
+        $this->stream->expect(Token::PUNCTUATION_TYPE, '{', 'A hash element was expected');
+
+        $node = new Node\ArrayNode();
+        $first = true;
+        while (!$this->stream->current->test(Token::PUNCTUATION_TYPE, '}')) {
+            if (!$first) {
+                $this->stream->expect(Token::PUNCTUATION_TYPE, ',', 'A hash value must be followed by a comma');
+
+                // trailing ,?
+                if ($this->stream->current->test(Token::PUNCTUATION_TYPE, '}')) {
+                    break;
+                }
+            }
+            $first = false;
+
+            // a hash key can be:
+            //
+            //  * a number -- 12
+            //  * a string -- 'a'
+            //  * a name, which is equivalent to a string -- a
+            //  * an expression, which must be enclosed in parentheses -- (1 + 2)
+            if ($this->stream->current->test(Token::STRING_TYPE) || $this->stream->current->test(Token::NAME_TYPE) || $this->stream->current->test(Token::NUMBER_TYPE)) {
+                $key = new Node\ConstantNode($this->stream->current->value);
+                $this->stream->next();
+            } elseif ($this->stream->current->test(Token::PUNCTUATION_TYPE, '(')) {
+                $key = $this->parseExpression();
+            } else {
+                $current = $this->stream->current;
+
+                throw new SyntaxError(sprintf('A hash key must be a quoted string, a number, a name, or an expression enclosed in parentheses (unexpected token "%s" of value "%s"', $current->type, $current->value), $current->cursor, $this->stream->getExpression());
+            }
+
+            $this->stream->expect(Token::PUNCTUATION_TYPE, ':', 'A hash key must be followed by a colon (:)');
+            $value = $this->parseExpression();
+
+            $node->addElement($value, $key);
+        }
+        $this->stream->expect(Token::PUNCTUATION_TYPE, '}', 'An opened hash is not properly closed');
+
+        return $node;
+    }
+
+    public function parsePostfixExpression($node)
+    {
+        $token = $this->stream->current;
+        while (Token::PUNCTUATION_TYPE == $token->type) {
+            if ('.' === $token->value) {
+                $this->stream->next();
+                $token = $this->stream->current;
+                $this->stream->next();
+
+                if (
+                    Token::NAME_TYPE !== $token->type
+                    &&
+                    // Operators like "not" and "matches" are valid method or property names,
+                    //
+                    // In other words, besides NAME_TYPE, OPERATOR_TYPE could also be parsed as a property or method.
+                    // This is because operators are processed by the lexer prior to names. So "not" in "foo.not()" or "matches" in "foo.matches" will be recognized as an operator first.
+                    // But in fact, "not" and "matches" in such expressions shall be parsed as method or property names.
+                    //
+                    // And this ONLY works if the operator consists of valid characters for a property or method name.
+                    //
+                    // Other types, such as STRING_TYPE and NUMBER_TYPE, can't be parsed as property nor method names.
+                    //
+                    // As a result, if $token is NOT an operator OR $token->value is NOT a valid property or method name, an exception shall be thrown.
+                    (Token::OPERATOR_TYPE !== $token->type || !preg_match('/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/A', $token->value))
+                ) {
+                    throw new SyntaxError('Expected name', $token->cursor, $this->stream->getExpression());
+                }
+
+                $arg = new Node\ConstantNode($token->value, true);
+
+                $arguments = new Node\ArgumentsNode();
+                if ($this->stream->current->test(Token::PUNCTUATION_TYPE, '(')) {
+                    $type = Node\GetAttrNode::METHOD_CALL;
+                    foreach ($this->parseArguments()->nodes as $n) {
+                        $arguments->addElement($n);
+                    }
+                } else {
+                    $type = Node\GetAttrNode::PROPERTY_CALL;
+                }
+
+                $node = new Node\GetAttrNode($node, $arg, $arguments, $type);
+            } elseif ('[' === $token->value) {
+                $this->stream->next();
+                $arg = $this->parseExpression();
+                $this->stream->expect(Token::PUNCTUATION_TYPE, ']');
+
+                $node = new Node\GetAttrNode($node, $arg, new Node\ArgumentsNode(), Node\GetAttrNode::ARRAY_CALL);
+            } else {
+                break;
+            }
+
+            $token = $this->stream->current;
+        }
+
+        return $node;
+    }
+
+    /**
+     * Parses arguments.
+     */
+    public function parseArguments()
+    {
+        $args = array();
+        $this->stream->expect(Token::PUNCTUATION_TYPE, '(', 'A list of arguments must begin with an opening parenthesis');
+        while (!$this->stream->current->test(Token::PUNCTUATION_TYPE, ')')) {
+            if (!empty($args)) {
+                $this->stream->expect(Token::PUNCTUATION_TYPE, ',', 'Arguments must be separated by a comma');
+            }
+
+            $args[] = $this->parseExpression();
+        }
+        $this->stream->expect(Token::PUNCTUATION_TYPE, ')', 'A list of arguments must be closed by a parenthesis');
+
+        return new Node\Node($args);
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/expression-language/ParserCache/ArrayParserCache.php b/advancedcontentfilter/vendor/symfony/expression-language/ParserCache/ArrayParserCache.php
new file mode 100644 (file)
index 0000000..1249625
--- /dev/null
@@ -0,0 +1,42 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\ExpressionLanguage\ParserCache;
+
+@trigger_error('The '.__NAMESPACE__.'\ArrayParserCache class is deprecated since Symfony 3.2 and will be removed in 4.0. Use the Symfony\Component\Cache\Adapter\ArrayAdapter class instead.', E_USER_DEPRECATED);
+
+use Symfony\Component\ExpressionLanguage\ParsedExpression;
+
+/**
+ * @author Adrien Brault <adrien.brault@gmail.com>
+ *
+ * @deprecated ArrayParserCache class is deprecated since version 3.2 and will be removed in 4.0. Use the Symfony\Component\Cache\Adapter\ArrayAdapter class instead.
+ */
+class ArrayParserCache implements ParserCacheInterface
+{
+    private $cache = array();
+
+    /**
+     * {@inheritdoc}
+     */
+    public function fetch($key)
+    {
+        return isset($this->cache[$key]) ? $this->cache[$key] : null;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function save($key, ParsedExpression $expression)
+    {
+        $this->cache[$key] = $expression;
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/expression-language/ParserCache/ParserCacheAdapter.php b/advancedcontentfilter/vendor/symfony/expression-language/ParserCache/ParserCacheAdapter.php
new file mode 100644 (file)
index 0000000..a3e227d
--- /dev/null
@@ -0,0 +1,120 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\ExpressionLanguage\ParserCache;
+
+use Psr\Cache\CacheItemInterface;
+use Psr\Cache\CacheItemPoolInterface;
+use Symfony\Component\Cache\CacheItem;
+
+/**
+ * @author Alexandre GESLIN <alexandre@gesl.in>
+ *
+ * @internal and will be removed in Symfony 4.0.
+ */
+class ParserCacheAdapter implements CacheItemPoolInterface
+{
+    private $pool;
+    private $createCacheItem;
+
+    public function __construct(ParserCacheInterface $pool)
+    {
+        $this->pool = $pool;
+
+        $this->createCacheItem = \Closure::bind(
+            function ($key, $value, $isHit) {
+                $item = new CacheItem();
+                $item->key = $key;
+                $item->value = $value;
+                $item->isHit = $isHit;
+
+                return $item;
+            },
+            null,
+            CacheItem::class
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getItem($key)
+    {
+        $value = $this->pool->fetch($key);
+        $f = $this->createCacheItem;
+
+        return $f($key, $value, null !== $value);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function save(CacheItemInterface $item)
+    {
+        $this->pool->save($item->getKey(), $item->get());
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getItems(array $keys = array())
+    {
+        throw new \BadMethodCallException('Not implemented');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function hasItem($key)
+    {
+        throw new \BadMethodCallException('Not implemented');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function clear()
+    {
+        throw new \BadMethodCallException('Not implemented');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function deleteItem($key)
+    {
+        throw new \BadMethodCallException('Not implemented');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function deleteItems(array $keys)
+    {
+        throw new \BadMethodCallException('Not implemented');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function saveDeferred(CacheItemInterface $item)
+    {
+        throw new \BadMethodCallException('Not implemented');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function commit()
+    {
+        throw new \BadMethodCallException('Not implemented');
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/expression-language/ParserCache/ParserCacheInterface.php b/advancedcontentfilter/vendor/symfony/expression-language/ParserCache/ParserCacheInterface.php
new file mode 100644 (file)
index 0000000..ed66b21
--- /dev/null
@@ -0,0 +1,41 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\ExpressionLanguage\ParserCache;
+
+@trigger_error('The '.__NAMESPACE__.'\ParserCacheInterface interface is deprecated since Symfony 3.2 and will be removed in 4.0. Use Psr\Cache\CacheItemPoolInterface instead.', E_USER_DEPRECATED);
+
+use Symfony\Component\ExpressionLanguage\ParsedExpression;
+
+/**
+ * @author Adrien Brault <adrien.brault@gmail.com>
+ *
+ * @deprecated since version 3.2, to be removed in 4.0. Use Psr\Cache\CacheItemPoolInterface instead.
+ */
+interface ParserCacheInterface
+{
+    /**
+     * Saves an expression in the cache.
+     *
+     * @param string           $key        The cache key
+     * @param ParsedExpression $expression A ParsedExpression instance to store in the cache
+     */
+    public function save($key, ParsedExpression $expression);
+
+    /**
+     * Fetches an expression from the cache.
+     *
+     * @param string $key The cache key
+     *
+     * @return ParsedExpression|null
+     */
+    public function fetch($key);
+}
diff --git a/advancedcontentfilter/vendor/symfony/expression-language/README.md b/advancedcontentfilter/vendor/symfony/expression-language/README.md
new file mode 100644 (file)
index 0000000..08b310d
--- /dev/null
@@ -0,0 +1,15 @@
+ExpressionLanguage Component
+============================
+
+The ExpressionLanguage component provides an engine that can compile and
+evaluate expressions. An expression is a one-liner that returns a value
+(mostly, but not limited to, Booleans).
+
+Resources
+---------
+
+  * [Documentation](https://symfony.com/doc/current/components/expression_language/introduction.html)
+  * [Contributing](https://symfony.com/doc/current/contributing/index.html)
+  * [Report issues](https://github.com/symfony/symfony/issues) and
+    [send Pull Requests](https://github.com/symfony/symfony/pulls)
+    in the [main Symfony repository](https://github.com/symfony/symfony)
diff --git a/advancedcontentfilter/vendor/symfony/expression-language/Resources/bin/generate_operator_regex.php b/advancedcontentfilter/vendor/symfony/expression-language/Resources/bin/generate_operator_regex.php
new file mode 100644 (file)
index 0000000..74a1008
--- /dev/null
@@ -0,0 +1,23 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+$operators = array('not', '!', 'or', '||', '&&', 'and', '|', '^', '&', '==', '===', '!=', '!==', '<', '>', '>=', '<=', 'not in', 'in', '..', '+', '-', '~', '*', '/', '%', 'matches', '**');
+$operators = array_combine($operators, array_map('strlen', $operators));
+arsort($operators);
+
+$regex = array();
+foreach ($operators as $operator => $length) {
+    // an operator that ends with a character must be followed by
+    // a whitespace or a parenthesis
+    $regex[] = preg_quote($operator, '/').(ctype_alpha($operator[$length - 1]) ? '(?=[\s(])' : '');
+}
+
+echo '/'.implode('|', $regex).'/A';
diff --git a/advancedcontentfilter/vendor/symfony/expression-language/SerializedParsedExpression.php b/advancedcontentfilter/vendor/symfony/expression-language/SerializedParsedExpression.php
new file mode 100644 (file)
index 0000000..dd763f7
--- /dev/null
@@ -0,0 +1,37 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\ExpressionLanguage;
+
+/**
+ * Represents an already parsed expression.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class SerializedParsedExpression extends ParsedExpression
+{
+    private $nodes;
+
+    /**
+     * @param string $expression An expression
+     * @param string $nodes      The serialized nodes for the expression
+     */
+    public function __construct($expression, $nodes)
+    {
+        $this->expression = (string) $expression;
+        $this->nodes = $nodes;
+    }
+
+    public function getNodes()
+    {
+        return unserialize($this->nodes);
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/expression-language/SyntaxError.php b/advancedcontentfilter/vendor/symfony/expression-language/SyntaxError.php
new file mode 100644 (file)
index 0000000..12348e6
--- /dev/null
@@ -0,0 +1,41 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\ExpressionLanguage;
+
+class SyntaxError extends \LogicException
+{
+    public function __construct($message, $cursor = 0, $expression = '', $subject = null, array $proposals = null)
+    {
+        $message = sprintf('%s around position %d', $message, $cursor);
+        if ($expression) {
+            $message = sprintf('%s for expression `%s`', $message, $expression);
+        }
+        $message .= '.';
+
+        if (null !== $subject && null !== $proposals) {
+            $minScore = INF;
+            foreach ($proposals as $proposal) {
+                $distance = levenshtein($subject, $proposal);
+                if ($distance < $minScore) {
+                    $guess = $proposal;
+                    $minScore = $distance;
+                }
+            }
+
+            if (isset($guess) && $minScore < 3) {
+                $message .= sprintf(' Did you mean "%s"?', $guess);
+            }
+        }
+
+        parent::__construct($message);
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/expression-language/Tests/ExpressionFunctionTest.php b/advancedcontentfilter/vendor/symfony/expression-language/Tests/ExpressionFunctionTest.php
new file mode 100644 (file)
index 0000000..f2710fb
--- /dev/null
@@ -0,0 +1,45 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\ExpressionLanguage\Tests;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\ExpressionLanguage\ExpressionFunction;
+
+/**
+ * Tests ExpressionFunction.
+ *
+ * @author Dany Maillard <danymaillard93b@gmail.com>
+ */
+class ExpressionFunctionTest extends TestCase
+{
+    /**
+     * @expectedException \InvalidArgumentException
+     * @expectedExceptionMessage PHP function "fn_does_not_exist" does not exist.
+     */
+    public function testFunctionDoesNotExist()
+    {
+        ExpressionFunction::fromPhp('fn_does_not_exist');
+    }
+
+    /**
+     * @expectedException \InvalidArgumentException
+     * @expectedExceptionMessage An expression function name must be defined when PHP function "Symfony\Component\ExpressionLanguage\Tests\fn_namespaced" is namespaced.
+     */
+    public function testFunctionNamespaced()
+    {
+        ExpressionFunction::fromPhp('Symfony\Component\ExpressionLanguage\Tests\fn_namespaced');
+    }
+}
+
+function fn_namespaced()
+{
+}
diff --git a/advancedcontentfilter/vendor/symfony/expression-language/Tests/ExpressionLanguageTest.php b/advancedcontentfilter/vendor/symfony/expression-language/Tests/ExpressionLanguageTest.php
new file mode 100644 (file)
index 0000000..70328c8
--- /dev/null
@@ -0,0 +1,304 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\ExpressionLanguage\Tests;
+
+use Symfony\Component\ExpressionLanguage\ExpressionFunction;
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\ExpressionLanguage\ExpressionLanguage;
+use Symfony\Component\ExpressionLanguage\ParsedExpression;
+use Symfony\Component\ExpressionLanguage\Tests\Fixtures\TestProvider;
+
+class ExpressionLanguageTest extends TestCase
+{
+    public function testCachedParse()
+    {
+        $cacheMock = $this->getMockBuilder('Psr\Cache\CacheItemPoolInterface')->getMock();
+        $cacheItemMock = $this->getMockBuilder('Psr\Cache\CacheItemInterface')->getMock();
+        $savedParsedExpression = null;
+        $expressionLanguage = new ExpressionLanguage($cacheMock);
+
+        $cacheMock
+            ->expects($this->exactly(2))
+            ->method('getItem')
+            ->with('1%20%2B%201%2F%2F')
+            ->willReturn($cacheItemMock)
+        ;
+
+        $cacheItemMock
+            ->expects($this->exactly(2))
+            ->method('get')
+            ->will($this->returnCallback(function () use (&$savedParsedExpression) {
+                return $savedParsedExpression;
+            }))
+        ;
+
+        $cacheItemMock
+            ->expects($this->exactly(1))
+            ->method('set')
+            ->with($this->isInstanceOf(ParsedExpression::class))
+            ->will($this->returnCallback(function ($parsedExpression) use (&$savedParsedExpression) {
+                $savedParsedExpression = $parsedExpression;
+            }))
+        ;
+
+        $cacheMock
+            ->expects($this->exactly(1))
+            ->method('save')
+            ->with($cacheItemMock)
+        ;
+
+        $parsedExpression = $expressionLanguage->parse('1 + 1', array());
+        $this->assertSame($savedParsedExpression, $parsedExpression);
+
+        $parsedExpression = $expressionLanguage->parse('1 + 1', array());
+        $this->assertSame($savedParsedExpression, $parsedExpression);
+    }
+
+    /**
+     * @group legacy
+     */
+    public function testCachedParseWithDeprecatedParserCacheInterface()
+    {
+        $cacheMock = $this->getMockBuilder('Symfony\Component\ExpressionLanguage\ParserCache\ParserCacheInterface')->getMock();
+
+        $cacheItemMock = $this->getMockBuilder('Psr\Cache\CacheItemInterface')->getMock();
+        $savedParsedExpression = null;
+        $expressionLanguage = new ExpressionLanguage($cacheMock);
+
+        $cacheMock
+            ->expects($this->exactly(1))
+            ->method('fetch')
+            ->with('1%20%2B%201%2F%2F')
+            ->willReturn($savedParsedExpression)
+        ;
+
+        $cacheMock
+            ->expects($this->exactly(1))
+            ->method('save')
+            ->with('1%20%2B%201%2F%2F', $this->isInstanceOf(ParsedExpression::class))
+            ->will($this->returnCallback(function ($key, $expression) use (&$savedParsedExpression) {
+                $savedParsedExpression = $expression;
+            }))
+        ;
+
+        $parsedExpression = $expressionLanguage->parse('1 + 1', array());
+        $this->assertSame($savedParsedExpression, $parsedExpression);
+    }
+
+    /**
+     * @expectedException \InvalidArgumentException
+     * @expectedExceptionMessage Cache argument has to implement Psr\Cache\CacheItemPoolInterface.
+     */
+    public function testWrongCacheImplementation()
+    {
+        $cacheMock = $this->getMockBuilder('Psr\Cache\CacheItemSpoolInterface')->getMock();
+        $expressionLanguage = new ExpressionLanguage($cacheMock);
+    }
+
+    public function testConstantFunction()
+    {
+        $expressionLanguage = new ExpressionLanguage();
+        $this->assertEquals(PHP_VERSION, $expressionLanguage->evaluate('constant("PHP_VERSION")'));
+
+        $expressionLanguage = new ExpressionLanguage();
+        $this->assertEquals('\constant("PHP_VERSION")', $expressionLanguage->compile('constant("PHP_VERSION")'));
+    }
+
+    public function testProviders()
+    {
+        $expressionLanguage = new ExpressionLanguage(null, array(new TestProvider()));
+        $this->assertEquals('foo', $expressionLanguage->evaluate('identity("foo")'));
+        $this->assertEquals('"foo"', $expressionLanguage->compile('identity("foo")'));
+        $this->assertEquals('FOO', $expressionLanguage->evaluate('strtoupper("foo")'));
+        $this->assertEquals('\strtoupper("foo")', $expressionLanguage->compile('strtoupper("foo")'));
+        $this->assertEquals('foo', $expressionLanguage->evaluate('strtolower("FOO")'));
+        $this->assertEquals('\strtolower("FOO")', $expressionLanguage->compile('strtolower("FOO")'));
+        $this->assertTrue($expressionLanguage->evaluate('fn_namespaced()'));
+        $this->assertEquals('\Symfony\Component\ExpressionLanguage\Tests\Fixtures\fn_namespaced()', $expressionLanguage->compile('fn_namespaced()'));
+    }
+
+    /**
+     * @dataProvider shortCircuitProviderEvaluate
+     */
+    public function testShortCircuitOperatorsEvaluate($expression, array $values, $expected)
+    {
+        $expressionLanguage = new ExpressionLanguage();
+        $this->assertEquals($expected, $expressionLanguage->evaluate($expression, $values));
+    }
+
+    /**
+     * @dataProvider shortCircuitProviderCompile
+     */
+    public function testShortCircuitOperatorsCompile($expression, array $names, $expected)
+    {
+        $result = null;
+        $expressionLanguage = new ExpressionLanguage();
+        eval(sprintf('$result = %s;', $expressionLanguage->compile($expression, $names)));
+        $this->assertSame($expected, $result);
+    }
+
+    /**
+     * @expectedException \Symfony\Component\ExpressionLanguage\SyntaxError
+     * @expectedExceptionMessage Unexpected end of expression around position 6 for expression `node.`.
+     */
+    public function testParseThrowsInsteadOfNotice()
+    {
+        $expressionLanguage = new ExpressionLanguage();
+        $expressionLanguage->parse('node.', array('node'));
+    }
+
+    public function shortCircuitProviderEvaluate()
+    {
+        $object = $this->getMockBuilder('stdClass')->setMethods(array('foo'))->getMock();
+        $object->expects($this->never())->method('foo');
+
+        return array(
+            array('false and object.foo()', array('object' => $object), false),
+            array('false && object.foo()', array('object' => $object), false),
+            array('true || object.foo()', array('object' => $object), true),
+            array('true or object.foo()', array('object' => $object), true),
+        );
+    }
+
+    public function shortCircuitProviderCompile()
+    {
+        return array(
+            array('false and foo', array('foo' => 'foo'), false),
+            array('false && foo', array('foo' => 'foo'), false),
+            array('true || foo', array('foo' => 'foo'), true),
+            array('true or foo', array('foo' => 'foo'), true),
+        );
+    }
+
+    public function testCachingForOverriddenVariableNames()
+    {
+        $expressionLanguage = new ExpressionLanguage();
+        $expression = 'a + b';
+        $expressionLanguage->evaluate($expression, array('a' => 1, 'b' => 1));
+        $result = $expressionLanguage->compile($expression, array('a', 'B' => 'b'));
+        $this->assertSame('($a + $B)', $result);
+    }
+
+    public function testStrictEquality()
+    {
+        $expressionLanguage = new ExpressionLanguage();
+        $expression = '123 === a';
+        $result = $expressionLanguage->compile($expression, array('a'));
+        $this->assertSame('(123 === $a)', $result);
+    }
+
+    public function testCachingWithDifferentNamesOrder()
+    {
+        $cacheMock = $this->getMockBuilder('Psr\Cache\CacheItemPoolInterface')->getMock();
+        $cacheItemMock = $this->getMockBuilder('Psr\Cache\CacheItemInterface')->getMock();
+        $expressionLanguage = new ExpressionLanguage($cacheMock);
+        $savedParsedExpressions = array();
+
+        $cacheMock
+            ->expects($this->exactly(2))
+            ->method('getItem')
+            ->with('a%20%2B%20b%2F%2Fa%7CB%3Ab')
+            ->willReturn($cacheItemMock)
+        ;
+
+        $cacheItemMock
+            ->expects($this->exactly(2))
+            ->method('get')
+            ->will($this->returnCallback(function () use (&$savedParsedExpression) {
+                return $savedParsedExpression;
+            }))
+        ;
+
+        $cacheItemMock
+            ->expects($this->exactly(1))
+            ->method('set')
+            ->with($this->isInstanceOf(ParsedExpression::class))
+            ->will($this->returnCallback(function ($parsedExpression) use (&$savedParsedExpression) {
+                $savedParsedExpression = $parsedExpression;
+            }))
+        ;
+
+        $cacheMock
+            ->expects($this->exactly(1))
+            ->method('save')
+            ->with($cacheItemMock)
+        ;
+
+        $expression = 'a + b';
+        $expressionLanguage->compile($expression, array('a', 'B' => 'b'));
+        $expressionLanguage->compile($expression, array('B' => 'b', 'a'));
+    }
+
+    /**
+     * @dataProvider getRegisterCallbacks
+     * @expectedException \LogicException
+     */
+    public function testRegisterAfterParse($registerCallback)
+    {
+        $el = new ExpressionLanguage();
+        $el->parse('1 + 1', array());
+        $registerCallback($el);
+    }
+
+    /**
+     * @dataProvider getRegisterCallbacks
+     * @expectedException \LogicException
+     */
+    public function testRegisterAfterEval($registerCallback)
+    {
+        $el = new ExpressionLanguage();
+        $el->evaluate('1 + 1');
+        $registerCallback($el);
+    }
+
+    /**
+     * @expectedException \RuntimeException
+     * @expectedExceptionMessageRegExp  /Unable to call method "\w+" of object "\w+"./
+     */
+    public function testCallBadCallable()
+    {
+        $el = new ExpressionLanguage();
+        $el->evaluate('foo.myfunction()', array('foo' => new \stdClass()));
+    }
+
+    /**
+     * @dataProvider getRegisterCallbacks
+     * @expectedException \LogicException
+     */
+    public function testRegisterAfterCompile($registerCallback)
+    {
+        $el = new ExpressionLanguage();
+        $el->compile('1 + 1');
+        $registerCallback($el);
+    }
+
+    public function getRegisterCallbacks()
+    {
+        return array(
+            array(
+                function (ExpressionLanguage $el) {
+                    $el->register('fn', function () {}, function () {});
+                },
+            ),
+            array(
+                function (ExpressionLanguage $el) {
+                    $el->addFunction(new ExpressionFunction('fn', function () {}, function () {}));
+                },
+            ),
+            array(
+                function (ExpressionLanguage $el) {
+                    $el->registerProvider(new TestProvider());
+                },
+            ),
+        );
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/expression-language/Tests/ExpressionTest.php b/advancedcontentfilter/vendor/symfony/expression-language/Tests/ExpressionTest.php
new file mode 100644 (file)
index 0000000..052ef22
--- /dev/null
@@ -0,0 +1,28 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\ExpressionLanguage\Tests;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\ExpressionLanguage\Expression;
+
+class ExpressionTest extends TestCase
+{
+    public function testSerialization()
+    {
+        $expression = new Expression('kernel.boot()');
+
+        $serializedExpression = serialize($expression);
+        $unserializedExpression = unserialize($serializedExpression);
+
+        $this->assertEquals($expression, $unserializedExpression);
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/expression-language/Tests/Fixtures/TestProvider.php b/advancedcontentfilter/vendor/symfony/expression-language/Tests/Fixtures/TestProvider.php
new file mode 100644 (file)
index 0000000..20c5182
--- /dev/null
@@ -0,0 +1,41 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\ExpressionLanguage\Tests\Fixtures;
+
+use Symfony\Component\ExpressionLanguage\ExpressionFunction;
+use Symfony\Component\ExpressionLanguage\ExpressionFunctionProviderInterface;
+use Symfony\Component\ExpressionLanguage\ExpressionPhpFunction;
+
+class TestProvider implements ExpressionFunctionProviderInterface
+{
+    public function getFunctions()
+    {
+        return array(
+            new ExpressionFunction('identity', function ($input) {
+                return $input;
+            }, function (array $values, $input) {
+                return $input;
+            }),
+
+            ExpressionFunction::fromPhp('strtoupper'),
+
+            ExpressionFunction::fromPhp('\strtolower'),
+
+            ExpressionFunction::fromPhp('Symfony\Component\ExpressionLanguage\Tests\Fixtures\fn_namespaced', 'fn_namespaced'),
+        );
+    }
+}
+
+function fn_namespaced()
+{
+    return true;
+}
diff --git a/advancedcontentfilter/vendor/symfony/expression-language/Tests/LexerTest.php b/advancedcontentfilter/vendor/symfony/expression-language/Tests/LexerTest.php
new file mode 100644 (file)
index 0000000..87c16f7
--- /dev/null
@@ -0,0 +1,121 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\ExpressionLanguage\Tests;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\ExpressionLanguage\Lexer;
+use Symfony\Component\ExpressionLanguage\Token;
+use Symfony\Component\ExpressionLanguage\TokenStream;
+
+class LexerTest extends TestCase
+{
+    /**
+     * @var Lexer
+     */
+    private $lexer;
+
+    protected function setUp()
+    {
+        $this->lexer = new Lexer();
+    }
+
+    /**
+     * @dataProvider getTokenizeData
+     */
+    public function testTokenize($tokens, $expression)
+    {
+        $tokens[] = new Token('end of expression', null, strlen($expression) + 1);
+        $this->assertEquals(new TokenStream($tokens, $expression), $this->lexer->tokenize($expression));
+    }
+
+    /**
+     * @expectedException \Symfony\Component\ExpressionLanguage\SyntaxError
+     * @expectedExceptionMessage Unexpected character "'" around position 33 for expression `service(faulty.expression.example').dummyMethod()`.
+     */
+    public function testTokenizeThrowsErrorWithMessage()
+    {
+        $expression = "service(faulty.expression.example').dummyMethod()";
+        $this->lexer->tokenize($expression);
+    }
+
+    /**
+     * @expectedException \Symfony\Component\ExpressionLanguage\SyntaxError
+     * @expectedExceptionMessage Unclosed "(" around position 7 for expression `service(unclosed.expression.dummyMethod()`.
+     */
+    public function testTokenizeThrowsErrorOnUnclosedBrace()
+    {
+        $expression = 'service(unclosed.expression.dummyMethod()';
+        $this->lexer->tokenize($expression);
+    }
+
+    public function getTokenizeData()
+    {
+        return array(
+            array(
+                array(new Token('name', 'a', 3)),
+                '  a  ',
+            ),
+            array(
+                array(new Token('name', 'a', 1)),
+                'a',
+            ),
+            array(
+                array(new Token('string', 'foo', 1)),
+                '"foo"',
+            ),
+            array(
+                array(new Token('number', '3', 1)),
+                '3',
+            ),
+            array(
+                array(new Token('operator', '+', 1)),
+                '+',
+            ),
+            array(
+                array(new Token('punctuation', '.', 1)),
+                '.',
+            ),
+            array(
+                array(
+                    new Token('punctuation', '(', 1),
+                    new Token('number', '3', 2),
+                    new Token('operator', '+', 4),
+                    new Token('number', '5', 6),
+                    new Token('punctuation', ')', 7),
+                    new Token('operator', '~', 9),
+                    new Token('name', 'foo', 11),
+                    new Token('punctuation', '(', 14),
+                    new Token('string', 'bar', 15),
+                    new Token('punctuation', ')', 20),
+                    new Token('punctuation', '.', 21),
+                    new Token('name', 'baz', 22),
+                    new Token('punctuation', '[', 25),
+                    new Token('number', '4', 26),
+                    new Token('punctuation', ']', 27),
+                ),
+                '(3 + 5) ~ foo("bar").baz[4]',
+            ),
+            array(
+                array(new Token('operator', '..', 1)),
+                '..',
+            ),
+            array(
+                array(new Token('string', '#foo', 1)),
+                "'#foo'",
+            ),
+            array(
+                array(new Token('string', '#foo', 1)),
+                '"#foo"',
+            ),
+        );
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/expression-language/Tests/Node/AbstractNodeTest.php b/advancedcontentfilter/vendor/symfony/expression-language/Tests/Node/AbstractNodeTest.php
new file mode 100644 (file)
index 0000000..a6f80c2
--- /dev/null
@@ -0,0 +1,50 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\ExpressionLanguage\Tests\Node;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\ExpressionLanguage\Compiler;
+
+abstract class AbstractNodeTest extends TestCase
+{
+    /**
+     * @dataProvider getEvaluateData
+     */
+    public function testEvaluate($expected, $node, $variables = array(), $functions = array())
+    {
+        $this->assertSame($expected, $node->evaluate($functions, $variables));
+    }
+
+    abstract public function getEvaluateData();
+
+    /**
+     * @dataProvider getCompileData
+     */
+    public function testCompile($expected, $node, $functions = array())
+    {
+        $compiler = new Compiler($functions);
+        $node->compile($compiler);
+        $this->assertSame($expected, $compiler->getSource());
+    }
+
+    abstract public function getCompileData();
+
+    /**
+     * @dataProvider getDumpData
+     */
+    public function testDump($expected, $node)
+    {
+        $this->assertSame($expected, $node->dump());
+    }
+
+    abstract public function getDumpData();
+}
diff --git a/advancedcontentfilter/vendor/symfony/expression-language/Tests/Node/ArgumentsNodeTest.php b/advancedcontentfilter/vendor/symfony/expression-language/Tests/Node/ArgumentsNodeTest.php
new file mode 100644 (file)
index 0000000..60a6d1c
--- /dev/null
@@ -0,0 +1,36 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\ExpressionLanguage\Tests\Node;
+
+use Symfony\Component\ExpressionLanguage\Node\ArgumentsNode;
+
+class ArgumentsNodeTest extends ArrayNodeTest
+{
+    public function getCompileData()
+    {
+        return array(
+            array('"a", "b"', $this->getArrayNode()),
+        );
+    }
+
+    public function getDumpData()
+    {
+        return array(
+            array('"a", "b"', $this->getArrayNode()),
+        );
+    }
+
+    protected function createArrayNode()
+    {
+        return new ArgumentsNode();
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/expression-language/Tests/Node/ArrayNodeTest.php b/advancedcontentfilter/vendor/symfony/expression-language/Tests/Node/ArrayNodeTest.php
new file mode 100644 (file)
index 0000000..11a35d4
--- /dev/null
@@ -0,0 +1,73 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\ExpressionLanguage\Tests\Node;
+
+use Symfony\Component\ExpressionLanguage\Node\ArrayNode;
+use Symfony\Component\ExpressionLanguage\Node\ConstantNode;
+
+class ArrayNodeTest extends AbstractNodeTest
+{
+    public function testSerialization()
+    {
+        $node = $this->createArrayNode();
+        $node->addElement(new ConstantNode('foo'));
+
+        $serializedNode = serialize($node);
+        $unserializedNode = unserialize($serializedNode);
+
+        $this->assertEquals($node, $unserializedNode);
+        $this->assertNotEquals($this->createArrayNode(), $unserializedNode);
+    }
+
+    public function getEvaluateData()
+    {
+        return array(
+            array(array('b' => 'a', 'b'), $this->getArrayNode()),
+        );
+    }
+
+    public function getCompileData()
+    {
+        return array(
+            array('array("b" => "a", 0 => "b")', $this->getArrayNode()),
+        );
+    }
+
+    public function getDumpData()
+    {
+        yield array('{"b": "a", 0: "b"}', $this->getArrayNode());
+
+        $array = $this->createArrayNode();
+        $array->addElement(new ConstantNode('c'), new ConstantNode('a"b'));
+        $array->addElement(new ConstantNode('d'), new ConstantNode('a\b'));
+        yield array('{"a\\"b": "c", "a\\\\b": "d"}', $array);
+
+        $array = $this->createArrayNode();
+        $array->addElement(new ConstantNode('c'));
+        $array->addElement(new ConstantNode('d'));
+        yield array('["c", "d"]', $array);
+    }
+
+    protected function getArrayNode()
+    {
+        $array = $this->createArrayNode();
+        $array->addElement(new ConstantNode('a'), new ConstantNode('b'));
+        $array->addElement(new ConstantNode('b'));
+
+        return $array;
+    }
+
+    protected function createArrayNode()
+    {
+        return new ArrayNode();
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/expression-language/Tests/Node/BinaryNodeTest.php b/advancedcontentfilter/vendor/symfony/expression-language/Tests/Node/BinaryNodeTest.php
new file mode 100644 (file)
index 0000000..258d276
--- /dev/null
@@ -0,0 +1,166 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\ExpressionLanguage\Tests\Node;
+
+use Symfony\Component\ExpressionLanguage\Node\BinaryNode;
+use Symfony\Component\ExpressionLanguage\Node\ArrayNode;
+use Symfony\Component\ExpressionLanguage\Node\ConstantNode;
+
+class BinaryNodeTest extends AbstractNodeTest
+{
+    public function getEvaluateData()
+    {
+        $array = new ArrayNode();
+        $array->addElement(new ConstantNode('a'));
+        $array->addElement(new ConstantNode('b'));
+
+        return array(
+            array(true, new BinaryNode('or', new ConstantNode(true), new ConstantNode(false))),
+            array(true, new BinaryNode('||', new ConstantNode(true), new ConstantNode(false))),
+            array(false, new BinaryNode('and', new ConstantNode(true), new ConstantNode(false))),
+            array(false, new BinaryNode('&&', new ConstantNode(true), new ConstantNode(false))),
+
+            array(0, new BinaryNode('&', new ConstantNode(2), new ConstantNode(4))),
+            array(6, new BinaryNode('|', new ConstantNode(2), new ConstantNode(4))),
+            array(6, new BinaryNode('^', new ConstantNode(2), new ConstantNode(4))),
+
+            array(true, new BinaryNode('<', new ConstantNode(1), new ConstantNode(2))),
+            array(true, new BinaryNode('<=', new ConstantNode(1), new ConstantNode(2))),
+            array(true, new BinaryNode('<=', new ConstantNode(1), new ConstantNode(1))),
+
+            array(false, new BinaryNode('>', new ConstantNode(1), new ConstantNode(2))),
+            array(false, new BinaryNode('>=', new ConstantNode(1), new ConstantNode(2))),
+            array(true, new BinaryNode('>=', new ConstantNode(1), new ConstantNode(1))),
+
+            array(true, new BinaryNode('===', new ConstantNode(true), new ConstantNode(true))),
+            array(false, new BinaryNode('!==', new ConstantNode(true), new ConstantNode(true))),
+
+            array(false, new BinaryNode('==', new ConstantNode(2), new ConstantNode(1))),
+            array(true, new BinaryNode('!=', new ConstantNode(2), new ConstantNode(1))),
+
+            array(-1, new BinaryNode('-', new ConstantNode(1), new ConstantNode(2))),
+            array(3, new BinaryNode('+', new ConstantNode(1), new ConstantNode(2))),
+            array(4, new BinaryNode('*', new ConstantNode(2), new ConstantNode(2))),
+            array(1, new BinaryNode('/', new ConstantNode(2), new ConstantNode(2))),
+            array(1, new BinaryNode('%', new ConstantNode(5), new ConstantNode(2))),
+            array(25, new BinaryNode('**', new ConstantNode(5), new ConstantNode(2))),
+            array('ab', new BinaryNode('~', new ConstantNode('a'), new ConstantNode('b'))),
+
+            array(true, new BinaryNode('in', new ConstantNode('a'), $array)),
+            array(false, new BinaryNode('in', new ConstantNode('c'), $array)),
+            array(true, new BinaryNode('not in', new ConstantNode('c'), $array)),
+            array(false, new BinaryNode('not in', new ConstantNode('a'), $array)),
+
+            array(array(1, 2, 3), new BinaryNode('..', new ConstantNode(1), new ConstantNode(3))),
+
+            array(1, new BinaryNode('matches', new ConstantNode('abc'), new ConstantNode('/^[a-z]+$/'))),
+        );
+    }
+
+    public function getCompileData()
+    {
+        $array = new ArrayNode();
+        $array->addElement(new ConstantNode('a'));
+        $array->addElement(new ConstantNode('b'));
+
+        return array(
+            array('(true || false)', new BinaryNode('or', new ConstantNode(true), new ConstantNode(false))),
+            array('(true || false)', new BinaryNode('||', new ConstantNode(true), new ConstantNode(false))),
+            array('(true && false)', new BinaryNode('and', new ConstantNode(true), new ConstantNode(false))),
+            array('(true && false)', new BinaryNode('&&', new ConstantNode(true), new ConstantNode(false))),
+
+            array('(2 & 4)', new BinaryNode('&', new ConstantNode(2), new ConstantNode(4))),
+            array('(2 | 4)', new BinaryNode('|', new ConstantNode(2), new ConstantNode(4))),
+            array('(2 ^ 4)', new BinaryNode('^', new ConstantNode(2), new ConstantNode(4))),
+
+            array('(1 < 2)', new BinaryNode('<', new ConstantNode(1), new ConstantNode(2))),
+            array('(1 <= 2)', new BinaryNode('<=', new ConstantNode(1), new ConstantNode(2))),
+            array('(1 <= 1)', new BinaryNode('<=', new ConstantNode(1), new ConstantNode(1))),
+
+            array('(1 > 2)', new BinaryNode('>', new ConstantNode(1), new ConstantNode(2))),
+            array('(1 >= 2)', new BinaryNode('>=', new ConstantNode(1), new ConstantNode(2))),
+            array('(1 >= 1)', new BinaryNode('>=', new ConstantNode(1), new ConstantNode(1))),
+
+            array('(true === true)', new BinaryNode('===', new ConstantNode(true), new ConstantNode(true))),
+            array('(true !== true)', new BinaryNode('!==', new ConstantNode(true), new ConstantNode(true))),
+
+            array('(2 == 1)', new BinaryNode('==', new ConstantNode(2), new ConstantNode(1))),
+            array('(2 != 1)', new BinaryNode('!=', new ConstantNode(2), new ConstantNode(1))),
+
+            array('(1 - 2)', new BinaryNode('-', new ConstantNode(1), new ConstantNode(2))),
+            array('(1 + 2)', new BinaryNode('+', new ConstantNode(1), new ConstantNode(2))),
+            array('(2 * 2)', new BinaryNode('*', new ConstantNode(2), new ConstantNode(2))),
+            array('(2 / 2)', new BinaryNode('/', new ConstantNode(2), new ConstantNode(2))),
+            array('(5 % 2)', new BinaryNode('%', new ConstantNode(5), new ConstantNode(2))),
+            array('pow(5, 2)', new BinaryNode('**', new ConstantNode(5), new ConstantNode(2))),
+            array('("a" . "b")', new BinaryNode('~', new ConstantNode('a'), new ConstantNode('b'))),
+
+            array('in_array("a", array(0 => "a", 1 => "b"))', new BinaryNode('in', new ConstantNode('a'), $array)),
+            array('in_array("c", array(0 => "a", 1 => "b"))', new BinaryNode('in', new ConstantNode('c'), $array)),
+            array('!in_array("c", array(0 => "a", 1 => "b"))', new BinaryNode('not in', new ConstantNode('c'), $array)),
+            array('!in_array("a", array(0 => "a", 1 => "b"))', new BinaryNode('not in', new ConstantNode('a'), $array)),
+
+            array('range(1, 3)', new BinaryNode('..', new ConstantNode(1), new ConstantNode(3))),
+
+            array('preg_match("/^[a-z]+/i\$/", "abc")', new BinaryNode('matches', new ConstantNode('abc'), new ConstantNode('/^[a-z]+/i$/'))),
+        );
+    }
+
+    public function getDumpData()
+    {
+        $array = new ArrayNode();
+        $array->addElement(new ConstantNode('a'));
+        $array->addElement(new ConstantNode('b'));
+
+        return array(
+            array('(true or false)', new BinaryNode('or', new ConstantNode(true), new ConstantNode(false))),
+            array('(true || false)', new BinaryNode('||', new ConstantNode(true), new ConstantNode(false))),
+            array('(true and false)', new BinaryNode('and', new ConstantNode(true), new ConstantNode(false))),
+            array('(true && false)', new BinaryNode('&&', new ConstantNode(true), new ConstantNode(false))),
+
+            array('(2 & 4)', new BinaryNode('&', new ConstantNode(2), new ConstantNode(4))),
+            array('(2 | 4)', new BinaryNode('|', new ConstantNode(2), new ConstantNode(4))),
+            array('(2 ^ 4)', new BinaryNode('^', new ConstantNode(2), new ConstantNode(4))),
+
+            array('(1 < 2)', new BinaryNode('<', new ConstantNode(1), new ConstantNode(2))),
+            array('(1 <= 2)', new BinaryNode('<=', new ConstantNode(1), new ConstantNode(2))),
+            array('(1 <= 1)', new BinaryNode('<=', new ConstantNode(1), new ConstantNode(1))),
+
+            array('(1 > 2)', new BinaryNode('>', new ConstantNode(1), new ConstantNode(2))),
+            array('(1 >= 2)', new BinaryNode('>=', new ConstantNode(1), new ConstantNode(2))),
+            array('(1 >= 1)', new BinaryNode('>=', new ConstantNode(1), new ConstantNode(1))),
+
+            array('(true === true)', new BinaryNode('===', new ConstantNode(true), new ConstantNode(true))),
+            array('(true !== true)', new BinaryNode('!==', new ConstantNode(true), new ConstantNode(true))),
+
+            array('(2 == 1)', new BinaryNode('==', new ConstantNode(2), new ConstantNode(1))),
+            array('(2 != 1)', new BinaryNode('!=', new ConstantNode(2), new ConstantNode(1))),
+
+            array('(1 - 2)', new BinaryNode('-', new ConstantNode(1), new ConstantNode(2))),
+            array('(1 + 2)', new BinaryNode('+', new ConstantNode(1), new ConstantNode(2))),
+            array('(2 * 2)', new BinaryNode('*', new ConstantNode(2), new ConstantNode(2))),
+            array('(2 / 2)', new BinaryNode('/', new ConstantNode(2), new ConstantNode(2))),
+            array('(5 % 2)', new BinaryNode('%', new ConstantNode(5), new ConstantNode(2))),
+            array('(5 ** 2)', new BinaryNode('**', new ConstantNode(5), new ConstantNode(2))),
+            array('("a" ~ "b")', new BinaryNode('~', new ConstantNode('a'), new ConstantNode('b'))),
+
+            array('("a" in ["a", "b"])', new BinaryNode('in', new ConstantNode('a'), $array)),
+            array('("c" in ["a", "b"])', new BinaryNode('in', new ConstantNode('c'), $array)),
+            array('("c" not in ["a", "b"])', new BinaryNode('not in', new ConstantNode('c'), $array)),
+            array('("a" not in ["a", "b"])', new BinaryNode('not in', new ConstantNode('a'), $array)),
+
+            array('(1 .. 3)', new BinaryNode('..', new ConstantNode(1), new ConstantNode(3))),
+
+            array('("abc" matches "/^[a-z]+/i$/")', new BinaryNode('matches', new ConstantNode('abc'), new ConstantNode('/^[a-z]+/i$/'))),
+        );
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/expression-language/Tests/Node/ConditionalNodeTest.php b/advancedcontentfilter/vendor/symfony/expression-language/Tests/Node/ConditionalNodeTest.php
new file mode 100644 (file)
index 0000000..cbf9e8d
--- /dev/null
@@ -0,0 +1,42 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\ExpressionLanguage\Tests\Node;
+
+use Symfony\Component\ExpressionLanguage\Node\ConditionalNode;
+use Symfony\Component\ExpressionLanguage\Node\ConstantNode;
+
+class ConditionalNodeTest extends AbstractNodeTest
+{
+    public function getEvaluateData()
+    {
+        return array(
+            array(1, new ConditionalNode(new ConstantNode(true), new ConstantNode(1), new ConstantNode(2))),
+            array(2, new ConditionalNode(new ConstantNode(false), new ConstantNode(1), new ConstantNode(2))),
+        );
+    }
+
+    public function getCompileData()
+    {
+        return array(
+            array('((true) ? (1) : (2))', new ConditionalNode(new ConstantNode(true), new ConstantNode(1), new ConstantNode(2))),
+            array('((false) ? (1) : (2))', new ConditionalNode(new ConstantNode(false), new ConstantNode(1), new ConstantNode(2))),
+        );
+    }
+
+    public function getDumpData()
+    {
+        return array(
+            array('(true ? 1 : 2)', new ConditionalNode(new ConstantNode(true), new ConstantNode(1), new ConstantNode(2))),
+            array('(false ? 1 : 2)', new ConditionalNode(new ConstantNode(false), new ConstantNode(1), new ConstantNode(2))),
+        );
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/expression-language/Tests/Node/ConstantNodeTest.php b/advancedcontentfilter/vendor/symfony/expression-language/Tests/Node/ConstantNodeTest.php
new file mode 100644 (file)
index 0000000..af79a91
--- /dev/null
@@ -0,0 +1,60 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\ExpressionLanguage\Tests\Node;
+
+use Symfony\Component\ExpressionLanguage\Node\ConstantNode;
+
+class ConstantNodeTest extends AbstractNodeTest
+{
+    public function getEvaluateData()
+    {
+        return array(
+            array(false, new ConstantNode(false)),
+            array(true, new ConstantNode(true)),
+            array(null, new ConstantNode(null)),
+            array(3, new ConstantNode(3)),
+            array(3.3, new ConstantNode(3.3)),
+            array('foo', new ConstantNode('foo')),
+            array(array(1, 'b' => 'a'), new ConstantNode(array(1, 'b' => 'a'))),
+        );
+    }
+
+    public function getCompileData()
+    {
+        return array(
+            array('false', new ConstantNode(false)),
+            array('true', new ConstantNode(true)),
+            array('null', new ConstantNode(null)),
+            array('3', new ConstantNode(3)),
+            array('3.3', new ConstantNode(3.3)),
+            array('"foo"', new ConstantNode('foo')),
+            array('array(0 => 1, "b" => "a")', new ConstantNode(array(1, 'b' => 'a'))),
+        );
+    }
+
+    public function getDumpData()
+    {
+        return array(
+            array('false', new ConstantNode(false)),
+            array('true', new ConstantNode(true)),
+            array('null', new ConstantNode(null)),
+            array('3', new ConstantNode(3)),
+            array('3.3', new ConstantNode(3.3)),
+            array('"foo"', new ConstantNode('foo')),
+            array('foo', new ConstantNode('foo', true)),
+            array('{0: 1, "b": "a", 1: true}', new ConstantNode(array(1, 'b' => 'a', true))),
+            array('{"a\\"b": "c", "a\\\\b": "d"}', new ConstantNode(array('a"b' => 'c', 'a\\b' => 'd'))),
+            array('["c", "d"]', new ConstantNode(array('c', 'd'))),
+            array('{"a": ["b"]}', new ConstantNode(array('a' => array('b')))),
+        );
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/expression-language/Tests/Node/FunctionNodeTest.php b/advancedcontentfilter/vendor/symfony/expression-language/Tests/Node/FunctionNodeTest.php
new file mode 100644 (file)
index 0000000..8d6f92a
--- /dev/null
@@ -0,0 +1,52 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\ExpressionLanguage\Tests\Node;
+
+use Symfony\Component\ExpressionLanguage\Node\FunctionNode;
+use Symfony\Component\ExpressionLanguage\Node\ConstantNode;
+use Symfony\Component\ExpressionLanguage\Node\Node;
+
+class FunctionNodeTest extends AbstractNodeTest
+{
+    public function getEvaluateData()
+    {
+        return array(
+            array('bar', new FunctionNode('foo', new Node(array(new ConstantNode('bar')))), array(), array('foo' => $this->getCallables())),
+        );
+    }
+
+    public function getCompileData()
+    {
+        return array(
+            array('foo("bar")', new FunctionNode('foo', new Node(array(new ConstantNode('bar')))), array('foo' => $this->getCallables())),
+        );
+    }
+
+    public function getDumpData()
+    {
+        return array(
+            array('foo("bar")', new FunctionNode('foo', new Node(array(new ConstantNode('bar')))), array('foo' => $this->getCallables())),
+        );
+    }
+
+    protected function getCallables()
+    {
+        return array(
+            'compiler' => function ($arg) {
+                return sprintf('foo(%s)', $arg);
+            },
+            'evaluator' => function ($variables, $arg) {
+                return $arg;
+            },
+        );
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/expression-language/Tests/Node/GetAttrNodeTest.php b/advancedcontentfilter/vendor/symfony/expression-language/Tests/Node/GetAttrNodeTest.php
new file mode 100644 (file)
index 0000000..cf7cd7a
--- /dev/null
@@ -0,0 +1,78 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\ExpressionLanguage\Tests\Node;
+
+use Symfony\Component\ExpressionLanguage\Node\ArrayNode;
+use Symfony\Component\ExpressionLanguage\Node\NameNode;
+use Symfony\Component\ExpressionLanguage\Node\GetAttrNode;
+use Symfony\Component\ExpressionLanguage\Node\ConstantNode;
+
+class GetAttrNodeTest extends AbstractNodeTest
+{
+    public function getEvaluateData()
+    {
+        return array(
+            array('b', new GetAttrNode(new NameNode('foo'), new ConstantNode(0), $this->getArrayNode(), GetAttrNode::ARRAY_CALL), array('foo' => array('b' => 'a', 'b'))),
+            array('a', new GetAttrNode(new NameNode('foo'), new ConstantNode('b'), $this->getArrayNode(), GetAttrNode::ARRAY_CALL), array('foo' => array('b' => 'a', 'b'))),
+
+            array('bar', new GetAttrNode(new NameNode('foo'), new ConstantNode('foo'), $this->getArrayNode(), GetAttrNode::PROPERTY_CALL), array('foo' => new Obj())),
+
+            array('baz', new GetAttrNode(new NameNode('foo'), new ConstantNode('foo'), $this->getArrayNode(), GetAttrNode::METHOD_CALL), array('foo' => new Obj())),
+            array('a', new GetAttrNode(new NameNode('foo'), new NameNode('index'), $this->getArrayNode(), GetAttrNode::ARRAY_CALL), array('foo' => array('b' => 'a', 'b'), 'index' => 'b')),
+        );
+    }
+
+    public function getCompileData()
+    {
+        return array(
+            array('$foo[0]', new GetAttrNode(new NameNode('foo'), new ConstantNode(0), $this->getArrayNode(), GetAttrNode::ARRAY_CALL)),
+            array('$foo["b"]', new GetAttrNode(new NameNode('foo'), new ConstantNode('b'), $this->getArrayNode(), GetAttrNode::ARRAY_CALL)),
+
+            array('$foo->foo', new GetAttrNode(new NameNode('foo'), new ConstantNode('foo'), $this->getArrayNode(), GetAttrNode::PROPERTY_CALL), array('foo' => new Obj())),
+
+            array('$foo->foo(array("b" => "a", 0 => "b"))', new GetAttrNode(new NameNode('foo'), new ConstantNode('foo'), $this->getArrayNode(), GetAttrNode::METHOD_CALL), array('foo' => new Obj())),
+            array('$foo[$index]', new GetAttrNode(new NameNode('foo'), new NameNode('index'), $this->getArrayNode(), GetAttrNode::ARRAY_CALL)),
+        );
+    }
+
+    public function getDumpData()
+    {
+        return array(
+            array('foo[0]', new GetAttrNode(new NameNode('foo'), new ConstantNode(0), $this->getArrayNode(), GetAttrNode::ARRAY_CALL)),
+            array('foo["b"]', new GetAttrNode(new NameNode('foo'), new ConstantNode('b'), $this->getArrayNode(), GetAttrNode::ARRAY_CALL)),
+
+            array('foo.foo', new GetAttrNode(new NameNode('foo'), new NameNode('foo'), $this->getArrayNode(), GetAttrNode::PROPERTY_CALL), array('foo' => new Obj())),
+
+            array('foo.foo({"b": "a", 0: "b"})', new GetAttrNode(new NameNode('foo'), new NameNode('foo'), $this->getArrayNode(), GetAttrNode::METHOD_CALL), array('foo' => new Obj())),
+            array('foo[index]', new GetAttrNode(new NameNode('foo'), new NameNode('index'), $this->getArrayNode(), GetAttrNode::ARRAY_CALL)),
+        );
+    }
+
+    protected function getArrayNode()
+    {
+        $array = new ArrayNode();
+        $array->addElement(new ConstantNode('a'), new ConstantNode('b'));
+        $array->addElement(new ConstantNode('b'));
+
+        return $array;
+    }
+}
+
+class Obj
+{
+    public $foo = 'bar';
+
+    public function foo()
+    {
+        return 'baz';
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/expression-language/Tests/Node/NameNodeTest.php b/advancedcontentfilter/vendor/symfony/expression-language/Tests/Node/NameNodeTest.php
new file mode 100644 (file)
index 0000000..5fa2c37
--- /dev/null
@@ -0,0 +1,38 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\ExpressionLanguage\Tests\Node;
+
+use Symfony\Component\ExpressionLanguage\Node\NameNode;
+
+class NameNodeTest extends AbstractNodeTest
+{
+    public function getEvaluateData()
+    {
+        return array(
+            array('bar', new NameNode('foo'), array('foo' => 'bar')),
+        );
+    }
+
+    public function getCompileData()
+    {
+        return array(
+            array('$foo', new NameNode('foo')),
+        );
+    }
+
+    public function getDumpData()
+    {
+        return array(
+            array('foo', new NameNode('foo')),
+        );
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/expression-language/Tests/Node/NodeTest.php b/advancedcontentfilter/vendor/symfony/expression-language/Tests/Node/NodeTest.php
new file mode 100644 (file)
index 0000000..0f35b5f
--- /dev/null
@@ -0,0 +1,41 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\ExpressionLanguage\Tests\Node;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\ExpressionLanguage\Node\Node;
+use Symfony\Component\ExpressionLanguage\Node\ConstantNode;
+
+class NodeTest extends TestCase
+{
+    public function testToString()
+    {
+        $node = new Node(array(new ConstantNode('foo')));
+
+        $this->assertEquals(<<<'EOF'
+Node(
+    ConstantNode(value: 'foo')
+)
+EOF
+        , (string) $node);
+    }
+
+    public function testSerialization()
+    {
+        $node = new Node(array('foo' => 'bar'), array('bar' => 'foo'));
+
+        $serializedNode = serialize($node);
+        $unserializedNode = unserialize($serializedNode);
+
+        $this->assertEquals($node, $unserializedNode);
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/expression-language/Tests/Node/UnaryNodeTest.php b/advancedcontentfilter/vendor/symfony/expression-language/Tests/Node/UnaryNodeTest.php
new file mode 100644 (file)
index 0000000..ae2e3ee
--- /dev/null
@@ -0,0 +1,48 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\ExpressionLanguage\Tests\Node;
+
+use Symfony\Component\ExpressionLanguage\Node\UnaryNode;
+use Symfony\Component\ExpressionLanguage\Node\ConstantNode;
+
+class UnaryNodeTest extends AbstractNodeTest
+{
+    public function getEvaluateData()
+    {
+        return array(
+            array(-1, new UnaryNode('-', new ConstantNode(1))),
+            array(3, new UnaryNode('+', new ConstantNode(3))),
+            array(false, new UnaryNode('!', new ConstantNode(true))),
+            array(false, new UnaryNode('not', new ConstantNode(true))),
+        );
+    }
+
+    public function getCompileData()
+    {
+        return array(
+            array('(-1)', new UnaryNode('-', new ConstantNode(1))),
+            array('(+3)', new UnaryNode('+', new ConstantNode(3))),
+            array('(!true)', new UnaryNode('!', new ConstantNode(true))),
+            array('(!true)', new UnaryNode('not', new ConstantNode(true))),
+        );
+    }
+
+    public function getDumpData()
+    {
+        return array(
+            array('(- 1)', new UnaryNode('-', new ConstantNode(1))),
+            array('(+ 3)', new UnaryNode('+', new ConstantNode(3))),
+            array('(! true)', new UnaryNode('!', new ConstantNode(true))),
+            array('(not true)', new UnaryNode('not', new ConstantNode(true))),
+        );
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/expression-language/Tests/ParsedExpressionTest.php b/advancedcontentfilter/vendor/symfony/expression-language/Tests/ParsedExpressionTest.php
new file mode 100644 (file)
index 0000000..d28101f
--- /dev/null
@@ -0,0 +1,29 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\ExpressionLanguage\Tests;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\ExpressionLanguage\Node\ConstantNode;
+use Symfony\Component\ExpressionLanguage\ParsedExpression;
+
+class ParsedExpressionTest extends TestCase
+{
+    public function testSerialization()
+    {
+        $expression = new ParsedExpression('25', new ConstantNode('25'));
+
+        $serializedExpression = serialize($expression);
+        $unserializedExpression = unserialize($serializedExpression);
+
+        $this->assertEquals($expression, $unserializedExpression);
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/expression-language/Tests/ParserCache/ParserCacheAdapterTest.php b/advancedcontentfilter/vendor/symfony/expression-language/Tests/ParserCache/ParserCacheAdapterTest.php
new file mode 100644 (file)
index 0000000..4473161
--- /dev/null
@@ -0,0 +1,140 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\ExpressionLanguage\Tests;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\ExpressionLanguage\ParsedExpression;
+use Symfony\Component\ExpressionLanguage\ParserCache\ParserCacheAdapter;
+use Symfony\Component\ExpressionLanguage\Node\Node;
+
+/**
+ * @group legacy
+ */
+class ParserCacheAdapterTest extends TestCase
+{
+    public function testGetItem()
+    {
+        $poolMock = $this->getMockBuilder('Symfony\Component\ExpressionLanguage\ParserCache\ParserCacheInterface')->getMock();
+
+        $key = 'key';
+        $value = 'value';
+        $parserCacheAdapter = new ParserCacheAdapter($poolMock);
+
+        $poolMock
+            ->expects($this->once())
+            ->method('fetch')
+            ->with($key)
+            ->willReturn($value)
+        ;
+
+        $cacheItem = $parserCacheAdapter->getItem($key);
+
+        $this->assertEquals($cacheItem->get(), $value);
+        $this->assertEquals($cacheItem->isHit(), true);
+    }
+
+    public function testSave()
+    {
+        $poolMock = $this->getMockBuilder('Symfony\Component\ExpressionLanguage\ParserCache\ParserCacheInterface')->getMock();
+        $cacheItemMock = $this->getMockBuilder('Psr\Cache\CacheItemInterface')->getMock();
+        $key = 'key';
+        $value = new ParsedExpression('1 + 1', new Node(array(), array()));
+        $parserCacheAdapter = new ParserCacheAdapter($poolMock);
+
+        $poolMock
+            ->expects($this->once())
+            ->method('save')
+            ->with($key, $value)
+        ;
+
+        $cacheItemMock
+            ->expects($this->once())
+            ->method('getKey')
+            ->willReturn($key)
+        ;
+
+        $cacheItemMock
+            ->expects($this->once())
+            ->method('get')
+            ->willReturn($value)
+        ;
+
+        $cacheItem = $parserCacheAdapter->save($cacheItemMock);
+    }
+
+    public function testGetItems()
+    {
+        $poolMock = $this->getMockBuilder('Symfony\Component\ExpressionLanguage\ParserCache\ParserCacheInterface')->getMock();
+        $parserCacheAdapter = new ParserCacheAdapter($poolMock);
+        $this->{method_exists($this, $_ = 'expectException') ? $_ : 'setExpectedException'}(\BadMethodCallException::class);
+
+        $parserCacheAdapter->getItems();
+    }
+
+    public function testHasItem()
+    {
+        $poolMock = $this->getMockBuilder('Symfony\Component\ExpressionLanguage\ParserCache\ParserCacheInterface')->getMock();
+        $key = 'key';
+        $parserCacheAdapter = new ParserCacheAdapter($poolMock);
+        $this->{method_exists($this, $_ = 'expectException') ? $_ : 'setExpectedException'}(\BadMethodCallException::class);
+
+        $parserCacheAdapter->hasItem($key);
+    }
+
+    public function testClear()
+    {
+        $poolMock = $this->getMockBuilder('Symfony\Component\ExpressionLanguage\ParserCache\ParserCacheInterface')->getMock();
+        $parserCacheAdapter = new ParserCacheAdapter($poolMock);
+        $this->{method_exists($this, $_ = 'expectException') ? $_ : 'setExpectedException'}(\BadMethodCallException::class);
+
+        $parserCacheAdapter->clear();
+    }
+
+    public function testDeleteItem()
+    {
+        $poolMock = $this->getMockBuilder('Symfony\Component\ExpressionLanguage\ParserCache\ParserCacheInterface')->getMock();
+        $key = 'key';
+        $parserCacheAdapter = new ParserCacheAdapter($poolMock);
+        $this->{method_exists($this, $_ = 'expectException') ? $_ : 'setExpectedException'}(\BadMethodCallException::class);
+
+        $parserCacheAdapter->deleteItem($key);
+    }
+
+    public function testDeleteItems()
+    {
+        $poolMock = $this->getMockBuilder('Symfony\Component\ExpressionLanguage\ParserCache\ParserCacheInterface')->getMock();
+        $keys = array('key');
+        $parserCacheAdapter = new ParserCacheAdapter($poolMock);
+        $this->{method_exists($this, $_ = 'expectException') ? $_ : 'setExpectedException'}(\BadMethodCallException::class);
+
+        $parserCacheAdapter->deleteItems($keys);
+    }
+
+    public function testSaveDeferred()
+    {
+        $poolMock = $this->getMockBuilder('Symfony\Component\ExpressionLanguage\ParserCache\ParserCacheInterface')->getMock();
+        $parserCacheAdapter = new ParserCacheAdapter($poolMock);
+        $cacheItemMock = $this->getMockBuilder('Psr\Cache\CacheItemInterface')->getMock();
+        $this->{method_exists($this, $_ = 'expectException') ? $_ : 'setExpectedException'}(\BadMethodCallException::class);
+
+        $parserCacheAdapter->saveDeferred($cacheItemMock);
+    }
+
+    public function testCommit()
+    {
+        $poolMock = $this->getMockBuilder('Symfony\Component\ExpressionLanguage\ParserCache\ParserCacheInterface')->getMock();
+        $parserCacheAdapter = new ParserCacheAdapter($poolMock);
+        $this->{method_exists($this, $_ = 'expectException') ? $_ : 'setExpectedException'}(\BadMethodCallException::class);
+
+        $parserCacheAdapter->commit();
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/expression-language/Tests/ParserTest.php b/advancedcontentfilter/vendor/symfony/expression-language/Tests/ParserTest.php
new file mode 100644 (file)
index 0000000..11464ab
--- /dev/null
@@ -0,0 +1,210 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\ExpressionLanguage\Tests;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\ExpressionLanguage\Parser;
+use Symfony\Component\ExpressionLanguage\Lexer;
+use Symfony\Component\ExpressionLanguage\Node;
+
+class ParserTest extends TestCase
+{
+    /**
+     * @expectedException        \Symfony\Component\ExpressionLanguage\SyntaxError
+     * @expectedExceptionMessage Variable "foo" is not valid around position 1 for expression `foo`.
+     */
+    public function testParseWithInvalidName()
+    {
+        $lexer = new Lexer();
+        $parser = new Parser(array());
+        $parser->parse($lexer->tokenize('foo'));
+    }
+
+    /**
+     * @expectedException        \Symfony\Component\ExpressionLanguage\SyntaxError
+     * @expectedExceptionMessage Variable "foo" is not valid around position 1 for expression `foo`.
+     */
+    public function testParseWithZeroInNames()
+    {
+        $lexer = new Lexer();
+        $parser = new Parser(array());
+        $parser->parse($lexer->tokenize('foo'), array(0));
+    }
+
+    /**
+     * @dataProvider getParseData
+     */
+    public function testParse($node, $expression, $names = array())
+    {
+        $lexer = new Lexer();
+        $parser = new Parser(array());
+        $this->assertEquals($node, $parser->parse($lexer->tokenize($expression), $names));
+    }
+
+    public function getParseData()
+    {
+        $arguments = new Node\ArgumentsNode();
+        $arguments->addElement(new Node\ConstantNode('arg1'));
+        $arguments->addElement(new Node\ConstantNode(2));
+        $arguments->addElement(new Node\ConstantNode(true));
+
+        return array(
+            array(
+                new Node\NameNode('a'),
+                'a',
+                array('a'),
+            ),
+            array(
+                new Node\ConstantNode('a'),
+                '"a"',
+            ),
+            array(
+                new Node\ConstantNode(3),
+                '3',
+            ),
+            array(
+                new Node\ConstantNode(false),
+                'false',
+            ),
+            array(
+                new Node\ConstantNode(true),
+                'true',
+            ),
+            array(
+                new Node\ConstantNode(null),
+                'null',
+            ),
+            array(
+                new Node\UnaryNode('-', new Node\ConstantNode(3)),
+                '-3',
+            ),
+            array(
+                new Node\BinaryNode('-', new Node\ConstantNode(3), new Node\ConstantNode(3)),
+                '3 - 3',
+            ),
+            array(
+                new Node\BinaryNode('*',
+                    new Node\BinaryNode('-', new Node\ConstantNode(3), new Node\ConstantNode(3)),
+                    new Node\ConstantNode(2)
+                ),
+                '(3 - 3) * 2',
+            ),
+            array(
+                new Node\GetAttrNode(new Node\NameNode('foo'), new Node\ConstantNode('bar', true), new Node\ArgumentsNode(), Node\GetAttrNode::PROPERTY_CALL),
+                'foo.bar',
+                array('foo'),
+            ),
+            array(
+                new Node\GetAttrNode(new Node\NameNode('foo'), new Node\ConstantNode('bar', true), new Node\ArgumentsNode(), Node\GetAttrNode::METHOD_CALL),
+                'foo.bar()',
+                array('foo'),
+            ),
+            array(
+                new Node\GetAttrNode(new Node\NameNode('foo'), new Node\ConstantNode('not', true), new Node\ArgumentsNode(), Node\GetAttrNode::METHOD_CALL),
+                'foo.not()',
+                array('foo'),
+            ),
+            array(
+                new Node\GetAttrNode(
+                    new Node\NameNode('foo'),
+                    new Node\ConstantNode('bar', true),
+                    $arguments,
+                    Node\GetAttrNode::METHOD_CALL
+                ),
+                'foo.bar("arg1", 2, true)',
+                array('foo'),
+            ),
+            array(
+                new Node\GetAttrNode(new Node\NameNode('foo'), new Node\ConstantNode(3), new Node\ArgumentsNode(), Node\GetAttrNode::ARRAY_CALL),
+                'foo[3]',
+                array('foo'),
+            ),
+            array(
+                new Node\ConditionalNode(new Node\ConstantNode(true), new Node\ConstantNode(true), new Node\ConstantNode(false)),
+                'true ? true : false',
+            ),
+            array(
+                new Node\BinaryNode('matches', new Node\ConstantNode('foo'), new Node\ConstantNode('/foo/')),
+                '"foo" matches "/foo/"',
+            ),
+
+            // chained calls
+            array(
+                $this->createGetAttrNode(
+                    $this->createGetAttrNode(
+                        $this->createGetAttrNode(
+                            $this->createGetAttrNode(new Node\NameNode('foo'), 'bar', Node\GetAttrNode::METHOD_CALL),
+                            'foo', Node\GetAttrNode::METHOD_CALL),
+                        'baz', Node\GetAttrNode::PROPERTY_CALL),
+                    '3', Node\GetAttrNode::ARRAY_CALL),
+                'foo.bar().foo().baz[3]',
+                array('foo'),
+            ),
+
+            array(
+                new Node\NameNode('foo'),
+                'bar',
+                array('foo' => 'bar'),
+            ),
+        );
+    }
+
+    private function createGetAttrNode($node, $item, $type)
+    {
+        return new Node\GetAttrNode($node, new Node\ConstantNode($item, Node\GetAttrNode::ARRAY_CALL !== $type), new Node\ArgumentsNode(), $type);
+    }
+
+    /**
+     * @dataProvider getInvalidPostfixData
+     * @expectedException \Symfony\Component\ExpressionLanguage\SyntaxError
+     */
+    public function testParseWithInvalidPostfixData($expr, $names = array())
+    {
+        $lexer = new Lexer();
+        $parser = new Parser(array());
+        $parser->parse($lexer->tokenize($expr), $names);
+    }
+
+    public function getInvalidPostfixData()
+    {
+        return array(
+            array(
+                'foo."#"',
+                array('foo'),
+            ),
+            array(
+                'foo."bar"',
+                array('foo'),
+            ),
+            array(
+                'foo.**',
+                array('foo'),
+            ),
+            array(
+                'foo.123',
+                array('foo'),
+            ),
+        );
+    }
+
+    /**
+     * @expectedException \Symfony\Component\ExpressionLanguage\SyntaxError
+     * @expectedExceptionMessage Did you mean "baz"?
+     */
+    public function testNameProposal()
+    {
+        $lexer = new Lexer();
+        $parser = new Parser(array());
+
+        $parser->parse($lexer->tokenize('foo > bar'), array('foo', 'baz'));
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/expression-language/Token.php b/advancedcontentfilter/vendor/symfony/expression-language/Token.php
new file mode 100644 (file)
index 0000000..4517335
--- /dev/null
@@ -0,0 +1,66 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\ExpressionLanguage;
+
+/**
+ * Represents a Token.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class Token
+{
+    public $value;
+    public $type;
+    public $cursor;
+
+    const EOF_TYPE = 'end of expression';
+    const NAME_TYPE = 'name';
+    const NUMBER_TYPE = 'number';
+    const STRING_TYPE = 'string';
+    const OPERATOR_TYPE = 'operator';
+    const PUNCTUATION_TYPE = 'punctuation';
+
+    /**
+     * @param string                $type   The type of the token (self::*_TYPE)
+     * @param string|int|float|null $value  The token value
+     * @param int                   $cursor The cursor position in the source
+     */
+    public function __construct($type, $value, $cursor)
+    {
+        $this->type = $type;
+        $this->value = $value;
+        $this->cursor = $cursor;
+    }
+
+    /**
+     * Returns a string representation of the token.
+     *
+     * @return string A string representation of the token
+     */
+    public function __toString()
+    {
+        return sprintf('%3d %-11s %s', $this->cursor, strtoupper($this->type), $this->value);
+    }
+
+    /**
+     * Tests the current token for a type and/or a value.
+     *
+     * @param array|int   $type  The type to test
+     * @param string|null $value The token value
+     *
+     * @return bool
+     */
+    public function test($type, $value = null)
+    {
+        return $this->type === $type && (null === $value || $this->value == $value);
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/expression-language/TokenStream.php b/advancedcontentfilter/vendor/symfony/expression-language/TokenStream.php
new file mode 100644 (file)
index 0000000..9096b18
--- /dev/null
@@ -0,0 +1,97 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\ExpressionLanguage;
+
+/**
+ * Represents a token stream.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class TokenStream
+{
+    public $current;
+
+    private $tokens;
+    private $position = 0;
+    private $expression;
+
+    /**
+     * @param array  $tokens     An array of tokens
+     * @param string $expression
+     */
+    public function __construct(array $tokens, $expression = '')
+    {
+        $this->tokens = $tokens;
+        $this->current = $tokens[0];
+        $this->expression = $expression;
+    }
+
+    /**
+     * Returns a string representation of the token stream.
+     *
+     * @return string
+     */
+    public function __toString()
+    {
+        return implode("\n", $this->tokens);
+    }
+
+    /**
+     * Sets the pointer to the next token and returns the old one.
+     */
+    public function next()
+    {
+        ++$this->position;
+
+        if (!isset($this->tokens[$this->position])) {
+            throw new SyntaxError('Unexpected end of expression', $this->current->cursor, $this->expression);
+        }
+
+        $this->current = $this->tokens[$this->position];
+    }
+
+    /**
+     * Tests a token.
+     *
+     * @param array|int   $type    The type to test
+     * @param string|null $value   The token value
+     * @param string|null $message The syntax error message
+     */
+    public function expect($type, $value = null, $message = null)
+    {
+        $token = $this->current;
+        if (!$token->test($type, $value)) {
+            throw new SyntaxError(sprintf('%sUnexpected token "%s" of value "%s" ("%s" expected%s)', $message ? $message.'. ' : '', $token->type, $token->value, $type, $value ? sprintf(' with value "%s"', $value) : ''), $token->cursor, $this->expression);
+        }
+        $this->next();
+    }
+
+    /**
+     * Checks if end of stream was reached.
+     *
+     * @return bool
+     */
+    public function isEOF()
+    {
+        return Token::EOF_TYPE === $this->current->type;
+    }
+
+    /**
+     * @internal
+     *
+     * @return string
+     */
+    public function getExpression()
+    {
+        return $this->expression;
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/expression-language/composer.json b/advancedcontentfilter/vendor/symfony/expression-language/composer.json
new file mode 100644 (file)
index 0000000..5f662ff
--- /dev/null
@@ -0,0 +1,34 @@
+{
+    "name": "symfony/expression-language",
+    "type": "library",
+    "description": "Symfony ExpressionLanguage Component",
+    "keywords": [],
+    "homepage": "https://symfony.com",
+    "license": "MIT",
+    "authors": [
+        {
+            "name": "Fabien Potencier",
+            "email": "fabien@symfony.com"
+        },
+        {
+            "name": "Symfony Community",
+            "homepage": "https://symfony.com/contributors"
+        }
+    ],
+    "require": {
+        "php": "^5.5.9|>=7.0.8",
+        "symfony/cache": "~3.1|~4.0"
+    },
+    "autoload": {
+        "psr-4": { "Symfony\\Component\\ExpressionLanguage\\": "" },
+        "exclude-from-classmap": [
+            "/Tests/"
+        ]
+    },
+    "minimum-stability": "dev",
+    "extra": {
+        "branch-alias": {
+            "dev-master": "3.4-dev"
+        }
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/expression-language/phpunit.xml.dist b/advancedcontentfilter/vendor/symfony/expression-language/phpunit.xml.dist
new file mode 100644 (file)
index 0000000..517322f
--- /dev/null
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:noNamespaceSchemaLocation="http://schema.phpunit.de/4.1/phpunit.xsd"
+         backupGlobals="false"
+         colors="true"
+         bootstrap="vendor/autoload.php"
+         failOnRisky="true"
+         failOnWarning="true"
+>
+    <php>
+        <ini name="error_reporting" value="-1" />
+    </php>
+
+    <testsuites>
+        <testsuite name="Symfony ExpressionLanguage Component Test Suite">
+            <directory>./Tests/</directory>
+        </testsuite>
+    </testsuites>
+
+    <filter>
+        <whitelist>
+            <directory>./</directory>
+            <exclude>
+                <directory>./Tests</directory>
+                <directory>./vendor</directory>
+            </exclude>
+        </whitelist>
+    </filter>
+</phpunit>
diff --git a/advancedcontentfilter/vendor/symfony/polyfill-apcu/Apcu.php b/advancedcontentfilter/vendor/symfony/polyfill-apcu/Apcu.php
new file mode 100644 (file)
index 0000000..595f601
--- /dev/null
@@ -0,0 +1,106 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Polyfill\Apcu;
+
+/**
+ * Apcu for Zend Server Data Cache.
+ *
+ * @author Kate Gray <opensource@codebykate.com>
+ * @author Nicolas Grekas <p@tchwork.com>
+ *
+ * @internal
+ */
+final class Apcu
+{
+    public static function apcu_add($key, $var = null, $ttl = 0)
+    {
+        if (!is_array($key)) {
+            return apc_add($key, $var, $ttl);
+        }
+
+        $errors = array();
+        foreach ($key as $k => $v) {
+            if (!apc_add($k, $v, $ttl)) {
+                $errors[$k] = -1;
+            }
+        }
+
+        return $errors;
+    }
+
+    public static function apcu_store($key, $var = null, $ttl = 0)
+    {
+        if (!is_array($key)) {
+            return apc_store($key, $var, $ttl);
+        }
+
+        $errors = array();
+        foreach ($key as $k => $v) {
+            if (!apc_store($k, $v, $ttl)) {
+                $errors[$k] = -1;
+            }
+        }
+
+        return $errors;
+    }
+
+    public static function apcu_exists($keys)
+    {
+        if (!is_array($keys)) {
+            return apc_exists($keys);
+        }
+
+        $existing = array();
+        foreach ($keys as $k) {
+            if (apc_exists($k)) {
+                $existing[$k] = true;
+            }
+        }
+
+        return $existing;
+    }
+
+    public static function apcu_fetch($key, &$success = null)
+    {
+        if (!is_array($key)) {
+            return apc_fetch($key, $success);
+        }
+
+        $succeeded = true;
+        $values = array();
+        foreach ($key as $k) {
+            $v = apc_fetch($k, $success);
+            if ($success) {
+                $values[$k] = $v;
+            } else {
+                $succeeded = false;
+            }
+        }
+        $success = $succeeded;
+
+        return $values;
+    }
+
+    public static function apcu_delete($key)
+    {
+        if (!is_array($key)) {
+            return apc_delete($key);
+        }
+
+        $success = true;
+        foreach ($key as $k) {
+            $success = apc_delete($k) && $success;
+        }
+
+        return $success;
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/polyfill-apcu/LICENSE b/advancedcontentfilter/vendor/symfony/polyfill-apcu/LICENSE
new file mode 100644 (file)
index 0000000..24fa32c
--- /dev/null
@@ -0,0 +1,19 @@
+Copyright (c) 2015-2018 Fabien Potencier
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is furnished
+to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/advancedcontentfilter/vendor/symfony/polyfill-apcu/README.md b/advancedcontentfilter/vendor/symfony/polyfill-apcu/README.md
new file mode 100644 (file)
index 0000000..e614bca
--- /dev/null
@@ -0,0 +1,12 @@
+Symfony Polyfill / APCu
+========================
+
+This component provides `apcu_*` functions and the `APCUIterator` class to users of the legacy APC extension.
+
+More information can be found in the
+[main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md).
+
+License
+=======
+
+This library is released under the [MIT license](LICENSE).
diff --git a/advancedcontentfilter/vendor/symfony/polyfill-apcu/bootstrap.php b/advancedcontentfilter/vendor/symfony/polyfill-apcu/bootstrap.php
new file mode 100644 (file)
index 0000000..305183b
--- /dev/null
@@ -0,0 +1,48 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+use Symfony\Polyfill\Apcu as p;
+
+if (!extension_loaded('apc') && !extension_loaded('apcu')) {
+    return;
+}
+
+if (!function_exists('apcu_add')) {
+    if (extension_loaded('Zend Data Cache')) {
+        function apcu_add($key, $var = null, $ttl = 0) { return p\Apcu::apcu_add($key, $var, $ttl); }
+        function apcu_delete($key) { return p\Apcu::apcu_delete($key); }
+        function apcu_exists($keys) { return p\Apcu::apcu_exists($keys); }
+        function apcu_fetch($key, &$success = null) { return p\Apcu::apcu_fetch($key, $success); }
+        function apcu_store($key, $var = null, $ttl = 0) { return p\Apcu::apcu_store($key, $var, $ttl); }
+    } else {
+        function apcu_add($key, $var = null, $ttl = 0) { return apc_add($key, $var, $ttl); }
+        function apcu_delete($key) { return apc_delete($key); }
+        function apcu_exists($keys) { return apc_exists($keys); }
+        function apcu_fetch($key, &$success = null) { return apc_fetch($key, $success); }
+        function apcu_store($key, $var = null, $ttl = 0) { return apc_store($key, $var, $ttl); }
+    }
+    function apcu_cache_info($limited = false) { return apc_cache_info('user', $limited); }
+    function apcu_cas($key, $old, $new) { return apc_cas($key, $old, $new); }
+    function apcu_clear_cache() { return apc_clear_cache('user'); }
+    function apcu_dec($key, $step = 1, &$success = false) { return apc_dec($key, $step, $success); }
+    function apcu_inc($key, $step = 1, &$success = false) { return apc_inc($key, $step, $success); }
+    function apcu_sma_info($limited = false) { return apc_sma_info($limited); }
+}
+
+if (!class_exists('APCUIterator', false) && class_exists('APCIterator', false)) {
+    class APCUIterator extends APCIterator
+    {
+        public function __construct($search = null, $format = APC_ITER_ALL, $chunk_size = 100, $list = APC_LIST_ACTIVE)
+        {
+            parent::__construct('user', $search, $format, $chunk_size, $list);
+        }
+    }
+}
diff --git a/advancedcontentfilter/vendor/symfony/polyfill-apcu/composer.json b/advancedcontentfilter/vendor/symfony/polyfill-apcu/composer.json
new file mode 100644 (file)
index 0000000..54ea2b8
--- /dev/null
@@ -0,0 +1,31 @@
+{
+    "name": "symfony/polyfill-apcu",
+    "type": "library",
+    "description": "Symfony polyfill backporting apcu_* functions to lower PHP versions",
+    "keywords": ["polyfill", "shim", "compatibility", "portable", "apcu"],
+    "homepage": "https://symfony.com",
+    "license": "MIT",
+    "authors": [
+        {
+            "name": "Nicolas Grekas",
+            "email": "p@tchwork.com"
+        },
+        {
+            "name": "Symfony Community",
+            "homepage": "https://symfony.com/contributors"
+        }
+    ],
+    "require": {
+        "php": ">=5.3.3"
+    },
+    "autoload": {
+        "psr-4": { "Symfony\\Polyfill\\Apcu\\": "" },
+        "files": [ "bootstrap.php" ]
+    },
+    "minimum-stability": "dev",
+    "extra": {
+        "branch-alias": {
+            "dev-master": "1.7-dev"
+        }
+    }
+}